diff --git a/63e863/2c796e83-d29633dd7e45bdaac124.js b/63e863/2c796e83-d29633dd7e45bdaac124.js new file mode 100644 index 00000000..003e7e9a --- /dev/null +++ b/63e863/2c796e83-d29633dd7e45bdaac124.js @@ -0,0 +1 @@ +(self.webpackChunkjustice40_tool=self.webpackChunkjustice40_tool||[]).push([[634],{2974:function(module,__unused_webpack_exports,__webpack_require__){eval('__webpack_require__(5438);\n\n/* Mapbox GL JS is licensed under the 3-Clause BSD License. Full text of license: https://github.com/mapbox/mapbox-gl-js/blob/v1.13.1/LICENSE.txt */\n(function (global, factory) {\n true ? module.exports = factory() : 0;\n})(this, function () {\n \'use strict\';\n /* eslint-disable */\n\n var shared, worker, mapboxgl; // define gets called three times: one for each chunk. we rely on the order\n // they\'re imported to know which is which\n\n function define(_, chunk) {\n if (!shared) {\n shared = chunk;\n } else if (!worker) {\n worker = chunk;\n } else {\n var workerBundleString = \'var sharedChunk = {}; (\' + shared + \')(sharedChunk); (\' + worker + \')(sharedChunk);\';\n var sharedChunk = {};\n shared(sharedChunk);\n mapboxgl = chunk(sharedChunk);\n\n if (typeof window !== \'undefined\') {\n mapboxgl.workerUrl = window.URL.createObjectURL(new Blob([workerBundleString], {\n type: \'text/javascript\'\n }));\n }\n }\n }\n\n define(["exports"], function (t) {\n "use strict";\n\n function e(t, e) {\n return t(e = {\n exports: {}\n }, e.exports), e.exports;\n }\n\n var r = n;\n\n function n(t, e, r, n) {\n this.cx = 3 * t, this.bx = 3 * (r - t) - this.cx, this.ax = 1 - this.cx - this.bx, this.cy = 3 * e, this.by = 3 * (n - e) - this.cy, this.ay = 1 - this.cy - this.by, this.p1x = t, this.p1y = n, this.p2x = r, this.p2y = n;\n }\n\n n.prototype.sampleCurveX = function (t) {\n return ((this.ax * t + this.bx) * t + this.cx) * t;\n }, n.prototype.sampleCurveY = function (t) {\n return ((this.ay * t + this.by) * t + this.cy) * t;\n }, n.prototype.sampleCurveDerivativeX = function (t) {\n return (3 * this.ax * t + 2 * this.bx) * t + this.cx;\n }, n.prototype.solveCurveX = function (t, e) {\n var r, n, i, a, o;\n\n for (void 0 === e && (e = 1e-6), i = t, o = 0; o < 8; o++) {\n if (a = this.sampleCurveX(i) - t, Math.abs(a) < e) return i;\n var s = this.sampleCurveDerivativeX(i);\n if (Math.abs(s) < 1e-6) break;\n i -= a / s;\n }\n\n if ((i = t) < (r = 0)) return r;\n if (i > (n = 1)) return n;\n\n for (; r < n;) {\n if (a = this.sampleCurveX(i), Math.abs(a - t) < e) return i;\n t > a ? r = i : n = i, i = .5 * (n - r) + r;\n }\n\n return i;\n }, n.prototype.solve = function (t, e) {\n return this.sampleCurveY(this.solveCurveX(t, e));\n };\n var i = a;\n\n function a(t, e) {\n this.x = t, this.y = e;\n }\n\n a.prototype = {\n clone: function clone() {\n return new a(this.x, this.y);\n },\n add: function add(t) {\n return this.clone()._add(t);\n },\n sub: function sub(t) {\n return this.clone()._sub(t);\n },\n multByPoint: function multByPoint(t) {\n return this.clone()._multByPoint(t);\n },\n divByPoint: function divByPoint(t) {\n return this.clone()._divByPoint(t);\n },\n mult: function mult(t) {\n return this.clone()._mult(t);\n },\n div: function div(t) {\n return this.clone()._div(t);\n },\n rotate: function rotate(t) {\n return this.clone()._rotate(t);\n },\n rotateAround: function rotateAround(t, e) {\n return this.clone()._rotateAround(t, e);\n },\n matMult: function matMult(t) {\n return this.clone()._matMult(t);\n },\n unit: function unit() {\n return this.clone()._unit();\n },\n perp: function perp() {\n return this.clone()._perp();\n },\n round: function round() {\n return this.clone()._round();\n },\n mag: function mag() {\n return Math.sqrt(this.x * this.x + this.y * this.y);\n },\n equals: function equals(t) {\n return this.x === t.x && this.y === t.y;\n },\n dist: function dist(t) {\n return Math.sqrt(this.distSqr(t));\n },\n distSqr: function distSqr(t) {\n var e = t.x - this.x,\n r = t.y - this.y;\n return e * e + r * r;\n },\n angle: function angle() {\n return Math.atan2(this.y, this.x);\n },\n angleTo: function angleTo(t) {\n return Math.atan2(this.y - t.y, this.x - t.x);\n },\n angleWith: function angleWith(t) {\n return this.angleWithSep(t.x, t.y);\n },\n angleWithSep: function angleWithSep(t, e) {\n return Math.atan2(this.x * e - this.y * t, this.x * t + this.y * e);\n },\n _matMult: function _matMult(t) {\n var e = t[2] * this.x + t[3] * this.y;\n return this.x = t[0] * this.x + t[1] * this.y, this.y = e, this;\n },\n _add: function _add(t) {\n return this.x += t.x, this.y += t.y, this;\n },\n _sub: function _sub(t) {\n return this.x -= t.x, this.y -= t.y, this;\n },\n _mult: function _mult(t) {\n return this.x *= t, this.y *= t, this;\n },\n _div: function _div(t) {\n return this.x /= t, this.y /= t, this;\n },\n _multByPoint: function _multByPoint(t) {\n return this.x *= t.x, this.y *= t.y, this;\n },\n _divByPoint: function _divByPoint(t) {\n return this.x /= t.x, this.y /= t.y, this;\n },\n _unit: function _unit() {\n return this._div(this.mag()), this;\n },\n _perp: function _perp() {\n var t = this.y;\n return this.y = this.x, this.x = -t, this;\n },\n _rotate: function _rotate(t) {\n var e = Math.cos(t),\n r = Math.sin(t),\n n = r * this.x + e * this.y;\n return this.x = e * this.x - r * this.y, this.y = n, this;\n },\n _rotateAround: function _rotateAround(t, e) {\n var r = Math.cos(t),\n n = Math.sin(t),\n i = e.y + n * (this.x - e.x) + r * (this.y - e.y);\n return this.x = e.x + r * (this.x - e.x) - n * (this.y - e.y), this.y = i, this;\n },\n _round: function _round() {\n return this.x = Math.round(this.x), this.y = Math.round(this.y), this;\n }\n }, a.convert = function (t) {\n return t instanceof a ? t : Array.isArray(t) ? new a(t[0], t[1]) : t;\n };\n var o = "undefined" != typeof self ? self : {},\n s = Math.pow(2, 53) - 1;\n\n function u(t, e, n, i) {\n var a = new r(t, e, n, i);\n return function (t) {\n return a.solve(t);\n };\n }\n\n var l = u(.25, .1, .25, 1);\n\n function p(t, e, r) {\n return Math.min(r, Math.max(e, t));\n }\n\n function c(t, e, r) {\n var n = r - e,\n i = ((t - e) % n + n) % n + e;\n return i === e ? r : i;\n }\n\n function h(t) {\n for (var e = [], r = arguments.length - 1; r-- > 0;) {\n e[r] = arguments[r + 1];\n }\n\n for (var n = 0, i = e; n < i.length; n += 1) {\n var a = i[n];\n\n for (var o in a) {\n t[o] = a[o];\n }\n }\n\n return t;\n }\n\n var f = 1;\n\n function y() {\n return f++;\n }\n\n function d() {\n return function t(e) {\n return e ? (e ^ 16 * Math.random() >> e / 4).toString(16) : ([1e7] + -[1e3] + -4e3 + -8e3 + -1e11).replace(/[018]/g, t);\n }();\n }\n\n function m(t) {\n return !!t && /^[0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(t);\n }\n\n function v(t, e) {\n t.forEach(function (t) {\n e[t] && (e[t] = e[t].bind(e));\n });\n }\n\n function g(t, e) {\n return -1 !== t.indexOf(e, t.length - e.length);\n }\n\n function x(t, e, r) {\n var n = {};\n\n for (var i in t) {\n n[i] = e.call(r || this, t[i], i, t);\n }\n\n return n;\n }\n\n function b(t, e, r) {\n var n = {};\n\n for (var i in t) {\n e.call(r || this, t[i], i, t) && (n[i] = t[i]);\n }\n\n return n;\n }\n\n function w(t) {\n return Array.isArray(t) ? t.map(w) : "object" == typeof t && t ? x(t, w) : t;\n }\n\n var _ = {};\n\n function A(t) {\n _[t] || ("undefined" != typeof console && console.warn(t), _[t] = !0);\n }\n\n function S(t, e, r) {\n return (r.y - t.y) * (e.x - t.x) > (e.y - t.y) * (r.x - t.x);\n }\n\n function k(t) {\n for (var e = 0, r = 0, n = t.length, i = n - 1, a = void 0, o = void 0; r < n; i = r++) {\n e += ((o = t[i]).x - (a = t[r]).x) * (a.y + o.y);\n }\n\n return e;\n }\n\n function I() {\n return "undefined" != typeof WorkerGlobalScope && "undefined" != typeof self && self instanceof WorkerGlobalScope;\n }\n\n function z(t) {\n var e = {};\n\n if (t.replace(/(?:^|(?:\\s*\\,\\s*))([^\\x00-\\x20\\(\\)<>@\\,;\\:\\\\"\\/\\[\\]\\?\\=\\{\\}\\x7F]+)(?:\\=(?:([^\\x00-\\x20\\(\\)<>@\\,;\\:\\\\"\\/\\[\\]\\?\\=\\{\\}\\x7F]+)|(?:\\"((?:[^"\\\\]|\\\\.)*)\\")))?/g, function (t, r, n, i) {\n var a = n || i;\n return e[r] = !a || a.toLowerCase(), "";\n }), e["max-age"]) {\n var r = parseInt(e["max-age"], 10);\n isNaN(r) ? delete e["max-age"] : e["max-age"] = r;\n }\n\n return e;\n }\n\n var C = null;\n\n function E(t) {\n if (null == C) {\n var e = t.navigator ? t.navigator.userAgent : null;\n C = !!t.safari || !(!e || !(/\\b(iPad|iPhone|iPod)\\b/.test(e) || e.match("Safari") && !e.match("Chrome")));\n }\n\n return C;\n }\n\n function P(t) {\n try {\n var e = o[t];\n return e.setItem("_mapbox_test_", 1), e.removeItem("_mapbox_test_"), !0;\n } catch (t) {\n return !1;\n }\n }\n\n var M,\n B,\n T,\n V,\n F = o.performance && o.performance.now ? o.performance.now.bind(o.performance) : Date.now.bind(Date),\n D = o.requestAnimationFrame || o.mozRequestAnimationFrame || o.webkitRequestAnimationFrame || o.msRequestAnimationFrame,\n L = o.cancelAnimationFrame || o.mozCancelAnimationFrame || o.webkitCancelAnimationFrame || o.msCancelAnimationFrame,\n O = {\n now: F,\n frame: function frame(t) {\n var e = D(t);\n return {\n cancel: function cancel() {\n return L(e);\n }\n };\n },\n getImageData: function getImageData(t, e) {\n void 0 === e && (e = 0);\n var r = o.document.createElement("canvas"),\n n = r.getContext("2d");\n if (!n) throw new Error("failed to create canvas 2d context");\n return r.width = t.width, r.height = t.height, n.drawImage(t, 0, 0, t.width, t.height), n.getImageData(-e, -e, t.width + 2 * e, t.height + 2 * e);\n },\n resolveURL: function resolveURL(t) {\n return M || (M = o.document.createElement("a")), M.href = t, M.href;\n },\n hardwareConcurrency: o.navigator && o.navigator.hardwareConcurrency || 4,\n\n get devicePixelRatio() {\n return o.devicePixelRatio;\n },\n\n get prefersReducedMotion() {\n return !!o.matchMedia && (null == B && (B = o.matchMedia("(prefers-reduced-motion: reduce)")), B.matches);\n }\n\n },\n R = {\n API_URL: "https://api.mapbox.com",\n\n get EVENTS_URL() {\n return this.API_URL ? 0 === this.API_URL.indexOf("https://api.mapbox.cn") ? "https://events.mapbox.cn/events/v2" : 0 === this.API_URL.indexOf("https://api.mapbox.com") ? "https://events.mapbox.com/events/v2" : null : null;\n },\n\n FEEDBACK_URL: "https://apps.mapbox.com/feedback",\n REQUIRE_ACCESS_TOKEN: !0,\n ACCESS_TOKEN: null,\n MAX_PARALLEL_IMAGE_REQUESTS: 16\n },\n U = {\n supported: !1,\n testSupport: function testSupport(t) {\n !j && V && (q ? N(t) : T = t);\n }\n },\n j = !1,\n q = !1;\n\n function N(t) {\n var e = t.createTexture();\n t.bindTexture(t.TEXTURE_2D, e);\n\n try {\n if (t.texImage2D(t.TEXTURE_2D, 0, t.RGBA, t.RGBA, t.UNSIGNED_BYTE, V), t.isContextLost()) return;\n U.supported = !0;\n } catch (t) {}\n\n t.deleteTexture(e), j = !0;\n }\n\n o.document && ((V = o.document.createElement("img")).onload = function () {\n T && N(T), T = null, q = !0;\n }, V.onerror = function () {\n j = !0, T = null;\n }, V.src = "data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAQAAAAfQ//73v/+BiOh/AAA=");\n\n var K = "01",\n G = function G(t, e) {\n this._transformRequestFn = t, this._customAccessToken = e, this._createSkuToken();\n };\n\n function Z(t) {\n return 0 === t.indexOf("mapbox:");\n }\n\n G.prototype._createSkuToken = function () {\n var t = function () {\n for (var t = "", e = 0; e < 10; e++) {\n t += "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"[Math.floor(62 * Math.random())];\n }\n\n return {\n token: ["1", K, t].join(""),\n tokenExpiresAt: Date.now() + 432e5\n };\n }();\n\n this._skuToken = t.token, this._skuTokenExpiresAt = t.tokenExpiresAt;\n }, G.prototype._isSkuTokenExpired = function () {\n return Date.now() > this._skuTokenExpiresAt;\n }, G.prototype.transformRequest = function (t, e) {\n return this._transformRequestFn && this._transformRequestFn(t, e) || {\n url: t\n };\n }, G.prototype.normalizeStyleURL = function (t, e) {\n if (!Z(t)) return t;\n var r = Y(t);\n return r.path = "/styles/v1" + r.path, this._makeAPIURL(r, this._customAccessToken || e);\n }, G.prototype.normalizeGlyphsURL = function (t, e) {\n if (!Z(t)) return t;\n var r = Y(t);\n return r.path = "/fonts/v1" + r.path, this._makeAPIURL(r, this._customAccessToken || e);\n }, G.prototype.normalizeSourceURL = function (t, e) {\n if (!Z(t)) return t;\n var r = Y(t);\n return r.path = "/v4/" + r.authority + ".json", r.params.push("secure"), this._makeAPIURL(r, this._customAccessToken || e);\n }, G.prototype.normalizeSpriteURL = function (t, e, r, n) {\n var i = Y(t);\n return Z(t) ? (i.path = "/styles/v1" + i.path + "/sprite" + e + r, this._makeAPIURL(i, this._customAccessToken || n)) : (i.path += "" + e + r, $(i));\n }, G.prototype.normalizeTileURL = function (t, e) {\n if (this._isSkuTokenExpired() && this._createSkuToken(), t && !Z(t)) return t;\n var r = Y(t);\n r.path = r.path.replace(/(\\.(png|jpg)\\d*)(?=$)/, (O.devicePixelRatio >= 2 || 512 === e ? "@2x" : "") + (U.supported ? ".webp" : "$1")), r.path = r.path.replace(/^.+\\/v4\\//, "/"), r.path = "/v4" + r.path;\n\n var n = this._customAccessToken || function (t) {\n for (var e = 0, r = t; e < r.length; e += 1) {\n var n = r[e].match(/^access_token=(.*)$/);\n if (n) return n[1];\n }\n\n return null;\n }(r.params) || R.ACCESS_TOKEN;\n\n return R.REQUIRE_ACCESS_TOKEN && n && this._skuToken && r.params.push("sku=" + this._skuToken), this._makeAPIURL(r, n);\n }, G.prototype.canonicalizeTileURL = function (t, e) {\n var r = Y(t);\n if (!r.path.match(/(^\\/v4\\/)/) || !r.path.match(/\\.[\\w]+$/)) return t;\n var n = "mapbox://tiles/";\n n += r.path.replace("/v4/", "");\n var i = r.params;\n return e && (i = i.filter(function (t) {\n return !t.match(/^access_token=/);\n })), i.length && (n += "?" + i.join("&")), n;\n }, G.prototype.canonicalizeTileset = function (t, e) {\n for (var r = !!e && Z(e), n = [], i = 0, a = t.tiles || []; i < a.length; i += 1) {\n var o = a[i];\n J(o) ? n.push(this.canonicalizeTileURL(o, r)) : n.push(o);\n }\n\n return n;\n }, G.prototype._makeAPIURL = function (t, e) {\n var r = "See https://www.mapbox.com/api-documentation/#access-tokens-and-token-scopes",\n n = Y(R.API_URL);\n\n if (t.protocol = n.protocol, t.authority = n.authority, "http" === t.protocol) {\n var i = t.params.indexOf("secure");\n i >= 0 && t.params.splice(i, 1);\n }\n\n if ("/" !== n.path && (t.path = "" + n.path + t.path), !R.REQUIRE_ACCESS_TOKEN) return $(t);\n if (!(e = e || R.ACCESS_TOKEN)) throw new Error("An API access token is required to use Mapbox GL. " + r);\n if ("s" === e[0]) throw new Error("Use a public access token (pk.*) with Mapbox GL, not a secret access token (sk.*). " + r);\n return t.params = t.params.filter(function (t) {\n return -1 === t.indexOf("access_token");\n }), t.params.push("access_token=" + e), $(t);\n };\n var X = /^((https?:)?\\/\\/)?([^\\/]+\\.)?mapbox\\.c(n|om)(\\/|\\?|$)/i;\n\n function J(t) {\n return X.test(t);\n }\n\n var H = /^(\\w+):\\/\\/([^/?]*)(\\/[^?]+)?\\??(.+)?/;\n\n function Y(t) {\n var e = t.match(H);\n if (!e) throw new Error("Unable to parse URL object");\n return {\n protocol: e[1],\n authority: e[2],\n path: e[3] || "/",\n params: e[4] ? e[4].split("&") : []\n };\n }\n\n function $(t) {\n var e = t.params.length ? "?" + t.params.join("&") : "";\n return t.protocol + "://" + t.authority + t.path + e;\n }\n\n function W(t) {\n if (!t) return null;\n var e = t.split(".");\n if (!e || 3 !== e.length) return null;\n\n try {\n return JSON.parse(decodeURIComponent(o.atob(e[1]).split("").map(function (t) {\n return "%" + ("00" + t.charCodeAt(0).toString(16)).slice(-2);\n }).join("")));\n } catch (t) {\n return null;\n }\n }\n\n var Q = function Q(t) {\n this.type = t, this.anonId = null, this.eventData = {}, this.queue = [], this.pendingRequest = null;\n };\n\n Q.prototype.getStorageKey = function (t) {\n var e,\n r = W(R.ACCESS_TOKEN);\n return e = r && r.u ? o.btoa(encodeURIComponent(r.u).replace(/%([0-9A-F]{2})/g, function (t, e) {\n return String.fromCharCode(Number("0x" + e));\n })) : R.ACCESS_TOKEN || "", t ? "mapbox.eventData." + t + ":" + e : "mapbox.eventData:" + e;\n }, Q.prototype.fetchEventData = function () {\n var t = P("localStorage"),\n e = this.getStorageKey(),\n r = this.getStorageKey("uuid");\n if (t) try {\n var n = o.localStorage.getItem(e);\n n && (this.eventData = JSON.parse(n));\n var i = o.localStorage.getItem(r);\n i && (this.anonId = i);\n } catch (t) {\n A("Unable to read from LocalStorage");\n }\n }, Q.prototype.saveEventData = function () {\n var t = P("localStorage"),\n e = this.getStorageKey(),\n r = this.getStorageKey("uuid");\n if (t) try {\n o.localStorage.setItem(r, this.anonId), Object.keys(this.eventData).length >= 1 && o.localStorage.setItem(e, JSON.stringify(this.eventData));\n } catch (t) {\n A("Unable to write to LocalStorage");\n }\n }, Q.prototype.processRequests = function (t) {}, Q.prototype.postEvent = function (t, e, r, n) {\n var i = this;\n\n if (R.EVENTS_URL) {\n var a = Y(R.EVENTS_URL);\n a.params.push("access_token=" + (n || R.ACCESS_TOKEN || ""));\n var o = {\n event: this.type,\n created: new Date(t).toISOString(),\n sdkIdentifier: "mapbox-gl-js",\n sdkVersion: "1.13.1",\n skuId: K,\n userId: this.anonId\n },\n s = e ? h(o, e) : o,\n u = {\n url: $(a),\n headers: {\n "Content-Type": "text/plain"\n },\n body: JSON.stringify([s])\n };\n this.pendingRequest = wt(u, function (t) {\n i.pendingRequest = null, r(t), i.saveEventData(), i.processRequests(n);\n });\n }\n }, Q.prototype.queueRequest = function (t, e) {\n this.queue.push(t), this.processRequests(e);\n };\n\n var tt,\n et,\n rt = function (t) {\n function e() {\n t.call(this, "map.load"), this.success = {}, this.skuToken = "";\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.postMapLoadEvent = function (t, e, r, n) {\n this.skuToken = r, (R.EVENTS_URL && n || R.ACCESS_TOKEN && Array.isArray(t) && t.some(function (t) {\n return Z(t) || J(t);\n })) && this.queueRequest({\n id: e,\n timestamp: Date.now()\n }, n);\n }, e.prototype.processRequests = function (t) {\n var e = this;\n\n if (!this.pendingRequest && 0 !== this.queue.length) {\n var r = this.queue.shift(),\n n = r.id,\n i = r.timestamp;\n n && this.success[n] || (this.anonId || this.fetchEventData(), m(this.anonId) || (this.anonId = d()), this.postEvent(i, {\n skuToken: this.skuToken\n }, function (t) {\n t || n && (e.success[n] = !0);\n }, t));\n }\n }, e;\n }(Q),\n nt = new (function (t) {\n function e(e) {\n t.call(this, "appUserTurnstile"), this._customAccessToken = e;\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.postTurnstileEvent = function (t, e) {\n R.EVENTS_URL && R.ACCESS_TOKEN && Array.isArray(t) && t.some(function (t) {\n return Z(t) || J(t);\n }) && this.queueRequest(Date.now(), e);\n }, e.prototype.processRequests = function (t) {\n var e = this;\n\n if (!this.pendingRequest && 0 !== this.queue.length) {\n this.anonId && this.eventData.lastSuccess && this.eventData.tokenU || this.fetchEventData();\n var r = W(R.ACCESS_TOKEN),\n n = r ? r.u : R.ACCESS_TOKEN,\n i = n !== this.eventData.tokenU;\n m(this.anonId) || (this.anonId = d(), i = !0);\n var a = this.queue.shift();\n\n if (this.eventData.lastSuccess) {\n var o = new Date(this.eventData.lastSuccess),\n s = new Date(a),\n u = (a - this.eventData.lastSuccess) / 864e5;\n i = i || u >= 1 || u < -1 || o.getDate() !== s.getDate();\n } else i = !0;\n\n if (!i) return this.processRequests();\n this.postEvent(a, {\n "enabled.telemetry": !1\n }, function (t) {\n t || (e.eventData.lastSuccess = a, e.eventData.tokenU = n);\n }, t);\n }\n }, e;\n }(Q))(),\n it = nt.postTurnstileEvent.bind(nt),\n at = new rt(),\n ot = at.postMapLoadEvent.bind(at),\n st = 500,\n ut = 50;\n\n function lt() {\n o.caches && !tt && (tt = o.caches.open("mapbox-tiles"));\n }\n\n function pt(t) {\n var e = t.indexOf("?");\n return e < 0 ? t : t.slice(0, e);\n }\n\n var ct,\n ht = 1 / 0;\n\n function ft() {\n return null == ct && (ct = o.OffscreenCanvas && new o.OffscreenCanvas(1, 1).getContext("2d") && "function" == typeof o.createImageBitmap), ct;\n }\n\n var yt = {\n Unknown: "Unknown",\n Style: "Style",\n Source: "Source",\n Tile: "Tile",\n Glyphs: "Glyphs",\n SpriteImage: "SpriteImage",\n SpriteJSON: "SpriteJSON",\n Image: "Image"\n };\n "function" == typeof Object.freeze && Object.freeze(yt);\n\n var dt = function (t) {\n function e(e, r, n) {\n 401 === r && J(n) && (e += ": you may have provided an invalid Mapbox access token. See https://www.mapbox.com/api-documentation/#access-tokens-and-token-scopes"), t.call(this, e), this.status = r, this.url = n, this.name = this.constructor.name, this.message = e;\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.toString = function () {\n return this.name + ": " + this.message + " (" + this.status + "): " + this.url;\n }, e;\n }(Error),\n mt = I() ? function () {\n return self.worker && self.worker.referrer;\n } : function () {\n return ("blob:" === o.location.protocol ? o.parent : o).location.href;\n };\n\n var vt,\n gt,\n xt = function xt(t, e) {\n if (!(/^file:/.test(r = t.url) || /^file:/.test(mt()) && !/^\\w+:/.test(r))) {\n if (o.fetch && o.Request && o.AbortController && o.Request.prototype.hasOwnProperty("signal")) return function (t, e) {\n var r,\n n = new o.AbortController(),\n i = new o.Request(t.url, {\n method: t.method || "GET",\n body: t.body,\n credentials: t.credentials,\n headers: t.headers,\n referrer: mt(),\n signal: n.signal\n }),\n a = !1,\n s = !1,\n u = (r = i.url).indexOf("sku=") > 0 && J(r);\n "json" === t.type && i.headers.set("Accept", "application/json");\n\n var l = function l(r, n, a) {\n if (!s) {\n if (r && "SecurityError" !== r.message && A(r), n && a) return p(n);\n var l = Date.now();\n o.fetch(i).then(function (r) {\n if (r.ok) {\n var n = u ? r.clone() : null;\n return p(r, n, l);\n }\n\n return e(new dt(r.statusText, r.status, t.url));\n }).catch(function (t) {\n 20 !== t.code && e(new Error(t.message));\n });\n }\n },\n p = function p(r, n, u) {\n ("arrayBuffer" === t.type ? r.arrayBuffer() : "json" === t.type ? r.json() : r.text()).then(function (t) {\n s || (n && u && function (t, e, r) {\n if (lt(), tt) {\n var n = {\n status: e.status,\n statusText: e.statusText,\n headers: new o.Headers()\n };\n e.headers.forEach(function (t, e) {\n return n.headers.set(e, t);\n });\n var i = z(e.headers.get("Cache-Control") || "");\n i["no-store"] || (i["max-age"] && n.headers.set("Expires", new Date(r + 1e3 * i["max-age"]).toUTCString()), new Date(n.headers.get("Expires")).getTime() - r < 42e4 || function (t, e) {\n if (void 0 === et) try {\n new Response(new ReadableStream()), et = !0;\n } catch (t) {\n et = !1;\n }\n et ? e(t.body) : t.blob().then(e);\n }(e, function (e) {\n var r = new o.Response(e, n);\n lt(), tt && tt.then(function (e) {\n return e.put(pt(t.url), r);\n }).catch(function (t) {\n return A(t.message);\n });\n }));\n }\n }(i, n, u), a = !0, e(null, t, r.headers.get("Cache-Control"), r.headers.get("Expires")));\n }).catch(function (t) {\n s || e(new Error(t.message));\n });\n };\n\n return u ? function (t, e) {\n if (lt(), !tt) return e(null);\n var r = pt(t.url);\n tt.then(function (t) {\n t.match(r).then(function (n) {\n var i = function (t) {\n if (!t) return !1;\n var e = new Date(t.headers.get("Expires") || 0),\n r = z(t.headers.get("Cache-Control") || "");\n return e > Date.now() && !r["no-cache"];\n }(n);\n\n t.delete(r), i && t.put(r, n.clone()), e(null, n, i);\n }).catch(e);\n }).catch(e);\n }(i, l) : l(null, null), {\n cancel: function cancel() {\n s = !0, a || n.abort();\n }\n };\n }(t, e);\n if (I() && self.worker && self.worker.actor) return self.worker.actor.send("getResource", t, e, void 0, !0);\n }\n\n var r;\n return function (t, e) {\n var r = new o.XMLHttpRequest();\n\n for (var n in r.open(t.method || "GET", t.url, !0), "arrayBuffer" === t.type && (r.responseType = "arraybuffer"), t.headers) {\n r.setRequestHeader(n, t.headers[n]);\n }\n\n return "json" === t.type && (r.responseType = "text", r.setRequestHeader("Accept", "application/json")), r.withCredentials = "include" === t.credentials, r.onerror = function () {\n e(new Error(r.statusText));\n }, r.onload = function () {\n if ((r.status >= 200 && r.status < 300 || 0 === r.status) && null !== r.response) {\n var n = r.response;\n if ("json" === t.type) try {\n n = JSON.parse(r.response);\n } catch (t) {\n return e(t);\n }\n e(null, n, r.getResponseHeader("Cache-Control"), r.getResponseHeader("Expires"));\n } else e(new dt(r.statusText, r.status, t.url));\n }, r.send(t.body), {\n cancel: function cancel() {\n return r.abort();\n }\n };\n }(t, e);\n },\n bt = function bt(t, e) {\n return xt(h(t, {\n type: "arrayBuffer"\n }), e);\n },\n wt = function wt(t, e) {\n return xt(h(t, {\n method: "POST"\n }), e);\n },\n _t = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII=";\n\n vt = [], gt = 0;\n\n var At = function At(t, e) {\n if (U.supported && (t.headers || (t.headers = {}), t.headers.accept = "image/webp,*/*"), gt >= R.MAX_PARALLEL_IMAGE_REQUESTS) {\n var r = {\n requestParameters: t,\n callback: e,\n cancelled: !1,\n cancel: function cancel() {\n this.cancelled = !0;\n }\n };\n return vt.push(r), r;\n }\n\n gt++;\n\n var n = !1,\n i = function i() {\n if (!n) for (n = !0, gt--; vt.length && gt < R.MAX_PARALLEL_IMAGE_REQUESTS;) {\n var t = vt.shift();\n t.cancelled || (t.cancel = At(t.requestParameters, t.callback).cancel);\n }\n },\n a = bt(t, function (t, r, n, a) {\n i(), t ? e(t) : r && (ft() ? function (t, e) {\n var r = new o.Blob([new Uint8Array(t)], {\n type: "image/png"\n });\n o.createImageBitmap(r).then(function (t) {\n e(null, t);\n }).catch(function (t) {\n e(new Error("Could not load image because of " + t.message + ". Please make sure to use a supported image type such as PNG or JPEG. Note that SVGs are not supported."));\n });\n }(r, e) : function (t, e, r, n) {\n var i = new o.Image(),\n a = o.URL;\n i.onload = function () {\n e(null, i), a.revokeObjectURL(i.src), i.onload = null, o.requestAnimationFrame(function () {\n i.src = _t;\n });\n }, i.onerror = function () {\n return e(new Error("Could not load image. Please make sure to use a supported image type such as PNG or JPEG. Note that SVGs are not supported."));\n };\n var s = new o.Blob([new Uint8Array(t)], {\n type: "image/png"\n });\n i.cacheControl = r, i.expires = n, i.src = t.byteLength ? a.createObjectURL(s) : _t;\n }(r, e, n, a));\n });\n\n return {\n cancel: function cancel() {\n a.cancel(), i();\n }\n };\n };\n\n function St(t, e, r) {\n r[t] && -1 !== r[t].indexOf(e) || (r[t] = r[t] || [], r[t].push(e));\n }\n\n function kt(t, e, r) {\n if (r && r[t]) {\n var n = r[t].indexOf(e);\n -1 !== n && r[t].splice(n, 1);\n }\n }\n\n var It = function It(t, e) {\n void 0 === e && (e = {}), h(this, e), this.type = t;\n },\n zt = function (t) {\n function e(e, r) {\n void 0 === r && (r = {}), t.call(this, "error", h({\n error: e\n }, r));\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e;\n }(It),\n Ct = function Ct() {};\n\n Ct.prototype.on = function (t, e) {\n return this._listeners = this._listeners || {}, St(t, e, this._listeners), this;\n }, Ct.prototype.off = function (t, e) {\n return kt(t, e, this._listeners), kt(t, e, this._oneTimeListeners), this;\n }, Ct.prototype.once = function (t, e) {\n return this._oneTimeListeners = this._oneTimeListeners || {}, St(t, e, this._oneTimeListeners), this;\n }, Ct.prototype.fire = function (t, e) {\n "string" == typeof t && (t = new It(t, e || {}));\n var r = t.type;\n\n if (this.listens(r)) {\n t.target = this;\n\n for (var n = 0, i = this._listeners && this._listeners[r] ? this._listeners[r].slice() : []; n < i.length; n += 1) {\n i[n].call(this, t);\n }\n\n for (var a = 0, o = this._oneTimeListeners && this._oneTimeListeners[r] ? this._oneTimeListeners[r].slice() : []; a < o.length; a += 1) {\n var s = o[a];\n kt(r, s, this._oneTimeListeners), s.call(this, t);\n }\n\n var u = this._eventedParent;\n u && (h(t, "function" == typeof this._eventedParentData ? this._eventedParentData() : this._eventedParentData), u.fire(t));\n } else t instanceof zt && console.error(t.error);\n\n return this;\n }, Ct.prototype.listens = function (t) {\n return this._listeners && this._listeners[t] && this._listeners[t].length > 0 || this._oneTimeListeners && this._oneTimeListeners[t] && this._oneTimeListeners[t].length > 0 || this._eventedParent && this._eventedParent.listens(t);\n }, Ct.prototype.setEventedParent = function (t, e) {\n return this._eventedParent = t, this._eventedParentData = e, this;\n };\n\n var Et = {\n $version: 8,\n $root: {\n version: {\n required: !0,\n type: "enum",\n values: [8]\n },\n name: {\n type: "string"\n },\n metadata: {\n type: "*"\n },\n center: {\n type: "array",\n value: "number"\n },\n zoom: {\n type: "number"\n },\n bearing: {\n type: "number",\n default: 0,\n period: 360,\n units: "degrees"\n },\n pitch: {\n type: "number",\n default: 0,\n units: "degrees"\n },\n light: {\n type: "light"\n },\n sources: {\n required: !0,\n type: "sources"\n },\n sprite: {\n type: "string"\n },\n glyphs: {\n type: "string"\n },\n transition: {\n type: "transition"\n },\n layers: {\n required: !0,\n type: "array",\n value: "layer"\n }\n },\n sources: {\n "*": {\n type: "source"\n }\n },\n source: ["source_vector", "source_raster", "source_raster_dem", "source_geojson", "source_video", "source_image"],\n source_vector: {\n type: {\n required: !0,\n type: "enum",\n values: {\n vector: {}\n }\n },\n url: {\n type: "string"\n },\n tiles: {\n type: "array",\n value: "string"\n },\n bounds: {\n type: "array",\n value: "number",\n length: 4,\n default: [-180, -85.051129, 180, 85.051129]\n },\n scheme: {\n type: "enum",\n values: {\n xyz: {},\n tms: {}\n },\n default: "xyz"\n },\n minzoom: {\n type: "number",\n default: 0\n },\n maxzoom: {\n type: "number",\n default: 22\n },\n attribution: {\n type: "string"\n },\n promoteId: {\n type: "promoteId"\n },\n volatile: {\n type: "boolean",\n default: !1\n },\n "*": {\n type: "*"\n }\n },\n source_raster: {\n type: {\n required: !0,\n type: "enum",\n values: {\n raster: {}\n }\n },\n url: {\n type: "string"\n },\n tiles: {\n type: "array",\n value: "string"\n },\n bounds: {\n type: "array",\n value: "number",\n length: 4,\n default: [-180, -85.051129, 180, 85.051129]\n },\n minzoom: {\n type: "number",\n default: 0\n },\n maxzoom: {\n type: "number",\n default: 22\n },\n tileSize: {\n type: "number",\n default: 512,\n units: "pixels"\n },\n scheme: {\n type: "enum",\n values: {\n xyz: {},\n tms: {}\n },\n default: "xyz"\n },\n attribution: {\n type: "string"\n },\n volatile: {\n type: "boolean",\n default: !1\n },\n "*": {\n type: "*"\n }\n },\n source_raster_dem: {\n type: {\n required: !0,\n type: "enum",\n values: {\n "raster-dem": {}\n }\n },\n url: {\n type: "string"\n },\n tiles: {\n type: "array",\n value: "string"\n },\n bounds: {\n type: "array",\n value: "number",\n length: 4,\n default: [-180, -85.051129, 180, 85.051129]\n },\n minzoom: {\n type: "number",\n default: 0\n },\n maxzoom: {\n type: "number",\n default: 22\n },\n tileSize: {\n type: "number",\n default: 512,\n units: "pixels"\n },\n attribution: {\n type: "string"\n },\n encoding: {\n type: "enum",\n values: {\n terrarium: {},\n mapbox: {}\n },\n default: "mapbox"\n },\n volatile: {\n type: "boolean",\n default: !1\n },\n "*": {\n type: "*"\n }\n },\n source_geojson: {\n type: {\n required: !0,\n type: "enum",\n values: {\n geojson: {}\n }\n },\n data: {\n type: "*"\n },\n maxzoom: {\n type: "number",\n default: 18\n },\n attribution: {\n type: "string"\n },\n buffer: {\n type: "number",\n default: 128,\n maximum: 512,\n minimum: 0\n },\n filter: {\n type: "*"\n },\n tolerance: {\n type: "number",\n default: .375\n },\n cluster: {\n type: "boolean",\n default: !1\n },\n clusterRadius: {\n type: "number",\n default: 50,\n minimum: 0\n },\n clusterMaxZoom: {\n type: "number"\n },\n clusterMinPoints: {\n type: "number"\n },\n clusterProperties: {\n type: "*"\n },\n lineMetrics: {\n type: "boolean",\n default: !1\n },\n generateId: {\n type: "boolean",\n default: !1\n },\n promoteId: {\n type: "promoteId"\n }\n },\n source_video: {\n type: {\n required: !0,\n type: "enum",\n values: {\n video: {}\n }\n },\n urls: {\n required: !0,\n type: "array",\n value: "string"\n },\n coordinates: {\n required: !0,\n type: "array",\n length: 4,\n value: {\n type: "array",\n length: 2,\n value: "number"\n }\n }\n },\n source_image: {\n type: {\n required: !0,\n type: "enum",\n values: {\n image: {}\n }\n },\n url: {\n required: !0,\n type: "string"\n },\n coordinates: {\n required: !0,\n type: "array",\n length: 4,\n value: {\n type: "array",\n length: 2,\n value: "number"\n }\n }\n },\n layer: {\n id: {\n type: "string",\n required: !0\n },\n type: {\n type: "enum",\n values: {\n fill: {},\n line: {},\n symbol: {},\n circle: {},\n heatmap: {},\n "fill-extrusion": {},\n raster: {},\n hillshade: {},\n background: {}\n },\n required: !0\n },\n metadata: {\n type: "*"\n },\n source: {\n type: "string"\n },\n "source-layer": {\n type: "string"\n },\n minzoom: {\n type: "number",\n minimum: 0,\n maximum: 24\n },\n maxzoom: {\n type: "number",\n minimum: 0,\n maximum: 24\n },\n filter: {\n type: "filter"\n },\n layout: {\n type: "layout"\n },\n paint: {\n type: "paint"\n }\n },\n layout: ["layout_fill", "layout_line", "layout_circle", "layout_heatmap", "layout_fill-extrusion", "layout_symbol", "layout_raster", "layout_hillshade", "layout_background"],\n layout_background: {\n visibility: {\n type: "enum",\n values: {\n visible: {},\n none: {}\n },\n default: "visible",\n "property-type": "constant"\n }\n },\n layout_fill: {\n "fill-sort-key": {\n type: "number",\n expression: {\n interpolated: !1,\n parameters: ["zoom", "feature"]\n },\n "property-type": "data-driven"\n },\n visibility: {\n type: "enum",\n values: {\n visible: {},\n none: {}\n },\n default: "visible",\n "property-type": "constant"\n }\n },\n layout_circle: {\n "circle-sort-key": {\n type: "number",\n expression: {\n interpolated: !1,\n parameters: ["zoom", "feature"]\n },\n "property-type": "data-driven"\n },\n visibility: {\n type: "enum",\n values: {\n visible: {},\n none: {}\n },\n default: "visible",\n "property-type": "constant"\n }\n },\n layout_heatmap: {\n visibility: {\n type: "enum",\n values: {\n visible: {},\n none: {}\n },\n default: "visible",\n "property-type": "constant"\n }\n },\n "layout_fill-extrusion": {\n visibility: {\n type: "enum",\n values: {\n visible: {},\n none: {}\n },\n default: "visible",\n "property-type": "constant"\n }\n },\n layout_line: {\n "line-cap": {\n type: "enum",\n values: {\n butt: {},\n round: {},\n square: {}\n },\n default: "butt",\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "line-join": {\n type: "enum",\n values: {\n bevel: {},\n round: {},\n miter: {}\n },\n default: "miter",\n expression: {\n interpolated: !1,\n parameters: ["zoom", "feature"]\n },\n "property-type": "data-driven"\n },\n "line-miter-limit": {\n type: "number",\n default: 2,\n requires: [{\n "line-join": "miter"\n }],\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "line-round-limit": {\n type: "number",\n default: 1.05,\n requires: [{\n "line-join": "round"\n }],\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "line-sort-key": {\n type: "number",\n expression: {\n interpolated: !1,\n parameters: ["zoom", "feature"]\n },\n "property-type": "data-driven"\n },\n visibility: {\n type: "enum",\n values: {\n visible: {},\n none: {}\n },\n default: "visible",\n "property-type": "constant"\n }\n },\n layout_symbol: {\n "symbol-placement": {\n type: "enum",\n values: {\n point: {},\n line: {},\n "line-center": {}\n },\n default: "point",\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "symbol-spacing": {\n type: "number",\n default: 250,\n minimum: 1,\n units: "pixels",\n requires: [{\n "symbol-placement": "line"\n }],\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "symbol-avoid-edges": {\n type: "boolean",\n default: !1,\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "symbol-sort-key": {\n type: "number",\n expression: {\n interpolated: !1,\n parameters: ["zoom", "feature"]\n },\n "property-type": "data-driven"\n },\n "symbol-z-order": {\n type: "enum",\n values: {\n auto: {},\n "viewport-y": {},\n source: {}\n },\n default: "auto",\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "icon-allow-overlap": {\n type: "boolean",\n default: !1,\n requires: ["icon-image"],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "icon-ignore-placement": {\n type: "boolean",\n default: !1,\n requires: ["icon-image"],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "icon-optional": {\n type: "boolean",\n default: !1,\n requires: ["icon-image", "text-field"],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "icon-rotation-alignment": {\n type: "enum",\n values: {\n map: {},\n viewport: {},\n auto: {}\n },\n default: "auto",\n requires: ["icon-image"],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "icon-size": {\n type: "number",\n default: 1,\n minimum: 0,\n units: "factor of the original icon size",\n requires: ["icon-image"],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature"]\n },\n "property-type": "data-driven"\n },\n "icon-text-fit": {\n type: "enum",\n values: {\n none: {},\n width: {},\n height: {},\n both: {}\n },\n default: "none",\n requires: ["icon-image", "text-field"],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "icon-text-fit-padding": {\n type: "array",\n value: "number",\n length: 4,\n default: [0, 0, 0, 0],\n units: "pixels",\n requires: ["icon-image", "text-field", {\n "icon-text-fit": ["both", "width", "height"]\n }],\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "icon-image": {\n type: "resolvedImage",\n tokens: !0,\n expression: {\n interpolated: !1,\n parameters: ["zoom", "feature"]\n },\n "property-type": "data-driven"\n },\n "icon-rotate": {\n type: "number",\n default: 0,\n period: 360,\n units: "degrees",\n requires: ["icon-image"],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature"]\n },\n "property-type": "data-driven"\n },\n "icon-padding": {\n type: "number",\n default: 2,\n minimum: 0,\n units: "pixels",\n requires: ["icon-image"],\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "icon-keep-upright": {\n type: "boolean",\n default: !1,\n requires: ["icon-image", {\n "icon-rotation-alignment": "map"\n }, {\n "symbol-placement": ["line", "line-center"]\n }],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "icon-offset": {\n type: "array",\n value: "number",\n length: 2,\n default: [0, 0],\n requires: ["icon-image"],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature"]\n },\n "property-type": "data-driven"\n },\n "icon-anchor": {\n type: "enum",\n values: {\n center: {},\n left: {},\n right: {},\n top: {},\n bottom: {},\n "top-left": {},\n "top-right": {},\n "bottom-left": {},\n "bottom-right": {}\n },\n default: "center",\n requires: ["icon-image"],\n expression: {\n interpolated: !1,\n parameters: ["zoom", "feature"]\n },\n "property-type": "data-driven"\n },\n "icon-pitch-alignment": {\n type: "enum",\n values: {\n map: {},\n viewport: {},\n auto: {}\n },\n default: "auto",\n requires: ["icon-image"],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "text-pitch-alignment": {\n type: "enum",\n values: {\n map: {},\n viewport: {},\n auto: {}\n },\n default: "auto",\n requires: ["text-field"],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "text-rotation-alignment": {\n type: "enum",\n values: {\n map: {},\n viewport: {},\n auto: {}\n },\n default: "auto",\n requires: ["text-field"],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "text-field": {\n type: "formatted",\n default: "",\n tokens: !0,\n expression: {\n interpolated: !1,\n parameters: ["zoom", "feature"]\n },\n "property-type": "data-driven"\n },\n "text-font": {\n type: "array",\n value: "string",\n default: ["Open Sans Regular", "Arial Unicode MS Regular"],\n requires: ["text-field"],\n expression: {\n interpolated: !1,\n parameters: ["zoom", "feature"]\n },\n "property-type": "data-driven"\n },\n "text-size": {\n type: "number",\n default: 16,\n minimum: 0,\n units: "pixels",\n requires: ["text-field"],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature"]\n },\n "property-type": "data-driven"\n },\n "text-max-width": {\n type: "number",\n default: 10,\n minimum: 0,\n units: "ems",\n requires: ["text-field"],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature"]\n },\n "property-type": "data-driven"\n },\n "text-line-height": {\n type: "number",\n default: 1.2,\n units: "ems",\n requires: ["text-field"],\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "text-letter-spacing": {\n type: "number",\n default: 0,\n units: "ems",\n requires: ["text-field"],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature"]\n },\n "property-type": "data-driven"\n },\n "text-justify": {\n type: "enum",\n values: {\n auto: {},\n left: {},\n center: {},\n right: {}\n },\n default: "center",\n requires: ["text-field"],\n expression: {\n interpolated: !1,\n parameters: ["zoom", "feature"]\n },\n "property-type": "data-driven"\n },\n "text-radial-offset": {\n type: "number",\n units: "ems",\n default: 0,\n requires: ["text-field"],\n "property-type": "data-driven",\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature"]\n }\n },\n "text-variable-anchor": {\n type: "array",\n value: "enum",\n values: {\n center: {},\n left: {},\n right: {},\n top: {},\n bottom: {},\n "top-left": {},\n "top-right": {},\n "bottom-left": {},\n "bottom-right": {}\n },\n requires: ["text-field", {\n "symbol-placement": ["point"]\n }],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "text-anchor": {\n type: "enum",\n values: {\n center: {},\n left: {},\n right: {},\n top: {},\n bottom: {},\n "top-left": {},\n "top-right": {},\n "bottom-left": {},\n "bottom-right": {}\n },\n default: "center",\n requires: ["text-field", {\n "!": "text-variable-anchor"\n }],\n expression: {\n interpolated: !1,\n parameters: ["zoom", "feature"]\n },\n "property-type": "data-driven"\n },\n "text-max-angle": {\n type: "number",\n default: 45,\n units: "degrees",\n requires: ["text-field", {\n "symbol-placement": ["line", "line-center"]\n }],\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "text-writing-mode": {\n type: "array",\n value: "enum",\n values: {\n horizontal: {},\n vertical: {}\n },\n requires: ["text-field", {\n "symbol-placement": ["point"]\n }],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "text-rotate": {\n type: "number",\n default: 0,\n period: 360,\n units: "degrees",\n requires: ["text-field"],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature"]\n },\n "property-type": "data-driven"\n },\n "text-padding": {\n type: "number",\n default: 2,\n minimum: 0,\n units: "pixels",\n requires: ["text-field"],\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "text-keep-upright": {\n type: "boolean",\n default: !0,\n requires: ["text-field", {\n "text-rotation-alignment": "map"\n }, {\n "symbol-placement": ["line", "line-center"]\n }],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "text-transform": {\n type: "enum",\n values: {\n none: {},\n uppercase: {},\n lowercase: {}\n },\n default: "none",\n requires: ["text-field"],\n expression: {\n interpolated: !1,\n parameters: ["zoom", "feature"]\n },\n "property-type": "data-driven"\n },\n "text-offset": {\n type: "array",\n value: "number",\n units: "ems",\n length: 2,\n default: [0, 0],\n requires: ["text-field", {\n "!": "text-radial-offset"\n }],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature"]\n },\n "property-type": "data-driven"\n },\n "text-allow-overlap": {\n type: "boolean",\n default: !1,\n requires: ["text-field"],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "text-ignore-placement": {\n type: "boolean",\n default: !1,\n requires: ["text-field"],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "text-optional": {\n type: "boolean",\n default: !1,\n requires: ["text-field", "icon-image"],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n visibility: {\n type: "enum",\n values: {\n visible: {},\n none: {}\n },\n default: "visible",\n "property-type": "constant"\n }\n },\n layout_raster: {\n visibility: {\n type: "enum",\n values: {\n visible: {},\n none: {}\n },\n default: "visible",\n "property-type": "constant"\n }\n },\n layout_hillshade: {\n visibility: {\n type: "enum",\n values: {\n visible: {},\n none: {}\n },\n default: "visible",\n "property-type": "constant"\n }\n },\n filter: {\n type: "array",\n value: "*"\n },\n filter_operator: {\n type: "enum",\n values: {\n "==": {},\n "!=": {},\n ">": {},\n ">=": {},\n "<": {},\n "<=": {},\n in: {},\n "!in": {},\n all: {},\n any: {},\n none: {},\n has: {},\n "!has": {},\n within: {}\n }\n },\n geometry_type: {\n type: "enum",\n values: {\n Point: {},\n LineString: {},\n Polygon: {}\n }\n },\n function: {\n expression: {\n type: "expression"\n },\n stops: {\n type: "array",\n value: "function_stop"\n },\n base: {\n type: "number",\n default: 1,\n minimum: 0\n },\n property: {\n type: "string",\n default: "$zoom"\n },\n type: {\n type: "enum",\n values: {\n identity: {},\n exponential: {},\n interval: {},\n categorical: {}\n },\n default: "exponential"\n },\n colorSpace: {\n type: "enum",\n values: {\n rgb: {},\n lab: {},\n hcl: {}\n },\n default: "rgb"\n },\n default: {\n type: "*",\n required: !1\n }\n },\n function_stop: {\n type: "array",\n minimum: 0,\n maximum: 24,\n value: ["number", "color"],\n length: 2\n },\n expression: {\n type: "array",\n value: "*",\n minimum: 1\n },\n light: {\n anchor: {\n type: "enum",\n default: "viewport",\n values: {\n map: {},\n viewport: {}\n },\n "property-type": "data-constant",\n transition: !1,\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n }\n },\n position: {\n type: "array",\n default: [1.15, 210, 30],\n length: 3,\n value: "number",\n "property-type": "data-constant",\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n }\n },\n color: {\n type: "color",\n "property-type": "data-constant",\n default: "#ffffff",\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n transition: !0\n },\n intensity: {\n type: "number",\n "property-type": "data-constant",\n default: .5,\n minimum: 0,\n maximum: 1,\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n transition: !0\n }\n },\n paint: ["paint_fill", "paint_line", "paint_circle", "paint_heatmap", "paint_fill-extrusion", "paint_symbol", "paint_raster", "paint_hillshade", "paint_background"],\n paint_fill: {\n "fill-antialias": {\n type: "boolean",\n default: !0,\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "fill-opacity": {\n type: "number",\n default: 1,\n minimum: 0,\n maximum: 1,\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "fill-color": {\n type: "color",\n default: "#000000",\n transition: !0,\n requires: [{\n "!": "fill-pattern"\n }],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "fill-outline-color": {\n type: "color",\n transition: !0,\n requires: [{\n "!": "fill-pattern"\n }, {\n "fill-antialias": !0\n }],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "fill-translate": {\n type: "array",\n value: "number",\n length: 2,\n default: [0, 0],\n transition: !0,\n units: "pixels",\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "fill-translate-anchor": {\n type: "enum",\n values: {\n map: {},\n viewport: {}\n },\n default: "map",\n requires: ["fill-translate"],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "fill-pattern": {\n type: "resolvedImage",\n transition: !0,\n expression: {\n interpolated: !1,\n parameters: ["zoom", "feature"]\n },\n "property-type": "cross-faded-data-driven"\n }\n },\n "paint_fill-extrusion": {\n "fill-extrusion-opacity": {\n type: "number",\n default: 1,\n minimum: 0,\n maximum: 1,\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "fill-extrusion-color": {\n type: "color",\n default: "#000000",\n transition: !0,\n requires: [{\n "!": "fill-extrusion-pattern"\n }],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "fill-extrusion-translate": {\n type: "array",\n value: "number",\n length: 2,\n default: [0, 0],\n transition: !0,\n units: "pixels",\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "fill-extrusion-translate-anchor": {\n type: "enum",\n values: {\n map: {},\n viewport: {}\n },\n default: "map",\n requires: ["fill-extrusion-translate"],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "fill-extrusion-pattern": {\n type: "resolvedImage",\n transition: !0,\n expression: {\n interpolated: !1,\n parameters: ["zoom", "feature"]\n },\n "property-type": "cross-faded-data-driven"\n },\n "fill-extrusion-height": {\n type: "number",\n default: 0,\n minimum: 0,\n units: "meters",\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "fill-extrusion-base": {\n type: "number",\n default: 0,\n minimum: 0,\n units: "meters",\n transition: !0,\n requires: ["fill-extrusion-height"],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "fill-extrusion-vertical-gradient": {\n type: "boolean",\n default: !0,\n transition: !1,\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n }\n },\n paint_line: {\n "line-opacity": {\n type: "number",\n default: 1,\n minimum: 0,\n maximum: 1,\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "line-color": {\n type: "color",\n default: "#000000",\n transition: !0,\n requires: [{\n "!": "line-pattern"\n }],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "line-translate": {\n type: "array",\n value: "number",\n length: 2,\n default: [0, 0],\n transition: !0,\n units: "pixels",\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "line-translate-anchor": {\n type: "enum",\n values: {\n map: {},\n viewport: {}\n },\n default: "map",\n requires: ["line-translate"],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "line-width": {\n type: "number",\n default: 1,\n minimum: 0,\n transition: !0,\n units: "pixels",\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "line-gap-width": {\n type: "number",\n default: 0,\n minimum: 0,\n transition: !0,\n units: "pixels",\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "line-offset": {\n type: "number",\n default: 0,\n transition: !0,\n units: "pixels",\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "line-blur": {\n type: "number",\n default: 0,\n minimum: 0,\n transition: !0,\n units: "pixels",\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "line-dasharray": {\n type: "array",\n value: "number",\n minimum: 0,\n transition: !0,\n units: "line widths",\n requires: [{\n "!": "line-pattern"\n }],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "cross-faded"\n },\n "line-pattern": {\n type: "resolvedImage",\n transition: !0,\n expression: {\n interpolated: !1,\n parameters: ["zoom", "feature"]\n },\n "property-type": "cross-faded-data-driven"\n },\n "line-gradient": {\n type: "color",\n transition: !1,\n requires: [{\n "!": "line-dasharray"\n }, {\n "!": "line-pattern"\n }, {\n source: "geojson",\n has: {\n lineMetrics: !0\n }\n }],\n expression: {\n interpolated: !0,\n parameters: ["line-progress"]\n },\n "property-type": "color-ramp"\n }\n },\n paint_circle: {\n "circle-radius": {\n type: "number",\n default: 5,\n minimum: 0,\n transition: !0,\n units: "pixels",\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "circle-color": {\n type: "color",\n default: "#000000",\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "circle-blur": {\n type: "number",\n default: 0,\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "circle-opacity": {\n type: "number",\n default: 1,\n minimum: 0,\n maximum: 1,\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "circle-translate": {\n type: "array",\n value: "number",\n length: 2,\n default: [0, 0],\n transition: !0,\n units: "pixels",\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "circle-translate-anchor": {\n type: "enum",\n values: {\n map: {},\n viewport: {}\n },\n default: "map",\n requires: ["circle-translate"],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "circle-pitch-scale": {\n type: "enum",\n values: {\n map: {},\n viewport: {}\n },\n default: "map",\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "circle-pitch-alignment": {\n type: "enum",\n values: {\n map: {},\n viewport: {}\n },\n default: "viewport",\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "circle-stroke-width": {\n type: "number",\n default: 0,\n minimum: 0,\n transition: !0,\n units: "pixels",\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "circle-stroke-color": {\n type: "color",\n default: "#000000",\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "circle-stroke-opacity": {\n type: "number",\n default: 1,\n minimum: 0,\n maximum: 1,\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n }\n },\n paint_heatmap: {\n "heatmap-radius": {\n type: "number",\n default: 30,\n minimum: 1,\n transition: !0,\n units: "pixels",\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "heatmap-weight": {\n type: "number",\n default: 1,\n minimum: 0,\n transition: !1,\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "heatmap-intensity": {\n type: "number",\n default: 1,\n minimum: 0,\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "heatmap-color": {\n type: "color",\n default: ["interpolate", ["linear"], ["heatmap-density"], 0, "rgba(0, 0, 255, 0)", .1, "royalblue", .3, "cyan", .5, "lime", .7, "yellow", 1, "red"],\n transition: !1,\n expression: {\n interpolated: !0,\n parameters: ["heatmap-density"]\n },\n "property-type": "color-ramp"\n },\n "heatmap-opacity": {\n type: "number",\n default: 1,\n minimum: 0,\n maximum: 1,\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n }\n },\n paint_symbol: {\n "icon-opacity": {\n type: "number",\n default: 1,\n minimum: 0,\n maximum: 1,\n transition: !0,\n requires: ["icon-image"],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "icon-color": {\n type: "color",\n default: "#000000",\n transition: !0,\n requires: ["icon-image"],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "icon-halo-color": {\n type: "color",\n default: "rgba(0, 0, 0, 0)",\n transition: !0,\n requires: ["icon-image"],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "icon-halo-width": {\n type: "number",\n default: 0,\n minimum: 0,\n transition: !0,\n units: "pixels",\n requires: ["icon-image"],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "icon-halo-blur": {\n type: "number",\n default: 0,\n minimum: 0,\n transition: !0,\n units: "pixels",\n requires: ["icon-image"],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "icon-translate": {\n type: "array",\n value: "number",\n length: 2,\n default: [0, 0],\n transition: !0,\n units: "pixels",\n requires: ["icon-image"],\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "icon-translate-anchor": {\n type: "enum",\n values: {\n map: {},\n viewport: {}\n },\n default: "map",\n requires: ["icon-image", "icon-translate"],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "text-opacity": {\n type: "number",\n default: 1,\n minimum: 0,\n maximum: 1,\n transition: !0,\n requires: ["text-field"],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "text-color": {\n type: "color",\n default: "#000000",\n transition: !0,\n overridable: !0,\n requires: ["text-field"],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "text-halo-color": {\n type: "color",\n default: "rgba(0, 0, 0, 0)",\n transition: !0,\n requires: ["text-field"],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "text-halo-width": {\n type: "number",\n default: 0,\n minimum: 0,\n transition: !0,\n units: "pixels",\n requires: ["text-field"],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "text-halo-blur": {\n type: "number",\n default: 0,\n minimum: 0,\n transition: !0,\n units: "pixels",\n requires: ["text-field"],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "text-translate": {\n type: "array",\n value: "number",\n length: 2,\n default: [0, 0],\n transition: !0,\n units: "pixels",\n requires: ["text-field"],\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "text-translate-anchor": {\n type: "enum",\n values: {\n map: {},\n viewport: {}\n },\n default: "map",\n requires: ["text-field", "text-translate"],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n }\n },\n paint_raster: {\n "raster-opacity": {\n type: "number",\n default: 1,\n minimum: 0,\n maximum: 1,\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "raster-hue-rotate": {\n type: "number",\n default: 0,\n period: 360,\n transition: !0,\n units: "degrees",\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "raster-brightness-min": {\n type: "number",\n default: 0,\n minimum: 0,\n maximum: 1,\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "raster-brightness-max": {\n type: "number",\n default: 1,\n minimum: 0,\n maximum: 1,\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "raster-saturation": {\n type: "number",\n default: 0,\n minimum: -1,\n maximum: 1,\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "raster-contrast": {\n type: "number",\n default: 0,\n minimum: -1,\n maximum: 1,\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "raster-resampling": {\n type: "enum",\n values: {\n linear: {},\n nearest: {}\n },\n default: "linear",\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "raster-fade-duration": {\n type: "number",\n default: 300,\n minimum: 0,\n transition: !1,\n units: "milliseconds",\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n }\n },\n paint_hillshade: {\n "hillshade-illumination-direction": {\n type: "number",\n default: 335,\n minimum: 0,\n maximum: 359,\n transition: !1,\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "hillshade-illumination-anchor": {\n type: "enum",\n values: {\n map: {},\n viewport: {}\n },\n default: "viewport",\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "hillshade-exaggeration": {\n type: "number",\n default: .5,\n minimum: 0,\n maximum: 1,\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "hillshade-shadow-color": {\n type: "color",\n default: "#000000",\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "hillshade-highlight-color": {\n type: "color",\n default: "#FFFFFF",\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "hillshade-accent-color": {\n type: "color",\n default: "#000000",\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n }\n },\n paint_background: {\n "background-color": {\n type: "color",\n default: "#000000",\n transition: !0,\n requires: [{\n "!": "background-pattern"\n }],\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "background-pattern": {\n type: "resolvedImage",\n transition: !0,\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "cross-faded"\n },\n "background-opacity": {\n type: "number",\n default: 1,\n minimum: 0,\n maximum: 1,\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n }\n },\n transition: {\n duration: {\n type: "number",\n default: 300,\n minimum: 0,\n units: "milliseconds"\n },\n delay: {\n type: "number",\n default: 0,\n minimum: 0,\n units: "milliseconds"\n }\n },\n "property-type": {\n "data-driven": {\n type: "property-type"\n },\n "cross-faded": {\n type: "property-type"\n },\n "cross-faded-data-driven": {\n type: "property-type"\n },\n "color-ramp": {\n type: "property-type"\n },\n "data-constant": {\n type: "property-type"\n },\n constant: {\n type: "property-type"\n }\n },\n promoteId: {\n "*": {\n type: "string"\n }\n }\n },\n Pt = function Pt(t, e, r, n) {\n this.message = (t ? t + ": " : "") + r, n && (this.identifier = n), null != e && e.__line__ && (this.line = e.__line__);\n };\n\n function Mt(t) {\n var e = t.value;\n return e ? [new Pt(t.key, e, "constants have been deprecated as of v8")] : [];\n }\n\n function Bt(t) {\n for (var e = [], r = arguments.length - 1; r-- > 0;) {\n e[r] = arguments[r + 1];\n }\n\n for (var n = 0, i = e; n < i.length; n += 1) {\n var a = i[n];\n\n for (var o in a) {\n t[o] = a[o];\n }\n }\n\n return t;\n }\n\n function Tt(t) {\n return t instanceof Number || t instanceof String || t instanceof Boolean ? t.valueOf() : t;\n }\n\n function Vt(t) {\n if (Array.isArray(t)) return t.map(Vt);\n\n if (t instanceof Object && !(t instanceof Number || t instanceof String || t instanceof Boolean)) {\n var e = {};\n\n for (var r in t) {\n e[r] = Vt(t[r]);\n }\n\n return e;\n }\n\n return Tt(t);\n }\n\n var Ft = function (t) {\n function e(e, r) {\n t.call(this, r), this.message = r, this.key = e;\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e;\n }(Error),\n Dt = function Dt(t, e) {\n void 0 === e && (e = []), this.parent = t, this.bindings = {};\n\n for (var r = 0, n = e; r < n.length; r += 1) {\n var i = n[r];\n this.bindings[i[0]] = i[1];\n }\n };\n\n Dt.prototype.concat = function (t) {\n return new Dt(this, t);\n }, Dt.prototype.get = function (t) {\n if (this.bindings[t]) return this.bindings[t];\n if (this.parent) return this.parent.get(t);\n throw new Error(t + " not found in scope.");\n }, Dt.prototype.has = function (t) {\n return !!this.bindings[t] || !!this.parent && this.parent.has(t);\n };\n var Lt = {\n kind: "null"\n },\n Ot = {\n kind: "number"\n },\n Rt = {\n kind: "string"\n },\n Ut = {\n kind: "boolean"\n },\n jt = {\n kind: "color"\n },\n qt = {\n kind: "object"\n },\n Nt = {\n kind: "value"\n },\n Kt = {\n kind: "collator"\n },\n Gt = {\n kind: "formatted"\n },\n Zt = {\n kind: "resolvedImage"\n };\n\n function Xt(t, e) {\n return {\n kind: "array",\n itemType: t,\n N: e\n };\n }\n\n function Jt(t) {\n if ("array" === t.kind) {\n var e = Jt(t.itemType);\n return "number" == typeof t.N ? "array<" + e + ", " + t.N + ">" : "value" === t.itemType.kind ? "array" : "array<" + e + ">";\n }\n\n return t.kind;\n }\n\n var Ht = [Lt, Ot, Rt, Ut, jt, Gt, qt, Xt(Nt), Zt];\n\n function Yt(t, e) {\n if ("error" === e.kind) return null;\n\n if ("array" === t.kind) {\n if ("array" === e.kind && (0 === e.N && "value" === e.itemType.kind || !Yt(t.itemType, e.itemType)) && ("number" != typeof t.N || t.N === e.N)) return null;\n } else {\n if (t.kind === e.kind) return null;\n if ("value" === t.kind) for (var r = 0, n = Ht; r < n.length; r += 1) {\n if (!Yt(n[r], e)) return null;\n }\n }\n\n return "Expected " + Jt(t) + " but found " + Jt(e) + " instead.";\n }\n\n function $t(t, e) {\n return e.some(function (e) {\n return e.kind === t.kind;\n });\n }\n\n function Wt(t, e) {\n return e.some(function (e) {\n return "null" === e ? null === t : "array" === e ? Array.isArray(t) : "object" === e ? t && !Array.isArray(t) && "object" == typeof t : e === typeof t;\n });\n }\n\n var Qt = e(function (t, e) {\n var r = {\n transparent: [0, 0, 0, 0],\n aliceblue: [240, 248, 255, 1],\n antiquewhite: [250, 235, 215, 1],\n aqua: [0, 255, 255, 1],\n aquamarine: [127, 255, 212, 1],\n azure: [240, 255, 255, 1],\n beige: [245, 245, 220, 1],\n bisque: [255, 228, 196, 1],\n black: [0, 0, 0, 1],\n blanchedalmond: [255, 235, 205, 1],\n blue: [0, 0, 255, 1],\n blueviolet: [138, 43, 226, 1],\n brown: [165, 42, 42, 1],\n burlywood: [222, 184, 135, 1],\n cadetblue: [95, 158, 160, 1],\n chartreuse: [127, 255, 0, 1],\n chocolate: [210, 105, 30, 1],\n coral: [255, 127, 80, 1],\n cornflowerblue: [100, 149, 237, 1],\n cornsilk: [255, 248, 220, 1],\n crimson: [220, 20, 60, 1],\n cyan: [0, 255, 255, 1],\n darkblue: [0, 0, 139, 1],\n darkcyan: [0, 139, 139, 1],\n darkgoldenrod: [184, 134, 11, 1],\n darkgray: [169, 169, 169, 1],\n darkgreen: [0, 100, 0, 1],\n darkgrey: [169, 169, 169, 1],\n darkkhaki: [189, 183, 107, 1],\n darkmagenta: [139, 0, 139, 1],\n darkolivegreen: [85, 107, 47, 1],\n darkorange: [255, 140, 0, 1],\n darkorchid: [153, 50, 204, 1],\n darkred: [139, 0, 0, 1],\n darksalmon: [233, 150, 122, 1],\n darkseagreen: [143, 188, 143, 1],\n darkslateblue: [72, 61, 139, 1],\n darkslategray: [47, 79, 79, 1],\n darkslategrey: [47, 79, 79, 1],\n darkturquoise: [0, 206, 209, 1],\n darkviolet: [148, 0, 211, 1],\n deeppink: [255, 20, 147, 1],\n deepskyblue: [0, 191, 255, 1],\n dimgray: [105, 105, 105, 1],\n dimgrey: [105, 105, 105, 1],\n dodgerblue: [30, 144, 255, 1],\n firebrick: [178, 34, 34, 1],\n floralwhite: [255, 250, 240, 1],\n forestgreen: [34, 139, 34, 1],\n fuchsia: [255, 0, 255, 1],\n gainsboro: [220, 220, 220, 1],\n ghostwhite: [248, 248, 255, 1],\n gold: [255, 215, 0, 1],\n goldenrod: [218, 165, 32, 1],\n gray: [128, 128, 128, 1],\n green: [0, 128, 0, 1],\n greenyellow: [173, 255, 47, 1],\n grey: [128, 128, 128, 1],\n honeydew: [240, 255, 240, 1],\n hotpink: [255, 105, 180, 1],\n indianred: [205, 92, 92, 1],\n indigo: [75, 0, 130, 1],\n ivory: [255, 255, 240, 1],\n khaki: [240, 230, 140, 1],\n lavender: [230, 230, 250, 1],\n lavenderblush: [255, 240, 245, 1],\n lawngreen: [124, 252, 0, 1],\n lemonchiffon: [255, 250, 205, 1],\n lightblue: [173, 216, 230, 1],\n lightcoral: [240, 128, 128, 1],\n lightcyan: [224, 255, 255, 1],\n lightgoldenrodyellow: [250, 250, 210, 1],\n lightgray: [211, 211, 211, 1],\n lightgreen: [144, 238, 144, 1],\n lightgrey: [211, 211, 211, 1],\n lightpink: [255, 182, 193, 1],\n lightsalmon: [255, 160, 122, 1],\n lightseagreen: [32, 178, 170, 1],\n lightskyblue: [135, 206, 250, 1],\n lightslategray: [119, 136, 153, 1],\n lightslategrey: [119, 136, 153, 1],\n lightsteelblue: [176, 196, 222, 1],\n lightyellow: [255, 255, 224, 1],\n lime: [0, 255, 0, 1],\n limegreen: [50, 205, 50, 1],\n linen: [250, 240, 230, 1],\n magenta: [255, 0, 255, 1],\n maroon: [128, 0, 0, 1],\n mediumaquamarine: [102, 205, 170, 1],\n mediumblue: [0, 0, 205, 1],\n mediumorchid: [186, 85, 211, 1],\n mediumpurple: [147, 112, 219, 1],\n mediumseagreen: [60, 179, 113, 1],\n mediumslateblue: [123, 104, 238, 1],\n mediumspringgreen: [0, 250, 154, 1],\n mediumturquoise: [72, 209, 204, 1],\n mediumvioletred: [199, 21, 133, 1],\n midnightblue: [25, 25, 112, 1],\n mintcream: [245, 255, 250, 1],\n mistyrose: [255, 228, 225, 1],\n moccasin: [255, 228, 181, 1],\n navajowhite: [255, 222, 173, 1],\n navy: [0, 0, 128, 1],\n oldlace: [253, 245, 230, 1],\n olive: [128, 128, 0, 1],\n olivedrab: [107, 142, 35, 1],\n orange: [255, 165, 0, 1],\n orangered: [255, 69, 0, 1],\n orchid: [218, 112, 214, 1],\n palegoldenrod: [238, 232, 170, 1],\n palegreen: [152, 251, 152, 1],\n paleturquoise: [175, 238, 238, 1],\n palevioletred: [219, 112, 147, 1],\n papayawhip: [255, 239, 213, 1],\n peachpuff: [255, 218, 185, 1],\n peru: [205, 133, 63, 1],\n pink: [255, 192, 203, 1],\n plum: [221, 160, 221, 1],\n powderblue: [176, 224, 230, 1],\n purple: [128, 0, 128, 1],\n rebeccapurple: [102, 51, 153, 1],\n red: [255, 0, 0, 1],\n rosybrown: [188, 143, 143, 1],\n royalblue: [65, 105, 225, 1],\n saddlebrown: [139, 69, 19, 1],\n salmon: [250, 128, 114, 1],\n sandybrown: [244, 164, 96, 1],\n seagreen: [46, 139, 87, 1],\n seashell: [255, 245, 238, 1],\n sienna: [160, 82, 45, 1],\n silver: [192, 192, 192, 1],\n skyblue: [135, 206, 235, 1],\n slateblue: [106, 90, 205, 1],\n slategray: [112, 128, 144, 1],\n slategrey: [112, 128, 144, 1],\n snow: [255, 250, 250, 1],\n springgreen: [0, 255, 127, 1],\n steelblue: [70, 130, 180, 1],\n tan: [210, 180, 140, 1],\n teal: [0, 128, 128, 1],\n thistle: [216, 191, 216, 1],\n tomato: [255, 99, 71, 1],\n turquoise: [64, 224, 208, 1],\n violet: [238, 130, 238, 1],\n wheat: [245, 222, 179, 1],\n white: [255, 255, 255, 1],\n whitesmoke: [245, 245, 245, 1],\n yellow: [255, 255, 0, 1],\n yellowgreen: [154, 205, 50, 1]\n };\n\n function n(t) {\n return (t = Math.round(t)) < 0 ? 0 : t > 255 ? 255 : t;\n }\n\n function i(t) {\n return n("%" === t[t.length - 1] ? parseFloat(t) / 100 * 255 : parseInt(t));\n }\n\n function a(t) {\n return (e = "%" === t[t.length - 1] ? parseFloat(t) / 100 : parseFloat(t)) < 0 ? 0 : e > 1 ? 1 : e;\n var e;\n }\n\n function o(t, e, r) {\n return r < 0 ? r += 1 : r > 1 && (r -= 1), 6 * r < 1 ? t + (e - t) * r * 6 : 2 * r < 1 ? e : 3 * r < 2 ? t + (e - t) * (2 / 3 - r) * 6 : t;\n }\n\n try {\n e.parseCSSColor = function (t) {\n var e,\n s = t.replace(/ /g, "").toLowerCase();\n if (s in r) return r[s].slice();\n if ("#" === s[0]) return 4 === s.length ? (e = parseInt(s.substr(1), 16)) >= 0 && e <= 4095 ? [(3840 & e) >> 4 | (3840 & e) >> 8, 240 & e | (240 & e) >> 4, 15 & e | (15 & e) << 4, 1] : null : 7 === s.length && (e = parseInt(s.substr(1), 16)) >= 0 && e <= 16777215 ? [(16711680 & e) >> 16, (65280 & e) >> 8, 255 & e, 1] : null;\n var u = s.indexOf("("),\n l = s.indexOf(")");\n\n if (-1 !== u && l + 1 === s.length) {\n var p = s.substr(0, u),\n c = s.substr(u + 1, l - (u + 1)).split(","),\n h = 1;\n\n switch (p) {\n case "rgba":\n if (4 !== c.length) return null;\n h = a(c.pop());\n\n case "rgb":\n return 3 !== c.length ? null : [i(c[0]), i(c[1]), i(c[2]), h];\n\n case "hsla":\n if (4 !== c.length) return null;\n h = a(c.pop());\n\n case "hsl":\n if (3 !== c.length) return null;\n var f = (parseFloat(c[0]) % 360 + 360) % 360 / 360,\n y = a(c[1]),\n d = a(c[2]),\n m = d <= .5 ? d * (y + 1) : d + y - d * y,\n v = 2 * d - m;\n return [n(255 * o(v, m, f + 1 / 3)), n(255 * o(v, m, f)), n(255 * o(v, m, f - 1 / 3)), h];\n\n default:\n return null;\n }\n }\n\n return null;\n };\n } catch (t) {}\n }).parseCSSColor,\n te = function te(t, e, r, n) {\n void 0 === n && (n = 1), this.r = t, this.g = e, this.b = r, this.a = n;\n };\n\n te.parse = function (t) {\n if (t) {\n if (t instanceof te) return t;\n\n if ("string" == typeof t) {\n var e = Qt(t);\n if (e) return new te(e[0] / 255 * e[3], e[1] / 255 * e[3], e[2] / 255 * e[3], e[3]);\n }\n }\n }, te.prototype.toString = function () {\n var t = this.toArray(),\n e = t[1],\n r = t[2],\n n = t[3];\n return "rgba(" + Math.round(t[0]) + "," + Math.round(e) + "," + Math.round(r) + "," + n + ")";\n }, te.prototype.toArray = function () {\n var t = this.a;\n return 0 === t ? [0, 0, 0, 0] : [255 * this.r / t, 255 * this.g / t, 255 * this.b / t, t];\n }, te.black = new te(0, 0, 0, 1), te.white = new te(1, 1, 1, 1), te.transparent = new te(0, 0, 0, 0), te.red = new te(1, 0, 0, 1);\n\n var ee = function ee(t, e, r) {\n this.sensitivity = t ? e ? "variant" : "case" : e ? "accent" : "base", this.locale = r, this.collator = new Intl.Collator(this.locale ? this.locale : [], {\n sensitivity: this.sensitivity,\n usage: "search"\n });\n };\n\n ee.prototype.compare = function (t, e) {\n return this.collator.compare(t, e);\n }, ee.prototype.resolvedLocale = function () {\n return new Intl.Collator(this.locale ? this.locale : []).resolvedOptions().locale;\n };\n\n var re = function re(t, e, r, n, i) {\n this.text = t, this.image = e, this.scale = r, this.fontStack = n, this.textColor = i;\n },\n ne = function ne(t) {\n this.sections = t;\n };\n\n ne.fromString = function (t) {\n return new ne([new re(t, null, null, null, null)]);\n }, ne.prototype.isEmpty = function () {\n return 0 === this.sections.length || !this.sections.some(function (t) {\n return 0 !== t.text.length || t.image && 0 !== t.image.name.length;\n });\n }, ne.factory = function (t) {\n return t instanceof ne ? t : ne.fromString(t);\n }, ne.prototype.toString = function () {\n return 0 === this.sections.length ? "" : this.sections.map(function (t) {\n return t.text;\n }).join("");\n }, ne.prototype.serialize = function () {\n for (var t = ["format"], e = 0, r = this.sections; e < r.length; e += 1) {\n var n = r[e];\n if (n.image) t.push(["image", n.image.name]);else {\n t.push(n.text);\n var i = {};\n n.fontStack && (i["text-font"] = ["literal", n.fontStack.split(",")]), n.scale && (i["font-scale"] = n.scale), n.textColor && (i["text-color"] = ["rgba"].concat(n.textColor.toArray())), t.push(i);\n }\n }\n\n return t;\n };\n\n var ie = function ie(t) {\n this.name = t.name, this.available = t.available;\n };\n\n function ae(t, e, r, n) {\n return "number" == typeof t && t >= 0 && t <= 255 && "number" == typeof e && e >= 0 && e <= 255 && "number" == typeof r && r >= 0 && r <= 255 ? void 0 === n || "number" == typeof n && n >= 0 && n <= 1 ? null : "Invalid rgba value [" + [t, e, r, n].join(", ") + "]: \'a\' must be between 0 and 1." : "Invalid rgba value [" + ("number" == typeof n ? [t, e, r, n] : [t, e, r]).join(", ") + "]: \'r\', \'g\', and \'b\' must be between 0 and 255.";\n }\n\n function oe(t) {\n if (null === t) return !0;\n if ("string" == typeof t) return !0;\n if ("boolean" == typeof t) return !0;\n if ("number" == typeof t) return !0;\n if (t instanceof te) return !0;\n if (t instanceof ee) return !0;\n if (t instanceof ne) return !0;\n if (t instanceof ie) return !0;\n\n if (Array.isArray(t)) {\n for (var e = 0, r = t; e < r.length; e += 1) {\n if (!oe(r[e])) return !1;\n }\n\n return !0;\n }\n\n if ("object" == typeof t) {\n for (var n in t) {\n if (!oe(t[n])) return !1;\n }\n\n return !0;\n }\n\n return !1;\n }\n\n function se(t) {\n if (null === t) return Lt;\n if ("string" == typeof t) return Rt;\n if ("boolean" == typeof t) return Ut;\n if ("number" == typeof t) return Ot;\n if (t instanceof te) return jt;\n if (t instanceof ee) return Kt;\n if (t instanceof ne) return Gt;\n if (t instanceof ie) return Zt;\n\n if (Array.isArray(t)) {\n for (var e, r = t.length, n = 0, i = t; n < i.length; n += 1) {\n var a = se(i[n]);\n\n if (e) {\n if (e === a) continue;\n e = Nt;\n break;\n }\n\n e = a;\n }\n\n return Xt(e || Nt, r);\n }\n\n return qt;\n }\n\n function ue(t) {\n var e = typeof t;\n return null === t ? "" : "string" === e || "number" === e || "boolean" === e ? String(t) : t instanceof te || t instanceof ne || t instanceof ie ? t.toString() : JSON.stringify(t);\n }\n\n ie.prototype.toString = function () {\n return this.name;\n }, ie.fromString = function (t) {\n return t ? new ie({\n name: t,\n available: !1\n }) : null;\n }, ie.prototype.serialize = function () {\n return ["image", this.name];\n };\n\n var le = function le(t, e) {\n this.type = t, this.value = e;\n };\n\n le.parse = function (t, e) {\n if (2 !== t.length) return e.error("\'literal\' expression requires exactly one argument, but found " + (t.length - 1) + " instead.");\n if (!oe(t[1])) return e.error("invalid value");\n var r = t[1],\n n = se(r),\n i = e.expectedType;\n return "array" !== n.kind || 0 !== n.N || !i || "array" !== i.kind || "number" == typeof i.N && 0 !== i.N || (n = i), new le(n, r);\n }, le.prototype.evaluate = function () {\n return this.value;\n }, le.prototype.eachChild = function () {}, le.prototype.outputDefined = function () {\n return !0;\n }, le.prototype.serialize = function () {\n return "array" === this.type.kind || "object" === this.type.kind ? ["literal", this.value] : this.value instanceof te ? ["rgba"].concat(this.value.toArray()) : this.value instanceof ne ? this.value.serialize() : this.value;\n };\n\n var pe = function pe(t) {\n this.name = "ExpressionEvaluationError", this.message = t;\n };\n\n pe.prototype.toJSON = function () {\n return this.message;\n };\n\n var ce = {\n string: Rt,\n number: Ot,\n boolean: Ut,\n object: qt\n },\n he = function he(t, e) {\n this.type = t, this.args = e;\n };\n\n he.parse = function (t, e) {\n if (t.length < 2) return e.error("Expected at least one argument.");\n var r,\n n = 1,\n i = t[0];\n\n if ("array" === i) {\n var a, o;\n\n if (t.length > 2) {\n var s = t[1];\n if ("string" != typeof s || !(s in ce) || "object" === s) return e.error(\'The item type argument of "array" must be one of string, number, boolean\', 1);\n a = ce[s], n++;\n } else a = Nt;\n\n if (t.length > 3) {\n if (null !== t[2] && ("number" != typeof t[2] || t[2] < 0 || t[2] !== Math.floor(t[2]))) return e.error(\'The length argument to "array" must be a positive integer literal\', 2);\n o = t[2], n++;\n }\n\n r = Xt(a, o);\n } else r = ce[i];\n\n for (var u = []; n < t.length; n++) {\n var l = e.parse(t[n], n, Nt);\n if (!l) return null;\n u.push(l);\n }\n\n return new he(r, u);\n }, he.prototype.evaluate = function (t) {\n for (var e = 0; e < this.args.length; e++) {\n var r = this.args[e].evaluate(t);\n if (!Yt(this.type, se(r))) return r;\n if (e === this.args.length - 1) throw new pe("Expected value to be of type " + Jt(this.type) + ", but found " + Jt(se(r)) + " instead.");\n }\n\n return null;\n }, he.prototype.eachChild = function (t) {\n this.args.forEach(t);\n }, he.prototype.outputDefined = function () {\n return this.args.every(function (t) {\n return t.outputDefined();\n });\n }, he.prototype.serialize = function () {\n var t = this.type,\n e = [t.kind];\n\n if ("array" === t.kind) {\n var r = t.itemType;\n\n if ("string" === r.kind || "number" === r.kind || "boolean" === r.kind) {\n e.push(r.kind);\n var n = t.N;\n ("number" == typeof n || this.args.length > 1) && e.push(n);\n }\n }\n\n return e.concat(this.args.map(function (t) {\n return t.serialize();\n }));\n };\n\n var fe = function fe(t) {\n this.type = Gt, this.sections = t;\n };\n\n fe.parse = function (t, e) {\n if (t.length < 2) return e.error("Expected at least one argument.");\n var r = t[1];\n if (!Array.isArray(r) && "object" == typeof r) return e.error("First argument must be an image or text section.");\n\n for (var n = [], i = !1, a = 1; a <= t.length - 1; ++a) {\n var o = t[a];\n\n if (i && "object" == typeof o && !Array.isArray(o)) {\n i = !1;\n var s = null;\n if (o["font-scale"] && !(s = e.parse(o["font-scale"], 1, Ot))) return null;\n var u = null;\n if (o["text-font"] && !(u = e.parse(o["text-font"], 1, Xt(Rt)))) return null;\n var l = null;\n if (o["text-color"] && !(l = e.parse(o["text-color"], 1, jt))) return null;\n var p = n[n.length - 1];\n p.scale = s, p.font = u, p.textColor = l;\n } else {\n var c = e.parse(t[a], 1, Nt);\n if (!c) return null;\n var h = c.type.kind;\n if ("string" !== h && "value" !== h && "null" !== h && "resolvedImage" !== h) return e.error("Formatted text type must be \'string\', \'value\', \'image\' or \'null\'.");\n i = !0, n.push({\n content: c,\n scale: null,\n font: null,\n textColor: null\n });\n }\n }\n\n return new fe(n);\n }, fe.prototype.evaluate = function (t) {\n return new ne(this.sections.map(function (e) {\n var r = e.content.evaluate(t);\n return se(r) === Zt ? new re("", r, null, null, null) : new re(ue(r), null, e.scale ? e.scale.evaluate(t) : null, e.font ? e.font.evaluate(t).join(",") : null, e.textColor ? e.textColor.evaluate(t) : null);\n }));\n }, fe.prototype.eachChild = function (t) {\n for (var e = 0, r = this.sections; e < r.length; e += 1) {\n var n = r[e];\n t(n.content), n.scale && t(n.scale), n.font && t(n.font), n.textColor && t(n.textColor);\n }\n }, fe.prototype.outputDefined = function () {\n return !1;\n }, fe.prototype.serialize = function () {\n for (var t = ["format"], e = 0, r = this.sections; e < r.length; e += 1) {\n var n = r[e];\n t.push(n.content.serialize());\n var i = {};\n n.scale && (i["font-scale"] = n.scale.serialize()), n.font && (i["text-font"] = n.font.serialize()), n.textColor && (i["text-color"] = n.textColor.serialize()), t.push(i);\n }\n\n return t;\n };\n\n var ye = function ye(t) {\n this.type = Zt, this.input = t;\n };\n\n ye.parse = function (t, e) {\n if (2 !== t.length) return e.error("Expected two arguments.");\n var r = e.parse(t[1], 1, Rt);\n return r ? new ye(r) : e.error("No image name provided.");\n }, ye.prototype.evaluate = function (t) {\n var e = this.input.evaluate(t),\n r = ie.fromString(e);\n return r && t.availableImages && (r.available = t.availableImages.indexOf(e) > -1), r;\n }, ye.prototype.eachChild = function (t) {\n t(this.input);\n }, ye.prototype.outputDefined = function () {\n return !1;\n }, ye.prototype.serialize = function () {\n return ["image", this.input.serialize()];\n };\n\n var de = {\n "to-boolean": Ut,\n "to-color": jt,\n "to-number": Ot,\n "to-string": Rt\n },\n me = function me(t, e) {\n this.type = t, this.args = e;\n };\n\n me.parse = function (t, e) {\n if (t.length < 2) return e.error("Expected at least one argument.");\n var r = t[0];\n if (("to-boolean" === r || "to-string" === r) && 2 !== t.length) return e.error("Expected one argument.");\n\n for (var n = de[r], i = [], a = 1; a < t.length; a++) {\n var o = e.parse(t[a], a, Nt);\n if (!o) return null;\n i.push(o);\n }\n\n return new me(n, i);\n }, me.prototype.evaluate = function (t) {\n if ("boolean" === this.type.kind) return Boolean(this.args[0].evaluate(t));\n\n if ("color" === this.type.kind) {\n for (var e, r, n = 0, i = this.args; n < i.length; n += 1) {\n if (r = null, (e = i[n].evaluate(t)) instanceof te) return e;\n\n if ("string" == typeof e) {\n var a = t.parseColor(e);\n if (a) return a;\n } else if (Array.isArray(e) && !(r = e.length < 3 || e.length > 4 ? "Invalid rbga value " + JSON.stringify(e) + ": expected an array containing either three or four numeric values." : ae(e[0], e[1], e[2], e[3]))) return new te(e[0] / 255, e[1] / 255, e[2] / 255, e[3]);\n }\n\n throw new pe(r || "Could not parse color from value \'" + ("string" == typeof e ? e : String(JSON.stringify(e))) + "\'");\n }\n\n if ("number" === this.type.kind) {\n for (var o = null, s = 0, u = this.args; s < u.length; s += 1) {\n if (null === (o = u[s].evaluate(t))) return 0;\n var l = Number(o);\n if (!isNaN(l)) return l;\n }\n\n throw new pe("Could not convert " + JSON.stringify(o) + " to number.");\n }\n\n return "formatted" === this.type.kind ? ne.fromString(ue(this.args[0].evaluate(t))) : "resolvedImage" === this.type.kind ? ie.fromString(ue(this.args[0].evaluate(t))) : ue(this.args[0].evaluate(t));\n }, me.prototype.eachChild = function (t) {\n this.args.forEach(t);\n }, me.prototype.outputDefined = function () {\n return this.args.every(function (t) {\n return t.outputDefined();\n });\n }, me.prototype.serialize = function () {\n if ("formatted" === this.type.kind) return new fe([{\n content: this.args[0],\n scale: null,\n font: null,\n textColor: null\n }]).serialize();\n if ("resolvedImage" === this.type.kind) return new ye(this.args[0]).serialize();\n var t = ["to-" + this.type.kind];\n return this.eachChild(function (e) {\n t.push(e.serialize());\n }), t;\n };\n\n var ve = ["Unknown", "Point", "LineString", "Polygon"],\n ge = function ge() {\n this.globals = null, this.feature = null, this.featureState = null, this.formattedSection = null, this._parseColorCache = {}, this.availableImages = null, this.canonical = null;\n };\n\n ge.prototype.id = function () {\n return this.feature && "id" in this.feature ? this.feature.id : null;\n }, ge.prototype.geometryType = function () {\n return this.feature ? "number" == typeof this.feature.type ? ve[this.feature.type] : this.feature.type : null;\n }, ge.prototype.geometry = function () {\n return this.feature && "geometry" in this.feature ? this.feature.geometry : null;\n }, ge.prototype.canonicalID = function () {\n return this.canonical;\n }, ge.prototype.properties = function () {\n return this.feature && this.feature.properties || {};\n }, ge.prototype.parseColor = function (t) {\n var e = this._parseColorCache[t];\n return e || (e = this._parseColorCache[t] = te.parse(t)), e;\n };\n\n var xe = function xe(t, e, r, n) {\n this.name = t, this.type = e, this._evaluate = r, this.args = n;\n };\n\n xe.prototype.evaluate = function (t) {\n return this._evaluate(t, this.args);\n }, xe.prototype.eachChild = function (t) {\n this.args.forEach(t);\n }, xe.prototype.outputDefined = function () {\n return !1;\n }, xe.prototype.serialize = function () {\n return [this.name].concat(this.args.map(function (t) {\n return t.serialize();\n }));\n }, xe.parse = function (t, e) {\n var r,\n n = t[0],\n i = xe.definitions[n];\n if (!i) return e.error(\'Unknown expression "\' + n + \'". If you wanted a literal array, use ["literal", [...]].\', 0);\n\n for (var a = Array.isArray(i) ? i[0] : i.type, o = Array.isArray(i) ? [[i[1], i[2]]] : i.overloads, s = o.filter(function (e) {\n var r = e[0];\n return !Array.isArray(r) || r.length === t.length - 1;\n }), u = null, l = 0, p = s; l < p.length; l += 1) {\n var c = p[l],\n h = c[0],\n f = c[1];\n u = new je(e.registry, e.path, null, e.scope);\n\n for (var y = [], d = !1, m = 1; m < t.length; m++) {\n var v = t[m],\n g = Array.isArray(h) ? h[m - 1] : h.type,\n x = u.parse(v, 1 + y.length, g);\n\n if (!x) {\n d = !0;\n break;\n }\n\n y.push(x);\n }\n\n if (!d) if (Array.isArray(h) && h.length !== y.length) u.error("Expected " + h.length + " arguments, but found " + y.length + " instead.");else {\n for (var b = 0; b < y.length; b++) {\n var w = Array.isArray(h) ? h[b] : h.type,\n _ = y[b];\n u.concat(b + 1).checkSubtype(w, _.type);\n }\n\n if (0 === u.errors.length) return new xe(n, a, f, y);\n }\n }\n\n if (1 === s.length) (r = e.errors).push.apply(r, u.errors);else {\n for (var A = (s.length ? s : o).map(function (t) {\n var e;\n return e = t[0], Array.isArray(e) ? "(" + e.map(Jt).join(", ") + ")" : "(" + Jt(e.type) + "...)";\n }).join(" | "), S = [], k = 1; k < t.length; k++) {\n var I = e.parse(t[k], 1 + S.length);\n if (!I) return null;\n S.push(Jt(I.type));\n }\n\n e.error("Expected arguments of type " + A + ", but found (" + S.join(", ") + ") instead.");\n }\n return null;\n }, xe.register = function (t, e) {\n for (var r in xe.definitions = e, e) {\n t[r] = xe;\n }\n };\n\n var be = function be(t, e, r) {\n this.type = Kt, this.locale = r, this.caseSensitive = t, this.diacriticSensitive = e;\n };\n\n function we(t, e) {\n t[0] = Math.min(t[0], e[0]), t[1] = Math.min(t[1], e[1]), t[2] = Math.max(t[2], e[0]), t[3] = Math.max(t[3], e[1]);\n }\n\n function _e(t, e) {\n return !(t[0] <= e[0] || t[2] >= e[2] || t[1] <= e[1] || t[3] >= e[3]);\n }\n\n function Ae(t, e) {\n var r = (180 + t[0]) / 360,\n n = (180 - 180 / Math.PI * Math.log(Math.tan(Math.PI / 4 + t[1] * Math.PI / 360))) / 360,\n i = Math.pow(2, e.z);\n return [Math.round(r * i * 8192), Math.round(n * i * 8192)];\n }\n\n function Se(t, e, r) {\n return e[1] > t[1] != r[1] > t[1] && t[0] < (r[0] - e[0]) * (t[1] - e[1]) / (r[1] - e[1]) + e[0];\n }\n\n function ke(t, e) {\n for (var r, n, i, a, o, s, u, l = !1, p = 0, c = e.length; p < c; p++) {\n for (var h = e[p], f = 0, y = h.length; f < y - 1; f++) {\n if ((a = (r = t)[0] - (n = h[f])[0]) * (u = r[1] - (i = h[f + 1])[1]) - (s = r[0] - i[0]) * (o = r[1] - n[1]) == 0 && a * s <= 0 && o * u <= 0) return !1;\n Se(t, h[f], h[f + 1]) && (l = !l);\n }\n }\n\n return l;\n }\n\n function Ie(t, e) {\n for (var r = 0; r < e.length; r++) {\n if (ke(t, e[r])) return !0;\n }\n\n return !1;\n }\n\n function ze(t, e, r, n) {\n var i = n[0] - r[0],\n a = n[1] - r[1],\n o = (t[0] - r[0]) * a - i * (t[1] - r[1]),\n s = (e[0] - r[0]) * a - i * (e[1] - r[1]);\n return o > 0 && s < 0 || o < 0 && s > 0;\n }\n\n function Ce(t, e, r) {\n for (var n = 0, i = r; n < i.length; n += 1) {\n for (var a = i[n], o = 0; o < a.length - 1; ++o) {\n if (0 != (c = [(p = a[o + 1])[0] - (l = a[o])[0], p[1] - l[1]])[0] * (h = [(u = e)[0] - (s = t)[0], u[1] - s[1]])[1] - c[1] * h[0] && ze(s, u, l, p) && ze(l, p, s, u)) return !0;\n }\n }\n\n var s, u, l, p, c, h;\n return !1;\n }\n\n function Ee(t, e) {\n for (var r = 0; r < t.length; ++r) {\n if (!ke(t[r], e)) return !1;\n }\n\n for (var n = 0; n < t.length - 1; ++n) {\n if (Ce(t[n], t[n + 1], e)) return !1;\n }\n\n return !0;\n }\n\n function Pe(t, e) {\n for (var r = 0; r < e.length; r++) {\n if (Ee(t, e[r])) return !0;\n }\n\n return !1;\n }\n\n function Me(t, e, r) {\n for (var n = [], i = 0; i < t.length; i++) {\n for (var a = [], o = 0; o < t[i].length; o++) {\n var s = Ae(t[i][o], r);\n we(e, s), a.push(s);\n }\n\n n.push(a);\n }\n\n return n;\n }\n\n function Be(t, e, r) {\n for (var n = [], i = 0; i < t.length; i++) {\n var a = Me(t[i], e, r);\n n.push(a);\n }\n\n return n;\n }\n\n function Te(t, e, r, n) {\n if (t[0] < r[0] || t[0] > r[2]) {\n var i = .5 * n,\n a = t[0] - r[0] > i ? -n : r[0] - t[0] > i ? n : 0;\n 0 === a && (a = t[0] - r[2] > i ? -n : r[2] - t[0] > i ? n : 0), t[0] += a;\n }\n\n we(e, t);\n }\n\n function Ve(t, e, r, n) {\n for (var i = 8192 * Math.pow(2, n.z), a = [8192 * n.x, 8192 * n.y], o = [], s = 0, u = t; s < u.length; s += 1) {\n for (var l = 0, p = u[s]; l < p.length; l += 1) {\n var c = p[l],\n h = [c.x + a[0], c.y + a[1]];\n Te(h, e, r, i), o.push(h);\n }\n }\n\n return o;\n }\n\n function Fe(t, e, r, n) {\n for (var i, a = 8192 * Math.pow(2, n.z), o = [8192 * n.x, 8192 * n.y], s = [], u = 0, l = t; u < l.length; u += 1) {\n for (var p = [], c = 0, h = l[u]; c < h.length; c += 1) {\n var f = h[c],\n y = [f.x + o[0], f.y + o[1]];\n we(e, y), p.push(y);\n }\n\n s.push(p);\n }\n\n if (e[2] - e[0] <= a / 2) {\n (i = e)[0] = i[1] = 1 / 0, i[2] = i[3] = -1 / 0;\n\n for (var d = 0, m = s; d < m.length; d += 1) {\n for (var v = 0, g = m[d]; v < g.length; v += 1) {\n Te(g[v], e, r, a);\n }\n }\n }\n\n return s;\n }\n\n be.parse = function (t, e) {\n if (2 !== t.length) return e.error("Expected one argument.");\n var r = t[1];\n if ("object" != typeof r || Array.isArray(r)) return e.error("Collator options argument must be an object.");\n var n = e.parse(void 0 !== r["case-sensitive"] && r["case-sensitive"], 1, Ut);\n if (!n) return null;\n var i = e.parse(void 0 !== r["diacritic-sensitive"] && r["diacritic-sensitive"], 1, Ut);\n if (!i) return null;\n var a = null;\n return r.locale && !(a = e.parse(r.locale, 1, Rt)) ? null : new be(n, i, a);\n }, be.prototype.evaluate = function (t) {\n return new ee(this.caseSensitive.evaluate(t), this.diacriticSensitive.evaluate(t), this.locale ? this.locale.evaluate(t) : null);\n }, be.prototype.eachChild = function (t) {\n t(this.caseSensitive), t(this.diacriticSensitive), this.locale && t(this.locale);\n }, be.prototype.outputDefined = function () {\n return !1;\n }, be.prototype.serialize = function () {\n var t = {};\n return t["case-sensitive"] = this.caseSensitive.serialize(), t["diacritic-sensitive"] = this.diacriticSensitive.serialize(), this.locale && (t.locale = this.locale.serialize()), ["collator", t];\n };\n\n var De = function De(t, e) {\n this.type = Ut, this.geojson = t, this.geometries = e;\n };\n\n function Le(t) {\n if (t instanceof xe) {\n if ("get" === t.name && 1 === t.args.length) return !1;\n if ("feature-state" === t.name) return !1;\n if ("has" === t.name && 1 === t.args.length) return !1;\n if ("properties" === t.name || "geometry-type" === t.name || "id" === t.name) return !1;\n if (/^filter-/.test(t.name)) return !1;\n }\n\n if (t instanceof De) return !1;\n var e = !0;\n return t.eachChild(function (t) {\n e && !Le(t) && (e = !1);\n }), e;\n }\n\n function Oe(t) {\n if (t instanceof xe && "feature-state" === t.name) return !1;\n var e = !0;\n return t.eachChild(function (t) {\n e && !Oe(t) && (e = !1);\n }), e;\n }\n\n function Re(t, e) {\n if (t instanceof xe && e.indexOf(t.name) >= 0) return !1;\n var r = !0;\n return t.eachChild(function (t) {\n r && !Re(t, e) && (r = !1);\n }), r;\n }\n\n De.parse = function (t, e) {\n if (2 !== t.length) return e.error("\'within\' expression requires exactly one argument, but found " + (t.length - 1) + " instead.");\n\n if (oe(t[1])) {\n var r = t[1];\n if ("FeatureCollection" === r.type) for (var n = 0; n < r.features.length; ++n) {\n var i = r.features[n].geometry.type;\n if ("Polygon" === i || "MultiPolygon" === i) return new De(r, r.features[n].geometry);\n } else if ("Feature" === r.type) {\n var a = r.geometry.type;\n if ("Polygon" === a || "MultiPolygon" === a) return new De(r, r.geometry);\n } else if ("Polygon" === r.type || "MultiPolygon" === r.type) return new De(r, r);\n }\n\n return e.error("\'within\' expression requires valid geojson object that contains polygon geometry type.");\n }, De.prototype.evaluate = function (t) {\n if (null != t.geometry() && null != t.canonicalID()) {\n if ("Point" === t.geometryType()) return function (t, e) {\n var r = [1 / 0, 1 / 0, -1 / 0, -1 / 0],\n n = [1 / 0, 1 / 0, -1 / 0, -1 / 0],\n i = t.canonicalID();\n\n if ("Polygon" === e.type) {\n var a = Me(e.coordinates, n, i),\n o = Ve(t.geometry(), r, n, i);\n if (!_e(r, n)) return !1;\n\n for (var s = 0, u = o; s < u.length; s += 1) {\n if (!ke(u[s], a)) return !1;\n }\n }\n\n if ("MultiPolygon" === e.type) {\n var l = Be(e.coordinates, n, i),\n p = Ve(t.geometry(), r, n, i);\n if (!_e(r, n)) return !1;\n\n for (var c = 0, h = p; c < h.length; c += 1) {\n if (!Ie(h[c], l)) return !1;\n }\n }\n\n return !0;\n }(t, this.geometries);\n if ("LineString" === t.geometryType()) return function (t, e) {\n var r = [1 / 0, 1 / 0, -1 / 0, -1 / 0],\n n = [1 / 0, 1 / 0, -1 / 0, -1 / 0],\n i = t.canonicalID();\n\n if ("Polygon" === e.type) {\n var a = Me(e.coordinates, n, i),\n o = Fe(t.geometry(), r, n, i);\n if (!_e(r, n)) return !1;\n\n for (var s = 0, u = o; s < u.length; s += 1) {\n if (!Ee(u[s], a)) return !1;\n }\n }\n\n if ("MultiPolygon" === e.type) {\n var l = Be(e.coordinates, n, i),\n p = Fe(t.geometry(), r, n, i);\n if (!_e(r, n)) return !1;\n\n for (var c = 0, h = p; c < h.length; c += 1) {\n if (!Pe(h[c], l)) return !1;\n }\n }\n\n return !0;\n }(t, this.geometries);\n }\n\n return !1;\n }, De.prototype.eachChild = function () {}, De.prototype.outputDefined = function () {\n return !0;\n }, De.prototype.serialize = function () {\n return ["within", this.geojson];\n };\n\n var Ue = function Ue(t, e) {\n this.type = e.type, this.name = t, this.boundExpression = e;\n };\n\n Ue.parse = function (t, e) {\n if (2 !== t.length || "string" != typeof t[1]) return e.error("\'var\' expression requires exactly one string literal argument.");\n var r = t[1];\n return e.scope.has(r) ? new Ue(r, e.scope.get(r)) : e.error(\'Unknown variable "\' + r + \'". Make sure "\' + r + \'" has been bound in an enclosing "let" expression before using it.\', 1);\n }, Ue.prototype.evaluate = function (t) {\n return this.boundExpression.evaluate(t);\n }, Ue.prototype.eachChild = function () {}, Ue.prototype.outputDefined = function () {\n return !1;\n }, Ue.prototype.serialize = function () {\n return ["var", this.name];\n };\n\n var je = function je(t, e, r, n, i) {\n void 0 === e && (e = []), void 0 === n && (n = new Dt()), void 0 === i && (i = []), this.registry = t, this.path = e, this.key = e.map(function (t) {\n return "[" + t + "]";\n }).join(""), this.scope = n, this.errors = i, this.expectedType = r;\n };\n\n function qe(t, e) {\n for (var r, n = t.length - 1, i = 0, a = n, o = 0; i <= a;) {\n if ((r = t[o = Math.floor((i + a) / 2)]) <= e) {\n if (o === n || e < t[o + 1]) return o;\n i = o + 1;\n } else {\n if (!(r > e)) throw new pe("Input is not a number.");\n a = o - 1;\n }\n }\n\n return 0;\n }\n\n je.prototype.parse = function (t, e, r, n, i) {\n return void 0 === i && (i = {}), e ? this.concat(e, r, n)._parse(t, i) : this._parse(t, i);\n }, je.prototype._parse = function (t, e) {\n function r(t, e, r) {\n return "assert" === r ? new he(e, [t]) : "coerce" === r ? new me(e, [t]) : t;\n }\n\n if (null !== t && "string" != typeof t && "boolean" != typeof t && "number" != typeof t || (t = ["literal", t]), Array.isArray(t)) {\n if (0 === t.length) return this.error(\'Expected an array with at least one element. If you wanted a literal array, use ["literal", []].\');\n var n = t[0];\n if ("string" != typeof n) return this.error("Expression name must be a string, but found " + typeof n + \' instead. If you wanted a literal array, use ["literal", [...]].\', 0), null;\n var i = this.registry[n];\n\n if (i) {\n var a = i.parse(t, this);\n if (!a) return null;\n\n if (this.expectedType) {\n var o = this.expectedType,\n s = a.type;\n if ("string" !== o.kind && "number" !== o.kind && "boolean" !== o.kind && "object" !== o.kind && "array" !== o.kind || "value" !== s.kind) {\n if ("color" !== o.kind && "formatted" !== o.kind && "resolvedImage" !== o.kind || "value" !== s.kind && "string" !== s.kind) {\n if (this.checkSubtype(o, s)) return null;\n } else a = r(a, o, e.typeAnnotation || "coerce");\n } else a = r(a, o, e.typeAnnotation || "assert");\n }\n\n if (!(a instanceof le) && "resolvedImage" !== a.type.kind && function t(e) {\n if (e instanceof Ue) return t(e.boundExpression);\n if (e instanceof xe && "error" === e.name) return !1;\n if (e instanceof be) return !1;\n if (e instanceof De) return !1;\n var r = e instanceof me || e instanceof he,\n n = !0;\n return e.eachChild(function (e) {\n n = r ? n && t(e) : n && e instanceof le;\n }), !!n && Le(e) && Re(e, ["zoom", "heatmap-density", "line-progress", "accumulated", "is-supported-script"]);\n }(a)) {\n var u = new ge();\n\n try {\n a = new le(a.type, a.evaluate(u));\n } catch (t) {\n return this.error(t.message), null;\n }\n }\n\n return a;\n }\n\n return this.error(\'Unknown expression "\' + n + \'". If you wanted a literal array, use ["literal", [...]].\', 0);\n }\n\n return this.error(void 0 === t ? "\'undefined\' value invalid. Use null instead." : "object" == typeof t ? \'Bare objects invalid. Use ["literal", {...}] instead.\' : "Expected an array, but found " + typeof t + " instead.");\n }, je.prototype.concat = function (t, e, r) {\n var n = "number" == typeof t ? this.path.concat(t) : this.path,\n i = r ? this.scope.concat(r) : this.scope;\n return new je(this.registry, n, e || null, i, this.errors);\n }, je.prototype.error = function (t) {\n for (var e = [], r = arguments.length - 1; r-- > 0;) {\n e[r] = arguments[r + 1];\n }\n\n var n = "" + this.key + e.map(function (t) {\n return "[" + t + "]";\n }).join("");\n this.errors.push(new Ft(n, t));\n }, je.prototype.checkSubtype = function (t, e) {\n var r = Yt(t, e);\n return r && this.error(r), r;\n };\n\n var Ne = function Ne(t, e, r) {\n this.type = t, this.input = e, this.labels = [], this.outputs = [];\n\n for (var n = 0, i = r; n < i.length; n += 1) {\n var a = i[n],\n o = a[1];\n this.labels.push(a[0]), this.outputs.push(o);\n }\n };\n\n function Ke(t, e, r) {\n return t * (1 - r) + e * r;\n }\n\n Ne.parse = function (t, e) {\n if (t.length - 1 < 4) return e.error("Expected at least 4 arguments, but found only " + (t.length - 1) + ".");\n if ((t.length - 1) % 2 != 0) return e.error("Expected an even number of arguments.");\n var r = e.parse(t[1], 1, Ot);\n if (!r) return null;\n var n = [],\n i = null;\n e.expectedType && "value" !== e.expectedType.kind && (i = e.expectedType);\n\n for (var a = 1; a < t.length; a += 2) {\n var o = 1 === a ? -1 / 0 : t[a],\n s = t[a + 1],\n u = a,\n l = a + 1;\n if ("number" != typeof o) return e.error(\'Input/output pairs for "step" expressions must be defined using literal numeric values (not computed expressions) for the input values.\', u);\n if (n.length && n[n.length - 1][0] >= o) return e.error(\'Input/output pairs for "step" expressions must be arranged with input values in strictly ascending order.\', u);\n var p = e.parse(s, l, i);\n if (!p) return null;\n i = i || p.type, n.push([o, p]);\n }\n\n return new Ne(i, r, n);\n }, Ne.prototype.evaluate = function (t) {\n var e = this.labels,\n r = this.outputs;\n if (1 === e.length) return r[0].evaluate(t);\n var n = this.input.evaluate(t);\n if (n <= e[0]) return r[0].evaluate(t);\n var i = e.length;\n return n >= e[i - 1] ? r[i - 1].evaluate(t) : r[qe(e, n)].evaluate(t);\n }, Ne.prototype.eachChild = function (t) {\n t(this.input);\n\n for (var e = 0, r = this.outputs; e < r.length; e += 1) {\n t(r[e]);\n }\n }, Ne.prototype.outputDefined = function () {\n return this.outputs.every(function (t) {\n return t.outputDefined();\n });\n }, Ne.prototype.serialize = function () {\n for (var t = ["step", this.input.serialize()], e = 0; e < this.labels.length; e++) {\n e > 0 && t.push(this.labels[e]), t.push(this.outputs[e].serialize());\n }\n\n return t;\n };\n var Ge = Object.freeze({\n __proto__: null,\n number: Ke,\n color: function color(t, e, r) {\n return new te(Ke(t.r, e.r, r), Ke(t.g, e.g, r), Ke(t.b, e.b, r), Ke(t.a, e.a, r));\n },\n array: function array(t, e, r) {\n return t.map(function (t, n) {\n return Ke(t, e[n], r);\n });\n }\n }),\n Ze = 6 / 29 * 3 * (6 / 29),\n Xe = Math.PI / 180,\n Je = 180 / Math.PI;\n\n function He(t) {\n return t > .008856451679035631 ? Math.pow(t, 1 / 3) : t / Ze + 4 / 29;\n }\n\n function Ye(t) {\n return t > 6 / 29 ? t * t * t : Ze * (t - 4 / 29);\n }\n\n function $e(t) {\n return 255 * (t <= .0031308 ? 12.92 * t : 1.055 * Math.pow(t, 1 / 2.4) - .055);\n }\n\n function We(t) {\n return (t /= 255) <= .04045 ? t / 12.92 : Math.pow((t + .055) / 1.055, 2.4);\n }\n\n function Qe(t) {\n var e = We(t.r),\n r = We(t.g),\n n = We(t.b),\n i = He((.4124564 * e + .3575761 * r + .1804375 * n) / .95047),\n a = He((.2126729 * e + .7151522 * r + .072175 * n) / 1);\n return {\n l: 116 * a - 16,\n a: 500 * (i - a),\n b: 200 * (a - He((.0193339 * e + .119192 * r + .9503041 * n) / 1.08883)),\n alpha: t.a\n };\n }\n\n function tr(t) {\n var e = (t.l + 16) / 116,\n r = isNaN(t.a) ? e : e + t.a / 500,\n n = isNaN(t.b) ? e : e - t.b / 200;\n return e = 1 * Ye(e), r = .95047 * Ye(r), n = 1.08883 * Ye(n), new te($e(3.2404542 * r - 1.5371385 * e - .4985314 * n), $e(-.969266 * r + 1.8760108 * e + .041556 * n), $e(.0556434 * r - .2040259 * e + 1.0572252 * n), t.alpha);\n }\n\n function er(t, e, r) {\n var n = e - t;\n return t + r * (n > 180 || n < -180 ? n - 360 * Math.round(n / 360) : n);\n }\n\n var rr = {\n forward: Qe,\n reverse: tr,\n interpolate: function interpolate(t, e, r) {\n return {\n l: Ke(t.l, e.l, r),\n a: Ke(t.a, e.a, r),\n b: Ke(t.b, e.b, r),\n alpha: Ke(t.alpha, e.alpha, r)\n };\n }\n },\n nr = {\n forward: function forward(t) {\n var e = Qe(t),\n r = e.l,\n n = e.a,\n i = e.b,\n a = Math.atan2(i, n) * Je;\n return {\n h: a < 0 ? a + 360 : a,\n c: Math.sqrt(n * n + i * i),\n l: r,\n alpha: t.a\n };\n },\n reverse: function reverse(t) {\n var e = t.h * Xe,\n r = t.c;\n return tr({\n l: t.l,\n a: Math.cos(e) * r,\n b: Math.sin(e) * r,\n alpha: t.alpha\n });\n },\n interpolate: function interpolate(t, e, r) {\n return {\n h: er(t.h, e.h, r),\n c: Ke(t.c, e.c, r),\n l: Ke(t.l, e.l, r),\n alpha: Ke(t.alpha, e.alpha, r)\n };\n }\n },\n ir = Object.freeze({\n __proto__: null,\n lab: rr,\n hcl: nr\n }),\n ar = function ar(t, e, r, n, i) {\n this.type = t, this.operator = e, this.interpolation = r, this.input = n, this.labels = [], this.outputs = [];\n\n for (var a = 0, o = i; a < o.length; a += 1) {\n var s = o[a],\n u = s[1];\n this.labels.push(s[0]), this.outputs.push(u);\n }\n };\n\n function or(t, e, r, n) {\n var i = n - r,\n a = t - r;\n return 0 === i ? 0 : 1 === e ? a / i : (Math.pow(e, a) - 1) / (Math.pow(e, i) - 1);\n }\n\n ar.interpolationFactor = function (t, e, n, i) {\n var a = 0;\n if ("exponential" === t.name) a = or(e, t.base, n, i);else if ("linear" === t.name) a = or(e, 1, n, i);else if ("cubic-bezier" === t.name) {\n var o = t.controlPoints;\n a = new r(o[0], o[1], o[2], o[3]).solve(or(e, 1, n, i));\n }\n return a;\n }, ar.parse = function (t, e) {\n var r = t[0],\n n = t[1],\n i = t[2],\n a = t.slice(3);\n if (!Array.isArray(n) || 0 === n.length) return e.error("Expected an interpolation type expression.", 1);\n if ("linear" === n[0]) n = {\n name: "linear"\n };else if ("exponential" === n[0]) {\n var o = n[1];\n if ("number" != typeof o) return e.error("Exponential interpolation requires a numeric base.", 1, 1);\n n = {\n name: "exponential",\n base: o\n };\n } else {\n if ("cubic-bezier" !== n[0]) return e.error("Unknown interpolation type " + String(n[0]), 1, 0);\n var s = n.slice(1);\n if (4 !== s.length || s.some(function (t) {\n return "number" != typeof t || t < 0 || t > 1;\n })) return e.error("Cubic bezier interpolation requires four numeric arguments with values between 0 and 1.", 1);\n n = {\n name: "cubic-bezier",\n controlPoints: s\n };\n }\n if (t.length - 1 < 4) return e.error("Expected at least 4 arguments, but found only " + (t.length - 1) + ".");\n if ((t.length - 1) % 2 != 0) return e.error("Expected an even number of arguments.");\n if (!(i = e.parse(i, 2, Ot))) return null;\n var u = [],\n l = null;\n "interpolate-hcl" === r || "interpolate-lab" === r ? l = jt : e.expectedType && "value" !== e.expectedType.kind && (l = e.expectedType);\n\n for (var p = 0; p < a.length; p += 2) {\n var c = a[p],\n h = a[p + 1],\n f = p + 3,\n y = p + 4;\n if ("number" != typeof c) return e.error(\'Input/output pairs for "interpolate" expressions must be defined using literal numeric values (not computed expressions) for the input values.\', f);\n if (u.length && u[u.length - 1][0] >= c) return e.error(\'Input/output pairs for "interpolate" expressions must be arranged with input values in strictly ascending order.\', f);\n var d = e.parse(h, y, l);\n if (!d) return null;\n l = l || d.type, u.push([c, d]);\n }\n\n return "number" === l.kind || "color" === l.kind || "array" === l.kind && "number" === l.itemType.kind && "number" == typeof l.N ? new ar(l, r, n, i, u) : e.error("Type " + Jt(l) + " is not interpolatable.");\n }, ar.prototype.evaluate = function (t) {\n var e = this.labels,\n r = this.outputs;\n if (1 === e.length) return r[0].evaluate(t);\n var n = this.input.evaluate(t);\n if (n <= e[0]) return r[0].evaluate(t);\n var i = e.length;\n if (n >= e[i - 1]) return r[i - 1].evaluate(t);\n var a = qe(e, n),\n o = ar.interpolationFactor(this.interpolation, n, e[a], e[a + 1]),\n s = r[a].evaluate(t),\n u = r[a + 1].evaluate(t);\n return "interpolate" === this.operator ? Ge[this.type.kind.toLowerCase()](s, u, o) : "interpolate-hcl" === this.operator ? nr.reverse(nr.interpolate(nr.forward(s), nr.forward(u), o)) : rr.reverse(rr.interpolate(rr.forward(s), rr.forward(u), o));\n }, ar.prototype.eachChild = function (t) {\n t(this.input);\n\n for (var e = 0, r = this.outputs; e < r.length; e += 1) {\n t(r[e]);\n }\n }, ar.prototype.outputDefined = function () {\n return this.outputs.every(function (t) {\n return t.outputDefined();\n });\n }, ar.prototype.serialize = function () {\n var t;\n t = "linear" === this.interpolation.name ? ["linear"] : "exponential" === this.interpolation.name ? 1 === this.interpolation.base ? ["linear"] : ["exponential", this.interpolation.base] : ["cubic-bezier"].concat(this.interpolation.controlPoints);\n\n for (var e = [this.operator, t, this.input.serialize()], r = 0; r < this.labels.length; r++) {\n e.push(this.labels[r], this.outputs[r].serialize());\n }\n\n return e;\n };\n\n var sr = function sr(t, e) {\n this.type = t, this.args = e;\n };\n\n sr.parse = function (t, e) {\n if (t.length < 2) return e.error("Expectected at least one argument.");\n var r = null,\n n = e.expectedType;\n n && "value" !== n.kind && (r = n);\n\n for (var i = [], a = 0, o = t.slice(1); a < o.length; a += 1) {\n var s = e.parse(o[a], 1 + i.length, r, void 0, {\n typeAnnotation: "omit"\n });\n if (!s) return null;\n r = r || s.type, i.push(s);\n }\n\n var u = n && i.some(function (t) {\n return Yt(n, t.type);\n });\n return new sr(u ? Nt : r, i);\n }, sr.prototype.evaluate = function (t) {\n for (var e, r = null, n = 0, i = 0, a = this.args; i < a.length && (n++, (r = a[i].evaluate(t)) && r instanceof ie && !r.available && (e || (e = r.name), r = null, n === this.args.length && (r = e)), null === r); i += 1) {\n ;\n }\n\n return r;\n }, sr.prototype.eachChild = function (t) {\n this.args.forEach(t);\n }, sr.prototype.outputDefined = function () {\n return this.args.every(function (t) {\n return t.outputDefined();\n });\n }, sr.prototype.serialize = function () {\n var t = ["coalesce"];\n return this.eachChild(function (e) {\n t.push(e.serialize());\n }), t;\n };\n\n var ur = function ur(t, e) {\n this.type = e.type, this.bindings = [].concat(t), this.result = e;\n };\n\n ur.prototype.evaluate = function (t) {\n return this.result.evaluate(t);\n }, ur.prototype.eachChild = function (t) {\n for (var e = 0, r = this.bindings; e < r.length; e += 1) {\n t(r[e][1]);\n }\n\n t(this.result);\n }, ur.parse = function (t, e) {\n if (t.length < 4) return e.error("Expected at least 3 arguments, but found " + (t.length - 1) + " instead.");\n\n for (var r = [], n = 1; n < t.length - 1; n += 2) {\n var i = t[n];\n if ("string" != typeof i) return e.error("Expected string, but found " + typeof i + " instead.", n);\n if (/[^a-zA-Z0-9_]/.test(i)) return e.error("Variable names must contain only alphanumeric characters or \'_\'.", n);\n var a = e.parse(t[n + 1], n + 1);\n if (!a) return null;\n r.push([i, a]);\n }\n\n var o = e.parse(t[t.length - 1], t.length - 1, e.expectedType, r);\n return o ? new ur(r, o) : null;\n }, ur.prototype.outputDefined = function () {\n return this.result.outputDefined();\n }, ur.prototype.serialize = function () {\n for (var t = ["let"], e = 0, r = this.bindings; e < r.length; e += 1) {\n var n = r[e];\n t.push(n[0], n[1].serialize());\n }\n\n return t.push(this.result.serialize()), t;\n };\n\n var lr = function lr(t, e, r) {\n this.type = t, this.index = e, this.input = r;\n };\n\n lr.parse = function (t, e) {\n if (3 !== t.length) return e.error("Expected 2 arguments, but found " + (t.length - 1) + " instead.");\n var r = e.parse(t[1], 1, Ot),\n n = e.parse(t[2], 2, Xt(e.expectedType || Nt));\n return r && n ? new lr(n.type.itemType, r, n) : null;\n }, lr.prototype.evaluate = function (t) {\n var e = this.index.evaluate(t),\n r = this.input.evaluate(t);\n if (e < 0) throw new pe("Array index out of bounds: " + e + " < 0.");\n if (e >= r.length) throw new pe("Array index out of bounds: " + e + " > " + (r.length - 1) + ".");\n if (e !== Math.floor(e)) throw new pe("Array index must be an integer, but found " + e + " instead.");\n return r[e];\n }, lr.prototype.eachChild = function (t) {\n t(this.index), t(this.input);\n }, lr.prototype.outputDefined = function () {\n return !1;\n }, lr.prototype.serialize = function () {\n return ["at", this.index.serialize(), this.input.serialize()];\n };\n\n var pr = function pr(t, e) {\n this.type = Ut, this.needle = t, this.haystack = e;\n };\n\n pr.parse = function (t, e) {\n if (3 !== t.length) return e.error("Expected 2 arguments, but found " + (t.length - 1) + " instead.");\n var r = e.parse(t[1], 1, Nt),\n n = e.parse(t[2], 2, Nt);\n return r && n ? $t(r.type, [Ut, Rt, Ot, Lt, Nt]) ? new pr(r, n) : e.error("Expected first argument to be of type boolean, string, number or null, but found " + Jt(r.type) + " instead") : null;\n }, pr.prototype.evaluate = function (t) {\n var e = this.needle.evaluate(t),\n r = this.haystack.evaluate(t);\n if (!r) return !1;\n if (!Wt(e, ["boolean", "string", "number", "null"])) throw new pe("Expected first argument to be of type boolean, string, number or null, but found " + Jt(se(e)) + " instead.");\n if (!Wt(r, ["string", "array"])) throw new pe("Expected second argument to be of type array or string, but found " + Jt(se(r)) + " instead.");\n return r.indexOf(e) >= 0;\n }, pr.prototype.eachChild = function (t) {\n t(this.needle), t(this.haystack);\n }, pr.prototype.outputDefined = function () {\n return !0;\n }, pr.prototype.serialize = function () {\n return ["in", this.needle.serialize(), this.haystack.serialize()];\n };\n\n var cr = function cr(t, e, r) {\n this.type = Ot, this.needle = t, this.haystack = e, this.fromIndex = r;\n };\n\n cr.parse = function (t, e) {\n if (t.length <= 2 || t.length >= 5) return e.error("Expected 3 or 4 arguments, but found " + (t.length - 1) + " instead.");\n var r = e.parse(t[1], 1, Nt),\n n = e.parse(t[2], 2, Nt);\n if (!r || !n) return null;\n if (!$t(r.type, [Ut, Rt, Ot, Lt, Nt])) return e.error("Expected first argument to be of type boolean, string, number or null, but found " + Jt(r.type) + " instead");\n\n if (4 === t.length) {\n var i = e.parse(t[3], 3, Ot);\n return i ? new cr(r, n, i) : null;\n }\n\n return new cr(r, n);\n }, cr.prototype.evaluate = function (t) {\n var e = this.needle.evaluate(t),\n r = this.haystack.evaluate(t);\n if (!Wt(e, ["boolean", "string", "number", "null"])) throw new pe("Expected first argument to be of type boolean, string, number or null, but found " + Jt(se(e)) + " instead.");\n if (!Wt(r, ["string", "array"])) throw new pe("Expected second argument to be of type array or string, but found " + Jt(se(r)) + " instead.");\n\n if (this.fromIndex) {\n var n = this.fromIndex.evaluate(t);\n return r.indexOf(e, n);\n }\n\n return r.indexOf(e);\n }, cr.prototype.eachChild = function (t) {\n t(this.needle), t(this.haystack), this.fromIndex && t(this.fromIndex);\n }, cr.prototype.outputDefined = function () {\n return !1;\n }, cr.prototype.serialize = function () {\n if (null != this.fromIndex && void 0 !== this.fromIndex) {\n var t = this.fromIndex.serialize();\n return ["index-of", this.needle.serialize(), this.haystack.serialize(), t];\n }\n\n return ["index-of", this.needle.serialize(), this.haystack.serialize()];\n };\n\n var hr = function hr(t, e, r, n, i, a) {\n this.inputType = t, this.type = e, this.input = r, this.cases = n, this.outputs = i, this.otherwise = a;\n };\n\n hr.parse = function (t, e) {\n if (t.length < 5) return e.error("Expected at least 4 arguments, but found only " + (t.length - 1) + ".");\n if (t.length % 2 != 1) return e.error("Expected an even number of arguments.");\n var r, n;\n e.expectedType && "value" !== e.expectedType.kind && (n = e.expectedType);\n\n for (var i = {}, a = [], o = 2; o < t.length - 1; o += 2) {\n var s = t[o],\n u = t[o + 1];\n Array.isArray(s) || (s = [s]);\n var l = e.concat(o);\n if (0 === s.length) return l.error("Expected at least one branch label.");\n\n for (var p = 0, c = s; p < c.length; p += 1) {\n var h = c[p];\n if ("number" != typeof h && "string" != typeof h) return l.error("Branch labels must be numbers or strings.");\n if ("number" == typeof h && Math.abs(h) > Number.MAX_SAFE_INTEGER) return l.error("Branch labels must be integers no larger than " + Number.MAX_SAFE_INTEGER + ".");\n if ("number" == typeof h && Math.floor(h) !== h) return l.error("Numeric branch labels must be integer values.");\n\n if (r) {\n if (l.checkSubtype(r, se(h))) return null;\n } else r = se(h);\n\n if (void 0 !== i[String(h)]) return l.error("Branch labels must be unique.");\n i[String(h)] = a.length;\n }\n\n var f = e.parse(u, o, n);\n if (!f) return null;\n n = n || f.type, a.push(f);\n }\n\n var y = e.parse(t[1], 1, Nt);\n if (!y) return null;\n var d = e.parse(t[t.length - 1], t.length - 1, n);\n return d ? "value" !== y.type.kind && e.concat(1).checkSubtype(r, y.type) ? null : new hr(r, n, y, i, a, d) : null;\n }, hr.prototype.evaluate = function (t) {\n var e = this.input.evaluate(t);\n return (se(e) === this.inputType && this.outputs[this.cases[e]] || this.otherwise).evaluate(t);\n }, hr.prototype.eachChild = function (t) {\n t(this.input), this.outputs.forEach(t), t(this.otherwise);\n }, hr.prototype.outputDefined = function () {\n return this.outputs.every(function (t) {\n return t.outputDefined();\n }) && this.otherwise.outputDefined();\n }, hr.prototype.serialize = function () {\n for (var t = this, e = ["match", this.input.serialize()], r = [], n = {}, i = 0, a = Object.keys(this.cases).sort(); i < a.length; i += 1) {\n var o = a[i];\n void 0 === (c = n[this.cases[o]]) ? (n[this.cases[o]] = r.length, r.push([this.cases[o], [o]])) : r[c][1].push(o);\n }\n\n for (var s = function s(e) {\n return "number" === t.inputType.kind ? Number(e) : e;\n }, u = 0, l = r; u < l.length; u += 1) {\n var p = l[u],\n c = p[0],\n h = p[1];\n e.push(1 === h.length ? s(h[0]) : h.map(s)), e.push(this.outputs[outputIndex$1].serialize());\n }\n\n return e.push(this.otherwise.serialize()), e;\n };\n\n var fr = function fr(t, e, r) {\n this.type = t, this.branches = e, this.otherwise = r;\n };\n\n fr.parse = function (t, e) {\n if (t.length < 4) return e.error("Expected at least 3 arguments, but found only " + (t.length - 1) + ".");\n if (t.length % 2 != 0) return e.error("Expected an odd number of arguments.");\n var r;\n e.expectedType && "value" !== e.expectedType.kind && (r = e.expectedType);\n\n for (var n = [], i = 1; i < t.length - 1; i += 2) {\n var a = e.parse(t[i], i, Ut);\n if (!a) return null;\n var o = e.parse(t[i + 1], i + 1, r);\n if (!o) return null;\n n.push([a, o]), r = r || o.type;\n }\n\n var s = e.parse(t[t.length - 1], t.length - 1, r);\n return s ? new fr(r, n, s) : null;\n }, fr.prototype.evaluate = function (t) {\n for (var e = 0, r = this.branches; e < r.length; e += 1) {\n var n = r[e],\n i = n[1];\n if (n[0].evaluate(t)) return i.evaluate(t);\n }\n\n return this.otherwise.evaluate(t);\n }, fr.prototype.eachChild = function (t) {\n for (var e = 0, r = this.branches; e < r.length; e += 1) {\n var n = r[e],\n i = n[1];\n t(n[0]), t(i);\n }\n\n t(this.otherwise);\n }, fr.prototype.outputDefined = function () {\n return this.branches.every(function (t) {\n return t[1].outputDefined();\n }) && this.otherwise.outputDefined();\n }, fr.prototype.serialize = function () {\n var t = ["case"];\n return this.eachChild(function (e) {\n t.push(e.serialize());\n }), t;\n };\n\n var yr = function yr(t, e, r, n) {\n this.type = t, this.input = e, this.beginIndex = r, this.endIndex = n;\n };\n\n function dr(t, e) {\n return "==" === t || "!=" === t ? "boolean" === e.kind || "string" === e.kind || "number" === e.kind || "null" === e.kind || "value" === e.kind : "string" === e.kind || "number" === e.kind || "value" === e.kind;\n }\n\n function mr(t, e, r, n) {\n return 0 === n.compare(e, r);\n }\n\n function vr(t, e, r) {\n var n = "==" !== t && "!=" !== t;\n return function () {\n function i(t, e, r) {\n this.type = Ut, this.lhs = t, this.rhs = e, this.collator = r, this.hasUntypedArgument = "value" === t.type.kind || "value" === e.type.kind;\n }\n\n return i.parse = function (t, e) {\n if (3 !== t.length && 4 !== t.length) return e.error("Expected two or three arguments.");\n var r = t[0],\n a = e.parse(t[1], 1, Nt);\n if (!a) return null;\n if (!dr(r, a.type)) return e.concat(1).error(\'"\' + r + "\\" comparisons are not supported for type \'" + Jt(a.type) + "\'.");\n var o = e.parse(t[2], 2, Nt);\n if (!o) return null;\n if (!dr(r, o.type)) return e.concat(2).error(\'"\' + r + "\\" comparisons are not supported for type \'" + Jt(o.type) + "\'.");\n if (a.type.kind !== o.type.kind && "value" !== a.type.kind && "value" !== o.type.kind) return e.error("Cannot compare types \'" + Jt(a.type) + "\' and \'" + Jt(o.type) + "\'.");\n n && ("value" === a.type.kind && "value" !== o.type.kind ? a = new he(o.type, [a]) : "value" !== a.type.kind && "value" === o.type.kind && (o = new he(a.type, [o])));\n var s = null;\n\n if (4 === t.length) {\n if ("string" !== a.type.kind && "string" !== o.type.kind && "value" !== a.type.kind && "value" !== o.type.kind) return e.error("Cannot use collator to compare non-string types.");\n if (!(s = e.parse(t[3], 3, Kt))) return null;\n }\n\n return new i(a, o, s);\n }, i.prototype.evaluate = function (i) {\n var a = this.lhs.evaluate(i),\n o = this.rhs.evaluate(i);\n\n if (n && this.hasUntypedArgument) {\n var s = se(a),\n u = se(o);\n if (s.kind !== u.kind || "string" !== s.kind && "number" !== s.kind) throw new pe(\'Expected arguments for "\' + t + \'" to be (string, string) or (number, number), but found (\' + s.kind + ", " + u.kind + ") instead.");\n }\n\n if (this.collator && !n && this.hasUntypedArgument) {\n var l = se(a),\n p = se(o);\n if ("string" !== l.kind || "string" !== p.kind) return e(i, a, o);\n }\n\n return this.collator ? r(i, a, o, this.collator.evaluate(i)) : e(i, a, o);\n }, i.prototype.eachChild = function (t) {\n t(this.lhs), t(this.rhs), this.collator && t(this.collator);\n }, i.prototype.outputDefined = function () {\n return !0;\n }, i.prototype.serialize = function () {\n var e = [t];\n return this.eachChild(function (t) {\n e.push(t.serialize());\n }), e;\n }, i;\n }();\n }\n\n yr.parse = function (t, e) {\n if (t.length <= 2 || t.length >= 5) return e.error("Expected 3 or 4 arguments, but found " + (t.length - 1) + " instead.");\n var r = e.parse(t[1], 1, Nt),\n n = e.parse(t[2], 2, Ot);\n if (!r || !n) return null;\n if (!$t(r.type, [Xt(Nt), Rt, Nt])) return e.error("Expected first argument to be of type array or string, but found " + Jt(r.type) + " instead");\n\n if (4 === t.length) {\n var i = e.parse(t[3], 3, Ot);\n return i ? new yr(r.type, r, n, i) : null;\n }\n\n return new yr(r.type, r, n);\n }, yr.prototype.evaluate = function (t) {\n var e = this.input.evaluate(t),\n r = this.beginIndex.evaluate(t);\n if (!Wt(e, ["string", "array"])) throw new pe("Expected first argument to be of type array or string, but found " + Jt(se(e)) + " instead.");\n\n if (this.endIndex) {\n var n = this.endIndex.evaluate(t);\n return e.slice(r, n);\n }\n\n return e.slice(r);\n }, yr.prototype.eachChild = function (t) {\n t(this.input), t(this.beginIndex), this.endIndex && t(this.endIndex);\n }, yr.prototype.outputDefined = function () {\n return !1;\n }, yr.prototype.serialize = function () {\n if (null != this.endIndex && void 0 !== this.endIndex) {\n var t = this.endIndex.serialize();\n return ["slice", this.input.serialize(), this.beginIndex.serialize(), t];\n }\n\n return ["slice", this.input.serialize(), this.beginIndex.serialize()];\n };\n\n var gr = vr("==", function (t, e, r) {\n return e === r;\n }, mr),\n xr = vr("!=", function (t, e, r) {\n return e !== r;\n }, function (t, e, r, n) {\n return !mr(0, e, r, n);\n }),\n br = vr("<", function (t, e, r) {\n return e < r;\n }, function (t, e, r, n) {\n return n.compare(e, r) < 0;\n }),\n wr = vr(">", function (t, e, r) {\n return e > r;\n }, function (t, e, r, n) {\n return n.compare(e, r) > 0;\n }),\n _r = vr("<=", function (t, e, r) {\n return e <= r;\n }, function (t, e, r, n) {\n return n.compare(e, r) <= 0;\n }),\n Ar = vr(">=", function (t, e, r) {\n return e >= r;\n }, function (t, e, r, n) {\n return n.compare(e, r) >= 0;\n }),\n Sr = function Sr(t, e, r, n, i) {\n this.type = Rt, this.number = t, this.locale = e, this.currency = r, this.minFractionDigits = n, this.maxFractionDigits = i;\n };\n\n Sr.parse = function (t, e) {\n if (3 !== t.length) return e.error("Expected two arguments.");\n var r = e.parse(t[1], 1, Ot);\n if (!r) return null;\n var n = t[2];\n if ("object" != typeof n || Array.isArray(n)) return e.error("NumberFormat options argument must be an object.");\n var i = null;\n if (n.locale && !(i = e.parse(n.locale, 1, Rt))) return null;\n var a = null;\n if (n.currency && !(a = e.parse(n.currency, 1, Rt))) return null;\n var o = null;\n if (n["min-fraction-digits"] && !(o = e.parse(n["min-fraction-digits"], 1, Ot))) return null;\n var s = null;\n return n["max-fraction-digits"] && !(s = e.parse(n["max-fraction-digits"], 1, Ot)) ? null : new Sr(r, i, a, o, s);\n }, Sr.prototype.evaluate = function (t) {\n return new Intl.NumberFormat(this.locale ? this.locale.evaluate(t) : [], {\n style: this.currency ? "currency" : "decimal",\n currency: this.currency ? this.currency.evaluate(t) : void 0,\n minimumFractionDigits: this.minFractionDigits ? this.minFractionDigits.evaluate(t) : void 0,\n maximumFractionDigits: this.maxFractionDigits ? this.maxFractionDigits.evaluate(t) : void 0\n }).format(this.number.evaluate(t));\n }, Sr.prototype.eachChild = function (t) {\n t(this.number), this.locale && t(this.locale), this.currency && t(this.currency), this.minFractionDigits && t(this.minFractionDigits), this.maxFractionDigits && t(this.maxFractionDigits);\n }, Sr.prototype.outputDefined = function () {\n return !1;\n }, Sr.prototype.serialize = function () {\n var t = {};\n return this.locale && (t.locale = this.locale.serialize()), this.currency && (t.currency = this.currency.serialize()), this.minFractionDigits && (t["min-fraction-digits"] = this.minFractionDigits.serialize()), this.maxFractionDigits && (t["max-fraction-digits"] = this.maxFractionDigits.serialize()), ["number-format", this.number.serialize(), t];\n };\n\n var kr = function kr(t) {\n this.type = Ot, this.input = t;\n };\n\n kr.parse = function (t, e) {\n if (2 !== t.length) return e.error("Expected 1 argument, but found " + (t.length - 1) + " instead.");\n var r = e.parse(t[1], 1);\n return r ? "array" !== r.type.kind && "string" !== r.type.kind && "value" !== r.type.kind ? e.error("Expected argument of type string or array, but found " + Jt(r.type) + " instead.") : new kr(r) : null;\n }, kr.prototype.evaluate = function (t) {\n var e = this.input.evaluate(t);\n if ("string" == typeof e) return e.length;\n if (Array.isArray(e)) return e.length;\n throw new pe("Expected value to be of type string or array, but found " + Jt(se(e)) + " instead.");\n }, kr.prototype.eachChild = function (t) {\n t(this.input);\n }, kr.prototype.outputDefined = function () {\n return !1;\n }, kr.prototype.serialize = function () {\n var t = ["length"];\n return this.eachChild(function (e) {\n t.push(e.serialize());\n }), t;\n };\n var Ir = {\n "==": gr,\n "!=": xr,\n ">": wr,\n "<": br,\n ">=": Ar,\n "<=": _r,\n array: he,\n at: lr,\n boolean: he,\n case: fr,\n coalesce: sr,\n collator: be,\n format: fe,\n image: ye,\n in: pr,\n "index-of": cr,\n interpolate: ar,\n "interpolate-hcl": ar,\n "interpolate-lab": ar,\n length: kr,\n let: ur,\n literal: le,\n match: hr,\n number: he,\n "number-format": Sr,\n object: he,\n slice: yr,\n step: Ne,\n string: he,\n "to-boolean": me,\n "to-color": me,\n "to-number": me,\n "to-string": me,\n var: Ue,\n within: De\n };\n\n function zr(t, e) {\n var r = e[0],\n n = e[1],\n i = e[2],\n a = e[3];\n r = r.evaluate(t), n = n.evaluate(t), i = i.evaluate(t);\n var o = a ? a.evaluate(t) : 1,\n s = ae(r, n, i, o);\n if (s) throw new pe(s);\n return new te(r / 255 * o, n / 255 * o, i / 255 * o, o);\n }\n\n function Cr(t, e) {\n return t in e;\n }\n\n function Er(t, e) {\n var r = e[t];\n return void 0 === r ? null : r;\n }\n\n function Pr(t) {\n return {\n type: t\n };\n }\n\n function Mr(t) {\n return {\n result: "success",\n value: t\n };\n }\n\n function Br(t) {\n return {\n result: "error",\n value: t\n };\n }\n\n function Tr(t) {\n return "data-driven" === t["property-type"] || "cross-faded-data-driven" === t["property-type"];\n }\n\n function Vr(t) {\n return !!t.expression && t.expression.parameters.indexOf("zoom") > -1;\n }\n\n function Fr(t) {\n return !!t.expression && t.expression.interpolated;\n }\n\n function Dr(t) {\n return t instanceof Number ? "number" : t instanceof String ? "string" : t instanceof Boolean ? "boolean" : Array.isArray(t) ? "array" : null === t ? "null" : typeof t;\n }\n\n function Lr(t) {\n return "object" == typeof t && null !== t && !Array.isArray(t);\n }\n\n function Or(t) {\n return t;\n }\n\n function Rr(t, e, r) {\n return void 0 !== t ? t : void 0 !== e ? e : void 0 !== r ? r : void 0;\n }\n\n function Ur(t, e, r, n, i) {\n return Rr(typeof r === i ? n[r] : void 0, t.default, e.default);\n }\n\n function jr(t, e, r) {\n if ("number" !== Dr(r)) return Rr(t.default, e.default);\n var n = t.stops.length;\n if (1 === n) return t.stops[0][1];\n if (r <= t.stops[0][0]) return t.stops[0][1];\n if (r >= t.stops[n - 1][0]) return t.stops[n - 1][1];\n var i = qe(t.stops.map(function (t) {\n return t[0];\n }), r);\n return t.stops[i][1];\n }\n\n function qr(t, e, r) {\n var n = void 0 !== t.base ? t.base : 1;\n if ("number" !== Dr(r)) return Rr(t.default, e.default);\n var i = t.stops.length;\n if (1 === i) return t.stops[0][1];\n if (r <= t.stops[0][0]) return t.stops[0][1];\n if (r >= t.stops[i - 1][0]) return t.stops[i - 1][1];\n\n var a = qe(t.stops.map(function (t) {\n return t[0];\n }), r),\n o = function (t, e, r, n) {\n var i = n - r,\n a = t - r;\n return 0 === i ? 0 : 1 === e ? a / i : (Math.pow(e, a) - 1) / (Math.pow(e, i) - 1);\n }(r, n, t.stops[a][0], t.stops[a + 1][0]),\n s = t.stops[a][1],\n u = t.stops[a + 1][1],\n l = Ge[e.type] || Or;\n\n if (t.colorSpace && "rgb" !== t.colorSpace) {\n var p = ir[t.colorSpace];\n\n l = function l(t, e) {\n return p.reverse(p.interpolate(p.forward(t), p.forward(e), o));\n };\n }\n\n return "function" == typeof s.evaluate ? {\n evaluate: function evaluate() {\n for (var t = [], e = arguments.length; e--;) {\n t[e] = arguments[e];\n }\n\n var r = s.evaluate.apply(void 0, t),\n n = u.evaluate.apply(void 0, t);\n if (void 0 !== r && void 0 !== n) return l(r, n, o);\n }\n } : l(s, u, o);\n }\n\n function Nr(t, e, r) {\n return "color" === e.type ? r = te.parse(r) : "formatted" === e.type ? r = ne.fromString(r.toString()) : "resolvedImage" === e.type ? r = ie.fromString(r.toString()) : Dr(r) === e.type || "enum" === e.type && e.values[r] || (r = void 0), Rr(r, t.default, e.default);\n }\n\n xe.register(Ir, {\n error: [{\n kind: "error"\n }, [Rt], function (t, e) {\n throw new pe(e[0].evaluate(t));\n }],\n typeof: [Rt, [Nt], function (t, e) {\n return Jt(se(e[0].evaluate(t)));\n }],\n "to-rgba": [Xt(Ot, 4), [jt], function (t, e) {\n return e[0].evaluate(t).toArray();\n }],\n rgb: [jt, [Ot, Ot, Ot], zr],\n rgba: [jt, [Ot, Ot, Ot, Ot], zr],\n has: {\n type: Ut,\n overloads: [[[Rt], function (t, e) {\n return Cr(e[0].evaluate(t), t.properties());\n }], [[Rt, qt], function (t, e) {\n var r = e[1];\n return Cr(e[0].evaluate(t), r.evaluate(t));\n }]]\n },\n get: {\n type: Nt,\n overloads: [[[Rt], function (t, e) {\n return Er(e[0].evaluate(t), t.properties());\n }], [[Rt, qt], function (t, e) {\n var r = e[1];\n return Er(e[0].evaluate(t), r.evaluate(t));\n }]]\n },\n "feature-state": [Nt, [Rt], function (t, e) {\n return Er(e[0].evaluate(t), t.featureState || {});\n }],\n properties: [qt, [], function (t) {\n return t.properties();\n }],\n "geometry-type": [Rt, [], function (t) {\n return t.geometryType();\n }],\n id: [Nt, [], function (t) {\n return t.id();\n }],\n zoom: [Ot, [], function (t) {\n return t.globals.zoom;\n }],\n "heatmap-density": [Ot, [], function (t) {\n return t.globals.heatmapDensity || 0;\n }],\n "line-progress": [Ot, [], function (t) {\n return t.globals.lineProgress || 0;\n }],\n accumulated: [Nt, [], function (t) {\n return void 0 === t.globals.accumulated ? null : t.globals.accumulated;\n }],\n "+": [Ot, Pr(Ot), function (t, e) {\n for (var r = 0, n = 0, i = e; n < i.length; n += 1) {\n r += i[n].evaluate(t);\n }\n\n return r;\n }],\n "*": [Ot, Pr(Ot), function (t, e) {\n for (var r = 1, n = 0, i = e; n < i.length; n += 1) {\n r *= i[n].evaluate(t);\n }\n\n return r;\n }],\n "-": {\n type: Ot,\n overloads: [[[Ot, Ot], function (t, e) {\n var r = e[1];\n return e[0].evaluate(t) - r.evaluate(t);\n }], [[Ot], function (t, e) {\n return -e[0].evaluate(t);\n }]]\n },\n "/": [Ot, [Ot, Ot], function (t, e) {\n var r = e[1];\n return e[0].evaluate(t) / r.evaluate(t);\n }],\n "%": [Ot, [Ot, Ot], function (t, e) {\n var r = e[1];\n return e[0].evaluate(t) % r.evaluate(t);\n }],\n ln2: [Ot, [], function () {\n return Math.LN2;\n }],\n pi: [Ot, [], function () {\n return Math.PI;\n }],\n e: [Ot, [], function () {\n return Math.E;\n }],\n "^": [Ot, [Ot, Ot], function (t, e) {\n var r = e[1];\n return Math.pow(e[0].evaluate(t), r.evaluate(t));\n }],\n sqrt: [Ot, [Ot], function (t, e) {\n return Math.sqrt(e[0].evaluate(t));\n }],\n log10: [Ot, [Ot], function (t, e) {\n return Math.log(e[0].evaluate(t)) / Math.LN10;\n }],\n ln: [Ot, [Ot], function (t, e) {\n return Math.log(e[0].evaluate(t));\n }],\n log2: [Ot, [Ot], function (t, e) {\n return Math.log(e[0].evaluate(t)) / Math.LN2;\n }],\n sin: [Ot, [Ot], function (t, e) {\n return Math.sin(e[0].evaluate(t));\n }],\n cos: [Ot, [Ot], function (t, e) {\n return Math.cos(e[0].evaluate(t));\n }],\n tan: [Ot, [Ot], function (t, e) {\n return Math.tan(e[0].evaluate(t));\n }],\n asin: [Ot, [Ot], function (t, e) {\n return Math.asin(e[0].evaluate(t));\n }],\n acos: [Ot, [Ot], function (t, e) {\n return Math.acos(e[0].evaluate(t));\n }],\n atan: [Ot, [Ot], function (t, e) {\n return Math.atan(e[0].evaluate(t));\n }],\n min: [Ot, Pr(Ot), function (t, e) {\n return Math.min.apply(Math, e.map(function (e) {\n return e.evaluate(t);\n }));\n }],\n max: [Ot, Pr(Ot), function (t, e) {\n return Math.max.apply(Math, e.map(function (e) {\n return e.evaluate(t);\n }));\n }],\n abs: [Ot, [Ot], function (t, e) {\n return Math.abs(e[0].evaluate(t));\n }],\n round: [Ot, [Ot], function (t, e) {\n var r = e[0].evaluate(t);\n return r < 0 ? -Math.round(-r) : Math.round(r);\n }],\n floor: [Ot, [Ot], function (t, e) {\n return Math.floor(e[0].evaluate(t));\n }],\n ceil: [Ot, [Ot], function (t, e) {\n return Math.ceil(e[0].evaluate(t));\n }],\n "filter-==": [Ut, [Rt, Nt], function (t, e) {\n var r = e[0],\n n = e[1];\n return t.properties()[r.value] === n.value;\n }],\n "filter-id-==": [Ut, [Nt], function (t, e) {\n var r = e[0];\n return t.id() === r.value;\n }],\n "filter-type-==": [Ut, [Rt], function (t, e) {\n var r = e[0];\n return t.geometryType() === r.value;\n }],\n "filter-<": [Ut, [Rt, Nt], function (t, e) {\n var r = e[0],\n n = e[1],\n i = t.properties()[r.value],\n a = n.value;\n return typeof i == typeof a && i < a;\n }],\n "filter-id-<": [Ut, [Nt], function (t, e) {\n var r = e[0],\n n = t.id(),\n i = r.value;\n return typeof n == typeof i && n < i;\n }],\n "filter->": [Ut, [Rt, Nt], function (t, e) {\n var r = e[0],\n n = e[1],\n i = t.properties()[r.value],\n a = n.value;\n return typeof i == typeof a && i > a;\n }],\n "filter-id->": [Ut, [Nt], function (t, e) {\n var r = e[0],\n n = t.id(),\n i = r.value;\n return typeof n == typeof i && n > i;\n }],\n "filter-<=": [Ut, [Rt, Nt], function (t, e) {\n var r = e[0],\n n = e[1],\n i = t.properties()[r.value],\n a = n.value;\n return typeof i == typeof a && i <= a;\n }],\n "filter-id-<=": [Ut, [Nt], function (t, e) {\n var r = e[0],\n n = t.id(),\n i = r.value;\n return typeof n == typeof i && n <= i;\n }],\n "filter->=": [Ut, [Rt, Nt], function (t, e) {\n var r = e[0],\n n = e[1],\n i = t.properties()[r.value],\n a = n.value;\n return typeof i == typeof a && i >= a;\n }],\n "filter-id->=": [Ut, [Nt], function (t, e) {\n var r = e[0],\n n = t.id(),\n i = r.value;\n return typeof n == typeof i && n >= i;\n }],\n "filter-has": [Ut, [Nt], function (t, e) {\n return e[0].value in t.properties();\n }],\n "filter-has-id": [Ut, [], function (t) {\n return null !== t.id() && void 0 !== t.id();\n }],\n "filter-type-in": [Ut, [Xt(Rt)], function (t, e) {\n return e[0].value.indexOf(t.geometryType()) >= 0;\n }],\n "filter-id-in": [Ut, [Xt(Nt)], function (t, e) {\n return e[0].value.indexOf(t.id()) >= 0;\n }],\n "filter-in-small": [Ut, [Rt, Xt(Nt)], function (t, e) {\n var r = e[0];\n return e[1].value.indexOf(t.properties()[r.value]) >= 0;\n }],\n "filter-in-large": [Ut, [Rt, Xt(Nt)], function (t, e) {\n var r = e[0],\n n = e[1];\n return function (t, e, r, n) {\n for (; r <= n;) {\n var i = r + n >> 1;\n if (e[i] === t) return !0;\n e[i] > t ? n = i - 1 : r = i + 1;\n }\n\n return !1;\n }(t.properties()[r.value], n.value, 0, n.value.length - 1);\n }],\n all: {\n type: Ut,\n overloads: [[[Ut, Ut], function (t, e) {\n var r = e[1];\n return e[0].evaluate(t) && r.evaluate(t);\n }], [Pr(Ut), function (t, e) {\n for (var r = 0, n = e; r < n.length; r += 1) {\n if (!n[r].evaluate(t)) return !1;\n }\n\n return !0;\n }]]\n },\n any: {\n type: Ut,\n overloads: [[[Ut, Ut], function (t, e) {\n var r = e[1];\n return e[0].evaluate(t) || r.evaluate(t);\n }], [Pr(Ut), function (t, e) {\n for (var r = 0, n = e; r < n.length; r += 1) {\n if (n[r].evaluate(t)) return !0;\n }\n\n return !1;\n }]]\n },\n "!": [Ut, [Ut], function (t, e) {\n return !e[0].evaluate(t);\n }],\n "is-supported-script": [Ut, [Rt], function (t, e) {\n var r = t.globals && t.globals.isSupportedScript;\n return !r || r(e[0].evaluate(t));\n }],\n upcase: [Rt, [Rt], function (t, e) {\n return e[0].evaluate(t).toUpperCase();\n }],\n downcase: [Rt, [Rt], function (t, e) {\n return e[0].evaluate(t).toLowerCase();\n }],\n concat: [Rt, Pr(Nt), function (t, e) {\n return e.map(function (e) {\n return ue(e.evaluate(t));\n }).join("");\n }],\n "resolved-locale": [Rt, [Kt], function (t, e) {\n return e[0].evaluate(t).resolvedLocale();\n }]\n });\n\n var Kr = function Kr(t, e) {\n this.expression = t, this._warningHistory = {}, this._evaluator = new ge(), this._defaultValue = e ? function (t) {\n return "color" === t.type && Lr(t.default) ? new te(0, 0, 0, 0) : "color" === t.type ? te.parse(t.default) || null : void 0 === t.default ? null : t.default;\n }(e) : null, this._enumValues = e && "enum" === e.type ? e.values : null;\n };\n\n function Gr(t) {\n return Array.isArray(t) && t.length > 0 && "string" == typeof t[0] && t[0] in Ir;\n }\n\n function Zr(t, e) {\n var r = new je(Ir, [], e ? function (t) {\n var e = {\n color: jt,\n string: Rt,\n number: Ot,\n enum: Rt,\n boolean: Ut,\n formatted: Gt,\n resolvedImage: Zt\n };\n return "array" === t.type ? Xt(e[t.value] || Nt, t.length) : e[t.type];\n }(e) : void 0),\n n = r.parse(t, void 0, void 0, void 0, e && "string" === e.type ? {\n typeAnnotation: "coerce"\n } : void 0);\n return n ? Mr(new Kr(n, e)) : Br(r.errors);\n }\n\n Kr.prototype.evaluateWithoutErrorHandling = function (t, e, r, n, i, a) {\n return this._evaluator.globals = t, this._evaluator.feature = e, this._evaluator.featureState = r, this._evaluator.canonical = n, this._evaluator.availableImages = i || null, this._evaluator.formattedSection = a, this.expression.evaluate(this._evaluator);\n }, Kr.prototype.evaluate = function (t, e, r, n, i, a) {\n this._evaluator.globals = t, this._evaluator.feature = e || null, this._evaluator.featureState = r || null, this._evaluator.canonical = n, this._evaluator.availableImages = i || null, this._evaluator.formattedSection = a || null;\n\n try {\n var o = this.expression.evaluate(this._evaluator);\n if (null == o || "number" == typeof o && o != o) return this._defaultValue;\n if (this._enumValues && !(o in this._enumValues)) throw new pe("Expected value to be one of " + Object.keys(this._enumValues).map(function (t) {\n return JSON.stringify(t);\n }).join(", ") + ", but found " + JSON.stringify(o) + " instead.");\n return o;\n } catch (t) {\n return this._warningHistory[t.message] || (this._warningHistory[t.message] = !0, "undefined" != typeof console && console.warn(t.message)), this._defaultValue;\n }\n };\n\n var Xr = function Xr(t, e) {\n this.kind = t, this._styleExpression = e, this.isStateDependent = "constant" !== t && !Oe(e.expression);\n };\n\n Xr.prototype.evaluateWithoutErrorHandling = function (t, e, r, n, i, a) {\n return this._styleExpression.evaluateWithoutErrorHandling(t, e, r, n, i, a);\n }, Xr.prototype.evaluate = function (t, e, r, n, i, a) {\n return this._styleExpression.evaluate(t, e, r, n, i, a);\n };\n\n var Jr = function Jr(t, e, r, n) {\n this.kind = t, this.zoomStops = r, this._styleExpression = e, this.isStateDependent = "camera" !== t && !Oe(e.expression), this.interpolationType = n;\n };\n\n function Hr(t, e) {\n if ("error" === (t = Zr(t, e)).result) return t;\n var r = t.value.expression,\n n = Le(r);\n if (!n && !Tr(e)) return Br([new Ft("", "data expressions not supported")]);\n var i = Re(r, ["zoom"]);\n if (!i && !Vr(e)) return Br([new Ft("", "zoom expressions not supported")]);\n\n var a = function t(e) {\n var r = null;\n if (e instanceof ur) r = t(e.result);else if (e instanceof sr) for (var n = 0, i = e.args; n < i.length && !(r = t(i[n])); n += 1) {\n ;\n } else (e instanceof Ne || e instanceof ar) && e.input instanceof xe && "zoom" === e.input.name && (r = e);\n return r instanceof Ft || e.eachChild(function (e) {\n var n = t(e);\n n instanceof Ft ? r = n : !r && n ? r = new Ft("", \'"zoom" expression may only be used as input to a top-level "step" or "interpolate" expression.\') : r && n && r !== n && (r = new Ft("", \'Only one zoom-based "step" or "interpolate" subexpression may be used in an expression.\'));\n }), r;\n }(r);\n\n return a || i ? a instanceof Ft ? Br([a]) : a instanceof ar && !Fr(e) ? Br([new Ft("", \'"interpolate" expressions cannot be used with this property\')]) : Mr(a ? new Jr(n ? "camera" : "composite", t.value, a.labels, a instanceof ar ? a.interpolation : void 0) : new Xr(n ? "constant" : "source", t.value)) : Br([new Ft("", \'"zoom" expression may only be used as input to a top-level "step" or "interpolate" expression.\')]);\n }\n\n Jr.prototype.evaluateWithoutErrorHandling = function (t, e, r, n, i, a) {\n return this._styleExpression.evaluateWithoutErrorHandling(t, e, r, n, i, a);\n }, Jr.prototype.evaluate = function (t, e, r, n, i, a) {\n return this._styleExpression.evaluate(t, e, r, n, i, a);\n }, Jr.prototype.interpolationFactor = function (t, e, r) {\n return this.interpolationType ? ar.interpolationFactor(this.interpolationType, t, e, r) : 0;\n };\n\n var Yr = function Yr(t, e) {\n this._parameters = t, this._specification = e, Bt(this, function t(e, r) {\n var n,\n i,\n a,\n o = "color" === r.type,\n s = e.stops && "object" == typeof e.stops[0][0],\n u = s || !(s || void 0 !== e.property),\n l = e.type || (Fr(r) ? "exponential" : "interval");\n if (o && ((e = Bt({}, e)).stops && (e.stops = e.stops.map(function (t) {\n return [t[0], te.parse(t[1])];\n })), e.default = te.parse(e.default ? e.default : r.default)), e.colorSpace && "rgb" !== e.colorSpace && !ir[e.colorSpace]) throw new Error("Unknown color space: " + e.colorSpace);\n if ("exponential" === l) n = qr;else if ("interval" === l) n = jr;else if ("categorical" === l) {\n n = Ur, i = Object.create(null);\n\n for (var p = 0, c = e.stops; p < c.length; p += 1) {\n var h = c[p];\n i[h[0]] = h[1];\n }\n\n a = typeof e.stops[0][0];\n } else {\n if ("identity" !== l) throw new Error(\'Unknown function type "\' + l + \'"\');\n n = Nr;\n }\n\n if (s) {\n for (var f = {}, y = [], d = 0; d < e.stops.length; d++) {\n var m = e.stops[d],\n v = m[0].zoom;\n void 0 === f[v] && (f[v] = {\n zoom: v,\n type: e.type,\n property: e.property,\n default: e.default,\n stops: []\n }, y.push(v)), f[v].stops.push([m[0].value, m[1]]);\n }\n\n for (var g = [], x = 0, b = y; x < b.length; x += 1) {\n var w = b[x];\n g.push([f[w].zoom, t(f[w], r)]);\n }\n\n var _ = {\n name: "linear"\n };\n return {\n kind: "composite",\n interpolationType: _,\n interpolationFactor: ar.interpolationFactor.bind(void 0, _),\n zoomStops: g.map(function (t) {\n return t[0];\n }),\n evaluate: function evaluate(t, n) {\n var i = t.zoom;\n return qr({\n stops: g,\n base: e.base\n }, r, i).evaluate(i, n);\n }\n };\n }\n\n if (u) {\n var A = "exponential" === l ? {\n name: "exponential",\n base: void 0 !== e.base ? e.base : 1\n } : null;\n return {\n kind: "camera",\n interpolationType: A,\n interpolationFactor: ar.interpolationFactor.bind(void 0, A),\n zoomStops: e.stops.map(function (t) {\n return t[0];\n }),\n evaluate: function evaluate(t) {\n return n(e, r, t.zoom, i, a);\n }\n };\n }\n\n return {\n kind: "source",\n evaluate: function evaluate(t, o) {\n var s = o && o.properties ? o.properties[e.property] : void 0;\n return void 0 === s ? Rr(e.default, r.default) : n(e, r, s, i, a);\n }\n };\n }(this._parameters, this._specification));\n };\n\n function $r(t) {\n var e = t.key,\n r = t.value,\n n = t.valueSpec || {},\n i = t.objectElementValidators || {},\n a = t.style,\n o = t.styleSpec,\n s = [],\n u = Dr(r);\n if ("object" !== u) return [new Pt(e, r, "object expected, " + u + " found")];\n\n for (var l in r) {\n var p = l.split(".")[0],\n c = n[p] || n["*"],\n h = void 0;\n if (i[p]) h = i[p];else if (n[p]) h = An;else if (i["*"]) h = i["*"];else {\n if (!n["*"]) {\n s.push(new Pt(e, r[l], \'unknown property "\' + l + \'"\'));\n continue;\n }\n\n h = An;\n }\n s = s.concat(h({\n key: (e ? e + "." : e) + l,\n value: r[l],\n valueSpec: c,\n style: a,\n styleSpec: o,\n object: r,\n objectKey: l\n }, r));\n }\n\n for (var f in n) {\n i[f] || n[f].required && void 0 === n[f].default && void 0 === r[f] && s.push(new Pt(e, r, \'missing required property "\' + f + \'"\'));\n }\n\n return s;\n }\n\n function Wr(t) {\n var e = t.value,\n r = t.valueSpec,\n n = t.style,\n i = t.styleSpec,\n a = t.key,\n o = t.arrayElementValidator || An;\n if ("array" !== Dr(e)) return [new Pt(a, e, "array expected, " + Dr(e) + " found")];\n if (r.length && e.length !== r.length) return [new Pt(a, e, "array length " + r.length + " expected, length " + e.length + " found")];\n if (r["min-length"] && e.length < r["min-length"]) return [new Pt(a, e, "array length at least " + r["min-length"] + " expected, length " + e.length + " found")];\n var s = {\n type: r.value,\n values: r.values\n };\n i.$version < 7 && (s.function = r.function), "object" === Dr(r.value) && (s = r.value);\n\n for (var u = [], l = 0; l < e.length; l++) {\n u = u.concat(o({\n array: e,\n arrayIndex: l,\n value: e[l],\n valueSpec: s,\n style: n,\n styleSpec: i,\n key: a + "[" + l + "]"\n }));\n }\n\n return u;\n }\n\n function Qr(t) {\n var e = t.key,\n r = t.value,\n n = t.valueSpec,\n i = Dr(r);\n return "number" === i && r != r && (i = "NaN"), "number" !== i ? [new Pt(e, r, "number expected, " + i + " found")] : "minimum" in n && r < n.minimum ? [new Pt(e, r, r + " is less than the minimum value " + n.minimum)] : "maximum" in n && r > n.maximum ? [new Pt(e, r, r + " is greater than the maximum value " + n.maximum)] : [];\n }\n\n function tn(t) {\n var e,\n r,\n n,\n i = t.valueSpec,\n a = Tt(t.value.type),\n o = {},\n s = "categorical" !== a && void 0 === t.value.property,\n u = !s,\n l = "array" === Dr(t.value.stops) && "array" === Dr(t.value.stops[0]) && "object" === Dr(t.value.stops[0][0]),\n p = $r({\n key: t.key,\n value: t.value,\n valueSpec: t.styleSpec.function,\n style: t.style,\n styleSpec: t.styleSpec,\n objectElementValidators: {\n stops: function stops(t) {\n if ("identity" === a) return [new Pt(t.key, t.value, \'identity function may not have a "stops" property\')];\n var e = [],\n r = t.value;\n return e = e.concat(Wr({\n key: t.key,\n value: r,\n valueSpec: t.valueSpec,\n style: t.style,\n styleSpec: t.styleSpec,\n arrayElementValidator: c\n })), "array" === Dr(r) && 0 === r.length && e.push(new Pt(t.key, r, "array must have at least one stop")), e;\n },\n default: function _default(t) {\n return An({\n key: t.key,\n value: t.value,\n valueSpec: i,\n style: t.style,\n styleSpec: t.styleSpec\n });\n }\n }\n });\n return "identity" === a && s && p.push(new Pt(t.key, t.value, \'missing required property "property"\')), "identity" === a || t.value.stops || p.push(new Pt(t.key, t.value, \'missing required property "stops"\')), "exponential" === a && t.valueSpec.expression && !Fr(t.valueSpec) && p.push(new Pt(t.key, t.value, "exponential functions not supported")), t.styleSpec.$version >= 8 && (u && !Tr(t.valueSpec) ? p.push(new Pt(t.key, t.value, "property functions not supported")) : s && !Vr(t.valueSpec) && p.push(new Pt(t.key, t.value, "zoom functions not supported"))), "categorical" !== a && !l || void 0 !== t.value.property || p.push(new Pt(t.key, t.value, \'"property" property is required\')), p;\n\n function c(t) {\n var e = [],\n a = t.value,\n s = t.key;\n if ("array" !== Dr(a)) return [new Pt(s, a, "array expected, " + Dr(a) + " found")];\n if (2 !== a.length) return [new Pt(s, a, "array length 2 expected, length " + a.length + " found")];\n\n if (l) {\n if ("object" !== Dr(a[0])) return [new Pt(s, a, "object expected, " + Dr(a[0]) + " found")];\n if (void 0 === a[0].zoom) return [new Pt(s, a, "object stop key must have zoom")];\n if (void 0 === a[0].value) return [new Pt(s, a, "object stop key must have value")];\n if (n && n > Tt(a[0].zoom)) return [new Pt(s, a[0].zoom, "stop zoom values must appear in ascending order")];\n Tt(a[0].zoom) !== n && (n = Tt(a[0].zoom), r = void 0, o = {}), e = e.concat($r({\n key: s + "[0]",\n value: a[0],\n valueSpec: {\n zoom: {}\n },\n style: t.style,\n styleSpec: t.styleSpec,\n objectElementValidators: {\n zoom: Qr,\n value: h\n }\n }));\n } else e = e.concat(h({\n key: s + "[0]",\n value: a[0],\n valueSpec: {},\n style: t.style,\n styleSpec: t.styleSpec\n }, a));\n\n return Gr(Vt(a[1])) ? e.concat([new Pt(s + "[1]", a[1], "expressions are not allowed in function stops.")]) : e.concat(An({\n key: s + "[1]",\n value: a[1],\n valueSpec: i,\n style: t.style,\n styleSpec: t.styleSpec\n }));\n }\n\n function h(t, n) {\n var s = Dr(t.value),\n u = Tt(t.value),\n l = null !== t.value ? t.value : n;\n\n if (e) {\n if (s !== e) return [new Pt(t.key, l, s + " stop domain type must match previous stop domain type " + e)];\n } else e = s;\n\n if ("number" !== s && "string" !== s && "boolean" !== s) return [new Pt(t.key, l, "stop domain value must be a number, string, or boolean")];\n\n if ("number" !== s && "categorical" !== a) {\n var p = "number expected, " + s + " found";\n return Tr(i) && void 0 === a && (p += \'\\nIf you intended to use a categorical function, specify `"type": "categorical"`.\'), [new Pt(t.key, l, p)];\n }\n\n return "categorical" !== a || "number" !== s || isFinite(u) && Math.floor(u) === u ? "categorical" !== a && "number" === s && void 0 !== r && u < r ? [new Pt(t.key, l, "stop domain values must appear in ascending order")] : (r = u, "categorical" === a && u in o ? [new Pt(t.key, l, "stop domain values must be unique")] : (o[u] = !0, [])) : [new Pt(t.key, l, "integer expected, found " + u)];\n }\n }\n\n function en(t) {\n var e = ("property" === t.expressionContext ? Hr : Zr)(Vt(t.value), t.valueSpec);\n if ("error" === e.result) return e.value.map(function (e) {\n return new Pt("" + t.key + e.key, t.value, e.message);\n });\n var r = e.value.expression || e.value._styleExpression.expression;\n if ("property" === t.expressionContext && "text-font" === t.propertyKey && !r.outputDefined()) return [new Pt(t.key, t.value, \'Invalid data expression for "\' + t.propertyKey + \'". Output values must be contained as literals within the expression.\')];\n if ("property" === t.expressionContext && "layout" === t.propertyType && !Oe(r)) return [new Pt(t.key, t.value, \'"feature-state" data expressions are not supported with layout properties.\')];\n if ("filter" === t.expressionContext && !Oe(r)) return [new Pt(t.key, t.value, \'"feature-state" data expressions are not supported with filters.\')];\n\n if (t.expressionContext && 0 === t.expressionContext.indexOf("cluster")) {\n if (!Re(r, ["zoom", "feature-state"])) return [new Pt(t.key, t.value, \'"zoom" and "feature-state" expressions are not supported with cluster properties.\')];\n if ("cluster-initial" === t.expressionContext && !Le(r)) return [new Pt(t.key, t.value, "Feature data expressions are not supported with initial expression part of cluster properties.")];\n }\n\n return [];\n }\n\n function rn(t) {\n var e = t.key,\n r = t.value,\n n = t.valueSpec,\n i = [];\n return Array.isArray(n.values) ? -1 === n.values.indexOf(Tt(r)) && i.push(new Pt(e, r, "expected one of [" + n.values.join(", ") + "], " + JSON.stringify(r) + " found")) : -1 === Object.keys(n.values).indexOf(Tt(r)) && i.push(new Pt(e, r, "expected one of [" + Object.keys(n.values).join(", ") + "], " + JSON.stringify(r) + " found")), i;\n }\n\n function nn(t) {\n if (!0 === t || !1 === t) return !0;\n if (!Array.isArray(t) || 0 === t.length) return !1;\n\n switch (t[0]) {\n case "has":\n return t.length >= 2 && "$id" !== t[1] && "$type" !== t[1];\n\n case "in":\n return t.length >= 3 && ("string" != typeof t[1] || Array.isArray(t[2]));\n\n case "!in":\n case "!has":\n case "none":\n return !1;\n\n case "==":\n case "!=":\n case ">":\n case ">=":\n case "<":\n case "<=":\n return 3 !== t.length || Array.isArray(t[1]) || Array.isArray(t[2]);\n\n case "any":\n case "all":\n for (var e = 0, r = t.slice(1); e < r.length; e += 1) {\n var n = r[e];\n if (!nn(n) && "boolean" != typeof n) return !1;\n }\n\n return !0;\n\n default:\n return !0;\n }\n }\n\n Yr.deserialize = function (t) {\n return new Yr(t._parameters, t._specification);\n }, Yr.serialize = function (t) {\n return {\n _parameters: t._parameters,\n _specification: t._specification\n };\n };\n var an = {\n type: "boolean",\n default: !1,\n transition: !1,\n "property-type": "data-driven",\n expression: {\n interpolated: !1,\n parameters: ["zoom", "feature"]\n }\n };\n\n function on(t) {\n if (null == t) return {\n filter: function filter() {\n return !0;\n },\n needGeometry: !1\n };\n nn(t) || (t = un(t));\n var e = Zr(t, an);\n if ("error" === e.result) throw new Error(e.value.map(function (t) {\n return t.key + ": " + t.message;\n }).join(", "));\n return {\n filter: function filter(t, r, n) {\n return e.value.evaluate(t, r, {}, n);\n },\n needGeometry: function t(e) {\n if (!Array.isArray(e)) return !1;\n if ("within" === e[0]) return !0;\n\n for (var r = 1; r < e.length; r++) {\n if (t(e[r])) return !0;\n }\n\n return !1;\n }(t)\n };\n }\n\n function sn(t, e) {\n return t < e ? -1 : t > e ? 1 : 0;\n }\n\n function un(t) {\n if (!t) return !0;\n var e,\n r = t[0];\n return t.length <= 1 ? "any" !== r : "==" === r ? ln(t[1], t[2], "==") : "!=" === r ? hn(ln(t[1], t[2], "==")) : "<" === r || ">" === r || "<=" === r || ">=" === r ? ln(t[1], t[2], r) : "any" === r ? (e = t.slice(1), ["any"].concat(e.map(un))) : "all" === r ? ["all"].concat(t.slice(1).map(un)) : "none" === r ? ["all"].concat(t.slice(1).map(un).map(hn)) : "in" === r ? pn(t[1], t.slice(2)) : "!in" === r ? hn(pn(t[1], t.slice(2))) : "has" === r ? cn(t[1]) : "!has" === r ? hn(cn(t[1])) : "within" !== r || t;\n }\n\n function ln(t, e, r) {\n switch (t) {\n case "$type":\n return ["filter-type-" + r, e];\n\n case "$id":\n return ["filter-id-" + r, e];\n\n default:\n return ["filter-" + r, t, e];\n }\n }\n\n function pn(t, e) {\n if (0 === e.length) return !1;\n\n switch (t) {\n case "$type":\n return ["filter-type-in", ["literal", e]];\n\n case "$id":\n return ["filter-id-in", ["literal", e]];\n\n default:\n return e.length > 200 && !e.some(function (t) {\n return typeof t != typeof e[0];\n }) ? ["filter-in-large", t, ["literal", e.sort(sn)]] : ["filter-in-small", t, ["literal", e]];\n }\n }\n\n function cn(t) {\n switch (t) {\n case "$type":\n return !0;\n\n case "$id":\n return ["filter-has-id"];\n\n default:\n return ["filter-has", t];\n }\n }\n\n function hn(t) {\n return ["!", t];\n }\n\n function fn(t) {\n return nn(Vt(t.value)) ? en(Bt({}, t, {\n expressionContext: "filter",\n valueSpec: {\n value: "boolean"\n }\n })) : function t(e) {\n var r = e.value,\n n = e.key;\n if ("array" !== Dr(r)) return [new Pt(n, r, "array expected, " + Dr(r) + " found")];\n var i,\n a = e.styleSpec,\n o = [];\n if (r.length < 1) return [new Pt(n, r, "filter array must have at least 1 element")];\n\n switch (o = o.concat(rn({\n key: n + "[0]",\n value: r[0],\n valueSpec: a.filter_operator,\n style: e.style,\n styleSpec: e.styleSpec\n })), Tt(r[0])) {\n case "<":\n case "<=":\n case ">":\n case ">=":\n r.length >= 2 && "$type" === Tt(r[1]) && o.push(new Pt(n, r, \'"$type" cannot be use with operator "\' + r[0] + \'"\'));\n\n case "==":\n case "!=":\n 3 !== r.length && o.push(new Pt(n, r, \'filter array for operator "\' + r[0] + \'" must have 3 elements\'));\n\n case "in":\n case "!in":\n r.length >= 2 && "string" !== (i = Dr(r[1])) && o.push(new Pt(n + "[1]", r[1], "string expected, " + i + " found"));\n\n for (var s = 2; s < r.length; s++) {\n i = Dr(r[s]), "$type" === Tt(r[1]) ? o = o.concat(rn({\n key: n + "[" + s + "]",\n value: r[s],\n valueSpec: a.geometry_type,\n style: e.style,\n styleSpec: e.styleSpec\n })) : "string" !== i && "number" !== i && "boolean" !== i && o.push(new Pt(n + "[" + s + "]", r[s], "string, number, or boolean expected, " + i + " found"));\n }\n\n break;\n\n case "any":\n case "all":\n case "none":\n for (var u = 1; u < r.length; u++) {\n o = o.concat(t({\n key: n + "[" + u + "]",\n value: r[u],\n style: e.style,\n styleSpec: e.styleSpec\n }));\n }\n\n break;\n\n case "has":\n case "!has":\n i = Dr(r[1]), 2 !== r.length ? o.push(new Pt(n, r, \'filter array for "\' + r[0] + \'" operator must have 2 elements\')) : "string" !== i && o.push(new Pt(n + "[1]", r[1], "string expected, " + i + " found"));\n break;\n\n case "within":\n i = Dr(r[1]), 2 !== r.length ? o.push(new Pt(n, r, \'filter array for "\' + r[0] + \'" operator must have 2 elements\')) : "object" !== i && o.push(new Pt(n + "[1]", r[1], "object expected, " + i + " found"));\n }\n\n return o;\n }(t);\n }\n\n function yn(t, e) {\n var r = t.key,\n n = t.style,\n i = t.styleSpec,\n a = t.value,\n o = t.objectKey,\n s = i[e + "_" + t.layerType];\n if (!s) return [];\n var u = o.match(/^(.*)-transition$/);\n if ("paint" === e && u && s[u[1]] && s[u[1]].transition) return An({\n key: r,\n value: a,\n valueSpec: i.transition,\n style: n,\n styleSpec: i\n });\n var l,\n p = t.valueSpec || s[o];\n if (!p) return [new Pt(r, a, \'unknown property "\' + o + \'"\')];\n if ("string" === Dr(a) && Tr(p) && !p.tokens && (l = /^{([^}]+)}$/.exec(a))) return [new Pt(r, a, \'"\' + o + \'" does not support interpolation syntax\\nUse an identity property function instead: `{ "type": "identity", "property": \' + JSON.stringify(l[1]) + " }`.")];\n var c = [];\n return "symbol" === t.layerType && ("text-field" === o && n && !n.glyphs && c.push(new Pt(r, a, \'use of "text-field" requires a style "glyphs" property\')), "text-font" === o && Lr(Vt(a)) && "identity" === Tt(a.type) && c.push(new Pt(r, a, \'"text-font" does not support identity functions\'))), c.concat(An({\n key: t.key,\n value: a,\n valueSpec: p,\n style: n,\n styleSpec: i,\n expressionContext: "property",\n propertyType: e,\n propertyKey: o\n }));\n }\n\n function dn(t) {\n return yn(t, "paint");\n }\n\n function mn(t) {\n return yn(t, "layout");\n }\n\n function vn(t) {\n var e = [],\n r = t.value,\n n = t.key,\n i = t.style,\n a = t.styleSpec;\n r.type || r.ref || e.push(new Pt(n, r, \'either "type" or "ref" is required\'));\n var o,\n s = Tt(r.type),\n u = Tt(r.ref);\n if (r.id) for (var l = Tt(r.id), p = 0; p < t.arrayIndex; p++) {\n var c = i.layers[p];\n Tt(c.id) === l && e.push(new Pt(n, r.id, \'duplicate layer id "\' + r.id + \'", previously used at line \' + c.id.__line__));\n }\n if ("ref" in r) ["type", "source", "source-layer", "filter", "layout"].forEach(function (t) {\n t in r && e.push(new Pt(n, r[t], \'"\' + t + \'" is prohibited for ref layers\'));\n }), i.layers.forEach(function (t) {\n Tt(t.id) === u && (o = t);\n }), o ? o.ref ? e.push(new Pt(n, r.ref, "ref cannot reference another ref layer")) : s = Tt(o.type) : e.push(new Pt(n, r.ref, \'ref layer "\' + u + \'" not found\'));else if ("background" !== s) if (r.source) {\n var h = i.sources && i.sources[r.source],\n f = h && Tt(h.type);\n h ? "vector" === f && "raster" === s ? e.push(new Pt(n, r.source, \'layer "\' + r.id + \'" requires a raster source\')) : "raster" === f && "raster" !== s ? e.push(new Pt(n, r.source, \'layer "\' + r.id + \'" requires a vector source\')) : "vector" !== f || r["source-layer"] ? "raster-dem" === f && "hillshade" !== s ? e.push(new Pt(n, r.source, "raster-dem source can only be used with layer type \'hillshade\'.")) : "line" !== s || !r.paint || !r.paint["line-gradient"] || "geojson" === f && h.lineMetrics || e.push(new Pt(n, r, \'layer "\' + r.id + \'" specifies a line-gradient, which requires a GeoJSON source with `lineMetrics` enabled.\')) : e.push(new Pt(n, r, \'layer "\' + r.id + \'" must specify a "source-layer"\')) : e.push(new Pt(n, r.source, \'source "\' + r.source + \'" not found\'));\n } else e.push(new Pt(n, r, \'missing required property "source"\'));\n return e = e.concat($r({\n key: n,\n value: r,\n valueSpec: a.layer,\n style: t.style,\n styleSpec: t.styleSpec,\n objectElementValidators: {\n "*": function _() {\n return [];\n },\n type: function type() {\n return An({\n key: n + ".type",\n value: r.type,\n valueSpec: a.layer.type,\n style: t.style,\n styleSpec: t.styleSpec,\n object: r,\n objectKey: "type"\n });\n },\n filter: fn,\n layout: function layout(t) {\n return $r({\n layer: r,\n key: t.key,\n value: t.value,\n style: t.style,\n styleSpec: t.styleSpec,\n objectElementValidators: {\n "*": function _(t) {\n return mn(Bt({\n layerType: s\n }, t));\n }\n }\n });\n },\n paint: function paint(t) {\n return $r({\n layer: r,\n key: t.key,\n value: t.value,\n style: t.style,\n styleSpec: t.styleSpec,\n objectElementValidators: {\n "*": function _(t) {\n return dn(Bt({\n layerType: s\n }, t));\n }\n }\n });\n }\n }\n }));\n }\n\n function gn(t) {\n var e = t.value,\n r = t.key,\n n = Dr(e);\n return "string" !== n ? [new Pt(r, e, "string expected, " + n + " found")] : [];\n }\n\n var xn = {\n promoteId: function promoteId(t) {\n var e = t.key,\n r = t.value;\n if ("string" === Dr(r)) return gn({\n key: e,\n value: r\n });\n var n = [];\n\n for (var i in r) {\n n.push.apply(n, gn({\n key: e + "." + i,\n value: r[i]\n }));\n }\n\n return n;\n }\n };\n\n function bn(t) {\n var e = t.value,\n r = t.key,\n n = t.styleSpec,\n i = t.style;\n if (!e.type) return [new Pt(r, e, \'"type" is required\')];\n var a,\n o = Tt(e.type);\n\n switch (o) {\n case "vector":\n case "raster":\n case "raster-dem":\n return $r({\n key: r,\n value: e,\n valueSpec: n["source_" + o.replace("-", "_")],\n style: t.style,\n styleSpec: n,\n objectElementValidators: xn\n });\n\n case "geojson":\n if (a = $r({\n key: r,\n value: e,\n valueSpec: n.source_geojson,\n style: i,\n styleSpec: n,\n objectElementValidators: xn\n }), e.cluster) for (var s in e.clusterProperties) {\n var u = e.clusterProperties[s],\n l = u[0],\n p = "string" == typeof l ? [l, ["accumulated"], ["get", s]] : l;\n a.push.apply(a, en({\n key: r + "." + s + ".map",\n value: u[1],\n expressionContext: "cluster-map"\n })), a.push.apply(a, en({\n key: r + "." + s + ".reduce",\n value: p,\n expressionContext: "cluster-reduce"\n }));\n }\n return a;\n\n case "video":\n return $r({\n key: r,\n value: e,\n valueSpec: n.source_video,\n style: i,\n styleSpec: n\n });\n\n case "image":\n return $r({\n key: r,\n value: e,\n valueSpec: n.source_image,\n style: i,\n styleSpec: n\n });\n\n case "canvas":\n return [new Pt(r, null, "Please use runtime APIs to add canvas sources, rather than including them in stylesheets.", "source.canvas")];\n\n default:\n return rn({\n key: r + ".type",\n value: e.type,\n valueSpec: {\n values: ["vector", "raster", "raster-dem", "geojson", "video", "image"]\n },\n style: i,\n styleSpec: n\n });\n }\n }\n\n function wn(t) {\n var e = t.value,\n r = t.styleSpec,\n n = r.light,\n i = t.style,\n a = [],\n o = Dr(e);\n if (void 0 === e) return a;\n if ("object" !== o) return a.concat([new Pt("light", e, "object expected, " + o + " found")]);\n\n for (var s in e) {\n var u = s.match(/^(.*)-transition$/);\n a = a.concat(u && n[u[1]] && n[u[1]].transition ? An({\n key: s,\n value: e[s],\n valueSpec: r.transition,\n style: i,\n styleSpec: r\n }) : n[s] ? An({\n key: s,\n value: e[s],\n valueSpec: n[s],\n style: i,\n styleSpec: r\n }) : [new Pt(s, e[s], \'unknown property "\' + s + \'"\')]);\n }\n\n return a;\n }\n\n var _n = {\n "*": function _() {\n return [];\n },\n array: Wr,\n boolean: function boolean(t) {\n var e = t.value,\n r = t.key,\n n = Dr(e);\n return "boolean" !== n ? [new Pt(r, e, "boolean expected, " + n + " found")] : [];\n },\n number: Qr,\n color: function color(t) {\n var e = t.key,\n r = t.value,\n n = Dr(r);\n return "string" !== n ? [new Pt(e, r, "color expected, " + n + " found")] : null === Qt(r) ? [new Pt(e, r, \'color expected, "\' + r + \'" found\')] : [];\n },\n constants: Mt,\n enum: rn,\n filter: fn,\n function: tn,\n layer: vn,\n object: $r,\n source: bn,\n light: wn,\n string: gn,\n formatted: function formatted(t) {\n return 0 === gn(t).length ? [] : en(t);\n },\n resolvedImage: function resolvedImage(t) {\n return 0 === gn(t).length ? [] : en(t);\n }\n };\n\n function An(t) {\n var e = t.value,\n r = t.valueSpec,\n n = t.styleSpec;\n return r.expression && Lr(Tt(e)) ? tn(t) : r.expression && Gr(Vt(e)) ? en(t) : r.type && _n[r.type] ? _n[r.type](t) : $r(Bt({}, t, {\n valueSpec: r.type ? n[r.type] : r\n }));\n }\n\n function Sn(t) {\n var e = t.value,\n r = t.key,\n n = gn(t);\n return n.length || (-1 === e.indexOf("{fontstack}") && n.push(new Pt(r, e, \'"glyphs" url must include a "{fontstack}" token\')), -1 === e.indexOf("{range}") && n.push(new Pt(r, e, \'"glyphs" url must include a "{range}" token\'))), n;\n }\n\n function kn(t, e) {\n void 0 === e && (e = Et);\n var r = [];\n return r = r.concat(An({\n key: "",\n value: t,\n valueSpec: e.$root,\n styleSpec: e,\n style: t,\n objectElementValidators: {\n glyphs: Sn,\n "*": function _() {\n return [];\n }\n }\n })), t.constants && (r = r.concat(Mt({\n key: "constants",\n value: t.constants,\n style: t,\n styleSpec: e\n }))), In(r);\n }\n\n function In(t) {\n return [].concat(t).sort(function (t, e) {\n return t.line - e.line;\n });\n }\n\n function zn(t) {\n return function () {\n for (var e = [], r = arguments.length; r--;) {\n e[r] = arguments[r];\n }\n\n return In(t.apply(this, e));\n };\n }\n\n kn.source = zn(bn), kn.light = zn(wn), kn.layer = zn(vn), kn.filter = zn(fn), kn.paintProperty = zn(dn), kn.layoutProperty = zn(mn);\n var Cn = kn,\n En = Cn.light,\n Pn = Cn.paintProperty,\n Mn = Cn.layoutProperty;\n\n function Bn(t, e) {\n var r = !1;\n if (e && e.length) for (var n = 0, i = e; n < i.length; n += 1) {\n t.fire(new zt(new Error(i[n].message))), r = !0;\n }\n return r;\n }\n\n var Tn = Vn;\n\n function Vn(t, e, r) {\n var n = this.cells = [];\n\n if (t instanceof ArrayBuffer) {\n this.arrayBuffer = t;\n var i = new Int32Array(this.arrayBuffer);\n t = i[0], this.d = (e = i[1]) + 2 * (r = i[2]);\n\n for (var a = 0; a < this.d * this.d; a++) {\n var o = i[3 + a],\n s = i[3 + a + 1];\n n.push(o === s ? null : i.subarray(o, s));\n }\n\n var u = i[3 + n.length + 1];\n this.keys = i.subarray(i[3 + n.length], u), this.bboxes = i.subarray(u), this.insert = this._insertReadonly;\n } else {\n this.d = e + 2 * r;\n\n for (var l = 0; l < this.d * this.d; l++) {\n n.push([]);\n }\n\n this.keys = [], this.bboxes = [];\n }\n\n this.n = e, this.extent = t, this.padding = r, this.scale = e / t, this.uid = 0;\n var p = r / e * t;\n this.min = -p, this.max = t + p;\n }\n\n Vn.prototype.insert = function (t, e, r, n, i) {\n this._forEachCell(e, r, n, i, this._insertCell, this.uid++), this.keys.push(t), this.bboxes.push(e), this.bboxes.push(r), this.bboxes.push(n), this.bboxes.push(i);\n }, Vn.prototype._insertReadonly = function () {\n throw "Cannot insert into a GridIndex created from an ArrayBuffer.";\n }, Vn.prototype._insertCell = function (t, e, r, n, i, a) {\n this.cells[i].push(a);\n }, Vn.prototype.query = function (t, e, r, n, i) {\n var a = this.min,\n o = this.max;\n if (t <= a && e <= a && o <= r && o <= n && !i) return Array.prototype.slice.call(this.keys);\n var s = [];\n return this._forEachCell(t, e, r, n, this._queryCell, s, {}, i), s;\n }, Vn.prototype._queryCell = function (t, e, r, n, i, a, o, s) {\n var u = this.cells[i];\n if (null !== u) for (var l = this.keys, p = this.bboxes, c = 0; c < u.length; c++) {\n var h = u[c];\n\n if (void 0 === o[h]) {\n var f = 4 * h;\n (s ? s(p[f + 0], p[f + 1], p[f + 2], p[f + 3]) : t <= p[f + 2] && e <= p[f + 3] && r >= p[f + 0] && n >= p[f + 1]) ? (o[h] = !0, a.push(l[h])) : o[h] = !1;\n }\n }\n }, Vn.prototype._forEachCell = function (t, e, r, n, i, a, o, s) {\n for (var u = this._convertToCellCoord(t), l = this._convertToCellCoord(e), p = this._convertToCellCoord(r), c = this._convertToCellCoord(n), h = u; h <= p; h++) {\n for (var f = l; f <= c; f++) {\n var y = this.d * f + h;\n if ((!s || s(this._convertFromCellCoord(h), this._convertFromCellCoord(f), this._convertFromCellCoord(h + 1), this._convertFromCellCoord(f + 1))) && i.call(this, t, e, r, n, y, a, o, s)) return;\n }\n }\n }, Vn.prototype._convertFromCellCoord = function (t) {\n return (t - this.padding) / this.scale;\n }, Vn.prototype._convertToCellCoord = function (t) {\n return Math.max(0, Math.min(this.d - 1, Math.floor(t * this.scale) + this.padding));\n }, Vn.prototype.toArrayBuffer = function () {\n if (this.arrayBuffer) return this.arrayBuffer;\n\n for (var t = this.cells, e = 3 + this.cells.length + 1 + 1, r = 0, n = 0; n < this.cells.length; n++) {\n r += this.cells[n].length;\n }\n\n var i = new Int32Array(e + r + this.keys.length + this.bboxes.length);\n i[0] = this.extent, i[1] = this.n, i[2] = this.padding;\n\n for (var a = e, o = 0; o < t.length; o++) {\n var s = t[o];\n i[3 + o] = a, i.set(s, a), a += s.length;\n }\n\n return i[3 + t.length] = a, i.set(this.keys, a), i[3 + t.length + 1] = a += this.keys.length, i.set(this.bboxes, a), a += this.bboxes.length, i.buffer;\n };\n var Fn = o.ImageData,\n Dn = o.ImageBitmap,\n Ln = {};\n\n function On(t, e, r) {\n void 0 === r && (r = {}), Object.defineProperty(e, "_classRegistryKey", {\n value: t,\n writeable: !1\n }), Ln[t] = {\n klass: e,\n omit: r.omit || [],\n shallow: r.shallow || []\n };\n }\n\n for (var Rn in On("Object", Object), Tn.serialize = function (t, e) {\n var r = t.toArrayBuffer();\n return e && e.push(r), {\n buffer: r\n };\n }, Tn.deserialize = function (t) {\n return new Tn(t.buffer);\n }, On("Grid", Tn), On("Color", te), On("Error", Error), On("ResolvedImage", ie), On("StylePropertyFunction", Yr), On("StyleExpression", Kr, {\n omit: ["_evaluator"]\n }), On("ZoomDependentExpression", Jr), On("ZoomConstantExpression", Xr), On("CompoundExpression", xe, {\n omit: ["_evaluate"]\n }), Ir) {\n Ir[Rn]._classRegistryKey || On("Expression_" + Rn, Ir[Rn]);\n }\n\n function Un(t) {\n return t && "undefined" != typeof ArrayBuffer && (t instanceof ArrayBuffer || t.constructor && "ArrayBuffer" === t.constructor.name);\n }\n\n function jn(t) {\n return Dn && t instanceof Dn;\n }\n\n function qn(t, e) {\n if (null == t || "boolean" == typeof t || "number" == typeof t || "string" == typeof t || t instanceof Boolean || t instanceof Number || t instanceof String || t instanceof Date || t instanceof RegExp) return t;\n if (Un(t) || jn(t)) return e && e.push(t), t;\n\n if (ArrayBuffer.isView(t)) {\n var r = t;\n return e && e.push(r.buffer), r;\n }\n\n if (t instanceof Fn) return e && e.push(t.data.buffer), t;\n\n if (Array.isArray(t)) {\n for (var n = [], i = 0, a = t; i < a.length; i += 1) {\n n.push(qn(a[i], e));\n }\n\n return n;\n }\n\n if ("object" == typeof t) {\n var o = t.constructor,\n s = o._classRegistryKey;\n if (!s) throw new Error("can\'t serialize object of unregistered class");\n var u = o.serialize ? o.serialize(t, e) : {};\n\n if (!o.serialize) {\n for (var l in t) {\n if (t.hasOwnProperty(l) && !(Ln[s].omit.indexOf(l) >= 0)) {\n var p = t[l];\n u[l] = Ln[s].shallow.indexOf(l) >= 0 ? p : qn(p, e);\n }\n }\n\n t instanceof Error && (u.message = t.message);\n }\n\n if (u.$name) throw new Error("$name property is reserved for worker serialization logic.");\n return "Object" !== s && (u.$name = s), u;\n }\n\n throw new Error("can\'t serialize object of type " + typeof t);\n }\n\n function Nn(t) {\n if (null == t || "boolean" == typeof t || "number" == typeof t || "string" == typeof t || t instanceof Boolean || t instanceof Number || t instanceof String || t instanceof Date || t instanceof RegExp || Un(t) || jn(t) || ArrayBuffer.isView(t) || t instanceof Fn) return t;\n if (Array.isArray(t)) return t.map(Nn);\n\n if ("object" == typeof t) {\n var e = t.$name || "Object",\n r = Ln[e].klass;\n if (!r) throw new Error("can\'t deserialize unregistered class " + e);\n if (r.deserialize) return r.deserialize(t);\n\n for (var n = Object.create(r.prototype), i = 0, a = Object.keys(t); i < a.length; i += 1) {\n var o = a[i];\n\n if ("$name" !== o) {\n var s = t[o];\n n[o] = Ln[e].shallow.indexOf(o) >= 0 ? s : Nn(s);\n }\n }\n\n return n;\n }\n\n throw new Error("can\'t deserialize object of type " + typeof t);\n }\n\n var Kn = function Kn() {\n this.first = !0;\n };\n\n Kn.prototype.update = function (t, e) {\n var r = Math.floor(t);\n return this.first ? (this.first = !1, this.lastIntegerZoom = r, this.lastIntegerZoomTime = 0, this.lastZoom = t, this.lastFloorZoom = r, !0) : (this.lastFloorZoom > r ? (this.lastIntegerZoom = r + 1, this.lastIntegerZoomTime = e) : this.lastFloorZoom < r && (this.lastIntegerZoom = r, this.lastIntegerZoomTime = e), t !== this.lastZoom && (this.lastZoom = t, this.lastFloorZoom = r, !0));\n };\n\n var Gn = {\n "Latin-1 Supplement": function Latin1Supplement(t) {\n return t >= 128 && t <= 255;\n },\n Arabic: function Arabic(t) {\n return t >= 1536 && t <= 1791;\n },\n "Arabic Supplement": function ArabicSupplement(t) {\n return t >= 1872 && t <= 1919;\n },\n "Arabic Extended-A": function ArabicExtendedA(t) {\n return t >= 2208 && t <= 2303;\n },\n "Hangul Jamo": function HangulJamo(t) {\n return t >= 4352 && t <= 4607;\n },\n "Unified Canadian Aboriginal Syllabics": function UnifiedCanadianAboriginalSyllabics(t) {\n return t >= 5120 && t <= 5759;\n },\n Khmer: function Khmer(t) {\n return t >= 6016 && t <= 6143;\n },\n "Unified Canadian Aboriginal Syllabics Extended": function UnifiedCanadianAboriginalSyllabicsExtended(t) {\n return t >= 6320 && t <= 6399;\n },\n "General Punctuation": function GeneralPunctuation(t) {\n return t >= 8192 && t <= 8303;\n },\n "Letterlike Symbols": function LetterlikeSymbols(t) {\n return t >= 8448 && t <= 8527;\n },\n "Number Forms": function NumberForms(t) {\n return t >= 8528 && t <= 8591;\n },\n "Miscellaneous Technical": function MiscellaneousTechnical(t) {\n return t >= 8960 && t <= 9215;\n },\n "Control Pictures": function ControlPictures(t) {\n return t >= 9216 && t <= 9279;\n },\n "Optical Character Recognition": function OpticalCharacterRecognition(t) {\n return t >= 9280 && t <= 9311;\n },\n "Enclosed Alphanumerics": function EnclosedAlphanumerics(t) {\n return t >= 9312 && t <= 9471;\n },\n "Geometric Shapes": function GeometricShapes(t) {\n return t >= 9632 && t <= 9727;\n },\n "Miscellaneous Symbols": function MiscellaneousSymbols(t) {\n return t >= 9728 && t <= 9983;\n },\n "Miscellaneous Symbols and Arrows": function MiscellaneousSymbolsAndArrows(t) {\n return t >= 11008 && t <= 11263;\n },\n "CJK Radicals Supplement": function CJKRadicalsSupplement(t) {\n return t >= 11904 && t <= 12031;\n },\n "Kangxi Radicals": function KangxiRadicals(t) {\n return t >= 12032 && t <= 12255;\n },\n "Ideographic Description Characters": function IdeographicDescriptionCharacters(t) {\n return t >= 12272 && t <= 12287;\n },\n "CJK Symbols and Punctuation": function CJKSymbolsAndPunctuation(t) {\n return t >= 12288 && t <= 12351;\n },\n Hiragana: function Hiragana(t) {\n return t >= 12352 && t <= 12447;\n },\n Katakana: function Katakana(t) {\n return t >= 12448 && t <= 12543;\n },\n Bopomofo: function Bopomofo(t) {\n return t >= 12544 && t <= 12591;\n },\n "Hangul Compatibility Jamo": function HangulCompatibilityJamo(t) {\n return t >= 12592 && t <= 12687;\n },\n Kanbun: function Kanbun(t) {\n return t >= 12688 && t <= 12703;\n },\n "Bopomofo Extended": function BopomofoExtended(t) {\n return t >= 12704 && t <= 12735;\n },\n "CJK Strokes": function CJKStrokes(t) {\n return t >= 12736 && t <= 12783;\n },\n "Katakana Phonetic Extensions": function KatakanaPhoneticExtensions(t) {\n return t >= 12784 && t <= 12799;\n },\n "Enclosed CJK Letters and Months": function EnclosedCJKLettersAndMonths(t) {\n return t >= 12800 && t <= 13055;\n },\n "CJK Compatibility": function CJKCompatibility(t) {\n return t >= 13056 && t <= 13311;\n },\n "CJK Unified Ideographs Extension A": function CJKUnifiedIdeographsExtensionA(t) {\n return t >= 13312 && t <= 19903;\n },\n "Yijing Hexagram Symbols": function YijingHexagramSymbols(t) {\n return t >= 19904 && t <= 19967;\n },\n "CJK Unified Ideographs": function CJKUnifiedIdeographs(t) {\n return t >= 19968 && t <= 40959;\n },\n "Yi Syllables": function YiSyllables(t) {\n return t >= 40960 && t <= 42127;\n },\n "Yi Radicals": function YiRadicals(t) {\n return t >= 42128 && t <= 42191;\n },\n "Hangul Jamo Extended-A": function HangulJamoExtendedA(t) {\n return t >= 43360 && t <= 43391;\n },\n "Hangul Syllables": function HangulSyllables(t) {\n return t >= 44032 && t <= 55215;\n },\n "Hangul Jamo Extended-B": function HangulJamoExtendedB(t) {\n return t >= 55216 && t <= 55295;\n },\n "Private Use Area": function PrivateUseArea(t) {\n return t >= 57344 && t <= 63743;\n },\n "CJK Compatibility Ideographs": function CJKCompatibilityIdeographs(t) {\n return t >= 63744 && t <= 64255;\n },\n "Arabic Presentation Forms-A": function ArabicPresentationFormsA(t) {\n return t >= 64336 && t <= 65023;\n },\n "Vertical Forms": function VerticalForms(t) {\n return t >= 65040 && t <= 65055;\n },\n "CJK Compatibility Forms": function CJKCompatibilityForms(t) {\n return t >= 65072 && t <= 65103;\n },\n "Small Form Variants": function SmallFormVariants(t) {\n return t >= 65104 && t <= 65135;\n },\n "Arabic Presentation Forms-B": function ArabicPresentationFormsB(t) {\n return t >= 65136 && t <= 65279;\n },\n "Halfwidth and Fullwidth Forms": function HalfwidthAndFullwidthForms(t) {\n return t >= 65280 && t <= 65519;\n }\n };\n\n function Zn(t) {\n for (var e = 0, r = t; e < r.length; e += 1) {\n if (Xn(r[e].charCodeAt(0))) return !0;\n }\n\n return !1;\n }\n\n function Xn(t) {\n return !(746 !== t && 747 !== t && (t < 4352 || !(Gn["Bopomofo Extended"](t) || Gn.Bopomofo(t) || Gn["CJK Compatibility Forms"](t) && !(t >= 65097 && t <= 65103) || Gn["CJK Compatibility Ideographs"](t) || Gn["CJK Compatibility"](t) || Gn["CJK Radicals Supplement"](t) || Gn["CJK Strokes"](t) || !(!Gn["CJK Symbols and Punctuation"](t) || t >= 12296 && t <= 12305 || t >= 12308 && t <= 12319 || 12336 === t) || Gn["CJK Unified Ideographs Extension A"](t) || Gn["CJK Unified Ideographs"](t) || Gn["Enclosed CJK Letters and Months"](t) || Gn["Hangul Compatibility Jamo"](t) || Gn["Hangul Jamo Extended-A"](t) || Gn["Hangul Jamo Extended-B"](t) || Gn["Hangul Jamo"](t) || Gn["Hangul Syllables"](t) || Gn.Hiragana(t) || Gn["Ideographic Description Characters"](t) || Gn.Kanbun(t) || Gn["Kangxi Radicals"](t) || Gn["Katakana Phonetic Extensions"](t) || Gn.Katakana(t) && 12540 !== t || !(!Gn["Halfwidth and Fullwidth Forms"](t) || 65288 === t || 65289 === t || 65293 === t || t >= 65306 && t <= 65310 || 65339 === t || 65341 === t || 65343 === t || t >= 65371 && t <= 65503 || 65507 === t || t >= 65512 && t <= 65519) || !(!Gn["Small Form Variants"](t) || t >= 65112 && t <= 65118 || t >= 65123 && t <= 65126) || Gn["Unified Canadian Aboriginal Syllabics"](t) || Gn["Unified Canadian Aboriginal Syllabics Extended"](t) || Gn["Vertical Forms"](t) || Gn["Yijing Hexagram Symbols"](t) || Gn["Yi Syllables"](t) || Gn["Yi Radicals"](t))));\n }\n\n function Jn(t) {\n return !(Xn(t) || function (t) {\n return !!(Gn["Latin-1 Supplement"](t) && (167 === t || 169 === t || 174 === t || 177 === t || 188 === t || 189 === t || 190 === t || 215 === t || 247 === t) || Gn["General Punctuation"](t) && (8214 === t || 8224 === t || 8225 === t || 8240 === t || 8241 === t || 8251 === t || 8252 === t || 8258 === t || 8263 === t || 8264 === t || 8265 === t || 8273 === t) || Gn["Letterlike Symbols"](t) || Gn["Number Forms"](t) || Gn["Miscellaneous Technical"](t) && (t >= 8960 && t <= 8967 || t >= 8972 && t <= 8991 || t >= 8996 && t <= 9e3 || 9003 === t || t >= 9085 && t <= 9114 || t >= 9150 && t <= 9165 || 9167 === t || t >= 9169 && t <= 9179 || t >= 9186 && t <= 9215) || Gn["Control Pictures"](t) && 9251 !== t || Gn["Optical Character Recognition"](t) || Gn["Enclosed Alphanumerics"](t) || Gn["Geometric Shapes"](t) || Gn["Miscellaneous Symbols"](t) && !(t >= 9754 && t <= 9759) || Gn["Miscellaneous Symbols and Arrows"](t) && (t >= 11026 && t <= 11055 || t >= 11088 && t <= 11097 || t >= 11192 && t <= 11243) || Gn["CJK Symbols and Punctuation"](t) || Gn.Katakana(t) || Gn["Private Use Area"](t) || Gn["CJK Compatibility Forms"](t) || Gn["Small Form Variants"](t) || Gn["Halfwidth and Fullwidth Forms"](t) || 8734 === t || 8756 === t || 8757 === t || t >= 9984 && t <= 10087 || t >= 10102 && t <= 10131 || 65532 === t || 65533 === t);\n }(t));\n }\n\n function Hn(t) {\n return t >= 1424 && t <= 2303 || Gn["Arabic Presentation Forms-A"](t) || Gn["Arabic Presentation Forms-B"](t);\n }\n\n function Yn(t, e) {\n return !(!e && Hn(t) || t >= 2304 && t <= 3583 || t >= 3840 && t <= 4255 || Gn.Khmer(t));\n }\n\n function $n(t) {\n for (var e = 0, r = t; e < r.length; e += 1) {\n if (Hn(r[e].charCodeAt(0))) return !0;\n }\n\n return !1;\n }\n\n var Wn = null,\n Qn = "unavailable",\n ti = null,\n ei = function ei(t) {\n t && "string" == typeof t && t.indexOf("NetworkError") > -1 && (Qn = "error"), Wn && Wn(t);\n };\n\n function ri() {\n ni.fire(new It("pluginStateChange", {\n pluginStatus: Qn,\n pluginURL: ti\n }));\n }\n\n var ni = new Ct(),\n ii = function ii() {\n return Qn;\n },\n ai = function ai() {\n if ("deferred" !== Qn || !ti) throw new Error("rtl-text-plugin cannot be downloaded unless a pluginURL is specified");\n Qn = "loading", ri(), ti && bt({\n url: ti\n }, function (t) {\n t ? ei(t) : (Qn = "loaded", ri());\n });\n },\n oi = {\n applyArabicShaping: null,\n processBidirectionalText: null,\n processStyledBidirectionalText: null,\n isLoaded: function isLoaded() {\n return "loaded" === Qn || null != oi.applyArabicShaping;\n },\n isLoading: function isLoading() {\n return "loading" === Qn;\n },\n setState: function setState(t) {\n Qn = t.pluginStatus, ti = t.pluginURL;\n },\n isParsed: function isParsed() {\n return null != oi.applyArabicShaping && null != oi.processBidirectionalText && null != oi.processStyledBidirectionalText;\n },\n getPluginURL: function getPluginURL() {\n return ti;\n }\n },\n si = function si(t, e) {\n this.zoom = t, e ? (this.now = e.now, this.fadeDuration = e.fadeDuration, this.zoomHistory = e.zoomHistory, this.transition = e.transition) : (this.now = 0, this.fadeDuration = 0, this.zoomHistory = new Kn(), this.transition = {});\n };\n\n si.prototype.isSupportedScript = function (t) {\n return function (t, e) {\n for (var r = 0, n = t; r < n.length; r += 1) {\n if (!Yn(n[r].charCodeAt(0), e)) return !1;\n }\n\n return !0;\n }(t, oi.isLoaded());\n }, si.prototype.crossFadingFactor = function () {\n return 0 === this.fadeDuration ? 1 : Math.min((this.now - this.zoomHistory.lastIntegerZoomTime) / this.fadeDuration, 1);\n }, si.prototype.getCrossfadeParameters = function () {\n var t = this.zoom,\n e = t - Math.floor(t),\n r = this.crossFadingFactor();\n return t > this.zoomHistory.lastIntegerZoom ? {\n fromScale: 2,\n toScale: 1,\n t: e + (1 - e) * r\n } : {\n fromScale: .5,\n toScale: 1,\n t: 1 - (1 - r) * e\n };\n };\n\n var ui = function ui(t, e) {\n this.property = t, this.value = e, this.expression = function (t, e) {\n if (Lr(t)) return new Yr(t, e);\n\n if (Gr(t)) {\n var r = Hr(t, e);\n if ("error" === r.result) throw new Error(r.value.map(function (t) {\n return t.key + ": " + t.message;\n }).join(", "));\n return r.value;\n }\n\n var n = t;\n return "string" == typeof t && "color" === e.type && (n = te.parse(t)), {\n kind: "constant",\n evaluate: function evaluate() {\n return n;\n }\n };\n }(void 0 === e ? t.specification.default : e, t.specification);\n };\n\n ui.prototype.isDataDriven = function () {\n return "source" === this.expression.kind || "composite" === this.expression.kind;\n }, ui.prototype.possiblyEvaluate = function (t, e, r) {\n return this.property.possiblyEvaluate(this, t, e, r);\n };\n\n var li = function li(t) {\n this.property = t, this.value = new ui(t, void 0);\n };\n\n li.prototype.transitioned = function (t, e) {\n return new ci(this.property, this.value, e, h({}, t.transition, this.transition), t.now);\n }, li.prototype.untransitioned = function () {\n return new ci(this.property, this.value, null, {}, 0);\n };\n\n var pi = function pi(t) {\n this._properties = t, this._values = Object.create(t.defaultTransitionablePropertyValues);\n };\n\n pi.prototype.getValue = function (t) {\n return w(this._values[t].value.value);\n }, pi.prototype.setValue = function (t, e) {\n this._values.hasOwnProperty(t) || (this._values[t] = new li(this._values[t].property)), this._values[t].value = new ui(this._values[t].property, null === e ? void 0 : w(e));\n }, pi.prototype.getTransition = function (t) {\n return w(this._values[t].transition);\n }, pi.prototype.setTransition = function (t, e) {\n this._values.hasOwnProperty(t) || (this._values[t] = new li(this._values[t].property)), this._values[t].transition = w(e) || void 0;\n }, pi.prototype.serialize = function () {\n for (var t = {}, e = 0, r = Object.keys(this._values); e < r.length; e += 1) {\n var n = r[e],\n i = this.getValue(n);\n void 0 !== i && (t[n] = i);\n var a = this.getTransition(n);\n void 0 !== a && (t[n + "-transition"] = a);\n }\n\n return t;\n }, pi.prototype.transitioned = function (t, e) {\n for (var r = new hi(this._properties), n = 0, i = Object.keys(this._values); n < i.length; n += 1) {\n var a = i[n];\n r._values[a] = this._values[a].transitioned(t, e._values[a]);\n }\n\n return r;\n }, pi.prototype.untransitioned = function () {\n for (var t = new hi(this._properties), e = 0, r = Object.keys(this._values); e < r.length; e += 1) {\n var n = r[e];\n t._values[n] = this._values[n].untransitioned();\n }\n\n return t;\n };\n\n var ci = function ci(t, e, r, n, i) {\n this.property = t, this.value = e, this.begin = i + n.delay || 0, this.end = this.begin + n.duration || 0, t.specification.transition && (n.delay || n.duration) && (this.prior = r);\n };\n\n ci.prototype.possiblyEvaluate = function (t, e, r) {\n var n = t.now || 0,\n i = this.value.possiblyEvaluate(t, e, r),\n a = this.prior;\n\n if (a) {\n if (n > this.end) return this.prior = null, i;\n if (this.value.isDataDriven()) return this.prior = null, i;\n if (n < this.begin) return a.possiblyEvaluate(t, e, r);\n var o = (n - this.begin) / (this.end - this.begin);\n return this.property.interpolate(a.possiblyEvaluate(t, e, r), i, function (t) {\n if (t <= 0) return 0;\n if (t >= 1) return 1;\n var e = t * t,\n r = e * t;\n return 4 * (t < .5 ? r : 3 * (t - e) + r - .75);\n }(o));\n }\n\n return i;\n };\n\n var hi = function hi(t) {\n this._properties = t, this._values = Object.create(t.defaultTransitioningPropertyValues);\n };\n\n hi.prototype.possiblyEvaluate = function (t, e, r) {\n for (var n = new di(this._properties), i = 0, a = Object.keys(this._values); i < a.length; i += 1) {\n var o = a[i];\n n._values[o] = this._values[o].possiblyEvaluate(t, e, r);\n }\n\n return n;\n }, hi.prototype.hasTransition = function () {\n for (var t = 0, e = Object.keys(this._values); t < e.length; t += 1) {\n if (this._values[e[t]].prior) return !0;\n }\n\n return !1;\n };\n\n var fi = function fi(t) {\n this._properties = t, this._values = Object.create(t.defaultPropertyValues);\n };\n\n fi.prototype.getValue = function (t) {\n return w(this._values[t].value);\n }, fi.prototype.setValue = function (t, e) {\n this._values[t] = new ui(this._values[t].property, null === e ? void 0 : w(e));\n }, fi.prototype.serialize = function () {\n for (var t = {}, e = 0, r = Object.keys(this._values); e < r.length; e += 1) {\n var n = r[e],\n i = this.getValue(n);\n void 0 !== i && (t[n] = i);\n }\n\n return t;\n }, fi.prototype.possiblyEvaluate = function (t, e, r) {\n for (var n = new di(this._properties), i = 0, a = Object.keys(this._values); i < a.length; i += 1) {\n var o = a[i];\n n._values[o] = this._values[o].possiblyEvaluate(t, e, r);\n }\n\n return n;\n };\n\n var yi = function yi(t, e, r) {\n this.property = t, this.value = e, this.parameters = r;\n };\n\n yi.prototype.isConstant = function () {\n return "constant" === this.value.kind;\n }, yi.prototype.constantOr = function (t) {\n return "constant" === this.value.kind ? this.value.value : t;\n }, yi.prototype.evaluate = function (t, e, r, n) {\n return this.property.evaluate(this.value, this.parameters, t, e, r, n);\n };\n\n var di = function di(t) {\n this._properties = t, this._values = Object.create(t.defaultPossiblyEvaluatedValues);\n };\n\n di.prototype.get = function (t) {\n return this._values[t];\n };\n\n var mi = function mi(t) {\n this.specification = t;\n };\n\n mi.prototype.possiblyEvaluate = function (t, e) {\n return t.expression.evaluate(e);\n }, mi.prototype.interpolate = function (t, e, r) {\n var n = Ge[this.specification.type];\n return n ? n(t, e, r) : t;\n };\n\n var vi = function vi(t, e) {\n this.specification = t, this.overrides = e;\n };\n\n vi.prototype.possiblyEvaluate = function (t, e, r, n) {\n return new yi(this, "constant" === t.expression.kind || "camera" === t.expression.kind ? {\n kind: "constant",\n value: t.expression.evaluate(e, null, {}, r, n)\n } : t.expression, e);\n }, vi.prototype.interpolate = function (t, e, r) {\n if ("constant" !== t.value.kind || "constant" !== e.value.kind) return t;\n if (void 0 === t.value.value || void 0 === e.value.value) return new yi(this, {\n kind: "constant",\n value: void 0\n }, t.parameters);\n var n = Ge[this.specification.type];\n return n ? new yi(this, {\n kind: "constant",\n value: n(t.value.value, e.value.value, r)\n }, t.parameters) : t;\n }, vi.prototype.evaluate = function (t, e, r, n, i, a) {\n return "constant" === t.kind ? t.value : t.evaluate(e, r, n, i, a);\n };\n\n var gi = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.possiblyEvaluate = function (t, e, r, n) {\n if (void 0 === t.value) return new yi(this, {\n kind: "constant",\n value: void 0\n }, e);\n\n if ("constant" === t.expression.kind) {\n var i = t.expression.evaluate(e, null, {}, r, n),\n a = "resolvedImage" === t.property.specification.type && "string" != typeof i ? i.name : i,\n o = this._calculate(a, a, a, e);\n\n return new yi(this, {\n kind: "constant",\n value: o\n }, e);\n }\n\n if ("camera" === t.expression.kind) {\n var s = this._calculate(t.expression.evaluate({\n zoom: e.zoom - 1\n }), t.expression.evaluate({\n zoom: e.zoom\n }), t.expression.evaluate({\n zoom: e.zoom + 1\n }), e);\n\n return new yi(this, {\n kind: "constant",\n value: s\n }, e);\n }\n\n return new yi(this, t.expression, e);\n }, e.prototype.evaluate = function (t, e, r, n, i, a) {\n if ("source" === t.kind) {\n var o = t.evaluate(e, r, n, i, a);\n return this._calculate(o, o, o, e);\n }\n\n return "composite" === t.kind ? this._calculate(t.evaluate({\n zoom: Math.floor(e.zoom) - 1\n }, r, n), t.evaluate({\n zoom: Math.floor(e.zoom)\n }, r, n), t.evaluate({\n zoom: Math.floor(e.zoom) + 1\n }, r, n), e) : t.value;\n }, e.prototype._calculate = function (t, e, r, n) {\n return n.zoom > n.zoomHistory.lastIntegerZoom ? {\n from: t,\n to: e\n } : {\n from: r,\n to: e\n };\n }, e.prototype.interpolate = function (t) {\n return t;\n }, e;\n }(vi),\n xi = function xi(t) {\n this.specification = t;\n };\n\n xi.prototype.possiblyEvaluate = function (t, e, r, n) {\n if (void 0 !== t.value) {\n if ("constant" === t.expression.kind) {\n var i = t.expression.evaluate(e, null, {}, r, n);\n return this._calculate(i, i, i, e);\n }\n\n return this._calculate(t.expression.evaluate(new si(Math.floor(e.zoom - 1), e)), t.expression.evaluate(new si(Math.floor(e.zoom), e)), t.expression.evaluate(new si(Math.floor(e.zoom + 1), e)), e);\n }\n }, xi.prototype._calculate = function (t, e, r, n) {\n return n.zoom > n.zoomHistory.lastIntegerZoom ? {\n from: t,\n to: e\n } : {\n from: r,\n to: e\n };\n }, xi.prototype.interpolate = function (t) {\n return t;\n };\n\n var bi = function bi(t) {\n this.specification = t;\n };\n\n bi.prototype.possiblyEvaluate = function (t, e, r, n) {\n return !!t.expression.evaluate(e, null, {}, r, n);\n }, bi.prototype.interpolate = function () {\n return !1;\n };\n\n var wi = function wi(t) {\n for (var e in this.properties = t, this.defaultPropertyValues = {}, this.defaultTransitionablePropertyValues = {}, this.defaultTransitioningPropertyValues = {}, this.defaultPossiblyEvaluatedValues = {}, this.overridableProperties = [], t) {\n var r = t[e];\n r.specification.overridable && this.overridableProperties.push(e);\n var n = this.defaultPropertyValues[e] = new ui(r, void 0),\n i = this.defaultTransitionablePropertyValues[e] = new li(r);\n this.defaultTransitioningPropertyValues[e] = i.untransitioned(), this.defaultPossiblyEvaluatedValues[e] = n.possiblyEvaluate({});\n }\n };\n\n On("DataDrivenProperty", vi), On("DataConstantProperty", mi), On("CrossFadedDataDrivenProperty", gi), On("CrossFadedProperty", xi), On("ColorRampProperty", bi);\n\n var _i = function (t) {\n function e(e, r) {\n if (t.call(this), this.id = e.id, this.type = e.type, this._featureFilter = {\n filter: function filter() {\n return !0;\n },\n needGeometry: !1\n }, "custom" !== e.type && (this.metadata = (e = e).metadata, this.minzoom = e.minzoom, this.maxzoom = e.maxzoom, "background" !== e.type && (this.source = e.source, this.sourceLayer = e["source-layer"], this.filter = e.filter), r.layout && (this._unevaluatedLayout = new fi(r.layout)), r.paint)) {\n for (var n in this._transitionablePaint = new pi(r.paint), e.paint) {\n this.setPaintProperty(n, e.paint[n], {\n validate: !1\n });\n }\n\n for (var i in e.layout) {\n this.setLayoutProperty(i, e.layout[i], {\n validate: !1\n });\n }\n\n this._transitioningPaint = this._transitionablePaint.untransitioned(), this.paint = new di(r.paint);\n }\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getCrossfadeParameters = function () {\n return this._crossfadeParameters;\n }, e.prototype.getLayoutProperty = function (t) {\n return "visibility" === t ? this.visibility : this._unevaluatedLayout.getValue(t);\n }, e.prototype.setLayoutProperty = function (t, e, r) {\n void 0 === r && (r = {}), null != e && this._validate(Mn, "layers." + this.id + ".layout." + t, t, e, r) || ("visibility" !== t ? this._unevaluatedLayout.setValue(t, e) : this.visibility = e);\n }, e.prototype.getPaintProperty = function (t) {\n return g(t, "-transition") ? this._transitionablePaint.getTransition(t.slice(0, -"-transition".length)) : this._transitionablePaint.getValue(t);\n }, e.prototype.setPaintProperty = function (t, e, r) {\n if (void 0 === r && (r = {}), null != e && this._validate(Pn, "layers." + this.id + ".paint." + t, t, e, r)) return !1;\n if (g(t, "-transition")) return this._transitionablePaint.setTransition(t.slice(0, -"-transition".length), e || void 0), !1;\n var n = this._transitionablePaint._values[t],\n i = "cross-faded-data-driven" === n.property.specification["property-type"],\n a = n.value.isDataDriven(),\n o = n.value;\n this._transitionablePaint.setValue(t, e), this._handleSpecialPaintPropertyUpdate(t);\n var s = this._transitionablePaint._values[t].value;\n return s.isDataDriven() || a || i || this._handleOverridablePaintPropertyUpdate(t, o, s);\n }, e.prototype._handleSpecialPaintPropertyUpdate = function (t) {}, e.prototype._handleOverridablePaintPropertyUpdate = function (t, e, r) {\n return !1;\n }, e.prototype.isHidden = function (t) {\n return !!(this.minzoom && t < this.minzoom) || !!(this.maxzoom && t >= this.maxzoom) || "none" === this.visibility;\n }, e.prototype.updateTransitions = function (t) {\n this._transitioningPaint = this._transitionablePaint.transitioned(t, this._transitioningPaint);\n }, e.prototype.hasTransition = function () {\n return this._transitioningPaint.hasTransition();\n }, e.prototype.recalculate = function (t, e) {\n t.getCrossfadeParameters && (this._crossfadeParameters = t.getCrossfadeParameters()), this._unevaluatedLayout && (this.layout = this._unevaluatedLayout.possiblyEvaluate(t, void 0, e)), this.paint = this._transitioningPaint.possiblyEvaluate(t, void 0, e);\n }, e.prototype.serialize = function () {\n var t = {\n id: this.id,\n type: this.type,\n source: this.source,\n "source-layer": this.sourceLayer,\n metadata: this.metadata,\n minzoom: this.minzoom,\n maxzoom: this.maxzoom,\n filter: this.filter,\n layout: this._unevaluatedLayout && this._unevaluatedLayout.serialize(),\n paint: this._transitionablePaint && this._transitionablePaint.serialize()\n };\n return this.visibility && (t.layout = t.layout || {}, t.layout.visibility = this.visibility), b(t, function (t, e) {\n return !(void 0 === t || "layout" === e && !Object.keys(t).length || "paint" === e && !Object.keys(t).length);\n });\n }, e.prototype._validate = function (t, e, r, n, i) {\n return void 0 === i && (i = {}), (!i || !1 !== i.validate) && Bn(this, t.call(Cn, {\n key: e,\n layerType: this.type,\n objectKey: r,\n value: n,\n styleSpec: Et,\n style: {\n glyphs: !0,\n sprite: !0\n }\n }));\n }, e.prototype.is3D = function () {\n return !1;\n }, e.prototype.isTileClipped = function () {\n return !1;\n }, e.prototype.hasOffscreenPass = function () {\n return !1;\n }, e.prototype.resize = function () {}, e.prototype.isStateDependent = function () {\n for (var t in this.paint._values) {\n var e = this.paint.get(t);\n if (e instanceof yi && Tr(e.property.specification) && ("source" === e.value.kind || "composite" === e.value.kind) && e.value.isStateDependent) return !0;\n }\n\n return !1;\n }, e;\n }(Ct),\n Ai = {\n Int8: Int8Array,\n Uint8: Uint8Array,\n Int16: Int16Array,\n Uint16: Uint16Array,\n Int32: Int32Array,\n Uint32: Uint32Array,\n Float32: Float32Array\n },\n Si = function Si(t, e) {\n this._structArray = t, this._pos1 = e * this.size, this._pos2 = this._pos1 / 2, this._pos4 = this._pos1 / 4, this._pos8 = this._pos1 / 8;\n },\n ki = function ki() {\n this.isTransferred = !1, this.capacity = -1, this.resize(0);\n };\n\n function Ii(t, e) {\n void 0 === e && (e = 1);\n var r = 0,\n n = 0;\n return {\n members: t.map(function (t) {\n var i = Ai[t.type].BYTES_PER_ELEMENT,\n a = r = zi(r, Math.max(e, i)),\n o = t.components || 1;\n return n = Math.max(n, i), r += i * o, {\n name: t.name,\n type: t.type,\n components: o,\n offset: a\n };\n }),\n size: zi(r, Math.max(n, e)),\n alignment: e\n };\n }\n\n function zi(t, e) {\n return Math.ceil(t / e) * e;\n }\n\n ki.serialize = function (t, e) {\n return t._trim(), e && (t.isTransferred = !0, e.push(t.arrayBuffer)), {\n length: t.length,\n arrayBuffer: t.arrayBuffer\n };\n }, ki.deserialize = function (t) {\n var e = Object.create(this.prototype);\n return e.arrayBuffer = t.arrayBuffer, e.length = t.length, e.capacity = t.arrayBuffer.byteLength / e.bytesPerElement, e._refreshViews(), e;\n }, ki.prototype._trim = function () {\n this.length !== this.capacity && (this.capacity = this.length, this.arrayBuffer = this.arrayBuffer.slice(0, this.length * this.bytesPerElement), this._refreshViews());\n }, ki.prototype.clear = function () {\n this.length = 0;\n }, ki.prototype.resize = function (t) {\n this.reserve(t), this.length = t;\n }, ki.prototype.reserve = function (t) {\n if (t > this.capacity) {\n this.capacity = Math.max(t, Math.floor(5 * this.capacity), 128), this.arrayBuffer = new ArrayBuffer(this.capacity * this.bytesPerElement);\n var e = this.uint8;\n this._refreshViews(), e && this.uint8.set(e);\n }\n }, ki.prototype._refreshViews = function () {\n throw new Error("_refreshViews() must be implemented by each concrete StructArray layout");\n };\n\n var Ci = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.int16 = new Int16Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t, e) {\n var r = this.length;\n return this.resize(r + 1), this.emplace(r, t, e);\n }, e.prototype.emplace = function (t, e, r) {\n var n = 2 * t;\n return this.int16[n + 0] = e, this.int16[n + 1] = r, t;\n }, e;\n }(ki);\n\n Ci.prototype.bytesPerElement = 4, On("StructArrayLayout2i4", Ci);\n\n var Ei = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.int16 = new Int16Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t, e, r, n) {\n var i = this.length;\n return this.resize(i + 1), this.emplace(i, t, e, r, n);\n }, e.prototype.emplace = function (t, e, r, n, i) {\n var a = 4 * t;\n return this.int16[a + 0] = e, this.int16[a + 1] = r, this.int16[a + 2] = n, this.int16[a + 3] = i, t;\n }, e;\n }(ki);\n\n Ei.prototype.bytesPerElement = 8, On("StructArrayLayout4i8", Ei);\n\n var Pi = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.int16 = new Int16Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t, e, r, n, i, a) {\n var o = this.length;\n return this.resize(o + 1), this.emplace(o, t, e, r, n, i, a);\n }, e.prototype.emplace = function (t, e, r, n, i, a, o) {\n var s = 6 * t;\n return this.int16[s + 0] = e, this.int16[s + 1] = r, this.int16[s + 2] = n, this.int16[s + 3] = i, this.int16[s + 4] = a, this.int16[s + 5] = o, t;\n }, e;\n }(ki);\n\n Pi.prototype.bytesPerElement = 12, On("StructArrayLayout2i4i12", Pi);\n\n var Mi = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.int16 = new Int16Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t, e, r, n, i, a) {\n var o = this.length;\n return this.resize(o + 1), this.emplace(o, t, e, r, n, i, a);\n }, e.prototype.emplace = function (t, e, r, n, i, a, o) {\n var s = 4 * t,\n u = 8 * t;\n return this.int16[s + 0] = e, this.int16[s + 1] = r, this.uint8[u + 4] = n, this.uint8[u + 5] = i, this.uint8[u + 6] = a, this.uint8[u + 7] = o, t;\n }, e;\n }(ki);\n\n Mi.prototype.bytesPerElement = 8, On("StructArrayLayout2i4ub8", Mi);\n\n var Bi = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.float32 = new Float32Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t, e) {\n var r = this.length;\n return this.resize(r + 1), this.emplace(r, t, e);\n }, e.prototype.emplace = function (t, e, r) {\n var n = 2 * t;\n return this.float32[n + 0] = e, this.float32[n + 1] = r, t;\n }, e;\n }(ki);\n\n Bi.prototype.bytesPerElement = 8, On("StructArrayLayout2f8", Bi);\n\n var Ti = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.uint16 = new Uint16Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t, e, r, n, i, a, o, s, u, l) {\n var p = this.length;\n return this.resize(p + 1), this.emplace(p, t, e, r, n, i, a, o, s, u, l);\n }, e.prototype.emplace = function (t, e, r, n, i, a, o, s, u, l, p) {\n var c = 10 * t;\n return this.uint16[c + 0] = e, this.uint16[c + 1] = r, this.uint16[c + 2] = n, this.uint16[c + 3] = i, this.uint16[c + 4] = a, this.uint16[c + 5] = o, this.uint16[c + 6] = s, this.uint16[c + 7] = u, this.uint16[c + 8] = l, this.uint16[c + 9] = p, t;\n }, e;\n }(ki);\n\n Ti.prototype.bytesPerElement = 20, On("StructArrayLayout10ui20", Ti);\n\n var Vi = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.int16 = new Int16Array(this.arrayBuffer), this.uint16 = new Uint16Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t, e, r, n, i, a, o, s, u, l, p, c) {\n var h = this.length;\n return this.resize(h + 1), this.emplace(h, t, e, r, n, i, a, o, s, u, l, p, c);\n }, e.prototype.emplace = function (t, e, r, n, i, a, o, s, u, l, p, c, h) {\n var f = 12 * t;\n return this.int16[f + 0] = e, this.int16[f + 1] = r, this.int16[f + 2] = n, this.int16[f + 3] = i, this.uint16[f + 4] = a, this.uint16[f + 5] = o, this.uint16[f + 6] = s, this.uint16[f + 7] = u, this.int16[f + 8] = l, this.int16[f + 9] = p, this.int16[f + 10] = c, this.int16[f + 11] = h, t;\n }, e;\n }(ki);\n\n Vi.prototype.bytesPerElement = 24, On("StructArrayLayout4i4ui4i24", Vi);\n\n var Fi = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.float32 = new Float32Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t, e, r) {\n var n = this.length;\n return this.resize(n + 1), this.emplace(n, t, e, r);\n }, e.prototype.emplace = function (t, e, r, n) {\n var i = 3 * t;\n return this.float32[i + 0] = e, this.float32[i + 1] = r, this.float32[i + 2] = n, t;\n }, e;\n }(ki);\n\n Fi.prototype.bytesPerElement = 12, On("StructArrayLayout3f12", Fi);\n\n var Di = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.uint32 = new Uint32Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t) {\n var e = this.length;\n return this.resize(e + 1), this.emplace(e, t);\n }, e.prototype.emplace = function (t, e) {\n return this.uint32[1 * t + 0] = e, t;\n }, e;\n }(ki);\n\n Di.prototype.bytesPerElement = 4, On("StructArrayLayout1ul4", Di);\n\n var Li = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.int16 = new Int16Array(this.arrayBuffer), this.uint32 = new Uint32Array(this.arrayBuffer), this.uint16 = new Uint16Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t, e, r, n, i, a, o, s, u) {\n var l = this.length;\n return this.resize(l + 1), this.emplace(l, t, e, r, n, i, a, o, s, u);\n }, e.prototype.emplace = function (t, e, r, n, i, a, o, s, u, l) {\n var p = 10 * t,\n c = 5 * t;\n return this.int16[p + 0] = e, this.int16[p + 1] = r, this.int16[p + 2] = n, this.int16[p + 3] = i, this.int16[p + 4] = a, this.int16[p + 5] = o, this.uint32[c + 3] = s, this.uint16[p + 8] = u, this.uint16[p + 9] = l, t;\n }, e;\n }(ki);\n\n Li.prototype.bytesPerElement = 20, On("StructArrayLayout6i1ul2ui20", Li);\n\n var Oi = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.int16 = new Int16Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t, e, r, n, i, a) {\n var o = this.length;\n return this.resize(o + 1), this.emplace(o, t, e, r, n, i, a);\n }, e.prototype.emplace = function (t, e, r, n, i, a, o) {\n var s = 6 * t;\n return this.int16[s + 0] = e, this.int16[s + 1] = r, this.int16[s + 2] = n, this.int16[s + 3] = i, this.int16[s + 4] = a, this.int16[s + 5] = o, t;\n }, e;\n }(ki);\n\n Oi.prototype.bytesPerElement = 12, On("StructArrayLayout2i2i2i12", Oi);\n\n var Ri = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.float32 = new Float32Array(this.arrayBuffer), this.int16 = new Int16Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t, e, r, n, i) {\n var a = this.length;\n return this.resize(a + 1), this.emplace(a, t, e, r, n, i);\n }, e.prototype.emplace = function (t, e, r, n, i, a) {\n var o = 4 * t,\n s = 8 * t;\n return this.float32[o + 0] = e, this.float32[o + 1] = r, this.float32[o + 2] = n, this.int16[s + 6] = i, this.int16[s + 7] = a, t;\n }, e;\n }(ki);\n\n Ri.prototype.bytesPerElement = 16, On("StructArrayLayout2f1f2i16", Ri);\n\n var Ui = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.float32 = new Float32Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t, e, r, n) {\n var i = this.length;\n return this.resize(i + 1), this.emplace(i, t, e, r, n);\n }, e.prototype.emplace = function (t, e, r, n, i) {\n var a = 12 * t,\n o = 3 * t;\n return this.uint8[a + 0] = e, this.uint8[a + 1] = r, this.float32[o + 1] = n, this.float32[o + 2] = i, t;\n }, e;\n }(ki);\n\n Ui.prototype.bytesPerElement = 12, On("StructArrayLayout2ub2f12", Ui);\n\n var ji = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.uint16 = new Uint16Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t, e, r) {\n var n = this.length;\n return this.resize(n + 1), this.emplace(n, t, e, r);\n }, e.prototype.emplace = function (t, e, r, n) {\n var i = 3 * t;\n return this.uint16[i + 0] = e, this.uint16[i + 1] = r, this.uint16[i + 2] = n, t;\n }, e;\n }(ki);\n\n ji.prototype.bytesPerElement = 6, On("StructArrayLayout3ui6", ji);\n\n var qi = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.int16 = new Int16Array(this.arrayBuffer), this.uint16 = new Uint16Array(this.arrayBuffer), this.uint32 = new Uint32Array(this.arrayBuffer), this.float32 = new Float32Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t, e, r, n, i, a, o, s, u, l, p, c, h, f, y, d, m) {\n var v = this.length;\n return this.resize(v + 1), this.emplace(v, t, e, r, n, i, a, o, s, u, l, p, c, h, f, y, d, m);\n }, e.prototype.emplace = function (t, e, r, n, i, a, o, s, u, l, p, c, h, f, y, d, m, v) {\n var g = 24 * t,\n x = 12 * t,\n b = 48 * t;\n return this.int16[g + 0] = e, this.int16[g + 1] = r, this.uint16[g + 2] = n, this.uint16[g + 3] = i, this.uint32[x + 2] = a, this.uint32[x + 3] = o, this.uint32[x + 4] = s, this.uint16[g + 10] = u, this.uint16[g + 11] = l, this.uint16[g + 12] = p, this.float32[x + 7] = c, this.float32[x + 8] = h, this.uint8[b + 36] = f, this.uint8[b + 37] = y, this.uint8[b + 38] = d, this.uint32[x + 10] = m, this.int16[g + 22] = v, t;\n }, e;\n }(ki);\n\n qi.prototype.bytesPerElement = 48, On("StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48", qi);\n\n var Ni = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.int16 = new Int16Array(this.arrayBuffer), this.uint16 = new Uint16Array(this.arrayBuffer), this.uint32 = new Uint32Array(this.arrayBuffer), this.float32 = new Float32Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t, e, r, n, i, a, o, s, u, l, p, c, h, f, y, d, m, v, g, x, b, w, _, A, S, k, I, z) {\n var C = this.length;\n return this.resize(C + 1), this.emplace(C, t, e, r, n, i, a, o, s, u, l, p, c, h, f, y, d, m, v, g, x, b, w, _, A, S, k, I, z);\n }, e.prototype.emplace = function (t, e, r, n, i, a, o, s, u, l, p, c, h, f, y, d, m, v, g, x, b, w, _, A, S, k, I, z, C) {\n var E = 34 * t,\n P = 17 * t;\n return this.int16[E + 0] = e, this.int16[E + 1] = r, this.int16[E + 2] = n, this.int16[E + 3] = i, this.int16[E + 4] = a, this.int16[E + 5] = o, this.int16[E + 6] = s, this.int16[E + 7] = u, this.uint16[E + 8] = l, this.uint16[E + 9] = p, this.uint16[E + 10] = c, this.uint16[E + 11] = h, this.uint16[E + 12] = f, this.uint16[E + 13] = y, this.uint16[E + 14] = d, this.uint16[E + 15] = m, this.uint16[E + 16] = v, this.uint16[E + 17] = g, this.uint16[E + 18] = x, this.uint16[E + 19] = b, this.uint16[E + 20] = w, this.uint16[E + 21] = _, this.uint16[E + 22] = A, this.uint32[P + 12] = S, this.float32[P + 13] = k, this.float32[P + 14] = I, this.float32[P + 15] = z, this.float32[P + 16] = C, t;\n }, e;\n }(ki);\n\n Ni.prototype.bytesPerElement = 68, On("StructArrayLayout8i15ui1ul4f68", Ni);\n\n var Ki = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.float32 = new Float32Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t) {\n var e = this.length;\n return this.resize(e + 1), this.emplace(e, t);\n }, e.prototype.emplace = function (t, e) {\n return this.float32[1 * t + 0] = e, t;\n }, e;\n }(ki);\n\n Ki.prototype.bytesPerElement = 4, On("StructArrayLayout1f4", Ki);\n\n var Gi = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.int16 = new Int16Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t, e, r) {\n var n = this.length;\n return this.resize(n + 1), this.emplace(n, t, e, r);\n }, e.prototype.emplace = function (t, e, r, n) {\n var i = 3 * t;\n return this.int16[i + 0] = e, this.int16[i + 1] = r, this.int16[i + 2] = n, t;\n }, e;\n }(ki);\n\n Gi.prototype.bytesPerElement = 6, On("StructArrayLayout3i6", Gi);\n\n var Zi = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.uint32 = new Uint32Array(this.arrayBuffer), this.uint16 = new Uint16Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t, e, r) {\n var n = this.length;\n return this.resize(n + 1), this.emplace(n, t, e, r);\n }, e.prototype.emplace = function (t, e, r, n) {\n var i = 4 * t;\n return this.uint32[2 * t + 0] = e, this.uint16[i + 2] = r, this.uint16[i + 3] = n, t;\n }, e;\n }(ki);\n\n Zi.prototype.bytesPerElement = 8, On("StructArrayLayout1ul2ui8", Zi);\n\n var Xi = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.uint16 = new Uint16Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t, e) {\n var r = this.length;\n return this.resize(r + 1), this.emplace(r, t, e);\n }, e.prototype.emplace = function (t, e, r) {\n var n = 2 * t;\n return this.uint16[n + 0] = e, this.uint16[n + 1] = r, t;\n }, e;\n }(ki);\n\n Xi.prototype.bytesPerElement = 4, On("StructArrayLayout2ui4", Xi);\n\n var Ji = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.uint16 = new Uint16Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t) {\n var e = this.length;\n return this.resize(e + 1), this.emplace(e, t);\n }, e.prototype.emplace = function (t, e) {\n return this.uint16[1 * t + 0] = e, t;\n }, e;\n }(ki);\n\n Ji.prototype.bytesPerElement = 2, On("StructArrayLayout1ui2", Ji);\n\n var Hi = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.float32 = new Float32Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t, e, r, n) {\n var i = this.length;\n return this.resize(i + 1), this.emplace(i, t, e, r, n);\n }, e.prototype.emplace = function (t, e, r, n, i) {\n var a = 4 * t;\n return this.float32[a + 0] = e, this.float32[a + 1] = r, this.float32[a + 2] = n, this.float32[a + 3] = i, t;\n }, e;\n }(ki);\n\n Hi.prototype.bytesPerElement = 16, On("StructArrayLayout4f16", Hi);\n\n var Yi = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e;\n var r = {\n anchorPointX: {\n configurable: !0\n },\n anchorPointY: {\n configurable: !0\n },\n x1: {\n configurable: !0\n },\n y1: {\n configurable: !0\n },\n x2: {\n configurable: !0\n },\n y2: {\n configurable: !0\n },\n featureIndex: {\n configurable: !0\n },\n sourceLayerIndex: {\n configurable: !0\n },\n bucketIndex: {\n configurable: !0\n },\n anchorPoint: {\n configurable: !0\n }\n };\n return r.anchorPointX.get = function () {\n return this._structArray.int16[this._pos2 + 0];\n }, r.anchorPointY.get = function () {\n return this._structArray.int16[this._pos2 + 1];\n }, r.x1.get = function () {\n return this._structArray.int16[this._pos2 + 2];\n }, r.y1.get = function () {\n return this._structArray.int16[this._pos2 + 3];\n }, r.x2.get = function () {\n return this._structArray.int16[this._pos2 + 4];\n }, r.y2.get = function () {\n return this._structArray.int16[this._pos2 + 5];\n }, r.featureIndex.get = function () {\n return this._structArray.uint32[this._pos4 + 3];\n }, r.sourceLayerIndex.get = function () {\n return this._structArray.uint16[this._pos2 + 8];\n }, r.bucketIndex.get = function () {\n return this._structArray.uint16[this._pos2 + 9];\n }, r.anchorPoint.get = function () {\n return new i(this.anchorPointX, this.anchorPointY);\n }, Object.defineProperties(e.prototype, r), e;\n }(Si);\n\n Yi.prototype.size = 20;\n\n var $i = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.get = function (t) {\n return new Yi(this, t);\n }, e;\n }(Li);\n\n On("CollisionBoxArray", $i);\n\n var Wi = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e;\n var r = {\n anchorX: {\n configurable: !0\n },\n anchorY: {\n configurable: !0\n },\n glyphStartIndex: {\n configurable: !0\n },\n numGlyphs: {\n configurable: !0\n },\n vertexStartIndex: {\n configurable: !0\n },\n lineStartIndex: {\n configurable: !0\n },\n lineLength: {\n configurable: !0\n },\n segment: {\n configurable: !0\n },\n lowerSize: {\n configurable: !0\n },\n upperSize: {\n configurable: !0\n },\n lineOffsetX: {\n configurable: !0\n },\n lineOffsetY: {\n configurable: !0\n },\n writingMode: {\n configurable: !0\n },\n placedOrientation: {\n configurable: !0\n },\n hidden: {\n configurable: !0\n },\n crossTileID: {\n configurable: !0\n },\n associatedIconIndex: {\n configurable: !0\n }\n };\n return r.anchorX.get = function () {\n return this._structArray.int16[this._pos2 + 0];\n }, r.anchorY.get = function () {\n return this._structArray.int16[this._pos2 + 1];\n }, r.glyphStartIndex.get = function () {\n return this._structArray.uint16[this._pos2 + 2];\n }, r.numGlyphs.get = function () {\n return this._structArray.uint16[this._pos2 + 3];\n }, r.vertexStartIndex.get = function () {\n return this._structArray.uint32[this._pos4 + 2];\n }, r.lineStartIndex.get = function () {\n return this._structArray.uint32[this._pos4 + 3];\n }, r.lineLength.get = function () {\n return this._structArray.uint32[this._pos4 + 4];\n }, r.segment.get = function () {\n return this._structArray.uint16[this._pos2 + 10];\n }, r.lowerSize.get = function () {\n return this._structArray.uint16[this._pos2 + 11];\n }, r.upperSize.get = function () {\n return this._structArray.uint16[this._pos2 + 12];\n }, r.lineOffsetX.get = function () {\n return this._structArray.float32[this._pos4 + 7];\n }, r.lineOffsetY.get = function () {\n return this._structArray.float32[this._pos4 + 8];\n }, r.writingMode.get = function () {\n return this._structArray.uint8[this._pos1 + 36];\n }, r.placedOrientation.get = function () {\n return this._structArray.uint8[this._pos1 + 37];\n }, r.placedOrientation.set = function (t) {\n this._structArray.uint8[this._pos1 + 37] = t;\n }, r.hidden.get = function () {\n return this._structArray.uint8[this._pos1 + 38];\n }, r.hidden.set = function (t) {\n this._structArray.uint8[this._pos1 + 38] = t;\n }, r.crossTileID.get = function () {\n return this._structArray.uint32[this._pos4 + 10];\n }, r.crossTileID.set = function (t) {\n this._structArray.uint32[this._pos4 + 10] = t;\n }, r.associatedIconIndex.get = function () {\n return this._structArray.int16[this._pos2 + 22];\n }, Object.defineProperties(e.prototype, r), e;\n }(Si);\n\n Wi.prototype.size = 48;\n\n var Qi = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.get = function (t) {\n return new Wi(this, t);\n }, e;\n }(qi);\n\n On("PlacedSymbolArray", Qi);\n\n var ta = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e;\n var r = {\n anchorX: {\n configurable: !0\n },\n anchorY: {\n configurable: !0\n },\n rightJustifiedTextSymbolIndex: {\n configurable: !0\n },\n centerJustifiedTextSymbolIndex: {\n configurable: !0\n },\n leftJustifiedTextSymbolIndex: {\n configurable: !0\n },\n verticalPlacedTextSymbolIndex: {\n configurable: !0\n },\n placedIconSymbolIndex: {\n configurable: !0\n },\n verticalPlacedIconSymbolIndex: {\n configurable: !0\n },\n key: {\n configurable: !0\n },\n textBoxStartIndex: {\n configurable: !0\n },\n textBoxEndIndex: {\n configurable: !0\n },\n verticalTextBoxStartIndex: {\n configurable: !0\n },\n verticalTextBoxEndIndex: {\n configurable: !0\n },\n iconBoxStartIndex: {\n configurable: !0\n },\n iconBoxEndIndex: {\n configurable: !0\n },\n verticalIconBoxStartIndex: {\n configurable: !0\n },\n verticalIconBoxEndIndex: {\n configurable: !0\n },\n featureIndex: {\n configurable: !0\n },\n numHorizontalGlyphVertices: {\n configurable: !0\n },\n numVerticalGlyphVertices: {\n configurable: !0\n },\n numIconVertices: {\n configurable: !0\n },\n numVerticalIconVertices: {\n configurable: !0\n },\n useRuntimeCollisionCircles: {\n configurable: !0\n },\n crossTileID: {\n configurable: !0\n },\n textBoxScale: {\n configurable: !0\n },\n textOffset0: {\n configurable: !0\n },\n textOffset1: {\n configurable: !0\n },\n collisionCircleDiameter: {\n configurable: !0\n }\n };\n return r.anchorX.get = function () {\n return this._structArray.int16[this._pos2 + 0];\n }, r.anchorY.get = function () {\n return this._structArray.int16[this._pos2 + 1];\n }, r.rightJustifiedTextSymbolIndex.get = function () {\n return this._structArray.int16[this._pos2 + 2];\n }, r.centerJustifiedTextSymbolIndex.get = function () {\n return this._structArray.int16[this._pos2 + 3];\n }, r.leftJustifiedTextSymbolIndex.get = function () {\n return this._structArray.int16[this._pos2 + 4];\n }, r.verticalPlacedTextSymbolIndex.get = function () {\n return this._structArray.int16[this._pos2 + 5];\n }, r.placedIconSymbolIndex.get = function () {\n return this._structArray.int16[this._pos2 + 6];\n }, r.verticalPlacedIconSymbolIndex.get = function () {\n return this._structArray.int16[this._pos2 + 7];\n }, r.key.get = function () {\n return this._structArray.uint16[this._pos2 + 8];\n }, r.textBoxStartIndex.get = function () {\n return this._structArray.uint16[this._pos2 + 9];\n }, r.textBoxEndIndex.get = function () {\n return this._structArray.uint16[this._pos2 + 10];\n }, r.verticalTextBoxStartIndex.get = function () {\n return this._structArray.uint16[this._pos2 + 11];\n }, r.verticalTextBoxEndIndex.get = function () {\n return this._structArray.uint16[this._pos2 + 12];\n }, r.iconBoxStartIndex.get = function () {\n return this._structArray.uint16[this._pos2 + 13];\n }, r.iconBoxEndIndex.get = function () {\n return this._structArray.uint16[this._pos2 + 14];\n }, r.verticalIconBoxStartIndex.get = function () {\n return this._structArray.uint16[this._pos2 + 15];\n }, r.verticalIconBoxEndIndex.get = function () {\n return this._structArray.uint16[this._pos2 + 16];\n }, r.featureIndex.get = function () {\n return this._structArray.uint16[this._pos2 + 17];\n }, r.numHorizontalGlyphVertices.get = function () {\n return this._structArray.uint16[this._pos2 + 18];\n }, r.numVerticalGlyphVertices.get = function () {\n return this._structArray.uint16[this._pos2 + 19];\n }, r.numIconVertices.get = function () {\n return this._structArray.uint16[this._pos2 + 20];\n }, r.numVerticalIconVertices.get = function () {\n return this._structArray.uint16[this._pos2 + 21];\n }, r.useRuntimeCollisionCircles.get = function () {\n return this._structArray.uint16[this._pos2 + 22];\n }, r.crossTileID.get = function () {\n return this._structArray.uint32[this._pos4 + 12];\n }, r.crossTileID.set = function (t) {\n this._structArray.uint32[this._pos4 + 12] = t;\n }, r.textBoxScale.get = function () {\n return this._structArray.float32[this._pos4 + 13];\n }, r.textOffset0.get = function () {\n return this._structArray.float32[this._pos4 + 14];\n }, r.textOffset1.get = function () {\n return this._structArray.float32[this._pos4 + 15];\n }, r.collisionCircleDiameter.get = function () {\n return this._structArray.float32[this._pos4 + 16];\n }, Object.defineProperties(e.prototype, r), e;\n }(Si);\n\n ta.prototype.size = 68;\n\n var ea = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.get = function (t) {\n return new ta(this, t);\n }, e;\n }(Ni);\n\n On("SymbolInstanceArray", ea);\n\n var ra = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getoffsetX = function (t) {\n return this.float32[1 * t + 0];\n }, e;\n }(Ki);\n\n On("GlyphOffsetArray", ra);\n\n var na = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getx = function (t) {\n return this.int16[3 * t + 0];\n }, e.prototype.gety = function (t) {\n return this.int16[3 * t + 1];\n }, e.prototype.gettileUnitDistanceFromAnchor = function (t) {\n return this.int16[3 * t + 2];\n }, e;\n }(Gi);\n\n On("SymbolLineVertexArray", na);\n\n var ia = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e;\n var r = {\n featureIndex: {\n configurable: !0\n },\n sourceLayerIndex: {\n configurable: !0\n },\n bucketIndex: {\n configurable: !0\n }\n };\n return r.featureIndex.get = function () {\n return this._structArray.uint32[this._pos4 + 0];\n }, r.sourceLayerIndex.get = function () {\n return this._structArray.uint16[this._pos2 + 2];\n }, r.bucketIndex.get = function () {\n return this._structArray.uint16[this._pos2 + 3];\n }, Object.defineProperties(e.prototype, r), e;\n }(Si);\n\n ia.prototype.size = 8;\n\n var aa = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.get = function (t) {\n return new ia(this, t);\n }, e;\n }(Zi);\n\n On("FeatureIndexArray", aa);\n\n var oa = Ii([{\n name: "a_pos",\n components: 2,\n type: "Int16"\n }], 4).members,\n sa = function sa(t) {\n void 0 === t && (t = []), this.segments = t;\n };\n\n function ua(t, e) {\n return 256 * (t = p(Math.floor(t), 0, 255)) + p(Math.floor(e), 0, 255);\n }\n\n sa.prototype.prepareSegment = function (t, e, r, n) {\n var i = this.segments[this.segments.length - 1];\n return t > sa.MAX_VERTEX_ARRAY_LENGTH && A("Max vertices per segment is " + sa.MAX_VERTEX_ARRAY_LENGTH + ": bucket requested " + t), (!i || i.vertexLength + t > sa.MAX_VERTEX_ARRAY_LENGTH || i.sortKey !== n) && (i = {\n vertexOffset: e.length,\n primitiveOffset: r.length,\n vertexLength: 0,\n primitiveLength: 0\n }, void 0 !== n && (i.sortKey = n), this.segments.push(i)), i;\n }, sa.prototype.get = function () {\n return this.segments;\n }, sa.prototype.destroy = function () {\n for (var t = 0, e = this.segments; t < e.length; t += 1) {\n var r = e[t];\n\n for (var n in r.vaos) {\n r.vaos[n].destroy();\n }\n }\n }, sa.simpleSegment = function (t, e, r, n) {\n return new sa([{\n vertexOffset: t,\n primitiveOffset: e,\n vertexLength: r,\n primitiveLength: n,\n vaos: {},\n sortKey: 0\n }]);\n }, sa.MAX_VERTEX_ARRAY_LENGTH = Math.pow(2, 16) - 1, On("SegmentVector", sa);\n var la = Ii([{\n name: "a_pattern_from",\n components: 4,\n type: "Uint16"\n }, {\n name: "a_pattern_to",\n components: 4,\n type: "Uint16"\n }, {\n name: "a_pixel_ratio_from",\n components: 1,\n type: "Uint16"\n }, {\n name: "a_pixel_ratio_to",\n components: 1,\n type: "Uint16"\n }]),\n pa = e(function (t) {\n t.exports = function (t, e) {\n var r, n, i, a, o, s, u, l;\n\n for (n = t.length - (r = 3 & t.length), i = e, o = 3432918353, s = 461845907, l = 0; l < n;) {\n u = 255 & t.charCodeAt(l) | (255 & t.charCodeAt(++l)) << 8 | (255 & t.charCodeAt(++l)) << 16 | (255 & t.charCodeAt(++l)) << 24, ++l, i = 27492 + (65535 & (a = 5 * (65535 & (i = (i ^= u = (65535 & (u = (u = (65535 & u) * o + (((u >>> 16) * o & 65535) << 16) & 4294967295) << 15 | u >>> 17)) * s + (((u >>> 16) * s & 65535) << 16) & 4294967295) << 13 | i >>> 19)) + ((5 * (i >>> 16) & 65535) << 16) & 4294967295)) + ((58964 + (a >>> 16) & 65535) << 16);\n }\n\n switch (u = 0, r) {\n case 3:\n u ^= (255 & t.charCodeAt(l + 2)) << 16;\n\n case 2:\n u ^= (255 & t.charCodeAt(l + 1)) << 8;\n\n case 1:\n i ^= u = (65535 & (u = (u = (65535 & (u ^= 255 & t.charCodeAt(l))) * o + (((u >>> 16) * o & 65535) << 16) & 4294967295) << 15 | u >>> 17)) * s + (((u >>> 16) * s & 65535) << 16) & 4294967295;\n }\n\n return i ^= t.length, i = 2246822507 * (65535 & (i ^= i >>> 16)) + ((2246822507 * (i >>> 16) & 65535) << 16) & 4294967295, i = 3266489909 * (65535 & (i ^= i >>> 13)) + ((3266489909 * (i >>> 16) & 65535) << 16) & 4294967295, (i ^= i >>> 16) >>> 0;\n };\n }),\n ca = e(function (t) {\n t.exports = function (t, e) {\n for (var r, n = t.length, i = e ^ n, a = 0; n >= 4;) {\n r = 1540483477 * (65535 & (r = 255 & t.charCodeAt(a) | (255 & t.charCodeAt(++a)) << 8 | (255 & t.charCodeAt(++a)) << 16 | (255 & t.charCodeAt(++a)) << 24)) + ((1540483477 * (r >>> 16) & 65535) << 16), i = 1540483477 * (65535 & i) + ((1540483477 * (i >>> 16) & 65535) << 16) ^ (r = 1540483477 * (65535 & (r ^= r >>> 24)) + ((1540483477 * (r >>> 16) & 65535) << 16)), n -= 4, ++a;\n }\n\n switch (n) {\n case 3:\n i ^= (255 & t.charCodeAt(a + 2)) << 16;\n\n case 2:\n i ^= (255 & t.charCodeAt(a + 1)) << 8;\n\n case 1:\n i = 1540483477 * (65535 & (i ^= 255 & t.charCodeAt(a))) + ((1540483477 * (i >>> 16) & 65535) << 16);\n }\n\n return i = 1540483477 * (65535 & (i ^= i >>> 13)) + ((1540483477 * (i >>> 16) & 65535) << 16), (i ^= i >>> 15) >>> 0;\n };\n }),\n ha = pa,\n fa = ca;\n ha.murmur3 = pa, ha.murmur2 = fa;\n\n var ya = function ya() {\n this.ids = [], this.positions = [], this.indexed = !1;\n };\n\n ya.prototype.add = function (t, e, r, n) {\n this.ids.push(ma(t)), this.positions.push(e, r, n);\n }, ya.prototype.getPositions = function (t) {\n for (var e = ma(t), r = 0, n = this.ids.length - 1; r < n;) {\n var i = r + n >> 1;\n this.ids[i] >= e ? n = i : r = i + 1;\n }\n\n for (var a = []; this.ids[r] === e;) {\n a.push({\n index: this.positions[3 * r],\n start: this.positions[3 * r + 1],\n end: this.positions[3 * r + 2]\n }), r++;\n }\n\n return a;\n }, ya.serialize = function (t, e) {\n var r = new Float64Array(t.ids),\n n = new Uint32Array(t.positions);\n return function t(e, r, n, i) {\n for (; n < i;) {\n for (var a = e[n + i >> 1], o = n - 1, s = i + 1;;) {\n do {\n o++;\n } while (e[o] < a);\n\n do {\n s--;\n } while (e[s] > a);\n\n if (o >= s) break;\n va(e, o, s), va(r, 3 * o, 3 * s), va(r, 3 * o + 1, 3 * s + 1), va(r, 3 * o + 2, 3 * s + 2);\n }\n\n s - n < i - s ? (t(e, r, n, s), n = s + 1) : (t(e, r, s + 1, i), i = s);\n }\n }(r, n, 0, r.length - 1), e && e.push(r.buffer, n.buffer), {\n ids: r,\n positions: n\n };\n }, ya.deserialize = function (t) {\n var e = new ya();\n return e.ids = t.ids, e.positions = t.positions, e.indexed = !0, e;\n };\n var da = Math.pow(2, 53) - 1;\n\n function ma(t) {\n var e = +t;\n return !isNaN(e) && e <= da ? e : ha(String(t));\n }\n\n function va(t, e, r) {\n var n = t[e];\n t[e] = t[r], t[r] = n;\n }\n\n On("FeaturePositionMap", ya);\n\n var ga = function ga(t, e) {\n this.gl = t.gl, this.location = e;\n },\n xa = function (t) {\n function e(e, r) {\n t.call(this, e, r), this.current = 0;\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.set = function (t) {\n this.current !== t && (this.current = t, this.gl.uniform1i(this.location, t));\n }, e;\n }(ga),\n ba = function (t) {\n function e(e, r) {\n t.call(this, e, r), this.current = 0;\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.set = function (t) {\n this.current !== t && (this.current = t, this.gl.uniform1f(this.location, t));\n }, e;\n }(ga),\n wa = function (t) {\n function e(e, r) {\n t.call(this, e, r), this.current = [0, 0];\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.set = function (t) {\n t[0] === this.current[0] && t[1] === this.current[1] || (this.current = t, this.gl.uniform2f(this.location, t[0], t[1]));\n }, e;\n }(ga),\n _a = function (t) {\n function e(e, r) {\n t.call(this, e, r), this.current = [0, 0, 0];\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.set = function (t) {\n t[0] === this.current[0] && t[1] === this.current[1] && t[2] === this.current[2] || (this.current = t, this.gl.uniform3f(this.location, t[0], t[1], t[2]));\n }, e;\n }(ga),\n Aa = function (t) {\n function e(e, r) {\n t.call(this, e, r), this.current = [0, 0, 0, 0];\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.set = function (t) {\n t[0] === this.current[0] && t[1] === this.current[1] && t[2] === this.current[2] && t[3] === this.current[3] || (this.current = t, this.gl.uniform4f(this.location, t[0], t[1], t[2], t[3]));\n }, e;\n }(ga),\n Sa = function (t) {\n function e(e, r) {\n t.call(this, e, r), this.current = te.transparent;\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.set = function (t) {\n t.r === this.current.r && t.g === this.current.g && t.b === this.current.b && t.a === this.current.a || (this.current = t, this.gl.uniform4f(this.location, t.r, t.g, t.b, t.a));\n }, e;\n }(ga),\n ka = new Float32Array(16),\n Ia = function (t) {\n function e(e, r) {\n t.call(this, e, r), this.current = ka;\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.set = function (t) {\n if (t[12] !== this.current[12] || t[0] !== this.current[0]) return this.current = t, void this.gl.uniformMatrix4fv(this.location, !1, t);\n\n for (var e = 1; e < 16; e++) {\n if (t[e] !== this.current[e]) {\n this.current = t, this.gl.uniformMatrix4fv(this.location, !1, t);\n break;\n }\n }\n }, e;\n }(ga);\n\n function za(t) {\n return [ua(255 * t.r, 255 * t.g), ua(255 * t.b, 255 * t.a)];\n }\n\n var Ca = function Ca(t, e, r) {\n this.value = t, this.uniformNames = e.map(function (t) {\n return "u_" + t;\n }), this.type = r;\n };\n\n Ca.prototype.setUniform = function (t, e, r) {\n t.set(r.constantOr(this.value));\n }, Ca.prototype.getBinding = function (t, e, r) {\n return "color" === this.type ? new Sa(t, e) : new ba(t, e);\n };\n\n var Ea = function Ea(t, e) {\n this.uniformNames = e.map(function (t) {\n return "u_" + t;\n }), this.patternFrom = null, this.patternTo = null, this.pixelRatioFrom = 1, this.pixelRatioTo = 1;\n };\n\n Ea.prototype.setConstantPatternPositions = function (t, e) {\n this.pixelRatioFrom = e.pixelRatio, this.pixelRatioTo = t.pixelRatio, this.patternFrom = e.tlbr, this.patternTo = t.tlbr;\n }, Ea.prototype.setUniform = function (t, e, r, n) {\n var i = "u_pattern_to" === n ? this.patternTo : "u_pattern_from" === n ? this.patternFrom : "u_pixel_ratio_to" === n ? this.pixelRatioTo : "u_pixel_ratio_from" === n ? this.pixelRatioFrom : null;\n i && t.set(i);\n }, Ea.prototype.getBinding = function (t, e, r) {\n return "u_pattern" === r.substr(0, 9) ? new Aa(t, e) : new ba(t, e);\n };\n\n var Pa = function Pa(t, e, r, n) {\n this.expression = t, this.type = r, this.maxValue = 0, this.paintVertexAttributes = e.map(function (t) {\n return {\n name: "a_" + t,\n type: "Float32",\n components: "color" === r ? 2 : 1,\n offset: 0\n };\n }), this.paintVertexArray = new n();\n };\n\n Pa.prototype.populatePaintArray = function (t, e, r, n, i) {\n var a = this.paintVertexArray.length,\n o = this.expression.evaluate(new si(0), e, {}, n, [], i);\n this.paintVertexArray.resize(t), this._setPaintValue(a, t, o);\n }, Pa.prototype.updatePaintArray = function (t, e, r, n) {\n var i = this.expression.evaluate({\n zoom: 0\n }, r, n);\n\n this._setPaintValue(t, e, i);\n }, Pa.prototype._setPaintValue = function (t, e, r) {\n if ("color" === this.type) for (var n = za(r), i = t; i < e; i++) {\n this.paintVertexArray.emplace(i, n[0], n[1]);\n } else {\n for (var a = t; a < e; a++) {\n this.paintVertexArray.emplace(a, r);\n }\n\n this.maxValue = Math.max(this.maxValue, Math.abs(r));\n }\n }, Pa.prototype.upload = function (t) {\n this.paintVertexArray && this.paintVertexArray.arrayBuffer && (this.paintVertexBuffer && this.paintVertexBuffer.buffer ? this.paintVertexBuffer.updateData(this.paintVertexArray) : this.paintVertexBuffer = t.createVertexBuffer(this.paintVertexArray, this.paintVertexAttributes, this.expression.isStateDependent));\n }, Pa.prototype.destroy = function () {\n this.paintVertexBuffer && this.paintVertexBuffer.destroy();\n };\n\n var Ma = function Ma(t, e, r, n, i, a) {\n this.expression = t, this.uniformNames = e.map(function (t) {\n return "u_" + t + "_t";\n }), this.type = r, this.useIntegerZoom = n, this.zoom = i, this.maxValue = 0, this.paintVertexAttributes = e.map(function (t) {\n return {\n name: "a_" + t,\n type: "Float32",\n components: "color" === r ? 4 : 2,\n offset: 0\n };\n }), this.paintVertexArray = new a();\n };\n\n Ma.prototype.populatePaintArray = function (t, e, r, n, i) {\n var a = this.expression.evaluate(new si(this.zoom), e, {}, n, [], i),\n o = this.expression.evaluate(new si(this.zoom + 1), e, {}, n, [], i),\n s = this.paintVertexArray.length;\n this.paintVertexArray.resize(t), this._setPaintValue(s, t, a, o);\n }, Ma.prototype.updatePaintArray = function (t, e, r, n) {\n var i = this.expression.evaluate({\n zoom: this.zoom\n }, r, n),\n a = this.expression.evaluate({\n zoom: this.zoom + 1\n }, r, n);\n\n this._setPaintValue(t, e, i, a);\n }, Ma.prototype._setPaintValue = function (t, e, r, n) {\n if ("color" === this.type) for (var i = za(r), a = za(n), o = t; o < e; o++) {\n this.paintVertexArray.emplace(o, i[0], i[1], a[0], a[1]);\n } else {\n for (var s = t; s < e; s++) {\n this.paintVertexArray.emplace(s, r, n);\n }\n\n this.maxValue = Math.max(this.maxValue, Math.abs(r), Math.abs(n));\n }\n }, Ma.prototype.upload = function (t) {\n this.paintVertexArray && this.paintVertexArray.arrayBuffer && (this.paintVertexBuffer && this.paintVertexBuffer.buffer ? this.paintVertexBuffer.updateData(this.paintVertexArray) : this.paintVertexBuffer = t.createVertexBuffer(this.paintVertexArray, this.paintVertexAttributes, this.expression.isStateDependent));\n }, Ma.prototype.destroy = function () {\n this.paintVertexBuffer && this.paintVertexBuffer.destroy();\n }, Ma.prototype.setUniform = function (t, e) {\n var r = this.useIntegerZoom ? Math.floor(e.zoom) : e.zoom,\n n = p(this.expression.interpolationFactor(r, this.zoom, this.zoom + 1), 0, 1);\n t.set(n);\n }, Ma.prototype.getBinding = function (t, e, r) {\n return new ba(t, e);\n };\n\n var Ba = function Ba(t, e, r, n, i, a) {\n this.expression = t, this.type = e, this.useIntegerZoom = r, this.zoom = n, this.layerId = a, this.zoomInPaintVertexArray = new i(), this.zoomOutPaintVertexArray = new i();\n };\n\n Ba.prototype.populatePaintArray = function (t, e, r) {\n var n = this.zoomInPaintVertexArray.length;\n this.zoomInPaintVertexArray.resize(t), this.zoomOutPaintVertexArray.resize(t), this._setPaintValues(n, t, e.patterns && e.patterns[this.layerId], r);\n }, Ba.prototype.updatePaintArray = function (t, e, r, n, i) {\n this._setPaintValues(t, e, r.patterns && r.patterns[this.layerId], i);\n }, Ba.prototype._setPaintValues = function (t, e, r, n) {\n if (n && r) {\n var i = n[r.min],\n a = n[r.mid],\n o = n[r.max];\n if (i && a && o) for (var s = t; s < e; s++) {\n this.zoomInPaintVertexArray.emplace(s, a.tl[0], a.tl[1], a.br[0], a.br[1], i.tl[0], i.tl[1], i.br[0], i.br[1], a.pixelRatio, i.pixelRatio), this.zoomOutPaintVertexArray.emplace(s, a.tl[0], a.tl[1], a.br[0], a.br[1], o.tl[0], o.tl[1], o.br[0], o.br[1], a.pixelRatio, o.pixelRatio);\n }\n }\n }, Ba.prototype.upload = function (t) {\n this.zoomInPaintVertexArray && this.zoomInPaintVertexArray.arrayBuffer && this.zoomOutPaintVertexArray && this.zoomOutPaintVertexArray.arrayBuffer && (this.zoomInPaintVertexBuffer = t.createVertexBuffer(this.zoomInPaintVertexArray, la.members, this.expression.isStateDependent), this.zoomOutPaintVertexBuffer = t.createVertexBuffer(this.zoomOutPaintVertexArray, la.members, this.expression.isStateDependent));\n }, Ba.prototype.destroy = function () {\n this.zoomOutPaintVertexBuffer && this.zoomOutPaintVertexBuffer.destroy(), this.zoomInPaintVertexBuffer && this.zoomInPaintVertexBuffer.destroy();\n };\n\n var Ta = function Ta(t, e, r) {\n this.binders = {}, this._buffers = [];\n var n = [];\n\n for (var i in t.paint._values) {\n if (r(i)) {\n var a = t.paint.get(i);\n\n if (a instanceof yi && Tr(a.property.specification)) {\n var o = Fa(i, t.type),\n s = a.value,\n u = a.property.specification.type,\n l = a.property.useIntegerZoom,\n p = a.property.specification["property-type"],\n c = "cross-faded" === p || "cross-faded-data-driven" === p;\n if ("constant" === s.kind) this.binders[i] = c ? new Ea(s.value, o) : new Ca(s.value, o, u), n.push("/u_" + i);else if ("source" === s.kind || c) {\n var h = Da(i, u, "source");\n this.binders[i] = c ? new Ba(s, u, l, e, h, t.id) : new Pa(s, o, u, h), n.push("/a_" + i);\n } else {\n var f = Da(i, u, "composite");\n this.binders[i] = new Ma(s, o, u, l, e, f), n.push("/z_" + i);\n }\n }\n }\n }\n\n this.cacheKey = n.sort().join("");\n };\n\n Ta.prototype.getMaxValue = function (t) {\n var e = this.binders[t];\n return e instanceof Pa || e instanceof Ma ? e.maxValue : 0;\n }, Ta.prototype.populatePaintArrays = function (t, e, r, n, i) {\n for (var a in this.binders) {\n var o = this.binders[a];\n (o instanceof Pa || o instanceof Ma || o instanceof Ba) && o.populatePaintArray(t, e, r, n, i);\n }\n }, Ta.prototype.setConstantPatternPositions = function (t, e) {\n for (var r in this.binders) {\n var n = this.binders[r];\n n instanceof Ea && n.setConstantPatternPositions(t, e);\n }\n }, Ta.prototype.updatePaintArrays = function (t, e, r, n, i) {\n var a = !1;\n\n for (var o in t) {\n for (var s = 0, u = e.getPositions(o); s < u.length; s += 1) {\n var l = u[s],\n p = r.feature(l.index);\n\n for (var c in this.binders) {\n var h = this.binders[c];\n\n if ((h instanceof Pa || h instanceof Ma || h instanceof Ba) && !0 === h.expression.isStateDependent) {\n var f = n.paint.get(c);\n h.expression = f.value, h.updatePaintArray(l.start, l.end, p, t[o], i), a = !0;\n }\n }\n }\n }\n\n return a;\n }, Ta.prototype.defines = function () {\n var t = [];\n\n for (var e in this.binders) {\n var r = this.binders[e];\n (r instanceof Ca || r instanceof Ea) && t.push.apply(t, r.uniformNames.map(function (t) {\n return "#define HAS_UNIFORM_" + t;\n }));\n }\n\n return t;\n }, Ta.prototype.getBinderAttributes = function () {\n var t = [];\n\n for (var e in this.binders) {\n var r = this.binders[e];\n if (r instanceof Pa || r instanceof Ma) for (var n = 0; n < r.paintVertexAttributes.length; n++) {\n t.push(r.paintVertexAttributes[n].name);\n } else if (r instanceof Ba) for (var i = 0; i < la.members.length; i++) {\n t.push(la.members[i].name);\n }\n }\n\n return t;\n }, Ta.prototype.getBinderUniforms = function () {\n var t = [];\n\n for (var e in this.binders) {\n var r = this.binders[e];\n if (r instanceof Ca || r instanceof Ea || r instanceof Ma) for (var n = 0, i = r.uniformNames; n < i.length; n += 1) {\n t.push(i[n]);\n }\n }\n\n return t;\n }, Ta.prototype.getPaintVertexBuffers = function () {\n return this._buffers;\n }, Ta.prototype.getUniforms = function (t, e) {\n var r = [];\n\n for (var n in this.binders) {\n var i = this.binders[n];\n if (i instanceof Ca || i instanceof Ea || i instanceof Ma) for (var a = 0, o = i.uniformNames; a < o.length; a += 1) {\n var s = o[a];\n\n if (e[s]) {\n var u = i.getBinding(t, e[s], s);\n r.push({\n name: s,\n property: n,\n binding: u\n });\n }\n }\n }\n\n return r;\n }, Ta.prototype.setUniforms = function (t, e, r, n) {\n for (var i = 0, a = e; i < a.length; i += 1) {\n var o = a[i],\n s = o.name,\n u = o.property;\n this.binders[u].setUniform(o.binding, n, r.get(u), s);\n }\n }, Ta.prototype.updatePaintBuffers = function (t) {\n for (var e in this._buffers = [], this.binders) {\n var r = this.binders[e];\n\n if (t && r instanceof Ba) {\n var n = 2 === t.fromScale ? r.zoomInPaintVertexBuffer : r.zoomOutPaintVertexBuffer;\n n && this._buffers.push(n);\n } else (r instanceof Pa || r instanceof Ma) && r.paintVertexBuffer && this._buffers.push(r.paintVertexBuffer);\n }\n }, Ta.prototype.upload = function (t) {\n for (var e in this.binders) {\n var r = this.binders[e];\n (r instanceof Pa || r instanceof Ma || r instanceof Ba) && r.upload(t);\n }\n\n this.updatePaintBuffers();\n }, Ta.prototype.destroy = function () {\n for (var t in this.binders) {\n var e = this.binders[t];\n (e instanceof Pa || e instanceof Ma || e instanceof Ba) && e.destroy();\n }\n };\n\n var Va = function Va(t, e, r) {\n void 0 === r && (r = function r() {\n return !0;\n }), this.programConfigurations = {};\n\n for (var n = 0, i = t; n < i.length; n += 1) {\n var a = i[n];\n this.programConfigurations[a.id] = new Ta(a, e, r);\n }\n\n this.needsUpload = !1, this._featureMap = new ya(), this._bufferOffset = 0;\n };\n\n function Fa(t, e) {\n return {\n "text-opacity": ["opacity"],\n "icon-opacity": ["opacity"],\n "text-color": ["fill_color"],\n "icon-color": ["fill_color"],\n "text-halo-color": ["halo_color"],\n "icon-halo-color": ["halo_color"],\n "text-halo-blur": ["halo_blur"],\n "icon-halo-blur": ["halo_blur"],\n "text-halo-width": ["halo_width"],\n "icon-halo-width": ["halo_width"],\n "line-gap-width": ["gapwidth"],\n "line-pattern": ["pattern_to", "pattern_from", "pixel_ratio_to", "pixel_ratio_from"],\n "fill-pattern": ["pattern_to", "pattern_from", "pixel_ratio_to", "pixel_ratio_from"],\n "fill-extrusion-pattern": ["pattern_to", "pattern_from", "pixel_ratio_to", "pixel_ratio_from"]\n }[t] || [t.replace(e + "-", "").replace(/-/g, "_")];\n }\n\n function Da(t, e, r) {\n var n = {\n color: {\n source: Bi,\n composite: Hi\n },\n number: {\n source: Ki,\n composite: Bi\n }\n },\n i = function (t) {\n return {\n "line-pattern": {\n source: Ti,\n composite: Ti\n },\n "fill-pattern": {\n source: Ti,\n composite: Ti\n },\n "fill-extrusion-pattern": {\n source: Ti,\n composite: Ti\n }\n }[t];\n }(t);\n\n return i && i[r] || n[e][r];\n }\n\n Va.prototype.populatePaintArrays = function (t, e, r, n, i, a) {\n for (var o in this.programConfigurations) {\n this.programConfigurations[o].populatePaintArrays(t, e, n, i, a);\n }\n\n void 0 !== e.id && this._featureMap.add(e.id, r, this._bufferOffset, t), this._bufferOffset = t, this.needsUpload = !0;\n }, Va.prototype.updatePaintArrays = function (t, e, r, n) {\n for (var i = 0, a = r; i < a.length; i += 1) {\n var o = a[i];\n this.needsUpload = this.programConfigurations[o.id].updatePaintArrays(t, this._featureMap, e, o, n) || this.needsUpload;\n }\n }, Va.prototype.get = function (t) {\n return this.programConfigurations[t];\n }, Va.prototype.upload = function (t) {\n if (this.needsUpload) {\n for (var e in this.programConfigurations) {\n this.programConfigurations[e].upload(t);\n }\n\n this.needsUpload = !1;\n }\n }, Va.prototype.destroy = function () {\n for (var t in this.programConfigurations) {\n this.programConfigurations[t].destroy();\n }\n }, On("ConstantBinder", Ca), On("CrossFadedConstantBinder", Ea), On("SourceExpressionBinder", Pa), On("CrossFadedCompositeBinder", Ba), On("CompositeExpressionBinder", Ma), On("ProgramConfiguration", Ta, {\n omit: ["_buffers"]\n }), On("ProgramConfigurationSet", Va);\n var La = Math.pow(2, 14) - 1,\n Oa = -La - 1;\n\n function Ra(t) {\n for (var e = 8192 / t.extent, r = t.loadGeometry(), n = 0; n < r.length; n++) {\n for (var i = r[n], a = 0; a < i.length; a++) {\n var o = i[a],\n s = Math.round(o.x * e),\n u = Math.round(o.y * e);\n o.x = p(s, Oa, La), o.y = p(u, Oa, La), (s < o.x || s > o.x + 1 || u < o.y || u > o.y + 1) && A("Geometry exceeds allowed extent, reduce your vector tile buffer size");\n }\n }\n\n return r;\n }\n\n function Ua(t, e) {\n return {\n type: t.type,\n id: t.id,\n properties: t.properties,\n geometry: e ? Ra(t) : []\n };\n }\n\n function ja(t, e, r, n, i) {\n t.emplaceBack(2 * e + (n + 1) / 2, 2 * r + (i + 1) / 2);\n }\n\n var qa = function qa(t) {\n this.zoom = t.zoom, this.overscaling = t.overscaling, this.layers = t.layers, this.layerIds = this.layers.map(function (t) {\n return t.id;\n }), this.index = t.index, this.hasPattern = !1, this.layoutVertexArray = new Ci(), this.indexArray = new ji(), this.segments = new sa(), this.programConfigurations = new Va(t.layers, t.zoom), this.stateDependentLayerIds = this.layers.filter(function (t) {\n return t.isStateDependent();\n }).map(function (t) {\n return t.id;\n });\n };\n\n function Na(t, e) {\n for (var r = 0; r < t.length; r++) {\n if (Wa(e, t[r])) return !0;\n }\n\n for (var n = 0; n < e.length; n++) {\n if (Wa(t, e[n])) return !0;\n }\n\n return !!Xa(t, e);\n }\n\n function Ka(t, e, r) {\n return !!Wa(t, e) || !!Ha(e, t, r);\n }\n\n function Ga(t, e) {\n if (1 === t.length) return $a(e, t[0]);\n\n for (var r = 0; r < e.length; r++) {\n for (var n = e[r], i = 0; i < n.length; i++) {\n if (Wa(t, n[i])) return !0;\n }\n }\n\n for (var a = 0; a < t.length; a++) {\n if ($a(e, t[a])) return !0;\n }\n\n for (var o = 0; o < e.length; o++) {\n if (Xa(t, e[o])) return !0;\n }\n\n return !1;\n }\n\n function Za(t, e, r) {\n if (t.length > 1) {\n if (Xa(t, e)) return !0;\n\n for (var n = 0; n < e.length; n++) {\n if (Ha(e[n], t, r)) return !0;\n }\n }\n\n for (var i = 0; i < t.length; i++) {\n if (Ha(t[i], e, r)) return !0;\n }\n\n return !1;\n }\n\n function Xa(t, e) {\n if (0 === t.length || 0 === e.length) return !1;\n\n for (var r = 0; r < t.length - 1; r++) {\n for (var n = t[r], i = t[r + 1], a = 0; a < e.length - 1; a++) {\n if (Ja(n, i, e[a], e[a + 1])) return !0;\n }\n }\n\n return !1;\n }\n\n function Ja(t, e, r, n) {\n return S(t, r, n) !== S(e, r, n) && S(t, e, r) !== S(t, e, n);\n }\n\n function Ha(t, e, r) {\n var n = r * r;\n if (1 === e.length) return t.distSqr(e[0]) < n;\n\n for (var i = 1; i < e.length; i++) {\n if (Ya(t, e[i - 1], e[i]) < n) return !0;\n }\n\n return !1;\n }\n\n function Ya(t, e, r) {\n var n = e.distSqr(r);\n if (0 === n) return t.distSqr(e);\n var i = ((t.x - e.x) * (r.x - e.x) + (t.y - e.y) * (r.y - e.y)) / n;\n return t.distSqr(i < 0 ? e : i > 1 ? r : r.sub(e)._mult(i)._add(e));\n }\n\n function $a(t, e) {\n for (var r, n, i, a = !1, o = 0; o < t.length; o++) {\n for (var s = 0, u = (r = t[o]).length - 1; s < r.length; u = s++) {\n (n = r[s]).y > e.y != (i = r[u]).y > e.y && e.x < (i.x - n.x) * (e.y - n.y) / (i.y - n.y) + n.x && (a = !a);\n }\n }\n\n return a;\n }\n\n function Wa(t, e) {\n for (var r = !1, n = 0, i = t.length - 1; n < t.length; i = n++) {\n var a = t[n],\n o = t[i];\n a.y > e.y != o.y > e.y && e.x < (o.x - a.x) * (e.y - a.y) / (o.y - a.y) + a.x && (r = !r);\n }\n\n return r;\n }\n\n function Qa(t, e, r) {\n var n = r[0],\n i = r[2];\n if (t.x < n.x && e.x < n.x || t.x > i.x && e.x > i.x || t.y < n.y && e.y < n.y || t.y > i.y && e.y > i.y) return !1;\n var a = S(t, e, r[0]);\n return a !== S(t, e, r[1]) || a !== S(t, e, r[2]) || a !== S(t, e, r[3]);\n }\n\n function to(t, e, r) {\n var n = e.paint.get(t).value;\n return "constant" === n.kind ? n.value : r.programConfigurations.get(e.id).getMaxValue(t);\n }\n\n function eo(t) {\n return Math.sqrt(t[0] * t[0] + t[1] * t[1]);\n }\n\n function ro(t, e, r, n, a) {\n if (!e[0] && !e[1]) return t;\n\n var o = i.convert(e)._mult(a);\n\n "viewport" === r && o._rotate(-n);\n\n for (var s = [], u = 0; u < t.length; u++) {\n s.push(t[u].sub(o));\n }\n\n return s;\n }\n\n qa.prototype.populate = function (t, e, r) {\n var n = this.layers[0],\n i = [],\n a = null;\n "circle" === n.type && (a = n.layout.get("circle-sort-key"));\n\n for (var o = 0, s = t; o < s.length; o += 1) {\n var u = s[o],\n l = u.feature,\n p = u.id,\n c = u.index,\n h = u.sourceLayerIndex,\n f = this.layers[0]._featureFilter.needGeometry,\n y = Ua(l, f);\n\n if (this.layers[0]._featureFilter.filter(new si(this.zoom), y, r)) {\n var d = a ? a.evaluate(y, {}, r) : void 0,\n m = {\n id: p,\n properties: l.properties,\n type: l.type,\n sourceLayerIndex: h,\n index: c,\n geometry: f ? y.geometry : Ra(l),\n patterns: {},\n sortKey: d\n };\n i.push(m);\n }\n }\n\n a && i.sort(function (t, e) {\n return t.sortKey - e.sortKey;\n });\n\n for (var v = 0, g = i; v < g.length; v += 1) {\n var x = g[v],\n b = x.geometry,\n w = x.index,\n _ = x.sourceLayerIndex,\n A = t[w].feature;\n this.addFeature(x, b, w, r), e.featureIndex.insert(A, b, w, _, this.index);\n }\n }, qa.prototype.update = function (t, e, r) {\n this.stateDependentLayers.length && this.programConfigurations.updatePaintArrays(t, e, this.stateDependentLayers, r);\n }, qa.prototype.isEmpty = function () {\n return 0 === this.layoutVertexArray.length;\n }, qa.prototype.uploadPending = function () {\n return !this.uploaded || this.programConfigurations.needsUpload;\n }, qa.prototype.upload = function (t) {\n this.uploaded || (this.layoutVertexBuffer = t.createVertexBuffer(this.layoutVertexArray, oa), this.indexBuffer = t.createIndexBuffer(this.indexArray)), this.programConfigurations.upload(t), this.uploaded = !0;\n }, qa.prototype.destroy = function () {\n this.layoutVertexBuffer && (this.layoutVertexBuffer.destroy(), this.indexBuffer.destroy(), this.programConfigurations.destroy(), this.segments.destroy());\n }, qa.prototype.addFeature = function (t, e, r, n) {\n for (var i = 0, a = e; i < a.length; i += 1) {\n for (var o = 0, s = a[i]; o < s.length; o += 1) {\n var u = s[o],\n l = u.x,\n p = u.y;\n\n if (!(l < 0 || l >= 8192 || p < 0 || p >= 8192)) {\n var c = this.segments.prepareSegment(4, this.layoutVertexArray, this.indexArray, t.sortKey),\n h = c.vertexLength;\n ja(this.layoutVertexArray, l, p, -1, -1), ja(this.layoutVertexArray, l, p, 1, -1), ja(this.layoutVertexArray, l, p, 1, 1), ja(this.layoutVertexArray, l, p, -1, 1), this.indexArray.emplaceBack(h, h + 1, h + 2), this.indexArray.emplaceBack(h, h + 3, h + 2), c.vertexLength += 4, c.primitiveLength += 2;\n }\n }\n }\n\n this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, t, r, {}, n);\n }, On("CircleBucket", qa, {\n omit: ["layers"]\n });\n var no = new wi({\n "circle-sort-key": new vi(Et.layout_circle["circle-sort-key"])\n }),\n io = {\n paint: new wi({\n "circle-radius": new vi(Et.paint_circle["circle-radius"]),\n "circle-color": new vi(Et.paint_circle["circle-color"]),\n "circle-blur": new vi(Et.paint_circle["circle-blur"]),\n "circle-opacity": new vi(Et.paint_circle["circle-opacity"]),\n "circle-translate": new mi(Et.paint_circle["circle-translate"]),\n "circle-translate-anchor": new mi(Et.paint_circle["circle-translate-anchor"]),\n "circle-pitch-scale": new mi(Et.paint_circle["circle-pitch-scale"]),\n "circle-pitch-alignment": new mi(Et.paint_circle["circle-pitch-alignment"]),\n "circle-stroke-width": new vi(Et.paint_circle["circle-stroke-width"]),\n "circle-stroke-color": new vi(Et.paint_circle["circle-stroke-color"]),\n "circle-stroke-opacity": new vi(Et.paint_circle["circle-stroke-opacity"])\n }),\n layout: no\n },\n ao = "undefined" != typeof Float32Array ? Float32Array : Array;\n\n function oo(t) {\n return t[0] = 1, t[1] = 0, t[2] = 0, t[3] = 0, t[4] = 0, t[5] = 1, t[6] = 0, t[7] = 0, t[8] = 0, t[9] = 0, t[10] = 1, t[11] = 0, t[12] = 0, t[13] = 0, t[14] = 0, t[15] = 1, t;\n }\n\n function so(t, e, r) {\n var n = e[0],\n i = e[1],\n a = e[2],\n o = e[3],\n s = e[4],\n u = e[5],\n l = e[6],\n p = e[7],\n c = e[8],\n h = e[9],\n f = e[10],\n y = e[11],\n d = e[12],\n m = e[13],\n v = e[14],\n g = e[15],\n x = r[0],\n b = r[1],\n w = r[2],\n _ = r[3];\n return t[0] = x * n + b * s + w * c + _ * d, t[1] = x * i + b * u + w * h + _ * m, t[2] = x * a + b * l + w * f + _ * v, t[3] = x * o + b * p + w * y + _ * g, t[4] = (x = r[4]) * n + (b = r[5]) * s + (w = r[6]) * c + (_ = r[7]) * d, t[5] = x * i + b * u + w * h + _ * m, t[6] = x * a + b * l + w * f + _ * v, t[7] = x * o + b * p + w * y + _ * g, t[8] = (x = r[8]) * n + (b = r[9]) * s + (w = r[10]) * c + (_ = r[11]) * d, t[9] = x * i + b * u + w * h + _ * m, t[10] = x * a + b * l + w * f + _ * v, t[11] = x * o + b * p + w * y + _ * g, t[12] = (x = r[12]) * n + (b = r[13]) * s + (w = r[14]) * c + (_ = r[15]) * d, t[13] = x * i + b * u + w * h + _ * m, t[14] = x * a + b * l + w * f + _ * v, t[15] = x * o + b * p + w * y + _ * g, t;\n }\n\n Math.hypot || (Math.hypot = function () {\n for (var t = arguments, e = 0, r = arguments.length; r--;) {\n e += t[r] * t[r];\n }\n\n return Math.sqrt(e);\n });\n var uo,\n lo = so;\n\n function po(t, e, r) {\n var n = e[0],\n i = e[1],\n a = e[2],\n o = e[3];\n return t[0] = r[0] * n + r[4] * i + r[8] * a + r[12] * o, t[1] = r[1] * n + r[5] * i + r[9] * a + r[13] * o, t[2] = r[2] * n + r[6] * i + r[10] * a + r[14] * o, t[3] = r[3] * n + r[7] * i + r[11] * a + r[15] * o, t;\n }\n\n uo = new ao(3), ao != Float32Array && (uo[0] = 0, uo[1] = 0, uo[2] = 0), function () {\n var t = new ao(4);\n ao != Float32Array && (t[0] = 0, t[1] = 0, t[2] = 0, t[3] = 0);\n }();\n var co = (function () {\n var t = new ao(2);\n ao != Float32Array && (t[0] = 0, t[1] = 0);\n }(), function (t) {\n function e(e) {\n t.call(this, e, io);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.createBucket = function (t) {\n return new qa(t);\n }, e.prototype.queryRadius = function (t) {\n var e = t;\n return to("circle-radius", this, e) + to("circle-stroke-width", this, e) + eo(this.paint.get("circle-translate"));\n }, e.prototype.queryIntersectsFeature = function (t, e, r, n, i, a, o, s) {\n for (var u = ro(t, this.paint.get("circle-translate"), this.paint.get("circle-translate-anchor"), a.angle, o), l = this.paint.get("circle-radius").evaluate(e, r) + this.paint.get("circle-stroke-width").evaluate(e, r), p = "map" === this.paint.get("circle-pitch-alignment"), c = p ? u : function (t, e) {\n return t.map(function (t) {\n return ho(t, e);\n });\n }(u, s), h = p ? l * o : l, f = 0, y = n; f < y.length; f += 1) {\n for (var d = 0, m = y[f]; d < m.length; d += 1) {\n var v = m[d],\n g = p ? v : ho(v, s),\n x = h,\n b = po([], [v.x, v.y, 0, 1], s);\n if ("viewport" === this.paint.get("circle-pitch-scale") && "map" === this.paint.get("circle-pitch-alignment") ? x *= b[3] / a.cameraToCenterDistance : "map" === this.paint.get("circle-pitch-scale") && "viewport" === this.paint.get("circle-pitch-alignment") && (x *= a.cameraToCenterDistance / b[3]), Ka(c, g, x)) return !0;\n }\n }\n\n return !1;\n }, e;\n }(_i));\n\n function ho(t, e) {\n var r = po([], [t.x, t.y, 0, 1], e);\n return new i(r[0] / r[3], r[1] / r[3]);\n }\n\n var fo = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e;\n }(qa);\n\n function yo(t, e, r, n) {\n var i = e.width,\n a = e.height;\n\n if (n) {\n if (n instanceof Uint8ClampedArray) n = new Uint8Array(n.buffer);else if (n.length !== i * a * r) throw new RangeError("mismatched image size");\n } else n = new Uint8Array(i * a * r);\n\n return t.width = i, t.height = a, t.data = n, t;\n }\n\n function mo(t, e, r) {\n var n = e.width,\n i = e.height;\n\n if (n !== t.width || i !== t.height) {\n var a = yo({}, {\n width: n,\n height: i\n }, r);\n vo(t, a, {\n x: 0,\n y: 0\n }, {\n x: 0,\n y: 0\n }, {\n width: Math.min(t.width, n),\n height: Math.min(t.height, i)\n }, r), t.width = n, t.height = i, t.data = a.data;\n }\n }\n\n function vo(t, e, r, n, i, a) {\n if (0 === i.width || 0 === i.height) return e;\n if (i.width > t.width || i.height > t.height || r.x > t.width - i.width || r.y > t.height - i.height) throw new RangeError("out of range source coordinates for image copy");\n if (i.width > e.width || i.height > e.height || n.x > e.width - i.width || n.y > e.height - i.height) throw new RangeError("out of range destination coordinates for image copy");\n\n for (var o = t.data, s = e.data, u = 0; u < i.height; u++) {\n for (var l = ((r.y + u) * t.width + r.x) * a, p = ((n.y + u) * e.width + n.x) * a, c = 0; c < i.width * a; c++) {\n s[p + c] = o[l + c];\n }\n }\n\n return e;\n }\n\n On("HeatmapBucket", fo, {\n omit: ["layers"]\n });\n\n var go = function go(t, e) {\n yo(this, t, 1, e);\n };\n\n go.prototype.resize = function (t) {\n mo(this, t, 1);\n }, go.prototype.clone = function () {\n return new go({\n width: this.width,\n height: this.height\n }, new Uint8Array(this.data));\n }, go.copy = function (t, e, r, n, i) {\n vo(t, e, r, n, i, 1);\n };\n\n var xo = function xo(t, e) {\n yo(this, t, 4, e);\n };\n\n xo.prototype.resize = function (t) {\n mo(this, t, 4);\n }, xo.prototype.replace = function (t, e) {\n e ? this.data.set(t) : this.data = t instanceof Uint8ClampedArray ? new Uint8Array(t.buffer) : t;\n }, xo.prototype.clone = function () {\n return new xo({\n width: this.width,\n height: this.height\n }, new Uint8Array(this.data));\n }, xo.copy = function (t, e, r, n, i) {\n vo(t, e, r, n, i, 4);\n }, On("AlphaImage", go), On("RGBAImage", xo);\n var bo = {\n paint: new wi({\n "heatmap-radius": new vi(Et.paint_heatmap["heatmap-radius"]),\n "heatmap-weight": new vi(Et.paint_heatmap["heatmap-weight"]),\n "heatmap-intensity": new mi(Et.paint_heatmap["heatmap-intensity"]),\n "heatmap-color": new bi(Et.paint_heatmap["heatmap-color"]),\n "heatmap-opacity": new mi(Et.paint_heatmap["heatmap-opacity"])\n })\n };\n\n function wo(t) {\n var e = {},\n r = t.resolution || 256,\n n = t.clips ? t.clips.length : 1,\n i = t.image || new xo({\n width: r,\n height: n\n }),\n a = function a(r, n, _a2) {\n e[t.evaluationKey] = _a2;\n var o = t.expression.evaluate(e);\n i.data[r + n + 0] = Math.floor(255 * o.r / o.a), i.data[r + n + 1] = Math.floor(255 * o.g / o.a), i.data[r + n + 2] = Math.floor(255 * o.b / o.a), i.data[r + n + 3] = Math.floor(255 * o.a);\n };\n\n if (t.clips) for (var o = 0, s = 0; o < n; ++o, s += 4 * r) {\n for (var u = 0, l = 0; u < r; u++, l += 4) {\n var p = u / (r - 1),\n c = t.clips[o];\n a(s, l, c.start * (1 - p) + c.end * p);\n }\n } else for (var h = 0, f = 0; h < r; h++, f += 4) {\n a(0, f, h / (r - 1));\n }\n return i;\n }\n\n var _o = function (t) {\n function e(e) {\n t.call(this, e, bo), this._updateColorRamp();\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.createBucket = function (t) {\n return new fo(t);\n }, e.prototype._handleSpecialPaintPropertyUpdate = function (t) {\n "heatmap-color" === t && this._updateColorRamp();\n }, e.prototype._updateColorRamp = function () {\n this.colorRamp = wo({\n expression: this._transitionablePaint._values["heatmap-color"].value.expression,\n evaluationKey: "heatmapDensity",\n image: this.colorRamp\n }), this.colorRampTexture = null;\n }, e.prototype.resize = function () {\n this.heatmapFbo && (this.heatmapFbo.destroy(), this.heatmapFbo = null);\n }, e.prototype.queryRadius = function () {\n return 0;\n }, e.prototype.queryIntersectsFeature = function () {\n return !1;\n }, e.prototype.hasOffscreenPass = function () {\n return 0 !== this.paint.get("heatmap-opacity") && "none" !== this.visibility;\n }, e;\n }(_i),\n Ao = {\n paint: new wi({\n "hillshade-illumination-direction": new mi(Et.paint_hillshade["hillshade-illumination-direction"]),\n "hillshade-illumination-anchor": new mi(Et.paint_hillshade["hillshade-illumination-anchor"]),\n "hillshade-exaggeration": new mi(Et.paint_hillshade["hillshade-exaggeration"]),\n "hillshade-shadow-color": new mi(Et.paint_hillshade["hillshade-shadow-color"]),\n "hillshade-highlight-color": new mi(Et.paint_hillshade["hillshade-highlight-color"]),\n "hillshade-accent-color": new mi(Et.paint_hillshade["hillshade-accent-color"])\n })\n },\n So = function (t) {\n function e(e) {\n t.call(this, e, Ao);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.hasOffscreenPass = function () {\n return 0 !== this.paint.get("hillshade-exaggeration") && "none" !== this.visibility;\n }, e;\n }(_i),\n ko = Ii([{\n name: "a_pos",\n components: 2,\n type: "Int16"\n }], 4).members,\n Io = Co,\n zo = Co;\n\n function Co(t, e, r) {\n r = r || 2;\n var n,\n i,\n a,\n o,\n s,\n u,\n l,\n p = e && e.length,\n c = p ? e[0] * r : t.length,\n h = Eo(t, 0, c, r, !0),\n f = [];\n if (!h || h.next === h.prev) return f;\n\n if (p && (h = function (t, e, r, n) {\n var i,\n a,\n o,\n s = [];\n\n for (i = 0, a = e.length; i < a; i++) {\n (o = Eo(t, e[i] * n, i < a - 1 ? e[i + 1] * n : t.length, n, !1)) === o.next && (o.steiner = !0), s.push(Uo(o));\n }\n\n for (s.sort(Do), i = 0; i < s.length; i++) {\n Lo(s[i], r), r = Po(r, r.next);\n }\n\n return r;\n }(t, e, h, r)), t.length > 80 * r) {\n n = a = t[0], i = o = t[1];\n\n for (var y = r; y < c; y += r) {\n (s = t[y]) < n && (n = s), (u = t[y + 1]) < i && (i = u), s > a && (a = s), u > o && (o = u);\n }\n\n l = 0 !== (l = Math.max(a - n, o - i)) ? 1 / l : 0;\n }\n\n return Mo(h, f, r, n, i, l), f;\n }\n\n function Eo(t, e, r, n, i) {\n var a, o;\n if (i === Qo(t, e, r, n) > 0) for (a = e; a < r; a += n) {\n o = Yo(a, t[a], t[a + 1], o);\n } else for (a = r - n; a >= e; a -= n) {\n o = Yo(a, t[a], t[a + 1], o);\n }\n return o && Ko(o, o.next) && ($o(o), o = o.next), o;\n }\n\n function Po(t, e) {\n if (!t) return t;\n e || (e = t);\n var r,\n n = t;\n\n do {\n if (r = !1, n.steiner || !Ko(n, n.next) && 0 !== No(n.prev, n, n.next)) n = n.next;else {\n if ($o(n), (n = e = n.prev) === n.next) break;\n r = !0;\n }\n } while (r || n !== e);\n\n return e;\n }\n\n function Mo(t, e, r, n, i, a, o) {\n if (t) {\n !o && a && function (t, e, r, n) {\n var i = t;\n\n do {\n null === i.z && (i.z = Ro(i.x, i.y, e, r, n)), i.prevZ = i.prev, i.nextZ = i.next, i = i.next;\n } while (i !== t);\n\n i.prevZ.nextZ = null, i.prevZ = null, function (t) {\n var e,\n r,\n n,\n i,\n a,\n o,\n s,\n u,\n l = 1;\n\n do {\n for (r = t, t = null, a = null, o = 0; r;) {\n for (o++, n = r, s = 0, e = 0; e < l && (s++, n = n.nextZ); e++) {\n ;\n }\n\n for (u = l; s > 0 || u > 0 && n;) {\n 0 !== s && (0 === u || !n || r.z <= n.z) ? (i = r, r = r.nextZ, s--) : (i = n, n = n.nextZ, u--), a ? a.nextZ = i : t = i, i.prevZ = a, a = i;\n }\n\n r = n;\n }\n\n a.nextZ = null, l *= 2;\n } while (o > 1);\n }(i);\n }(t, n, i, a);\n\n for (var s, u, l = t; t.prev !== t.next;) {\n if (s = t.prev, u = t.next, a ? To(t, n, i, a) : Bo(t)) e.push(s.i / r), e.push(t.i / r), e.push(u.i / r), $o(t), t = u.next, l = u.next;else if ((t = u) === l) {\n o ? 1 === o ? Mo(t = Vo(Po(t), e, r), e, r, n, i, a, 2) : 2 === o && Fo(t, e, r, n, i, a) : Mo(Po(t), e, r, n, i, a, 1);\n break;\n }\n }\n }\n }\n\n function Bo(t) {\n var e = t.prev,\n r = t,\n n = t.next;\n if (No(e, r, n) >= 0) return !1;\n\n for (var i = t.next.next; i !== t.prev;) {\n if (jo(e.x, e.y, r.x, r.y, n.x, n.y, i.x, i.y) && No(i.prev, i, i.next) >= 0) return !1;\n i = i.next;\n }\n\n return !0;\n }\n\n function To(t, e, r, n) {\n var i = t.prev,\n a = t,\n o = t.next;\n if (No(i, a, o) >= 0) return !1;\n\n for (var s = i.x > a.x ? i.x > o.x ? i.x : o.x : a.x > o.x ? a.x : o.x, u = i.y > a.y ? i.y > o.y ? i.y : o.y : a.y > o.y ? a.y : o.y, l = Ro(i.x < a.x ? i.x < o.x ? i.x : o.x : a.x < o.x ? a.x : o.x, i.y < a.y ? i.y < o.y ? i.y : o.y : a.y < o.y ? a.y : o.y, e, r, n), p = Ro(s, u, e, r, n), c = t.prevZ, h = t.nextZ; c && c.z >= l && h && h.z <= p;) {\n if (c !== t.prev && c !== t.next && jo(i.x, i.y, a.x, a.y, o.x, o.y, c.x, c.y) && No(c.prev, c, c.next) >= 0) return !1;\n if (c = c.prevZ, h !== t.prev && h !== t.next && jo(i.x, i.y, a.x, a.y, o.x, o.y, h.x, h.y) && No(h.prev, h, h.next) >= 0) return !1;\n h = h.nextZ;\n }\n\n for (; c && c.z >= l;) {\n if (c !== t.prev && c !== t.next && jo(i.x, i.y, a.x, a.y, o.x, o.y, c.x, c.y) && No(c.prev, c, c.next) >= 0) return !1;\n c = c.prevZ;\n }\n\n for (; h && h.z <= p;) {\n if (h !== t.prev && h !== t.next && jo(i.x, i.y, a.x, a.y, o.x, o.y, h.x, h.y) && No(h.prev, h, h.next) >= 0) return !1;\n h = h.nextZ;\n }\n\n return !0;\n }\n\n function Vo(t, e, r) {\n var n = t;\n\n do {\n var i = n.prev,\n a = n.next.next;\n !Ko(i, a) && Go(i, n, n.next, a) && Jo(i, a) && Jo(a, i) && (e.push(i.i / r), e.push(n.i / r), e.push(a.i / r), $o(n), $o(n.next), n = t = a), n = n.next;\n } while (n !== t);\n\n return Po(n);\n }\n\n function Fo(t, e, r, n, i, a) {\n var o = t;\n\n do {\n for (var s = o.next.next; s !== o.prev;) {\n if (o.i !== s.i && qo(o, s)) {\n var u = Ho(o, s);\n return o = Po(o, o.next), u = Po(u, u.next), Mo(o, e, r, n, i, a), void Mo(u, e, r, n, i, a);\n }\n\n s = s.next;\n }\n\n o = o.next;\n } while (o !== t);\n }\n\n function Do(t, e) {\n return t.x - e.x;\n }\n\n function Lo(t, e) {\n if (e = function (t, e) {\n var r,\n n = e,\n i = t.x,\n a = t.y,\n o = -1 / 0;\n\n do {\n if (a <= n.y && a >= n.next.y && n.next.y !== n.y) {\n var s = n.x + (a - n.y) * (n.next.x - n.x) / (n.next.y - n.y);\n\n if (s <= i && s > o) {\n if (o = s, s === i) {\n if (a === n.y) return n;\n if (a === n.next.y) return n.next;\n }\n\n r = n.x < n.next.x ? n : n.next;\n }\n }\n\n n = n.next;\n } while (n !== e);\n\n if (!r) return null;\n if (i === o) return r;\n var u,\n l = r,\n p = r.x,\n c = r.y,\n h = 1 / 0;\n n = r;\n\n do {\n i >= n.x && n.x >= p && i !== n.x && jo(a < c ? i : o, a, p, c, a < c ? o : i, a, n.x, n.y) && (u = Math.abs(a - n.y) / (i - n.x), Jo(n, t) && (u < h || u === h && (n.x > r.x || n.x === r.x && Oo(r, n))) && (r = n, h = u)), n = n.next;\n } while (n !== l);\n\n return r;\n }(t, e)) {\n var r = Ho(e, t);\n Po(e, e.next), Po(r, r.next);\n }\n }\n\n function Oo(t, e) {\n return No(t.prev, t, e.prev) < 0 && No(e.next, t, t.next) < 0;\n }\n\n function Ro(t, e, r, n, i) {\n return (t = 1431655765 & ((t = 858993459 & ((t = 252645135 & ((t = 16711935 & ((t = 32767 * (t - r) * i) | t << 8)) | t << 4)) | t << 2)) | t << 1)) | (e = 1431655765 & ((e = 858993459 & ((e = 252645135 & ((e = 16711935 & ((e = 32767 * (e - n) * i) | e << 8)) | e << 4)) | e << 2)) | e << 1)) << 1;\n }\n\n function Uo(t) {\n var e = t,\n r = t;\n\n do {\n (e.x < r.x || e.x === r.x && e.y < r.y) && (r = e), e = e.next;\n } while (e !== t);\n\n return r;\n }\n\n function jo(t, e, r, n, i, a, o, s) {\n return (i - o) * (e - s) - (t - o) * (a - s) >= 0 && (t - o) * (n - s) - (r - o) * (e - s) >= 0 && (r - o) * (a - s) - (i - o) * (n - s) >= 0;\n }\n\n function qo(t, e) {\n return t.next.i !== e.i && t.prev.i !== e.i && !function (t, e) {\n var r = t;\n\n do {\n if (r.i !== t.i && r.next.i !== t.i && r.i !== e.i && r.next.i !== e.i && Go(r, r.next, t, e)) return !0;\n r = r.next;\n } while (r !== t);\n\n return !1;\n }(t, e) && (Jo(t, e) && Jo(e, t) && function (t, e) {\n var r = t,\n n = !1,\n i = (t.x + e.x) / 2,\n a = (t.y + e.y) / 2;\n\n do {\n r.y > a != r.next.y > a && r.next.y !== r.y && i < (r.next.x - r.x) * (a - r.y) / (r.next.y - r.y) + r.x && (n = !n), r = r.next;\n } while (r !== t);\n\n return n;\n }(t, e) && (No(t.prev, t, e.prev) || No(t, e.prev, e)) || Ko(t, e) && No(t.prev, t, t.next) > 0 && No(e.prev, e, e.next) > 0);\n }\n\n function No(t, e, r) {\n return (e.y - t.y) * (r.x - e.x) - (e.x - t.x) * (r.y - e.y);\n }\n\n function Ko(t, e) {\n return t.x === e.x && t.y === e.y;\n }\n\n function Go(t, e, r, n) {\n var i = Xo(No(t, e, r)),\n a = Xo(No(t, e, n)),\n o = Xo(No(r, n, t)),\n s = Xo(No(r, n, e));\n return i !== a && o !== s || !(0 !== i || !Zo(t, r, e)) || !(0 !== a || !Zo(t, n, e)) || !(0 !== o || !Zo(r, t, n)) || !(0 !== s || !Zo(r, e, n));\n }\n\n function Zo(t, e, r) {\n return e.x <= Math.max(t.x, r.x) && e.x >= Math.min(t.x, r.x) && e.y <= Math.max(t.y, r.y) && e.y >= Math.min(t.y, r.y);\n }\n\n function Xo(t) {\n return t > 0 ? 1 : t < 0 ? -1 : 0;\n }\n\n function Jo(t, e) {\n return No(t.prev, t, t.next) < 0 ? No(t, e, t.next) >= 0 && No(t, t.prev, e) >= 0 : No(t, e, t.prev) < 0 || No(t, t.next, e) < 0;\n }\n\n function Ho(t, e) {\n var r = new Wo(t.i, t.x, t.y),\n n = new Wo(e.i, e.x, e.y),\n i = t.next,\n a = e.prev;\n return t.next = e, e.prev = t, r.next = i, i.prev = r, n.next = r, r.prev = n, a.next = n, n.prev = a, n;\n }\n\n function Yo(t, e, r, n) {\n var i = new Wo(t, e, r);\n return n ? (i.next = n.next, i.prev = n, n.next.prev = i, n.next = i) : (i.prev = i, i.next = i), i;\n }\n\n function $o(t) {\n t.next.prev = t.prev, t.prev.next = t.next, t.prevZ && (t.prevZ.nextZ = t.nextZ), t.nextZ && (t.nextZ.prevZ = t.prevZ);\n }\n\n function Wo(t, e, r) {\n this.i = t, this.x = e, this.y = r, this.prev = null, this.next = null, this.z = null, this.prevZ = null, this.nextZ = null, this.steiner = !1;\n }\n\n function Qo(t, e, r, n) {\n for (var i = 0, a = e, o = r - n; a < r; a += n) {\n i += (t[o] - t[a]) * (t[a + 1] + t[o + 1]), o = a;\n }\n\n return i;\n }\n\n function ts(t, e, r, n, i) {\n !function t(e, r, n, i, a) {\n for (; i > n;) {\n if (i - n > 600) {\n var o = i - n + 1,\n s = r - n + 1,\n u = Math.log(o),\n l = .5 * Math.exp(2 * u / 3),\n p = .5 * Math.sqrt(u * l * (o - l) / o) * (s - o / 2 < 0 ? -1 : 1);\n t(e, r, Math.max(n, Math.floor(r - s * l / o + p)), Math.min(i, Math.floor(r + (o - s) * l / o + p)), a);\n }\n\n var c = e[r],\n h = n,\n f = i;\n\n for (es(e, n, r), a(e[i], c) > 0 && es(e, n, i); h < f;) {\n for (es(e, h, f), h++, f--; a(e[h], c) < 0;) {\n h++;\n }\n\n for (; a(e[f], c) > 0;) {\n f--;\n }\n }\n\n 0 === a(e[n], c) ? es(e, n, f) : es(e, ++f, i), f <= r && (n = f + 1), r <= f && (i = f - 1);\n }\n }(t, e, r || 0, n || t.length - 1, i || rs);\n }\n\n function es(t, e, r) {\n var n = t[e];\n t[e] = t[r], t[r] = n;\n }\n\n function rs(t, e) {\n return t < e ? -1 : t > e ? 1 : 0;\n }\n\n function ns(t, e) {\n var r = t.length;\n if (r <= 1) return [t];\n\n for (var n, i, a = [], o = 0; o < r; o++) {\n var s = k(t[o]);\n 0 !== s && (t[o].area = Math.abs(s), void 0 === i && (i = s < 0), i === s < 0 ? (n && a.push(n), n = [t[o]]) : n.push(t[o]));\n }\n\n if (n && a.push(n), e > 1) for (var u = 0; u < a.length; u++) {\n a[u].length <= e || (ts(a[u], e, 1, a[u].length - 1, is), a[u] = a[u].slice(0, e));\n }\n return a;\n }\n\n function is(t, e) {\n return e.area - t.area;\n }\n\n function as(t, e, r) {\n for (var n = r.patternDependencies, i = !1, a = 0, o = e; a < o.length; a += 1) {\n var s = o[a].paint.get(t + "-pattern");\n s.isConstant() || (i = !0);\n var u = s.constantOr(null);\n u && (i = !0, n[u.to] = !0, n[u.from] = !0);\n }\n\n return i;\n }\n\n function os(t, e, r, n, i) {\n for (var a = i.patternDependencies, o = 0, s = e; o < s.length; o += 1) {\n var u = s[o],\n l = u.paint.get(t + "-pattern").value;\n\n if ("constant" !== l.kind) {\n var p = l.evaluate({\n zoom: n - 1\n }, r, {}, i.availableImages),\n c = l.evaluate({\n zoom: n\n }, r, {}, i.availableImages),\n h = l.evaluate({\n zoom: n + 1\n }, r, {}, i.availableImages);\n c = c && c.name ? c.name : c, h = h && h.name ? h.name : h, a[p = p && p.name ? p.name : p] = !0, a[c] = !0, a[h] = !0, r.patterns[u.id] = {\n min: p,\n mid: c,\n max: h\n };\n }\n }\n\n return r;\n }\n\n Co.deviation = function (t, e, r, n) {\n var i = e && e.length,\n a = Math.abs(Qo(t, 0, i ? e[0] * r : t.length, r));\n if (i) for (var o = 0, s = e.length; o < s; o++) {\n a -= Math.abs(Qo(t, e[o] * r, o < s - 1 ? e[o + 1] * r : t.length, r));\n }\n var u = 0;\n\n for (o = 0; o < n.length; o += 3) {\n var l = n[o] * r,\n p = n[o + 1] * r,\n c = n[o + 2] * r;\n u += Math.abs((t[l] - t[c]) * (t[p + 1] - t[l + 1]) - (t[l] - t[p]) * (t[c + 1] - t[l + 1]));\n }\n\n return 0 === a && 0 === u ? 0 : Math.abs((u - a) / a);\n }, Co.flatten = function (t) {\n for (var e = t[0][0].length, r = {\n vertices: [],\n holes: [],\n dimensions: e\n }, n = 0, i = 0; i < t.length; i++) {\n for (var a = 0; a < t[i].length; a++) {\n for (var o = 0; o < e; o++) {\n r.vertices.push(t[i][a][o]);\n }\n }\n\n i > 0 && r.holes.push(n += t[i - 1].length);\n }\n\n return r;\n }, Io.default = zo;\n\n var ss = function ss(t) {\n this.zoom = t.zoom, this.overscaling = t.overscaling, this.layers = t.layers, this.layerIds = this.layers.map(function (t) {\n return t.id;\n }), this.index = t.index, this.hasPattern = !1, this.patternFeatures = [], this.layoutVertexArray = new Ci(), this.indexArray = new ji(), this.indexArray2 = new Xi(), this.programConfigurations = new Va(t.layers, t.zoom), this.segments = new sa(), this.segments2 = new sa(), this.stateDependentLayerIds = this.layers.filter(function (t) {\n return t.isStateDependent();\n }).map(function (t) {\n return t.id;\n });\n };\n\n ss.prototype.populate = function (t, e, r) {\n this.hasPattern = as("fill", this.layers, e);\n\n for (var n = this.layers[0].layout.get("fill-sort-key"), i = [], a = 0, o = t; a < o.length; a += 1) {\n var s = o[a],\n u = s.feature,\n l = s.id,\n p = s.index,\n c = s.sourceLayerIndex,\n h = this.layers[0]._featureFilter.needGeometry,\n f = Ua(u, h);\n\n if (this.layers[0]._featureFilter.filter(new si(this.zoom), f, r)) {\n var y = n ? n.evaluate(f, {}, r, e.availableImages) : void 0,\n d = {\n id: l,\n properties: u.properties,\n type: u.type,\n sourceLayerIndex: c,\n index: p,\n geometry: h ? f.geometry : Ra(u),\n patterns: {},\n sortKey: y\n };\n i.push(d);\n }\n }\n\n n && i.sort(function (t, e) {\n return t.sortKey - e.sortKey;\n });\n\n for (var m = 0, v = i; m < v.length; m += 1) {\n var g = v[m],\n x = g.geometry,\n b = g.index,\n w = g.sourceLayerIndex;\n\n if (this.hasPattern) {\n var _ = os("fill", this.layers, g, this.zoom, e);\n\n this.patternFeatures.push(_);\n } else this.addFeature(g, x, b, r, {});\n\n e.featureIndex.insert(t[b].feature, x, b, w, this.index);\n }\n }, ss.prototype.update = function (t, e, r) {\n this.stateDependentLayers.length && this.programConfigurations.updatePaintArrays(t, e, this.stateDependentLayers, r);\n }, ss.prototype.addFeatures = function (t, e, r) {\n for (var n = 0, i = this.patternFeatures; n < i.length; n += 1) {\n var a = i[n];\n this.addFeature(a, a.geometry, a.index, e, r);\n }\n }, ss.prototype.isEmpty = function () {\n return 0 === this.layoutVertexArray.length;\n }, ss.prototype.uploadPending = function () {\n return !this.uploaded || this.programConfigurations.needsUpload;\n }, ss.prototype.upload = function (t) {\n this.uploaded || (this.layoutVertexBuffer = t.createVertexBuffer(this.layoutVertexArray, ko), this.indexBuffer = t.createIndexBuffer(this.indexArray), this.indexBuffer2 = t.createIndexBuffer(this.indexArray2)), this.programConfigurations.upload(t), this.uploaded = !0;\n }, ss.prototype.destroy = function () {\n this.layoutVertexBuffer && (this.layoutVertexBuffer.destroy(), this.indexBuffer.destroy(), this.indexBuffer2.destroy(), this.programConfigurations.destroy(), this.segments.destroy(), this.segments2.destroy());\n }, ss.prototype.addFeature = function (t, e, r, n, i) {\n for (var a = 0, o = ns(e, 500); a < o.length; a += 1) {\n for (var s = o[a], u = 0, l = 0, p = s; l < p.length; l += 1) {\n u += p[l].length;\n }\n\n for (var c = this.segments.prepareSegment(u, this.layoutVertexArray, this.indexArray), h = c.vertexLength, f = [], y = [], d = 0, m = s; d < m.length; d += 1) {\n var v = m[d];\n\n if (0 !== v.length) {\n v !== s[0] && y.push(f.length / 2);\n var g = this.segments2.prepareSegment(v.length, this.layoutVertexArray, this.indexArray2),\n x = g.vertexLength;\n this.layoutVertexArray.emplaceBack(v[0].x, v[0].y), this.indexArray2.emplaceBack(x + v.length - 1, x), f.push(v[0].x), f.push(v[0].y);\n\n for (var b = 1; b < v.length; b++) {\n this.layoutVertexArray.emplaceBack(v[b].x, v[b].y), this.indexArray2.emplaceBack(x + b - 1, x + b), f.push(v[b].x), f.push(v[b].y);\n }\n\n g.vertexLength += v.length, g.primitiveLength += v.length;\n }\n }\n\n for (var w = Io(f, y), _ = 0; _ < w.length; _ += 3) {\n this.indexArray.emplaceBack(h + w[_], h + w[_ + 1], h + w[_ + 2]);\n }\n\n c.vertexLength += u, c.primitiveLength += w.length / 3;\n }\n\n this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, t, r, i, n);\n }, On("FillBucket", ss, {\n omit: ["layers", "patternFeatures"]\n });\n\n var us = new wi({\n "fill-sort-key": new vi(Et.layout_fill["fill-sort-key"])\n }),\n ls = {\n paint: new wi({\n "fill-antialias": new mi(Et.paint_fill["fill-antialias"]),\n "fill-opacity": new vi(Et.paint_fill["fill-opacity"]),\n "fill-color": new vi(Et.paint_fill["fill-color"]),\n "fill-outline-color": new vi(Et.paint_fill["fill-outline-color"]),\n "fill-translate": new mi(Et.paint_fill["fill-translate"]),\n "fill-translate-anchor": new mi(Et.paint_fill["fill-translate-anchor"]),\n "fill-pattern": new gi(Et.paint_fill["fill-pattern"])\n }),\n layout: us\n },\n ps = function (t) {\n function e(e) {\n t.call(this, e, ls);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.recalculate = function (e, r) {\n t.prototype.recalculate.call(this, e, r);\n var n = this.paint._values["fill-outline-color"];\n "constant" === n.value.kind && void 0 === n.value.value && (this.paint._values["fill-outline-color"] = this.paint._values["fill-color"]);\n }, e.prototype.createBucket = function (t) {\n return new ss(t);\n }, e.prototype.queryRadius = function () {\n return eo(this.paint.get("fill-translate"));\n }, e.prototype.queryIntersectsFeature = function (t, e, r, n, i, a, o) {\n return Ga(ro(t, this.paint.get("fill-translate"), this.paint.get("fill-translate-anchor"), a.angle, o), n);\n }, e.prototype.isTileClipped = function () {\n return !0;\n }, e;\n }(_i),\n cs = Ii([{\n name: "a_pos",\n components: 2,\n type: "Int16"\n }, {\n name: "a_normal_ed",\n components: 4,\n type: "Int16"\n }], 4).members,\n hs = fs;\n\n function fs(t, e, r, n, i) {\n this.properties = {}, this.extent = r, this.type = 0, this._pbf = t, this._geometry = -1, this._keys = n, this._values = i, t.readFields(ys, this, e);\n }\n\n function ys(t, e, r) {\n 1 == t ? e.id = r.readVarint() : 2 == t ? function (t, e) {\n for (var r = t.readVarint() + t.pos; t.pos < r;) {\n var n = e._keys[t.readVarint()],\n i = e._values[t.readVarint()];\n\n e.properties[n] = i;\n }\n }(r, e) : 3 == t ? e.type = r.readVarint() : 4 == t && (e._geometry = r.pos);\n }\n\n function ds(t) {\n for (var e, r, n = 0, i = 0, a = t.length, o = a - 1; i < a; o = i++) {\n n += ((r = t[o]).x - (e = t[i]).x) * (e.y + r.y);\n }\n\n return n;\n }\n\n fs.types = ["Unknown", "Point", "LineString", "Polygon"], fs.prototype.loadGeometry = function () {\n var t = this._pbf;\n t.pos = this._geometry;\n\n for (var e, r = t.readVarint() + t.pos, n = 1, a = 0, o = 0, s = 0, u = []; t.pos < r;) {\n if (a <= 0) {\n var l = t.readVarint();\n n = 7 & l, a = l >> 3;\n }\n\n if (a--, 1 === n || 2 === n) o += t.readSVarint(), s += t.readSVarint(), 1 === n && (e && u.push(e), e = []), e.push(new i(o, s));else {\n if (7 !== n) throw new Error("unknown command " + n);\n e && e.push(e[0].clone());\n }\n }\n\n return e && u.push(e), u;\n }, fs.prototype.bbox = function () {\n var t = this._pbf;\n t.pos = this._geometry;\n\n for (var e = t.readVarint() + t.pos, r = 1, n = 0, i = 0, a = 0, o = 1 / 0, s = -1 / 0, u = 1 / 0, l = -1 / 0; t.pos < e;) {\n if (n <= 0) {\n var p = t.readVarint();\n r = 7 & p, n = p >> 3;\n }\n\n if (n--, 1 === r || 2 === r) (i += t.readSVarint()) < o && (o = i), i > s && (s = i), (a += t.readSVarint()) < u && (u = a), a > l && (l = a);else if (7 !== r) throw new Error("unknown command " + r);\n }\n\n return [o, u, s, l];\n }, fs.prototype.toGeoJSON = function (t, e, r) {\n var n,\n i,\n a = this.extent * Math.pow(2, r),\n o = this.extent * t,\n s = this.extent * e,\n u = this.loadGeometry(),\n l = fs.types[this.type];\n\n function p(t) {\n for (var e = 0; e < t.length; e++) {\n var r = t[e];\n t[e] = [360 * (r.x + o) / a - 180, 360 / Math.PI * Math.atan(Math.exp((180 - 360 * (r.y + s) / a) * Math.PI / 180)) - 90];\n }\n }\n\n switch (this.type) {\n case 1:\n var c = [];\n\n for (n = 0; n < u.length; n++) {\n c[n] = u[n][0];\n }\n\n p(u = c);\n break;\n\n case 2:\n for (n = 0; n < u.length; n++) {\n p(u[n]);\n }\n\n break;\n\n case 3:\n for (u = function (t) {\n var e = t.length;\n if (e <= 1) return [t];\n\n for (var r, n, i = [], a = 0; a < e; a++) {\n var o = ds(t[a]);\n 0 !== o && (void 0 === n && (n = o < 0), n === o < 0 ? (r && i.push(r), r = [t[a]]) : r.push(t[a]));\n }\n\n return r && i.push(r), i;\n }(u), n = 0; n < u.length; n++) {\n for (i = 0; i < u[n].length; i++) {\n p(u[n][i]);\n }\n }\n\n }\n\n 1 === u.length ? u = u[0] : l = "Multi" + l;\n var h = {\n type: "Feature",\n geometry: {\n type: l,\n coordinates: u\n },\n properties: this.properties\n };\n return "id" in this && (h.id = this.id), h;\n };\n var ms = vs;\n\n function vs(t, e) {\n this.version = 1, this.name = null, this.extent = 4096, this.length = 0, this._pbf = t, this._keys = [], this._values = [], this._features = [], t.readFields(gs, this, e), this.length = this._features.length;\n }\n\n function gs(t, e, r) {\n 15 === t ? e.version = r.readVarint() : 1 === t ? e.name = r.readString() : 5 === t ? e.extent = r.readVarint() : 2 === t ? e._features.push(r.pos) : 3 === t ? e._keys.push(r.readString()) : 4 === t && e._values.push(function (t) {\n for (var e = null, r = t.readVarint() + t.pos; t.pos < r;) {\n var n = t.readVarint() >> 3;\n e = 1 === n ? t.readString() : 2 === n ? t.readFloat() : 3 === n ? t.readDouble() : 4 === n ? t.readVarint64() : 5 === n ? t.readVarint() : 6 === n ? t.readSVarint() : 7 === n ? t.readBoolean() : null;\n }\n\n return e;\n }(r));\n }\n\n function xs(t, e, r) {\n if (3 === t) {\n var n = new ms(r, r.readVarint() + r.pos);\n n.length && (e[n.name] = n);\n }\n }\n\n vs.prototype.feature = function (t) {\n if (t < 0 || t >= this._features.length) throw new Error("feature index out of bounds");\n this._pbf.pos = this._features[t];\n\n var e = this._pbf.readVarint() + this._pbf.pos;\n\n return new hs(this._pbf, e, this.extent, this._keys, this._values);\n };\n\n var bs = {\n VectorTile: function VectorTile(t, e) {\n this.layers = t.readFields(xs, {}, e);\n },\n VectorTileFeature: hs,\n VectorTileLayer: ms\n },\n ws = bs.VectorTileFeature.types,\n _s = Math.pow(2, 13);\n\n function As(t, e, r, n, i, a, o, s) {\n t.emplaceBack(e, r, 2 * Math.floor(n * _s) + o, i * _s * 2, a * _s * 2, Math.round(s));\n }\n\n var Ss = function Ss(t) {\n this.zoom = t.zoom, this.overscaling = t.overscaling, this.layers = t.layers, this.layerIds = this.layers.map(function (t) {\n return t.id;\n }), this.index = t.index, this.hasPattern = !1, this.layoutVertexArray = new Pi(), this.indexArray = new ji(), this.programConfigurations = new Va(t.layers, t.zoom), this.segments = new sa(), this.stateDependentLayerIds = this.layers.filter(function (t) {\n return t.isStateDependent();\n }).map(function (t) {\n return t.id;\n });\n };\n\n function ks(t, e) {\n return t.x === e.x && (t.x < 0 || t.x > 8192) || t.y === e.y && (t.y < 0 || t.y > 8192);\n }\n\n Ss.prototype.populate = function (t, e, r) {\n this.features = [], this.hasPattern = as("fill-extrusion", this.layers, e);\n\n for (var n = 0, i = t; n < i.length; n += 1) {\n var a = i[n],\n o = a.feature,\n s = a.id,\n u = a.index,\n l = a.sourceLayerIndex,\n p = this.layers[0]._featureFilter.needGeometry,\n c = Ua(o, p);\n\n if (this.layers[0]._featureFilter.filter(new si(this.zoom), c, r)) {\n var h = {\n id: s,\n sourceLayerIndex: l,\n index: u,\n geometry: p ? c.geometry : Ra(o),\n properties: o.properties,\n type: o.type,\n patterns: {}\n };\n this.hasPattern ? this.features.push(os("fill-extrusion", this.layers, h, this.zoom, e)) : this.addFeature(h, h.geometry, u, r, {}), e.featureIndex.insert(o, h.geometry, u, l, this.index, !0);\n }\n }\n }, Ss.prototype.addFeatures = function (t, e, r) {\n for (var n = 0, i = this.features; n < i.length; n += 1) {\n var a = i[n];\n this.addFeature(a, a.geometry, a.index, e, r);\n }\n }, Ss.prototype.update = function (t, e, r) {\n this.stateDependentLayers.length && this.programConfigurations.updatePaintArrays(t, e, this.stateDependentLayers, r);\n }, Ss.prototype.isEmpty = function () {\n return 0 === this.layoutVertexArray.length;\n }, Ss.prototype.uploadPending = function () {\n return !this.uploaded || this.programConfigurations.needsUpload;\n }, Ss.prototype.upload = function (t) {\n this.uploaded || (this.layoutVertexBuffer = t.createVertexBuffer(this.layoutVertexArray, cs), this.indexBuffer = t.createIndexBuffer(this.indexArray)), this.programConfigurations.upload(t), this.uploaded = !0;\n }, Ss.prototype.destroy = function () {\n this.layoutVertexBuffer && (this.layoutVertexBuffer.destroy(), this.indexBuffer.destroy(), this.programConfigurations.destroy(), this.segments.destroy());\n }, Ss.prototype.addFeature = function (t, e, r, n, i) {\n for (var a = 0, o = ns(e, 500); a < o.length; a += 1) {\n for (var s = o[a], u = 0, l = 0, p = s; l < p.length; l += 1) {\n u += p[l].length;\n }\n\n for (var c = this.segments.prepareSegment(4, this.layoutVertexArray, this.indexArray), h = 0, f = s; h < f.length; h += 1) {\n var y = f[h];\n if (0 !== y.length && !((B = y).every(function (t) {\n return t.x < 0;\n }) || B.every(function (t) {\n return t.x > 8192;\n }) || B.every(function (t) {\n return t.y < 0;\n }) || B.every(function (t) {\n return t.y > 8192;\n }))) for (var d = 0, m = 0; m < y.length; m++) {\n var v = y[m];\n\n if (m >= 1) {\n var g = y[m - 1];\n\n if (!ks(v, g)) {\n c.vertexLength + 4 > sa.MAX_VERTEX_ARRAY_LENGTH && (c = this.segments.prepareSegment(4, this.layoutVertexArray, this.indexArray));\n\n var x = v.sub(g)._perp()._unit(),\n b = g.dist(v);\n\n d + b > 32768 && (d = 0), As(this.layoutVertexArray, v.x, v.y, x.x, x.y, 0, 0, d), As(this.layoutVertexArray, v.x, v.y, x.x, x.y, 0, 1, d), As(this.layoutVertexArray, g.x, g.y, x.x, x.y, 0, 0, d += b), As(this.layoutVertexArray, g.x, g.y, x.x, x.y, 0, 1, d);\n var w = c.vertexLength;\n this.indexArray.emplaceBack(w, w + 2, w + 1), this.indexArray.emplaceBack(w + 1, w + 2, w + 3), c.vertexLength += 4, c.primitiveLength += 2;\n }\n }\n }\n }\n\n if (c.vertexLength + u > sa.MAX_VERTEX_ARRAY_LENGTH && (c = this.segments.prepareSegment(u, this.layoutVertexArray, this.indexArray)), "Polygon" === ws[t.type]) {\n for (var _ = [], A = [], S = c.vertexLength, k = 0, I = s; k < I.length; k += 1) {\n var z = I[k];\n\n if (0 !== z.length) {\n z !== s[0] && A.push(_.length / 2);\n\n for (var C = 0; C < z.length; C++) {\n var E = z[C];\n As(this.layoutVertexArray, E.x, E.y, 0, 0, 1, 1, 0), _.push(E.x), _.push(E.y);\n }\n }\n }\n\n for (var P = Io(_, A), M = 0; M < P.length; M += 3) {\n this.indexArray.emplaceBack(S + P[M], S + P[M + 2], S + P[M + 1]);\n }\n\n c.primitiveLength += P.length / 3, c.vertexLength += u;\n }\n }\n\n var B;\n this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, t, r, i, n);\n }, On("FillExtrusionBucket", Ss, {\n omit: ["layers", "features"]\n });\n\n var Is = {\n paint: new wi({\n "fill-extrusion-opacity": new mi(Et["paint_fill-extrusion"]["fill-extrusion-opacity"]),\n "fill-extrusion-color": new vi(Et["paint_fill-extrusion"]["fill-extrusion-color"]),\n "fill-extrusion-translate": new mi(Et["paint_fill-extrusion"]["fill-extrusion-translate"]),\n "fill-extrusion-translate-anchor": new mi(Et["paint_fill-extrusion"]["fill-extrusion-translate-anchor"]),\n "fill-extrusion-pattern": new gi(Et["paint_fill-extrusion"]["fill-extrusion-pattern"]),\n "fill-extrusion-height": new vi(Et["paint_fill-extrusion"]["fill-extrusion-height"]),\n "fill-extrusion-base": new vi(Et["paint_fill-extrusion"]["fill-extrusion-base"]),\n "fill-extrusion-vertical-gradient": new mi(Et["paint_fill-extrusion"]["fill-extrusion-vertical-gradient"])\n })\n },\n zs = function (t) {\n function e(e) {\n t.call(this, e, Is);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.createBucket = function (t) {\n return new Ss(t);\n }, e.prototype.queryRadius = function () {\n return eo(this.paint.get("fill-extrusion-translate"));\n }, e.prototype.is3D = function () {\n return !0;\n }, e.prototype.queryIntersectsFeature = function (t, e, r, n, a, o, s, u) {\n var l = ro(t, this.paint.get("fill-extrusion-translate"), this.paint.get("fill-extrusion-translate-anchor"), o.angle, s),\n p = this.paint.get("fill-extrusion-height").evaluate(e, r),\n c = this.paint.get("fill-extrusion-base").evaluate(e, r),\n h = function (t, e, r, n) {\n for (var a = [], o = 0, s = t; o < s.length; o += 1) {\n var u = s[o],\n l = [u.x, u.y, 0, 1];\n po(l, l, e), a.push(new i(l[0] / l[3], l[1] / l[3]));\n }\n\n return a;\n }(l, u),\n f = function (t, e, r, n) {\n for (var a = [], o = [], s = n[8] * e, u = n[9] * e, l = n[10] * e, p = n[11] * e, c = n[8] * r, h = n[9] * r, f = n[10] * r, y = n[11] * r, d = 0, m = t; d < m.length; d += 1) {\n for (var v = [], g = [], x = 0, b = m[d]; x < b.length; x += 1) {\n var w = b[x],\n _ = w.x,\n A = w.y,\n S = n[0] * _ + n[4] * A + n[12],\n k = n[1] * _ + n[5] * A + n[13],\n I = n[2] * _ + n[6] * A + n[14],\n z = n[3] * _ + n[7] * A + n[15],\n C = I + l,\n E = z + p,\n P = S + c,\n M = k + h,\n B = I + f,\n T = z + y,\n V = new i((S + s) / E, (k + u) / E);\n V.z = C / E, v.push(V);\n var F = new i(P / T, M / T);\n F.z = B / T, g.push(F);\n }\n\n a.push(v), o.push(g);\n }\n\n return [a, o];\n }(n, c, p, u);\n\n return function (t, e, r) {\n var n = 1 / 0;\n Ga(r, e) && (n = Es(r, e[0]));\n\n for (var i = 0; i < e.length; i++) {\n for (var a = e[i], o = t[i], s = 0; s < a.length - 1; s++) {\n var u = a[s],\n l = [u, a[s + 1], o[s + 1], o[s], u];\n Na(r, l) && (n = Math.min(n, Es(r, l)));\n }\n }\n\n return n !== 1 / 0 && n;\n }(f[0], f[1], h);\n }, e;\n }(_i);\n\n function Cs(t, e) {\n return t.x * e.x + t.y * e.y;\n }\n\n function Es(t, e) {\n if (1 === t.length) {\n for (var r, n = 0, i = e[n++]; !r || i.equals(r);) {\n if (!(r = e[n++])) return 1 / 0;\n }\n\n for (; n < e.length; n++) {\n var a = e[n],\n o = t[0],\n s = r.sub(i),\n u = a.sub(i),\n l = o.sub(i),\n p = Cs(s, s),\n c = Cs(s, u),\n h = Cs(u, u),\n f = Cs(l, s),\n y = Cs(l, u),\n d = p * h - c * c,\n m = (h * f - c * y) / d,\n v = (p * y - c * f) / d,\n g = i.z * (1 - m - v) + r.z * m + a.z * v;\n if (isFinite(g)) return g;\n }\n\n return 1 / 0;\n }\n\n for (var x = 1 / 0, b = 0, w = e; b < w.length; b += 1) {\n x = Math.min(x, w[b].z);\n }\n\n return x;\n }\n\n var Ps = Ii([{\n name: "a_pos_normal",\n components: 2,\n type: "Int16"\n }, {\n name: "a_data",\n components: 4,\n type: "Uint8"\n }], 4).members,\n Ms = Ii([{\n name: "a_uv_x",\n components: 1,\n type: "Float32"\n }, {\n name: "a_split_index",\n components: 1,\n type: "Float32"\n }]).members,\n Bs = bs.VectorTileFeature.types,\n Ts = Math.cos(Math.PI / 180 * 37.5),\n Vs = Math.pow(2, 14) / .5,\n Fs = function Fs(t) {\n var e = this;\n this.zoom = t.zoom, this.overscaling = t.overscaling, this.layers = t.layers, this.layerIds = this.layers.map(function (t) {\n return t.id;\n }), this.index = t.index, this.hasPattern = !1, this.patternFeatures = [], this.lineClipsArray = [], this.gradients = {}, this.layers.forEach(function (t) {\n e.gradients[t.id] = {};\n }), this.layoutVertexArray = new Mi(), this.layoutVertexArray2 = new Bi(), this.indexArray = new ji(), this.programConfigurations = new Va(t.layers, t.zoom), this.segments = new sa(), this.maxLineLength = 0, this.stateDependentLayerIds = this.layers.filter(function (t) {\n return t.isStateDependent();\n }).map(function (t) {\n return t.id;\n });\n };\n\n Fs.prototype.populate = function (t, e, r) {\n this.hasPattern = as("line", this.layers, e);\n\n for (var n = this.layers[0].layout.get("line-sort-key"), i = [], a = 0, o = t; a < o.length; a += 1) {\n var s = o[a],\n u = s.feature,\n l = s.id,\n p = s.index,\n c = s.sourceLayerIndex,\n h = this.layers[0]._featureFilter.needGeometry,\n f = Ua(u, h);\n\n if (this.layers[0]._featureFilter.filter(new si(this.zoom), f, r)) {\n var y = n ? n.evaluate(f, {}, r) : void 0,\n d = {\n id: l,\n properties: u.properties,\n type: u.type,\n sourceLayerIndex: c,\n index: p,\n geometry: h ? f.geometry : Ra(u),\n patterns: {},\n sortKey: y\n };\n i.push(d);\n }\n }\n\n n && i.sort(function (t, e) {\n return t.sortKey - e.sortKey;\n });\n\n for (var m = 0, v = i; m < v.length; m += 1) {\n var g = v[m],\n x = g.geometry,\n b = g.index,\n w = g.sourceLayerIndex;\n\n if (this.hasPattern) {\n var _ = os("line", this.layers, g, this.zoom, e);\n\n this.patternFeatures.push(_);\n } else this.addFeature(g, x, b, r, {});\n\n e.featureIndex.insert(t[b].feature, x, b, w, this.index);\n }\n }, Fs.prototype.update = function (t, e, r) {\n this.stateDependentLayers.length && this.programConfigurations.updatePaintArrays(t, e, this.stateDependentLayers, r);\n }, Fs.prototype.addFeatures = function (t, e, r) {\n for (var n = 0, i = this.patternFeatures; n < i.length; n += 1) {\n var a = i[n];\n this.addFeature(a, a.geometry, a.index, e, r);\n }\n }, Fs.prototype.isEmpty = function () {\n return 0 === this.layoutVertexArray.length;\n }, Fs.prototype.uploadPending = function () {\n return !this.uploaded || this.programConfigurations.needsUpload;\n }, Fs.prototype.upload = function (t) {\n this.uploaded || (0 !== this.layoutVertexArray2.length && (this.layoutVertexBuffer2 = t.createVertexBuffer(this.layoutVertexArray2, Ms)), this.layoutVertexBuffer = t.createVertexBuffer(this.layoutVertexArray, Ps), this.indexBuffer = t.createIndexBuffer(this.indexArray)), this.programConfigurations.upload(t), this.uploaded = !0;\n }, Fs.prototype.destroy = function () {\n this.layoutVertexBuffer && (this.layoutVertexBuffer.destroy(), this.indexBuffer.destroy(), this.programConfigurations.destroy(), this.segments.destroy());\n }, Fs.prototype.lineFeatureClips = function (t) {\n if (t.properties && t.properties.hasOwnProperty("mapbox_clip_start") && t.properties.hasOwnProperty("mapbox_clip_end")) return {\n start: +t.properties.mapbox_clip_start,\n end: +t.properties.mapbox_clip_end\n };\n }, Fs.prototype.addFeature = function (t, e, r, n, i) {\n var a = this.layers[0].layout,\n o = a.get("line-join").evaluate(t, {}),\n s = a.get("line-cap"),\n u = a.get("line-miter-limit"),\n l = a.get("line-round-limit");\n this.lineClips = this.lineFeatureClips(t);\n\n for (var p = 0, c = e; p < c.length; p += 1) {\n this.addLine(c[p], t, o, s, u, l);\n }\n\n this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, t, r, i, n);\n }, Fs.prototype.addLine = function (t, e, r, n, i, a) {\n if (this.distance = 0, this.scaledDistance = 0, this.totalDistance = 0, this.lineClips) {\n this.lineClipsArray.push(this.lineClips);\n\n for (var o = 0; o < t.length - 1; o++) {\n this.totalDistance += t[o].dist(t[o + 1]);\n }\n\n this.updateScaledDistance(), this.maxLineLength = Math.max(this.maxLineLength, this.totalDistance);\n }\n\n for (var s = "Polygon" === Bs[e.type], u = t.length; u >= 2 && t[u - 1].equals(t[u - 2]);) {\n u--;\n }\n\n for (var l = 0; l < u - 1 && t[l].equals(t[l + 1]);) {\n l++;\n }\n\n if (!(u < (s ? 3 : 2))) {\n "bevel" === r && (i = 1.05);\n var p,\n c = this.overscaling <= 16 ? 122880 / (512 * this.overscaling) : 0,\n h = this.segments.prepareSegment(10 * u, this.layoutVertexArray, this.indexArray),\n f = void 0,\n y = void 0,\n d = void 0,\n m = void 0;\n this.e1 = this.e2 = -1, s && (m = t[l].sub(p = t[u - 2])._unit()._perp());\n\n for (var v = l; v < u; v++) {\n if (!(y = v === u - 1 ? s ? t[l + 1] : void 0 : t[v + 1]) || !t[v].equals(y)) {\n m && (d = m), p && (f = p), p = t[v], m = y ? y.sub(p)._unit()._perp() : d;\n var g = (d = d || m).add(m);\n 0 === g.x && 0 === g.y || g._unit();\n\n var x = d.x * m.x + d.y * m.y,\n b = g.x * m.x + g.y * m.y,\n w = 0 !== b ? 1 / b : 1 / 0,\n _ = 2 * Math.sqrt(2 - 2 * b),\n A = b < Ts && f && y,\n S = d.x * m.y - d.y * m.x > 0;\n\n if (A && v > l) {\n var k = p.dist(f);\n\n if (k > 2 * c) {\n var I = p.sub(p.sub(f)._mult(c / k)._round());\n this.updateDistance(f, I), this.addCurrentVertex(I, d, 0, 0, h), f = I;\n }\n }\n\n var z = f && y,\n C = z ? r : s ? "butt" : n;\n if (z && "round" === C && (w < a ? C = "miter" : w <= 2 && (C = "fakeround")), "miter" === C && w > i && (C = "bevel"), "bevel" === C && (w > 2 && (C = "flipbevel"), w < i && (C = "miter")), f && this.updateDistance(f, p), "miter" === C) g._mult(w), this.addCurrentVertex(p, g, 0, 0, h);else if ("flipbevel" === C) {\n if (w > 100) g = m.mult(-1);else {\n var E = w * d.add(m).mag() / d.sub(m).mag();\n\n g._perp()._mult(E * (S ? -1 : 1));\n }\n this.addCurrentVertex(p, g, 0, 0, h), this.addCurrentVertex(p, g.mult(-1), 0, 0, h);\n } else if ("bevel" === C || "fakeround" === C) {\n var P = -Math.sqrt(w * w - 1),\n M = S ? P : 0,\n B = S ? 0 : P;\n if (f && this.addCurrentVertex(p, d, M, B, h), "fakeround" === C) for (var T = Math.round(180 * _ / Math.PI / 20), V = 1; V < T; V++) {\n var F = V / T;\n\n if (.5 !== F) {\n var D = F - .5;\n F += F * D * (F - 1) * ((1.0904 + x * (x * (3.55645 - 1.43519 * x) - 3.2452)) * D * D + (.848013 + x * (.215638 * x - 1.06021)));\n }\n\n var L = m.sub(d)._mult(F)._add(d)._unit()._mult(S ? -1 : 1);\n\n this.addHalfVertex(p, L.x, L.y, !1, S, 0, h);\n }\n y && this.addCurrentVertex(p, m, -M, -B, h);\n } else if ("butt" === C) this.addCurrentVertex(p, g, 0, 0, h);else if ("square" === C) {\n var O = f ? 1 : -1;\n this.addCurrentVertex(p, g, O, O, h);\n } else "round" === C && (f && (this.addCurrentVertex(p, d, 0, 0, h), this.addCurrentVertex(p, d, 1, 1, h, !0)), y && (this.addCurrentVertex(p, m, -1, -1, h, !0), this.addCurrentVertex(p, m, 0, 0, h)));\n\n if (A && v < u - 1) {\n var R = p.dist(y);\n\n if (R > 2 * c) {\n var U = p.add(y.sub(p)._mult(c / R)._round());\n this.updateDistance(p, U), this.addCurrentVertex(U, m, 0, 0, h), p = U;\n }\n }\n }\n }\n }\n }, Fs.prototype.addCurrentVertex = function (t, e, r, n, i, a) {\n void 0 === a && (a = !1);\n var o = e.y * n - e.x,\n s = -e.y - e.x * n;\n this.addHalfVertex(t, e.x + e.y * r, e.y - e.x * r, a, !1, r, i), this.addHalfVertex(t, o, s, a, !0, -n, i), this.distance > Vs / 2 && 0 === this.totalDistance && (this.distance = 0, this.addCurrentVertex(t, e, r, n, i, a));\n }, Fs.prototype.addHalfVertex = function (t, e, r, n, i, a, o) {\n var s = .5 * (this.lineClips ? this.scaledDistance * (Vs - 1) : this.scaledDistance);\n this.layoutVertexArray.emplaceBack((t.x << 1) + (n ? 1 : 0), (t.y << 1) + (i ? 1 : 0), Math.round(63 * e) + 128, Math.round(63 * r) + 128, 1 + (0 === a ? 0 : a < 0 ? -1 : 1) | (63 & s) << 2, s >> 6), this.lineClips && this.layoutVertexArray2.emplaceBack((this.scaledDistance - this.lineClips.start) / (this.lineClips.end - this.lineClips.start), this.lineClipsArray.length);\n var u = o.vertexLength++;\n this.e1 >= 0 && this.e2 >= 0 && (this.indexArray.emplaceBack(this.e1, this.e2, u), o.primitiveLength++), i ? this.e2 = u : this.e1 = u;\n }, Fs.prototype.updateScaledDistance = function () {\n this.scaledDistance = this.lineClips ? this.lineClips.start + (this.lineClips.end - this.lineClips.start) * this.distance / this.totalDistance : this.distance;\n }, Fs.prototype.updateDistance = function (t, e) {\n this.distance += t.dist(e), this.updateScaledDistance();\n }, On("LineBucket", Fs, {\n omit: ["layers", "patternFeatures"]\n });\n var Ds = new wi({\n "line-cap": new mi(Et.layout_line["line-cap"]),\n "line-join": new vi(Et.layout_line["line-join"]),\n "line-miter-limit": new mi(Et.layout_line["line-miter-limit"]),\n "line-round-limit": new mi(Et.layout_line["line-round-limit"]),\n "line-sort-key": new vi(Et.layout_line["line-sort-key"])\n }),\n Ls = {\n paint: new wi({\n "line-opacity": new vi(Et.paint_line["line-opacity"]),\n "line-color": new vi(Et.paint_line["line-color"]),\n "line-translate": new mi(Et.paint_line["line-translate"]),\n "line-translate-anchor": new mi(Et.paint_line["line-translate-anchor"]),\n "line-width": new vi(Et.paint_line["line-width"]),\n "line-gap-width": new vi(Et.paint_line["line-gap-width"]),\n "line-offset": new vi(Et.paint_line["line-offset"]),\n "line-blur": new vi(Et.paint_line["line-blur"]),\n "line-dasharray": new xi(Et.paint_line["line-dasharray"]),\n "line-pattern": new gi(Et.paint_line["line-pattern"]),\n "line-gradient": new bi(Et.paint_line["line-gradient"])\n }),\n layout: Ds\n },\n Os = new (function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.possiblyEvaluate = function (e, r) {\n return r = new si(Math.floor(r.zoom), {\n now: r.now,\n fadeDuration: r.fadeDuration,\n zoomHistory: r.zoomHistory,\n transition: r.transition\n }), t.prototype.possiblyEvaluate.call(this, e, r);\n }, e.prototype.evaluate = function (e, r, n, i) {\n return r = h({}, r, {\n zoom: Math.floor(r.zoom)\n }), t.prototype.evaluate.call(this, e, r, n, i);\n }, e;\n }(vi))(Ls.paint.properties["line-width"].specification);\n Os.useIntegerZoom = !0;\n\n var Rs = function (t) {\n function e(e) {\n t.call(this, e, Ls), this.gradientVersion = 0;\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._handleSpecialPaintPropertyUpdate = function (t) {\n "line-gradient" === t && (this.stepInterpolant = this._transitionablePaint._values["line-gradient"].value.expression._styleExpression.expression instanceof Ne, this.gradientVersion = (this.gradientVersion + 1) % s);\n }, e.prototype.gradientExpression = function () {\n return this._transitionablePaint._values["line-gradient"].value.expression;\n }, e.prototype.recalculate = function (e, r) {\n t.prototype.recalculate.call(this, e, r), this.paint._values["line-floorwidth"] = Os.possiblyEvaluate(this._transitioningPaint._values["line-width"].value, e);\n }, e.prototype.createBucket = function (t) {\n return new Fs(t);\n }, e.prototype.queryRadius = function (t) {\n var e = t,\n r = Us(to("line-width", this, e), to("line-gap-width", this, e)),\n n = to("line-offset", this, e);\n return r / 2 + Math.abs(n) + eo(this.paint.get("line-translate"));\n }, e.prototype.queryIntersectsFeature = function (t, e, r, n, a, o, s) {\n var u = ro(t, this.paint.get("line-translate"), this.paint.get("line-translate-anchor"), o.angle, s),\n l = s / 2 * Us(this.paint.get("line-width").evaluate(e, r), this.paint.get("line-gap-width").evaluate(e, r)),\n p = this.paint.get("line-offset").evaluate(e, r);\n return p && (n = function (t, e) {\n for (var r = [], n = new i(0, 0), a = 0; a < t.length; a++) {\n for (var o = t[a], s = [], u = 0; u < o.length; u++) {\n var l = o[u],\n p = o[u + 1],\n c = 0 === u ? n : l.sub(o[u - 1])._unit()._perp(),\n h = u === o.length - 1 ? n : p.sub(l)._unit()._perp(),\n f = c._add(h)._unit();\n\n f._mult(1 / (f.x * h.x + f.y * h.y)), s.push(f._mult(e)._add(l));\n }\n\n r.push(s);\n }\n\n return r;\n }(n, p * s)), function (t, e, r) {\n for (var n = 0; n < e.length; n++) {\n var i = e[n];\n if (t.length >= 3) for (var a = 0; a < i.length; a++) {\n if (Wa(t, i[a])) return !0;\n }\n if (Za(t, i, r)) return !0;\n }\n\n return !1;\n }(u, n, l);\n }, e.prototype.isTileClipped = function () {\n return !0;\n }, e;\n }(_i);\n\n function Us(t, e) {\n return e > 0 ? e + 2 * t : t;\n }\n\n var js = Ii([{\n name: "a_pos_offset",\n components: 4,\n type: "Int16"\n }, {\n name: "a_data",\n components: 4,\n type: "Uint16"\n }, {\n name: "a_pixeloffset",\n components: 4,\n type: "Int16"\n }], 4),\n qs = Ii([{\n name: "a_projected_pos",\n components: 3,\n type: "Float32"\n }], 4),\n Ns = (Ii([{\n name: "a_fade_opacity",\n components: 1,\n type: "Uint32"\n }], 4), Ii([{\n name: "a_placed",\n components: 2,\n type: "Uint8"\n }, {\n name: "a_shift",\n components: 2,\n type: "Float32"\n }])),\n Ks = (Ii([{\n type: "Int16",\n name: "anchorPointX"\n }, {\n type: "Int16",\n name: "anchorPointY"\n }, {\n type: "Int16",\n name: "x1"\n }, {\n type: "Int16",\n name: "y1"\n }, {\n type: "Int16",\n name: "x2"\n }, {\n type: "Int16",\n name: "y2"\n }, {\n type: "Uint32",\n name: "featureIndex"\n }, {\n type: "Uint16",\n name: "sourceLayerIndex"\n }, {\n type: "Uint16",\n name: "bucketIndex"\n }]), Ii([{\n name: "a_pos",\n components: 2,\n type: "Int16"\n }, {\n name: "a_anchor_pos",\n components: 2,\n type: "Int16"\n }, {\n name: "a_extrude",\n components: 2,\n type: "Int16"\n }], 4)),\n Gs = Ii([{\n name: "a_pos",\n components: 2,\n type: "Float32"\n }, {\n name: "a_radius",\n components: 1,\n type: "Float32"\n }, {\n name: "a_flags",\n components: 2,\n type: "Int16"\n }], 4);\n\n function Zs(t, e, r) {\n return t.sections.forEach(function (t) {\n t.text = function (t, e, r) {\n var n = e.layout.get("text-transform").evaluate(r, {});\n return "uppercase" === n ? t = t.toLocaleUpperCase() : "lowercase" === n && (t = t.toLocaleLowerCase()), oi.applyArabicShaping && (t = oi.applyArabicShaping(t)), t;\n }(t.text, e, r);\n }), t;\n }\n\n Ii([{\n name: "triangle",\n components: 3,\n type: "Uint16"\n }]), Ii([{\n type: "Int16",\n name: "anchorX"\n }, {\n type: "Int16",\n name: "anchorY"\n }, {\n type: "Uint16",\n name: "glyphStartIndex"\n }, {\n type: "Uint16",\n name: "numGlyphs"\n }, {\n type: "Uint32",\n name: "vertexStartIndex"\n }, {\n type: "Uint32",\n name: "lineStartIndex"\n }, {\n type: "Uint32",\n name: "lineLength"\n }, {\n type: "Uint16",\n name: "segment"\n }, {\n type: "Uint16",\n name: "lowerSize"\n }, {\n type: "Uint16",\n name: "upperSize"\n }, {\n type: "Float32",\n name: "lineOffsetX"\n }, {\n type: "Float32",\n name: "lineOffsetY"\n }, {\n type: "Uint8",\n name: "writingMode"\n }, {\n type: "Uint8",\n name: "placedOrientation"\n }, {\n type: "Uint8",\n name: "hidden"\n }, {\n type: "Uint32",\n name: "crossTileID"\n }, {\n type: "Int16",\n name: "associatedIconIndex"\n }]), Ii([{\n type: "Int16",\n name: "anchorX"\n }, {\n type: "Int16",\n name: "anchorY"\n }, {\n type: "Int16",\n name: "rightJustifiedTextSymbolIndex"\n }, {\n type: "Int16",\n name: "centerJustifiedTextSymbolIndex"\n }, {\n type: "Int16",\n name: "leftJustifiedTextSymbolIndex"\n }, {\n type: "Int16",\n name: "verticalPlacedTextSymbolIndex"\n }, {\n type: "Int16",\n name: "placedIconSymbolIndex"\n }, {\n type: "Int16",\n name: "verticalPlacedIconSymbolIndex"\n }, {\n type: "Uint16",\n name: "key"\n }, {\n type: "Uint16",\n name: "textBoxStartIndex"\n }, {\n type: "Uint16",\n name: "textBoxEndIndex"\n }, {\n type: "Uint16",\n name: "verticalTextBoxStartIndex"\n }, {\n type: "Uint16",\n name: "verticalTextBoxEndIndex"\n }, {\n type: "Uint16",\n name: "iconBoxStartIndex"\n }, {\n type: "Uint16",\n name: "iconBoxEndIndex"\n }, {\n type: "Uint16",\n name: "verticalIconBoxStartIndex"\n }, {\n type: "Uint16",\n name: "verticalIconBoxEndIndex"\n }, {\n type: "Uint16",\n name: "featureIndex"\n }, {\n type: "Uint16",\n name: "numHorizontalGlyphVertices"\n }, {\n type: "Uint16",\n name: "numVerticalGlyphVertices"\n }, {\n type: "Uint16",\n name: "numIconVertices"\n }, {\n type: "Uint16",\n name: "numVerticalIconVertices"\n }, {\n type: "Uint16",\n name: "useRuntimeCollisionCircles"\n }, {\n type: "Uint32",\n name: "crossTileID"\n }, {\n type: "Float32",\n name: "textBoxScale"\n }, {\n type: "Float32",\n components: 2,\n name: "textOffset"\n }, {\n type: "Float32",\n name: "collisionCircleDiameter"\n }]), Ii([{\n type: "Float32",\n name: "offsetX"\n }]), Ii([{\n type: "Int16",\n name: "x"\n }, {\n type: "Int16",\n name: "y"\n }, {\n type: "Int16",\n name: "tileUnitDistanceFromAnchor"\n }]);\n\n var Xs = {\n "!": "︕",\n "#": "#",\n $: "$",\n "%": "%",\n "&": "&",\n "(": "︵",\n ")": "︶",\n "*": "*",\n "+": "+",\n ",": "︐",\n "-": "︲",\n ".": "・",\n "/": "/",\n ":": "︓",\n ";": "︔",\n "<": "︿",\n "=": "=",\n ">": "﹀",\n "?": "︖",\n "@": "@",\n "[": "﹇",\n "\\\\": "\",\n "]": "﹈",\n "^": "^",\n _: "︳",\n "`": "`",\n "{": "︷",\n "|": "―",\n "}": "︸",\n "~": "~",\n "¢": "¢",\n "£": "£",\n "¥": "¥",\n "¦": "¦",\n "¬": "¬",\n "¯": " ̄",\n "–": "︲",\n "—": "︱",\n "‘": "﹃",\n "’": "﹄",\n "“": "﹁",\n "”": "﹂",\n "…": "︙",\n "‧": "・",\n "₩": "₩",\n "、": "︑",\n "。": "︒",\n "〈": "︿",\n "〉": "﹀",\n "《": "︽",\n "》": "︾",\n "「": "﹁",\n "」": "﹂",\n "『": "﹃",\n "』": "﹄",\n "【": "︻",\n "】": "︼",\n "〔": "︹",\n "〕": "︺",\n "〖": "︗",\n "〗": "︘",\n "!": "︕",\n "(": "︵",\n ")": "︶",\n ",": "︐",\n "-": "︲",\n ".": "・",\n ":": "︓",\n ";": "︔",\n "<": "︿",\n ">": "﹀",\n "?": "︖",\n "[": "﹇",\n "]": "﹈",\n "_": "︳",\n "{": "︷",\n "|": "―",\n "}": "︸",\n "⦅": "︵",\n "⦆": "︶",\n "。": "︒",\n "「": "﹁",\n "」": "﹂"\n },\n Js = function Js(t, e, r, n, i) {\n var a,\n o,\n s = 8 * i - n - 1,\n u = (1 << s) - 1,\n l = u >> 1,\n p = -7,\n c = r ? i - 1 : 0,\n h = r ? -1 : 1,\n f = t[e + c];\n\n for (c += h, a = f & (1 << -p) - 1, f >>= -p, p += s; p > 0; a = 256 * a + t[e + c], c += h, p -= 8) {\n ;\n }\n\n for (o = a & (1 << -p) - 1, a >>= -p, p += n; p > 0; o = 256 * o + t[e + c], c += h, p -= 8) {\n ;\n }\n\n if (0 === a) a = 1 - l;else {\n if (a === u) return o ? NaN : 1 / 0 * (f ? -1 : 1);\n o += Math.pow(2, n), a -= l;\n }\n return (f ? -1 : 1) * o * Math.pow(2, a - n);\n },\n Hs = function Hs(t, e, r, n, i, a) {\n var o,\n s,\n u,\n l = 8 * a - i - 1,\n p = (1 << l) - 1,\n c = p >> 1,\n h = 23 === i ? Math.pow(2, -24) - Math.pow(2, -77) : 0,\n f = n ? 0 : a - 1,\n y = n ? 1 : -1,\n d = e < 0 || 0 === e && 1 / e < 0 ? 1 : 0;\n\n for (e = Math.abs(e), isNaN(e) || e === 1 / 0 ? (s = isNaN(e) ? 1 : 0, o = p) : (o = Math.floor(Math.log(e) / Math.LN2), e * (u = Math.pow(2, -o)) < 1 && (o--, u *= 2), (e += o + c >= 1 ? h / u : h * Math.pow(2, 1 - c)) * u >= 2 && (o++, u /= 2), o + c >= p ? (s = 0, o = p) : o + c >= 1 ? (s = (e * u - 1) * Math.pow(2, i), o += c) : (s = e * Math.pow(2, c - 1) * Math.pow(2, i), o = 0)); i >= 8; t[r + f] = 255 & s, f += y, s /= 256, i -= 8) {\n ;\n }\n\n for (o = o << i | s, l += i; l > 0; t[r + f] = 255 & o, f += y, o /= 256, l -= 8) {\n ;\n }\n\n t[r + f - y] |= 128 * d;\n },\n Ys = $s;\n\n function $s(t) {\n this.buf = ArrayBuffer.isView && ArrayBuffer.isView(t) ? t : new Uint8Array(t || 0), this.pos = 0, this.type = 0, this.length = this.buf.length;\n }\n\n $s.Varint = 0, $s.Fixed64 = 1, $s.Bytes = 2, $s.Fixed32 = 5;\n var Ws = "undefined" == typeof TextDecoder ? null : new TextDecoder("utf8");\n\n function Qs(t) {\n return t.type === $s.Bytes ? t.readVarint() + t.pos : t.pos + 1;\n }\n\n function tu(t, e, r) {\n return r ? 4294967296 * e + (t >>> 0) : 4294967296 * (e >>> 0) + (t >>> 0);\n }\n\n function eu(t, e, r) {\n var n = e <= 16383 ? 1 : e <= 2097151 ? 2 : e <= 268435455 ? 3 : Math.floor(Math.log(e) / (7 * Math.LN2));\n r.realloc(n);\n\n for (var i = r.pos - 1; i >= t; i--) {\n r.buf[i + n] = r.buf[i];\n }\n }\n\n function ru(t, e) {\n for (var r = 0; r < t.length; r++) {\n e.writeVarint(t[r]);\n }\n }\n\n function nu(t, e) {\n for (var r = 0; r < t.length; r++) {\n e.writeSVarint(t[r]);\n }\n }\n\n function iu(t, e) {\n for (var r = 0; r < t.length; r++) {\n e.writeFloat(t[r]);\n }\n }\n\n function au(t, e) {\n for (var r = 0; r < t.length; r++) {\n e.writeDouble(t[r]);\n }\n }\n\n function ou(t, e) {\n for (var r = 0; r < t.length; r++) {\n e.writeBoolean(t[r]);\n }\n }\n\n function su(t, e) {\n for (var r = 0; r < t.length; r++) {\n e.writeFixed32(t[r]);\n }\n }\n\n function uu(t, e) {\n for (var r = 0; r < t.length; r++) {\n e.writeSFixed32(t[r]);\n }\n }\n\n function lu(t, e) {\n for (var r = 0; r < t.length; r++) {\n e.writeFixed64(t[r]);\n }\n }\n\n function pu(t, e) {\n for (var r = 0; r < t.length; r++) {\n e.writeSFixed64(t[r]);\n }\n }\n\n function cu(t, e) {\n return (t[e] | t[e + 1] << 8 | t[e + 2] << 16) + 16777216 * t[e + 3];\n }\n\n function hu(t, e, r) {\n t[r] = e, t[r + 1] = e >>> 8, t[r + 2] = e >>> 16, t[r + 3] = e >>> 24;\n }\n\n function fu(t, e) {\n return (t[e] | t[e + 1] << 8 | t[e + 2] << 16) + (t[e + 3] << 24);\n }\n\n function yu(t, e, r) {\n 1 === t && r.readMessage(du, e);\n }\n\n function du(t, e, r) {\n if (3 === t) {\n var n = r.readMessage(mu, {}),\n i = n.width,\n a = n.height,\n o = n.left,\n s = n.top,\n u = n.advance;\n e.push({\n id: n.id,\n bitmap: new go({\n width: i + 6,\n height: a + 6\n }, n.bitmap),\n metrics: {\n width: i,\n height: a,\n left: o,\n top: s,\n advance: u\n }\n });\n }\n }\n\n function mu(t, e, r) {\n 1 === t ? e.id = r.readVarint() : 2 === t ? e.bitmap = r.readBytes() : 3 === t ? e.width = r.readVarint() : 4 === t ? e.height = r.readVarint() : 5 === t ? e.left = r.readSVarint() : 6 === t ? e.top = r.readSVarint() : 7 === t && (e.advance = r.readVarint());\n }\n\n function vu(t) {\n for (var e = 0, r = 0, n = 0, i = t; n < i.length; n += 1) {\n var a = i[n];\n e += a.w * a.h, r = Math.max(r, a.w);\n }\n\n t.sort(function (t, e) {\n return e.h - t.h;\n });\n\n for (var o = [{\n x: 0,\n y: 0,\n w: Math.max(Math.ceil(Math.sqrt(e / .95)), r),\n h: 1 / 0\n }], s = 0, u = 0, l = 0, p = t; l < p.length; l += 1) {\n for (var c = p[l], h = o.length - 1; h >= 0; h--) {\n var f = o[h];\n\n if (!(c.w > f.w || c.h > f.h)) {\n if (c.x = f.x, c.y = f.y, u = Math.max(u, c.y + c.h), s = Math.max(s, c.x + c.w), c.w === f.w && c.h === f.h) {\n var y = o.pop();\n h < o.length && (o[h] = y);\n } else c.h === f.h ? (f.x += c.w, f.w -= c.w) : c.w === f.w ? (f.y += c.h, f.h -= c.h) : (o.push({\n x: f.x + c.w,\n y: f.y,\n w: f.w - c.w,\n h: c.h\n }), f.y += c.h, f.h -= c.h);\n\n break;\n }\n }\n }\n\n return {\n w: s,\n h: u,\n fill: e / (s * u) || 0\n };\n }\n\n $s.prototype = {\n destroy: function destroy() {\n this.buf = null;\n },\n readFields: function readFields(t, e, r) {\n for (r = r || this.length; this.pos < r;) {\n var n = this.readVarint(),\n i = n >> 3,\n a = this.pos;\n this.type = 7 & n, t(i, e, this), this.pos === a && this.skip(n);\n }\n\n return e;\n },\n readMessage: function readMessage(t, e) {\n return this.readFields(t, e, this.readVarint() + this.pos);\n },\n readFixed32: function readFixed32() {\n var t = cu(this.buf, this.pos);\n return this.pos += 4, t;\n },\n readSFixed32: function readSFixed32() {\n var t = fu(this.buf, this.pos);\n return this.pos += 4, t;\n },\n readFixed64: function readFixed64() {\n var t = cu(this.buf, this.pos) + 4294967296 * cu(this.buf, this.pos + 4);\n return this.pos += 8, t;\n },\n readSFixed64: function readSFixed64() {\n var t = cu(this.buf, this.pos) + 4294967296 * fu(this.buf, this.pos + 4);\n return this.pos += 8, t;\n },\n readFloat: function readFloat() {\n var t = Js(this.buf, this.pos, !0, 23, 4);\n return this.pos += 4, t;\n },\n readDouble: function readDouble() {\n var t = Js(this.buf, this.pos, !0, 52, 8);\n return this.pos += 8, t;\n },\n readVarint: function readVarint(t) {\n var e,\n r,\n n = this.buf;\n return e = 127 & (r = n[this.pos++]), r < 128 ? e : (e |= (127 & (r = n[this.pos++])) << 7, r < 128 ? e : (e |= (127 & (r = n[this.pos++])) << 14, r < 128 ? e : (e |= (127 & (r = n[this.pos++])) << 21, r < 128 ? e : function (t, e, r) {\n var n,\n i,\n a = r.buf;\n if (n = (112 & (i = a[r.pos++])) >> 4, i < 128) return tu(t, n, e);\n if (n |= (127 & (i = a[r.pos++])) << 3, i < 128) return tu(t, n, e);\n if (n |= (127 & (i = a[r.pos++])) << 10, i < 128) return tu(t, n, e);\n if (n |= (127 & (i = a[r.pos++])) << 17, i < 128) return tu(t, n, e);\n if (n |= (127 & (i = a[r.pos++])) << 24, i < 128) return tu(t, n, e);\n if (n |= (1 & (i = a[r.pos++])) << 31, i < 128) return tu(t, n, e);\n throw new Error("Expected varint not more than 10 bytes");\n }(e |= (15 & (r = n[this.pos])) << 28, t, this))));\n },\n readVarint64: function readVarint64() {\n return this.readVarint(!0);\n },\n readSVarint: function readSVarint() {\n var t = this.readVarint();\n return t % 2 == 1 ? (t + 1) / -2 : t / 2;\n },\n readBoolean: function readBoolean() {\n return Boolean(this.readVarint());\n },\n readString: function readString() {\n var t = this.readVarint() + this.pos,\n e = this.pos;\n return this.pos = t, t - e >= 12 && Ws ? function (t, e, r) {\n return Ws.decode(t.subarray(e, r));\n }(this.buf, e, t) : function (t, e, r) {\n for (var n = "", i = e; i < r;) {\n var a,\n o,\n s,\n u = t[i],\n l = null,\n p = u > 239 ? 4 : u > 223 ? 3 : u > 191 ? 2 : 1;\n if (i + p > r) break;\n 1 === p ? u < 128 && (l = u) : 2 === p ? 128 == (192 & (a = t[i + 1])) && (l = (31 & u) << 6 | 63 & a) <= 127 && (l = null) : 3 === p ? (o = t[i + 2], 128 == (192 & (a = t[i + 1])) && 128 == (192 & o) && ((l = (15 & u) << 12 | (63 & a) << 6 | 63 & o) <= 2047 || l >= 55296 && l <= 57343) && (l = null)) : 4 === p && (o = t[i + 2], s = t[i + 3], 128 == (192 & (a = t[i + 1])) && 128 == (192 & o) && 128 == (192 & s) && ((l = (15 & u) << 18 | (63 & a) << 12 | (63 & o) << 6 | 63 & s) <= 65535 || l >= 1114112) && (l = null)), null === l ? (l = 65533, p = 1) : l > 65535 && (l -= 65536, n += String.fromCharCode(l >>> 10 & 1023 | 55296), l = 56320 | 1023 & l), n += String.fromCharCode(l), i += p;\n }\n\n return n;\n }(this.buf, e, t);\n },\n readBytes: function readBytes() {\n var t = this.readVarint() + this.pos,\n e = this.buf.subarray(this.pos, t);\n return this.pos = t, e;\n },\n readPackedVarint: function readPackedVarint(t, e) {\n if (this.type !== $s.Bytes) return t.push(this.readVarint(e));\n var r = Qs(this);\n\n for (t = t || []; this.pos < r;) {\n t.push(this.readVarint(e));\n }\n\n return t;\n },\n readPackedSVarint: function readPackedSVarint(t) {\n if (this.type !== $s.Bytes) return t.push(this.readSVarint());\n var e = Qs(this);\n\n for (t = t || []; this.pos < e;) {\n t.push(this.readSVarint());\n }\n\n return t;\n },\n readPackedBoolean: function readPackedBoolean(t) {\n if (this.type !== $s.Bytes) return t.push(this.readBoolean());\n var e = Qs(this);\n\n for (t = t || []; this.pos < e;) {\n t.push(this.readBoolean());\n }\n\n return t;\n },\n readPackedFloat: function readPackedFloat(t) {\n if (this.type !== $s.Bytes) return t.push(this.readFloat());\n var e = Qs(this);\n\n for (t = t || []; this.pos < e;) {\n t.push(this.readFloat());\n }\n\n return t;\n },\n readPackedDouble: function readPackedDouble(t) {\n if (this.type !== $s.Bytes) return t.push(this.readDouble());\n var e = Qs(this);\n\n for (t = t || []; this.pos < e;) {\n t.push(this.readDouble());\n }\n\n return t;\n },\n readPackedFixed32: function readPackedFixed32(t) {\n if (this.type !== $s.Bytes) return t.push(this.readFixed32());\n var e = Qs(this);\n\n for (t = t || []; this.pos < e;) {\n t.push(this.readFixed32());\n }\n\n return t;\n },\n readPackedSFixed32: function readPackedSFixed32(t) {\n if (this.type !== $s.Bytes) return t.push(this.readSFixed32());\n var e = Qs(this);\n\n for (t = t || []; this.pos < e;) {\n t.push(this.readSFixed32());\n }\n\n return t;\n },\n readPackedFixed64: function readPackedFixed64(t) {\n if (this.type !== $s.Bytes) return t.push(this.readFixed64());\n var e = Qs(this);\n\n for (t = t || []; this.pos < e;) {\n t.push(this.readFixed64());\n }\n\n return t;\n },\n readPackedSFixed64: function readPackedSFixed64(t) {\n if (this.type !== $s.Bytes) return t.push(this.readSFixed64());\n var e = Qs(this);\n\n for (t = t || []; this.pos < e;) {\n t.push(this.readSFixed64());\n }\n\n return t;\n },\n skip: function skip(t) {\n var e = 7 & t;\n if (e === $s.Varint) for (; this.buf[this.pos++] > 127;) {\n ;\n } else if (e === $s.Bytes) this.pos = this.readVarint() + this.pos;else if (e === $s.Fixed32) this.pos += 4;else {\n if (e !== $s.Fixed64) throw new Error("Unimplemented type: " + e);\n this.pos += 8;\n }\n },\n writeTag: function writeTag(t, e) {\n this.writeVarint(t << 3 | e);\n },\n realloc: function realloc(t) {\n for (var e = this.length || 16; e < this.pos + t;) {\n e *= 2;\n }\n\n if (e !== this.length) {\n var r = new Uint8Array(e);\n r.set(this.buf), this.buf = r, this.length = e;\n }\n },\n finish: function finish() {\n return this.length = this.pos, this.pos = 0, this.buf.subarray(0, this.length);\n },\n writeFixed32: function writeFixed32(t) {\n this.realloc(4), hu(this.buf, t, this.pos), this.pos += 4;\n },\n writeSFixed32: function writeSFixed32(t) {\n this.realloc(4), hu(this.buf, t, this.pos), this.pos += 4;\n },\n writeFixed64: function writeFixed64(t) {\n this.realloc(8), hu(this.buf, -1 & t, this.pos), hu(this.buf, Math.floor(t * (1 / 4294967296)), this.pos + 4), this.pos += 8;\n },\n writeSFixed64: function writeSFixed64(t) {\n this.realloc(8), hu(this.buf, -1 & t, this.pos), hu(this.buf, Math.floor(t * (1 / 4294967296)), this.pos + 4), this.pos += 8;\n },\n writeVarint: function writeVarint(t) {\n (t = +t || 0) > 268435455 || t < 0 ? function (t, e) {\n var r, n;\n if (t >= 0 ? (r = t % 4294967296 | 0, n = t / 4294967296 | 0) : (n = ~(-t / 4294967296), 4294967295 ^ (r = ~(-t % 4294967296)) ? r = r + 1 | 0 : (r = 0, n = n + 1 | 0)), t >= 0x10000000000000000 || t < -0x10000000000000000) throw new Error("Given varint doesn\'t fit into 10 bytes");\n e.realloc(10), function (t, e, r) {\n r.buf[r.pos++] = 127 & t | 128, t >>>= 7, r.buf[r.pos++] = 127 & t | 128, t >>>= 7, r.buf[r.pos++] = 127 & t | 128, t >>>= 7, r.buf[r.pos++] = 127 & t | 128, r.buf[r.pos] = 127 & (t >>>= 7);\n }(r, 0, e), function (t, e) {\n var r = (7 & t) << 4;\n e.buf[e.pos++] |= r | ((t >>>= 3) ? 128 : 0), t && (e.buf[e.pos++] = 127 & t | ((t >>>= 7) ? 128 : 0), t && (e.buf[e.pos++] = 127 & t | ((t >>>= 7) ? 128 : 0), t && (e.buf[e.pos++] = 127 & t | ((t >>>= 7) ? 128 : 0), t && (e.buf[e.pos++] = 127 & t | ((t >>>= 7) ? 128 : 0), t && (e.buf[e.pos++] = 127 & t)))));\n }(n, e);\n }(t, this) : (this.realloc(4), this.buf[this.pos++] = 127 & t | (t > 127 ? 128 : 0), t <= 127 || (this.buf[this.pos++] = 127 & (t >>>= 7) | (t > 127 ? 128 : 0), t <= 127 || (this.buf[this.pos++] = 127 & (t >>>= 7) | (t > 127 ? 128 : 0), t <= 127 || (this.buf[this.pos++] = t >>> 7 & 127))));\n },\n writeSVarint: function writeSVarint(t) {\n this.writeVarint(t < 0 ? 2 * -t - 1 : 2 * t);\n },\n writeBoolean: function writeBoolean(t) {\n this.writeVarint(Boolean(t));\n },\n writeString: function writeString(t) {\n t = String(t), this.realloc(4 * t.length), this.pos++;\n var e = this.pos;\n\n this.pos = function (t, e, r) {\n for (var n, i, a = 0; a < e.length; a++) {\n if ((n = e.charCodeAt(a)) > 55295 && n < 57344) {\n if (!i) {\n n > 56319 || a + 1 === e.length ? (t[r++] = 239, t[r++] = 191, t[r++] = 189) : i = n;\n continue;\n }\n\n if (n < 56320) {\n t[r++] = 239, t[r++] = 191, t[r++] = 189, i = n;\n continue;\n }\n\n n = i - 55296 << 10 | n - 56320 | 65536, i = null;\n } else i && (t[r++] = 239, t[r++] = 191, t[r++] = 189, i = null);\n\n n < 128 ? t[r++] = n : (n < 2048 ? t[r++] = n >> 6 | 192 : (n < 65536 ? t[r++] = n >> 12 | 224 : (t[r++] = n >> 18 | 240, t[r++] = n >> 12 & 63 | 128), t[r++] = n >> 6 & 63 | 128), t[r++] = 63 & n | 128);\n }\n\n return r;\n }(this.buf, t, this.pos);\n\n var r = this.pos - e;\n r >= 128 && eu(e, r, this), this.pos = e - 1, this.writeVarint(r), this.pos += r;\n },\n writeFloat: function writeFloat(t) {\n this.realloc(4), Hs(this.buf, t, this.pos, !0, 23, 4), this.pos += 4;\n },\n writeDouble: function writeDouble(t) {\n this.realloc(8), Hs(this.buf, t, this.pos, !0, 52, 8), this.pos += 8;\n },\n writeBytes: function writeBytes(t) {\n var e = t.length;\n this.writeVarint(e), this.realloc(e);\n\n for (var r = 0; r < e; r++) {\n this.buf[this.pos++] = t[r];\n }\n },\n writeRawMessage: function writeRawMessage(t, e) {\n this.pos++;\n var r = this.pos;\n t(e, this);\n var n = this.pos - r;\n n >= 128 && eu(r, n, this), this.pos = r - 1, this.writeVarint(n), this.pos += n;\n },\n writeMessage: function writeMessage(t, e, r) {\n this.writeTag(t, $s.Bytes), this.writeRawMessage(e, r);\n },\n writePackedVarint: function writePackedVarint(t, e) {\n e.length && this.writeMessage(t, ru, e);\n },\n writePackedSVarint: function writePackedSVarint(t, e) {\n e.length && this.writeMessage(t, nu, e);\n },\n writePackedBoolean: function writePackedBoolean(t, e) {\n e.length && this.writeMessage(t, ou, e);\n },\n writePackedFloat: function writePackedFloat(t, e) {\n e.length && this.writeMessage(t, iu, e);\n },\n writePackedDouble: function writePackedDouble(t, e) {\n e.length && this.writeMessage(t, au, e);\n },\n writePackedFixed32: function writePackedFixed32(t, e) {\n e.length && this.writeMessage(t, su, e);\n },\n writePackedSFixed32: function writePackedSFixed32(t, e) {\n e.length && this.writeMessage(t, uu, e);\n },\n writePackedFixed64: function writePackedFixed64(t, e) {\n e.length && this.writeMessage(t, lu, e);\n },\n writePackedSFixed64: function writePackedSFixed64(t, e) {\n e.length && this.writeMessage(t, pu, e);\n },\n writeBytesField: function writeBytesField(t, e) {\n this.writeTag(t, $s.Bytes), this.writeBytes(e);\n },\n writeFixed32Field: function writeFixed32Field(t, e) {\n this.writeTag(t, $s.Fixed32), this.writeFixed32(e);\n },\n writeSFixed32Field: function writeSFixed32Field(t, e) {\n this.writeTag(t, $s.Fixed32), this.writeSFixed32(e);\n },\n writeFixed64Field: function writeFixed64Field(t, e) {\n this.writeTag(t, $s.Fixed64), this.writeFixed64(e);\n },\n writeSFixed64Field: function writeSFixed64Field(t, e) {\n this.writeTag(t, $s.Fixed64), this.writeSFixed64(e);\n },\n writeVarintField: function writeVarintField(t, e) {\n this.writeTag(t, $s.Varint), this.writeVarint(e);\n },\n writeSVarintField: function writeSVarintField(t, e) {\n this.writeTag(t, $s.Varint), this.writeSVarint(e);\n },\n writeStringField: function writeStringField(t, e) {\n this.writeTag(t, $s.Bytes), this.writeString(e);\n },\n writeFloatField: function writeFloatField(t, e) {\n this.writeTag(t, $s.Fixed32), this.writeFloat(e);\n },\n writeDoubleField: function writeDoubleField(t, e) {\n this.writeTag(t, $s.Fixed64), this.writeDouble(e);\n },\n writeBooleanField: function writeBooleanField(t, e) {\n this.writeVarintField(t, Boolean(e));\n }\n };\n\n var gu = function gu(t, e) {\n var r = e.pixelRatio,\n n = e.version,\n i = e.stretchX,\n a = e.stretchY,\n o = e.content;\n this.paddedRect = t, this.pixelRatio = r, this.stretchX = i, this.stretchY = a, this.content = o, this.version = n;\n },\n xu = {\n tl: {\n configurable: !0\n },\n br: {\n configurable: !0\n },\n tlbr: {\n configurable: !0\n },\n displaySize: {\n configurable: !0\n }\n };\n\n xu.tl.get = function () {\n return [this.paddedRect.x + 1, this.paddedRect.y + 1];\n }, xu.br.get = function () {\n return [this.paddedRect.x + this.paddedRect.w - 1, this.paddedRect.y + this.paddedRect.h - 1];\n }, xu.tlbr.get = function () {\n return this.tl.concat(this.br);\n }, xu.displaySize.get = function () {\n return [(this.paddedRect.w - 2) / this.pixelRatio, (this.paddedRect.h - 2) / this.pixelRatio];\n }, Object.defineProperties(gu.prototype, xu);\n\n var bu = function bu(t, e) {\n var r = {},\n n = {};\n this.haveRenderCallbacks = [];\n var i = [];\n this.addImages(t, r, i), this.addImages(e, n, i);\n var a = vu(i),\n o = new xo({\n width: a.w || 1,\n height: a.h || 1\n });\n\n for (var s in t) {\n var u = t[s],\n l = r[s].paddedRect;\n xo.copy(u.data, o, {\n x: 0,\n y: 0\n }, {\n x: l.x + 1,\n y: l.y + 1\n }, u.data);\n }\n\n for (var p in e) {\n var c = e[p],\n h = n[p].paddedRect,\n f = h.x + 1,\n y = h.y + 1,\n d = c.data.width,\n m = c.data.height;\n xo.copy(c.data, o, {\n x: 0,\n y: 0\n }, {\n x: f,\n y: y\n }, c.data), xo.copy(c.data, o, {\n x: 0,\n y: m - 1\n }, {\n x: f,\n y: y - 1\n }, {\n width: d,\n height: 1\n }), xo.copy(c.data, o, {\n x: 0,\n y: 0\n }, {\n x: f,\n y: y + m\n }, {\n width: d,\n height: 1\n }), xo.copy(c.data, o, {\n x: d - 1,\n y: 0\n }, {\n x: f - 1,\n y: y\n }, {\n width: 1,\n height: m\n }), xo.copy(c.data, o, {\n x: 0,\n y: 0\n }, {\n x: f + d,\n y: y\n }, {\n width: 1,\n height: m\n });\n }\n\n this.image = o, this.iconPositions = r, this.patternPositions = n;\n };\n\n bu.prototype.addImages = function (t, e, r) {\n for (var n in t) {\n var i = t[n],\n a = {\n x: 0,\n y: 0,\n w: i.data.width + 2,\n h: i.data.height + 2\n };\n r.push(a), e[n] = new gu(a, i), i.hasRenderCallback && this.haveRenderCallbacks.push(n);\n }\n }, bu.prototype.patchUpdatedImages = function (t, e) {\n for (var r in t.dispatchRenderCallbacks(this.haveRenderCallbacks), t.updatedImages) {\n this.patchUpdatedImage(this.iconPositions[r], t.getImage(r), e), this.patchUpdatedImage(this.patternPositions[r], t.getImage(r), e);\n }\n }, bu.prototype.patchUpdatedImage = function (t, e, r) {\n if (t && e && t.version !== e.version) {\n t.version = e.version;\n var n = t.tl;\n r.update(e.data, void 0, {\n x: n[0],\n y: n[1]\n });\n }\n }, On("ImagePosition", gu), On("ImageAtlas", bu);\n\n var wu = {\n horizontal: 1,\n vertical: 2,\n horizontalOnly: 3\n },\n _u = function _u() {\n this.scale = 1, this.fontStack = "", this.imageName = null;\n };\n\n _u.forText = function (t, e) {\n var r = new _u();\n return r.scale = t || 1, r.fontStack = e, r;\n }, _u.forImage = function (t) {\n var e = new _u();\n return e.imageName = t, e;\n };\n\n var Au = function Au() {\n this.text = "", this.sectionIndex = [], this.sections = [], this.imageSectionID = null;\n };\n\n function Su(t, e, r, n, i, a, o, s, u, l, p, c, h, f, y, d) {\n var m,\n v = Au.fromFeature(t, i);\n c === wu.vertical && v.verticalizePunctuation();\n var g = oi.processBidirectionalText,\n x = oi.processStyledBidirectionalText;\n\n if (g && 1 === v.sections.length) {\n m = [];\n\n for (var b = 0, w = g(v.toString(), Mu(v, l, a, e, n, f, y)); b < w.length; b += 1) {\n var _ = w[b],\n A = new Au();\n A.text = _, A.sections = v.sections;\n\n for (var S = 0; S < _.length; S++) {\n A.sectionIndex.push(0);\n }\n\n m.push(A);\n }\n } else if (x) {\n m = [];\n\n for (var k = 0, I = x(v.text, v.sectionIndex, Mu(v, l, a, e, n, f, y)); k < I.length; k += 1) {\n var z = I[k],\n C = new Au();\n C.text = z[0], C.sectionIndex = z[1], C.sections = v.sections, m.push(C);\n }\n } else m = function (t, e) {\n for (var r = [], n = t.text, i = 0, a = 0, o = e; a < o.length; a += 1) {\n var s = o[a];\n r.push(t.substring(i, s)), i = s;\n }\n\n return i < n.length && r.push(t.substring(i, n.length)), r;\n }(v, Mu(v, l, a, e, n, f, y));\n\n var E = [],\n P = {\n positionedLines: E,\n text: v.toString(),\n top: p[1],\n bottom: p[1],\n left: p[0],\n right: p[0],\n writingMode: c,\n iconsInText: !1,\n verticalizable: !1\n };\n return function (t, e, r, n, i, a, o, s, u, l, p, c) {\n for (var h = 0, f = -17, y = 0, d = 0, m = "right" === s ? 1 : "left" === s ? 0 : .5, v = 0, g = 0, x = i; g < x.length; g += 1) {\n var b = x[g];\n b.trim();\n\n var w = b.getMaxScale(),\n _ = 24 * (w - 1),\n A = {\n positionedGlyphs: [],\n lineOffset: 0\n };\n\n t.positionedLines[v] = A;\n var S = A.positionedGlyphs,\n k = 0;\n\n if (b.length()) {\n for (var I = 0; I < b.length(); I++) {\n var z = b.getSection(I),\n C = b.getSectionIndex(I),\n E = b.getCharCode(I),\n P = 0,\n M = null,\n B = null,\n T = null,\n V = 24,\n F = !(u === wu.horizontal || !p && !Xn(E) || p && (ku[E] || (K = E, Gn.Arabic(K) || Gn["Arabic Supplement"](K) || Gn["Arabic Extended-A"](K) || Gn["Arabic Presentation Forms-A"](K) || Gn["Arabic Presentation Forms-B"](K))));\n\n if (z.imageName) {\n var D = n[z.imageName];\n if (!D) continue;\n T = z.imageName, t.iconsInText = t.iconsInText || !0, B = D.paddedRect;\n var L = D.displaySize;\n z.scale = 24 * z.scale / c, P = _ + (24 - L[1] * z.scale), V = (M = {\n width: L[0],\n height: L[1],\n left: 1,\n top: -3,\n advance: F ? L[1] : L[0]\n }).advance;\n var O = F ? L[0] * z.scale - 24 * w : L[1] * z.scale - 24 * w;\n O > 0 && O > k && (k = O);\n } else {\n var R = r[z.fontStack],\n U = R && R[E];\n if (U && U.rect) B = U.rect, M = U.metrics;else {\n var j = e[z.fontStack],\n q = j && j[E];\n if (!q) continue;\n M = q.metrics;\n }\n P = 24 * (w - z.scale);\n }\n\n F ? (t.verticalizable = !0, S.push({\n glyph: E,\n imageName: T,\n x: h,\n y: f + P,\n vertical: F,\n scale: z.scale,\n fontStack: z.fontStack,\n sectionIndex: C,\n metrics: M,\n rect: B\n }), h += V * z.scale + l) : (S.push({\n glyph: E,\n imageName: T,\n x: h,\n y: f + P,\n vertical: F,\n scale: z.scale,\n fontStack: z.fontStack,\n sectionIndex: C,\n metrics: M,\n rect: B\n }), h += M.advance * z.scale + l);\n }\n\n 0 !== S.length && (y = Math.max(h - l, y), Tu(S, 0, S.length - 1, m, k)), h = 0;\n var N = a * w + k;\n A.lineOffset = Math.max(k, _), f += N, d = Math.max(N, d), ++v;\n } else f += a, ++v;\n }\n\n var K,\n G = f - -17,\n Z = Bu(o),\n X = Z.horizontalAlign,\n J = Z.verticalAlign;\n (function (t, e, r, n, i, a, o, s, u) {\n var l,\n p = (e - r) * i;\n l = a !== o ? -s * n - -17 : (-n * u + .5) * o;\n\n for (var c = 0, h = t; c < h.length; c += 1) {\n for (var f = 0, y = h[c].positionedGlyphs; f < y.length; f += 1) {\n var d = y[f];\n d.x += p, d.y += l;\n }\n }\n })(t.positionedLines, m, X, J, y, d, a, G, i.length), t.top += -J * G, t.bottom = t.top + G, t.left += -X * y, t.right = t.left + y;\n }(P, e, r, n, m, o, s, u, c, l, h, d), !function (t) {\n for (var e = 0, r = t; e < r.length; e += 1) {\n if (0 !== r[e].positionedGlyphs.length) return !1;\n }\n\n return !0;\n }(E) && P;\n }\n\n Au.fromFeature = function (t, e) {\n for (var r = new Au(), n = 0; n < t.sections.length; n++) {\n var i = t.sections[n];\n i.image ? r.addImageSection(i) : r.addTextSection(i, e);\n }\n\n return r;\n }, Au.prototype.length = function () {\n return this.text.length;\n }, Au.prototype.getSection = function (t) {\n return this.sections[this.sectionIndex[t]];\n }, Au.prototype.getSectionIndex = function (t) {\n return this.sectionIndex[t];\n }, Au.prototype.getCharCode = function (t) {\n return this.text.charCodeAt(t);\n }, Au.prototype.verticalizePunctuation = function () {\n this.text = function (t) {\n for (var e = "", r = 0; r < t.length; r++) {\n var n = t.charCodeAt(r + 1) || null,\n i = t.charCodeAt(r - 1) || null;\n e += n && Jn(n) && !Xs[t[r + 1]] || i && Jn(i) && !Xs[t[r - 1]] || !Xs[t[r]] ? t[r] : Xs[t[r]];\n }\n\n return e;\n }(this.text);\n }, Au.prototype.trim = function () {\n for (var t = 0, e = 0; e < this.text.length && ku[this.text.charCodeAt(e)]; e++) {\n t++;\n }\n\n for (var r = this.text.length, n = this.text.length - 1; n >= 0 && n >= t && ku[this.text.charCodeAt(n)]; n--) {\n r--;\n }\n\n this.text = this.text.substring(t, r), this.sectionIndex = this.sectionIndex.slice(t, r);\n }, Au.prototype.substring = function (t, e) {\n var r = new Au();\n return r.text = this.text.substring(t, e), r.sectionIndex = this.sectionIndex.slice(t, e), r.sections = this.sections, r;\n }, Au.prototype.toString = function () {\n return this.text;\n }, Au.prototype.getMaxScale = function () {\n var t = this;\n return this.sectionIndex.reduce(function (e, r) {\n return Math.max(e, t.sections[r].scale);\n }, 0);\n }, Au.prototype.addTextSection = function (t, e) {\n this.text += t.text, this.sections.push(_u.forText(t.scale, t.fontStack || e));\n\n for (var r = this.sections.length - 1, n = 0; n < t.text.length; ++n) {\n this.sectionIndex.push(r);\n }\n }, Au.prototype.addImageSection = function (t) {\n var e = t.image ? t.image.name : "";\n\n if (0 !== e.length) {\n var r = this.getNextImageSectionCharCode();\n r ? (this.text += String.fromCharCode(r), this.sections.push(_u.forImage(e)), this.sectionIndex.push(this.sections.length - 1)) : A("Reached maximum number of images 6401");\n } else A("Can\'t add FormattedSection with an empty image.");\n }, Au.prototype.getNextImageSectionCharCode = function () {\n return this.imageSectionID ? this.imageSectionID >= 63743 ? null : ++this.imageSectionID : (this.imageSectionID = 57344, this.imageSectionID);\n };\n var ku = {\n 9: !0,\n 10: !0,\n 11: !0,\n 12: !0,\n 13: !0,\n 32: !0\n },\n Iu = {};\n\n function zu(t, e, r, n, i, a) {\n if (e.imageName) {\n var o = n[e.imageName];\n return o ? o.displaySize[0] * e.scale * 24 / a + i : 0;\n }\n\n var s = r[e.fontStack],\n u = s && s[t];\n return u ? u.metrics.advance * e.scale + i : 0;\n }\n\n function Cu(t, e, r, n) {\n var i = Math.pow(t - e, 2);\n return n ? t < e ? i / 2 : 2 * i : i + Math.abs(r) * r;\n }\n\n function Eu(t, e, r) {\n var n = 0;\n return 10 === t && (n -= 1e4), r && (n += 150), 40 !== t && 65288 !== t || (n += 50), 41 !== e && 65289 !== e || (n += 50), n;\n }\n\n function Pu(t, e, r, n, i, a) {\n for (var o = null, s = Cu(e, r, i, a), u = 0, l = n; u < l.length; u += 1) {\n var p = l[u],\n c = Cu(e - p.x, r, i, a) + p.badness;\n c <= s && (o = p, s = c);\n }\n\n return {\n index: t,\n x: e,\n priorBreak: o,\n badness: s\n };\n }\n\n function Mu(t, e, r, n, i, a, o) {\n if ("point" !== a) return [];\n if (!t) return [];\n\n for (var s, u = [], l = function (t, e, r, n, i, a) {\n for (var o = 0, s = 0; s < t.length(); s++) {\n var u = t.getSection(s);\n o += zu(t.getCharCode(s), u, n, i, e, a);\n }\n\n return o / Math.max(1, Math.ceil(o / r));\n }(t, e, r, n, i, o), p = t.text.indexOf("​") >= 0, c = 0, h = 0; h < t.length(); h++) {\n var f = t.getSection(h),\n y = t.getCharCode(h);\n\n if (ku[y] || (c += zu(y, f, n, i, e, o)), h < t.length() - 1) {\n var d = !((s = y) < 11904 || !(Gn["Bopomofo Extended"](s) || Gn.Bopomofo(s) || Gn["CJK Compatibility Forms"](s) || Gn["CJK Compatibility Ideographs"](s) || Gn["CJK Compatibility"](s) || Gn["CJK Radicals Supplement"](s) || Gn["CJK Strokes"](s) || Gn["CJK Symbols and Punctuation"](s) || Gn["CJK Unified Ideographs Extension A"](s) || Gn["CJK Unified Ideographs"](s) || Gn["Enclosed CJK Letters and Months"](s) || Gn["Halfwidth and Fullwidth Forms"](s) || Gn.Hiragana(s) || Gn["Ideographic Description Characters"](s) || Gn["Kangxi Radicals"](s) || Gn["Katakana Phonetic Extensions"](s) || Gn.Katakana(s) || Gn["Vertical Forms"](s) || Gn["Yi Radicals"](s) || Gn["Yi Syllables"](s)));\n (Iu[y] || d || f.imageName) && u.push(Pu(h + 1, c, l, u, Eu(y, t.getCharCode(h + 1), d && p), !1));\n }\n }\n\n return function t(e) {\n return e ? t(e.priorBreak).concat(e.index) : [];\n }(Pu(t.length(), c, l, u, 0, !0));\n }\n\n function Bu(t) {\n var e = .5,\n r = .5;\n\n switch (t) {\n case "right":\n case "top-right":\n case "bottom-right":\n e = 1;\n break;\n\n case "left":\n case "top-left":\n case "bottom-left":\n e = 0;\n }\n\n switch (t) {\n case "bottom":\n case "bottom-right":\n case "bottom-left":\n r = 1;\n break;\n\n case "top":\n case "top-right":\n case "top-left":\n r = 0;\n }\n\n return {\n horizontalAlign: e,\n verticalAlign: r\n };\n }\n\n function Tu(t, e, r, n, i) {\n if (n || i) for (var a = t[r], o = (t[r].x + a.metrics.advance * a.scale) * n, s = e; s <= r; s++) {\n t[s].x -= o, t[s].y += i;\n }\n }\n\n function Vu(t, e, r, n, i, a) {\n var o,\n s = t.image;\n\n if (s.content) {\n var u = s.content,\n l = s.pixelRatio || 1;\n o = [u[0] / l, u[1] / l, s.displaySize[0] - u[2] / l, s.displaySize[1] - u[3] / l];\n }\n\n var p,\n c,\n h,\n f,\n y = e.left * a,\n d = e.right * a;\n "width" === r || "both" === r ? (f = i[0] + y - n[3], c = i[0] + d + n[1]) : c = (f = i[0] + (y + d - s.displaySize[0]) / 2) + s.displaySize[0];\n var m = e.top * a,\n v = e.bottom * a;\n return "height" === r || "both" === r ? (p = i[1] + m - n[0], h = i[1] + v + n[2]) : h = (p = i[1] + (m + v - s.displaySize[1]) / 2) + s.displaySize[1], {\n image: s,\n top: p,\n right: c,\n bottom: h,\n left: f,\n collisionPadding: o\n };\n }\n\n Iu[10] = !0, Iu[32] = !0, Iu[38] = !0, Iu[40] = !0, Iu[41] = !0, Iu[43] = !0, Iu[45] = !0, Iu[47] = !0, Iu[173] = !0, Iu[183] = !0, Iu[8203] = !0, Iu[8208] = !0, Iu[8211] = !0, Iu[8231] = !0;\n\n var Fu = function (t) {\n function e(e, r, n, i) {\n t.call(this, e, r), this.angle = n, void 0 !== i && (this.segment = i);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.clone = function () {\n return new e(this.x, this.y, this.angle, this.segment);\n }, e;\n }(i);\n\n function Du(t, e) {\n var r = e.expression;\n if ("constant" === r.kind) return {\n kind: "constant",\n layoutSize: r.evaluate(new si(t + 1))\n };\n if ("source" === r.kind) return {\n kind: "source"\n };\n\n for (var n = r.zoomStops, i = r.interpolationType, a = 0; a < n.length && n[a] <= t;) {\n a++;\n }\n\n for (var o = a = Math.max(0, a - 1); o < n.length && n[o] < t + 1;) {\n o++;\n }\n\n o = Math.min(n.length - 1, o);\n var s = n[a],\n u = n[o];\n return "composite" === r.kind ? {\n kind: "composite",\n minZoom: s,\n maxZoom: u,\n interpolationType: i\n } : {\n kind: "camera",\n minZoom: s,\n maxZoom: u,\n minSize: r.evaluate(new si(s)),\n maxSize: r.evaluate(new si(u)),\n interpolationType: i\n };\n }\n\n function Lu(t, e, r) {\n var n = e.uSize,\n i = r.lowerSize;\n return "source" === t.kind ? i / 128 : "composite" === t.kind ? Ke(i / 128, r.upperSize / 128, e.uSizeT) : n;\n }\n\n function Ou(t, e) {\n var r = 0,\n n = 0;\n if ("constant" === t.kind) n = t.layoutSize;else if ("source" !== t.kind) {\n var i = t.interpolationType,\n a = i ? p(ar.interpolationFactor(i, e, t.minZoom, t.maxZoom), 0, 1) : 0;\n "camera" === t.kind ? n = Ke(t.minSize, t.maxSize, a) : r = a;\n }\n return {\n uSizeT: r,\n uSize: n\n };\n }\n\n On("Anchor", Fu);\n var Ru = Object.freeze({\n __proto__: null,\n getSizeData: Du,\n evaluateSizeForFeature: Lu,\n evaluateSizeForZoom: Ou,\n SIZE_PACK_FACTOR: 128\n });\n\n function Uu(t, e, r, n, i) {\n if (void 0 === e.segment) return !0;\n\n for (var a = e, o = e.segment + 1, s = 0; s > -r / 2;) {\n if (--o < 0) return !1;\n s -= t[o].dist(a), a = t[o];\n }\n\n s += t[o].dist(t[o + 1]), o++;\n\n for (var u = [], l = 0; s < r / 2;) {\n var p = t[o],\n c = t[o + 1];\n if (!c) return !1;\n var h = t[o - 1].angleTo(p) - p.angleTo(c);\n\n for (h = Math.abs((h + 3 * Math.PI) % (2 * Math.PI) - Math.PI), u.push({\n distance: s,\n angleDelta: h\n }), l += h; s - u[0].distance > n;) {\n l -= u.shift().angleDelta;\n }\n\n if (l > i) return !1;\n o++, s += p.dist(c);\n }\n\n return !0;\n }\n\n function ju(t) {\n for (var e = 0, r = 0; r < t.length - 1; r++) {\n e += t[r].dist(t[r + 1]);\n }\n\n return e;\n }\n\n function qu(t, e, r) {\n return t ? .6 * e * r : 0;\n }\n\n function Nu(t, e) {\n return Math.max(t ? t.right - t.left : 0, e ? e.right - e.left : 0);\n }\n\n function Ku(t, e, r, n, i, a) {\n for (var o = qu(r, i, a), s = Nu(r, n) * a, u = 0, l = ju(t) / 2, p = 0; p < t.length - 1; p++) {\n var c = t[p],\n h = t[p + 1],\n f = c.dist(h);\n\n if (u + f > l) {\n var y = (l - u) / f,\n d = Ke(c.x, h.x, y),\n m = Ke(c.y, h.y, y),\n v = new Fu(d, m, h.angleTo(c), p);\n return v._round(), !o || Uu(t, v, s, o, e) ? v : void 0;\n }\n\n u += f;\n }\n }\n\n function Gu(t, e, r, n, i, a, o, s, u) {\n var l = qu(n, a, o),\n p = Nu(n, i),\n c = p * o,\n h = 0 === t[0].x || t[0].x === u || 0 === t[0].y || t[0].y === u;\n return e - c < e / 4 && (e = c + e / 4), function t(e, r, n, i, a, o, s, u, l) {\n for (var p = o / 2, c = ju(e), h = 0, f = r - n, y = [], d = 0; d < e.length - 1; d++) {\n for (var m = e[d], v = e[d + 1], g = m.dist(v), x = v.angleTo(m); f + n < h + g;) {\n var b = ((f += n) - h) / g,\n w = Ke(m.x, v.x, b),\n _ = Ke(m.y, v.y, b);\n\n if (w >= 0 && w < l && _ >= 0 && _ < l && f - p >= 0 && f + p <= c) {\n var A = new Fu(w, _, x, d);\n A._round(), i && !Uu(e, A, o, i, a) || y.push(A);\n }\n }\n\n h += g;\n }\n\n return u || y.length || s || (y = t(e, h / 2, n, i, a, o, s, !0, l)), y;\n }(t, h ? e / 2 * s % e : (p / 2 + 2 * a) * o * s % e, e, l, r, c, h, !1, u);\n }\n\n function Zu(t, e, r, n, a) {\n for (var o = [], s = 0; s < t.length; s++) {\n for (var u = t[s], l = void 0, p = 0; p < u.length - 1; p++) {\n var c = u[p],\n h = u[p + 1];\n c.x < e && h.x < e || (c.x < e ? c = new i(e, c.y + (e - c.x) / (h.x - c.x) * (h.y - c.y))._round() : h.x < e && (h = new i(e, c.y + (e - c.x) / (h.x - c.x) * (h.y - c.y))._round()), c.y < r && h.y < r || (c.y < r ? c = new i(c.x + (r - c.y) / (h.y - c.y) * (h.x - c.x), r)._round() : h.y < r && (h = new i(c.x + (r - c.y) / (h.y - c.y) * (h.x - c.x), r)._round()), c.x >= n && h.x >= n || (c.x >= n ? c = new i(n, c.y + (n - c.x) / (h.x - c.x) * (h.y - c.y))._round() : h.x >= n && (h = new i(n, c.y + (n - c.x) / (h.x - c.x) * (h.y - c.y))._round()), c.y >= a && h.y >= a || (c.y >= a ? c = new i(c.x + (a - c.y) / (h.y - c.y) * (h.x - c.x), a)._round() : h.y >= a && (h = new i(c.x + (a - c.y) / (h.y - c.y) * (h.x - c.x), a)._round()), l && c.equals(l[l.length - 1]) || o.push(l = [c]), l.push(h)))));\n }\n }\n\n return o;\n }\n\n function Xu(t, e, r, n) {\n var a = [],\n o = t.image,\n s = o.pixelRatio,\n u = o.paddedRect.w - 2,\n l = o.paddedRect.h - 2,\n p = t.right - t.left,\n c = t.bottom - t.top,\n h = o.stretchX || [[0, u]],\n f = o.stretchY || [[0, l]],\n y = function y(t, e) {\n return t + e[1] - e[0];\n },\n d = h.reduce(y, 0),\n m = f.reduce(y, 0),\n v = u - d,\n g = l - m,\n x = 0,\n b = d,\n w = 0,\n _ = m,\n A = 0,\n S = v,\n k = 0,\n I = g;\n\n if (o.content && n) {\n var z = o.content;\n x = Ju(h, 0, z[0]), w = Ju(f, 0, z[1]), b = Ju(h, z[0], z[2]), _ = Ju(f, z[1], z[3]), A = z[0] - x, k = z[1] - w, S = z[2] - z[0] - b, I = z[3] - z[1] - _;\n }\n\n var C = function C(n, a, u, l) {\n var h = Yu(n.stretch - x, b, p, t.left),\n f = $u(n.fixed - A, S, n.stretch, d),\n y = Yu(a.stretch - w, _, c, t.top),\n v = $u(a.fixed - k, I, a.stretch, m),\n g = Yu(u.stretch - x, b, p, t.left),\n z = $u(u.fixed - A, S, u.stretch, d),\n C = Yu(l.stretch - w, _, c, t.top),\n E = $u(l.fixed - k, I, l.stretch, m),\n P = new i(h, y),\n M = new i(g, y),\n B = new i(g, C),\n T = new i(h, C),\n V = new i(f / s, v / s),\n F = new i(z / s, E / s),\n D = e * Math.PI / 180;\n\n if (D) {\n var L = Math.sin(D),\n O = Math.cos(D),\n R = [O, -L, L, O];\n P._matMult(R), M._matMult(R), T._matMult(R), B._matMult(R);\n }\n\n var U = n.stretch + n.fixed,\n j = a.stretch + a.fixed;\n return {\n tl: P,\n tr: M,\n bl: T,\n br: B,\n tex: {\n x: o.paddedRect.x + 1 + U,\n y: o.paddedRect.y + 1 + j,\n w: u.stretch + u.fixed - U,\n h: l.stretch + l.fixed - j\n },\n writingMode: void 0,\n glyphOffset: [0, 0],\n sectionIndex: 0,\n pixelOffsetTL: V,\n pixelOffsetBR: F,\n minFontScaleX: S / s / p,\n minFontScaleY: I / s / c,\n isSDF: r\n };\n };\n\n if (n && (o.stretchX || o.stretchY)) for (var E = Hu(h, v, d), P = Hu(f, g, m), M = 0; M < E.length - 1; M++) {\n for (var B = E[M], T = E[M + 1], V = 0; V < P.length - 1; V++) {\n a.push(C(B, P[V], T, P[V + 1]));\n }\n } else a.push(C({\n fixed: 0,\n stretch: -1\n }, {\n fixed: 0,\n stretch: -1\n }, {\n fixed: 0,\n stretch: u + 1\n }, {\n fixed: 0,\n stretch: l + 1\n }));\n return a;\n }\n\n function Ju(t, e, r) {\n for (var n = 0, i = 0, a = t; i < a.length; i += 1) {\n var o = a[i];\n n += Math.max(e, Math.min(r, o[1])) - Math.max(e, Math.min(r, o[0]));\n }\n\n return n;\n }\n\n function Hu(t, e, r) {\n for (var n = [{\n fixed: -1,\n stretch: 0\n }], i = 0, a = t; i < a.length; i += 1) {\n var o = a[i],\n s = o[0],\n u = o[1],\n l = n[n.length - 1];\n n.push({\n fixed: s - l.stretch,\n stretch: l.stretch\n }), n.push({\n fixed: s - l.stretch,\n stretch: l.stretch + (u - s)\n });\n }\n\n return n.push({\n fixed: e + 1,\n stretch: r\n }), n;\n }\n\n function Yu(t, e, r, n) {\n return t / e * r + n;\n }\n\n function $u(t, e, r, n) {\n return t - e * r / n;\n }\n\n var Wu = function Wu(t, e, r, n, a, o, s, u, l, p) {\n if (this.boxStartIndex = t.length, l) {\n var c = o.top,\n h = o.bottom,\n f = o.collisionPadding;\n f && (c -= f[1], h += f[3]);\n var y = h - c;\n y > 0 && (y = Math.max(10, y), this.circleDiameter = y);\n } else {\n var d = o.top * s - u,\n m = o.bottom * s + u,\n v = o.left * s - u,\n g = o.right * s + u,\n x = o.collisionPadding;\n\n if (x && (v -= x[0] * s, d -= x[1] * s, g += x[2] * s, m += x[3] * s), p) {\n var b = new i(v, d),\n w = new i(g, d),\n _ = new i(v, m),\n A = new i(g, m),\n S = p * Math.PI / 180;\n\n b._rotate(S), w._rotate(S), _._rotate(S), A._rotate(S), v = Math.min(b.x, w.x, _.x, A.x), g = Math.max(b.x, w.x, _.x, A.x), d = Math.min(b.y, w.y, _.y, A.y), m = Math.max(b.y, w.y, _.y, A.y);\n }\n\n t.emplaceBack(e.x, e.y, v, d, g, m, r, n, a);\n }\n\n this.boxEndIndex = t.length;\n },\n Qu = function Qu(t, e) {\n if (void 0 === t && (t = []), void 0 === e && (e = tl), this.data = t, this.length = this.data.length, this.compare = e, this.length > 0) for (var r = (this.length >> 1) - 1; r >= 0; r--) {\n this._down(r);\n }\n };\n\n function tl(t, e) {\n return t < e ? -1 : t > e ? 1 : 0;\n }\n\n function el(t, e, r) {\n void 0 === e && (e = 1), void 0 === r && (r = !1);\n\n for (var n = 1 / 0, a = 1 / 0, o = -1 / 0, s = -1 / 0, u = t[0], l = 0; l < u.length; l++) {\n var p = u[l];\n (!l || p.x < n) && (n = p.x), (!l || p.y < a) && (a = p.y), (!l || p.x > o) && (o = p.x), (!l || p.y > s) && (s = p.y);\n }\n\n var c = Math.min(o - n, s - a),\n h = c / 2,\n f = new Qu([], rl);\n if (0 === c) return new i(n, a);\n\n for (var y = n; y < o; y += c) {\n for (var d = a; d < s; d += c) {\n f.push(new nl(y + h, d + h, h, t));\n }\n }\n\n for (var m = function (t) {\n for (var e = 0, r = 0, n = 0, i = t[0], a = 0, o = i.length, s = o - 1; a < o; s = a++) {\n var u = i[a],\n l = i[s],\n p = u.x * l.y - l.x * u.y;\n r += (u.x + l.x) * p, n += (u.y + l.y) * p, e += 3 * p;\n }\n\n return new nl(r / e, n / e, 0, t);\n }(t), v = f.length; f.length;) {\n var g = f.pop();\n (g.d > m.d || !m.d) && (m = g, r && console.log("found best %d after %d probes", Math.round(1e4 * g.d) / 1e4, v)), g.max - m.d <= e || (f.push(new nl(g.p.x - (h = g.h / 2), g.p.y - h, h, t)), f.push(new nl(g.p.x + h, g.p.y - h, h, t)), f.push(new nl(g.p.x - h, g.p.y + h, h, t)), f.push(new nl(g.p.x + h, g.p.y + h, h, t)), v += 4);\n }\n\n return r && (console.log("num probes: " + v), console.log("best distance: " + m.d)), m.p;\n }\n\n function rl(t, e) {\n return e.max - t.max;\n }\n\n function nl(t, e, r, n) {\n this.p = new i(t, e), this.h = r, this.d = function (t, e) {\n for (var r = !1, n = 1 / 0, i = 0; i < e.length; i++) {\n for (var a = e[i], o = 0, s = a.length, u = s - 1; o < s; u = o++) {\n var l = a[o],\n p = a[u];\n l.y > t.y != p.y > t.y && t.x < (p.x - l.x) * (t.y - l.y) / (p.y - l.y) + l.x && (r = !r), n = Math.min(n, Ya(t, l, p));\n }\n }\n\n return (r ? 1 : -1) * Math.sqrt(n);\n }(this.p, n), this.max = this.d + this.h * Math.SQRT2;\n }\n\n Qu.prototype.push = function (t) {\n this.data.push(t), this.length++, this._up(this.length - 1);\n }, Qu.prototype.pop = function () {\n if (0 !== this.length) {\n var t = this.data[0],\n e = this.data.pop();\n return this.length--, this.length > 0 && (this.data[0] = e, this._down(0)), t;\n }\n }, Qu.prototype.peek = function () {\n return this.data[0];\n }, Qu.prototype._up = function (t) {\n for (var e = this.data, r = this.compare, n = e[t]; t > 0;) {\n var i = t - 1 >> 1,\n a = e[i];\n if (r(n, a) >= 0) break;\n e[t] = a, t = i;\n }\n\n e[t] = n;\n }, Qu.prototype._down = function (t) {\n for (var e = this.data, r = this.compare, n = this.length >> 1, i = e[t]; t < n;) {\n var a = 1 + (t << 1),\n o = e[a],\n s = a + 1;\n if (s < this.length && r(e[s], o) < 0 && (a = s, o = e[s]), r(o, i) >= 0) break;\n e[t] = o, t = a;\n }\n\n e[t] = i;\n };\n var il = Number.POSITIVE_INFINITY;\n\n function al(t, e) {\n return e[1] !== il ? function (t, e, r) {\n var n = 0,\n i = 0;\n\n switch (e = Math.abs(e), r = Math.abs(r), t) {\n case "top-right":\n case "top-left":\n case "top":\n i = r - 7;\n break;\n\n case "bottom-right":\n case "bottom-left":\n case "bottom":\n i = 7 - r;\n }\n\n switch (t) {\n case "top-right":\n case "bottom-right":\n case "right":\n n = -e;\n break;\n\n case "top-left":\n case "bottom-left":\n case "left":\n n = e;\n }\n\n return [n, i];\n }(t, e[0], e[1]) : function (t, e) {\n var r = 0,\n n = 0;\n e < 0 && (e = 0);\n var i = e / Math.sqrt(2);\n\n switch (t) {\n case "top-right":\n case "top-left":\n n = i - 7;\n break;\n\n case "bottom-right":\n case "bottom-left":\n n = 7 - i;\n break;\n\n case "bottom":\n n = 7 - e;\n break;\n\n case "top":\n n = e - 7;\n }\n\n switch (t) {\n case "top-right":\n case "bottom-right":\n r = -i;\n break;\n\n case "top-left":\n case "bottom-left":\n r = i;\n break;\n\n case "left":\n r = e;\n break;\n\n case "right":\n r = -e;\n }\n\n return [r, n];\n }(t, e[0]);\n }\n\n function ol(t) {\n switch (t) {\n case "right":\n case "top-right":\n case "bottom-right":\n return "right";\n\n case "left":\n case "top-left":\n case "bottom-left":\n return "left";\n }\n\n return "center";\n }\n\n function sl(t, e, r, n, a, o, s, u, l, p, c, h, f, y, d) {\n var m = function (t, e, r, n, a, o, s, u) {\n for (var l = n.layout.get("text-rotate").evaluate(o, {}) * Math.PI / 180, p = [], c = 0, h = e.positionedLines; c < h.length; c += 1) {\n for (var f = h[c], y = 0, d = f.positionedGlyphs; y < d.length; y += 1) {\n var m = d[y];\n\n if (m.rect) {\n var v = m.rect || {},\n g = 4,\n x = !0,\n b = 1,\n w = 0,\n _ = (a || u) && m.vertical,\n A = m.metrics.advance * m.scale / 2;\n\n if (u && e.verticalizable && (w = f.lineOffset / 2 - (m.imageName ? -(24 - m.metrics.width * m.scale) / 2 : 24 * (m.scale - 1))), m.imageName) {\n var S = s[m.imageName];\n x = S.sdf, g = 1 / (b = S.pixelRatio);\n }\n\n var k = a ? [m.x + A, m.y] : [0, 0],\n I = a ? [0, 0] : [m.x + A + r[0], m.y + r[1] - w],\n z = [0, 0];\n _ && (z = I, I = [0, 0]);\n var C = (m.metrics.left - g) * m.scale - A + I[0],\n E = (-m.metrics.top - g) * m.scale + I[1],\n P = C + v.w * m.scale / b,\n M = E + v.h * m.scale / b,\n B = new i(C, E),\n T = new i(P, E),\n V = new i(C, M),\n F = new i(P, M);\n\n if (_) {\n var D = new i(-A, A - -17),\n L = -Math.PI / 2,\n O = 12 - A,\n R = new i(22 - O, -(m.imageName ? O : 0)),\n U = new (Function.prototype.bind.apply(i, [null].concat(z)))();\n B._rotateAround(L, D)._add(R)._add(U), T._rotateAround(L, D)._add(R)._add(U), V._rotateAround(L, D)._add(R)._add(U), F._rotateAround(L, D)._add(R)._add(U);\n }\n\n if (l) {\n var j = Math.sin(l),\n q = Math.cos(l),\n N = [q, -j, j, q];\n B._matMult(N), T._matMult(N), V._matMult(N), F._matMult(N);\n }\n\n var K = new i(0, 0),\n G = new i(0, 0);\n p.push({\n tl: B,\n tr: T,\n bl: V,\n br: F,\n tex: v,\n writingMode: e.writingMode,\n glyphOffset: k,\n sectionIndex: m.sectionIndex,\n isSDF: x,\n pixelOffsetTL: K,\n pixelOffsetBR: G,\n minFontScaleX: 0,\n minFontScaleY: 0\n });\n }\n }\n }\n\n return p;\n }(0, r, u, a, o, s, n, t.allowVerticalPlacement),\n v = t.textSizeData,\n g = null;\n\n "source" === v.kind ? (g = [128 * a.layout.get("text-size").evaluate(s, {})])[0] > 32640 && A(t.layerIds[0] + \': Value for "text-size" is >= 255. Reduce your "text-size".\') : "composite" === v.kind && ((g = [128 * y.compositeTextSizes[0].evaluate(s, {}, d), 128 * y.compositeTextSizes[1].evaluate(s, {}, d)])[0] > 32640 || g[1] > 32640) && A(t.layerIds[0] + \': Value for "text-size" is >= 255. Reduce your "text-size".\'), t.addSymbols(t.text, m, g, u, o, s, p, e, l.lineStartIndex, l.lineLength, f, d);\n\n for (var x = 0, b = c; x < b.length; x += 1) {\n h[b[x]] = t.text.placedSymbolArray.length - 1;\n }\n\n return 4 * m.length;\n }\n\n function ul(t) {\n for (var e in t) {\n return t[e];\n }\n\n return null;\n }\n\n function ll(t, e, r, n) {\n var i = t.compareText;\n\n if (e in i) {\n for (var a = i[e], o = a.length - 1; o >= 0; o--) {\n if (n.dist(a[o]) < r) return !0;\n }\n } else i[e] = [];\n\n return i[e].push(n), !1;\n }\n\n var pl = bs.VectorTileFeature.types,\n cl = [{\n name: "a_fade_opacity",\n components: 1,\n type: "Uint8",\n offset: 0\n }];\n\n function hl(t, e, r, n, i, a, o, s, u, l, p, c, h) {\n var f = s ? Math.min(32640, Math.round(s[0])) : 0,\n y = s ? Math.min(32640, Math.round(s[1])) : 0;\n t.emplaceBack(e, r, Math.round(32 * n), Math.round(32 * i), a, o, (f << 1) + (u ? 1 : 0), y, 16 * l, 16 * p, 256 * c, 256 * h);\n }\n\n function fl(t, e, r) {\n t.emplaceBack(e.x, e.y, r), t.emplaceBack(e.x, e.y, r), t.emplaceBack(e.x, e.y, r), t.emplaceBack(e.x, e.y, r);\n }\n\n function yl(t) {\n for (var e = 0, r = t.sections; e < r.length; e += 1) {\n if ($n(r[e].text)) return !0;\n }\n\n return !1;\n }\n\n var dl = function dl(t) {\n this.layoutVertexArray = new Vi(), this.indexArray = new ji(), this.programConfigurations = t, this.segments = new sa(), this.dynamicLayoutVertexArray = new Fi(), this.opacityVertexArray = new Di(), this.placedSymbolArray = new Qi();\n };\n\n dl.prototype.isEmpty = function () {\n return 0 === this.layoutVertexArray.length && 0 === this.indexArray.length && 0 === this.dynamicLayoutVertexArray.length && 0 === this.opacityVertexArray.length;\n }, dl.prototype.upload = function (t, e, r, n) {\n this.isEmpty() || (r && (this.layoutVertexBuffer = t.createVertexBuffer(this.layoutVertexArray, js.members), this.indexBuffer = t.createIndexBuffer(this.indexArray, e), this.dynamicLayoutVertexBuffer = t.createVertexBuffer(this.dynamicLayoutVertexArray, qs.members, !0), this.opacityVertexBuffer = t.createVertexBuffer(this.opacityVertexArray, cl, !0), this.opacityVertexBuffer.itemSize = 1), (r || n) && this.programConfigurations.upload(t));\n }, dl.prototype.destroy = function () {\n this.layoutVertexBuffer && (this.layoutVertexBuffer.destroy(), this.indexBuffer.destroy(), this.programConfigurations.destroy(), this.segments.destroy(), this.dynamicLayoutVertexBuffer.destroy(), this.opacityVertexBuffer.destroy());\n }, On("SymbolBuffers", dl);\n\n var ml = function ml(t, e, r) {\n this.layoutVertexArray = new t(), this.layoutAttributes = e, this.indexArray = new r(), this.segments = new sa(), this.collisionVertexArray = new Ui();\n };\n\n ml.prototype.upload = function (t) {\n this.layoutVertexBuffer = t.createVertexBuffer(this.layoutVertexArray, this.layoutAttributes), this.indexBuffer = t.createIndexBuffer(this.indexArray), this.collisionVertexBuffer = t.createVertexBuffer(this.collisionVertexArray, Ns.members, !0);\n }, ml.prototype.destroy = function () {\n this.layoutVertexBuffer && (this.layoutVertexBuffer.destroy(), this.indexBuffer.destroy(), this.segments.destroy(), this.collisionVertexBuffer.destroy());\n }, On("CollisionBuffers", ml);\n\n var vl = function vl(t) {\n this.collisionBoxArray = t.collisionBoxArray, this.zoom = t.zoom, this.overscaling = t.overscaling, this.layers = t.layers, this.layerIds = this.layers.map(function (t) {\n return t.id;\n }), this.index = t.index, this.pixelRatio = t.pixelRatio, this.sourceLayerIndex = t.sourceLayerIndex, this.hasPattern = !1, this.hasRTLText = !1, this.sortKeyRanges = [], this.collisionCircleArray = [], this.placementInvProjMatrix = oo([]), this.placementViewportMatrix = oo([]);\n var e = this.layers[0]._unevaluatedLayout._values;\n this.textSizeData = Du(this.zoom, e["text-size"]), this.iconSizeData = Du(this.zoom, e["icon-size"]);\n var r = this.layers[0].layout,\n n = r.get("symbol-sort-key"),\n i = r.get("symbol-z-order");\n this.canOverlap = r.get("text-allow-overlap") || r.get("icon-allow-overlap") || r.get("text-ignore-placement") || r.get("icon-ignore-placement"), this.sortFeaturesByKey = "viewport-y" !== i && void 0 !== n.constantOr(1), this.sortFeaturesByY = ("viewport-y" === i || "auto" === i && !this.sortFeaturesByKey) && this.canOverlap, "point" === r.get("symbol-placement") && (this.writingModes = r.get("text-writing-mode").map(function (t) {\n return wu[t];\n })), this.stateDependentLayerIds = this.layers.filter(function (t) {\n return t.isStateDependent();\n }).map(function (t) {\n return t.id;\n }), this.sourceID = t.sourceID;\n };\n\n vl.prototype.createArrays = function () {\n this.text = new dl(new Va(this.layers, this.zoom, function (t) {\n return /^text/.test(t);\n })), this.icon = new dl(new Va(this.layers, this.zoom, function (t) {\n return /^icon/.test(t);\n })), this.glyphOffsetArray = new ra(), this.lineVertexArray = new na(), this.symbolInstances = new ea();\n }, vl.prototype.calculateGlyphDependencies = function (t, e, r, n, i) {\n for (var a = 0; a < t.length; a++) {\n if (e[t.charCodeAt(a)] = !0, (r || n) && i) {\n var o = Xs[t.charAt(a)];\n o && (e[o.charCodeAt(0)] = !0);\n }\n }\n }, vl.prototype.populate = function (t, e, r) {\n var n = this.layers[0],\n i = n.layout,\n a = i.get("text-font"),\n o = i.get("text-field"),\n s = i.get("icon-image"),\n u = ("constant" !== o.value.kind || o.value.value instanceof ne && !o.value.value.isEmpty() || o.value.value.toString().length > 0) && ("constant" !== a.value.kind || a.value.value.length > 0),\n l = "constant" !== s.value.kind || !!s.value.value || Object.keys(s.parameters).length > 0,\n p = i.get("symbol-sort-key");\n\n if (this.features = [], u || l) {\n for (var c = e.iconDependencies, h = e.glyphDependencies, f = e.availableImages, y = new si(this.zoom), d = 0, m = t; d < m.length; d += 1) {\n var v = m[d],\n g = v.feature,\n x = v.id,\n b = v.index,\n w = v.sourceLayerIndex,\n _ = n._featureFilter.needGeometry,\n A = Ua(g, _);\n\n if (n._featureFilter.filter(y, A, r)) {\n _ || (A.geometry = Ra(g));\n var S = void 0;\n\n if (u) {\n var k = n.getValueAndResolveTokens("text-field", A, r, f),\n I = ne.factory(k);\n yl(I) && (this.hasRTLText = !0), (!this.hasRTLText || "unavailable" === ii() || this.hasRTLText && oi.isParsed()) && (S = Zs(I, n, A));\n }\n\n var z = void 0;\n\n if (l) {\n var C = n.getValueAndResolveTokens("icon-image", A, r, f);\n z = C instanceof ie ? C : ie.fromString(C);\n }\n\n if (S || z) {\n var E = this.sortFeaturesByKey ? p.evaluate(A, {}, r) : void 0;\n\n if (this.features.push({\n id: x,\n text: S,\n icon: z,\n index: b,\n sourceLayerIndex: w,\n geometry: A.geometry,\n properties: g.properties,\n type: pl[g.type],\n sortKey: E\n }), z && (c[z.name] = !0), S) {\n var P = a.evaluate(A, {}, r).join(","),\n M = "map" === i.get("text-rotation-alignment") && "point" !== i.get("symbol-placement");\n this.allowVerticalPlacement = this.writingModes && this.writingModes.indexOf(wu.vertical) >= 0;\n\n for (var B = 0, T = S.sections; B < T.length; B += 1) {\n var V = T[B];\n if (V.image) c[V.image.name] = !0;else {\n var F = Zn(S.toString()),\n D = V.fontStack || P,\n L = h[D] = h[D] || {};\n this.calculateGlyphDependencies(V.text, L, M, this.allowVerticalPlacement, F);\n }\n }\n }\n }\n }\n }\n\n "line" === i.get("symbol-placement") && (this.features = function (t) {\n var e = {},\n r = {},\n n = [],\n i = 0;\n\n function a(e) {\n n.push(t[e]), i++;\n }\n\n function o(t, e, i) {\n var a = r[t];\n return delete r[t], r[e] = a, n[a].geometry[0].pop(), n[a].geometry[0] = n[a].geometry[0].concat(i[0]), a;\n }\n\n function s(t, r, i) {\n var a = e[r];\n return delete e[r], e[t] = a, n[a].geometry[0].shift(), n[a].geometry[0] = i[0].concat(n[a].geometry[0]), a;\n }\n\n function u(t, e, r) {\n var n = r ? e[0][e[0].length - 1] : e[0][0];\n return t + ":" + n.x + ":" + n.y;\n }\n\n for (var l = 0; l < t.length; l++) {\n var p = t[l],\n c = p.geometry,\n h = p.text ? p.text.toString() : null;\n\n if (h) {\n var f = u(h, c),\n y = u(h, c, !0);\n\n if (f in r && y in e && r[f] !== e[y]) {\n var d = s(f, y, c),\n m = o(f, y, n[d].geometry);\n delete e[f], delete r[y], r[u(h, n[m].geometry, !0)] = m, n[d].geometry = null;\n } else f in r ? o(f, y, c) : y in e ? s(f, y, c) : (a(l), e[f] = i - 1, r[y] = i - 1);\n } else a(l);\n }\n\n return n.filter(function (t) {\n return t.geometry;\n });\n }(this.features)), this.sortFeaturesByKey && this.features.sort(function (t, e) {\n return t.sortKey - e.sortKey;\n });\n }\n }, vl.prototype.update = function (t, e, r) {\n this.stateDependentLayers.length && (this.text.programConfigurations.updatePaintArrays(t, e, this.layers, r), this.icon.programConfigurations.updatePaintArrays(t, e, this.layers, r));\n }, vl.prototype.isEmpty = function () {\n return 0 === this.symbolInstances.length && !this.hasRTLText;\n }, vl.prototype.uploadPending = function () {\n return !this.uploaded || this.text.programConfigurations.needsUpload || this.icon.programConfigurations.needsUpload;\n }, vl.prototype.upload = function (t) {\n !this.uploaded && this.hasDebugData() && (this.textCollisionBox.upload(t), this.iconCollisionBox.upload(t)), this.text.upload(t, this.sortFeaturesByY, !this.uploaded, this.text.programConfigurations.needsUpload), this.icon.upload(t, this.sortFeaturesByY, !this.uploaded, this.icon.programConfigurations.needsUpload), this.uploaded = !0;\n }, vl.prototype.destroyDebugData = function () {\n this.textCollisionBox.destroy(), this.iconCollisionBox.destroy();\n }, vl.prototype.destroy = function () {\n this.text.destroy(), this.icon.destroy(), this.hasDebugData() && this.destroyDebugData();\n }, vl.prototype.addToLineVertexArray = function (t, e) {\n var r = this.lineVertexArray.length;\n\n if (void 0 !== t.segment) {\n for (var n = t.dist(e[t.segment + 1]), i = t.dist(e[t.segment]), a = {}, o = t.segment + 1; o < e.length; o++) {\n a[o] = {\n x: e[o].x,\n y: e[o].y,\n tileUnitDistanceFromAnchor: n\n }, o < e.length - 1 && (n += e[o + 1].dist(e[o]));\n }\n\n for (var s = t.segment || 0; s >= 0; s--) {\n a[s] = {\n x: e[s].x,\n y: e[s].y,\n tileUnitDistanceFromAnchor: i\n }, s > 0 && (i += e[s - 1].dist(e[s]));\n }\n\n for (var u = 0; u < e.length; u++) {\n var l = a[u];\n this.lineVertexArray.emplaceBack(l.x, l.y, l.tileUnitDistanceFromAnchor);\n }\n }\n\n return {\n lineStartIndex: r,\n lineLength: this.lineVertexArray.length - r\n };\n }, vl.prototype.addSymbols = function (t, e, r, n, i, a, o, s, u, l, p, c) {\n for (var h = t.indexArray, f = t.layoutVertexArray, y = t.segments.prepareSegment(4 * e.length, f, h, this.canOverlap ? a.sortKey : void 0), d = this.glyphOffsetArray.length, m = y.vertexLength, v = this.allowVerticalPlacement && o === wu.vertical ? Math.PI / 2 : 0, g = a.text && a.text.sections, x = 0; x < e.length; x++) {\n var b = e[x],\n w = b.tl,\n _ = b.tr,\n A = b.bl,\n S = b.br,\n k = b.tex,\n I = b.pixelOffsetTL,\n z = b.pixelOffsetBR,\n C = b.minFontScaleX,\n E = b.minFontScaleY,\n P = b.glyphOffset,\n M = b.isSDF,\n B = b.sectionIndex,\n T = y.vertexLength,\n V = P[1];\n hl(f, s.x, s.y, w.x, V + w.y, k.x, k.y, r, M, I.x, I.y, C, E), hl(f, s.x, s.y, _.x, V + _.y, k.x + k.w, k.y, r, M, z.x, I.y, C, E), hl(f, s.x, s.y, A.x, V + A.y, k.x, k.y + k.h, r, M, I.x, z.y, C, E), hl(f, s.x, s.y, S.x, V + S.y, k.x + k.w, k.y + k.h, r, M, z.x, z.y, C, E), fl(t.dynamicLayoutVertexArray, s, v), h.emplaceBack(T, T + 1, T + 2), h.emplaceBack(T + 1, T + 2, T + 3), y.vertexLength += 4, y.primitiveLength += 2, this.glyphOffsetArray.emplaceBack(P[0]), x !== e.length - 1 && B === e[x + 1].sectionIndex || t.programConfigurations.populatePaintArrays(f.length, a, a.index, {}, c, g && g[B]);\n }\n\n t.placedSymbolArray.emplaceBack(s.x, s.y, d, this.glyphOffsetArray.length - d, m, u, l, s.segment, r ? r[0] : 0, r ? r[1] : 0, n[0], n[1], o, 0, !1, 0, p);\n }, vl.prototype._addCollisionDebugVertex = function (t, e, r, n, i, a) {\n return e.emplaceBack(0, 0), t.emplaceBack(r.x, r.y, n, i, Math.round(a.x), Math.round(a.y));\n }, vl.prototype.addCollisionDebugVertices = function (t, e, r, n, a, o, s) {\n var u = a.segments.prepareSegment(4, a.layoutVertexArray, a.indexArray),\n l = u.vertexLength,\n p = a.layoutVertexArray,\n c = a.collisionVertexArray,\n h = s.anchorX,\n f = s.anchorY;\n this._addCollisionDebugVertex(p, c, o, h, f, new i(t, e)), this._addCollisionDebugVertex(p, c, o, h, f, new i(r, e)), this._addCollisionDebugVertex(p, c, o, h, f, new i(r, n)), this._addCollisionDebugVertex(p, c, o, h, f, new i(t, n)), u.vertexLength += 4;\n var y = a.indexArray;\n y.emplaceBack(l, l + 1), y.emplaceBack(l + 1, l + 2), y.emplaceBack(l + 2, l + 3), y.emplaceBack(l + 3, l), u.primitiveLength += 4;\n }, vl.prototype.addDebugCollisionBoxes = function (t, e, r, n) {\n for (var i = t; i < e; i++) {\n var a = this.collisionBoxArray.get(i);\n this.addCollisionDebugVertices(a.x1, a.y1, a.x2, a.y2, n ? this.textCollisionBox : this.iconCollisionBox, a.anchorPoint, r);\n }\n }, vl.prototype.generateCollisionDebugBuffers = function () {\n this.hasDebugData() && this.destroyDebugData(), this.textCollisionBox = new ml(Oi, Ks.members, Xi), this.iconCollisionBox = new ml(Oi, Ks.members, Xi);\n\n for (var t = 0; t < this.symbolInstances.length; t++) {\n var e = this.symbolInstances.get(t);\n this.addDebugCollisionBoxes(e.textBoxStartIndex, e.textBoxEndIndex, e, !0), this.addDebugCollisionBoxes(e.verticalTextBoxStartIndex, e.verticalTextBoxEndIndex, e, !0), this.addDebugCollisionBoxes(e.iconBoxStartIndex, e.iconBoxEndIndex, e, !1), this.addDebugCollisionBoxes(e.verticalIconBoxStartIndex, e.verticalIconBoxEndIndex, e, !1);\n }\n }, vl.prototype._deserializeCollisionBoxesForSymbol = function (t, e, r, n, i, a, o, s, u) {\n for (var l = {}, p = e; p < r; p++) {\n var c = t.get(p);\n l.textBox = {\n x1: c.x1,\n y1: c.y1,\n x2: c.x2,\n y2: c.y2,\n anchorPointX: c.anchorPointX,\n anchorPointY: c.anchorPointY\n }, l.textFeatureIndex = c.featureIndex;\n break;\n }\n\n for (var h = n; h < i; h++) {\n var f = t.get(h);\n l.verticalTextBox = {\n x1: f.x1,\n y1: f.y1,\n x2: f.x2,\n y2: f.y2,\n anchorPointX: f.anchorPointX,\n anchorPointY: f.anchorPointY\n }, l.verticalTextFeatureIndex = f.featureIndex;\n break;\n }\n\n for (var y = a; y < o; y++) {\n var d = t.get(y);\n l.iconBox = {\n x1: d.x1,\n y1: d.y1,\n x2: d.x2,\n y2: d.y2,\n anchorPointX: d.anchorPointX,\n anchorPointY: d.anchorPointY\n }, l.iconFeatureIndex = d.featureIndex;\n break;\n }\n\n for (var m = s; m < u; m++) {\n var v = t.get(m);\n l.verticalIconBox = {\n x1: v.x1,\n y1: v.y1,\n x2: v.x2,\n y2: v.y2,\n anchorPointX: v.anchorPointX,\n anchorPointY: v.anchorPointY\n }, l.verticalIconFeatureIndex = v.featureIndex;\n break;\n }\n\n return l;\n }, vl.prototype.deserializeCollisionBoxes = function (t) {\n this.collisionArrays = [];\n\n for (var e = 0; e < this.symbolInstances.length; e++) {\n var r = this.symbolInstances.get(e);\n this.collisionArrays.push(this._deserializeCollisionBoxesForSymbol(t, r.textBoxStartIndex, r.textBoxEndIndex, r.verticalTextBoxStartIndex, r.verticalTextBoxEndIndex, r.iconBoxStartIndex, r.iconBoxEndIndex, r.verticalIconBoxStartIndex, r.verticalIconBoxEndIndex));\n }\n }, vl.prototype.hasTextData = function () {\n return this.text.segments.get().length > 0;\n }, vl.prototype.hasIconData = function () {\n return this.icon.segments.get().length > 0;\n }, vl.prototype.hasDebugData = function () {\n return this.textCollisionBox && this.iconCollisionBox;\n }, vl.prototype.hasTextCollisionBoxData = function () {\n return this.hasDebugData() && this.textCollisionBox.segments.get().length > 0;\n }, vl.prototype.hasIconCollisionBoxData = function () {\n return this.hasDebugData() && this.iconCollisionBox.segments.get().length > 0;\n }, vl.prototype.addIndicesForPlacedSymbol = function (t, e) {\n for (var r = t.placedSymbolArray.get(e), n = r.vertexStartIndex + 4 * r.numGlyphs, i = r.vertexStartIndex; i < n; i += 4) {\n t.indexArray.emplaceBack(i, i + 1, i + 2), t.indexArray.emplaceBack(i + 1, i + 2, i + 3);\n }\n }, vl.prototype.getSortedSymbolIndexes = function (t) {\n if (this.sortedAngle === t && void 0 !== this.symbolInstanceIndexes) return this.symbolInstanceIndexes;\n\n for (var e = Math.sin(t), r = Math.cos(t), n = [], i = [], a = [], o = 0; o < this.symbolInstances.length; ++o) {\n a.push(o);\n var s = this.symbolInstances.get(o);\n n.push(0 | Math.round(e * s.anchorX + r * s.anchorY)), i.push(s.featureIndex);\n }\n\n return a.sort(function (t, e) {\n return n[t] - n[e] || i[e] - i[t];\n }), a;\n }, vl.prototype.addToSortKeyRanges = function (t, e) {\n var r = this.sortKeyRanges[this.sortKeyRanges.length - 1];\n r && r.sortKey === e ? r.symbolInstanceEnd = t + 1 : this.sortKeyRanges.push({\n sortKey: e,\n symbolInstanceStart: t,\n symbolInstanceEnd: t + 1\n });\n }, vl.prototype.sortFeatures = function (t) {\n var e = this;\n\n if (this.sortFeaturesByY && this.sortedAngle !== t && !(this.text.segments.get().length > 1 || this.icon.segments.get().length > 1)) {\n this.symbolInstanceIndexes = this.getSortedSymbolIndexes(t), this.sortedAngle = t, this.text.indexArray.clear(), this.icon.indexArray.clear(), this.featureSortOrder = [];\n\n for (var r = 0, n = this.symbolInstanceIndexes; r < n.length; r += 1) {\n var i = this.symbolInstances.get(n[r]);\n this.featureSortOrder.push(i.featureIndex), [i.rightJustifiedTextSymbolIndex, i.centerJustifiedTextSymbolIndex, i.leftJustifiedTextSymbolIndex].forEach(function (t, r, n) {\n t >= 0 && n.indexOf(t) === r && e.addIndicesForPlacedSymbol(e.text, t);\n }), i.verticalPlacedTextSymbolIndex >= 0 && this.addIndicesForPlacedSymbol(this.text, i.verticalPlacedTextSymbolIndex), i.placedIconSymbolIndex >= 0 && this.addIndicesForPlacedSymbol(this.icon, i.placedIconSymbolIndex), i.verticalPlacedIconSymbolIndex >= 0 && this.addIndicesForPlacedSymbol(this.icon, i.verticalPlacedIconSymbolIndex);\n }\n\n this.text.indexBuffer && this.text.indexBuffer.updateData(this.text.indexArray), this.icon.indexBuffer && this.icon.indexBuffer.updateData(this.icon.indexArray);\n }\n }, On("SymbolBucket", vl, {\n omit: ["layers", "collisionBoxArray", "features", "compareText"]\n }), vl.MAX_GLYPHS = 65535, vl.addDynamicAttributes = fl;\n\n var gl = new wi({\n "symbol-placement": new mi(Et.layout_symbol["symbol-placement"]),\n "symbol-spacing": new mi(Et.layout_symbol["symbol-spacing"]),\n "symbol-avoid-edges": new mi(Et.layout_symbol["symbol-avoid-edges"]),\n "symbol-sort-key": new vi(Et.layout_symbol["symbol-sort-key"]),\n "symbol-z-order": new mi(Et.layout_symbol["symbol-z-order"]),\n "icon-allow-overlap": new mi(Et.layout_symbol["icon-allow-overlap"]),\n "icon-ignore-placement": new mi(Et.layout_symbol["icon-ignore-placement"]),\n "icon-optional": new mi(Et.layout_symbol["icon-optional"]),\n "icon-rotation-alignment": new mi(Et.layout_symbol["icon-rotation-alignment"]),\n "icon-size": new vi(Et.layout_symbol["icon-size"]),\n "icon-text-fit": new mi(Et.layout_symbol["icon-text-fit"]),\n "icon-text-fit-padding": new mi(Et.layout_symbol["icon-text-fit-padding"]),\n "icon-image": new vi(Et.layout_symbol["icon-image"]),\n "icon-rotate": new vi(Et.layout_symbol["icon-rotate"]),\n "icon-padding": new mi(Et.layout_symbol["icon-padding"]),\n "icon-keep-upright": new mi(Et.layout_symbol["icon-keep-upright"]),\n "icon-offset": new vi(Et.layout_symbol["icon-offset"]),\n "icon-anchor": new vi(Et.layout_symbol["icon-anchor"]),\n "icon-pitch-alignment": new mi(Et.layout_symbol["icon-pitch-alignment"]),\n "text-pitch-alignment": new mi(Et.layout_symbol["text-pitch-alignment"]),\n "text-rotation-alignment": new mi(Et.layout_symbol["text-rotation-alignment"]),\n "text-field": new vi(Et.layout_symbol["text-field"]),\n "text-font": new vi(Et.layout_symbol["text-font"]),\n "text-size": new vi(Et.layout_symbol["text-size"]),\n "text-max-width": new vi(Et.layout_symbol["text-max-width"]),\n "text-line-height": new mi(Et.layout_symbol["text-line-height"]),\n "text-letter-spacing": new vi(Et.layout_symbol["text-letter-spacing"]),\n "text-justify": new vi(Et.layout_symbol["text-justify"]),\n "text-radial-offset": new vi(Et.layout_symbol["text-radial-offset"]),\n "text-variable-anchor": new mi(Et.layout_symbol["text-variable-anchor"]),\n "text-anchor": new vi(Et.layout_symbol["text-anchor"]),\n "text-max-angle": new mi(Et.layout_symbol["text-max-angle"]),\n "text-writing-mode": new mi(Et.layout_symbol["text-writing-mode"]),\n "text-rotate": new vi(Et.layout_symbol["text-rotate"]),\n "text-padding": new mi(Et.layout_symbol["text-padding"]),\n "text-keep-upright": new mi(Et.layout_symbol["text-keep-upright"]),\n "text-transform": new vi(Et.layout_symbol["text-transform"]),\n "text-offset": new vi(Et.layout_symbol["text-offset"]),\n "text-allow-overlap": new mi(Et.layout_symbol["text-allow-overlap"]),\n "text-ignore-placement": new mi(Et.layout_symbol["text-ignore-placement"]),\n "text-optional": new mi(Et.layout_symbol["text-optional"])\n }),\n xl = {\n paint: new wi({\n "icon-opacity": new vi(Et.paint_symbol["icon-opacity"]),\n "icon-color": new vi(Et.paint_symbol["icon-color"]),\n "icon-halo-color": new vi(Et.paint_symbol["icon-halo-color"]),\n "icon-halo-width": new vi(Et.paint_symbol["icon-halo-width"]),\n "icon-halo-blur": new vi(Et.paint_symbol["icon-halo-blur"]),\n "icon-translate": new mi(Et.paint_symbol["icon-translate"]),\n "icon-translate-anchor": new mi(Et.paint_symbol["icon-translate-anchor"]),\n "text-opacity": new vi(Et.paint_symbol["text-opacity"]),\n "text-color": new vi(Et.paint_symbol["text-color"], {\n runtimeType: jt,\n getOverride: function getOverride(t) {\n return t.textColor;\n },\n hasOverride: function hasOverride(t) {\n return !!t.textColor;\n }\n }),\n "text-halo-color": new vi(Et.paint_symbol["text-halo-color"]),\n "text-halo-width": new vi(Et.paint_symbol["text-halo-width"]),\n "text-halo-blur": new vi(Et.paint_symbol["text-halo-blur"]),\n "text-translate": new mi(Et.paint_symbol["text-translate"]),\n "text-translate-anchor": new mi(Et.paint_symbol["text-translate-anchor"])\n }),\n layout: gl\n },\n bl = function bl(t) {\n this.type = t.property.overrides ? t.property.overrides.runtimeType : Lt, this.defaultValue = t;\n };\n\n bl.prototype.evaluate = function (t) {\n if (t.formattedSection) {\n var e = this.defaultValue.property.overrides;\n if (e && e.hasOverride(t.formattedSection)) return e.getOverride(t.formattedSection);\n }\n\n return t.feature && t.featureState ? this.defaultValue.evaluate(t.feature, t.featureState) : this.defaultValue.property.specification.default;\n }, bl.prototype.eachChild = function (t) {\n this.defaultValue.isConstant() || t(this.defaultValue.value._styleExpression.expression);\n }, bl.prototype.outputDefined = function () {\n return !1;\n }, bl.prototype.serialize = function () {\n return null;\n }, On("FormatSectionOverride", bl, {\n omit: ["defaultValue"]\n });\n\n var wl = function (t) {\n function e(e) {\n t.call(this, e, xl);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.recalculate = function (e, r) {\n if (t.prototype.recalculate.call(this, e, r), "auto" === this.layout.get("icon-rotation-alignment") && (this.layout._values["icon-rotation-alignment"] = "point" !== this.layout.get("symbol-placement") ? "map" : "viewport"), "auto" === this.layout.get("text-rotation-alignment") && (this.layout._values["text-rotation-alignment"] = "point" !== this.layout.get("symbol-placement") ? "map" : "viewport"), "auto" === this.layout.get("text-pitch-alignment") && (this.layout._values["text-pitch-alignment"] = this.layout.get("text-rotation-alignment")), "auto" === this.layout.get("icon-pitch-alignment") && (this.layout._values["icon-pitch-alignment"] = this.layout.get("icon-rotation-alignment")), "point" === this.layout.get("symbol-placement")) {\n var n = this.layout.get("text-writing-mode");\n\n if (n) {\n for (var i = [], a = 0, o = n; a < o.length; a += 1) {\n var s = o[a];\n i.indexOf(s) < 0 && i.push(s);\n }\n\n this.layout._values["text-writing-mode"] = i;\n } else this.layout._values["text-writing-mode"] = ["horizontal"];\n }\n\n this._setPaintOverrides();\n }, e.prototype.getValueAndResolveTokens = function (t, e, r, n) {\n var i = this.layout.get(t).evaluate(e, {}, r, n),\n a = this._unevaluatedLayout._values[t];\n return a.isDataDriven() || Gr(a.value) || !i ? i : function (t, e) {\n return e.replace(/{([^{}]+)}/g, function (e, r) {\n return r in t ? String(t[r]) : "";\n });\n }(e.properties, i);\n }, e.prototype.createBucket = function (t) {\n return new vl(t);\n }, e.prototype.queryRadius = function () {\n return 0;\n }, e.prototype.queryIntersectsFeature = function () {\n return !1;\n }, e.prototype._setPaintOverrides = function () {\n for (var t = 0, r = xl.paint.overridableProperties; t < r.length; t += 1) {\n var n = r[t];\n\n if (e.hasPaintOverride(this.layout, n)) {\n var i,\n a = this.paint.get(n),\n o = new bl(a),\n s = new Kr(o, a.property.specification);\n i = "constant" === a.value.kind || "source" === a.value.kind ? new Xr("source", s) : new Jr("composite", s, a.value.zoomStops, a.value._interpolationType), this.paint._values[n] = new yi(a.property, i, a.parameters);\n }\n }\n }, e.prototype._handleOverridablePaintPropertyUpdate = function (t, r, n) {\n return !(!this.layout || r.isDataDriven() || n.isDataDriven()) && e.hasPaintOverride(this.layout, t);\n }, e.hasPaintOverride = function (t, e) {\n var r = t.get("text-field"),\n n = xl.paint.properties[e],\n i = !1,\n a = function a(t) {\n for (var e = 0, r = t; e < r.length; e += 1) {\n if (n.overrides && n.overrides.hasOverride(r[e])) return void (i = !0);\n }\n };\n\n if ("constant" === r.value.kind && r.value.value instanceof ne) a(r.value.value.sections);else if ("source" === r.value.kind) {\n var o = function o(t) {\n i || (t instanceof le && se(t.value) === Gt ? a(t.value.sections) : t instanceof fe ? a(t.sections) : t.eachChild(o));\n },\n s = r.value;\n\n s._styleExpression && o(s._styleExpression.expression);\n }\n return i;\n }, e;\n }(_i),\n _l = {\n paint: new wi({\n "background-color": new mi(Et.paint_background["background-color"]),\n "background-pattern": new xi(Et.paint_background["background-pattern"]),\n "background-opacity": new mi(Et.paint_background["background-opacity"])\n })\n },\n Al = function (t) {\n function e(e) {\n t.call(this, e, _l);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e;\n }(_i),\n Sl = {\n paint: new wi({\n "raster-opacity": new mi(Et.paint_raster["raster-opacity"]),\n "raster-hue-rotate": new mi(Et.paint_raster["raster-hue-rotate"]),\n "raster-brightness-min": new mi(Et.paint_raster["raster-brightness-min"]),\n "raster-brightness-max": new mi(Et.paint_raster["raster-brightness-max"]),\n "raster-saturation": new mi(Et.paint_raster["raster-saturation"]),\n "raster-contrast": new mi(Et.paint_raster["raster-contrast"]),\n "raster-resampling": new mi(Et.paint_raster["raster-resampling"]),\n "raster-fade-duration": new mi(Et.paint_raster["raster-fade-duration"])\n })\n },\n kl = function (t) {\n function e(e) {\n t.call(this, e, Sl);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e;\n }(_i),\n Il = function (t) {\n function e(e) {\n t.call(this, e, {}), this.implementation = e;\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.is3D = function () {\n return "3d" === this.implementation.renderingMode;\n }, e.prototype.hasOffscreenPass = function () {\n return void 0 !== this.implementation.prerender;\n }, e.prototype.recalculate = function () {}, e.prototype.updateTransitions = function () {}, e.prototype.hasTransition = function () {}, e.prototype.serialize = function () {}, e.prototype.onAdd = function (t) {\n this.implementation.onAdd && this.implementation.onAdd(t, t.painter.context.gl);\n }, e.prototype.onRemove = function (t) {\n this.implementation.onRemove && this.implementation.onRemove(t, t.painter.context.gl);\n }, e;\n }(_i),\n zl = {\n circle: co,\n heatmap: _o,\n hillshade: So,\n fill: ps,\n "fill-extrusion": zs,\n line: Rs,\n symbol: wl,\n background: Al,\n raster: kl\n },\n Cl = o.HTMLImageElement,\n El = o.HTMLCanvasElement,\n Pl = o.HTMLVideoElement,\n Ml = o.ImageData,\n Bl = o.ImageBitmap,\n Tl = function Tl(t, e, r, n) {\n this.context = t, this.format = r, this.texture = t.gl.createTexture(), this.update(e, n);\n };\n\n Tl.prototype.update = function (t, e, r) {\n var n = t.width,\n i = t.height,\n a = !(this.size && this.size[0] === n && this.size[1] === i || r),\n o = this.context,\n s = o.gl;\n if (this.useMipmap = Boolean(e && e.useMipmap), s.bindTexture(s.TEXTURE_2D, this.texture), o.pixelStoreUnpackFlipY.set(!1), o.pixelStoreUnpack.set(1), o.pixelStoreUnpackPremultiplyAlpha.set(this.format === s.RGBA && (!e || !1 !== e.premultiply)), a) this.size = [n, i], t instanceof Cl || t instanceof El || t instanceof Pl || t instanceof Ml || Bl && t instanceof Bl ? s.texImage2D(s.TEXTURE_2D, 0, this.format, this.format, s.UNSIGNED_BYTE, t) : s.texImage2D(s.TEXTURE_2D, 0, this.format, n, i, 0, this.format, s.UNSIGNED_BYTE, t.data);else {\n var u = r || {\n x: 0,\n y: 0\n },\n l = u.x,\n p = u.y;\n t instanceof Cl || t instanceof El || t instanceof Pl || t instanceof Ml || Bl && t instanceof Bl ? s.texSubImage2D(s.TEXTURE_2D, 0, l, p, s.RGBA, s.UNSIGNED_BYTE, t) : s.texSubImage2D(s.TEXTURE_2D, 0, l, p, n, i, s.RGBA, s.UNSIGNED_BYTE, t.data);\n }\n this.useMipmap && this.isSizePowerOfTwo() && s.generateMipmap(s.TEXTURE_2D);\n }, Tl.prototype.bind = function (t, e, r) {\n var n = this.context.gl;\n n.bindTexture(n.TEXTURE_2D, this.texture), r !== n.LINEAR_MIPMAP_NEAREST || this.isSizePowerOfTwo() || (r = n.LINEAR), t !== this.filter && (n.texParameteri(n.TEXTURE_2D, n.TEXTURE_MAG_FILTER, t), n.texParameteri(n.TEXTURE_2D, n.TEXTURE_MIN_FILTER, r || t), this.filter = t), e !== this.wrap && (n.texParameteri(n.TEXTURE_2D, n.TEXTURE_WRAP_S, e), n.texParameteri(n.TEXTURE_2D, n.TEXTURE_WRAP_T, e), this.wrap = e);\n }, Tl.prototype.isSizePowerOfTwo = function () {\n return this.size[0] === this.size[1] && Math.log(this.size[0]) / Math.LN2 % 1 == 0;\n }, Tl.prototype.destroy = function () {\n this.context.gl.deleteTexture(this.texture), this.texture = null;\n };\n\n var Vl = function Vl(t) {\n var e = this;\n this._callback = t, this._triggered = !1, "undefined" != typeof MessageChannel && (this._channel = new MessageChannel(), this._channel.port2.onmessage = function () {\n e._triggered = !1, e._callback();\n });\n };\n\n Vl.prototype.trigger = function () {\n var t = this;\n this._triggered || (this._triggered = !0, this._channel ? this._channel.port1.postMessage(!0) : setTimeout(function () {\n t._triggered = !1, t._callback();\n }, 0));\n }, Vl.prototype.remove = function () {\n delete this._channel, this._callback = function () {};\n };\n\n var Fl = function Fl(t, e, r) {\n this.target = t, this.parent = e, this.mapId = r, this.callbacks = {}, this.tasks = {}, this.taskQueue = [], this.cancelCallbacks = {}, v(["receive", "process"], this), this.invoker = new Vl(this.process), this.target.addEventListener("message", this.receive, !1), this.globalScope = I() ? t : o;\n };\n\n function Dl(t, e, r) {\n var n = 2 * Math.PI * 6378137 / 256 / Math.pow(2, r);\n return [t * n - 2 * Math.PI * 6378137 / 2, e * n - 2 * Math.PI * 6378137 / 2];\n }\n\n Fl.prototype.send = function (t, e, r, n, i) {\n var a = this;\n void 0 === i && (i = !1);\n var o = Math.round(1e18 * Math.random()).toString(36).substring(0, 10);\n r && (this.callbacks[o] = r);\n var s = E(this.globalScope) ? void 0 : [];\n return this.target.postMessage({\n id: o,\n type: t,\n hasCallback: !!r,\n targetMapId: n,\n mustQueue: i,\n sourceMapId: this.mapId,\n data: qn(e, s)\n }, s), {\n cancel: function cancel() {\n r && delete a.callbacks[o], a.target.postMessage({\n id: o,\n type: "",\n targetMapId: n,\n sourceMapId: a.mapId\n });\n }\n };\n }, Fl.prototype.receive = function (t) {\n var e = t.data,\n r = e.id;\n if (r && (!e.targetMapId || this.mapId === e.targetMapId)) if ("" === e.type) {\n delete this.tasks[r];\n var n = this.cancelCallbacks[r];\n delete this.cancelCallbacks[r], n && n();\n } else I() || e.mustQueue ? (this.tasks[r] = e, this.taskQueue.push(r), this.invoker.trigger()) : this.processTask(r, e);\n }, Fl.prototype.process = function () {\n if (this.taskQueue.length) {\n var t = this.taskQueue.shift(),\n e = this.tasks[t];\n delete this.tasks[t], this.taskQueue.length && this.invoker.trigger(), e && this.processTask(t, e);\n }\n }, Fl.prototype.processTask = function (t, e) {\n var r = this;\n\n if ("" === e.type) {\n var n = this.callbacks[t];\n delete this.callbacks[t], n && (e.error ? n(Nn(e.error)) : n(null, Nn(e.data)));\n } else {\n var i = !1,\n a = E(this.globalScope) ? void 0 : [],\n o = e.hasCallback ? function (e, n) {\n i = !0, delete r.cancelCallbacks[t], r.target.postMessage({\n id: t,\n type: "",\n sourceMapId: r.mapId,\n error: e ? qn(e) : null,\n data: qn(n, a)\n }, a);\n } : function (t) {\n i = !0;\n },\n s = null,\n u = Nn(e.data);\n if (this.parent[e.type]) s = this.parent[e.type](e.sourceMapId, u, o);else if (this.parent.getWorkerSource) {\n var l = e.type.split(".");\n s = this.parent.getWorkerSource(e.sourceMapId, l[0], u.source)[l[1]](u, o);\n } else o(new Error("Could not find function " + e.type));\n !i && s && s.cancel && (this.cancelCallbacks[t] = s.cancel);\n }\n }, Fl.prototype.remove = function () {\n this.invoker.remove(), this.target.removeEventListener("message", this.receive, !1);\n };\n\n var Ll = function Ll(t, e) {\n t && (e ? this.setSouthWest(t).setNorthEast(e) : 4 === t.length ? this.setSouthWest([t[0], t[1]]).setNorthEast([t[2], t[3]]) : this.setSouthWest(t[0]).setNorthEast(t[1]));\n };\n\n Ll.prototype.setNorthEast = function (t) {\n return this._ne = t instanceof Ol ? new Ol(t.lng, t.lat) : Ol.convert(t), this;\n }, Ll.prototype.setSouthWest = function (t) {\n return this._sw = t instanceof Ol ? new Ol(t.lng, t.lat) : Ol.convert(t), this;\n }, Ll.prototype.extend = function (t) {\n var e,\n r,\n n = this._sw,\n i = this._ne;\n if (t instanceof Ol) e = t, r = t;else {\n if (!(t instanceof Ll)) return Array.isArray(t) ? 4 === t.length || t.every(Array.isArray) ? this.extend(Ll.convert(t)) : this.extend(Ol.convert(t)) : this;\n if (r = t._ne, !(e = t._sw) || !r) return this;\n }\n return n || i ? (n.lng = Math.min(e.lng, n.lng), n.lat = Math.min(e.lat, n.lat), i.lng = Math.max(r.lng, i.lng), i.lat = Math.max(r.lat, i.lat)) : (this._sw = new Ol(e.lng, e.lat), this._ne = new Ol(r.lng, r.lat)), this;\n }, Ll.prototype.getCenter = function () {\n return new Ol((this._sw.lng + this._ne.lng) / 2, (this._sw.lat + this._ne.lat) / 2);\n }, Ll.prototype.getSouthWest = function () {\n return this._sw;\n }, Ll.prototype.getNorthEast = function () {\n return this._ne;\n }, Ll.prototype.getNorthWest = function () {\n return new Ol(this.getWest(), this.getNorth());\n }, Ll.prototype.getSouthEast = function () {\n return new Ol(this.getEast(), this.getSouth());\n }, Ll.prototype.getWest = function () {\n return this._sw.lng;\n }, Ll.prototype.getSouth = function () {\n return this._sw.lat;\n }, Ll.prototype.getEast = function () {\n return this._ne.lng;\n }, Ll.prototype.getNorth = function () {\n return this._ne.lat;\n }, Ll.prototype.toArray = function () {\n return [this._sw.toArray(), this._ne.toArray()];\n }, Ll.prototype.toString = function () {\n return "LngLatBounds(" + this._sw.toString() + ", " + this._ne.toString() + ")";\n }, Ll.prototype.isEmpty = function () {\n return !(this._sw && this._ne);\n }, Ll.prototype.contains = function (t) {\n var e = Ol.convert(t),\n r = e.lng,\n n = e.lat,\n i = this._sw.lng <= r && r <= this._ne.lng;\n return this._sw.lng > this._ne.lng && (i = this._sw.lng >= r && r >= this._ne.lng), this._sw.lat <= n && n <= this._ne.lat && i;\n }, Ll.convert = function (t) {\n return !t || t instanceof Ll ? t : new Ll(t);\n };\n\n var Ol = function Ol(t, e) {\n if (isNaN(t) || isNaN(e)) throw new Error("Invalid LngLat object: (" + t + ", " + e + ")");\n if (this.lng = +t, this.lat = +e, this.lat > 90 || this.lat < -90) throw new Error("Invalid LngLat latitude value: must be between -90 and 90");\n };\n\n Ol.prototype.wrap = function () {\n return new Ol(c(this.lng, -180, 180), this.lat);\n }, Ol.prototype.toArray = function () {\n return [this.lng, this.lat];\n }, Ol.prototype.toString = function () {\n return "LngLat(" + this.lng + ", " + this.lat + ")";\n }, Ol.prototype.distanceTo = function (t) {\n var e = Math.PI / 180,\n r = this.lat * e,\n n = t.lat * e,\n i = Math.sin(r) * Math.sin(n) + Math.cos(r) * Math.cos(n) * Math.cos((t.lng - this.lng) * e);\n return 6371008.8 * Math.acos(Math.min(i, 1));\n }, Ol.prototype.toBounds = function (t) {\n void 0 === t && (t = 0);\n var e = 360 * t / 40075017,\n r = e / Math.cos(Math.PI / 180 * this.lat);\n return new Ll(new Ol(this.lng - r, this.lat - e), new Ol(this.lng + r, this.lat + e));\n }, Ol.convert = function (t) {\n if (t instanceof Ol) return t;\n if (Array.isArray(t) && (2 === t.length || 3 === t.length)) return new Ol(Number(t[0]), Number(t[1]));\n if (!Array.isArray(t) && "object" == typeof t && null !== t) return new Ol(Number("lng" in t ? t.lng : t.lon), Number(t.lat));\n throw new Error("`LngLatLike` argument must be specified as a LngLat instance, an object {lng: , lat: }, an object {lon: , lat: }, or an array of [, ]");\n };\n var Rl = 2 * Math.PI * 6371008.8;\n\n function Ul(t) {\n return Rl * Math.cos(t * Math.PI / 180);\n }\n\n function jl(t) {\n return (180 + t) / 360;\n }\n\n function ql(t) {\n return (180 - 180 / Math.PI * Math.log(Math.tan(Math.PI / 4 + t * Math.PI / 360))) / 360;\n }\n\n function Nl(t, e) {\n return t / Ul(e);\n }\n\n function Kl(t) {\n return 360 / Math.PI * Math.atan(Math.exp((180 - 360 * t) * Math.PI / 180)) - 90;\n }\n\n var Gl = function Gl(t, e, r) {\n void 0 === r && (r = 0), this.x = +t, this.y = +e, this.z = +r;\n };\n\n Gl.fromLngLat = function (t, e) {\n void 0 === e && (e = 0);\n var r = Ol.convert(t);\n return new Gl(jl(r.lng), ql(r.lat), Nl(e, r.lat));\n }, Gl.prototype.toLngLat = function () {\n return new Ol(360 * this.x - 180, Kl(this.y));\n }, Gl.prototype.toAltitude = function () {\n return this.z * Ul(Kl(this.y));\n }, Gl.prototype.meterInMercatorCoordinateUnits = function () {\n return 1 / Rl * (t = Kl(this.y), 1 / Math.cos(t * Math.PI / 180));\n var t;\n };\n\n var Zl = function Zl(t, e, r) {\n this.z = t, this.x = e, this.y = r, this.key = Hl(0, t, t, e, r);\n };\n\n Zl.prototype.equals = function (t) {\n return this.z === t.z && this.x === t.x && this.y === t.y;\n }, Zl.prototype.url = function (t, e) {\n var r,\n n,\n i,\n a,\n o,\n s = (n = this.y, i = this.z, a = Dl(256 * (r = this.x), 256 * (n = Math.pow(2, i) - n - 1), i), o = Dl(256 * (r + 1), 256 * (n + 1), i), a[0] + "," + a[1] + "," + o[0] + "," + o[1]),\n u = function (t, e, r) {\n for (var n, i = "", a = t; a > 0; a--) {\n i += (e & (n = 1 << a - 1) ? 1 : 0) + (r & n ? 2 : 0);\n }\n\n return i;\n }(this.z, this.x, this.y);\n\n return t[(this.x + this.y) % t.length].replace("{prefix}", (this.x % 16).toString(16) + (this.y % 16).toString(16)).replace("{z}", String(this.z)).replace("{x}", String(this.x)).replace("{y}", String("tms" === e ? Math.pow(2, this.z) - this.y - 1 : this.y)).replace("{quadkey}", u).replace("{bbox-epsg-3857}", s);\n }, Zl.prototype.getTilePoint = function (t) {\n var e = Math.pow(2, this.z);\n return new i(8192 * (t.x * e - this.x), 8192 * (t.y * e - this.y));\n }, Zl.prototype.toString = function () {\n return this.z + "/" + this.x + "/" + this.y;\n };\n\n var Xl = function Xl(t, e) {\n this.wrap = t, this.canonical = e, this.key = Hl(t, e.z, e.z, e.x, e.y);\n },\n Jl = function Jl(t, e, r, n, i) {\n this.overscaledZ = t, this.wrap = e, this.canonical = new Zl(r, +n, +i), this.key = Hl(e, t, r, n, i);\n };\n\n function Hl(t, e, r, n, i) {\n (t *= 2) < 0 && (t = -1 * t - 1);\n var a = 1 << r;\n return (a * a * t + a * i + n).toString(36) + r.toString(36) + e.toString(36);\n }\n\n Jl.prototype.equals = function (t) {\n return this.overscaledZ === t.overscaledZ && this.wrap === t.wrap && this.canonical.equals(t.canonical);\n }, Jl.prototype.scaledTo = function (t) {\n var e = this.canonical.z - t;\n return t > this.canonical.z ? new Jl(t, this.wrap, this.canonical.z, this.canonical.x, this.canonical.y) : new Jl(t, this.wrap, t, this.canonical.x >> e, this.canonical.y >> e);\n }, Jl.prototype.calculateScaledKey = function (t, e) {\n var r = this.canonical.z - t;\n return t > this.canonical.z ? Hl(this.wrap * +e, t, this.canonical.z, this.canonical.x, this.canonical.y) : Hl(this.wrap * +e, t, t, this.canonical.x >> r, this.canonical.y >> r);\n }, Jl.prototype.isChildOf = function (t) {\n if (t.wrap !== this.wrap) return !1;\n var e = this.canonical.z - t.canonical.z;\n return 0 === t.overscaledZ || t.overscaledZ < this.overscaledZ && t.canonical.x === this.canonical.x >> e && t.canonical.y === this.canonical.y >> e;\n }, Jl.prototype.children = function (t) {\n if (this.overscaledZ >= t) return [new Jl(this.overscaledZ + 1, this.wrap, this.canonical.z, this.canonical.x, this.canonical.y)];\n var e = this.canonical.z + 1,\n r = 2 * this.canonical.x,\n n = 2 * this.canonical.y;\n return [new Jl(e, this.wrap, e, r, n), new Jl(e, this.wrap, e, r + 1, n), new Jl(e, this.wrap, e, r, n + 1), new Jl(e, this.wrap, e, r + 1, n + 1)];\n }, Jl.prototype.isLessThan = function (t) {\n return this.wrap < t.wrap || !(this.wrap > t.wrap) && (this.overscaledZ < t.overscaledZ || !(this.overscaledZ > t.overscaledZ) && (this.canonical.x < t.canonical.x || !(this.canonical.x > t.canonical.x) && this.canonical.y < t.canonical.y));\n }, Jl.prototype.wrapped = function () {\n return new Jl(this.overscaledZ, 0, this.canonical.z, this.canonical.x, this.canonical.y);\n }, Jl.prototype.unwrapTo = function (t) {\n return new Jl(this.overscaledZ, t, this.canonical.z, this.canonical.x, this.canonical.y);\n }, Jl.prototype.overscaleFactor = function () {\n return Math.pow(2, this.overscaledZ - this.canonical.z);\n }, Jl.prototype.toUnwrapped = function () {\n return new Xl(this.wrap, this.canonical);\n }, Jl.prototype.toString = function () {\n return this.overscaledZ + "/" + this.canonical.x + "/" + this.canonical.y;\n }, Jl.prototype.getTilePoint = function (t) {\n return this.canonical.getTilePoint(new Gl(t.x - this.wrap, t.y));\n }, On("CanonicalTileID", Zl), On("OverscaledTileID", Jl, {\n omit: ["posMatrix"]\n });\n\n var Yl = function Yl(t, e, r) {\n if (this.uid = t, e.height !== e.width) throw new RangeError("DEM tiles must be square");\n if (r && "mapbox" !== r && "terrarium" !== r) return A(\'"\' + r + \'" is not a valid encoding type. Valid types include "mapbox" and "terrarium".\');\n this.stride = e.height;\n var n = this.dim = e.height - 2;\n this.data = new Uint32Array(e.data.buffer), this.encoding = r || "mapbox";\n\n for (var i = 0; i < n; i++) {\n this.data[this._idx(-1, i)] = this.data[this._idx(0, i)], this.data[this._idx(n, i)] = this.data[this._idx(n - 1, i)], this.data[this._idx(i, -1)] = this.data[this._idx(i, 0)], this.data[this._idx(i, n)] = this.data[this._idx(i, n - 1)];\n }\n\n this.data[this._idx(-1, -1)] = this.data[this._idx(0, 0)], this.data[this._idx(n, -1)] = this.data[this._idx(n - 1, 0)], this.data[this._idx(-1, n)] = this.data[this._idx(0, n - 1)], this.data[this._idx(n, n)] = this.data[this._idx(n - 1, n - 1)];\n };\n\n Yl.prototype.get = function (t, e) {\n var r = new Uint8Array(this.data.buffer),\n n = 4 * this._idx(t, e);\n\n return ("terrarium" === this.encoding ? this._unpackTerrarium : this._unpackMapbox)(r[n], r[n + 1], r[n + 2]);\n }, Yl.prototype.getUnpackVector = function () {\n return "terrarium" === this.encoding ? [256, 1, 1 / 256, 32768] : [6553.6, 25.6, .1, 1e4];\n }, Yl.prototype._idx = function (t, e) {\n if (t < -1 || t >= this.dim + 1 || e < -1 || e >= this.dim + 1) throw new RangeError("out of range source coordinates for DEM data");\n return (e + 1) * this.stride + (t + 1);\n }, Yl.prototype._unpackMapbox = function (t, e, r) {\n return (256 * t * 256 + 256 * e + r) / 10 - 1e4;\n }, Yl.prototype._unpackTerrarium = function (t, e, r) {\n return 256 * t + e + r / 256 - 32768;\n }, Yl.prototype.getPixels = function () {\n return new xo({\n width: this.stride,\n height: this.stride\n }, new Uint8Array(this.data.buffer));\n }, Yl.prototype.backfillBorder = function (t, e, r) {\n if (this.dim !== t.dim) throw new Error("dem dimension mismatch");\n var n = e * this.dim,\n i = e * this.dim + this.dim,\n a = r * this.dim,\n o = r * this.dim + this.dim;\n\n switch (e) {\n case -1:\n n = i - 1;\n break;\n\n case 1:\n i = n + 1;\n }\n\n switch (r) {\n case -1:\n a = o - 1;\n break;\n\n case 1:\n o = a + 1;\n }\n\n for (var s = -e * this.dim, u = -r * this.dim, l = a; l < o; l++) {\n for (var p = n; p < i; p++) {\n this.data[this._idx(p, l)] = t.data[this._idx(p + s, l + u)];\n }\n }\n }, On("DEMData", Yl);\n\n var $l = function $l(t) {\n this._stringToNumber = {}, this._numberToString = [];\n\n for (var e = 0; e < t.length; e++) {\n var r = t[e];\n this._stringToNumber[r] = e, this._numberToString[e] = r;\n }\n };\n\n $l.prototype.encode = function (t) {\n return this._stringToNumber[t];\n }, $l.prototype.decode = function (t) {\n return this._numberToString[t];\n };\n\n var Wl = function Wl(t, e, r, n, i) {\n this.type = "Feature", this._vectorTileFeature = t, t._z = e, t._x = r, t._y = n, this.properties = t.properties, this.id = i;\n },\n Ql = {\n geometry: {\n configurable: !0\n }\n };\n\n Ql.geometry.get = function () {\n return void 0 === this._geometry && (this._geometry = this._vectorTileFeature.toGeoJSON(this._vectorTileFeature._x, this._vectorTileFeature._y, this._vectorTileFeature._z).geometry), this._geometry;\n }, Ql.geometry.set = function (t) {\n this._geometry = t;\n }, Wl.prototype.toJSON = function () {\n var t = {\n geometry: this.geometry\n };\n\n for (var e in this) {\n "_geometry" !== e && "_vectorTileFeature" !== e && (t[e] = this[e]);\n }\n\n return t;\n }, Object.defineProperties(Wl.prototype, Ql);\n\n var tp = function tp() {\n this.state = {}, this.stateChanges = {}, this.deletedStates = {};\n };\n\n tp.prototype.updateState = function (t, e, r) {\n var n = String(e);\n if (this.stateChanges[t] = this.stateChanges[t] || {}, this.stateChanges[t][n] = this.stateChanges[t][n] || {}, h(this.stateChanges[t][n], r), null === this.deletedStates[t]) for (var i in this.deletedStates[t] = {}, this.state[t]) {\n i !== n && (this.deletedStates[t][i] = null);\n } else if (this.deletedStates[t] && null === this.deletedStates[t][n]) for (var a in this.deletedStates[t][n] = {}, this.state[t][n]) {\n r[a] || (this.deletedStates[t][n][a] = null);\n } else for (var o in r) {\n this.deletedStates[t] && this.deletedStates[t][n] && null === this.deletedStates[t][n][o] && delete this.deletedStates[t][n][o];\n }\n }, tp.prototype.removeFeatureState = function (t, e, r) {\n if (null !== this.deletedStates[t]) {\n var n = String(e);\n if (this.deletedStates[t] = this.deletedStates[t] || {}, r && void 0 !== e) null !== this.deletedStates[t][n] && (this.deletedStates[t][n] = this.deletedStates[t][n] || {}, this.deletedStates[t][n][r] = null);else if (void 0 !== e) {\n if (this.stateChanges[t] && this.stateChanges[t][n]) for (r in this.deletedStates[t][n] = {}, this.stateChanges[t][n]) {\n this.deletedStates[t][n][r] = null;\n } else this.deletedStates[t][n] = null;\n } else this.deletedStates[t] = null;\n }\n }, tp.prototype.getState = function (t, e) {\n var r = String(e),\n n = h({}, (this.state[t] || {})[r], (this.stateChanges[t] || {})[r]);\n if (null === this.deletedStates[t]) return {};\n\n if (this.deletedStates[t]) {\n var i = this.deletedStates[t][e];\n if (null === i) return {};\n\n for (var a in i) {\n delete n[a];\n }\n }\n\n return n;\n }, tp.prototype.initializeTileState = function (t, e) {\n t.setFeatureState(this.state, e);\n }, tp.prototype.coalesceChanges = function (t, e) {\n var r = {};\n\n for (var n in this.stateChanges) {\n this.state[n] = this.state[n] || {};\n var i = {};\n\n for (var a in this.stateChanges[n]) {\n this.state[n][a] || (this.state[n][a] = {}), h(this.state[n][a], this.stateChanges[n][a]), i[a] = this.state[n][a];\n }\n\n r[n] = i;\n }\n\n for (var o in this.deletedStates) {\n this.state[o] = this.state[o] || {};\n var s = {};\n if (null === this.deletedStates[o]) for (var u in this.state[o]) {\n s[u] = {}, this.state[o][u] = {};\n } else for (var l in this.deletedStates[o]) {\n if (null === this.deletedStates[o][l]) this.state[o][l] = {};else for (var p = 0, c = Object.keys(this.deletedStates[o][l]); p < c.length; p += 1) {\n delete this.state[o][l][c[p]];\n }\n s[l] = this.state[o][l];\n }\n r[o] = r[o] || {}, h(r[o], s);\n }\n\n if (this.stateChanges = {}, this.deletedStates = {}, 0 !== Object.keys(r).length) for (var f in t) {\n t[f].setFeatureState(r, e);\n }\n };\n\n var ep = function ep(t, e) {\n this.tileID = t, this.x = t.canonical.x, this.y = t.canonical.y, this.z = t.canonical.z, this.grid = new Tn(8192, 16, 0), this.grid3D = new Tn(8192, 16, 0), this.featureIndexArray = new aa(), this.promoteId = e;\n };\n\n function rp(t, e, r, n, i) {\n return x(t, function (t, a) {\n var o = e instanceof di ? e.get(a) : null;\n return o && o.evaluate ? o.evaluate(r, n, i) : o;\n });\n }\n\n function np(t) {\n for (var e = 1 / 0, r = 1 / 0, n = -1 / 0, i = -1 / 0, a = 0, o = t; a < o.length; a += 1) {\n var s = o[a];\n e = Math.min(e, s.x), r = Math.min(r, s.y), n = Math.max(n, s.x), i = Math.max(i, s.y);\n }\n\n return {\n minX: e,\n minY: r,\n maxX: n,\n maxY: i\n };\n }\n\n function ip(t, e) {\n return e - t;\n }\n\n ep.prototype.insert = function (t, e, r, n, i, a) {\n var o = this.featureIndexArray.length;\n this.featureIndexArray.emplaceBack(r, n, i);\n\n for (var s = a ? this.grid3D : this.grid, u = 0; u < e.length; u++) {\n for (var l = e[u], p = [1 / 0, 1 / 0, -1 / 0, -1 / 0], c = 0; c < l.length; c++) {\n var h = l[c];\n p[0] = Math.min(p[0], h.x), p[1] = Math.min(p[1], h.y), p[2] = Math.max(p[2], h.x), p[3] = Math.max(p[3], h.y);\n }\n\n p[0] < 8192 && p[1] < 8192 && p[2] >= 0 && p[3] >= 0 && s.insert(o, p[0], p[1], p[2], p[3]);\n }\n }, ep.prototype.loadVTLayers = function () {\n return this.vtLayers || (this.vtLayers = new bs.VectorTile(new Ys(this.rawTileData)).layers, this.sourceLayerCoder = new $l(this.vtLayers ? Object.keys(this.vtLayers).sort() : ["_geojsonTileLayer"])), this.vtLayers;\n }, ep.prototype.query = function (t, e, r, n) {\n var a = this;\n this.loadVTLayers();\n\n for (var o = t.params || {}, s = 8192 / t.tileSize / t.scale, u = on(o.filter), l = t.queryGeometry, p = t.queryPadding * s, c = np(l), h = this.grid.query(c.minX - p, c.minY - p, c.maxX + p, c.maxY + p), f = np(t.cameraQueryGeometry), y = this.grid3D.query(f.minX - p, f.minY - p, f.maxX + p, f.maxY + p, function (e, r, n, a) {\n return function (t, e, r, n, a) {\n for (var o = 0, s = t; o < s.length; o += 1) {\n var u = s[o];\n if (e <= u.x && r <= u.y && n >= u.x && a >= u.y) return !0;\n }\n\n var l = [new i(e, r), new i(e, a), new i(n, a), new i(n, r)];\n if (t.length > 2) for (var p = 0, c = l; p < c.length; p += 1) {\n if (Wa(t, c[p])) return !0;\n }\n\n for (var h = 0; h < t.length - 1; h++) {\n if (Qa(t[h], t[h + 1], l)) return !0;\n }\n\n return !1;\n }(t.cameraQueryGeometry, e - p, r - p, n + p, a + p);\n }), d = 0, m = y; d < m.length; d += 1) {\n h.push(m[d]);\n }\n\n h.sort(ip);\n\n for (var v, g = {}, x = function x(i) {\n var p = h[i];\n\n if (p !== v) {\n v = p;\n var c = a.featureIndexArray.get(p),\n f = null;\n a.loadMatchingFeature(g, c.bucketIndex, c.sourceLayerIndex, c.featureIndex, u, o.layers, o.availableImages, e, r, n, function (e, r, n) {\n return f || (f = Ra(e)), r.queryIntersectsFeature(l, e, n, f, a.z, t.transform, s, t.pixelPosMatrix);\n });\n }\n }, b = 0; b < h.length; b++) {\n x(b);\n }\n\n return g;\n }, ep.prototype.loadMatchingFeature = function (t, e, r, n, i, a, o, s, u, l, p) {\n var c = this.bucketLayerIDs[e];\n\n if (!a || function (t, e) {\n for (var r = 0; r < t.length; r++) {\n if (e.indexOf(t[r]) >= 0) return !0;\n }\n\n return !1;\n }(a, c)) {\n var f = this.sourceLayerCoder.decode(r),\n y = this.vtLayers[f].feature(n);\n\n if (i.needGeometry) {\n var d = Ua(y, !0);\n if (!i.filter(new si(this.tileID.overscaledZ), d, this.tileID.canonical)) return;\n } else if (!i.filter(new si(this.tileID.overscaledZ), y)) return;\n\n for (var m = this.getId(y, f), v = 0; v < c.length; v++) {\n var g = c[v];\n\n if (!(a && a.indexOf(g) < 0)) {\n var x = s[g];\n\n if (x) {\n var b = {};\n void 0 !== m && l && (b = l.getState(x.sourceLayer || "_geojsonTileLayer", m));\n var w = h({}, u[g]);\n w.paint = rp(w.paint, x.paint, y, b, o), w.layout = rp(w.layout, x.layout, y, b, o);\n\n var _ = !p || p(y, x, b);\n\n if (_) {\n var A = new Wl(y, this.z, this.x, this.y, m);\n A.layer = w;\n var S = t[g];\n void 0 === S && (S = t[g] = []), S.push({\n featureIndex: n,\n feature: A,\n intersectionZ: _\n });\n }\n }\n }\n }\n }\n }, ep.prototype.lookupSymbolFeatures = function (t, e, r, n, i, a, o, s) {\n var u = {};\n this.loadVTLayers();\n\n for (var l = on(i), p = 0, c = t; p < c.length; p += 1) {\n this.loadMatchingFeature(u, r, n, c[p], l, a, o, s, e);\n }\n\n return u;\n }, ep.prototype.hasLayer = function (t) {\n for (var e = 0, r = this.bucketLayerIDs; e < r.length; e += 1) {\n for (var n = 0, i = r[e]; n < i.length; n += 1) {\n if (t === i[n]) return !0;\n }\n }\n\n return !1;\n }, ep.prototype.getId = function (t, e) {\n var r = t.id;\n return this.promoteId && "boolean" == typeof (r = t.properties["string" == typeof this.promoteId ? this.promoteId : this.promoteId[e]]) && (r = Number(r)), r;\n }, On("FeatureIndex", ep, {\n omit: ["rawTileData", "sourceLayerCoder"]\n });\n\n var ap = function ap(t, e) {\n this.tileID = t, this.uid = y(), this.uses = 0, this.tileSize = e, this.buckets = {}, this.expirationTime = null, this.queryPadding = 0, this.hasSymbolBuckets = !1, this.hasRTLText = !1, this.dependencies = {}, this.expiredRequestCount = 0, this.state = "loading";\n };\n\n ap.prototype.registerFadeDuration = function (t) {\n var e = t + this.timeAdded;\n e < O.now() || this.fadeEndTime && e < this.fadeEndTime || (this.fadeEndTime = e);\n }, ap.prototype.wasRequested = function () {\n return "errored" === this.state || "loaded" === this.state || "reloading" === this.state;\n }, ap.prototype.loadVectorData = function (t, e, r) {\n if (this.hasData() && this.unloadVectorData(), this.state = "loaded", t) {\n for (var n in t.featureIndex && (this.latestFeatureIndex = t.featureIndex, t.rawTileData ? (this.latestRawTileData = t.rawTileData, this.latestFeatureIndex.rawTileData = t.rawTileData) : this.latestRawTileData && (this.latestFeatureIndex.rawTileData = this.latestRawTileData)), this.collisionBoxArray = t.collisionBoxArray, this.buckets = function (t, e) {\n var r = {};\n if (!e) return r;\n\n for (var n = function n() {\n var t = a[i],\n n = t.layerIds.map(function (t) {\n return e.getLayer(t);\n }).filter(Boolean);\n\n if (0 !== n.length) {\n t.layers = n, t.stateDependentLayerIds && (t.stateDependentLayers = t.stateDependentLayerIds.map(function (t) {\n return n.filter(function (e) {\n return e.id === t;\n })[0];\n }));\n\n for (var o = 0, s = n; o < s.length; o += 1) {\n r[s[o].id] = t;\n }\n }\n }, i = 0, a = t; i < a.length; i += 1) {\n n();\n }\n\n return r;\n }(t.buckets, e.style), this.hasSymbolBuckets = !1, this.buckets) {\n var i = this.buckets[n];\n\n if (i instanceof vl) {\n if (this.hasSymbolBuckets = !0, !r) break;\n i.justReloaded = !0;\n }\n }\n\n if (this.hasRTLText = !1, this.hasSymbolBuckets) for (var a in this.buckets) {\n var o = this.buckets[a];\n\n if (o instanceof vl && o.hasRTLText) {\n this.hasRTLText = !0, oi.isLoading() || oi.isLoaded() || "deferred" !== ii() || ai();\n break;\n }\n }\n\n for (var s in this.queryPadding = 0, this.buckets) {\n var u = this.buckets[s];\n this.queryPadding = Math.max(this.queryPadding, e.style.getLayer(s).queryRadius(u));\n }\n\n t.imageAtlas && (this.imageAtlas = t.imageAtlas), t.glyphAtlasImage && (this.glyphAtlasImage = t.glyphAtlasImage);\n } else this.collisionBoxArray = new $i();\n }, ap.prototype.unloadVectorData = function () {\n for (var t in this.buckets) {\n this.buckets[t].destroy();\n }\n\n this.buckets = {}, this.imageAtlasTexture && this.imageAtlasTexture.destroy(), this.imageAtlas && (this.imageAtlas = null), this.glyphAtlasTexture && this.glyphAtlasTexture.destroy(), this.latestFeatureIndex = null, this.state = "unloaded";\n }, ap.prototype.getBucket = function (t) {\n return this.buckets[t.id];\n }, ap.prototype.upload = function (t) {\n for (var e in this.buckets) {\n var r = this.buckets[e];\n r.uploadPending() && r.upload(t);\n }\n\n var n = t.gl;\n this.imageAtlas && !this.imageAtlas.uploaded && (this.imageAtlasTexture = new Tl(t, this.imageAtlas.image, n.RGBA), this.imageAtlas.uploaded = !0), this.glyphAtlasImage && (this.glyphAtlasTexture = new Tl(t, this.glyphAtlasImage, n.ALPHA), this.glyphAtlasImage = null);\n }, ap.prototype.prepare = function (t) {\n this.imageAtlas && this.imageAtlas.patchUpdatedImages(t, this.imageAtlasTexture);\n }, ap.prototype.queryRenderedFeatures = function (t, e, r, n, i, a, o, s, u, l) {\n return this.latestFeatureIndex && this.latestFeatureIndex.rawTileData ? this.latestFeatureIndex.query({\n queryGeometry: n,\n cameraQueryGeometry: i,\n scale: a,\n tileSize: this.tileSize,\n pixelPosMatrix: l,\n transform: s,\n params: o,\n queryPadding: this.queryPadding * u\n }, t, e, r) : {};\n }, ap.prototype.querySourceFeatures = function (t, e) {\n var r = this.latestFeatureIndex;\n\n if (r && r.rawTileData) {\n var n = r.loadVTLayers(),\n i = e ? e.sourceLayer : "",\n a = n._geojsonTileLayer || n[i];\n if (a) for (var o = on(e && e.filter), s = this.tileID.canonical, u = s.z, l = s.x, p = s.y, c = {\n z: u,\n x: l,\n y: p\n }, h = 0; h < a.length; h++) {\n var f = a.feature(h);\n\n if (o.needGeometry) {\n var y = Ua(f, !0);\n if (!o.filter(new si(this.tileID.overscaledZ), y, this.tileID.canonical)) continue;\n } else if (!o.filter(new si(this.tileID.overscaledZ), f)) continue;\n\n var d = r.getId(f, i),\n m = new Wl(f, u, l, p, d);\n m.tile = c, t.push(m);\n }\n }\n }, ap.prototype.hasData = function () {\n return "loaded" === this.state || "reloading" === this.state || "expired" === this.state;\n }, ap.prototype.patternsLoaded = function () {\n return this.imageAtlas && !!Object.keys(this.imageAtlas.patternPositions).length;\n }, ap.prototype.setExpiryData = function (t) {\n var e = this.expirationTime;\n\n if (t.cacheControl) {\n var r = z(t.cacheControl);\n r["max-age"] && (this.expirationTime = Date.now() + 1e3 * r["max-age"]);\n } else t.expires && (this.expirationTime = new Date(t.expires).getTime());\n\n if (this.expirationTime) {\n var n = Date.now(),\n i = !1;\n if (this.expirationTime > n) i = !1;else if (e) {\n if (this.expirationTime < e) i = !0;else {\n var a = this.expirationTime - e;\n a ? this.expirationTime = n + Math.max(a, 3e4) : i = !0;\n }\n } else i = !0;\n i ? (this.expiredRequestCount++, this.state = "expired") : this.expiredRequestCount = 0;\n }\n }, ap.prototype.getExpiryTimeout = function () {\n if (this.expirationTime) return this.expiredRequestCount ? 1e3 * (1 << Math.min(this.expiredRequestCount - 1, 31)) : Math.min(this.expirationTime - new Date().getTime(), Math.pow(2, 31) - 1);\n }, ap.prototype.setFeatureState = function (t, e) {\n if (this.latestFeatureIndex && this.latestFeatureIndex.rawTileData && 0 !== Object.keys(t).length) {\n var r = this.latestFeatureIndex.loadVTLayers();\n\n for (var n in this.buckets) {\n if (e.style.hasLayer(n)) {\n var i = this.buckets[n],\n a = i.layers[0].sourceLayer || "_geojsonTileLayer",\n o = r[a],\n s = t[a];\n\n if (o && s && 0 !== Object.keys(s).length) {\n i.update(s, o, this.imageAtlas && this.imageAtlas.patternPositions || {});\n var u = e && e.style && e.style.getLayer(n);\n u && (this.queryPadding = Math.max(this.queryPadding, u.queryRadius(i)));\n }\n }\n }\n }\n }, ap.prototype.holdingForFade = function () {\n return void 0 !== this.symbolFadeHoldUntil;\n }, ap.prototype.symbolFadeFinished = function () {\n return !this.symbolFadeHoldUntil || this.symbolFadeHoldUntil < O.now();\n }, ap.prototype.clearFadeHold = function () {\n this.symbolFadeHoldUntil = void 0;\n }, ap.prototype.setHoldDuration = function (t) {\n this.symbolFadeHoldUntil = O.now() + t;\n }, ap.prototype.setDependencies = function (t, e) {\n for (var r = {}, n = 0, i = e; n < i.length; n += 1) {\n r[i[n]] = !0;\n }\n\n this.dependencies[t] = r;\n }, ap.prototype.hasDependency = function (t, e) {\n for (var r = 0, n = t; r < n.length; r += 1) {\n var i = this.dependencies[n[r]];\n if (i) for (var a = 0, o = e; a < o.length; a += 1) {\n if (i[o[a]]) return !0;\n }\n }\n\n return !1;\n };\n\n var op = o.performance,\n sp = function sp(t) {\n this._marks = {\n start: [t.url, "start"].join("#"),\n end: [t.url, "end"].join("#"),\n measure: t.url.toString()\n }, op.mark(this._marks.start);\n };\n\n sp.prototype.finish = function () {\n op.mark(this._marks.end);\n var t = op.getEntriesByName(this._marks.measure);\n return 0 === t.length && (op.measure(this._marks.measure, this._marks.start, this._marks.end), t = op.getEntriesByName(this._marks.measure), op.clearMarks(this._marks.start), op.clearMarks(this._marks.end), op.clearMeasures(this._marks.measure)), t;\n }, t.Actor = Fl, t.AlphaImage = go, t.CanonicalTileID = Zl, t.CollisionBoxArray = $i, t.Color = te, t.DEMData = Yl, t.DataConstantProperty = mi, t.DictionaryCoder = $l, t.EXTENT = 8192, t.ErrorEvent = zt, t.EvaluationParameters = si, t.Event = It, t.Evented = Ct, t.FeatureIndex = ep, t.FillBucket = ss, t.FillExtrusionBucket = Ss, t.ImageAtlas = bu, t.ImagePosition = gu, t.LineBucket = Fs, t.LngLat = Ol, t.LngLatBounds = Ll, t.MercatorCoordinate = Gl, t.ONE_EM = 24, t.OverscaledTileID = Jl, t.Point = i, t.Point$1 = i, t.Properties = wi, t.Protobuf = Ys, t.RGBAImage = xo, t.RequestManager = G, t.RequestPerformance = sp, t.ResourceType = yt, t.SegmentVector = sa, t.SourceFeatureState = tp, t.StructArrayLayout1ui2 = Ji, t.StructArrayLayout2f1f2i16 = Ri, t.StructArrayLayout2i4 = Ci, t.StructArrayLayout3ui6 = ji, t.StructArrayLayout4i8 = Ei, t.SymbolBucket = vl, t.Texture = Tl, t.Tile = ap, t.Transitionable = pi, t.Uniform1f = ba, t.Uniform1i = xa, t.Uniform2f = wa, t.Uniform3f = _a, t.Uniform4f = Aa, t.UniformColor = Sa, t.UniformMatrix4f = Ia, t.UnwrappedTileID = Xl, t.ValidationError = Pt, t.WritingMode = wu, t.ZoomHistory = Kn, t.add = function (t, e, r) {\n return t[0] = e[0] + r[0], t[1] = e[1] + r[1], t[2] = e[2] + r[2], t;\n }, t.addDynamicAttributes = fl, t.asyncAll = function (t, e, r) {\n if (!t.length) return r(null, []);\n var n = t.length,\n i = new Array(t.length),\n a = null;\n t.forEach(function (t, o) {\n e(t, function (t, e) {\n t && (a = t), i[o] = e, 0 == --n && r(a, i);\n });\n });\n }, t.bezier = u, t.bindAll = v, t.browser = O, t.cacheEntryPossiblyAdded = function (t) {\n ++ht > ut && (t.getActor().send("enforceCacheSizeLimit", st), ht = 0);\n }, t.clamp = p, t.clearTileCache = function (t) {\n var e = o.caches.delete("mapbox-tiles");\n t && e.catch(t).then(function () {\n return t();\n });\n }, t.clipLine = Zu, t.clone = function (t) {\n var e = new ao(16);\n return e[0] = t[0], e[1] = t[1], e[2] = t[2], e[3] = t[3], e[4] = t[4], e[5] = t[5], e[6] = t[6], e[7] = t[7], e[8] = t[8], e[9] = t[9], e[10] = t[10], e[11] = t[11], e[12] = t[12], e[13] = t[13], e[14] = t[14], e[15] = t[15], e;\n }, t.clone$1 = w, t.clone$2 = function (t) {\n var e = new ao(3);\n return e[0] = t[0], e[1] = t[1], e[2] = t[2], e;\n }, t.collisionCircleLayout = Gs, t.config = R, t.create = function () {\n var t = new ao(16);\n return ao != Float32Array && (t[1] = 0, t[2] = 0, t[3] = 0, t[4] = 0, t[6] = 0, t[7] = 0, t[8] = 0, t[9] = 0, t[11] = 0, t[12] = 0, t[13] = 0, t[14] = 0), t[0] = 1, t[5] = 1, t[10] = 1, t[15] = 1, t;\n }, t.create$1 = function () {\n var t = new ao(9);\n return ao != Float32Array && (t[1] = 0, t[2] = 0, t[3] = 0, t[5] = 0, t[6] = 0, t[7] = 0), t[0] = 1, t[4] = 1, t[8] = 1, t;\n }, t.create$2 = function () {\n var t = new ao(4);\n return ao != Float32Array && (t[1] = 0, t[2] = 0), t[0] = 1, t[3] = 1, t;\n }, t.createCommonjsModule = e, t.createExpression = Zr, t.createLayout = Ii, t.createStyleLayer = function (t) {\n return "custom" === t.type ? new Il(t) : new zl[t.type](t);\n }, t.cross = function (t, e, r) {\n var n = e[0],\n i = e[1],\n a = e[2],\n o = r[0],\n s = r[1],\n u = r[2];\n return t[0] = i * u - a * s, t[1] = a * o - n * u, t[2] = n * s - i * o, t;\n }, t.deepEqual = function t(e, r) {\n if (Array.isArray(e)) {\n if (!Array.isArray(r) || e.length !== r.length) return !1;\n\n for (var n = 0; n < e.length; n++) {\n if (!t(e[n], r[n])) return !1;\n }\n\n return !0;\n }\n\n if ("object" == typeof e && null !== e && null !== r) {\n if ("object" != typeof r) return !1;\n if (Object.keys(e).length !== Object.keys(r).length) return !1;\n\n for (var i in e) {\n if (!t(e[i], r[i])) return !1;\n }\n\n return !0;\n }\n\n return e === r;\n }, t.dot = function (t, e) {\n return t[0] * e[0] + t[1] * e[1] + t[2] * e[2];\n }, t.dot$1 = function (t, e) {\n return t[0] * e[0] + t[1] * e[1] + t[2] * e[2] + t[3] * e[3];\n }, t.ease = l, t.emitValidationErrors = Bn, t.endsWith = g, t.enforceCacheSizeLimit = function (t) {\n lt(), tt && tt.then(function (e) {\n e.keys().then(function (r) {\n for (var n = 0; n < r.length - t; n++) {\n e.delete(r[n]);\n }\n });\n });\n }, t.evaluateSizeForFeature = Lu, t.evaluateSizeForZoom = Ou, t.evaluateVariableOffset = al, t.evented = ni, t.extend = h, t.featureFilter = on, t.filterObject = b, t.fromRotation = function (t, e) {\n var r = Math.sin(e),\n n = Math.cos(e);\n return t[0] = n, t[1] = r, t[2] = 0, t[3] = -r, t[4] = n, t[5] = 0, t[6] = 0, t[7] = 0, t[8] = 1, t;\n }, t.getAnchorAlignment = Bu, t.getAnchorJustification = ol, t.getArrayBuffer = bt, t.getImage = At, t.getJSON = function (t, e) {\n return xt(h(t, {\n type: "json"\n }), e);\n }, t.getRTLTextPluginStatus = ii, t.getReferrer = mt, t.getVideo = function (t, e) {\n var r,\n n,\n i = o.document.createElement("video");\n i.muted = !0, i.onloadstart = function () {\n e(null, i);\n };\n\n for (var a = 0; a < t.length; a++) {\n var s = o.document.createElement("source");\n r = t[a], n = void 0, (n = o.document.createElement("a")).href = r, (n.protocol !== o.document.location.protocol || n.host !== o.document.location.host) && (i.crossOrigin = "Anonymous"), s.src = t[a], i.appendChild(s);\n }\n\n return {\n cancel: function cancel() {}\n };\n }, t.identity = oo, t.invert = function (t, e) {\n var r = e[0],\n n = e[1],\n i = e[2],\n a = e[3],\n o = e[4],\n s = e[5],\n u = e[6],\n l = e[7],\n p = e[8],\n c = e[9],\n h = e[10],\n f = e[11],\n y = e[12],\n d = e[13],\n m = e[14],\n v = e[15],\n g = r * s - n * o,\n x = r * u - i * o,\n b = r * l - a * o,\n w = n * u - i * s,\n _ = n * l - a * s,\n A = i * l - a * u,\n S = p * d - c * y,\n k = p * m - h * y,\n I = p * v - f * y,\n z = c * m - h * d,\n C = c * v - f * d,\n E = h * v - f * m,\n P = g * E - x * C + b * z + w * I - _ * k + A * S;\n\n return P ? (t[0] = (s * E - u * C + l * z) * (P = 1 / P), t[1] = (i * C - n * E - a * z) * P, t[2] = (d * A - m * _ + v * w) * P, t[3] = (h * _ - c * A - f * w) * P, t[4] = (u * I - o * E - l * k) * P, t[5] = (r * E - i * I + a * k) * P, t[6] = (m * b - y * A - v * x) * P, t[7] = (p * A - h * b + f * x) * P, t[8] = (o * C - s * I + l * S) * P, t[9] = (n * I - r * C - a * S) * P, t[10] = (y * _ - d * b + v * g) * P, t[11] = (c * b - p * _ - f * g) * P, t[12] = (s * k - o * z - u * S) * P, t[13] = (r * z - n * k + i * S) * P, t[14] = (d * x - y * w - m * g) * P, t[15] = (p * w - c * x + h * g) * P, t) : null;\n }, t.isChar = Gn, t.isMapboxURL = Z, t.keysDifference = function (t, e) {\n var r = [];\n\n for (var n in t) {\n n in e || r.push(n);\n }\n\n return r;\n }, t.makeRequest = xt, t.mapObject = x, t.mercatorXfromLng = jl, t.mercatorYfromLat = ql, t.mercatorZfromAltitude = Nl, t.mul = lo, t.multiply = so, t.mvt = bs, t.nextPowerOfTwo = function (t) {\n return t <= 1 ? 1 : Math.pow(2, Math.ceil(Math.log(t) / Math.LN2));\n }, t.normalize = function (t, e) {\n var r = e[0],\n n = e[1],\n i = e[2],\n a = r * r + n * n + i * i;\n return a > 0 && (a = 1 / Math.sqrt(a)), t[0] = e[0] * a, t[1] = e[1] * a, t[2] = e[2] * a, t;\n }, t.number = Ke, t.offscreenCanvasSupported = ft, t.ortho = function (t, e, r, n, i, a, o) {\n var s = 1 / (e - r),\n u = 1 / (n - i),\n l = 1 / (a - o);\n return t[0] = -2 * s, t[1] = 0, t[2] = 0, t[3] = 0, t[4] = 0, t[5] = -2 * u, t[6] = 0, t[7] = 0, t[8] = 0, t[9] = 0, t[10] = 2 * l, t[11] = 0, t[12] = (e + r) * s, t[13] = (i + n) * u, t[14] = (o + a) * l, t[15] = 1, t;\n }, t.parseGlyphPBF = function (t) {\n return new Ys(t).readFields(yu, []);\n }, t.pbf = Ys, t.performSymbolLayout = function (t, e, r, n, i, a, o) {\n t.createArrays(), t.tilePixelRatio = 8192 / (512 * t.overscaling), t.compareText = {}, t.iconsNeedLinear = !1;\n var s = t.layers[0].layout,\n u = t.layers[0]._unevaluatedLayout._values,\n l = {};\n\n if ("composite" === t.textSizeData.kind) {\n var p = t.textSizeData,\n c = p.maxZoom;\n l.compositeTextSizes = [u["text-size"].possiblyEvaluate(new si(p.minZoom), o), u["text-size"].possiblyEvaluate(new si(c), o)];\n }\n\n if ("composite" === t.iconSizeData.kind) {\n var h = t.iconSizeData,\n f = h.maxZoom;\n l.compositeIconSizes = [u["icon-size"].possiblyEvaluate(new si(h.minZoom), o), u["icon-size"].possiblyEvaluate(new si(f), o)];\n }\n\n l.layoutTextSize = u["text-size"].possiblyEvaluate(new si(t.zoom + 1), o), l.layoutIconSize = u["icon-size"].possiblyEvaluate(new si(t.zoom + 1), o), l.textMaxSize = u["text-size"].possiblyEvaluate(new si(18));\n\n for (var y = 24 * s.get("text-line-height"), d = "map" === s.get("text-rotation-alignment") && "point" !== s.get("symbol-placement"), m = s.get("text-keep-upright"), v = s.get("text-size"), g = function g() {\n var a = b[x],\n u = s.get("text-font").evaluate(a, {}, o).join(","),\n p = v.evaluate(a, {}, o),\n c = l.layoutTextSize.evaluate(a, {}, o),\n h = l.layoutIconSize.evaluate(a, {}, o),\n f = {\n horizontal: {},\n vertical: void 0\n },\n g = a.text,\n w = [0, 0];\n\n if (g) {\n var _ = g.toString(),\n S = 24 * s.get("text-letter-spacing").evaluate(a, {}, o),\n k = function (t) {\n for (var e = 0, r = t; e < r.length; e += 1) {\n if (n = r[e].charCodeAt(0), Gn.Arabic(n) || Gn["Arabic Supplement"](n) || Gn["Arabic Extended-A"](n) || Gn["Arabic Presentation Forms-A"](n) || Gn["Arabic Presentation Forms-B"](n)) return !1;\n }\n\n var n;\n return !0;\n }(_) ? S : 0,\n I = s.get("text-anchor").evaluate(a, {}, o),\n z = s.get("text-variable-anchor");\n\n if (!z) {\n var C = s.get("text-radial-offset").evaluate(a, {}, o);\n w = C ? al(I, [24 * C, il]) : s.get("text-offset").evaluate(a, {}, o).map(function (t) {\n return 24 * t;\n });\n }\n\n var E = d ? "center" : s.get("text-justify").evaluate(a, {}, o),\n P = s.get("symbol-placement"),\n M = "point" === P ? 24 * s.get("text-max-width").evaluate(a, {}, o) : 0,\n B = function B() {\n t.allowVerticalPlacement && Zn(_) && (f.vertical = Su(g, e, r, i, u, M, y, I, "left", k, w, wu.vertical, !0, P, c, p));\n };\n\n if (!d && z) {\n for (var T = "auto" === E ? z.map(function (t) {\n return ol(t);\n }) : [E], V = !1, F = 0; F < T.length; F++) {\n var D = T[F];\n if (!f.horizontal[D]) if (V) f.horizontal[D] = f.horizontal[0];else {\n var L = Su(g, e, r, i, u, M, y, "center", D, k, w, wu.horizontal, !1, P, c, p);\n L && (f.horizontal[D] = L, V = 1 === L.positionedLines.length);\n }\n }\n\n B();\n } else {\n "auto" === E && (E = ol(I));\n var O = Su(g, e, r, i, u, M, y, I, E, k, w, wu.horizontal, !1, P, c, p);\n O && (f.horizontal[E] = O), B(), Zn(_) && d && m && (f.vertical = Su(g, e, r, i, u, M, y, I, E, k, w, wu.vertical, !1, P, c, p));\n }\n }\n\n var R = void 0,\n U = !1;\n\n if (a.icon && a.icon.name) {\n var j = n[a.icon.name];\n j && (R = function (t, e, r) {\n var n = Bu(r),\n i = e[0] - t.displaySize[0] * n.horizontalAlign,\n a = e[1] - t.displaySize[1] * n.verticalAlign;\n return {\n image: t,\n top: a,\n bottom: a + t.displaySize[1],\n left: i,\n right: i + t.displaySize[0]\n };\n }(i[a.icon.name], s.get("icon-offset").evaluate(a, {}, o), s.get("icon-anchor").evaluate(a, {}, o)), U = j.sdf, void 0 === t.sdfIcons ? t.sdfIcons = j.sdf : t.sdfIcons !== j.sdf && A("Style sheet warning: Cannot mix SDF and non-SDF icons in one buffer"), (j.pixelRatio !== t.pixelRatio || 0 !== s.get("icon-rotate").constantOr(1)) && (t.iconsNeedLinear = !0));\n }\n\n var q = ul(f.horizontal) || f.vertical;\n t.iconsInText = !!q && q.iconsInText, (q || R) && function (t, e, r, n, i, a, o, s, u, l, p) {\n var c = a.textMaxSize.evaluate(e, {});\n void 0 === c && (c = o);\n\n var h,\n f = t.layers[0].layout,\n y = f.get("icon-offset").evaluate(e, {}, p),\n d = ul(r.horizontal),\n m = o / 24,\n v = t.tilePixelRatio * m,\n g = t.tilePixelRatio * c / 24,\n x = t.tilePixelRatio * s,\n b = t.tilePixelRatio * f.get("symbol-spacing"),\n w = f.get("text-padding") * t.tilePixelRatio,\n _ = f.get("icon-padding") * t.tilePixelRatio,\n S = f.get("text-max-angle") / 180 * Math.PI,\n k = "map" === f.get("text-rotation-alignment") && "point" !== f.get("symbol-placement"),\n I = "map" === f.get("icon-rotation-alignment") && "point" !== f.get("symbol-placement"),\n z = f.get("symbol-placement"),\n C = b / 2,\n E = f.get("icon-text-fit");\n\n n && "none" !== E && (t.allowVerticalPlacement && r.vertical && (h = Vu(n, r.vertical, E, f.get("icon-text-fit-padding"), y, m)), d && (n = Vu(n, d, E, f.get("icon-text-fit-padding"), y, m)));\n\n var P = function P(s, c) {\n c.x < 0 || c.x >= 8192 || c.y < 0 || c.y >= 8192 || function (t, e, r, n, i, a, o, s, u, l, p, c, h, f, y, d, m, v, g, x, b, w, _, S, k) {\n var I,\n z,\n C,\n E,\n P,\n M = t.addToLineVertexArray(e, r),\n B = 0,\n T = 0,\n V = 0,\n F = 0,\n D = -1,\n L = -1,\n O = {},\n R = ha(""),\n U = 0,\n j = 0;\n\n if (void 0 === s._unevaluatedLayout.getValue("text-radial-offset") ? (U = (I = s.layout.get("text-offset").evaluate(b, {}, S).map(function (t) {\n return 24 * t;\n }))[0], j = I[1]) : (U = 24 * s.layout.get("text-radial-offset").evaluate(b, {}, S), j = il), t.allowVerticalPlacement && n.vertical) {\n var q = s.layout.get("text-rotate").evaluate(b, {}, S) + 90;\n E = new Wu(u, e, l, p, c, n.vertical, h, f, y, q), o && (P = new Wu(u, e, l, p, c, o, m, v, y, q));\n }\n\n if (i) {\n var N = s.layout.get("icon-rotate").evaluate(b, {}),\n K = "none" !== s.layout.get("icon-text-fit"),\n G = Xu(i, N, _, K),\n Z = o ? Xu(o, N, _, K) : void 0;\n C = new Wu(u, e, l, p, c, i, m, v, !1, N), B = 4 * G.length;\n var X = t.iconSizeData,\n J = null;\n "source" === X.kind ? (J = [128 * s.layout.get("icon-size").evaluate(b, {})])[0] > 32640 && A(t.layerIds[0] + \': Value for "icon-size" is >= 255. Reduce your "icon-size".\') : "composite" === X.kind && ((J = [128 * w.compositeIconSizes[0].evaluate(b, {}, S), 128 * w.compositeIconSizes[1].evaluate(b, {}, S)])[0] > 32640 || J[1] > 32640) && A(t.layerIds[0] + \': Value for "icon-size" is >= 255. Reduce your "icon-size".\'), t.addSymbols(t.icon, G, J, x, g, b, !1, e, M.lineStartIndex, M.lineLength, -1, S), D = t.icon.placedSymbolArray.length - 1, Z && (T = 4 * Z.length, t.addSymbols(t.icon, Z, J, x, g, b, wu.vertical, e, M.lineStartIndex, M.lineLength, -1, S), L = t.icon.placedSymbolArray.length - 1);\n }\n\n for (var H in n.horizontal) {\n var Y = n.horizontal[H];\n\n if (!z) {\n R = ha(Y.text);\n var $ = s.layout.get("text-rotate").evaluate(b, {}, S);\n z = new Wu(u, e, l, p, c, Y, h, f, y, $);\n }\n\n var W = 1 === Y.positionedLines.length;\n if (V += sl(t, e, Y, a, s, y, b, d, M, n.vertical ? wu.horizontal : wu.horizontalOnly, W ? Object.keys(n.horizontal) : [H], O, D, w, S), W) break;\n }\n\n n.vertical && (F += sl(t, e, n.vertical, a, s, y, b, d, M, wu.vertical, ["vertical"], O, L, w, S));\n\n var Q = z ? z.boxStartIndex : t.collisionBoxArray.length,\n tt = z ? z.boxEndIndex : t.collisionBoxArray.length,\n et = E ? E.boxStartIndex : t.collisionBoxArray.length,\n rt = E ? E.boxEndIndex : t.collisionBoxArray.length,\n nt = C ? C.boxStartIndex : t.collisionBoxArray.length,\n it = C ? C.boxEndIndex : t.collisionBoxArray.length,\n at = P ? P.boxStartIndex : t.collisionBoxArray.length,\n ot = P ? P.boxEndIndex : t.collisionBoxArray.length,\n st = -1,\n ut = function ut(t, e) {\n return t && t.circleDiameter ? Math.max(t.circleDiameter, e) : e;\n };\n\n st = ut(z, st), st = ut(E, st), st = ut(C, st);\n var lt = (st = ut(P, st)) > -1 ? 1 : 0;\n lt && (st *= k / 24), t.glyphOffsetArray.length >= vl.MAX_GLYPHS && A("Too many glyphs being rendered in a tile. See https://github.com/mapbox/mapbox-gl-js/issues/2907"), void 0 !== b.sortKey && t.addToSortKeyRanges(t.symbolInstances.length, b.sortKey), t.symbolInstances.emplaceBack(e.x, e.y, O.right >= 0 ? O.right : -1, O.center >= 0 ? O.center : -1, O.left >= 0 ? O.left : -1, O.vertical || -1, D, L, R, Q, tt, et, rt, nt, it, at, ot, l, V, F, B, T, lt, 0, h, U, j, st);\n }(t, c, s, r, n, i, h, t.layers[0], t.collisionBoxArray, e.index, e.sourceLayerIndex, t.index, v, w, k, u, x, _, I, y, e, a, l, p, o);\n };\n\n if ("line" === z) for (var M = 0, B = Zu(e.geometry, 0, 0, 8192, 8192); M < B.length; M += 1) {\n for (var T = B[M], V = 0, F = Gu(T, b, S, r.vertical || d, n, 24, g, t.overscaling, 8192); V < F.length; V += 1) {\n var D = F[V];\n d && ll(t, d.text, C, D) || P(T, D);\n }\n } else if ("line-center" === z) for (var L = 0, O = e.geometry; L < O.length; L += 1) {\n var R = O[L];\n\n if (R.length > 1) {\n var U = Ku(R, S, r.vertical || d, n, 24, g);\n U && P(R, U);\n }\n } else if ("Polygon" === e.type) for (var j = 0, q = ns(e.geometry, 0); j < q.length; j += 1) {\n var N = q[j],\n K = el(N, 16);\n P(N[0], new Fu(K.x, K.y, 0));\n } else if ("LineString" === e.type) for (var G = 0, Z = e.geometry; G < Z.length; G += 1) {\n var X = Z[G];\n P(X, new Fu(X[0].x, X[0].y, 0));\n } else if ("Point" === e.type) for (var J = 0, H = e.geometry; J < H.length; J += 1) {\n for (var Y = 0, $ = H[J]; Y < $.length; Y += 1) {\n var W = $[Y];\n P([W], new Fu(W.x, W.y, 0));\n }\n }\n }(t, a, f, R, n, l, c, h, w, U, o);\n }, x = 0, b = t.features; x < b.length; x += 1) {\n g();\n }\n\n a && t.generateCollisionDebugBuffers();\n }, t.perspective = function (t, e, r, n, i) {\n var a,\n o = 1 / Math.tan(e / 2);\n return t[0] = o / r, t[1] = 0, t[2] = 0, t[3] = 0, t[4] = 0, t[5] = o, t[6] = 0, t[7] = 0, t[8] = 0, t[9] = 0, t[11] = -1, t[12] = 0, t[13] = 0, t[15] = 0, null != i && i !== 1 / 0 ? (t[10] = (i + n) * (a = 1 / (n - i)), t[14] = 2 * i * n * a) : (t[10] = -1, t[14] = -2 * n), t;\n }, t.pick = function (t, e) {\n for (var r = {}, n = 0; n < e.length; n++) {\n var i = e[n];\n i in t && (r[i] = t[i]);\n }\n\n return r;\n }, t.plugin = oi, t.polygonIntersectsPolygon = Na, t.postMapLoadEvent = ot, t.postTurnstileEvent = it, t.potpack = vu, t.refProperties = ["type", "source", "source-layer", "minzoom", "maxzoom", "filter", "layout"], t.register = On, t.registerForPluginStateChange = function (t) {\n return t({\n pluginStatus: Qn,\n pluginURL: ti\n }), ni.on("pluginStateChange", t), t;\n }, t.renderColorRamp = wo, t.rotate = function (t, e, r) {\n var n = e[0],\n i = e[1],\n a = e[2],\n o = e[3],\n s = Math.sin(r),\n u = Math.cos(r);\n return t[0] = n * u + a * s, t[1] = i * u + o * s, t[2] = n * -s + a * u, t[3] = i * -s + o * u, t;\n }, t.rotateX = function (t, e, r) {\n var n = Math.sin(r),\n i = Math.cos(r),\n a = e[4],\n o = e[5],\n s = e[6],\n u = e[7],\n l = e[8],\n p = e[9],\n c = e[10],\n h = e[11];\n return e !== t && (t[0] = e[0], t[1] = e[1], t[2] = e[2], t[3] = e[3], t[12] = e[12], t[13] = e[13], t[14] = e[14], t[15] = e[15]), t[4] = a * i + l * n, t[5] = o * i + p * n, t[6] = s * i + c * n, t[7] = u * i + h * n, t[8] = l * i - a * n, t[9] = p * i - o * n, t[10] = c * i - s * n, t[11] = h * i - u * n, t;\n }, t.rotateZ = function (t, e, r) {\n var n = Math.sin(r),\n i = Math.cos(r),\n a = e[0],\n o = e[1],\n s = e[2],\n u = e[3],\n l = e[4],\n p = e[5],\n c = e[6],\n h = e[7];\n return e !== t && (t[8] = e[8], t[9] = e[9], t[10] = e[10], t[11] = e[11], t[12] = e[12], t[13] = e[13], t[14] = e[14], t[15] = e[15]), t[0] = a * i + l * n, t[1] = o * i + p * n, t[2] = s * i + c * n, t[3] = u * i + h * n, t[4] = l * i - a * n, t[5] = p * i - o * n, t[6] = c * i - s * n, t[7] = h * i - u * n, t;\n }, t.scale = function (t, e, r) {\n var n = r[0],\n i = r[1],\n a = r[2];\n return t[0] = e[0] * n, t[1] = e[1] * n, t[2] = e[2] * n, t[3] = e[3] * n, t[4] = e[4] * i, t[5] = e[5] * i, t[6] = e[6] * i, t[7] = e[7] * i, t[8] = e[8] * a, t[9] = e[9] * a, t[10] = e[10] * a, t[11] = e[11] * a, t[12] = e[12], t[13] = e[13], t[14] = e[14], t[15] = e[15], t;\n }, t.scale$1 = function (t, e, r) {\n return t[0] = e[0] * r, t[1] = e[1] * r, t[2] = e[2] * r, t[3] = e[3] * r, t;\n }, t.scale$2 = function (t, e, r) {\n return t[0] = e[0] * r, t[1] = e[1] * r, t[2] = e[2] * r, t;\n }, t.setCacheLimits = function (t, e) {\n st = t, ut = e;\n }, t.setRTLTextPlugin = function (t, e, r) {\n if (void 0 === r && (r = !1), "deferred" === Qn || "loading" === Qn || "loaded" === Qn) throw new Error("setRTLTextPlugin cannot be called multiple times.");\n ti = O.resolveURL(t), Qn = "deferred", Wn = e, ri(), r || ai();\n }, t.sphericalToCartesian = function (t) {\n var e = t[0],\n r = t[1],\n n = t[2];\n return r += 90, r *= Math.PI / 180, n *= Math.PI / 180, {\n x: e * Math.cos(r) * Math.sin(n),\n y: e * Math.sin(r) * Math.sin(n),\n z: e * Math.cos(n)\n };\n }, t.sqrLen = function (t) {\n var e = t[0],\n r = t[1];\n return e * e + r * r;\n }, t.styleSpec = Et, t.sub = function (t, e, r) {\n return t[0] = e[0] - r[0], t[1] = e[1] - r[1], t[2] = e[2] - r[2], t;\n }, t.symbolSize = Ru, t.transformMat3 = function (t, e, r) {\n var n = e[0],\n i = e[1],\n a = e[2];\n return t[0] = n * r[0] + i * r[3] + a * r[6], t[1] = n * r[1] + i * r[4] + a * r[7], t[2] = n * r[2] + i * r[5] + a * r[8], t;\n }, t.transformMat4 = po, t.translate = function (t, e, r) {\n var n,\n i,\n a,\n o,\n s,\n u,\n l,\n p,\n c,\n h,\n f,\n y,\n d = r[0],\n m = r[1],\n v = r[2];\n return e === t ? (t[12] = e[0] * d + e[4] * m + e[8] * v + e[12], t[13] = e[1] * d + e[5] * m + e[9] * v + e[13], t[14] = e[2] * d + e[6] * m + e[10] * v + e[14], t[15] = e[3] * d + e[7] * m + e[11] * v + e[15]) : (i = e[1], a = e[2], o = e[3], s = e[4], u = e[5], l = e[6], p = e[7], c = e[8], h = e[9], f = e[10], y = e[11], t[0] = n = e[0], t[1] = i, t[2] = a, t[3] = o, t[4] = s, t[5] = u, t[6] = l, t[7] = p, t[8] = c, t[9] = h, t[10] = f, t[11] = y, t[12] = n * d + s * m + c * v + e[12], t[13] = i * d + u * m + h * v + e[13], t[14] = a * d + l * m + f * v + e[14], t[15] = o * d + p * m + y * v + e[15]), t;\n }, t.triggerPluginCompletionEvent = ei, t.uniqueId = y, t.validateCustomStyleLayer = function (t) {\n var e = [],\n r = t.id;\n return void 0 === r && e.push({\n message: "layers." + r + \': missing required property "id"\'\n }), void 0 === t.render && e.push({\n message: "layers." + r + \': missing required method "render"\'\n }), t.renderingMode && "2d" !== t.renderingMode && "3d" !== t.renderingMode && e.push({\n message: "layers." + r + \': property "renderingMode" must be either "2d" or "3d"\'\n }), e;\n }, t.validateLight = En, t.validateStyle = Cn, t.values = function (t) {\n var e = [];\n\n for (var r in t) {\n e.push(t[r]);\n }\n\n return e;\n }, t.vectorTile = bs, t.version = "1.13.1", t.warnOnce = A, t.webpSupported = U, t.window = o, t.wrap = c;\n });\n define(["./shared"], function (e) {\n "use strict";\n\n function t(e) {\n var r = typeof e;\n if ("number" === r || "boolean" === r || "string" === r || null == e) return JSON.stringify(e);\n\n if (Array.isArray(e)) {\n for (var i = "[", o = 0, n = e; o < n.length; o += 1) {\n i += t(n[o]) + ",";\n }\n\n return i + "]";\n }\n\n for (var s = Object.keys(e).sort(), a = "{", l = 0; l < s.length; l++) {\n a += JSON.stringify(s[l]) + ":" + t(e[s[l]]) + ",";\n }\n\n return a + "}";\n }\n\n function r(r) {\n for (var i = "", o = 0, n = e.refProperties; o < n.length; o += 1) {\n i += "/" + t(r[n[o]]);\n }\n\n return i;\n }\n\n var i = function i(e) {\n this.keyCache = {}, e && this.replace(e);\n };\n\n i.prototype.replace = function (e) {\n this._layerConfigs = {}, this._layers = {}, this.update(e, []);\n }, i.prototype.update = function (t, i) {\n for (var o = this, n = 0, s = t; n < s.length; n += 1) {\n var a = s[n];\n this._layerConfigs[a.id] = a;\n var l = this._layers[a.id] = e.createStyleLayer(a);\n l._featureFilter = e.featureFilter(l.filter), this.keyCache[a.id] && delete this.keyCache[a.id];\n }\n\n for (var u = 0, h = i; u < h.length; u += 1) {\n var c = h[u];\n delete this.keyCache[c], delete this._layerConfigs[c], delete this._layers[c];\n }\n\n this.familiesBySource = {};\n\n for (var p = 0, f = function (e, t) {\n for (var i = {}, o = 0; o < e.length; o++) {\n var n = t && t[e[o].id] || r(e[o]);\n t && (t[e[o].id] = n);\n var s = i[n];\n s || (s = i[n] = []), s.push(e[o]);\n }\n\n var a = [];\n\n for (var l in i) {\n a.push(i[l]);\n }\n\n return a;\n }(e.values(this._layerConfigs), this.keyCache); p < f.length; p += 1) {\n var d = f[p].map(function (e) {\n return o._layers[e.id];\n }),\n g = d[0];\n\n if ("none" !== g.visibility) {\n var v = g.source || "",\n m = this.familiesBySource[v];\n m || (m = this.familiesBySource[v] = {});\n var y = g.sourceLayer || "_geojsonTileLayer",\n x = m[y];\n x || (x = m[y] = []), x.push(d);\n }\n }\n };\n\n var o = function o(t) {\n var r = {},\n i = [];\n\n for (var o in t) {\n var n = t[o],\n s = r[o] = {};\n\n for (var a in n) {\n var l = n[+a];\n\n if (l && 0 !== l.bitmap.width && 0 !== l.bitmap.height) {\n var u = {\n x: 0,\n y: 0,\n w: l.bitmap.width + 2,\n h: l.bitmap.height + 2\n };\n i.push(u), s[a] = {\n rect: u,\n metrics: l.metrics\n };\n }\n }\n }\n\n var h = e.potpack(i),\n c = new e.AlphaImage({\n width: h.w || 1,\n height: h.h || 1\n });\n\n for (var p in t) {\n var f = t[p];\n\n for (var d in f) {\n var g = f[+d];\n\n if (g && 0 !== g.bitmap.width && 0 !== g.bitmap.height) {\n var v = r[p][d].rect;\n e.AlphaImage.copy(g.bitmap, c, {\n x: 0,\n y: 0\n }, {\n x: v.x + 1,\n y: v.y + 1\n }, g.bitmap);\n }\n }\n }\n\n this.image = c, this.positions = r;\n };\n\n e.register("GlyphAtlas", o);\n\n var n = function n(t) {\n this.tileID = new e.OverscaledTileID(t.tileID.overscaledZ, t.tileID.wrap, t.tileID.canonical.z, t.tileID.canonical.x, t.tileID.canonical.y), this.uid = t.uid, this.zoom = t.zoom, this.pixelRatio = t.pixelRatio, this.tileSize = t.tileSize, this.source = t.source, this.overscaling = this.tileID.overscaleFactor(), this.showCollisionBoxes = t.showCollisionBoxes, this.collectResourceTiming = !!t.collectResourceTiming, this.returnDependencies = !!t.returnDependencies, this.promoteId = t.promoteId;\n };\n\n function s(t, r, i) {\n for (var o = new e.EvaluationParameters(r), n = 0, s = t; n < s.length; n += 1) {\n s[n].recalculate(o, i);\n }\n }\n\n function a(t, r) {\n var i = e.getArrayBuffer(t.request, function (t, i, o, n) {\n t ? r(t) : i && r(null, {\n vectorTile: new e.vectorTile.VectorTile(new e.pbf(i)),\n rawData: i,\n cacheControl: o,\n expires: n\n });\n });\n return function () {\n i.cancel(), r();\n };\n }\n\n n.prototype.parse = function (t, r, i, n, a) {\n var l = this;\n this.status = "parsing", this.data = t, this.collisionBoxArray = new e.CollisionBoxArray();\n var u = new e.DictionaryCoder(Object.keys(t.layers).sort()),\n h = new e.FeatureIndex(this.tileID, this.promoteId);\n h.bucketLayerIDs = [];\n var c,\n p,\n f,\n d,\n g = {},\n v = {\n featureIndex: h,\n iconDependencies: {},\n patternDependencies: {},\n glyphDependencies: {},\n availableImages: i\n },\n m = r.familiesBySource[this.source];\n\n for (var y in m) {\n var x = t.layers[y];\n\n if (x) {\n 1 === x.version && e.warnOnce(\'Vector tile source "\' + this.source + \'" layer "\' + y + \'" does not use vector tile spec v2 and therefore may have some rendering errors.\');\n\n for (var w = u.encode(y), S = [], I = 0; I < x.length; I++) {\n var M = x.feature(I),\n b = h.getId(M, y);\n S.push({\n feature: M,\n id: b,\n index: I,\n sourceLayerIndex: w\n });\n }\n\n for (var _ = 0, k = m[y]; _ < k.length; _ += 1) {\n var P = k[_],\n T = P[0];\n T.minzoom && this.zoom < Math.floor(T.minzoom) || T.maxzoom && this.zoom >= T.maxzoom || "none" !== T.visibility && (s(P, this.zoom, i), (g[T.id] = T.createBucket({\n index: h.bucketLayerIDs.length,\n layers: P,\n zoom: this.zoom,\n pixelRatio: this.pixelRatio,\n overscaling: this.overscaling,\n collisionBoxArray: this.collisionBoxArray,\n sourceLayerIndex: w,\n sourceID: this.source\n })).populate(S, v, this.tileID.canonical), h.bucketLayerIDs.push(P.map(function (e) {\n return e.id;\n })));\n }\n }\n }\n\n var C = e.mapObject(v.glyphDependencies, function (e) {\n return Object.keys(e).map(Number);\n });\n Object.keys(C).length ? n.send("getGlyphs", {\n uid: this.uid,\n stacks: C\n }, function (e, t) {\n c || (c = e, p = t, z.call(l));\n }) : p = {};\n var D = Object.keys(v.iconDependencies);\n D.length ? n.send("getImages", {\n icons: D,\n source: this.source,\n tileID: this.tileID,\n type: "icons"\n }, function (e, t) {\n c || (c = e, f = t, z.call(l));\n }) : f = {};\n var L = Object.keys(v.patternDependencies);\n\n function z() {\n if (c) return a(c);\n\n if (p && f && d) {\n var t = new o(p),\n r = new e.ImageAtlas(f, d);\n\n for (var n in g) {\n var l = g[n];\n l instanceof e.SymbolBucket ? (s(l.layers, this.zoom, i), e.performSymbolLayout(l, p, t.positions, f, r.iconPositions, this.showCollisionBoxes, this.tileID.canonical)) : l.hasPattern && (l instanceof e.LineBucket || l instanceof e.FillBucket || l instanceof e.FillExtrusionBucket) && (s(l.layers, this.zoom, i), l.addFeatures(v, this.tileID.canonical, r.patternPositions));\n }\n\n this.status = "done", a(null, {\n buckets: e.values(g).filter(function (e) {\n return !e.isEmpty();\n }),\n featureIndex: h,\n collisionBoxArray: this.collisionBoxArray,\n glyphAtlasImage: t.image,\n imageAtlas: r,\n glyphMap: this.returnDependencies ? p : null,\n iconMap: this.returnDependencies ? f : null,\n glyphPositions: this.returnDependencies ? t.positions : null\n });\n }\n }\n\n L.length ? n.send("getImages", {\n icons: L,\n source: this.source,\n tileID: this.tileID,\n type: "patterns"\n }, function (e, t) {\n c || (c = e, d = t, z.call(l));\n }) : d = {}, z.call(this);\n };\n\n var l = function l(e, t, r, i) {\n this.actor = e, this.layerIndex = t, this.availableImages = r, this.loadVectorData = i || a, this.loading = {}, this.loaded = {};\n };\n\n l.prototype.loadTile = function (t, r) {\n var i = this,\n o = t.uid;\n this.loading || (this.loading = {});\n var s = !!(t && t.request && t.request.collectResourceTiming) && new e.RequestPerformance(t.request),\n a = this.loading[o] = new n(t);\n a.abort = this.loadVectorData(t, function (t, n) {\n if (delete i.loading[o], t || !n) return a.status = "done", i.loaded[o] = a, r(t);\n var l = n.rawData,\n u = {};\n n.expires && (u.expires = n.expires), n.cacheControl && (u.cacheControl = n.cacheControl);\n var h = {};\n\n if (s) {\n var c = s.finish();\n c && (h.resourceTiming = JSON.parse(JSON.stringify(c)));\n }\n\n a.vectorTile = n.vectorTile, a.parse(n.vectorTile, i.layerIndex, i.availableImages, i.actor, function (t, i) {\n if (t || !i) return r(t);\n r(null, e.extend({\n rawTileData: l.slice(0)\n }, i, u, h));\n }), i.loaded = i.loaded || {}, i.loaded[o] = a;\n });\n }, l.prototype.reloadTile = function (e, t) {\n var r = this,\n i = this.loaded,\n o = e.uid,\n n = this;\n\n if (i && i[o]) {\n var s = i[o];\n s.showCollisionBoxes = e.showCollisionBoxes;\n\n var a = function a(e, i) {\n var o = s.reloadCallback;\n o && (delete s.reloadCallback, s.parse(s.vectorTile, n.layerIndex, r.availableImages, n.actor, o)), t(e, i);\n };\n\n "parsing" === s.status ? s.reloadCallback = a : "done" === s.status && (s.vectorTile ? s.parse(s.vectorTile, this.layerIndex, this.availableImages, this.actor, a) : a());\n }\n }, l.prototype.abortTile = function (e, t) {\n var r = this.loading,\n i = e.uid;\n r && r[i] && r[i].abort && (r[i].abort(), delete r[i]), t();\n }, l.prototype.removeTile = function (e, t) {\n var r = this.loaded,\n i = e.uid;\n r && r[i] && delete r[i], t();\n };\n\n var u = e.window.ImageBitmap,\n h = function h() {\n this.loaded = {};\n };\n\n function c(e, t) {\n if (0 !== e.length) {\n p(e[0], t);\n\n for (var r = 1; r < e.length; r++) {\n p(e[r], !t);\n }\n }\n }\n\n function p(e, t) {\n for (var r = 0, i = 0, o = e.length, n = o - 1; i < o; n = i++) {\n r += (e[i][0] - e[n][0]) * (e[n][1] + e[i][1]);\n }\n\n r >= 0 != !!t && e.reverse();\n }\n\n h.prototype.loadTile = function (t, r) {\n var i = t.uid,\n o = t.encoding,\n n = t.rawImageData,\n s = u && n instanceof u ? this.getImageData(n) : n,\n a = new e.DEMData(i, s, o);\n this.loaded = this.loaded || {}, this.loaded[i] = a, r(null, a);\n }, h.prototype.getImageData = function (t) {\n this.offscreenCanvas && this.offscreenCanvasContext || (this.offscreenCanvas = new OffscreenCanvas(t.width, t.height), this.offscreenCanvasContext = this.offscreenCanvas.getContext("2d")), this.offscreenCanvas.width = t.width, this.offscreenCanvas.height = t.height, this.offscreenCanvasContext.drawImage(t, 0, 0, t.width, t.height);\n var r = this.offscreenCanvasContext.getImageData(-1, -1, t.width + 2, t.height + 2);\n return this.offscreenCanvasContext.clearRect(0, 0, this.offscreenCanvas.width, this.offscreenCanvas.height), new e.RGBAImage({\n width: r.width,\n height: r.height\n }, r.data);\n }, h.prototype.removeTile = function (e) {\n var t = this.loaded,\n r = e.uid;\n t && t[r] && delete t[r];\n };\n\n var f = e.vectorTile.VectorTileFeature.prototype.toGeoJSON,\n d = function d(t) {\n this._feature = t, this.extent = e.EXTENT, this.type = t.type, this.properties = t.tags, "id" in t && !isNaN(t.id) && (this.id = parseInt(t.id, 10));\n };\n\n d.prototype.loadGeometry = function () {\n if (1 === this._feature.type) {\n for (var t = [], r = 0, i = this._feature.geometry; r < i.length; r += 1) {\n var o = i[r];\n t.push([new e.Point$1(o[0], o[1])]);\n }\n\n return t;\n }\n\n for (var n = [], s = 0, a = this._feature.geometry; s < a.length; s += 1) {\n for (var l = [], u = 0, h = a[s]; u < h.length; u += 1) {\n var c = h[u];\n l.push(new e.Point$1(c[0], c[1]));\n }\n\n n.push(l);\n }\n\n return n;\n }, d.prototype.toGeoJSON = function (e, t, r) {\n return f.call(this, e, t, r);\n };\n\n var g = function g(t) {\n this.layers = {\n _geojsonTileLayer: this\n }, this.name = "_geojsonTileLayer", this.extent = e.EXTENT, this.length = t.length, this._features = t;\n };\n\n g.prototype.feature = function (e) {\n return new d(this._features[e]);\n };\n\n var v = e.vectorTile.VectorTileFeature,\n m = y;\n\n function y(e, t) {\n this.options = t || {}, this.features = e, this.length = e.length;\n }\n\n function x(e, t) {\n this.id = "number" == typeof e.id ? e.id : void 0, this.type = e.type, this.rawGeometry = 1 === e.type ? [e.geometry] : e.geometry, this.properties = e.tags, this.extent = t || 4096;\n }\n\n y.prototype.feature = function (e) {\n return new x(this.features[e], this.options.extent);\n }, x.prototype.loadGeometry = function () {\n var t = this.rawGeometry;\n this.geometry = [];\n\n for (var r = 0; r < t.length; r++) {\n for (var i = t[r], o = [], n = 0; n < i.length; n++) {\n o.push(new e.Point$1(i[n][0], i[n][1]));\n }\n\n this.geometry.push(o);\n }\n\n return this.geometry;\n }, x.prototype.bbox = function () {\n this.geometry || this.loadGeometry();\n\n for (var e = this.geometry, t = 1 / 0, r = -1 / 0, i = 1 / 0, o = -1 / 0, n = 0; n < e.length; n++) {\n for (var s = e[n], a = 0; a < s.length; a++) {\n var l = s[a];\n t = Math.min(t, l.x), r = Math.max(r, l.x), i = Math.min(i, l.y), o = Math.max(o, l.y);\n }\n }\n\n return [t, i, r, o];\n }, x.prototype.toGeoJSON = v.prototype.toGeoJSON;\n var w = I,\n S = m;\n\n function I(t) {\n var r = new e.pbf();\n return function (e, t) {\n for (var r in e.layers) {\n t.writeMessage(3, M, e.layers[r]);\n }\n }(t, r), r.finish();\n }\n\n function M(e, t) {\n var r;\n t.writeVarintField(15, e.version || 1), t.writeStringField(1, e.name || ""), t.writeVarintField(5, e.extent || 4096);\n var i = {\n keys: [],\n values: [],\n keycache: {},\n valuecache: {}\n };\n\n for (r = 0; r < e.length; r++) {\n i.feature = e.feature(r), t.writeMessage(2, b, i);\n }\n\n var o = i.keys;\n\n for (r = 0; r < o.length; r++) {\n t.writeStringField(3, o[r]);\n }\n\n var n = i.values;\n\n for (r = 0; r < n.length; r++) {\n t.writeMessage(4, C, n[r]);\n }\n }\n\n function b(e, t) {\n var r = e.feature;\n void 0 !== r.id && t.writeVarintField(1, r.id), t.writeMessage(2, _, e), t.writeVarintField(3, r.type), t.writeMessage(4, T, r);\n }\n\n function _(e, t) {\n var r = e.feature,\n i = e.keys,\n o = e.values,\n n = e.keycache,\n s = e.valuecache;\n\n for (var a in r.properties) {\n var l = n[a];\n void 0 === l && (i.push(a), n[a] = l = i.length - 1), t.writeVarint(l);\n var u = r.properties[a],\n h = typeof u;\n "string" !== h && "boolean" !== h && "number" !== h && (u = JSON.stringify(u));\n var c = h + ":" + u,\n p = s[c];\n void 0 === p && (o.push(u), s[c] = p = o.length - 1), t.writeVarint(p);\n }\n }\n\n function k(e, t) {\n return (t << 3) + (7 & e);\n }\n\n function P(e) {\n return e << 1 ^ e >> 31;\n }\n\n function T(e, t) {\n for (var r = e.loadGeometry(), i = e.type, o = 0, n = 0, s = r.length, a = 0; a < s; a++) {\n var l = r[a],\n u = 1;\n 1 === i && (u = l.length), t.writeVarint(k(1, u));\n\n for (var h = 3 === i ? l.length - 1 : l.length, c = 0; c < h; c++) {\n 1 === c && 1 !== i && t.writeVarint(k(2, h - 1));\n var p = l[c].x - o,\n f = l[c].y - n;\n t.writeVarint(P(p)), t.writeVarint(P(f)), o += p, n += f;\n }\n\n 3 === i && t.writeVarint(k(7, 1));\n }\n }\n\n function C(e, t) {\n var r = typeof e;\n "string" === r ? t.writeStringField(1, e) : "boolean" === r ? t.writeBooleanField(7, e) : "number" === r && (e % 1 != 0 ? t.writeDoubleField(3, e) : e < 0 ? t.writeSVarintField(6, e) : t.writeVarintField(5, e));\n }\n\n function D(e, t, r, i) {\n L(e, r, i), L(t, 2 * r, 2 * i), L(t, 2 * r + 1, 2 * i + 1);\n }\n\n function L(e, t, r) {\n var i = e[t];\n e[t] = e[r], e[r] = i;\n }\n\n function z(e, t, r, i) {\n var o = e - r,\n n = t - i;\n return o * o + n * n;\n }\n\n w.fromVectorTileJs = I, w.fromGeojsonVt = function (e, t) {\n t = t || {};\n var r = {};\n\n for (var i in e) {\n r[i] = new m(e[i].features, t), r[i].name = i, r[i].version = t.version, r[i].extent = t.extent;\n }\n\n return I({\n layers: r\n });\n }, w.GeoJSONWrapper = S;\n\n var O = function O(e) {\n return e[0];\n },\n E = function E(e) {\n return e[1];\n },\n F = function F(e, t, r, i, o) {\n void 0 === t && (t = O), void 0 === r && (r = E), void 0 === i && (i = 64), void 0 === o && (o = Float64Array), this.nodeSize = i, this.points = e;\n\n for (var n = e.length < 65536 ? Uint16Array : Uint32Array, s = this.ids = new n(e.length), a = this.coords = new o(2 * e.length), l = 0; l < e.length; l++) {\n s[l] = l, a[2 * l] = t(e[l]), a[2 * l + 1] = r(e[l]);\n }\n\n !function e(t, r, i, o, n, s) {\n if (!(n - o <= i)) {\n var a = o + n >> 1;\n !function e(t, r, i, o, n, s) {\n for (; n > o;) {\n if (n - o > 600) {\n var a = n - o + 1,\n l = i - o + 1,\n u = Math.log(a),\n h = .5 * Math.exp(2 * u / 3),\n c = .5 * Math.sqrt(u * h * (a - h) / a) * (l - a / 2 < 0 ? -1 : 1);\n e(t, r, i, Math.max(o, Math.floor(i - l * h / a + c)), Math.min(n, Math.floor(i + (a - l) * h / a + c)), s);\n }\n\n var p = r[2 * i + s],\n f = o,\n d = n;\n\n for (D(t, r, o, i), r[2 * n + s] > p && D(t, r, o, n); f < d;) {\n for (D(t, r, f, d), f++, d--; r[2 * f + s] < p;) {\n f++;\n }\n\n for (; r[2 * d + s] > p;) {\n d--;\n }\n }\n\n r[2 * o + s] === p ? D(t, r, o, d) : D(t, r, ++d, n), d <= i && (o = d + 1), i <= d && (n = d - 1);\n }\n }(t, r, a, o, n, s % 2), e(t, r, i, o, a - 1, s + 1), e(t, r, i, a + 1, n, s + 1);\n }\n }(s, a, i, 0, s.length - 1, 0);\n };\n\n F.prototype.range = function (e, t, r, i) {\n return function (e, t, r, i, o, n, s) {\n for (var a, l, u = [0, e.length - 1, 0], h = []; u.length;) {\n var c = u.pop(),\n p = u.pop(),\n f = u.pop();\n if (p - f <= s) for (var d = f; d <= p; d++) {\n l = t[2 * d + 1], (a = t[2 * d]) >= r && a <= o && l >= i && l <= n && h.push(e[d]);\n } else {\n var g = Math.floor((f + p) / 2);\n l = t[2 * g + 1], (a = t[2 * g]) >= r && a <= o && l >= i && l <= n && h.push(e[g]);\n var v = (c + 1) % 2;\n (0 === c ? r <= a : i <= l) && (u.push(f), u.push(g - 1), u.push(v)), (0 === c ? o >= a : n >= l) && (u.push(g + 1), u.push(p), u.push(v));\n }\n }\n\n return h;\n }(this.ids, this.coords, e, t, r, i, this.nodeSize);\n }, F.prototype.within = function (e, t, r) {\n return function (e, t, r, i, o, n) {\n for (var s = [0, e.length - 1, 0], a = [], l = o * o; s.length;) {\n var u = s.pop(),\n h = s.pop(),\n c = s.pop();\n if (h - c <= n) for (var p = c; p <= h; p++) {\n z(t[2 * p], t[2 * p + 1], r, i) <= l && a.push(e[p]);\n } else {\n var f = Math.floor((c + h) / 2),\n d = t[2 * f],\n g = t[2 * f + 1];\n z(d, g, r, i) <= l && a.push(e[f]);\n var v = (u + 1) % 2;\n (0 === u ? r - o <= d : i - o <= g) && (s.push(c), s.push(f - 1), s.push(v)), (0 === u ? r + o >= d : i + o >= g) && (s.push(f + 1), s.push(h), s.push(v));\n }\n }\n\n return a;\n }(this.ids, this.coords, e, t, r, this.nodeSize);\n };\n\n var N = {\n minZoom: 0,\n maxZoom: 16,\n minPoints: 2,\n radius: 40,\n extent: 512,\n nodeSize: 64,\n log: !1,\n generateId: !1,\n reduce: null,\n map: function map(e) {\n return e;\n }\n },\n J = function J(e) {\n this.options = V(Object.create(N), e), this.trees = new Array(this.options.maxZoom + 1);\n };\n\n function Z(e, t, r, i, o) {\n return {\n x: e,\n y: t,\n zoom: 1 / 0,\n id: r,\n parentId: -1,\n numPoints: i,\n properties: o\n };\n }\n\n function A(e, t) {\n var r = e.geometry.coordinates,\n i = r[1];\n return {\n x: Y(r[0]),\n y: j(i),\n zoom: 1 / 0,\n index: t,\n parentId: -1\n };\n }\n\n function B(e) {\n return {\n type: "Feature",\n id: e.id,\n properties: G(e),\n geometry: {\n type: "Point",\n coordinates: [(i = e.x, 360 * (i - .5)), (t = e.y, r = (180 - 360 * t) * Math.PI / 180, 360 * Math.atan(Math.exp(r)) / Math.PI - 90)]\n }\n };\n var t, r, i;\n }\n\n function G(e) {\n var t = e.numPoints,\n r = t >= 1e4 ? Math.round(t / 1e3) + "k" : t >= 1e3 ? Math.round(t / 100) / 10 + "k" : t;\n return V(V({}, e.properties), {\n cluster: !0,\n cluster_id: e.id,\n point_count: t,\n point_count_abbreviated: r\n });\n }\n\n function Y(e) {\n return e / 360 + .5;\n }\n\n function j(e) {\n var t = Math.sin(e * Math.PI / 180),\n r = .5 - .25 * Math.log((1 + t) / (1 - t)) / Math.PI;\n return r < 0 ? 0 : r > 1 ? 1 : r;\n }\n\n function V(e, t) {\n for (var r in t) {\n e[r] = t[r];\n }\n\n return e;\n }\n\n function X(e) {\n return e.x;\n }\n\n function W(e) {\n return e.y;\n }\n\n function R(e, t, r, i, o, n) {\n var s = o - r,\n a = n - i;\n\n if (0 !== s || 0 !== a) {\n var l = ((e - r) * s + (t - i) * a) / (s * s + a * a);\n l > 1 ? (r = o, i = n) : l > 0 && (r += s * l, i += a * l);\n }\n\n return (s = e - r) * s + (a = t - i) * a;\n }\n\n function q(e, t, r, i) {\n var o = {\n id: void 0 === e ? null : e,\n type: t,\n geometry: r,\n tags: i,\n minX: 1 / 0,\n minY: 1 / 0,\n maxX: -1 / 0,\n maxY: -1 / 0\n };\n return function (e) {\n var t = e.geometry,\n r = e.type;\n if ("Point" === r || "MultiPoint" === r || "LineString" === r) U(e, t);else if ("Polygon" === r || "MultiLineString" === r) for (var i = 0; i < t.length; i++) {\n U(e, t[i]);\n } else if ("MultiPolygon" === r) for (i = 0; i < t.length; i++) {\n for (var o = 0; o < t[i].length; o++) {\n U(e, t[i][o]);\n }\n }\n }(o), o;\n }\n\n function U(e, t) {\n for (var r = 0; r < t.length; r += 3) {\n e.minX = Math.min(e.minX, t[r]), e.minY = Math.min(e.minY, t[r + 1]), e.maxX = Math.max(e.maxX, t[r]), e.maxY = Math.max(e.maxY, t[r + 1]);\n }\n }\n\n function $(e, t, r, i) {\n if (t.geometry) {\n var o = t.geometry.coordinates,\n n = t.geometry.type,\n s = Math.pow(r.tolerance / ((1 << r.maxZoom) * r.extent), 2),\n a = [],\n l = t.id;\n if (r.promoteId ? l = t.properties[r.promoteId] : r.generateId && (l = i || 0), "Point" === n) H(o, a);else if ("MultiPoint" === n) for (var u = 0; u < o.length; u++) {\n H(o[u], a);\n } else if ("LineString" === n) K(o, a, s, !1);else if ("MultiLineString" === n) {\n if (r.lineMetrics) {\n for (u = 0; u < o.length; u++) {\n K(o[u], a = [], s, !1), e.push(q(l, "LineString", a, t.properties));\n }\n\n return;\n }\n\n Q(o, a, s, !1);\n } else if ("Polygon" === n) Q(o, a, s, !0);else {\n if ("MultiPolygon" !== n) {\n if ("GeometryCollection" === n) {\n for (u = 0; u < t.geometry.geometries.length; u++) {\n $(e, {\n id: l,\n geometry: t.geometry.geometries[u],\n properties: t.properties\n }, r, i);\n }\n\n return;\n }\n\n throw new Error("Input data is not a valid GeoJSON object.");\n }\n\n for (u = 0; u < o.length; u++) {\n var h = [];\n Q(o[u], h, s, !0), a.push(h);\n }\n }\n e.push(q(l, n, a, t.properties));\n }\n }\n\n function H(e, t) {\n t.push(ee(e[0])), t.push(te(e[1])), t.push(0);\n }\n\n function K(e, t, r, i) {\n for (var o, n, s = 0, a = 0; a < e.length; a++) {\n var l = ee(e[a][0]),\n u = te(e[a][1]);\n t.push(l), t.push(u), t.push(0), a > 0 && (s += i ? (o * u - l * n) / 2 : Math.sqrt(Math.pow(l - o, 2) + Math.pow(u - n, 2))), o = l, n = u;\n }\n\n var h = t.length - 3;\n t[2] = 1, function e(t, r, i, o) {\n for (var n, s = o, a = i - r >> 1, l = i - r, u = t[r], h = t[r + 1], c = t[i], p = t[i + 1], f = r + 3; f < i; f += 3) {\n var d = R(t[f], t[f + 1], u, h, c, p);\n if (d > s) n = f, s = d;else if (d === s) {\n var g = Math.abs(f - a);\n g < l && (n = f, l = g);\n }\n }\n\n s > o && (n - r > 3 && e(t, r, n, o), t[n + 2] = s, i - n > 3 && e(t, n, i, o));\n }(t, 0, h, r), t[h + 2] = 1, t.size = Math.abs(s), t.start = 0, t.end = t.size;\n }\n\n function Q(e, t, r, i) {\n for (var o = 0; o < e.length; o++) {\n var n = [];\n K(e[o], n, r, i), t.push(n);\n }\n }\n\n function ee(e) {\n return e / 360 + .5;\n }\n\n function te(e) {\n var t = Math.sin(e * Math.PI / 180),\n r = .5 - .25 * Math.log((1 + t) / (1 - t)) / Math.PI;\n return r < 0 ? 0 : r > 1 ? 1 : r;\n }\n\n function re(e, t, r, i, o, n, s, a) {\n if (i /= t, n >= (r /= t) && s < i) return e;\n if (s < r || n >= i) return null;\n\n for (var l = [], u = 0; u < e.length; u++) {\n var h = e[u],\n c = h.geometry,\n p = h.type,\n f = 0 === o ? h.minX : h.minY,\n d = 0 === o ? h.maxX : h.maxY;\n if (f >= r && d < i) l.push(h);else if (!(d < r || f >= i)) {\n var g = [];\n if ("Point" === p || "MultiPoint" === p) ie(c, g, r, i, o);else if ("LineString" === p) oe(c, g, r, i, o, !1, a.lineMetrics);else if ("MultiLineString" === p) se(c, g, r, i, o, !1);else if ("Polygon" === p) se(c, g, r, i, o, !0);else if ("MultiPolygon" === p) for (var v = 0; v < c.length; v++) {\n var m = [];\n se(c[v], m, r, i, o, !0), m.length && g.push(m);\n }\n\n if (g.length) {\n if (a.lineMetrics && "LineString" === p) {\n for (v = 0; v < g.length; v++) {\n l.push(q(h.id, p, g[v], h.tags));\n }\n\n continue;\n }\n\n "LineString" !== p && "MultiLineString" !== p || (1 === g.length ? (p = "LineString", g = g[0]) : p = "MultiLineString"), "Point" !== p && "MultiPoint" !== p || (p = 3 === g.length ? "Point" : "MultiPoint"), l.push(q(h.id, p, g, h.tags));\n }\n }\n }\n\n return l.length ? l : null;\n }\n\n function ie(e, t, r, i, o) {\n for (var n = 0; n < e.length; n += 3) {\n var s = e[n + o];\n s >= r && s <= i && (t.push(e[n]), t.push(e[n + 1]), t.push(e[n + 2]));\n }\n }\n\n function oe(e, t, r, i, o, n, s) {\n for (var a, l, u = ne(e), h = 0 === o ? le : ue, c = e.start, p = 0; p < e.length - 3; p += 3) {\n var f = e[p],\n d = e[p + 1],\n g = e[p + 2],\n v = e[p + 3],\n m = e[p + 4],\n y = 0 === o ? f : d,\n x = 0 === o ? v : m,\n w = !1;\n s && (a = Math.sqrt(Math.pow(f - v, 2) + Math.pow(d - m, 2))), y < r ? x > r && (l = h(u, f, d, v, m, r), s && (u.start = c + a * l)) : y > i ? x < i && (l = h(u, f, d, v, m, i), s && (u.start = c + a * l)) : ae(u, f, d, g), x < r && y >= r && (l = h(u, f, d, v, m, r), w = !0), x > i && y <= i && (l = h(u, f, d, v, m, i), w = !0), !n && w && (s && (u.end = c + a * l), t.push(u), u = ne(e)), s && (c += a);\n }\n\n var S = e.length - 3;\n f = e[S], d = e[S + 1], g = e[S + 2], (y = 0 === o ? f : d) >= r && y <= i && ae(u, f, d, g), S = u.length - 3, n && S >= 3 && (u[S] !== u[0] || u[S + 1] !== u[1]) && ae(u, u[0], u[1], u[2]), u.length && t.push(u);\n }\n\n function ne(e) {\n var t = [];\n return t.size = e.size, t.start = e.start, t.end = e.end, t;\n }\n\n function se(e, t, r, i, o, n) {\n for (var s = 0; s < e.length; s++) {\n oe(e[s], t, r, i, o, n, !1);\n }\n }\n\n function ae(e, t, r, i) {\n e.push(t), e.push(r), e.push(i);\n }\n\n function le(e, t, r, i, o, n) {\n var s = (n - t) / (i - t);\n return e.push(n), e.push(r + (o - r) * s), e.push(1), s;\n }\n\n function ue(e, t, r, i, o, n) {\n var s = (n - r) / (o - r);\n return e.push(t + (i - t) * s), e.push(n), e.push(1), s;\n }\n\n function he(e, t) {\n for (var r = [], i = 0; i < e.length; i++) {\n var o,\n n = e[i],\n s = n.type;\n if ("Point" === s || "MultiPoint" === s || "LineString" === s) o = ce(n.geometry, t);else if ("MultiLineString" === s || "Polygon" === s) {\n o = [];\n\n for (var a = 0; a < n.geometry.length; a++) {\n o.push(ce(n.geometry[a], t));\n }\n } else if ("MultiPolygon" === s) for (o = [], a = 0; a < n.geometry.length; a++) {\n for (var l = [], u = 0; u < n.geometry[a].length; u++) {\n l.push(ce(n.geometry[a][u], t));\n }\n\n o.push(l);\n }\n r.push(q(n.id, s, o, n.tags));\n }\n\n return r;\n }\n\n function ce(e, t) {\n var r = [];\n r.size = e.size, void 0 !== e.start && (r.start = e.start, r.end = e.end);\n\n for (var i = 0; i < e.length; i += 3) {\n r.push(e[i] + t, e[i + 1], e[i + 2]);\n }\n\n return r;\n }\n\n function pe(e, t) {\n if (e.transformed) return e;\n var r,\n i,\n o,\n n = 1 << e.z,\n s = e.x,\n a = e.y;\n\n for (r = 0; r < e.features.length; r++) {\n var l = e.features[r],\n u = l.geometry,\n h = l.type;\n if (l.geometry = [], 1 === h) for (i = 0; i < u.length; i += 2) {\n l.geometry.push(fe(u[i], u[i + 1], t, n, s, a));\n } else for (i = 0; i < u.length; i++) {\n var c = [];\n\n for (o = 0; o < u[i].length; o += 2) {\n c.push(fe(u[i][o], u[i][o + 1], t, n, s, a));\n }\n\n l.geometry.push(c);\n }\n }\n\n return e.transformed = !0, e;\n }\n\n function fe(e, t, r, i, o, n) {\n return [Math.round(r * (e * i - o)), Math.round(r * (t * i - n))];\n }\n\n function de(e, t, r, i, o) {\n for (var n = t === o.maxZoom ? 0 : o.tolerance / ((1 << t) * o.extent), s = {\n features: [],\n numPoints: 0,\n numSimplified: 0,\n numFeatures: 0,\n source: null,\n x: r,\n y: i,\n z: t,\n transformed: !1,\n minX: 2,\n minY: 1,\n maxX: -1,\n maxY: 0\n }, a = 0; a < e.length; a++) {\n s.numFeatures++, ge(s, e[a], n, o);\n var l = e[a].minX,\n u = e[a].minY,\n h = e[a].maxX,\n c = e[a].maxY;\n l < s.minX && (s.minX = l), u < s.minY && (s.minY = u), h > s.maxX && (s.maxX = h), c > s.maxY && (s.maxY = c);\n }\n\n return s;\n }\n\n function ge(e, t, r, i) {\n var o = t.geometry,\n n = t.type,\n s = [];\n if ("Point" === n || "MultiPoint" === n) for (var a = 0; a < o.length; a += 3) {\n s.push(o[a]), s.push(o[a + 1]), e.numPoints++, e.numSimplified++;\n } else if ("LineString" === n) ve(s, o, e, r, !1, !1);else if ("MultiLineString" === n || "Polygon" === n) for (a = 0; a < o.length; a++) {\n ve(s, o[a], e, r, "Polygon" === n, 0 === a);\n } else if ("MultiPolygon" === n) for (var l = 0; l < o.length; l++) {\n var u = o[l];\n\n for (a = 0; a < u.length; a++) {\n ve(s, u[a], e, r, !0, 0 === a);\n }\n }\n\n if (s.length) {\n var h = t.tags || null;\n\n if ("LineString" === n && i.lineMetrics) {\n for (var c in h = {}, t.tags) {\n h[c] = t.tags[c];\n }\n\n h.mapbox_clip_start = o.start / o.size, h.mapbox_clip_end = o.end / o.size;\n }\n\n var p = {\n geometry: s,\n type: "Polygon" === n || "MultiPolygon" === n ? 3 : "LineString" === n || "MultiLineString" === n ? 2 : 1,\n tags: h\n };\n null !== t.id && (p.id = t.id), e.features.push(p);\n }\n }\n\n function ve(e, t, r, i, o, n) {\n var s = i * i;\n if (i > 0 && t.size < (o ? s : i)) r.numPoints += t.length / 3;else {\n for (var a = [], l = 0; l < t.length; l += 3) {\n (0 === i || t[l + 2] > s) && (r.numSimplified++, a.push(t[l]), a.push(t[l + 1])), r.numPoints++;\n }\n\n o && function (e, t) {\n for (var r = 0, i = 0, o = e.length, n = o - 2; i < o; n = i, i += 2) {\n r += (e[i] - e[n]) * (e[i + 1] + e[n + 1]);\n }\n\n if (r > 0 === t) for (i = 0, o = e.length; i < o / 2; i += 2) {\n var s = e[i],\n a = e[i + 1];\n e[i] = e[o - 2 - i], e[i + 1] = e[o - 1 - i], e[o - 2 - i] = s, e[o - 1 - i] = a;\n }\n }(a, n), e.push(a);\n }\n }\n\n function me(e, t) {\n var r = (t = this.options = function (e, t) {\n for (var r in t) {\n e[r] = t[r];\n }\n\n return e;\n }(Object.create(this.options), t)).debug;\n\n if (r && console.time("preprocess data"), t.maxZoom < 0 || t.maxZoom > 24) throw new Error("maxZoom should be in the 0-24 range");\n if (t.promoteId && t.generateId) throw new Error("promoteId and generateId cannot be used together.");\n\n var i = function (e, t) {\n var r = [];\n if ("FeatureCollection" === e.type) for (var i = 0; i < e.features.length; i++) {\n $(r, e.features[i], t, i);\n } else $(r, "Feature" === e.type ? e : {\n geometry: e\n }, t);\n return r;\n }(e, t);\n\n this.tiles = {}, this.tileCoords = [], r && (console.timeEnd("preprocess data"), console.log("index: maxZoom: %d, maxPoints: %d", t.indexMaxZoom, t.indexMaxPoints), console.time("generate tiles"), this.stats = {}, this.total = 0), (i = function (e, t) {\n var r = t.buffer / t.extent,\n i = e,\n o = re(e, 1, -1 - r, r, 0, -1, 2, t),\n n = re(e, 1, 1 - r, 2 + r, 0, -1, 2, t);\n return (o || n) && (i = re(e, 1, -r, 1 + r, 0, -1, 2, t) || [], o && (i = he(o, 1).concat(i)), n && (i = i.concat(he(n, -1)))), i;\n }(i, t)).length && this.splitTile(i, 0, 0, 0), r && (i.length && console.log("features: %d, points: %d", this.tiles[0].numFeatures, this.tiles[0].numPoints), console.timeEnd("generate tiles"), console.log("tiles generated:", this.total, JSON.stringify(this.stats)));\n }\n\n function ye(e, t, r) {\n return 32 * ((1 << e) * r + t) + e;\n }\n\n function xe(e, t) {\n var r = e.tileID.canonical;\n if (!this._geoJSONIndex) return t(null, null);\n\n var i = this._geoJSONIndex.getTile(r.z, r.x, r.y);\n\n if (!i) return t(null, null);\n var o = new g(i.features),\n n = w(o);\n 0 === n.byteOffset && n.byteLength === n.buffer.byteLength || (n = new Uint8Array(n)), t(null, {\n vectorTile: o,\n rawData: n.buffer\n });\n }\n\n J.prototype.load = function (e) {\n var t = this.options,\n r = t.log,\n i = t.minZoom,\n o = t.maxZoom,\n n = t.nodeSize;\n r && console.time("total time");\n var s = "prepare " + e.length + " points";\n r && console.time(s), this.points = e;\n\n for (var a = [], l = 0; l < e.length; l++) {\n e[l].geometry && a.push(A(e[l], l));\n }\n\n this.trees[o + 1] = new F(a, X, W, n, Float32Array), r && console.timeEnd(s);\n\n for (var u = o; u >= i; u--) {\n var h = +Date.now();\n a = this._cluster(a, u), this.trees[u] = new F(a, X, W, n, Float32Array), r && console.log("z%d: %d clusters in %dms", u, a.length, +Date.now() - h);\n }\n\n return r && console.timeEnd("total time"), this;\n }, J.prototype.getClusters = function (e, t) {\n var r = ((e[0] + 180) % 360 + 360) % 360 - 180,\n i = Math.max(-90, Math.min(90, e[1])),\n o = 180 === e[2] ? 180 : ((e[2] + 180) % 360 + 360) % 360 - 180,\n n = Math.max(-90, Math.min(90, e[3]));\n if (e[2] - e[0] >= 360) r = -180, o = 180;else if (r > o) {\n var s = this.getClusters([r, i, 180, n], t),\n a = this.getClusters([-180, i, o, n], t);\n return s.concat(a);\n }\n\n for (var l = this.trees[this._limitZoom(t)], u = [], h = 0, c = l.range(Y(r), j(n), Y(o), j(i)); h < c.length; h += 1) {\n var p = l.points[c[h]];\n u.push(p.numPoints ? B(p) : this.points[p.index]);\n }\n\n return u;\n }, J.prototype.getChildren = function (e) {\n var t = this._getOriginId(e),\n r = this._getOriginZoom(e),\n i = "No cluster with the specified id.",\n o = this.trees[r];\n\n if (!o) throw new Error(i);\n var n = o.points[t];\n if (!n) throw new Error(i);\n\n for (var s = this.options.radius / (this.options.extent * Math.pow(2, r - 1)), a = [], l = 0, u = o.within(n.x, n.y, s); l < u.length; l += 1) {\n var h = o.points[u[l]];\n h.parentId === e && a.push(h.numPoints ? B(h) : this.points[h.index]);\n }\n\n if (0 === a.length) throw new Error(i);\n return a;\n }, J.prototype.getLeaves = function (e, t, r) {\n var i = [];\n return this._appendLeaves(i, e, t = t || 10, r = r || 0, 0), i;\n }, J.prototype.getTile = function (e, t, r) {\n var i = this.trees[this._limitZoom(e)],\n o = Math.pow(2, e),\n n = this.options,\n s = n.radius / n.extent,\n a = (r - s) / o,\n l = (r + 1 + s) / o,\n u = {\n features: []\n };\n\n return this._addTileFeatures(i.range((t - s) / o, a, (t + 1 + s) / o, l), i.points, t, r, o, u), 0 === t && this._addTileFeatures(i.range(1 - s / o, a, 1, l), i.points, o, r, o, u), t === o - 1 && this._addTileFeatures(i.range(0, a, s / o, l), i.points, -1, r, o, u), u.features.length ? u : null;\n }, J.prototype.getClusterExpansionZoom = function (e) {\n for (var t = this._getOriginZoom(e) - 1; t <= this.options.maxZoom;) {\n var r = this.getChildren(e);\n if (t++, 1 !== r.length) break;\n e = r[0].properties.cluster_id;\n }\n\n return t;\n }, J.prototype._appendLeaves = function (e, t, r, i, o) {\n for (var n = 0, s = this.getChildren(t); n < s.length; n += 1) {\n var a = s[n],\n l = a.properties;\n if (l && l.cluster ? o + l.point_count <= i ? o += l.point_count : o = this._appendLeaves(e, l.cluster_id, r, i, o) : o < i ? o++ : e.push(a), e.length === r) break;\n }\n\n return o;\n }, J.prototype._addTileFeatures = function (e, t, r, i, o, n) {\n for (var s = 0, a = e; s < a.length; s += 1) {\n var l = t[a[s]],\n u = l.numPoints,\n h = {\n type: 1,\n geometry: [[Math.round(this.options.extent * (l.x * o - r)), Math.round(this.options.extent * (l.y * o - i))]],\n tags: u ? G(l) : this.points[l.index].properties\n },\n c = void 0;\n u ? c = l.id : this.options.generateId ? c = l.index : this.points[l.index].id && (c = this.points[l.index].id), void 0 !== c && (h.id = c), n.features.push(h);\n }\n }, J.prototype._limitZoom = function (e) {\n return Math.max(this.options.minZoom, Math.min(+e, this.options.maxZoom + 1));\n }, J.prototype._cluster = function (e, t) {\n for (var r = [], i = this.options, o = i.reduce, n = i.minPoints, s = i.radius / (i.extent * Math.pow(2, t)), a = 0; a < e.length; a++) {\n var l = e[a];\n\n if (!(l.zoom <= t)) {\n l.zoom = t;\n\n for (var u = this.trees[t + 1], h = u.within(l.x, l.y, s), c = l.numPoints || 1, p = c, f = 0, d = h; f < d.length; f += 1) {\n var g = u.points[d[f]];\n g.zoom > t && (p += g.numPoints || 1);\n }\n\n if (p >= n) {\n for (var v = l.x * c, m = l.y * c, y = o && c > 1 ? this._map(l, !0) : null, x = (a << 5) + (t + 1) + this.points.length, w = 0, S = h; w < S.length; w += 1) {\n var I = u.points[S[w]];\n\n if (!(I.zoom <= t)) {\n I.zoom = t;\n var M = I.numPoints || 1;\n v += I.x * M, m += I.y * M, I.parentId = x, o && (y || (y = this._map(l, !0)), o(y, this._map(I)));\n }\n }\n\n l.parentId = x, r.push(Z(v / p, m / p, x, p, y));\n } else if (r.push(l), p > 1) for (var b = 0, _ = h; b < _.length; b += 1) {\n var k = u.points[_[b]];\n k.zoom <= t || (k.zoom = t, r.push(k));\n }\n }\n }\n\n return r;\n }, J.prototype._getOriginId = function (e) {\n return e - this.points.length >> 5;\n }, J.prototype._getOriginZoom = function (e) {\n return (e - this.points.length) % 32;\n }, J.prototype._map = function (e, t) {\n if (e.numPoints) return t ? V({}, e.properties) : e.properties;\n var r = this.points[e.index].properties,\n i = this.options.map(r);\n return t && i === r ? V({}, i) : i;\n }, me.prototype.options = {\n maxZoom: 14,\n indexMaxZoom: 5,\n indexMaxPoints: 1e5,\n tolerance: 3,\n extent: 4096,\n buffer: 64,\n lineMetrics: !1,\n promoteId: null,\n generateId: !1,\n debug: 0\n }, me.prototype.splitTile = function (e, t, r, i, o, n, s) {\n for (var a = [e, t, r, i], l = this.options, u = l.debug; a.length;) {\n i = a.pop(), r = a.pop(), t = a.pop(), e = a.pop();\n var h = 1 << t,\n c = ye(t, r, i),\n p = this.tiles[c];\n\n if (!p && (u > 1 && console.time("creation"), p = this.tiles[c] = de(e, t, r, i, l), this.tileCoords.push({\n z: t,\n x: r,\n y: i\n }), u)) {\n u > 1 && (console.log("tile z%d-%d-%d (features: %d, points: %d, simplified: %d)", t, r, i, p.numFeatures, p.numPoints, p.numSimplified), console.timeEnd("creation"));\n var f = "z" + t;\n this.stats[f] = (this.stats[f] || 0) + 1, this.total++;\n }\n\n if (p.source = e, o) {\n if (t === l.maxZoom || t === o) continue;\n var d = 1 << o - t;\n if (r !== Math.floor(n / d) || i !== Math.floor(s / d)) continue;\n } else if (t === l.indexMaxZoom || p.numPoints <= l.indexMaxPoints) continue;\n\n if (p.source = null, 0 !== e.length) {\n u > 1 && console.time("clipping");\n var g,\n v,\n m,\n y,\n x,\n w,\n S = .5 * l.buffer / l.extent,\n I = .5 - S,\n M = .5 + S,\n b = 1 + S;\n g = v = m = y = null, x = re(e, h, r - S, r + M, 0, p.minX, p.maxX, l), w = re(e, h, r + I, r + b, 0, p.minX, p.maxX, l), e = null, x && (g = re(x, h, i - S, i + M, 1, p.minY, p.maxY, l), v = re(x, h, i + I, i + b, 1, p.minY, p.maxY, l), x = null), w && (m = re(w, h, i - S, i + M, 1, p.minY, p.maxY, l), y = re(w, h, i + I, i + b, 1, p.minY, p.maxY, l), w = null), u > 1 && console.timeEnd("clipping"), a.push(g || [], t + 1, 2 * r, 2 * i), a.push(v || [], t + 1, 2 * r, 2 * i + 1), a.push(m || [], t + 1, 2 * r + 1, 2 * i), a.push(y || [], t + 1, 2 * r + 1, 2 * i + 1);\n }\n }\n }, me.prototype.getTile = function (e, t, r) {\n var i = this.options,\n o = i.extent,\n n = i.debug;\n if (e < 0 || e > 24) return null;\n var s = 1 << e,\n a = ye(e, t = (t % s + s) % s, r);\n if (this.tiles[a]) return pe(this.tiles[a], o);\n n > 1 && console.log("drilling down to z%d-%d-%d", e, t, r);\n\n for (var l, u = e, h = t, c = r; !l && u > 0;) {\n u--, h = Math.floor(h / 2), c = Math.floor(c / 2), l = this.tiles[ye(u, h, c)];\n }\n\n return l && l.source ? (n > 1 && console.log("found parent tile z%d-%d-%d", u, h, c), n > 1 && console.time("drilling down"), this.splitTile(l.source, u, h, c, e, t, r), n > 1 && console.timeEnd("drilling down"), this.tiles[a] ? pe(this.tiles[a], o) : null) : null;\n };\n\n var we = function (t) {\n function r(e, r, i, o) {\n t.call(this, e, r, i, xe), o && (this.loadGeoJSON = o);\n }\n\n return t && (r.__proto__ = t), (r.prototype = Object.create(t && t.prototype)).constructor = r, r.prototype.loadData = function (e, t) {\n this._pendingCallback && this._pendingCallback(null, {\n abandoned: !0\n }), this._pendingCallback = t, this._pendingLoadDataParams = e, this._state && "Idle" !== this._state ? this._state = "NeedsLoadData" : (this._state = "Coalescing", this._loadData());\n }, r.prototype._loadData = function () {\n var t = this;\n\n if (this._pendingCallback && this._pendingLoadDataParams) {\n var r = this._pendingCallback,\n i = this._pendingLoadDataParams;\n delete this._pendingCallback, delete this._pendingLoadDataParams;\n var o = !!(i && i.request && i.request.collectResourceTiming) && new e.RequestPerformance(i.request);\n this.loadGeoJSON(i, function (n, s) {\n if (n || !s) return r(n);\n if ("object" != typeof s) return r(new Error("Input data given to \'" + i.source + "\' is not a valid GeoJSON object."));\n !function e(t, r) {\n var i,\n o = t && t.type;\n if ("FeatureCollection" === o) for (i = 0; i < t.features.length; i++) {\n e(t.features[i], r);\n } else if ("GeometryCollection" === o) for (i = 0; i < t.geometries.length; i++) {\n e(t.geometries[i], r);\n } else if ("Feature" === o) e(t.geometry, r);else if ("Polygon" === o) c(t.coordinates, r);else if ("MultiPolygon" === o) for (i = 0; i < t.coordinates.length; i++) {\n c(t.coordinates[i], r);\n }\n return t;\n }(s, !0);\n\n try {\n if (i.filter) {\n var a = e.createExpression(i.filter, {\n type: "boolean",\n "property-type": "data-driven",\n overridable: !1,\n transition: !1\n });\n if ("error" === a.result) throw new Error(a.value.map(function (e) {\n return e.key + ": " + e.message;\n }).join(", "));\n var l = s.features.filter(function (e) {\n return a.value.evaluate({\n zoom: 0\n }, e);\n });\n s = {\n type: "FeatureCollection",\n features: l\n };\n }\n\n t._geoJSONIndex = i.cluster ? new J(function (t) {\n var r = t.superclusterOptions,\n i = t.clusterProperties;\n if (!i || !r) return r;\n\n for (var o = {}, n = {}, s = {\n accumulated: null,\n zoom: 0\n }, a = {\n properties: null\n }, l = Object.keys(i), u = 0, h = l; u < h.length; u += 1) {\n var c = h[u],\n p = i[c],\n f = p[0],\n d = e.createExpression(p[1]),\n g = e.createExpression("string" == typeof f ? [f, ["accumulated"], ["get", c]] : f);\n o[c] = d.value, n[c] = g.value;\n }\n\n return r.map = function (e) {\n a.properties = e;\n\n for (var t = {}, r = 0, i = l; r < i.length; r += 1) {\n var n = i[r];\n t[n] = o[n].evaluate(s, a);\n }\n\n return t;\n }, r.reduce = function (e, t) {\n a.properties = t;\n\n for (var r = 0, i = l; r < i.length; r += 1) {\n var o = i[r];\n s.accumulated = e[o], e[o] = n[o].evaluate(s, a);\n }\n }, r;\n }(i)).load(s.features) : function (e, t) {\n return new me(e, t);\n }(s, i.geojsonVtOptions);\n } catch (n) {\n return r(n);\n }\n\n t.loaded = {};\n var u = {};\n\n if (o) {\n var h = o.finish();\n h && (u.resourceTiming = {}, u.resourceTiming[i.source] = JSON.parse(JSON.stringify(h)));\n }\n\n r(null, u);\n });\n }\n }, r.prototype.coalesce = function () {\n "Coalescing" === this._state ? this._state = "Idle" : "NeedsLoadData" === this._state && (this._state = "Coalescing", this._loadData());\n }, r.prototype.reloadTile = function (e, r) {\n var i = this.loaded;\n return i && i[e.uid] ? t.prototype.reloadTile.call(this, e, r) : this.loadTile(e, r);\n }, r.prototype.loadGeoJSON = function (t, r) {\n if (t.request) e.getJSON(t.request, r);else {\n if ("string" != typeof t.data) return r(new Error("Input data given to \'" + t.source + "\' is not a valid GeoJSON object."));\n\n try {\n return r(null, JSON.parse(t.data));\n } catch (e) {\n return r(new Error("Input data given to \'" + t.source + "\' is not a valid GeoJSON object."));\n }\n }\n }, r.prototype.removeSource = function (e, t) {\n this._pendingCallback && this._pendingCallback(null, {\n abandoned: !0\n }), t();\n }, r.prototype.getClusterExpansionZoom = function (e, t) {\n try {\n t(null, this._geoJSONIndex.getClusterExpansionZoom(e.clusterId));\n } catch (e) {\n t(e);\n }\n }, r.prototype.getClusterChildren = function (e, t) {\n try {\n t(null, this._geoJSONIndex.getChildren(e.clusterId));\n } catch (e) {\n t(e);\n }\n }, r.prototype.getClusterLeaves = function (e, t) {\n try {\n t(null, this._geoJSONIndex.getLeaves(e.clusterId, e.limit, e.offset));\n } catch (e) {\n t(e);\n }\n }, r;\n }(l),\n Se = function Se(t) {\n var r = this;\n this.self = t, this.actor = new e.Actor(t, this), this.layerIndexes = {}, this.availableImages = {}, this.workerSourceTypes = {\n vector: l,\n geojson: we\n }, this.workerSources = {}, this.demWorkerSources = {}, this.self.registerWorkerSource = function (e, t) {\n if (r.workerSourceTypes[e]) throw new Error(\'Worker source with name "\' + e + \'" already registered.\');\n r.workerSourceTypes[e] = t;\n }, this.self.registerRTLTextPlugin = function (t) {\n if (e.plugin.isParsed()) throw new Error("RTL text plugin already registered.");\n e.plugin.applyArabicShaping = t.applyArabicShaping, e.plugin.processBidirectionalText = t.processBidirectionalText, e.plugin.processStyledBidirectionalText = t.processStyledBidirectionalText;\n };\n };\n\n return Se.prototype.setReferrer = function (e, t) {\n this.referrer = t;\n }, Se.prototype.setImages = function (e, t, r) {\n for (var i in this.availableImages[e] = t, this.workerSources[e]) {\n var o = this.workerSources[e][i];\n\n for (var n in o) {\n o[n].availableImages = t;\n }\n }\n\n r();\n }, Se.prototype.setLayers = function (e, t, r) {\n this.getLayerIndex(e).replace(t), r();\n }, Se.prototype.updateLayers = function (e, t, r) {\n this.getLayerIndex(e).update(t.layers, t.removedIds), r();\n }, Se.prototype.loadTile = function (e, t, r) {\n this.getWorkerSource(e, t.type, t.source).loadTile(t, r);\n }, Se.prototype.loadDEMTile = function (e, t, r) {\n this.getDEMWorkerSource(e, t.source).loadTile(t, r);\n }, Se.prototype.reloadTile = function (e, t, r) {\n this.getWorkerSource(e, t.type, t.source).reloadTile(t, r);\n }, Se.prototype.abortTile = function (e, t, r) {\n this.getWorkerSource(e, t.type, t.source).abortTile(t, r);\n }, Se.prototype.removeTile = function (e, t, r) {\n this.getWorkerSource(e, t.type, t.source).removeTile(t, r);\n }, Se.prototype.removeDEMTile = function (e, t) {\n this.getDEMWorkerSource(e, t.source).removeTile(t);\n }, Se.prototype.removeSource = function (e, t, r) {\n if (this.workerSources[e] && this.workerSources[e][t.type] && this.workerSources[e][t.type][t.source]) {\n var i = this.workerSources[e][t.type][t.source];\n delete this.workerSources[e][t.type][t.source], void 0 !== i.removeSource ? i.removeSource(t, r) : r();\n }\n }, Se.prototype.loadWorkerSource = function (e, t, r) {\n try {\n this.self.importScripts(t.url), r();\n } catch (e) {\n r(e.toString());\n }\n }, Se.prototype.syncRTLPluginState = function (t, r, i) {\n try {\n e.plugin.setState(r);\n var o = e.plugin.getPluginURL();\n\n if (e.plugin.isLoaded() && !e.plugin.isParsed() && null != o) {\n this.self.importScripts(o);\n var n = e.plugin.isParsed();\n i(n ? void 0 : new Error("RTL Text Plugin failed to import scripts from " + o), n);\n }\n } catch (e) {\n i(e.toString());\n }\n }, Se.prototype.getAvailableImages = function (e) {\n var t = this.availableImages[e];\n return t || (t = []), t;\n }, Se.prototype.getLayerIndex = function (e) {\n var t = this.layerIndexes[e];\n return t || (t = this.layerIndexes[e] = new i()), t;\n }, Se.prototype.getWorkerSource = function (e, t, r) {\n var i = this;\n return this.workerSources[e] || (this.workerSources[e] = {}), this.workerSources[e][t] || (this.workerSources[e][t] = {}), this.workerSources[e][t][r] || (this.workerSources[e][t][r] = new this.workerSourceTypes[t]({\n send: function send(t, r, o) {\n i.actor.send(t, r, o, e);\n }\n }, this.getLayerIndex(e), this.getAvailableImages(e))), this.workerSources[e][t][r];\n }, Se.prototype.getDEMWorkerSource = function (e, t) {\n return this.demWorkerSources[e] || (this.demWorkerSources[e] = {}), this.demWorkerSources[e][t] || (this.demWorkerSources[e][t] = new h()), this.demWorkerSources[e][t];\n }, Se.prototype.enforceCacheSizeLimit = function (t, r) {\n e.enforceCacheSizeLimit(r);\n }, "undefined" != typeof WorkerGlobalScope && "undefined" != typeof self && self instanceof WorkerGlobalScope && (self.worker = new Se(self)), Se;\n });\n define(["./shared"], function (t) {\n "use strict";\n\n var e = t.createCommonjsModule(function (t) {\n function e(t) {\n return !i(t);\n }\n\n function i(t) {\n return "undefined" == typeof window || "undefined" == typeof document ? "not a browser" : Array.prototype && Array.prototype.every && Array.prototype.filter && Array.prototype.forEach && Array.prototype.indexOf && Array.prototype.lastIndexOf && Array.prototype.map && Array.prototype.some && Array.prototype.reduce && Array.prototype.reduceRight && Array.isArray ? Function.prototype && Function.prototype.bind ? Object.keys && Object.create && Object.getPrototypeOf && Object.getOwnPropertyNames && Object.isSealed && Object.isFrozen && Object.isExtensible && Object.getOwnPropertyDescriptor && Object.defineProperty && Object.defineProperties && Object.seal && Object.freeze && Object.preventExtensions ? "JSON" in window && "parse" in JSON && "stringify" in JSON ? function () {\n if (!("Worker" in window && "Blob" in window && "URL" in window)) return !1;\n var t,\n e,\n i = new Blob([""], {\n type: "text/javascript"\n }),\n o = URL.createObjectURL(i);\n\n try {\n e = new Worker(o), t = !0;\n } catch (e) {\n t = !1;\n }\n\n return e && e.terminate(), URL.revokeObjectURL(o), t;\n }() ? "Uint8ClampedArray" in window ? ArrayBuffer.isView ? function () {\n var t = document.createElement("canvas");\n t.width = t.height = 1;\n var e = t.getContext("2d");\n if (!e) return !1;\n var i = e.getImageData(0, 0, 1, 1);\n return i && i.width === t.width;\n }() ? (void 0 === o[i = t && t.failIfMajorPerformanceCaveat] && (o[i] = function (t) {\n var i = function (t) {\n var i = document.createElement("canvas"),\n o = Object.create(e.webGLContextAttributes);\n return o.failIfMajorPerformanceCaveat = t, i.probablySupportsContext ? i.probablySupportsContext("webgl", o) || i.probablySupportsContext("experimental-webgl", o) : i.supportsContext ? i.supportsContext("webgl", o) || i.supportsContext("experimental-webgl", o) : i.getContext("webgl", o) || i.getContext("experimental-webgl", o);\n }(t);\n\n if (!i) return !1;\n var o = i.createShader(i.VERTEX_SHADER);\n return !(!o || i.isContextLost()) && (i.shaderSource(o, "void main() {}"), i.compileShader(o), !0 === i.getShaderParameter(o, i.COMPILE_STATUS));\n }(i)), o[i] ? void 0 : "insufficient WebGL support") : "insufficient Canvas/getImageData support" : "insufficient ArrayBuffer support" : "insufficient Uint8ClampedArray support" : "insufficient worker support" : "insufficient JSON support" : "insufficient Object support" : "insufficient Function support" : "insufficent Array support";\n var i;\n }\n\n t.exports ? t.exports = e : window && (window.mapboxgl = window.mapboxgl || {}, window.mapboxgl.supported = e, window.mapboxgl.notSupportedReason = i);\n var o = {};\n e.webGLContextAttributes = {\n antialias: !1,\n alpha: !0,\n stencil: !0,\n depth: !0\n };\n }),\n i = {\n create: function create(e, i, o) {\n var r = t.window.document.createElement(e);\n return void 0 !== i && (r.className = i), o && o.appendChild(r), r;\n },\n createNS: function createNS(e, i) {\n return t.window.document.createElementNS(e, i);\n }\n },\n o = t.window.document && t.window.document.documentElement.style;\n\n function r(t) {\n if (!o) return t[0];\n\n for (var e = 0; e < t.length; e++) {\n if (t[e] in o) return t[e];\n }\n\n return t[0];\n }\n\n var a,\n n = r(["userSelect", "MozUserSelect", "WebkitUserSelect", "msUserSelect"]);\n i.disableDrag = function () {\n o && n && (a = o[n], o[n] = "none");\n }, i.enableDrag = function () {\n o && n && (o[n] = a);\n };\n var s = r(["transform", "WebkitTransform"]);\n\n i.setTransform = function (t, e) {\n t.style[s] = e;\n };\n\n var l = !1;\n\n try {\n var c = Object.defineProperty({}, "passive", {\n get: function get() {\n l = !0;\n }\n });\n t.window.addEventListener("test", c, c), t.window.removeEventListener("test", c, c);\n } catch (t) {\n l = !1;\n }\n\n i.addEventListener = function (t, e, i, o) {\n void 0 === o && (o = {}), t.addEventListener(e, i, "passive" in o && l ? o : o.capture);\n }, i.removeEventListener = function (t, e, i, o) {\n void 0 === o && (o = {}), t.removeEventListener(e, i, "passive" in o && l ? o : o.capture);\n };\n\n var u = function u(e) {\n e.preventDefault(), e.stopPropagation(), t.window.removeEventListener("click", u, !0);\n };\n\n function h(t) {\n var e = t.userImage;\n return !!(e && e.render && e.render()) && (t.data.replace(new Uint8Array(e.data.buffer)), !0);\n }\n\n i.suppressClick = function () {\n t.window.addEventListener("click", u, !0), t.window.setTimeout(function () {\n t.window.removeEventListener("click", u, !0);\n }, 0);\n }, i.mousePos = function (e, i) {\n var o = e.getBoundingClientRect();\n return new t.Point(i.clientX - o.left - e.clientLeft, i.clientY - o.top - e.clientTop);\n }, i.touchPos = function (e, i) {\n for (var o = e.getBoundingClientRect(), r = [], a = 0; a < i.length; a++) {\n r.push(new t.Point(i[a].clientX - o.left - e.clientLeft, i[a].clientY - o.top - e.clientTop));\n }\n\n return r;\n }, i.mouseButton = function (e) {\n return void 0 !== t.window.InstallTrigger && 2 === e.button && e.ctrlKey && t.window.navigator.platform.toUpperCase().indexOf("MAC") >= 0 ? 0 : e.button;\n }, i.remove = function (t) {\n t.parentNode && t.parentNode.removeChild(t);\n };\n\n var p = function (e) {\n function i() {\n e.call(this), this.images = {}, this.updatedImages = {}, this.callbackDispatchedThisFrame = {}, this.loaded = !1, this.requestors = [], this.patterns = {}, this.atlasImage = new t.RGBAImage({\n width: 1,\n height: 1\n }), this.dirty = !0;\n }\n\n return e && (i.__proto__ = e), (i.prototype = Object.create(e && e.prototype)).constructor = i, i.prototype.isLoaded = function () {\n return this.loaded;\n }, i.prototype.setLoaded = function (t) {\n if (this.loaded !== t && (this.loaded = t, t)) {\n for (var e = 0, i = this.requestors; e < i.length; e += 1) {\n var o = i[e];\n\n this._notify(o.ids, o.callback);\n }\n\n this.requestors = [];\n }\n }, i.prototype.getImage = function (t) {\n return this.images[t];\n }, i.prototype.addImage = function (t, e) {\n this._validate(t, e) && (this.images[t] = e);\n }, i.prototype._validate = function (e, i) {\n var o = !0;\n return this._validateStretch(i.stretchX, i.data && i.data.width) || (this.fire(new t.ErrorEvent(new Error(\'Image "\' + e + \'" has invalid "stretchX" value\'))), o = !1), this._validateStretch(i.stretchY, i.data && i.data.height) || (this.fire(new t.ErrorEvent(new Error(\'Image "\' + e + \'" has invalid "stretchY" value\'))), o = !1), this._validateContent(i.content, i) || (this.fire(new t.ErrorEvent(new Error(\'Image "\' + e + \'" has invalid "content" value\'))), o = !1), o;\n }, i.prototype._validateStretch = function (t, e) {\n if (!t) return !0;\n\n for (var i = 0, o = 0, r = t; o < r.length; o += 1) {\n var a = r[o];\n if (a[0] < i || a[1] < a[0] || e < a[1]) return !1;\n i = a[1];\n }\n\n return !0;\n }, i.prototype._validateContent = function (t, e) {\n return !(t && (4 !== t.length || t[0] < 0 || e.data.width < t[0] || t[1] < 0 || e.data.height < t[1] || t[2] < 0 || e.data.width < t[2] || t[3] < 0 || e.data.height < t[3] || t[2] < t[0] || t[3] < t[1]));\n }, i.prototype.updateImage = function (t, e) {\n e.version = this.images[t].version + 1, this.images[t] = e, this.updatedImages[t] = !0;\n }, i.prototype.removeImage = function (t) {\n var e = this.images[t];\n delete this.images[t], delete this.patterns[t], e.userImage && e.userImage.onRemove && e.userImage.onRemove();\n }, i.prototype.listImages = function () {\n return Object.keys(this.images);\n }, i.prototype.getImages = function (t, e) {\n var i = !0;\n if (!this.isLoaded()) for (var o = 0, r = t; o < r.length; o += 1) {\n this.images[r[o]] || (i = !1);\n }\n this.isLoaded() || i ? this._notify(t, e) : this.requestors.push({\n ids: t,\n callback: e\n });\n }, i.prototype._notify = function (e, i) {\n for (var o = {}, r = 0, a = e; r < a.length; r += 1) {\n var n = a[r];\n this.images[n] || this.fire(new t.Event("styleimagemissing", {\n id: n\n }));\n var s = this.images[n];\n s ? o[n] = {\n data: s.data.clone(),\n pixelRatio: s.pixelRatio,\n sdf: s.sdf,\n version: s.version,\n stretchX: s.stretchX,\n stretchY: s.stretchY,\n content: s.content,\n hasRenderCallback: Boolean(s.userImage && s.userImage.render)\n } : t.warnOnce(\'Image "\' + n + \'" could not be loaded. Please make sure you have added the image with map.addImage() or a "sprite" property in your style. You can provide missing images by listening for the "styleimagemissing" map event.\');\n }\n\n i(null, o);\n }, i.prototype.getPixelSize = function () {\n var t = this.atlasImage;\n return {\n width: t.width,\n height: t.height\n };\n }, i.prototype.getPattern = function (e) {\n var i = this.patterns[e],\n o = this.getImage(e);\n if (!o) return null;\n if (i && i.position.version === o.version) return i.position;\n if (i) i.position.version = o.version;else {\n var r = {\n w: o.data.width + 2,\n h: o.data.height + 2,\n x: 0,\n y: 0\n },\n a = new t.ImagePosition(r, o);\n this.patterns[e] = {\n bin: r,\n position: a\n };\n }\n return this._updatePatternAtlas(), this.patterns[e].position;\n }, i.prototype.bind = function (e) {\n var i = e.gl;\n this.atlasTexture ? this.dirty && (this.atlasTexture.update(this.atlasImage), this.dirty = !1) : this.atlasTexture = new t.Texture(e, this.atlasImage, i.RGBA), this.atlasTexture.bind(i.LINEAR, i.CLAMP_TO_EDGE);\n }, i.prototype._updatePatternAtlas = function () {\n var e = [];\n\n for (var i in this.patterns) {\n e.push(this.patterns[i].bin);\n }\n\n var o = t.potpack(e),\n r = o.w,\n a = o.h,\n n = this.atlasImage;\n\n for (var s in n.resize({\n width: r || 1,\n height: a || 1\n }), this.patterns) {\n var l = this.patterns[s].bin,\n c = l.x + 1,\n u = l.y + 1,\n h = this.images[s].data,\n p = h.width,\n d = h.height;\n t.RGBAImage.copy(h, n, {\n x: 0,\n y: 0\n }, {\n x: c,\n y: u\n }, {\n width: p,\n height: d\n }), t.RGBAImage.copy(h, n, {\n x: 0,\n y: d - 1\n }, {\n x: c,\n y: u - 1\n }, {\n width: p,\n height: 1\n }), t.RGBAImage.copy(h, n, {\n x: 0,\n y: 0\n }, {\n x: c,\n y: u + d\n }, {\n width: p,\n height: 1\n }), t.RGBAImage.copy(h, n, {\n x: p - 1,\n y: 0\n }, {\n x: c - 1,\n y: u\n }, {\n width: 1,\n height: d\n }), t.RGBAImage.copy(h, n, {\n x: 0,\n y: 0\n }, {\n x: c + p,\n y: u\n }, {\n width: 1,\n height: d\n });\n }\n\n this.dirty = !0;\n }, i.prototype.beginFrame = function () {\n this.callbackDispatchedThisFrame = {};\n }, i.prototype.dispatchRenderCallbacks = function (t) {\n for (var e = 0, i = t; e < i.length; e += 1) {\n var o = i[e];\n\n if (!this.callbackDispatchedThisFrame[o]) {\n this.callbackDispatchedThisFrame[o] = !0;\n var r = this.images[o];\n h(r) && this.updateImage(o, r);\n }\n }\n }, i;\n }(t.Evented),\n d = m,\n _ = m,\n f = 1e20;\n\n function m(t, e, i, o, r, a) {\n this.fontSize = t || 24, this.buffer = void 0 === e ? 3 : e, this.cutoff = o || .25, this.fontFamily = r || "sans-serif", this.fontWeight = a || "normal", this.radius = i || 8;\n var n = this.size = this.fontSize + 2 * this.buffer;\n this.canvas = document.createElement("canvas"), this.canvas.width = this.canvas.height = n, this.ctx = this.canvas.getContext("2d"), this.ctx.font = this.fontWeight + " " + this.fontSize + "px " + this.fontFamily, this.ctx.textBaseline = "middle", this.ctx.fillStyle = "black", this.gridOuter = new Float64Array(n * n), this.gridInner = new Float64Array(n * n), this.f = new Float64Array(n), this.d = new Float64Array(n), this.z = new Float64Array(n + 1), this.v = new Int16Array(n), this.middle = Math.round(n / 2 * (navigator.userAgent.indexOf("Gecko/") >= 0 ? 1.2 : 1));\n }\n\n function g(t, e, i, o, r, a, n) {\n for (var s = 0; s < e; s++) {\n for (var l = 0; l < i; l++) {\n o[l] = t[l * e + s];\n }\n\n for (v(o, r, a, n, i), l = 0; l < i; l++) {\n t[l * e + s] = r[l];\n }\n }\n\n for (l = 0; l < i; l++) {\n for (s = 0; s < e; s++) {\n o[s] = t[l * e + s];\n }\n\n for (v(o, r, a, n, e), s = 0; s < e; s++) {\n t[l * e + s] = Math.sqrt(r[s]);\n }\n }\n }\n\n function v(t, e, i, o, r) {\n i[0] = 0, o[0] = -f, o[1] = +f;\n\n for (var a = 1, n = 0; a < r; a++) {\n for (var s = (t[a] + a * a - (t[i[n]] + i[n] * i[n])) / (2 * a - 2 * i[n]); s <= o[n];) {\n n--, s = (t[a] + a * a - (t[i[n]] + i[n] * i[n])) / (2 * a - 2 * i[n]);\n }\n\n i[++n] = a, o[n] = s, o[n + 1] = +f;\n }\n\n for (a = 0, n = 0; a < r; a++) {\n for (; o[n + 1] < a;) {\n n++;\n }\n\n e[a] = (a - i[n]) * (a - i[n]) + t[i[n]];\n }\n }\n\n m.prototype.draw = function (t) {\n this.ctx.clearRect(0, 0, this.size, this.size), this.ctx.fillText(t, this.buffer, this.middle);\n\n for (var e = this.ctx.getImageData(0, 0, this.size, this.size), i = new Uint8ClampedArray(this.size * this.size), o = 0; o < this.size * this.size; o++) {\n var r = e.data[4 * o + 3] / 255;\n this.gridOuter[o] = 1 === r ? 0 : 0 === r ? f : Math.pow(Math.max(0, .5 - r), 2), this.gridInner[o] = 1 === r ? f : 0 === r ? 0 : Math.pow(Math.max(0, r - .5), 2);\n }\n\n for (g(this.gridOuter, this.size, this.size, this.f, this.d, this.v, this.z), g(this.gridInner, this.size, this.size, this.f, this.d, this.v, this.z), o = 0; o < this.size * this.size; o++) {\n i[o] = Math.max(0, Math.min(255, Math.round(255 - 255 * ((this.gridOuter[o] - this.gridInner[o]) / this.radius + this.cutoff))));\n }\n\n return i;\n }, d.default = _;\n\n var y = function y(t, e) {\n this.requestManager = t, this.localIdeographFontFamily = e, this.entries = {};\n };\n\n y.prototype.setURL = function (t) {\n this.url = t;\n }, y.prototype.getGlyphs = function (e, i) {\n var o = this,\n r = [];\n\n for (var a in e) {\n for (var n = 0, s = e[a]; n < s.length; n += 1) {\n r.push({\n stack: a,\n id: s[n]\n });\n }\n }\n\n t.asyncAll(r, function (t, e) {\n var i = t.stack,\n r = t.id,\n a = o.entries[i];\n a || (a = o.entries[i] = {\n glyphs: {},\n requests: {},\n ranges: {}\n });\n var n = a.glyphs[r];\n\n if (void 0 === n) {\n if (n = o._tinySDF(a, i, r)) return a.glyphs[r] = n, void e(null, {\n stack: i,\n id: r,\n glyph: n\n });\n var s = Math.floor(r / 256);\n if (256 * s > 65535) e(new Error("glyphs > 65535 not supported"));else if (a.ranges[s]) e(null, {\n stack: i,\n id: r,\n glyph: n\n });else {\n var l = a.requests[s];\n l || (l = a.requests[s] = [], y.loadGlyphRange(i, s, o.url, o.requestManager, function (t, e) {\n if (e) {\n for (var i in e) {\n o._doesCharSupportLocalGlyph(+i) || (a.glyphs[+i] = e[+i]);\n }\n\n a.ranges[s] = !0;\n }\n\n for (var r = 0, n = l; r < n.length; r += 1) {\n (0, n[r])(t, e);\n }\n\n delete a.requests[s];\n })), l.push(function (t, o) {\n t ? e(t) : o && e(null, {\n stack: i,\n id: r,\n glyph: o[r] || null\n });\n });\n }\n } else e(null, {\n stack: i,\n id: r,\n glyph: n\n });\n }, function (t, e) {\n if (t) i(t);else if (e) {\n for (var o = {}, r = 0, a = e; r < a.length; r += 1) {\n var n = a[r],\n s = n.stack,\n l = n.id,\n c = n.glyph;\n (o[s] || (o[s] = {}))[l] = c && {\n id: c.id,\n bitmap: c.bitmap.clone(),\n metrics: c.metrics\n };\n }\n\n i(null, o);\n }\n });\n }, y.prototype._doesCharSupportLocalGlyph = function (e) {\n return !!this.localIdeographFontFamily && (t.isChar["CJK Unified Ideographs"](e) || t.isChar["Hangul Syllables"](e) || t.isChar.Hiragana(e) || t.isChar.Katakana(e));\n }, y.prototype._tinySDF = function (e, i, o) {\n var r = this.localIdeographFontFamily;\n\n if (r && this._doesCharSupportLocalGlyph(o)) {\n var a = e.tinySDF;\n\n if (!a) {\n var n = "400";\n /bold/i.test(i) ? n = "900" : /medium/i.test(i) ? n = "500" : /light/i.test(i) && (n = "200"), a = e.tinySDF = new y.TinySDF(24, 3, 8, .25, r, n);\n }\n\n return {\n id: o,\n bitmap: new t.AlphaImage({\n width: 30,\n height: 30\n }, a.draw(String.fromCharCode(o))),\n metrics: {\n width: 24,\n height: 24,\n left: 0,\n top: -8,\n advance: 24\n }\n };\n }\n }, y.loadGlyphRange = function (e, i, o, r, a) {\n var n = 256 * i,\n s = n + 255,\n l = r.transformRequest(r.normalizeGlyphsURL(o).replace("{fontstack}", e).replace("{range}", n + "-" + s), t.ResourceType.Glyphs);\n t.getArrayBuffer(l, function (e, i) {\n if (e) a(e);else if (i) {\n for (var o = {}, r = 0, n = t.parseGlyphPBF(i); r < n.length; r += 1) {\n var s = n[r];\n o[s.id] = s;\n }\n\n a(null, o);\n }\n });\n }, y.TinySDF = d;\n\n var x = function x() {\n this.specification = t.styleSpec.light.position;\n };\n\n x.prototype.possiblyEvaluate = function (e, i) {\n return t.sphericalToCartesian(e.expression.evaluate(i));\n }, x.prototype.interpolate = function (e, i, o) {\n return {\n x: t.number(e.x, i.x, o),\n y: t.number(e.y, i.y, o),\n z: t.number(e.z, i.z, o)\n };\n };\n\n var b = new t.Properties({\n anchor: new t.DataConstantProperty(t.styleSpec.light.anchor),\n position: new x(),\n color: new t.DataConstantProperty(t.styleSpec.light.color),\n intensity: new t.DataConstantProperty(t.styleSpec.light.intensity)\n }),\n w = function (e) {\n function i(i) {\n e.call(this), this._transitionable = new t.Transitionable(b), this.setLight(i), this._transitioning = this._transitionable.untransitioned();\n }\n\n return e && (i.__proto__ = e), (i.prototype = Object.create(e && e.prototype)).constructor = i, i.prototype.getLight = function () {\n return this._transitionable.serialize();\n }, i.prototype.setLight = function (e, i) {\n if (void 0 === i && (i = {}), !this._validate(t.validateLight, e, i)) for (var o in e) {\n var r = e[o];\n t.endsWith(o, "-transition") ? this._transitionable.setTransition(o.slice(0, -"-transition".length), r) : this._transitionable.setValue(o, r);\n }\n }, i.prototype.updateTransitions = function (t) {\n this._transitioning = this._transitionable.transitioned(t, this._transitioning);\n }, i.prototype.hasTransition = function () {\n return this._transitioning.hasTransition();\n }, i.prototype.recalculate = function (t) {\n this.properties = this._transitioning.possiblyEvaluate(t);\n }, i.prototype._validate = function (e, i, o) {\n return (!o || !1 !== o.validate) && t.emitValidationErrors(this, e.call(t.validateStyle, t.extend({\n value: i,\n style: {\n glyphs: !0,\n sprite: !0\n },\n styleSpec: t.styleSpec\n })));\n }, i;\n }(t.Evented),\n T = function T(t, e) {\n this.width = t, this.height = e, this.nextRow = 0, this.data = new Uint8Array(this.width * this.height), this.dashEntry = {};\n };\n\n T.prototype.getDash = function (t, e) {\n var i = t.join(",") + String(e);\n return this.dashEntry[i] || (this.dashEntry[i] = this.addDash(t, e)), this.dashEntry[i];\n }, T.prototype.getDashRanges = function (t, e, i) {\n var o = [],\n r = t.length % 2 == 1 ? -t[t.length - 1] * i : 0,\n a = t[0] * i,\n n = !0;\n o.push({\n left: r,\n right: a,\n isDash: n,\n zeroLength: 0 === t[0]\n });\n\n for (var s = t[0], l = 1; l < t.length; l++) {\n var c = t[l];\n o.push({\n left: r = s * i,\n right: a = (s += c) * i,\n isDash: n = !n,\n zeroLength: 0 === c\n });\n }\n\n return o;\n }, T.prototype.addRoundDash = function (t, e, i) {\n for (var o = e / 2, r = -i; r <= i; r++) {\n for (var a = this.width * (this.nextRow + i + r), n = 0, s = t[n], l = 0; l < this.width; l++) {\n l / s.right > 1 && (s = t[++n]);\n var c = Math.abs(l - s.left),\n u = Math.abs(l - s.right),\n h = Math.min(c, u),\n p = void 0,\n d = r / i * (o + 1);\n\n if (s.isDash) {\n var _ = o - Math.abs(d);\n\n p = Math.sqrt(h * h + _ * _);\n } else p = o - Math.sqrt(h * h + d * d);\n\n this.data[a + l] = Math.max(0, Math.min(255, p + 128));\n }\n }\n }, T.prototype.addRegularDash = function (t) {\n for (var e = t.length - 1; e >= 0; --e) {\n var i = t[e],\n o = t[e + 1];\n i.zeroLength ? t.splice(e, 1) : o && o.isDash === i.isDash && (o.left = i.left, t.splice(e, 1));\n }\n\n var r = t[0],\n a = t[t.length - 1];\n r.isDash === a.isDash && (r.left = a.left - this.width, a.right = r.right + this.width);\n\n for (var n = this.width * this.nextRow, s = 0, l = t[s], c = 0; c < this.width; c++) {\n c / l.right > 1 && (l = t[++s]);\n var u = Math.abs(c - l.left),\n h = Math.abs(c - l.right),\n p = Math.min(u, h);\n this.data[n + c] = Math.max(0, Math.min(255, (l.isDash ? p : -p) + 128));\n }\n }, T.prototype.addDash = function (e, i) {\n var o = i ? 7 : 0,\n r = 2 * o + 1;\n if (this.nextRow + r > this.height) return t.warnOnce("LineAtlas out of space"), null;\n\n for (var a = 0, n = 0; n < e.length; n++) {\n a += e[n];\n }\n\n if (0 !== a) {\n var s = this.width / a,\n l = this.getDashRanges(e, this.width, s);\n i ? this.addRoundDash(l, s, o) : this.addRegularDash(l);\n }\n\n var c = {\n y: (this.nextRow + o + .5) / this.height,\n height: 2 * o / this.height,\n width: a\n };\n return this.nextRow += r, this.dirty = !0, c;\n }, T.prototype.bind = function (t) {\n var e = t.gl;\n this.texture ? (e.bindTexture(e.TEXTURE_2D, this.texture), this.dirty && (this.dirty = !1, e.texSubImage2D(e.TEXTURE_2D, 0, 0, 0, this.width, this.height, e.ALPHA, e.UNSIGNED_BYTE, this.data))) : (this.texture = e.createTexture(), e.bindTexture(e.TEXTURE_2D, this.texture), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_WRAP_S, e.REPEAT), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_WRAP_T, e.REPEAT), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_MIN_FILTER, e.LINEAR), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_MAG_FILTER, e.LINEAR), e.texImage2D(e.TEXTURE_2D, 0, e.ALPHA, this.width, this.height, 0, e.ALPHA, e.UNSIGNED_BYTE, this.data));\n };\n\n var E = function e(i, o) {\n this.workerPool = i, this.actors = [], this.currentActor = 0, this.id = t.uniqueId();\n\n for (var r = this.workerPool.acquire(this.id), a = 0; a < r.length; a++) {\n var n = new e.Actor(r[a], o, this.id);\n n.name = "Worker " + a, this.actors.push(n);\n }\n };\n\n function I(e, i, o) {\n var r = function r(_r2, a) {\n if (_r2) return o(_r2);\n\n if (a) {\n var n = t.pick(t.extend(a, e), ["tiles", "minzoom", "maxzoom", "attribution", "mapbox_logo", "bounds", "scheme", "tileSize", "encoding"]);\n a.vector_layers && (n.vectorLayers = a.vector_layers, n.vectorLayerIds = n.vectorLayers.map(function (t) {\n return t.id;\n })), n.tiles = i.canonicalizeTileset(n, e.url), o(null, n);\n }\n };\n\n return e.url ? t.getJSON(i.transformRequest(i.normalizeSourceURL(e.url), t.ResourceType.Source), r) : t.browser.frame(function () {\n return r(null, e);\n });\n }\n\n E.prototype.broadcast = function (e, i, o) {\n t.asyncAll(this.actors, function (t, o) {\n t.send(e, i, o);\n }, o = o || function () {});\n }, E.prototype.getActor = function () {\n return this.currentActor = (this.currentActor + 1) % this.actors.length, this.actors[this.currentActor];\n }, E.prototype.remove = function () {\n this.actors.forEach(function (t) {\n t.remove();\n }), this.actors = [], this.workerPool.release(this.id);\n }, E.Actor = t.Actor;\n\n var P = function P(e, i, o) {\n this.bounds = t.LngLatBounds.convert(this.validateBounds(e)), this.minzoom = i || 0, this.maxzoom = o || 24;\n };\n\n P.prototype.validateBounds = function (t) {\n return Array.isArray(t) && 4 === t.length ? [Math.max(-180, t[0]), Math.max(-90, t[1]), Math.min(180, t[2]), Math.min(90, t[3])] : [-180, -90, 180, 90];\n }, P.prototype.contains = function (e) {\n var i = Math.pow(2, e.z),\n o = Math.floor(t.mercatorXfromLng(this.bounds.getWest()) * i),\n r = Math.floor(t.mercatorYfromLat(this.bounds.getNorth()) * i),\n a = Math.ceil(t.mercatorXfromLng(this.bounds.getEast()) * i),\n n = Math.ceil(t.mercatorYfromLat(this.bounds.getSouth()) * i);\n return e.x >= o && e.x < a && e.y >= r && e.y < n;\n };\n\n var S = function (e) {\n function i(i, o, r, a) {\n if (e.call(this), this.id = i, this.dispatcher = r, this.type = "vector", this.minzoom = 0, this.maxzoom = 22, this.scheme = "xyz", this.tileSize = 512, this.reparseOverscaled = !0, this.isTileClipped = !0, this._loaded = !1, t.extend(this, t.pick(o, ["url", "scheme", "tileSize", "promoteId"])), this._options = t.extend({\n type: "vector"\n }, o), this._collectResourceTiming = o.collectResourceTiming, 512 !== this.tileSize) throw new Error("vector tile sources must have a tileSize of 512");\n this.setEventedParent(a);\n }\n\n return e && (i.__proto__ = e), (i.prototype = Object.create(e && e.prototype)).constructor = i, i.prototype.load = function () {\n var e = this;\n this._loaded = !1, this.fire(new t.Event("dataloading", {\n dataType: "source"\n })), this._tileJSONRequest = I(this._options, this.map._requestManager, function (i, o) {\n e._tileJSONRequest = null, e._loaded = !0, i ? e.fire(new t.ErrorEvent(i)) : o && (t.extend(e, o), o.bounds && (e.tileBounds = new P(o.bounds, e.minzoom, e.maxzoom)), t.postTurnstileEvent(o.tiles, e.map._requestManager._customAccessToken), t.postMapLoadEvent(o.tiles, e.map._getMapId(), e.map._requestManager._skuToken, e.map._requestManager._customAccessToken), e.fire(new t.Event("data", {\n dataType: "source",\n sourceDataType: "metadata"\n })), e.fire(new t.Event("data", {\n dataType: "source",\n sourceDataType: "content"\n })));\n });\n }, i.prototype.loaded = function () {\n return this._loaded;\n }, i.prototype.hasTile = function (t) {\n return !this.tileBounds || this.tileBounds.contains(t.canonical);\n }, i.prototype.onAdd = function (t) {\n this.map = t, this.load();\n }, i.prototype.setSourceProperty = function (t) {\n this._tileJSONRequest && this._tileJSONRequest.cancel(), t(), this.map.style.sourceCaches[this.id].clearTiles(), this.load();\n }, i.prototype.setTiles = function (t) {\n var e = this;\n return this.setSourceProperty(function () {\n e._options.tiles = t;\n }), this;\n }, i.prototype.setUrl = function (t) {\n var e = this;\n return this.setSourceProperty(function () {\n e.url = t, e._options.url = t;\n }), this;\n }, i.prototype.onRemove = function () {\n this._tileJSONRequest && (this._tileJSONRequest.cancel(), this._tileJSONRequest = null);\n }, i.prototype.serialize = function () {\n return t.extend({}, this._options);\n }, i.prototype.loadTile = function (e, i) {\n var o = this.map._requestManager.normalizeTileURL(e.tileID.canonical.url(this.tiles, this.scheme)),\n r = {\n request: this.map._requestManager.transformRequest(o, t.ResourceType.Tile),\n uid: e.uid,\n tileID: e.tileID,\n zoom: e.tileID.overscaledZ,\n tileSize: this.tileSize * e.tileID.overscaleFactor(),\n type: this.type,\n source: this.id,\n pixelRatio: t.browser.devicePixelRatio,\n showCollisionBoxes: this.map.showCollisionBoxes,\n promoteId: this.promoteId\n };\n\n function a(o, r) {\n return delete e.request, e.aborted ? i(null) : o && 404 !== o.status ? i(o) : (r && r.resourceTiming && (e.resourceTiming = r.resourceTiming), this.map._refreshExpiredTiles && r && e.setExpiryData(r), e.loadVectorData(r, this.map.painter), t.cacheEntryPossiblyAdded(this.dispatcher), i(null), void (e.reloadCallback && (this.loadTile(e, e.reloadCallback), e.reloadCallback = null)));\n }\n\n r.request.collectResourceTiming = this._collectResourceTiming, e.actor && "expired" !== e.state ? "loading" === e.state ? e.reloadCallback = i : e.request = e.actor.send("reloadTile", r, a.bind(this)) : (e.actor = this.dispatcher.getActor(), e.request = e.actor.send("loadTile", r, a.bind(this)));\n }, i.prototype.abortTile = function (t) {\n t.request && (t.request.cancel(), delete t.request), t.actor && t.actor.send("abortTile", {\n uid: t.uid,\n type: this.type,\n source: this.id\n }, void 0);\n }, i.prototype.unloadTile = function (t) {\n t.unloadVectorData(), t.actor && t.actor.send("removeTile", {\n uid: t.uid,\n type: this.type,\n source: this.id\n }, void 0);\n }, i.prototype.hasTransition = function () {\n return !1;\n }, i;\n }(t.Evented),\n C = function (e) {\n function i(i, o, r, a) {\n e.call(this), this.id = i, this.dispatcher = r, this.setEventedParent(a), this.type = "raster", this.minzoom = 0, this.maxzoom = 22, this.roundZoom = !0, this.scheme = "xyz", this.tileSize = 512, this._loaded = !1, this._options = t.extend({\n type: "raster"\n }, o), t.extend(this, t.pick(o, ["url", "scheme", "tileSize"]));\n }\n\n return e && (i.__proto__ = e), (i.prototype = Object.create(e && e.prototype)).constructor = i, i.prototype.load = function () {\n var e = this;\n this._loaded = !1, this.fire(new t.Event("dataloading", {\n dataType: "source"\n })), this._tileJSONRequest = I(this._options, this.map._requestManager, function (i, o) {\n e._tileJSONRequest = null, e._loaded = !0, i ? e.fire(new t.ErrorEvent(i)) : o && (t.extend(e, o), o.bounds && (e.tileBounds = new P(o.bounds, e.minzoom, e.maxzoom)), t.postTurnstileEvent(o.tiles), t.postMapLoadEvent(o.tiles, e.map._getMapId(), e.map._requestManager._skuToken), e.fire(new t.Event("data", {\n dataType: "source",\n sourceDataType: "metadata"\n })), e.fire(new t.Event("data", {\n dataType: "source",\n sourceDataType: "content"\n })));\n });\n }, i.prototype.loaded = function () {\n return this._loaded;\n }, i.prototype.onAdd = function (t) {\n this.map = t, this.load();\n }, i.prototype.onRemove = function () {\n this._tileJSONRequest && (this._tileJSONRequest.cancel(), this._tileJSONRequest = null);\n }, i.prototype.serialize = function () {\n return t.extend({}, this._options);\n }, i.prototype.hasTile = function (t) {\n return !this.tileBounds || this.tileBounds.contains(t.canonical);\n }, i.prototype.loadTile = function (e, i) {\n var o = this,\n r = this.map._requestManager.normalizeTileURL(e.tileID.canonical.url(this.tiles, this.scheme), this.tileSize);\n\n e.request = t.getImage(this.map._requestManager.transformRequest(r, t.ResourceType.Tile), function (r, a) {\n if (delete e.request, e.aborted) e.state = "unloaded", i(null);else if (r) e.state = "errored", i(r);else if (a) {\n o.map._refreshExpiredTiles && e.setExpiryData(a), delete a.cacheControl, delete a.expires;\n var n = o.map.painter.context,\n s = n.gl;\n e.texture = o.map.painter.getTileTexture(a.width), e.texture ? e.texture.update(a, {\n useMipmap: !0\n }) : (e.texture = new t.Texture(n, a, s.RGBA, {\n useMipmap: !0\n }), e.texture.bind(s.LINEAR, s.CLAMP_TO_EDGE, s.LINEAR_MIPMAP_NEAREST), n.extTextureFilterAnisotropic && s.texParameterf(s.TEXTURE_2D, n.extTextureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT, n.extTextureFilterAnisotropicMax)), e.state = "loaded", t.cacheEntryPossiblyAdded(o.dispatcher), i(null);\n }\n });\n }, i.prototype.abortTile = function (t, e) {\n t.request && (t.request.cancel(), delete t.request), e();\n }, i.prototype.unloadTile = function (t, e) {\n t.texture && this.map.painter.saveTileTexture(t.texture), e();\n }, i.prototype.hasTransition = function () {\n return !1;\n }, i;\n }(t.Evented),\n z = function (e) {\n function i(i, o, r, a) {\n e.call(this, i, o, r, a), this.type = "raster-dem", this.maxzoom = 22, this._options = t.extend({\n type: "raster-dem"\n }, o), this.encoding = o.encoding || "mapbox";\n }\n\n return e && (i.__proto__ = e), (i.prototype = Object.create(e && e.prototype)).constructor = i, i.prototype.serialize = function () {\n return {\n type: "raster-dem",\n url: this.url,\n tileSize: this.tileSize,\n tiles: this.tiles,\n bounds: this.bounds,\n encoding: this.encoding\n };\n }, i.prototype.loadTile = function (e, i) {\n var o = this.map._requestManager.normalizeTileURL(e.tileID.canonical.url(this.tiles, this.scheme), this.tileSize);\n\n function r(t, o) {\n t && (e.state = "errored", i(t)), o && (e.dem = o, e.needsHillshadePrepare = !0, e.state = "loaded", i(null));\n }\n\n e.request = t.getImage(this.map._requestManager.transformRequest(o, t.ResourceType.Tile), function (o, a) {\n if (delete e.request, e.aborted) e.state = "unloaded", i(null);else if (o) e.state = "errored", i(o);else if (a) {\n this.map._refreshExpiredTiles && e.setExpiryData(a), delete a.cacheControl, delete a.expires;\n var n = t.window.ImageBitmap && a instanceof t.window.ImageBitmap && t.offscreenCanvasSupported() ? a : t.browser.getImageData(a, 1),\n s = {\n uid: e.uid,\n coord: e.tileID,\n source: this.id,\n rawImageData: n,\n encoding: this.encoding\n };\n e.actor && "expired" !== e.state || (e.actor = this.dispatcher.getActor(), e.actor.send("loadDEMTile", s, r.bind(this)));\n }\n }.bind(this)), e.neighboringTiles = this._getNeighboringTiles(e.tileID);\n }, i.prototype._getNeighboringTiles = function (e) {\n var i = e.canonical,\n o = Math.pow(2, i.z),\n r = (i.x - 1 + o) % o,\n a = 0 === i.x ? e.wrap - 1 : e.wrap,\n n = (i.x + 1 + o) % o,\n s = i.x + 1 === o ? e.wrap + 1 : e.wrap,\n l = {};\n return l[new t.OverscaledTileID(e.overscaledZ, a, i.z, r, i.y).key] = {\n backfilled: !1\n }, l[new t.OverscaledTileID(e.overscaledZ, s, i.z, n, i.y).key] = {\n backfilled: !1\n }, i.y > 0 && (l[new t.OverscaledTileID(e.overscaledZ, a, i.z, r, i.y - 1).key] = {\n backfilled: !1\n }, l[new t.OverscaledTileID(e.overscaledZ, e.wrap, i.z, i.x, i.y - 1).key] = {\n backfilled: !1\n }, l[new t.OverscaledTileID(e.overscaledZ, s, i.z, n, i.y - 1).key] = {\n backfilled: !1\n }), i.y + 1 < o && (l[new t.OverscaledTileID(e.overscaledZ, a, i.z, r, i.y + 1).key] = {\n backfilled: !1\n }, l[new t.OverscaledTileID(e.overscaledZ, e.wrap, i.z, i.x, i.y + 1).key] = {\n backfilled: !1\n }, l[new t.OverscaledTileID(e.overscaledZ, s, i.z, n, i.y + 1).key] = {\n backfilled: !1\n }), l;\n }, i.prototype.unloadTile = function (t) {\n t.demTexture && this.map.painter.saveTileTexture(t.demTexture), t.fbo && (t.fbo.destroy(), delete t.fbo), t.dem && delete t.dem, delete t.neighboringTiles, t.state = "unloaded", t.actor && t.actor.send("removeDEMTile", {\n uid: t.uid,\n source: this.id\n });\n }, i;\n }(C),\n D = function (e) {\n function i(i, o, r, a) {\n e.call(this), this.id = i, this.type = "geojson", this.minzoom = 0, this.maxzoom = 18, this.tileSize = 512, this.isTileClipped = !0, this.reparseOverscaled = !0, this._removed = !1, this._loaded = !1, this.actor = r.getActor(), this.setEventedParent(a), this._data = o.data, this._options = t.extend({}, o), this._collectResourceTiming = o.collectResourceTiming, this._resourceTiming = [], void 0 !== o.maxzoom && (this.maxzoom = o.maxzoom), o.type && (this.type = o.type), o.attribution && (this.attribution = o.attribution), this.promoteId = o.promoteId;\n var n = t.EXTENT / this.tileSize;\n this.workerOptions = t.extend({\n source: this.id,\n cluster: o.cluster || !1,\n geojsonVtOptions: {\n buffer: (void 0 !== o.buffer ? o.buffer : 128) * n,\n tolerance: (void 0 !== o.tolerance ? o.tolerance : .375) * n,\n extent: t.EXTENT,\n maxZoom: this.maxzoom,\n lineMetrics: o.lineMetrics || !1,\n generateId: o.generateId || !1\n },\n superclusterOptions: {\n maxZoom: void 0 !== o.clusterMaxZoom ? Math.min(o.clusterMaxZoom, this.maxzoom - 1) : this.maxzoom - 1,\n minPoints: Math.max(2, o.clusterMinPoints || 2),\n extent: t.EXTENT,\n radius: (o.clusterRadius || 50) * n,\n log: !1,\n generateId: o.generateId || !1\n },\n clusterProperties: o.clusterProperties,\n filter: o.filter\n }, o.workerOptions);\n }\n\n return e && (i.__proto__ = e), (i.prototype = Object.create(e && e.prototype)).constructor = i, i.prototype.load = function () {\n var e = this;\n this.fire(new t.Event("dataloading", {\n dataType: "source"\n })), this._updateWorkerData(function (i) {\n if (i) e.fire(new t.ErrorEvent(i));else {\n var o = {\n dataType: "source",\n sourceDataType: "metadata"\n };\n e._collectResourceTiming && e._resourceTiming && e._resourceTiming.length > 0 && (o.resourceTiming = e._resourceTiming, e._resourceTiming = []), e.fire(new t.Event("data", o));\n }\n });\n }, i.prototype.onAdd = function (t) {\n this.map = t, this.load();\n }, i.prototype.setData = function (e) {\n var i = this;\n return this._data = e, this.fire(new t.Event("dataloading", {\n dataType: "source"\n })), this._updateWorkerData(function (e) {\n if (e) i.fire(new t.ErrorEvent(e));else {\n var o = {\n dataType: "source",\n sourceDataType: "content"\n };\n i._collectResourceTiming && i._resourceTiming && i._resourceTiming.length > 0 && (o.resourceTiming = i._resourceTiming, i._resourceTiming = []), i.fire(new t.Event("data", o));\n }\n }), this;\n }, i.prototype.getClusterExpansionZoom = function (t, e) {\n return this.actor.send("geojson.getClusterExpansionZoom", {\n clusterId: t,\n source: this.id\n }, e), this;\n }, i.prototype.getClusterChildren = function (t, e) {\n return this.actor.send("geojson.getClusterChildren", {\n clusterId: t,\n source: this.id\n }, e), this;\n }, i.prototype.getClusterLeaves = function (t, e, i, o) {\n return this.actor.send("geojson.getClusterLeaves", {\n source: this.id,\n clusterId: t,\n limit: e,\n offset: i\n }, o), this;\n }, i.prototype._updateWorkerData = function (e) {\n var i = this;\n this._loaded = !1;\n var o = t.extend({}, this.workerOptions),\n r = this._data;\n "string" == typeof r ? (o.request = this.map._requestManager.transformRequest(t.browser.resolveURL(r), t.ResourceType.Source), o.request.collectResourceTiming = this._collectResourceTiming) : o.data = JSON.stringify(r), this.actor.send(this.type + ".loadData", o, function (t, r) {\n i._removed || r && r.abandoned || (i._loaded = !0, r && r.resourceTiming && r.resourceTiming[i.id] && (i._resourceTiming = r.resourceTiming[i.id].slice(0)), i.actor.send(i.type + ".coalesce", {\n source: o.source\n }, null), e(t));\n });\n }, i.prototype.loaded = function () {\n return this._loaded;\n }, i.prototype.loadTile = function (e, i) {\n var o = this,\n r = e.actor ? "reloadTile" : "loadTile";\n e.actor = this.actor, e.request = this.actor.send(r, {\n type: this.type,\n uid: e.uid,\n tileID: e.tileID,\n zoom: e.tileID.overscaledZ,\n maxZoom: this.maxzoom,\n tileSize: this.tileSize,\n source: this.id,\n pixelRatio: t.browser.devicePixelRatio,\n showCollisionBoxes: this.map.showCollisionBoxes,\n promoteId: this.promoteId\n }, function (t, a) {\n return delete e.request, e.unloadVectorData(), e.aborted ? i(null) : t ? i(t) : (e.loadVectorData(a, o.map.painter, "reloadTile" === r), i(null));\n });\n }, i.prototype.abortTile = function (t) {\n t.request && (t.request.cancel(), delete t.request), t.aborted = !0;\n }, i.prototype.unloadTile = function (t) {\n t.unloadVectorData(), this.actor.send("removeTile", {\n uid: t.uid,\n type: this.type,\n source: this.id\n });\n }, i.prototype.onRemove = function () {\n this._removed = !0, this.actor.send("removeSource", {\n type: this.type,\n source: this.id\n });\n }, i.prototype.serialize = function () {\n return t.extend({}, this._options, {\n type: this.type,\n data: this._data\n });\n }, i.prototype.hasTransition = function () {\n return !1;\n }, i;\n }(t.Evented),\n A = t.createLayout([{\n name: "a_pos",\n type: "Int16",\n components: 2\n }, {\n name: "a_texture_pos",\n type: "Int16",\n components: 2\n }]),\n M = function (e) {\n function i(t, i, o, r) {\n e.call(this), this.id = t, this.dispatcher = o, this.coordinates = i.coordinates, this.type = "image", this.minzoom = 0, this.maxzoom = 22, this.tileSize = 512, this.tiles = {}, this._loaded = !1, this.setEventedParent(r), this.options = i;\n }\n\n return e && (i.__proto__ = e), (i.prototype = Object.create(e && e.prototype)).constructor = i, i.prototype.load = function (e, i) {\n var o = this;\n this._loaded = !1, this.fire(new t.Event("dataloading", {\n dataType: "source"\n })), this.url = this.options.url, t.getImage(this.map._requestManager.transformRequest(this.url, t.ResourceType.Image), function (r, a) {\n o._loaded = !0, r ? o.fire(new t.ErrorEvent(r)) : a && (o.image = a, e && (o.coordinates = e), i && i(), o._finishLoading());\n });\n }, i.prototype.loaded = function () {\n return this._loaded;\n }, i.prototype.updateImage = function (t) {\n var e = this;\n return this.image && t.url ? (this.options.url = t.url, this.load(t.coordinates, function () {\n e.texture = null;\n }), this) : this;\n }, i.prototype._finishLoading = function () {\n this.map && (this.setCoordinates(this.coordinates), this.fire(new t.Event("data", {\n dataType: "source",\n sourceDataType: "metadata"\n })));\n }, i.prototype.onAdd = function (t) {\n this.map = t, this.load();\n }, i.prototype.setCoordinates = function (e) {\n var i = this;\n this.coordinates = e;\n var o = e.map(t.MercatorCoordinate.fromLngLat);\n this.tileID = function (e) {\n for (var i = 1 / 0, o = 1 / 0, r = -1 / 0, a = -1 / 0, n = 0, s = e; n < s.length; n += 1) {\n var l = s[n];\n i = Math.min(i, l.x), o = Math.min(o, l.y), r = Math.max(r, l.x), a = Math.max(a, l.y);\n }\n\n var c = Math.max(r - i, a - o),\n u = Math.max(0, Math.floor(-Math.log(c) / Math.LN2)),\n h = Math.pow(2, u);\n return new t.CanonicalTileID(u, Math.floor((i + r) / 2 * h), Math.floor((o + a) / 2 * h));\n }(o), this.minzoom = this.maxzoom = this.tileID.z;\n var r = o.map(function (t) {\n return i.tileID.getTilePoint(t)._round();\n });\n return this._boundsArray = new t.StructArrayLayout4i8(), this._boundsArray.emplaceBack(r[0].x, r[0].y, 0, 0), this._boundsArray.emplaceBack(r[1].x, r[1].y, t.EXTENT, 0), this._boundsArray.emplaceBack(r[3].x, r[3].y, 0, t.EXTENT), this._boundsArray.emplaceBack(r[2].x, r[2].y, t.EXTENT, t.EXTENT), this.boundsBuffer && (this.boundsBuffer.destroy(), delete this.boundsBuffer), this.fire(new t.Event("data", {\n dataType: "source",\n sourceDataType: "content"\n })), this;\n }, i.prototype.prepare = function () {\n if (0 !== Object.keys(this.tiles).length && this.image) {\n var e = this.map.painter.context,\n i = e.gl;\n\n for (var o in this.boundsBuffer || (this.boundsBuffer = e.createVertexBuffer(this._boundsArray, A.members)), this.boundsSegments || (this.boundsSegments = t.SegmentVector.simpleSegment(0, 0, 4, 2)), this.texture || (this.texture = new t.Texture(e, this.image, i.RGBA), this.texture.bind(i.LINEAR, i.CLAMP_TO_EDGE)), this.tiles) {\n var r = this.tiles[o];\n "loaded" !== r.state && (r.state = "loaded", r.texture = this.texture);\n }\n }\n }, i.prototype.loadTile = function (t, e) {\n this.tileID && this.tileID.equals(t.tileID.canonical) ? (this.tiles[String(t.tileID.wrap)] = t, t.buckets = {}, e(null)) : (t.state = "errored", e(null));\n }, i.prototype.serialize = function () {\n return {\n type: "image",\n url: this.options.url,\n coordinates: this.coordinates\n };\n }, i.prototype.hasTransition = function () {\n return !1;\n }, i;\n }(t.Evented),\n L = function (e) {\n function i(t, i, o, r) {\n e.call(this, t, i, o, r), this.roundZoom = !0, this.type = "video", this.options = i;\n }\n\n return e && (i.__proto__ = e), (i.prototype = Object.create(e && e.prototype)).constructor = i, i.prototype.load = function () {\n var e = this;\n this._loaded = !1;\n var i = this.options;\n this.urls = [];\n\n for (var o = 0, r = i.urls; o < r.length; o += 1) {\n this.urls.push(this.map._requestManager.transformRequest(r[o], t.ResourceType.Source).url);\n }\n\n t.getVideo(this.urls, function (i, o) {\n e._loaded = !0, i ? e.fire(new t.ErrorEvent(i)) : o && (e.video = o, e.video.loop = !0, e.video.addEventListener("playing", function () {\n e.map.triggerRepaint();\n }), e.map && e.video.play(), e._finishLoading());\n });\n }, i.prototype.pause = function () {\n this.video && this.video.pause();\n }, i.prototype.play = function () {\n this.video && this.video.play();\n }, i.prototype.seek = function (e) {\n if (this.video) {\n var i = this.video.seekable;\n e < i.start(0) || e > i.end(0) ? this.fire(new t.ErrorEvent(new t.ValidationError("sources." + this.id, null, "Playback for this video can be set only between the " + i.start(0) + " and " + i.end(0) + "-second mark."))) : this.video.currentTime = e;\n }\n }, i.prototype.getVideo = function () {\n return this.video;\n }, i.prototype.onAdd = function (t) {\n this.map || (this.map = t, this.load(), this.video && (this.video.play(), this.setCoordinates(this.coordinates)));\n }, i.prototype.prepare = function () {\n if (!(0 === Object.keys(this.tiles).length || this.video.readyState < 2)) {\n var e = this.map.painter.context,\n i = e.gl;\n\n for (var o in this.boundsBuffer || (this.boundsBuffer = e.createVertexBuffer(this._boundsArray, A.members)), this.boundsSegments || (this.boundsSegments = t.SegmentVector.simpleSegment(0, 0, 4, 2)), this.texture ? this.video.paused || (this.texture.bind(i.LINEAR, i.CLAMP_TO_EDGE), i.texSubImage2D(i.TEXTURE_2D, 0, 0, 0, i.RGBA, i.UNSIGNED_BYTE, this.video)) : (this.texture = new t.Texture(e, this.video, i.RGBA), this.texture.bind(i.LINEAR, i.CLAMP_TO_EDGE)), this.tiles) {\n var r = this.tiles[o];\n "loaded" !== r.state && (r.state = "loaded", r.texture = this.texture);\n }\n }\n }, i.prototype.serialize = function () {\n return {\n type: "video",\n urls: this.urls,\n coordinates: this.coordinates\n };\n }, i.prototype.hasTransition = function () {\n return this.video && !this.video.paused;\n }, i;\n }(M),\n R = function (e) {\n function i(i, o, r, a) {\n e.call(this, i, o, r, a), o.coordinates ? Array.isArray(o.coordinates) && 4 === o.coordinates.length && !o.coordinates.some(function (t) {\n return !Array.isArray(t) || 2 !== t.length || t.some(function (t) {\n return "number" != typeof t;\n });\n }) || this.fire(new t.ErrorEvent(new t.ValidationError("sources." + i, null, \'"coordinates" property must be an array of 4 longitude/latitude array pairs\'))) : this.fire(new t.ErrorEvent(new t.ValidationError("sources." + i, null, \'missing required property "coordinates"\'))), o.animate && "boolean" != typeof o.animate && this.fire(new t.ErrorEvent(new t.ValidationError("sources." + i, null, \'optional "animate" property must be a boolean value\'))), o.canvas ? "string" == typeof o.canvas || o.canvas instanceof t.window.HTMLCanvasElement || this.fire(new t.ErrorEvent(new t.ValidationError("sources." + i, null, \'"canvas" must be either a string representing the ID of the canvas element from which to read, or an HTMLCanvasElement instance\'))) : this.fire(new t.ErrorEvent(new t.ValidationError("sources." + i, null, \'missing required property "canvas"\'))), this.options = o, this.animate = void 0 === o.animate || o.animate;\n }\n\n return e && (i.__proto__ = e), (i.prototype = Object.create(e && e.prototype)).constructor = i, i.prototype.load = function () {\n this._loaded = !0, this.canvas || (this.canvas = this.options.canvas instanceof t.window.HTMLCanvasElement ? this.options.canvas : t.window.document.getElementById(this.options.canvas)), this.width = this.canvas.width, this.height = this.canvas.height, this._hasInvalidDimensions() ? this.fire(new t.ErrorEvent(new Error("Canvas dimensions cannot be less than or equal to zero."))) : (this.play = function () {\n this._playing = !0, this.map.triggerRepaint();\n }, this.pause = function () {\n this._playing && (this.prepare(), this._playing = !1);\n }, this._finishLoading());\n }, i.prototype.getCanvas = function () {\n return this.canvas;\n }, i.prototype.onAdd = function (t) {\n this.map = t, this.load(), this.canvas && this.animate && this.play();\n }, i.prototype.onRemove = function () {\n this.pause();\n }, i.prototype.prepare = function () {\n var e = !1;\n\n if (this.canvas.width !== this.width && (this.width = this.canvas.width, e = !0), this.canvas.height !== this.height && (this.height = this.canvas.height, e = !0), !this._hasInvalidDimensions() && 0 !== Object.keys(this.tiles).length) {\n var i = this.map.painter.context,\n o = i.gl;\n\n for (var r in this.boundsBuffer || (this.boundsBuffer = i.createVertexBuffer(this._boundsArray, A.members)), this.boundsSegments || (this.boundsSegments = t.SegmentVector.simpleSegment(0, 0, 4, 2)), this.texture ? (e || this._playing) && this.texture.update(this.canvas, {\n premultiply: !0\n }) : this.texture = new t.Texture(i, this.canvas, o.RGBA, {\n premultiply: !0\n }), this.tiles) {\n var a = this.tiles[r];\n "loaded" !== a.state && (a.state = "loaded", a.texture = this.texture);\n }\n }\n }, i.prototype.serialize = function () {\n return {\n type: "canvas",\n coordinates: this.coordinates\n };\n }, i.prototype.hasTransition = function () {\n return this._playing;\n }, i.prototype._hasInvalidDimensions = function () {\n for (var t = 0, e = [this.canvas.width, this.canvas.height]; t < e.length; t += 1) {\n var i = e[t];\n if (isNaN(i) || i <= 0) return !0;\n }\n\n return !1;\n }, i;\n }(M),\n k = {\n vector: S,\n raster: C,\n "raster-dem": z,\n geojson: D,\n video: L,\n image: M,\n canvas: R\n };\n\n function B(e, i) {\n var o = t.identity([]);\n return t.translate(o, o, [1, 1, 0]), t.scale(o, o, [.5 * e.width, .5 * e.height, 1]), t.multiply(o, o, e.calculatePosMatrix(i.toUnwrapped()));\n }\n\n function O(t, e, i, o, r, a) {\n var n = function (t, e, i) {\n if (t) for (var o = 0, r = t; o < r.length; o += 1) {\n var a = e[r[o]];\n if (a && a.source === i && "fill-extrusion" === a.type) return !0;\n } else for (var n in e) {\n var s = e[n];\n if (s.source === i && "fill-extrusion" === s.type) return !0;\n }\n return !1;\n }(r && r.layers, e, t.id),\n s = a.maxPitchScaleFactor(),\n l = t.tilesIn(o, s, n);\n\n l.sort(F);\n\n for (var c = [], u = 0, h = l; u < h.length; u += 1) {\n var p = h[u];\n c.push({\n wrappedTileID: p.tileID.wrapped().key,\n queryResults: p.tile.queryRenderedFeatures(e, i, t._state, p.queryGeometry, p.cameraQueryGeometry, p.scale, r, a, s, B(t.transform, p.tileID))\n });\n }\n\n var d = function (t) {\n for (var e = {}, i = {}, o = 0, r = t; o < r.length; o += 1) {\n var a = r[o],\n n = a.queryResults,\n s = a.wrappedTileID,\n l = i[s] = i[s] || {};\n\n for (var c in n) {\n for (var u = n[c], h = l[c] = l[c] || {}, p = e[c] = e[c] || [], d = 0, _ = u; d < _.length; d += 1) {\n var f = _[d];\n h[f.featureIndex] || (h[f.featureIndex] = !0, p.push(f));\n }\n }\n }\n\n return e;\n }(c);\n\n for (var _ in d) {\n d[_].forEach(function (e) {\n var i = e.feature,\n o = t.getFeatureState(i.layer["source-layer"], i.id);\n i.source = i.layer.source, i.layer["source-layer"] && (i.sourceLayer = i.layer["source-layer"]), i.state = o;\n });\n }\n\n return d;\n }\n\n function F(t, e) {\n var i = t.tileID,\n o = e.tileID;\n return i.overscaledZ - o.overscaledZ || i.canonical.y - o.canonical.y || i.wrap - o.wrap || i.canonical.x - o.canonical.x;\n }\n\n var U = function U(t, e) {\n this.max = t, this.onRemove = e, this.reset();\n };\n\n U.prototype.reset = function () {\n for (var t in this.data) {\n for (var e = 0, i = this.data[t]; e < i.length; e += 1) {\n var o = i[e];\n o.timeout && clearTimeout(o.timeout), this.onRemove(o.value);\n }\n }\n\n return this.data = {}, this.order = [], this;\n }, U.prototype.add = function (t, e, i) {\n var o = this,\n r = t.wrapped().key;\n void 0 === this.data[r] && (this.data[r] = []);\n var a = {\n value: e,\n timeout: void 0\n };\n\n if (void 0 !== i && (a.timeout = setTimeout(function () {\n o.remove(t, a);\n }, i)), this.data[r].push(a), this.order.push(r), this.order.length > this.max) {\n var n = this._getAndRemoveByKey(this.order[0]);\n\n n && this.onRemove(n);\n }\n\n return this;\n }, U.prototype.has = function (t) {\n return t.wrapped().key in this.data;\n }, U.prototype.getAndRemove = function (t) {\n return this.has(t) ? this._getAndRemoveByKey(t.wrapped().key) : null;\n }, U.prototype._getAndRemoveByKey = function (t) {\n var e = this.data[t].shift();\n return e.timeout && clearTimeout(e.timeout), 0 === this.data[t].length && delete this.data[t], this.order.splice(this.order.indexOf(t), 1), e.value;\n }, U.prototype.getByKey = function (t) {\n var e = this.data[t];\n return e ? e[0].value : null;\n }, U.prototype.get = function (t) {\n return this.has(t) ? this.data[t.wrapped().key][0].value : null;\n }, U.prototype.remove = function (t, e) {\n if (!this.has(t)) return this;\n var i = t.wrapped().key,\n o = void 0 === e ? 0 : this.data[i].indexOf(e),\n r = this.data[i][o];\n return this.data[i].splice(o, 1), r.timeout && clearTimeout(r.timeout), 0 === this.data[i].length && delete this.data[i], this.onRemove(r.value), this.order.splice(this.order.indexOf(i), 1), this;\n }, U.prototype.setMaxSize = function (t) {\n for (this.max = t; this.order.length > this.max;) {\n var e = this._getAndRemoveByKey(this.order[0]);\n\n e && this.onRemove(e);\n }\n\n return this;\n }, U.prototype.filter = function (t) {\n var e = [];\n\n for (var i in this.data) {\n for (var o = 0, r = this.data[i]; o < r.length; o += 1) {\n var a = r[o];\n t(a.value) || e.push(a);\n }\n }\n\n for (var n = 0, s = e; n < s.length; n += 1) {\n var l = s[n];\n this.remove(l.value.tileID, l);\n }\n };\n\n var N = function N(t, e, i) {\n this.context = t;\n var o = t.gl;\n this.buffer = o.createBuffer(), this.dynamicDraw = Boolean(i), this.context.unbindVAO(), t.bindElementBuffer.set(this.buffer), o.bufferData(o.ELEMENT_ARRAY_BUFFER, e.arrayBuffer, this.dynamicDraw ? o.DYNAMIC_DRAW : o.STATIC_DRAW), this.dynamicDraw || delete e.arrayBuffer;\n };\n\n N.prototype.bind = function () {\n this.context.bindElementBuffer.set(this.buffer);\n }, N.prototype.updateData = function (t) {\n var e = this.context.gl;\n this.context.unbindVAO(), this.bind(), e.bufferSubData(e.ELEMENT_ARRAY_BUFFER, 0, t.arrayBuffer);\n }, N.prototype.destroy = function () {\n this.buffer && (this.context.gl.deleteBuffer(this.buffer), delete this.buffer);\n };\n\n var Z = {\n Int8: "BYTE",\n Uint8: "UNSIGNED_BYTE",\n Int16: "SHORT",\n Uint16: "UNSIGNED_SHORT",\n Int32: "INT",\n Uint32: "UNSIGNED_INT",\n Float32: "FLOAT"\n },\n q = function q(t, e, i, o) {\n this.length = e.length, this.attributes = i, this.itemSize = e.bytesPerElement, this.dynamicDraw = o, this.context = t;\n var r = t.gl;\n this.buffer = r.createBuffer(), t.bindVertexBuffer.set(this.buffer), r.bufferData(r.ARRAY_BUFFER, e.arrayBuffer, this.dynamicDraw ? r.DYNAMIC_DRAW : r.STATIC_DRAW), this.dynamicDraw || delete e.arrayBuffer;\n };\n\n q.prototype.bind = function () {\n this.context.bindVertexBuffer.set(this.buffer);\n }, q.prototype.updateData = function (t) {\n var e = this.context.gl;\n this.bind(), e.bufferSubData(e.ARRAY_BUFFER, 0, t.arrayBuffer);\n }, q.prototype.enableAttributes = function (t, e) {\n for (var i = 0; i < this.attributes.length; i++) {\n var o = e.attributes[this.attributes[i].name];\n void 0 !== o && t.enableVertexAttribArray(o);\n }\n }, q.prototype.setVertexAttribPointers = function (t, e, i) {\n for (var o = 0; o < this.attributes.length; o++) {\n var r = this.attributes[o],\n a = e.attributes[r.name];\n void 0 !== a && t.vertexAttribPointer(a, r.components, t[Z[r.type]], !1, this.itemSize, r.offset + this.itemSize * (i || 0));\n }\n }, q.prototype.destroy = function () {\n this.buffer && (this.context.gl.deleteBuffer(this.buffer), delete this.buffer);\n };\n\n var j = function j(t) {\n this.gl = t.gl, this.default = this.getDefault(), this.current = this.default, this.dirty = !1;\n };\n\n j.prototype.get = function () {\n return this.current;\n }, j.prototype.set = function (t) {}, j.prototype.getDefault = function () {\n return this.default;\n }, j.prototype.setDefault = function () {\n this.set(this.default);\n };\n\n var V = function (e) {\n function i() {\n e.apply(this, arguments);\n }\n\n return e && (i.__proto__ = e), (i.prototype = Object.create(e && e.prototype)).constructor = i, i.prototype.getDefault = function () {\n return t.Color.transparent;\n }, i.prototype.set = function (t) {\n var e = this.current;\n (t.r !== e.r || t.g !== e.g || t.b !== e.b || t.a !== e.a || this.dirty) && (this.gl.clearColor(t.r, t.g, t.b, t.a), this.current = t, this.dirty = !1);\n }, i;\n }(j),\n G = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return 1;\n }, e.prototype.set = function (t) {\n (t !== this.current || this.dirty) && (this.gl.clearDepth(t), this.current = t, this.dirty = !1);\n }, e;\n }(j),\n W = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return 0;\n }, e.prototype.set = function (t) {\n (t !== this.current || this.dirty) && (this.gl.clearStencil(t), this.current = t, this.dirty = !1);\n }, e;\n }(j),\n X = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return [!0, !0, !0, !0];\n }, e.prototype.set = function (t) {\n var e = this.current;\n (t[0] !== e[0] || t[1] !== e[1] || t[2] !== e[2] || t[3] !== e[3] || this.dirty) && (this.gl.colorMask(t[0], t[1], t[2], t[3]), this.current = t, this.dirty = !1);\n }, e;\n }(j),\n H = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return !0;\n }, e.prototype.set = function (t) {\n (t !== this.current || this.dirty) && (this.gl.depthMask(t), this.current = t, this.dirty = !1);\n }, e;\n }(j),\n K = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return 255;\n }, e.prototype.set = function (t) {\n (t !== this.current || this.dirty) && (this.gl.stencilMask(t), this.current = t, this.dirty = !1);\n }, e;\n }(j),\n Y = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return {\n func: this.gl.ALWAYS,\n ref: 0,\n mask: 255\n };\n }, e.prototype.set = function (t) {\n var e = this.current;\n (t.func !== e.func || t.ref !== e.ref || t.mask !== e.mask || this.dirty) && (this.gl.stencilFunc(t.func, t.ref, t.mask), this.current = t, this.dirty = !1);\n }, e;\n }(j),\n J = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n var t = this.gl;\n return [t.KEEP, t.KEEP, t.KEEP];\n }, e.prototype.set = function (t) {\n var e = this.current;\n (t[0] !== e[0] || t[1] !== e[1] || t[2] !== e[2] || this.dirty) && (this.gl.stencilOp(t[0], t[1], t[2]), this.current = t, this.dirty = !1);\n }, e;\n }(j),\n Q = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return !1;\n }, e.prototype.set = function (t) {\n if (t !== this.current || this.dirty) {\n var e = this.gl;\n t ? e.enable(e.STENCIL_TEST) : e.disable(e.STENCIL_TEST), this.current = t, this.dirty = !1;\n }\n }, e;\n }(j),\n $ = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return [0, 1];\n }, e.prototype.set = function (t) {\n var e = this.current;\n (t[0] !== e[0] || t[1] !== e[1] || this.dirty) && (this.gl.depthRange(t[0], t[1]), this.current = t, this.dirty = !1);\n }, e;\n }(j),\n tt = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return !1;\n }, e.prototype.set = function (t) {\n if (t !== this.current || this.dirty) {\n var e = this.gl;\n t ? e.enable(e.DEPTH_TEST) : e.disable(e.DEPTH_TEST), this.current = t, this.dirty = !1;\n }\n }, e;\n }(j),\n et = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return this.gl.LESS;\n }, e.prototype.set = function (t) {\n (t !== this.current || this.dirty) && (this.gl.depthFunc(t), this.current = t, this.dirty = !1);\n }, e;\n }(j),\n it = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return !1;\n }, e.prototype.set = function (t) {\n if (t !== this.current || this.dirty) {\n var e = this.gl;\n t ? e.enable(e.BLEND) : e.disable(e.BLEND), this.current = t, this.dirty = !1;\n }\n }, e;\n }(j),\n ot = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n var t = this.gl;\n return [t.ONE, t.ZERO];\n }, e.prototype.set = function (t) {\n var e = this.current;\n (t[0] !== e[0] || t[1] !== e[1] || this.dirty) && (this.gl.blendFunc(t[0], t[1]), this.current = t, this.dirty = !1);\n }, e;\n }(j),\n rt = function (e) {\n function i() {\n e.apply(this, arguments);\n }\n\n return e && (i.__proto__ = e), (i.prototype = Object.create(e && e.prototype)).constructor = i, i.prototype.getDefault = function () {\n return t.Color.transparent;\n }, i.prototype.set = function (t) {\n var e = this.current;\n (t.r !== e.r || t.g !== e.g || t.b !== e.b || t.a !== e.a || this.dirty) && (this.gl.blendColor(t.r, t.g, t.b, t.a), this.current = t, this.dirty = !1);\n }, i;\n }(j),\n at = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return this.gl.FUNC_ADD;\n }, e.prototype.set = function (t) {\n (t !== this.current || this.dirty) && (this.gl.blendEquation(t), this.current = t, this.dirty = !1);\n }, e;\n }(j),\n nt = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return !1;\n }, e.prototype.set = function (t) {\n if (t !== this.current || this.dirty) {\n var e = this.gl;\n t ? e.enable(e.CULL_FACE) : e.disable(e.CULL_FACE), this.current = t, this.dirty = !1;\n }\n }, e;\n }(j),\n st = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return this.gl.BACK;\n }, e.prototype.set = function (t) {\n (t !== this.current || this.dirty) && (this.gl.cullFace(t), this.current = t, this.dirty = !1);\n }, e;\n }(j),\n lt = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return this.gl.CCW;\n }, e.prototype.set = function (t) {\n (t !== this.current || this.dirty) && (this.gl.frontFace(t), this.current = t, this.dirty = !1);\n }, e;\n }(j),\n ct = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return null;\n }, e.prototype.set = function (t) {\n (t !== this.current || this.dirty) && (this.gl.useProgram(t), this.current = t, this.dirty = !1);\n }, e;\n }(j),\n ut = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return this.gl.TEXTURE0;\n }, e.prototype.set = function (t) {\n (t !== this.current || this.dirty) && (this.gl.activeTexture(t), this.current = t, this.dirty = !1);\n }, e;\n }(j),\n ht = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n var t = this.gl;\n return [0, 0, t.drawingBufferWidth, t.drawingBufferHeight];\n }, e.prototype.set = function (t) {\n var e = this.current;\n (t[0] !== e[0] || t[1] !== e[1] || t[2] !== e[2] || t[3] !== e[3] || this.dirty) && (this.gl.viewport(t[0], t[1], t[2], t[3]), this.current = t, this.dirty = !1);\n }, e;\n }(j),\n pt = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return null;\n }, e.prototype.set = function (t) {\n if (t !== this.current || this.dirty) {\n var e = this.gl;\n e.bindFramebuffer(e.FRAMEBUFFER, t), this.current = t, this.dirty = !1;\n }\n }, e;\n }(j),\n dt = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return null;\n }, e.prototype.set = function (t) {\n if (t !== this.current || this.dirty) {\n var e = this.gl;\n e.bindRenderbuffer(e.RENDERBUFFER, t), this.current = t, this.dirty = !1;\n }\n }, e;\n }(j),\n _t = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return null;\n }, e.prototype.set = function (t) {\n if (t !== this.current || this.dirty) {\n var e = this.gl;\n e.bindTexture(e.TEXTURE_2D, t), this.current = t, this.dirty = !1;\n }\n }, e;\n }(j),\n ft = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return null;\n }, e.prototype.set = function (t) {\n if (t !== this.current || this.dirty) {\n var e = this.gl;\n e.bindBuffer(e.ARRAY_BUFFER, t), this.current = t, this.dirty = !1;\n }\n }, e;\n }(j),\n mt = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return null;\n }, e.prototype.set = function (t) {\n var e = this.gl;\n e.bindBuffer(e.ELEMENT_ARRAY_BUFFER, t), this.current = t, this.dirty = !1;\n }, e;\n }(j),\n gt = function (t) {\n function e(e) {\n t.call(this, e), this.vao = e.extVertexArrayObject;\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return null;\n }, e.prototype.set = function (t) {\n this.vao && (t !== this.current || this.dirty) && (this.vao.bindVertexArrayOES(t), this.current = t, this.dirty = !1);\n }, e;\n }(j),\n vt = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return 4;\n }, e.prototype.set = function (t) {\n if (t !== this.current || this.dirty) {\n var e = this.gl;\n e.pixelStorei(e.UNPACK_ALIGNMENT, t), this.current = t, this.dirty = !1;\n }\n }, e;\n }(j),\n yt = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return !1;\n }, e.prototype.set = function (t) {\n if (t !== this.current || this.dirty) {\n var e = this.gl;\n e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL, t), this.current = t, this.dirty = !1;\n }\n }, e;\n }(j),\n xt = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return !1;\n }, e.prototype.set = function (t) {\n if (t !== this.current || this.dirty) {\n var e = this.gl;\n e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL, t), this.current = t, this.dirty = !1;\n }\n }, e;\n }(j),\n bt = function (t) {\n function e(e, i) {\n t.call(this, e), this.context = e, this.parent = i;\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return null;\n }, e;\n }(j),\n wt = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.setDirty = function () {\n this.dirty = !0;\n }, e.prototype.set = function (t) {\n if (t !== this.current || this.dirty) {\n this.context.bindFramebuffer.set(this.parent);\n var e = this.gl;\n e.framebufferTexture2D(e.FRAMEBUFFER, e.COLOR_ATTACHMENT0, e.TEXTURE_2D, t, 0), this.current = t, this.dirty = !1;\n }\n }, e;\n }(bt),\n Tt = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.set = function (t) {\n if (t !== this.current || this.dirty) {\n this.context.bindFramebuffer.set(this.parent);\n var e = this.gl;\n e.framebufferRenderbuffer(e.FRAMEBUFFER, e.DEPTH_ATTACHMENT, e.RENDERBUFFER, t), this.current = t, this.dirty = !1;\n }\n }, e;\n }(bt),\n Et = function Et(t, e, i, o) {\n this.context = t, this.width = e, this.height = i;\n var r = this.framebuffer = t.gl.createFramebuffer();\n this.colorAttachment = new wt(t, r), o && (this.depthAttachment = new Tt(t, r));\n };\n\n Et.prototype.destroy = function () {\n var t = this.context.gl,\n e = this.colorAttachment.get();\n\n if (e && t.deleteTexture(e), this.depthAttachment) {\n var i = this.depthAttachment.get();\n i && t.deleteRenderbuffer(i);\n }\n\n t.deleteFramebuffer(this.framebuffer);\n };\n\n var It = function It(t, e, i) {\n this.func = t, this.mask = e, this.range = i;\n };\n\n It.ReadOnly = !1, It.ReadWrite = !0, It.disabled = new It(519, It.ReadOnly, [0, 1]);\n\n var Pt = function Pt(t, e, i, o, r, a) {\n this.test = t, this.ref = e, this.mask = i, this.fail = o, this.depthFail = r, this.pass = a;\n };\n\n Pt.disabled = new Pt({\n func: 519,\n mask: 0\n }, 0, 0, 7680, 7680, 7680);\n\n var St = function St(t, e, i) {\n this.blendFunction = t, this.blendColor = e, this.mask = i;\n };\n\n St.disabled = new St(St.Replace = [1, 0], t.Color.transparent, [!1, !1, !1, !1]), St.unblended = new St(St.Replace, t.Color.transparent, [!0, !0, !0, !0]), St.alphaBlended = new St([1, 771], t.Color.transparent, [!0, !0, !0, !0]);\n\n var Ct = function Ct(t, e, i) {\n this.enable = t, this.mode = e, this.frontFace = i;\n };\n\n Ct.disabled = new Ct(!1, 1029, 2305), Ct.backCCW = new Ct(!0, 1029, 2305);\n\n var zt = function zt(t) {\n this.gl = t, this.extVertexArrayObject = this.gl.getExtension("OES_vertex_array_object"), this.clearColor = new V(this), this.clearDepth = new G(this), this.clearStencil = new W(this), this.colorMask = new X(this), this.depthMask = new H(this), this.stencilMask = new K(this), this.stencilFunc = new Y(this), this.stencilOp = new J(this), this.stencilTest = new Q(this), this.depthRange = new $(this), this.depthTest = new tt(this), this.depthFunc = new et(this), this.blend = new it(this), this.blendFunc = new ot(this), this.blendColor = new rt(this), this.blendEquation = new at(this), this.cullFace = new nt(this), this.cullFaceSide = new st(this), this.frontFace = new lt(this), this.program = new ct(this), this.activeTexture = new ut(this), this.viewport = new ht(this), this.bindFramebuffer = new pt(this), this.bindRenderbuffer = new dt(this), this.bindTexture = new _t(this), this.bindVertexBuffer = new ft(this), this.bindElementBuffer = new mt(this), this.bindVertexArrayOES = this.extVertexArrayObject && new gt(this), this.pixelStoreUnpack = new vt(this), this.pixelStoreUnpackPremultiplyAlpha = new yt(this), this.pixelStoreUnpackFlipY = new xt(this), this.extTextureFilterAnisotropic = t.getExtension("EXT_texture_filter_anisotropic") || t.getExtension("MOZ_EXT_texture_filter_anisotropic") || t.getExtension("WEBKIT_EXT_texture_filter_anisotropic"), this.extTextureFilterAnisotropic && (this.extTextureFilterAnisotropicMax = t.getParameter(this.extTextureFilterAnisotropic.MAX_TEXTURE_MAX_ANISOTROPY_EXT)), this.extTextureHalfFloat = t.getExtension("OES_texture_half_float"), this.extTextureHalfFloat && (t.getExtension("OES_texture_half_float_linear"), this.extRenderToTextureHalfFloat = t.getExtension("EXT_color_buffer_half_float")), this.extTimerQuery = t.getExtension("EXT_disjoint_timer_query"), this.maxTextureSize = t.getParameter(t.MAX_TEXTURE_SIZE);\n };\n\n zt.prototype.setDefault = function () {\n this.unbindVAO(), this.clearColor.setDefault(), this.clearDepth.setDefault(), this.clearStencil.setDefault(), this.colorMask.setDefault(), this.depthMask.setDefault(), this.stencilMask.setDefault(), this.stencilFunc.setDefault(), this.stencilOp.setDefault(), this.stencilTest.setDefault(), this.depthRange.setDefault(), this.depthTest.setDefault(), this.depthFunc.setDefault(), this.blend.setDefault(), this.blendFunc.setDefault(), this.blendColor.setDefault(), this.blendEquation.setDefault(), this.cullFace.setDefault(), this.cullFaceSide.setDefault(), this.frontFace.setDefault(), this.program.setDefault(), this.activeTexture.setDefault(), this.bindFramebuffer.setDefault(), this.pixelStoreUnpack.setDefault(), this.pixelStoreUnpackPremultiplyAlpha.setDefault(), this.pixelStoreUnpackFlipY.setDefault();\n }, zt.prototype.setDirty = function () {\n this.clearColor.dirty = !0, this.clearDepth.dirty = !0, this.clearStencil.dirty = !0, this.colorMask.dirty = !0, this.depthMask.dirty = !0, this.stencilMask.dirty = !0, this.stencilFunc.dirty = !0, this.stencilOp.dirty = !0, this.stencilTest.dirty = !0, this.depthRange.dirty = !0, this.depthTest.dirty = !0, this.depthFunc.dirty = !0, this.blend.dirty = !0, this.blendFunc.dirty = !0, this.blendColor.dirty = !0, this.blendEquation.dirty = !0, this.cullFace.dirty = !0, this.cullFaceSide.dirty = !0, this.frontFace.dirty = !0, this.program.dirty = !0, this.activeTexture.dirty = !0, this.viewport.dirty = !0, this.bindFramebuffer.dirty = !0, this.bindRenderbuffer.dirty = !0, this.bindTexture.dirty = !0, this.bindVertexBuffer.dirty = !0, this.bindElementBuffer.dirty = !0, this.extVertexArrayObject && (this.bindVertexArrayOES.dirty = !0), this.pixelStoreUnpack.dirty = !0, this.pixelStoreUnpackPremultiplyAlpha.dirty = !0, this.pixelStoreUnpackFlipY.dirty = !0;\n }, zt.prototype.createIndexBuffer = function (t, e) {\n return new N(this, t, e);\n }, zt.prototype.createVertexBuffer = function (t, e, i) {\n return new q(this, t, e, i);\n }, zt.prototype.createRenderbuffer = function (t, e, i) {\n var o = this.gl,\n r = o.createRenderbuffer();\n return this.bindRenderbuffer.set(r), o.renderbufferStorage(o.RENDERBUFFER, t, e, i), this.bindRenderbuffer.set(null), r;\n }, zt.prototype.createFramebuffer = function (t, e, i) {\n return new Et(this, t, e, i);\n }, zt.prototype.clear = function (t) {\n var e = t.color,\n i = t.depth,\n o = this.gl,\n r = 0;\n e && (r |= o.COLOR_BUFFER_BIT, this.clearColor.set(e), this.colorMask.set([!0, !0, !0, !0])), void 0 !== i && (r |= o.DEPTH_BUFFER_BIT, this.depthRange.set([0, 1]), this.clearDepth.set(i), this.depthMask.set(!0)), o.clear(r);\n }, zt.prototype.setCullFace = function (t) {\n !1 === t.enable ? this.cullFace.set(!1) : (this.cullFace.set(!0), this.cullFaceSide.set(t.mode), this.frontFace.set(t.frontFace));\n }, zt.prototype.setDepthMode = function (t) {\n t.func !== this.gl.ALWAYS || t.mask ? (this.depthTest.set(!0), this.depthFunc.set(t.func), this.depthMask.set(t.mask), this.depthRange.set(t.range)) : this.depthTest.set(!1);\n }, zt.prototype.setStencilMode = function (t) {\n t.test.func !== this.gl.ALWAYS || t.mask ? (this.stencilTest.set(!0), this.stencilMask.set(t.mask), this.stencilOp.set([t.fail, t.depthFail, t.pass]), this.stencilFunc.set({\n func: t.test.func,\n ref: t.ref,\n mask: t.test.mask\n })) : this.stencilTest.set(!1);\n }, zt.prototype.setColorMode = function (e) {\n t.deepEqual(e.blendFunction, St.Replace) ? this.blend.set(!1) : (this.blend.set(!0), this.blendFunc.set(e.blendFunction), this.blendColor.set(e.blendColor)), this.colorMask.set(e.mask);\n }, zt.prototype.unbindVAO = function () {\n this.extVertexArrayObject && this.bindVertexArrayOES.set(null);\n };\n\n var Dt = function (e) {\n function i(i, o, r) {\n var a = this;\n e.call(this), this.id = i, this.dispatcher = r, this.on("data", function (t) {\n "source" === t.dataType && "metadata" === t.sourceDataType && (a._sourceLoaded = !0), a._sourceLoaded && !a._paused && "source" === t.dataType && "content" === t.sourceDataType && (a.reload(), a.transform && a.update(a.transform));\n }), this.on("error", function () {\n a._sourceErrored = !0;\n }), this._source = function (e, i, o, r) {\n var a = new k[i.type](e, i, o, r);\n if (a.id !== e) throw new Error("Expected Source id to be " + e + " instead of " + a.id);\n return t.bindAll(["load", "abort", "unload", "serialize", "prepare"], a), a;\n }(i, o, r, this), this._tiles = {}, this._cache = new U(0, this._unloadTile.bind(this)), this._timers = {}, this._cacheTimers = {}, this._maxTileCacheSize = null, this._loadedParentTiles = {}, this._coveredTiles = {}, this._state = new t.SourceFeatureState();\n }\n\n return e && (i.__proto__ = e), (i.prototype = Object.create(e && e.prototype)).constructor = i, i.prototype.onAdd = function (t) {\n this.map = t, this._maxTileCacheSize = t ? t._maxTileCacheSize : null, this._source && this._source.onAdd && this._source.onAdd(t);\n }, i.prototype.onRemove = function (t) {\n this._source && this._source.onRemove && this._source.onRemove(t);\n }, i.prototype.loaded = function () {\n if (this._sourceErrored) return !0;\n if (!this._sourceLoaded) return !1;\n if (!this._source.loaded()) return !1;\n\n for (var t in this._tiles) {\n var e = this._tiles[t];\n if ("loaded" !== e.state && "errored" !== e.state) return !1;\n }\n\n return !0;\n }, i.prototype.getSource = function () {\n return this._source;\n }, i.prototype.pause = function () {\n this._paused = !0;\n }, i.prototype.resume = function () {\n if (this._paused) {\n var t = this._shouldReloadOnResume;\n this._paused = !1, this._shouldReloadOnResume = !1, t && this.reload(), this.transform && this.update(this.transform);\n }\n }, i.prototype._loadTile = function (t, e) {\n return this._source.loadTile(t, e);\n }, i.prototype._unloadTile = function (t) {\n if (this._source.unloadTile) return this._source.unloadTile(t, function () {});\n }, i.prototype._abortTile = function (t) {\n if (this._source.abortTile) return this._source.abortTile(t, function () {});\n }, i.prototype.serialize = function () {\n return this._source.serialize();\n }, i.prototype.prepare = function (t) {\n for (var e in this._source.prepare && this._source.prepare(), this._state.coalesceChanges(this._tiles, this.map ? this.map.painter : null), this._tiles) {\n var i = this._tiles[e];\n i.upload(t), i.prepare(this.map.style.imageManager);\n }\n }, i.prototype.getIds = function () {\n return t.values(this._tiles).map(function (t) {\n return t.tileID;\n }).sort(At).map(function (t) {\n return t.key;\n });\n }, i.prototype.getRenderableIds = function (e) {\n var i = this,\n o = [];\n\n for (var r in this._tiles) {\n this._isIdRenderable(r, e) && o.push(this._tiles[r]);\n }\n\n return e ? o.sort(function (e, o) {\n var r = e.tileID,\n a = o.tileID,\n n = new t.Point(r.canonical.x, r.canonical.y)._rotate(i.transform.angle),\n s = new t.Point(a.canonical.x, a.canonical.y)._rotate(i.transform.angle);\n\n return r.overscaledZ - a.overscaledZ || s.y - n.y || s.x - n.x;\n }).map(function (t) {\n return t.tileID.key;\n }) : o.map(function (t) {\n return t.tileID;\n }).sort(At).map(function (t) {\n return t.key;\n });\n }, i.prototype.hasRenderableParent = function (t) {\n var e = this.findLoadedParent(t, 0);\n return !!e && this._isIdRenderable(e.tileID.key);\n }, i.prototype._isIdRenderable = function (t, e) {\n return this._tiles[t] && this._tiles[t].hasData() && !this._coveredTiles[t] && (e || !this._tiles[t].holdingForFade());\n }, i.prototype.reload = function () {\n if (this._paused) this._shouldReloadOnResume = !0;else for (var t in this._cache.reset(), this._tiles) {\n "errored" !== this._tiles[t].state && this._reloadTile(t, "reloading");\n }\n }, i.prototype._reloadTile = function (t, e) {\n var i = this._tiles[t];\n i && ("loading" !== i.state && (i.state = e), this._loadTile(i, this._tileLoaded.bind(this, i, t, e)));\n }, i.prototype._tileLoaded = function (e, i, o, r) {\n if (r) return e.state = "errored", void (404 !== r.status ? this._source.fire(new t.ErrorEvent(r, {\n tile: e\n })) : this.update(this.transform));\n e.timeAdded = t.browser.now(), "expired" === o && (e.refreshedUponExpiration = !0), this._setTileReloadTimer(i, e), "raster-dem" === this.getSource().type && e.dem && this._backfillDEM(e), this._state.initializeTileState(e, this.map ? this.map.painter : null), this._source.fire(new t.Event("data", {\n dataType: "source",\n tile: e,\n coord: e.tileID\n }));\n }, i.prototype._backfillDEM = function (t) {\n for (var e = this.getRenderableIds(), i = 0; i < e.length; i++) {\n var o = e[i];\n\n if (t.neighboringTiles && t.neighboringTiles[o]) {\n var r = this.getTileByID(o);\n a(t, r), a(r, t);\n }\n }\n\n function a(t, e) {\n t.needsHillshadePrepare = !0;\n var i = e.tileID.canonical.x - t.tileID.canonical.x,\n o = e.tileID.canonical.y - t.tileID.canonical.y,\n r = Math.pow(2, t.tileID.canonical.z),\n a = e.tileID.key;\n 0 === i && 0 === o || Math.abs(o) > 1 || (Math.abs(i) > 1 && (1 === Math.abs(i + r) ? i += r : 1 === Math.abs(i - r) && (i -= r)), e.dem && t.dem && (t.dem.backfillBorder(e.dem, i, o), t.neighboringTiles && t.neighboringTiles[a] && (t.neighboringTiles[a].backfilled = !0)));\n }\n }, i.prototype.getTile = function (t) {\n return this.getTileByID(t.key);\n }, i.prototype.getTileByID = function (t) {\n return this._tiles[t];\n }, i.prototype._retainLoadedChildren = function (t, e, i, o) {\n for (var r in this._tiles) {\n var a = this._tiles[r];\n\n if (!(o[r] || !a.hasData() || a.tileID.overscaledZ <= e || a.tileID.overscaledZ > i)) {\n for (var n = a.tileID; a && a.tileID.overscaledZ > e + 1;) {\n var s = a.tileID.scaledTo(a.tileID.overscaledZ - 1);\n (a = this._tiles[s.key]) && a.hasData() && (n = s);\n }\n\n for (var l = n; l.overscaledZ > e;) {\n if (t[(l = l.scaledTo(l.overscaledZ - 1)).key]) {\n o[n.key] = n;\n break;\n }\n }\n }\n }\n }, i.prototype.findLoadedParent = function (t, e) {\n if (t.key in this._loadedParentTiles) {\n var i = this._loadedParentTiles[t.key];\n return i && i.tileID.overscaledZ >= e ? i : null;\n }\n\n for (var o = t.overscaledZ - 1; o >= e; o--) {\n var r = t.scaledTo(o),\n a = this._getLoadedTile(r);\n\n if (a) return a;\n }\n }, i.prototype._getLoadedTile = function (t) {\n var e = this._tiles[t.key];\n return e && e.hasData() ? e : this._cache.getByKey(t.wrapped().key);\n }, i.prototype.updateCacheSize = function (t) {\n var e = Math.ceil(t.width / this._source.tileSize) + 1,\n i = Math.ceil(t.height / this._source.tileSize) + 1,\n o = Math.floor(e * i * 5),\n r = "number" == typeof this._maxTileCacheSize ? Math.min(this._maxTileCacheSize, o) : o;\n\n this._cache.setMaxSize(r);\n }, i.prototype.handleWrapJump = function (t) {\n var e = Math.round((t - (void 0 === this._prevLng ? t : this._prevLng)) / 360);\n\n if (this._prevLng = t, e) {\n var i = {};\n\n for (var o in this._tiles) {\n var r = this._tiles[o];\n r.tileID = r.tileID.unwrapTo(r.tileID.wrap + e), i[r.tileID.key] = r;\n }\n\n for (var a in this._tiles = i, this._timers) {\n clearTimeout(this._timers[a]), delete this._timers[a];\n }\n\n for (var n in this._tiles) {\n this._setTileReloadTimer(n, this._tiles[n]);\n }\n }\n }, i.prototype.update = function (e) {\n var o = this;\n\n if (this.transform = e, this._sourceLoaded && !this._paused) {\n var r;\n this.updateCacheSize(e), this.handleWrapJump(this.transform.center.lng), this._coveredTiles = {}, this.used ? this._source.tileID ? r = e.getVisibleUnwrappedCoordinates(this._source.tileID).map(function (e) {\n return new t.OverscaledTileID(e.canonical.z, e.wrap, e.canonical.z, e.canonical.x, e.canonical.y);\n }) : (r = e.coveringTiles({\n tileSize: this._source.tileSize,\n minzoom: this._source.minzoom,\n maxzoom: this._source.maxzoom,\n roundZoom: this._source.roundZoom,\n reparseOverscaled: this._source.reparseOverscaled\n }), this._source.hasTile && (r = r.filter(function (t) {\n return o._source.hasTile(t);\n }))) : r = [];\n\n var a = e.coveringZoomLevel(this._source),\n n = Math.max(a - i.maxOverzooming, this._source.minzoom),\n s = Math.max(a + i.maxUnderzooming, this._source.minzoom),\n l = this._updateRetainedTiles(r, a);\n\n if (Mt(this._source.type)) {\n for (var c = {}, u = {}, h = 0, p = Object.keys(l); h < p.length; h += 1) {\n var d = p[h],\n _ = l[d],\n f = this._tiles[d];\n\n if (f && !(f.fadeEndTime && f.fadeEndTime <= t.browser.now())) {\n var m = this.findLoadedParent(_, n);\n m && (this._addTile(m.tileID), c[m.tileID.key] = m.tileID), u[d] = _;\n }\n }\n\n for (var g in this._retainLoadedChildren(u, a, s, l), c) {\n l[g] || (this._coveredTiles[g] = !0, l[g] = c[g]);\n }\n }\n\n for (var v in l) {\n this._tiles[v].clearFadeHold();\n }\n\n for (var y = 0, x = t.keysDifference(this._tiles, l); y < x.length; y += 1) {\n var b = x[y],\n w = this._tiles[b];\n w.hasSymbolBuckets && !w.holdingForFade() ? w.setHoldDuration(this.map._fadeDuration) : w.hasSymbolBuckets && !w.symbolFadeFinished() || this._removeTile(b);\n }\n\n this._updateLoadedParentTileCache();\n }\n }, i.prototype.releaseSymbolFadeTiles = function () {\n for (var t in this._tiles) {\n this._tiles[t].holdingForFade() && this._removeTile(t);\n }\n }, i.prototype._updateRetainedTiles = function (t, e) {\n for (var o = {}, r = {}, a = Math.max(e - i.maxOverzooming, this._source.minzoom), n = Math.max(e + i.maxUnderzooming, this._source.minzoom), s = {}, l = 0, c = t; l < c.length; l += 1) {\n var u = c[l],\n h = this._addTile(u);\n\n o[u.key] = u, h.hasData() || e < this._source.maxzoom && (s[u.key] = u);\n }\n\n this._retainLoadedChildren(s, e, n, o);\n\n for (var p = 0, d = t; p < d.length; p += 1) {\n var _ = d[p],\n f = this._tiles[_.key];\n\n if (!f.hasData()) {\n if (e + 1 > this._source.maxzoom) {\n var m = _.children(this._source.maxzoom)[0],\n g = this.getTile(m);\n\n if (g && g.hasData()) {\n o[m.key] = m;\n continue;\n }\n } else {\n var v = _.children(this._source.maxzoom);\n\n if (o[v[0].key] && o[v[1].key] && o[v[2].key] && o[v[3].key]) continue;\n }\n\n for (var y = f.wasRequested(), x = _.overscaledZ - 1; x >= a; --x) {\n var b = _.scaledTo(x);\n\n if (r[b.key]) break;\n if (r[b.key] = !0, !(f = this.getTile(b)) && y && (f = this._addTile(b)), f && (o[b.key] = b, y = f.wasRequested(), f.hasData())) break;\n }\n }\n }\n\n return o;\n }, i.prototype._updateLoadedParentTileCache = function () {\n for (var t in this._loadedParentTiles = {}, this._tiles) {\n for (var e = [], i = void 0, o = this._tiles[t].tileID; o.overscaledZ > 0;) {\n if (o.key in this._loadedParentTiles) {\n i = this._loadedParentTiles[o.key];\n break;\n }\n\n e.push(o.key);\n var r = o.scaledTo(o.overscaledZ - 1);\n if (i = this._getLoadedTile(r)) break;\n o = r;\n }\n\n for (var a = 0, n = e; a < n.length; a += 1) {\n this._loadedParentTiles[n[a]] = i;\n }\n }\n }, i.prototype._addTile = function (e) {\n var i = this._tiles[e.key];\n if (i) return i;\n (i = this._cache.getAndRemove(e)) && (this._setTileReloadTimer(e.key, i), i.tileID = e, this._state.initializeTileState(i, this.map ? this.map.painter : null), this._cacheTimers[e.key] && (clearTimeout(this._cacheTimers[e.key]), delete this._cacheTimers[e.key], this._setTileReloadTimer(e.key, i)));\n var o = Boolean(i);\n return o || (i = new t.Tile(e, this._source.tileSize * e.overscaleFactor()), this._loadTile(i, this._tileLoaded.bind(this, i, e.key, i.state))), i ? (i.uses++, this._tiles[e.key] = i, o || this._source.fire(new t.Event("dataloading", {\n tile: i,\n coord: i.tileID,\n dataType: "source"\n })), i) : null;\n }, i.prototype._setTileReloadTimer = function (t, e) {\n var i = this;\n t in this._timers && (clearTimeout(this._timers[t]), delete this._timers[t]);\n var o = e.getExpiryTimeout();\n o && (this._timers[t] = setTimeout(function () {\n i._reloadTile(t, "expired"), delete i._timers[t];\n }, o));\n }, i.prototype._removeTile = function (t) {\n var e = this._tiles[t];\n e && (e.uses--, delete this._tiles[t], this._timers[t] && (clearTimeout(this._timers[t]), delete this._timers[t]), e.uses > 0 || (e.hasData() && "reloading" !== e.state ? this._cache.add(e.tileID, e, e.getExpiryTimeout()) : (e.aborted = !0, this._abortTile(e), this._unloadTile(e))));\n }, i.prototype.clearTiles = function () {\n for (var t in this._shouldReloadOnResume = !1, this._paused = !1, this._tiles) {\n this._removeTile(t);\n }\n\n this._cache.reset();\n }, i.prototype.tilesIn = function (e, i, o) {\n var r = this,\n a = [],\n n = this.transform;\n if (!n) return a;\n\n for (var s = o ? n.getCameraQueryGeometry(e) : e, l = e.map(function (t) {\n return n.pointCoordinate(t);\n }), c = s.map(function (t) {\n return n.pointCoordinate(t);\n }), u = this.getIds(), h = 1 / 0, p = 1 / 0, d = -1 / 0, _ = -1 / 0, f = 0, m = c; f < m.length; f += 1) {\n var g = m[f];\n h = Math.min(h, g.x), p = Math.min(p, g.y), d = Math.max(d, g.x), _ = Math.max(_, g.y);\n }\n\n for (var v = function v(e) {\n var o = r._tiles[u[e]];\n\n if (!o.holdingForFade()) {\n var s = o.tileID,\n f = Math.pow(2, n.zoom - o.tileID.overscaledZ),\n m = i * o.queryPadding * t.EXTENT / o.tileSize / f,\n g = [s.getTilePoint(new t.MercatorCoordinate(h, p)), s.getTilePoint(new t.MercatorCoordinate(d, _))];\n\n if (g[0].x - m < t.EXTENT && g[0].y - m < t.EXTENT && g[1].x + m >= 0 && g[1].y + m >= 0) {\n var v = l.map(function (t) {\n return s.getTilePoint(t);\n }),\n y = c.map(function (t) {\n return s.getTilePoint(t);\n });\n a.push({\n tile: o,\n tileID: s,\n queryGeometry: v,\n cameraQueryGeometry: y,\n scale: f\n });\n }\n }\n }, y = 0; y < u.length; y++) {\n v(y);\n }\n\n return a;\n }, i.prototype.getVisibleCoordinates = function (t) {\n for (var e = this, i = this.getRenderableIds(t).map(function (t) {\n return e._tiles[t].tileID;\n }), o = 0, r = i; o < r.length; o += 1) {\n var a = r[o];\n a.posMatrix = this.transform.calculatePosMatrix(a.toUnwrapped());\n }\n\n return i;\n }, i.prototype.hasTransition = function () {\n if (this._source.hasTransition()) return !0;\n if (Mt(this._source.type)) for (var e in this._tiles) {\n var i = this._tiles[e];\n if (void 0 !== i.fadeEndTime && i.fadeEndTime >= t.browser.now()) return !0;\n }\n return !1;\n }, i.prototype.setFeatureState = function (t, e, i) {\n this._state.updateState(t = t || "_geojsonTileLayer", e, i);\n }, i.prototype.removeFeatureState = function (t, e, i) {\n this._state.removeFeatureState(t = t || "_geojsonTileLayer", e, i);\n }, i.prototype.getFeatureState = function (t, e) {\n return this._state.getState(t = t || "_geojsonTileLayer", e);\n }, i.prototype.setDependencies = function (t, e, i) {\n var o = this._tiles[t];\n o && o.setDependencies(e, i);\n }, i.prototype.reloadTilesForDependencies = function (t, e) {\n for (var i in this._tiles) {\n this._tiles[i].hasDependency(t, e) && this._reloadTile(i, "reloading");\n }\n\n this._cache.filter(function (i) {\n return !i.hasDependency(t, e);\n });\n }, i;\n }(t.Evented);\n\n function At(t, e) {\n var i = Math.abs(2 * t.wrap) - +(t.wrap < 0),\n o = Math.abs(2 * e.wrap) - +(e.wrap < 0);\n return t.overscaledZ - e.overscaledZ || o - i || e.canonical.y - t.canonical.y || e.canonical.x - t.canonical.x;\n }\n\n function Mt(t) {\n return "raster" === t || "image" === t || "video" === t;\n }\n\n function Lt() {\n return new t.window.Worker(Kr.workerUrl);\n }\n\n Dt.maxOverzooming = 10, Dt.maxUnderzooming = 3;\n\n var Rt = "mapboxgl_preloaded_worker_pool",\n kt = function kt() {\n this.active = {};\n };\n\n kt.prototype.acquire = function (t) {\n if (!this.workers) for (this.workers = []; this.workers.length < kt.workerCount;) {\n this.workers.push(new Lt());\n }\n return this.active[t] = !0, this.workers.slice();\n }, kt.prototype.release = function (t) {\n delete this.active[t], 0 === this.numActive() && (this.workers.forEach(function (t) {\n t.terminate();\n }), this.workers = null);\n }, kt.prototype.isPreloaded = function () {\n return !!this.active[Rt];\n }, kt.prototype.numActive = function () {\n return Object.keys(this.active).length;\n };\n var Bt,\n Ot = Math.floor(t.browser.hardwareConcurrency / 2);\n\n function Ft() {\n return Bt || (Bt = new kt()), Bt;\n }\n\n function Ut(e, i) {\n var o = {};\n\n for (var r in e) {\n "ref" !== r && (o[r] = e[r]);\n }\n\n return t.refProperties.forEach(function (t) {\n t in i && (o[t] = i[t]);\n }), o;\n }\n\n function Nt(t) {\n t = t.slice();\n\n for (var e = Object.create(null), i = 0; i < t.length; i++) {\n e[t[i].id] = t[i];\n }\n\n for (var o = 0; o < t.length; o++) {\n "ref" in t[o] && (t[o] = Ut(t[o], e[t[o].ref]));\n }\n\n return t;\n }\n\n kt.workerCount = Math.max(Math.min(Ot, 6), 1);\n var Zt = {\n setStyle: "setStyle",\n addLayer: "addLayer",\n removeLayer: "removeLayer",\n setPaintProperty: "setPaintProperty",\n setLayoutProperty: "setLayoutProperty",\n setFilter: "setFilter",\n addSource: "addSource",\n removeSource: "removeSource",\n setGeoJSONSourceData: "setGeoJSONSourceData",\n setLayerZoomRange: "setLayerZoomRange",\n setLayerProperty: "setLayerProperty",\n setCenter: "setCenter",\n setZoom: "setZoom",\n setBearing: "setBearing",\n setPitch: "setPitch",\n setSprite: "setSprite",\n setGlyphs: "setGlyphs",\n setTransition: "setTransition",\n setLight: "setLight"\n };\n\n function qt(t, e, i) {\n i.push({\n command: Zt.addSource,\n args: [t, e[t]]\n });\n }\n\n function jt(t, e, i) {\n e.push({\n command: Zt.removeSource,\n args: [t]\n }), i[t] = !0;\n }\n\n function Vt(t, e, i, o) {\n jt(t, i, o), qt(t, e, i);\n }\n\n function Gt(e, i, o) {\n var r;\n\n for (r in e[o]) {\n if (e[o].hasOwnProperty(r) && "data" !== r && !t.deepEqual(e[o][r], i[o][r])) return !1;\n }\n\n for (r in i[o]) {\n if (i[o].hasOwnProperty(r) && "data" !== r && !t.deepEqual(e[o][r], i[o][r])) return !1;\n }\n\n return !0;\n }\n\n function Wt(e, i, o, r, a, n) {\n var s;\n\n for (s in i = i || {}, e = e || {}) {\n e.hasOwnProperty(s) && (t.deepEqual(e[s], i[s]) || o.push({\n command: n,\n args: [r, s, i[s], a]\n }));\n }\n\n for (s in i) {\n i.hasOwnProperty(s) && !e.hasOwnProperty(s) && (t.deepEqual(e[s], i[s]) || o.push({\n command: n,\n args: [r, s, i[s], a]\n }));\n }\n }\n\n function Xt(t) {\n return t.id;\n }\n\n function Ht(t, e) {\n return t[e.id] = e, t;\n }\n\n var Kt = function Kt(t, e) {\n this.reset(t, e);\n };\n\n Kt.prototype.reset = function (t, e) {\n this.points = t || [], this._distances = [0];\n\n for (var i = 1; i < this.points.length; i++) {\n this._distances[i] = this._distances[i - 1] + this.points[i].dist(this.points[i - 1]);\n }\n\n this.length = this._distances[this._distances.length - 1], this.padding = Math.min(e || 0, .5 * this.length), this.paddedLength = this.length - 2 * this.padding;\n }, Kt.prototype.lerp = function (e) {\n if (1 === this.points.length) return this.points[0];\n e = t.clamp(e, 0, 1);\n\n for (var i = 1, o = this._distances[i], r = e * this.paddedLength + this.padding; o < r && i < this._distances.length;) {\n o = this._distances[++i];\n }\n\n var a = i - 1,\n n = this._distances[a],\n s = o - n,\n l = s > 0 ? (r - n) / s : 0;\n return this.points[a].mult(1 - l).add(this.points[i].mult(l));\n };\n\n var Yt = function Yt(t, e, i) {\n var o = this.boxCells = [],\n r = this.circleCells = [];\n this.xCellCount = Math.ceil(t / i), this.yCellCount = Math.ceil(e / i);\n\n for (var a = 0; a < this.xCellCount * this.yCellCount; a++) {\n o.push([]), r.push([]);\n }\n\n this.circleKeys = [], this.boxKeys = [], this.bboxes = [], this.circles = [], this.width = t, this.height = e, this.xScale = this.xCellCount / t, this.yScale = this.yCellCount / e, this.boxUid = 0, this.circleUid = 0;\n };\n\n function Jt(e, i, o, r, a) {\n var n = t.create();\n return i ? (t.scale(n, n, [1 / a, 1 / a, 1]), o || t.rotateZ(n, n, r.angle)) : t.multiply(n, r.labelPlaneMatrix, e), n;\n }\n\n function Qt(e, i, o, r, a) {\n if (i) {\n var n = t.clone(e);\n return t.scale(n, n, [a, a, 1]), o || t.rotateZ(n, n, -r.angle), n;\n }\n\n return r.glCoordMatrix;\n }\n\n function $t(e, i) {\n var o = [e.x, e.y, 0, 1];\n ue(o, o, i);\n var r = o[3];\n return {\n point: new t.Point(o[0] / r, o[1] / r),\n signedDistanceFromCamera: r\n };\n }\n\n function te(t, e) {\n return .5 + t / e * .5;\n }\n\n function ee(t, e) {\n var i = t[0] / t[3],\n o = t[1] / t[3];\n return i >= -e[0] && i <= e[0] && o >= -e[1] && o <= e[1];\n }\n\n function ie(e, i, o, r, a, n, s, l) {\n var c = r ? e.textSizeData : e.iconSizeData,\n u = t.evaluateSizeForZoom(c, o.transform.zoom),\n h = [256 / o.width * 2 + 1, 256 / o.height * 2 + 1],\n p = r ? e.text.dynamicLayoutVertexArray : e.icon.dynamicLayoutVertexArray;\n p.clear();\n\n for (var d = e.lineVertexArray, _ = r ? e.text.placedSymbolArray : e.icon.placedSymbolArray, f = o.transform.width / o.transform.height, m = !1, g = 0; g < _.length; g++) {\n var v = _.get(g);\n\n if (v.hidden || v.writingMode === t.WritingMode.vertical && !m) ce(v.numGlyphs, p);else {\n m = !1;\n var y = [v.anchorX, v.anchorY, 0, 1];\n\n if (t.transformMat4(y, y, i), ee(y, h)) {\n var x = te(o.transform.cameraToCenterDistance, y[3]),\n b = t.evaluateSizeForFeature(c, u, v),\n w = s ? b / x : b * x,\n T = new t.Point(v.anchorX, v.anchorY),\n E = $t(T, a).point,\n I = {},\n P = ae(v, w, !1, l, i, a, n, e.glyphOffsetArray, d, p, E, T, I, f);\n m = P.useVertical, (P.notEnoughRoom || m || P.needsFlipping && ae(v, w, !0, l, i, a, n, e.glyphOffsetArray, d, p, E, T, I, f).notEnoughRoom) && ce(v.numGlyphs, p);\n } else ce(v.numGlyphs, p);\n }\n }\n\n r ? e.text.dynamicLayoutVertexBuffer.updateData(p) : e.icon.dynamicLayoutVertexBuffer.updateData(p);\n }\n\n function oe(t, e, i, o, r, a, n, s, l, c, u) {\n var h = s.glyphStartIndex + s.numGlyphs,\n p = s.lineStartIndex,\n d = s.lineStartIndex + s.lineLength,\n _ = e.getoffsetX(s.glyphStartIndex),\n f = e.getoffsetX(h - 1),\n m = se(t * _, i, o, r, a, n, s.segment, p, d, l, c, u);\n\n if (!m) return null;\n var g = se(t * f, i, o, r, a, n, s.segment, p, d, l, c, u);\n return g ? {\n first: m,\n last: g\n } : null;\n }\n\n function re(e, i, o, r) {\n return e === t.WritingMode.horizontal && Math.abs(o.y - i.y) > Math.abs(o.x - i.x) * r ? {\n useVertical: !0\n } : (e === t.WritingMode.vertical ? i.y < o.y : i.x > o.x) ? {\n needsFlipping: !0\n } : null;\n }\n\n function ae(e, i, o, r, a, n, s, l, c, u, h, p, d, _) {\n var f,\n m = i / 24,\n g = e.lineOffsetX * m,\n v = e.lineOffsetY * m;\n\n if (e.numGlyphs > 1) {\n var y = e.glyphStartIndex + e.numGlyphs,\n x = e.lineStartIndex,\n b = e.lineStartIndex + e.lineLength,\n w = oe(m, l, g, v, o, h, p, e, c, n, d);\n if (!w) return {\n notEnoughRoom: !0\n };\n var T = $t(w.first.point, s).point,\n E = $t(w.last.point, s).point;\n\n if (r && !o) {\n var I = re(e.writingMode, T, E, _);\n if (I) return I;\n }\n\n f = [w.first];\n\n for (var P = e.glyphStartIndex + 1; P < y - 1; P++) {\n f.push(se(m * l.getoffsetX(P), g, v, o, h, p, e.segment, x, b, c, n, d));\n }\n\n f.push(w.last);\n } else {\n if (r && !o) {\n var S = $t(p, a).point,\n C = e.lineStartIndex + e.segment + 1,\n z = new t.Point(c.getx(C), c.gety(C)),\n D = $t(z, a),\n A = D.signedDistanceFromCamera > 0 ? D.point : ne(p, z, S, 1, a),\n M = re(e.writingMode, S, A, _);\n if (M) return M;\n }\n\n var L = se(m * l.getoffsetX(e.glyphStartIndex), g, v, o, h, p, e.segment, e.lineStartIndex, e.lineStartIndex + e.lineLength, c, n, d);\n if (!L) return {\n notEnoughRoom: !0\n };\n f = [L];\n }\n\n for (var R = 0, k = f; R < k.length; R += 1) {\n var B = k[R];\n t.addDynamicAttributes(u, B.point, B.angle);\n }\n\n return {};\n }\n\n function ne(t, e, i, o, r) {\n var a = $t(t.add(t.sub(e)._unit()), r).point,\n n = i.sub(a);\n return i.add(n._mult(o / n.mag()));\n }\n\n function se(e, i, o, r, a, n, s, l, c, u, h, p) {\n var d = r ? e - i : e + i,\n _ = d > 0 ? 1 : -1,\n f = 0;\n\n r && (_ *= -1, f = Math.PI), _ < 0 && (f += Math.PI);\n\n for (var m = _ > 0 ? l + s : l + s + 1, g = a, v = a, y = 0, x = 0, b = Math.abs(d), w = []; y + x <= b;) {\n if ((m += _) < l || m >= c) return null;\n\n if (v = g, w.push(g), void 0 === (g = p[m])) {\n var T = new t.Point(u.getx(m), u.gety(m)),\n E = $t(T, h);\n if (E.signedDistanceFromCamera > 0) g = p[m] = E.point;else {\n var I = m - _;\n g = ne(0 === y ? n : new t.Point(u.getx(I), u.gety(I)), T, v, b - y + 1, h);\n }\n }\n\n y += x, x = v.dist(g);\n }\n\n var P = (b - y) / x,\n S = g.sub(v),\n C = S.mult(P)._add(v);\n\n C._add(S._unit()._perp()._mult(o * _));\n\n var z = f + Math.atan2(g.y - v.y, g.x - v.x);\n return w.push(C), {\n point: C,\n angle: z,\n path: w\n };\n }\n\n Yt.prototype.keysLength = function () {\n return this.boxKeys.length + this.circleKeys.length;\n }, Yt.prototype.insert = function (t, e, i, o, r) {\n this._forEachCell(e, i, o, r, this._insertBoxCell, this.boxUid++), this.boxKeys.push(t), this.bboxes.push(e), this.bboxes.push(i), this.bboxes.push(o), this.bboxes.push(r);\n }, Yt.prototype.insertCircle = function (t, e, i, o) {\n this._forEachCell(e - o, i - o, e + o, i + o, this._insertCircleCell, this.circleUid++), this.circleKeys.push(t), this.circles.push(e), this.circles.push(i), this.circles.push(o);\n }, Yt.prototype._insertBoxCell = function (t, e, i, o, r, a) {\n this.boxCells[r].push(a);\n }, Yt.prototype._insertCircleCell = function (t, e, i, o, r, a) {\n this.circleCells[r].push(a);\n }, Yt.prototype._query = function (t, e, i, o, r, a) {\n if (i < 0 || t > this.width || o < 0 || e > this.height) return !r && [];\n var n = [];\n\n if (t <= 0 && e <= 0 && this.width <= i && this.height <= o) {\n if (r) return !0;\n\n for (var s = 0; s < this.boxKeys.length; s++) {\n n.push({\n key: this.boxKeys[s],\n x1: this.bboxes[4 * s],\n y1: this.bboxes[4 * s + 1],\n x2: this.bboxes[4 * s + 2],\n y2: this.bboxes[4 * s + 3]\n });\n }\n\n for (var l = 0; l < this.circleKeys.length; l++) {\n var c = this.circles[3 * l],\n u = this.circles[3 * l + 1],\n h = this.circles[3 * l + 2];\n n.push({\n key: this.circleKeys[l],\n x1: c - h,\n y1: u - h,\n x2: c + h,\n y2: u + h\n });\n }\n\n return a ? n.filter(a) : n;\n }\n\n return this._forEachCell(t, e, i, o, this._queryCell, n, {\n hitTest: r,\n seenUids: {\n box: {},\n circle: {}\n }\n }, a), r ? n.length > 0 : n;\n }, Yt.prototype._queryCircle = function (t, e, i, o, r) {\n var a = t - i,\n n = t + i,\n s = e - i,\n l = e + i;\n if (n < 0 || a > this.width || l < 0 || s > this.height) return !o && [];\n var c = [];\n return this._forEachCell(a, s, n, l, this._queryCellCircle, c, {\n hitTest: o,\n circle: {\n x: t,\n y: e,\n radius: i\n },\n seenUids: {\n box: {},\n circle: {}\n }\n }, r), o ? c.length > 0 : c;\n }, Yt.prototype.query = function (t, e, i, o, r) {\n return this._query(t, e, i, o, !1, r);\n }, Yt.prototype.hitTest = function (t, e, i, o, r) {\n return this._query(t, e, i, o, !0, r);\n }, Yt.prototype.hitTestCircle = function (t, e, i, o) {\n return this._queryCircle(t, e, i, !0, o);\n }, Yt.prototype._queryCell = function (t, e, i, o, r, a, n, s) {\n var l = n.seenUids,\n c = this.boxCells[r];\n if (null !== c) for (var u = this.bboxes, h = 0, p = c; h < p.length; h += 1) {\n var d = p[h];\n\n if (!l.box[d]) {\n l.box[d] = !0;\n\n var _ = 4 * d;\n\n if (t <= u[_ + 2] && e <= u[_ + 3] && i >= u[_ + 0] && o >= u[_ + 1] && (!s || s(this.boxKeys[d]))) {\n if (n.hitTest) return a.push(!0), !0;\n a.push({\n key: this.boxKeys[d],\n x1: u[_],\n y1: u[_ + 1],\n x2: u[_ + 2],\n y2: u[_ + 3]\n });\n }\n }\n }\n var f = this.circleCells[r];\n if (null !== f) for (var m = this.circles, g = 0, v = f; g < v.length; g += 1) {\n var y = v[g];\n\n if (!l.circle[y]) {\n l.circle[y] = !0;\n var x = 3 * y;\n\n if (this._circleAndRectCollide(m[x], m[x + 1], m[x + 2], t, e, i, o) && (!s || s(this.circleKeys[y]))) {\n if (n.hitTest) return a.push(!0), !0;\n var b = m[x],\n w = m[x + 1],\n T = m[x + 2];\n a.push({\n key: this.circleKeys[y],\n x1: b - T,\n y1: w - T,\n x2: b + T,\n y2: w + T\n });\n }\n }\n }\n }, Yt.prototype._queryCellCircle = function (t, e, i, o, r, a, n, s) {\n var l = n.circle,\n c = n.seenUids,\n u = this.boxCells[r];\n if (null !== u) for (var h = this.bboxes, p = 0, d = u; p < d.length; p += 1) {\n var _ = d[p];\n\n if (!c.box[_]) {\n c.box[_] = !0;\n var f = 4 * _;\n if (this._circleAndRectCollide(l.x, l.y, l.radius, h[f + 0], h[f + 1], h[f + 2], h[f + 3]) && (!s || s(this.boxKeys[_]))) return a.push(!0), !0;\n }\n }\n var m = this.circleCells[r];\n if (null !== m) for (var g = this.circles, v = 0, y = m; v < y.length; v += 1) {\n var x = y[v];\n\n if (!c.circle[x]) {\n c.circle[x] = !0;\n var b = 3 * x;\n if (this._circlesCollide(g[b], g[b + 1], g[b + 2], l.x, l.y, l.radius) && (!s || s(this.circleKeys[x]))) return a.push(!0), !0;\n }\n }\n }, Yt.prototype._forEachCell = function (t, e, i, o, r, a, n, s) {\n for (var l = this._convertToXCellCoord(t), c = this._convertToYCellCoord(e), u = this._convertToXCellCoord(i), h = this._convertToYCellCoord(o), p = l; p <= u; p++) {\n for (var d = c; d <= h; d++) {\n if (r.call(this, t, e, i, o, this.xCellCount * d + p, a, n, s)) return;\n }\n }\n }, Yt.prototype._convertToXCellCoord = function (t) {\n return Math.max(0, Math.min(this.xCellCount - 1, Math.floor(t * this.xScale)));\n }, Yt.prototype._convertToYCellCoord = function (t) {\n return Math.max(0, Math.min(this.yCellCount - 1, Math.floor(t * this.yScale)));\n }, Yt.prototype._circlesCollide = function (t, e, i, o, r, a) {\n var n = o - t,\n s = r - e,\n l = i + a;\n return l * l > n * n + s * s;\n }, Yt.prototype._circleAndRectCollide = function (t, e, i, o, r, a, n) {\n var s = (a - o) / 2,\n l = Math.abs(t - (o + s));\n if (l > s + i) return !1;\n var c = (n - r) / 2,\n u = Math.abs(e - (r + c));\n if (u > c + i) return !1;\n if (l <= s || u <= c) return !0;\n var h = l - s,\n p = u - c;\n return h * h + p * p <= i * i;\n };\n var le = new Float32Array([-1 / 0, -1 / 0, 0, -1 / 0, -1 / 0, 0, -1 / 0, -1 / 0, 0, -1 / 0, -1 / 0, 0]);\n\n function ce(t, e) {\n for (var i = 0; i < t; i++) {\n var o = e.length;\n e.resize(o + 4), e.float32.set(le, 3 * o);\n }\n }\n\n function ue(t, e, i) {\n var o = e[0],\n r = e[1];\n return t[0] = i[0] * o + i[4] * r + i[12], t[1] = i[1] * o + i[5] * r + i[13], t[3] = i[3] * o + i[7] * r + i[15], t;\n }\n\n var he = function he(t, e, i) {\n void 0 === e && (e = new Yt(t.width + 200, t.height + 200, 25)), void 0 === i && (i = new Yt(t.width + 200, t.height + 200, 25)), this.transform = t, this.grid = e, this.ignoredGrid = i, this.pitchfactor = Math.cos(t._pitch) * t.cameraToCenterDistance, this.screenRightBoundary = t.width + 100, this.screenBottomBoundary = t.height + 100, this.gridRightBoundary = t.width + 200, this.gridBottomBoundary = t.height + 200;\n };\n\n function pe(e, i, o) {\n return i * (t.EXTENT / (e.tileSize * Math.pow(2, o - e.tileID.overscaledZ)));\n }\n\n he.prototype.placeCollisionBox = function (t, e, i, o, r) {\n var a = this.projectAndGetPerspectiveRatio(o, t.anchorPointX, t.anchorPointY),\n n = i * a.perspectiveRatio,\n s = t.x1 * n + a.point.x,\n l = t.y1 * n + a.point.y,\n c = t.x2 * n + a.point.x,\n u = t.y2 * n + a.point.y;\n return !this.isInsideGrid(s, l, c, u) || !e && this.grid.hitTest(s, l, c, u, r) ? {\n box: [],\n offscreen: !1\n } : {\n box: [s, l, c, u],\n offscreen: this.isOffscreen(s, l, c, u)\n };\n }, he.prototype.placeCollisionCircles = function (e, i, o, r, a, n, s, l, c, u, h, p, d) {\n var _ = [],\n f = new t.Point(i.anchorX, i.anchorY),\n m = $t(f, n),\n g = te(this.transform.cameraToCenterDistance, m.signedDistanceFromCamera),\n v = (u ? a / g : a * g) / t.ONE_EM,\n y = $t(f, s).point,\n x = oe(v, r, i.lineOffsetX * v, i.lineOffsetY * v, !1, y, f, i, o, s, {}),\n b = !1,\n w = !1,\n T = !0;\n\n if (x) {\n for (var E = .5 * p * g + d, I = new t.Point(-100, -100), P = new t.Point(this.screenRightBoundary, this.screenBottomBoundary), S = new Kt(), C = x.first, z = x.last, D = [], A = C.path.length - 1; A >= 1; A--) {\n D.push(C.path[A]);\n }\n\n for (var M = 1; M < z.path.length; M++) {\n D.push(z.path[M]);\n }\n\n var L = 2.5 * E;\n\n if (l) {\n var R = D.map(function (t) {\n return $t(t, l);\n });\n D = R.some(function (t) {\n return t.signedDistanceFromCamera <= 0;\n }) ? [] : R.map(function (t) {\n return t.point;\n });\n }\n\n var k = [];\n\n if (D.length > 0) {\n for (var B = D[0].clone(), O = D[0].clone(), F = 1; F < D.length; F++) {\n B.x = Math.min(B.x, D[F].x), B.y = Math.min(B.y, D[F].y), O.x = Math.max(O.x, D[F].x), O.y = Math.max(O.y, D[F].y);\n }\n\n k = B.x >= I.x && O.x <= P.x && B.y >= I.y && O.y <= P.y ? [D] : O.x < I.x || B.x > P.x || O.y < I.y || B.y > P.y ? [] : t.clipLine([D], I.x, I.y, P.x, P.y);\n }\n\n for (var U = 0, N = k; U < N.length; U += 1) {\n var Z;\n S.reset(N[U], .25 * E), Z = S.length <= .5 * E ? 1 : Math.ceil(S.paddedLength / L) + 1;\n\n for (var q = 0; q < Z; q++) {\n var j = q / Math.max(Z - 1, 1),\n V = S.lerp(j),\n G = V.x + 100,\n W = V.y + 100;\n\n _.push(G, W, E, 0);\n\n var X = G - E,\n H = W - E,\n K = G + E,\n Y = W + E;\n if (T = T && this.isOffscreen(X, H, K, Y), w = w || this.isInsideGrid(X, H, K, Y), !e && this.grid.hitTestCircle(G, W, E, h) && (b = !0, !c)) return {\n circles: [],\n offscreen: !1,\n collisionDetected: b\n };\n }\n }\n }\n\n return {\n circles: !c && b || !w ? [] : _,\n offscreen: T,\n collisionDetected: b\n };\n }, he.prototype.queryRenderedSymbols = function (e) {\n if (0 === e.length || 0 === this.grid.keysLength() && 0 === this.ignoredGrid.keysLength()) return {};\n\n for (var i = [], o = 1 / 0, r = 1 / 0, a = -1 / 0, n = -1 / 0, s = 0, l = e; s < l.length; s += 1) {\n var c = l[s],\n u = new t.Point(c.x + 100, c.y + 100);\n o = Math.min(o, u.x), r = Math.min(r, u.y), a = Math.max(a, u.x), n = Math.max(n, u.y), i.push(u);\n }\n\n for (var h = {}, p = {}, d = 0, _ = this.grid.query(o, r, a, n).concat(this.ignoredGrid.query(o, r, a, n)); d < _.length; d += 1) {\n var f = _[d],\n m = f.key;\n\n if (void 0 === h[m.bucketInstanceId] && (h[m.bucketInstanceId] = {}), !h[m.bucketInstanceId][m.featureIndex]) {\n var g = [new t.Point(f.x1, f.y1), new t.Point(f.x2, f.y1), new t.Point(f.x2, f.y2), new t.Point(f.x1, f.y2)];\n t.polygonIntersectsPolygon(i, g) && (h[m.bucketInstanceId][m.featureIndex] = !0, void 0 === p[m.bucketInstanceId] && (p[m.bucketInstanceId] = []), p[m.bucketInstanceId].push(m.featureIndex));\n }\n }\n\n return p;\n }, he.prototype.insertCollisionBox = function (t, e, i, o, r) {\n (e ? this.ignoredGrid : this.grid).insert({\n bucketInstanceId: i,\n featureIndex: o,\n collisionGroupID: r\n }, t[0], t[1], t[2], t[3]);\n }, he.prototype.insertCollisionCircles = function (t, e, i, o, r) {\n for (var a = e ? this.ignoredGrid : this.grid, n = {\n bucketInstanceId: i,\n featureIndex: o,\n collisionGroupID: r\n }, s = 0; s < t.length; s += 4) {\n a.insertCircle(n, t[s], t[s + 1], t[s + 2]);\n }\n }, he.prototype.projectAndGetPerspectiveRatio = function (e, i, o) {\n var r = [i, o, 0, 1];\n return ue(r, r, e), {\n point: new t.Point((r[0] / r[3] + 1) / 2 * this.transform.width + 100, (-r[1] / r[3] + 1) / 2 * this.transform.height + 100),\n perspectiveRatio: .5 + this.transform.cameraToCenterDistance / r[3] * .5\n };\n }, he.prototype.isOffscreen = function (t, e, i, o) {\n return i < 100 || t >= this.screenRightBoundary || o < 100 || e > this.screenBottomBoundary;\n }, he.prototype.isInsideGrid = function (t, e, i, o) {\n return i >= 0 && t < this.gridRightBoundary && o >= 0 && e < this.gridBottomBoundary;\n }, he.prototype.getViewportMatrix = function () {\n var e = t.identity([]);\n return t.translate(e, e, [-100, -100, 0]), e;\n };\n\n var de = function de(t, e, i, o) {\n this.opacity = t ? Math.max(0, Math.min(1, t.opacity + (t.placed ? e : -e))) : o && i ? 1 : 0, this.placed = i;\n };\n\n de.prototype.isHidden = function () {\n return 0 === this.opacity && !this.placed;\n };\n\n var _e = function _e(t, e, i, o, r) {\n this.text = new de(t ? t.text : null, e, i, r), this.icon = new de(t ? t.icon : null, e, o, r);\n };\n\n _e.prototype.isHidden = function () {\n return this.text.isHidden() && this.icon.isHidden();\n };\n\n var fe = function fe(t, e, i) {\n this.text = t, this.icon = e, this.skipFade = i;\n },\n me = function me() {\n this.invProjMatrix = t.create(), this.viewportMatrix = t.create(), this.circles = [];\n },\n ge = function ge(t, e, i, o, r) {\n this.bucketInstanceId = t, this.featureIndex = e, this.sourceLayerIndex = i, this.bucketIndex = o, this.tileID = r;\n },\n ve = function ve(t) {\n this.crossSourceCollisions = t, this.maxGroupID = 0, this.collisionGroups = {};\n };\n\n function ye(e, i, o, r, a) {\n var n = t.getAnchorAlignment(e),\n s = -(n.horizontalAlign - .5) * i,\n l = -(n.verticalAlign - .5) * o,\n c = t.evaluateVariableOffset(e, r);\n return new t.Point(s + c[0] * a, l + c[1] * a);\n }\n\n function xe(e, i, o, r, a, n) {\n var s = e.x1,\n l = e.x2,\n c = e.y1,\n u = e.y2,\n h = e.anchorPointX,\n p = e.anchorPointY,\n d = new t.Point(i, o);\n return r && d._rotate(a ? n : -n), {\n x1: s + d.x,\n y1: c + d.y,\n x2: l + d.x,\n y2: u + d.y,\n anchorPointX: h,\n anchorPointY: p\n };\n }\n\n ve.prototype.get = function (t) {\n if (this.crossSourceCollisions) return {\n ID: 0,\n predicate: null\n };\n\n if (!this.collisionGroups[t]) {\n var e = ++this.maxGroupID;\n this.collisionGroups[t] = {\n ID: e,\n predicate: function predicate(t) {\n return t.collisionGroupID === e;\n }\n };\n }\n\n return this.collisionGroups[t];\n };\n\n var be = function be(t, e, i, o) {\n this.transform = t.clone(), this.collisionIndex = new he(this.transform), this.placements = {}, this.opacities = {}, this.variableOffsets = {}, this.stale = !1, this.commitTime = 0, this.fadeDuration = e, this.retainedQueryData = {}, this.collisionGroups = new ve(i), this.collisionCircleArrays = {}, this.prevPlacement = o, o && (o.prevPlacement = void 0), this.placedOrientations = {};\n };\n\n function we(t, e, i, o, r) {\n t.emplaceBack(e ? 1 : 0, i ? 1 : 0, o || 0, r || 0), t.emplaceBack(e ? 1 : 0, i ? 1 : 0, o || 0, r || 0), t.emplaceBack(e ? 1 : 0, i ? 1 : 0, o || 0, r || 0), t.emplaceBack(e ? 1 : 0, i ? 1 : 0, o || 0, r || 0);\n }\n\n be.prototype.getBucketParts = function (e, i, o, r) {\n var a = o.getBucket(i),\n n = o.latestFeatureIndex;\n\n if (a && n && i.id === a.layerIds[0]) {\n var s = o.collisionBoxArray,\n l = a.layers[0].layout,\n c = Math.pow(2, this.transform.zoom - o.tileID.overscaledZ),\n u = o.tileSize / t.EXTENT,\n h = this.transform.calculatePosMatrix(o.tileID.toUnwrapped()),\n p = "map" === l.get("text-pitch-alignment"),\n d = "map" === l.get("text-rotation-alignment"),\n _ = pe(o, 1, this.transform.zoom),\n f = Jt(h, p, d, this.transform, _),\n m = null;\n\n if (p) {\n var g = Qt(h, p, d, this.transform, _);\n m = t.multiply([], this.transform.labelPlaneMatrix, g);\n }\n\n this.retainedQueryData[a.bucketInstanceId] = new ge(a.bucketInstanceId, n, a.sourceLayerIndex, a.index, o.tileID);\n var v = {\n bucket: a,\n layout: l,\n posMatrix: h,\n textLabelPlaneMatrix: f,\n labelToScreenMatrix: m,\n scale: c,\n textPixelRatio: u,\n holdingForFade: o.holdingForFade(),\n collisionBoxArray: s,\n partiallyEvaluatedTextSize: t.evaluateSizeForZoom(a.textSizeData, this.transform.zoom),\n collisionGroup: this.collisionGroups.get(a.sourceID)\n };\n if (r) for (var y = 0, x = a.sortKeyRanges; y < x.length; y += 1) {\n var b = x[y];\n e.push({\n sortKey: b.sortKey,\n symbolInstanceStart: b.symbolInstanceStart,\n symbolInstanceEnd: b.symbolInstanceEnd,\n parameters: v\n });\n } else e.push({\n symbolInstanceStart: 0,\n symbolInstanceEnd: a.symbolInstances.length,\n parameters: v\n });\n }\n }, be.prototype.attemptAnchorPlacement = function (t, e, i, o, r, a, n, s, l, c, u, h, p, d, _) {\n var f,\n m = [h.textOffset0, h.textOffset1],\n g = ye(t, i, o, m, r),\n v = this.collisionIndex.placeCollisionBox(xe(e, g.x, g.y, a, n, this.transform.angle), u, s, l, c.predicate);\n if (!_ || 0 !== this.collisionIndex.placeCollisionBox(xe(_, g.x, g.y, a, n, this.transform.angle), u, s, l, c.predicate).box.length) return v.box.length > 0 ? (this.prevPlacement && this.prevPlacement.variableOffsets[h.crossTileID] && this.prevPlacement.placements[h.crossTileID] && this.prevPlacement.placements[h.crossTileID].text && (f = this.prevPlacement.variableOffsets[h.crossTileID].anchor), this.variableOffsets[h.crossTileID] = {\n textOffset: m,\n width: i,\n height: o,\n anchor: t,\n textBoxScale: r,\n prevAnchor: f\n }, this.markUsedJustification(p, t, h, d), p.allowVerticalPlacement && (this.markUsedOrientation(p, d, h), this.placedOrientations[h.crossTileID] = d), {\n shift: g,\n placedGlyphBoxes: v\n }) : void 0;\n }, be.prototype.placeLayerBucketPart = function (e, i, o) {\n var r = this,\n a = e.parameters,\n n = a.bucket,\n s = a.layout,\n l = a.posMatrix,\n c = a.textLabelPlaneMatrix,\n u = a.labelToScreenMatrix,\n h = a.textPixelRatio,\n p = a.holdingForFade,\n d = a.collisionBoxArray,\n _ = a.partiallyEvaluatedTextSize,\n f = a.collisionGroup,\n m = s.get("text-optional"),\n g = s.get("icon-optional"),\n v = s.get("text-allow-overlap"),\n y = s.get("icon-allow-overlap"),\n x = "map" === s.get("text-rotation-alignment"),\n b = "map" === s.get("text-pitch-alignment"),\n w = "none" !== s.get("icon-text-fit"),\n T = "viewport-y" === s.get("symbol-z-order"),\n E = v && (y || !n.hasIconData() || g),\n I = y && (v || !n.hasTextData() || m);\n !n.collisionArrays && d && n.deserializeCollisionBoxes(d);\n\n var P = function P(e, a) {\n if (!i[e.crossTileID]) if (p) r.placements[e.crossTileID] = new fe(!1, !1, !1);else {\n var d,\n T = !1,\n P = !1,\n S = !0,\n C = null,\n z = {\n box: null,\n offscreen: null\n },\n D = {\n box: null,\n offscreen: null\n },\n A = null,\n M = null,\n L = 0,\n R = 0,\n k = 0;\n a.textFeatureIndex ? L = a.textFeatureIndex : e.useRuntimeCollisionCircles && (L = e.featureIndex), a.verticalTextFeatureIndex && (R = a.verticalTextFeatureIndex);\n var B = a.textBox;\n\n if (B) {\n var O = function O(i) {\n var o = t.WritingMode.horizontal;\n\n if (n.allowVerticalPlacement && !i && r.prevPlacement) {\n var a = r.prevPlacement.placedOrientations[e.crossTileID];\n a && (r.placedOrientations[e.crossTileID] = a, r.markUsedOrientation(n, o = a, e));\n }\n\n return o;\n },\n F = function F(i, o) {\n if (n.allowVerticalPlacement && e.numVerticalGlyphVertices > 0 && a.verticalTextBox) for (var r = 0, s = n.writingModes; r < s.length && (s[r] === t.WritingMode.vertical ? (z = o(), D = z) : z = i(), !(z && z.box && z.box.length)); r += 1) {\n ;\n } else z = i();\n };\n\n if (s.get("text-variable-anchor")) {\n var U = s.get("text-variable-anchor");\n\n if (r.prevPlacement && r.prevPlacement.variableOffsets[e.crossTileID]) {\n var N = r.prevPlacement.variableOffsets[e.crossTileID];\n U.indexOf(N.anchor) > 0 && (U = U.filter(function (t) {\n return t !== N.anchor;\n })).unshift(N.anchor);\n }\n\n var Z = function Z(t, i, o) {\n for (var a = t.x2 - t.x1, s = t.y2 - t.y1, c = e.textBoxScale, u = w && !y ? i : null, p = {\n box: [],\n offscreen: !1\n }, d = v ? 2 * U.length : U.length, _ = 0; _ < d; ++_) {\n var m = r.attemptAnchorPlacement(U[_ % U.length], t, a, s, c, x, b, h, l, f, _ >= U.length, e, n, o, u);\n\n if (m && (p = m.placedGlyphBoxes) && p.box && p.box.length) {\n T = !0, C = m.shift;\n break;\n }\n }\n\n return p;\n };\n\n F(function () {\n return Z(B, a.iconBox, t.WritingMode.horizontal);\n }, function () {\n var i = a.verticalTextBox;\n return n.allowVerticalPlacement && !(z && z.box && z.box.length) && e.numVerticalGlyphVertices > 0 && i ? Z(i, a.verticalIconBox, t.WritingMode.vertical) : {\n box: null,\n offscreen: null\n };\n }), z && (T = z.box, S = z.offscreen);\n var q = O(z && z.box);\n\n if (!T && r.prevPlacement) {\n var j = r.prevPlacement.variableOffsets[e.crossTileID];\n j && (r.variableOffsets[e.crossTileID] = j, r.markUsedJustification(n, j.anchor, e, q));\n }\n } else {\n var V = function V(t, i) {\n var o = r.collisionIndex.placeCollisionBox(t, v, h, l, f.predicate);\n return o && o.box && o.box.length && (r.markUsedOrientation(n, i, e), r.placedOrientations[e.crossTileID] = i), o;\n };\n\n F(function () {\n return V(B, t.WritingMode.horizontal);\n }, function () {\n var i = a.verticalTextBox;\n return n.allowVerticalPlacement && e.numVerticalGlyphVertices > 0 && i ? V(i, t.WritingMode.vertical) : {\n box: null,\n offscreen: null\n };\n }), O(z && z.box && z.box.length);\n }\n }\n\n if (T = (d = z) && d.box && d.box.length > 0, S = d && d.offscreen, e.useRuntimeCollisionCircles) {\n var G = n.text.placedSymbolArray.get(e.centerJustifiedTextSymbolIndex),\n W = t.evaluateSizeForFeature(n.textSizeData, _, G),\n X = s.get("text-padding");\n A = r.collisionIndex.placeCollisionCircles(v, G, n.lineVertexArray, n.glyphOffsetArray, W, l, c, u, o, b, f.predicate, e.collisionCircleDiameter, X), T = v || A.circles.length > 0 && !A.collisionDetected, S = S && A.offscreen;\n }\n\n if (a.iconFeatureIndex && (k = a.iconFeatureIndex), a.iconBox) {\n var H = function H(t) {\n var e = w && C ? xe(t, C.x, C.y, x, b, r.transform.angle) : t;\n return r.collisionIndex.placeCollisionBox(e, y, h, l, f.predicate);\n };\n\n P = D && D.box && D.box.length && a.verticalIconBox ? (M = H(a.verticalIconBox)).box.length > 0 : (M = H(a.iconBox)).box.length > 0, S = S && M.offscreen;\n }\n\n var K = m || 0 === e.numHorizontalGlyphVertices && 0 === e.numVerticalGlyphVertices,\n Y = g || 0 === e.numIconVertices;\n\n if (K || Y ? Y ? K || (P = P && T) : T = P && T : P = T = P && T, T && d && d.box && r.collisionIndex.insertCollisionBox(d.box, s.get("text-ignore-placement"), n.bucketInstanceId, D && D.box && R ? R : L, f.ID), P && M && r.collisionIndex.insertCollisionBox(M.box, s.get("icon-ignore-placement"), n.bucketInstanceId, k, f.ID), A && (T && r.collisionIndex.insertCollisionCircles(A.circles, s.get("text-ignore-placement"), n.bucketInstanceId, L, f.ID), o)) {\n var J = n.bucketInstanceId,\n Q = r.collisionCircleArrays[J];\n void 0 === Q && (Q = r.collisionCircleArrays[J] = new me());\n\n for (var $ = 0; $ < A.circles.length; $ += 4) {\n Q.circles.push(A.circles[$ + 0]), Q.circles.push(A.circles[$ + 1]), Q.circles.push(A.circles[$ + 2]), Q.circles.push(A.collisionDetected ? 1 : 0);\n }\n }\n\n r.placements[e.crossTileID] = new fe(T || E, P || I, S || n.justReloaded), i[e.crossTileID] = !0;\n }\n };\n\n if (T) for (var S = n.getSortedSymbolIndexes(this.transform.angle), C = S.length - 1; C >= 0; --C) {\n var z = S[C];\n P(n.symbolInstances.get(z), n.collisionArrays[z]);\n } else for (var D = e.symbolInstanceStart; D < e.symbolInstanceEnd; D++) {\n P(n.symbolInstances.get(D), n.collisionArrays[D]);\n }\n\n if (o && n.bucketInstanceId in this.collisionCircleArrays) {\n var A = this.collisionCircleArrays[n.bucketInstanceId];\n t.invert(A.invProjMatrix, l), A.viewportMatrix = this.collisionIndex.getViewportMatrix();\n }\n\n n.justReloaded = !1;\n }, be.prototype.markUsedJustification = function (e, i, o, r) {\n var a;\n a = r === t.WritingMode.vertical ? o.verticalPlacedTextSymbolIndex : {\n left: o.leftJustifiedTextSymbolIndex,\n center: o.centerJustifiedTextSymbolIndex,\n right: o.rightJustifiedTextSymbolIndex\n }[t.getAnchorJustification(i)];\n\n for (var n = 0, s = [o.leftJustifiedTextSymbolIndex, o.centerJustifiedTextSymbolIndex, o.rightJustifiedTextSymbolIndex, o.verticalPlacedTextSymbolIndex]; n < s.length; n += 1) {\n var l = s[n];\n l >= 0 && (e.text.placedSymbolArray.get(l).crossTileID = a >= 0 && l !== a ? 0 : o.crossTileID);\n }\n }, be.prototype.markUsedOrientation = function (e, i, o) {\n for (var r = i === t.WritingMode.horizontal || i === t.WritingMode.horizontalOnly ? i : 0, a = i === t.WritingMode.vertical ? i : 0, n = 0, s = [o.leftJustifiedTextSymbolIndex, o.centerJustifiedTextSymbolIndex, o.rightJustifiedTextSymbolIndex]; n < s.length; n += 1) {\n e.text.placedSymbolArray.get(s[n]).placedOrientation = r;\n }\n\n o.verticalPlacedTextSymbolIndex && (e.text.placedSymbolArray.get(o.verticalPlacedTextSymbolIndex).placedOrientation = a);\n }, be.prototype.commit = function (t) {\n this.commitTime = t, this.zoomAtLastRecencyCheck = this.transform.zoom;\n var e = this.prevPlacement,\n i = !1;\n this.prevZoomAdjustment = e ? e.zoomAdjustment(this.transform.zoom) : 0;\n var o = e ? e.symbolFadeChange(t) : 1,\n r = e ? e.opacities : {},\n a = e ? e.variableOffsets : {},\n n = e ? e.placedOrientations : {};\n\n for (var s in this.placements) {\n var l = this.placements[s],\n c = r[s];\n c ? (this.opacities[s] = new _e(c, o, l.text, l.icon), i = i || l.text !== c.text.placed || l.icon !== c.icon.placed) : (this.opacities[s] = new _e(null, o, l.text, l.icon, l.skipFade), i = i || l.text || l.icon);\n }\n\n for (var u in r) {\n var h = r[u];\n\n if (!this.opacities[u]) {\n var p = new _e(h, o, !1, !1);\n p.isHidden() || (this.opacities[u] = p, i = i || h.text.placed || h.icon.placed);\n }\n }\n\n for (var d in a) {\n this.variableOffsets[d] || !this.opacities[d] || this.opacities[d].isHidden() || (this.variableOffsets[d] = a[d]);\n }\n\n for (var _ in n) {\n this.placedOrientations[_] || !this.opacities[_] || this.opacities[_].isHidden() || (this.placedOrientations[_] = n[_]);\n }\n\n i ? this.lastPlacementChangeTime = t : "number" != typeof this.lastPlacementChangeTime && (this.lastPlacementChangeTime = e ? e.lastPlacementChangeTime : t);\n }, be.prototype.updateLayerOpacities = function (t, e) {\n for (var i = {}, o = 0, r = e; o < r.length; o += 1) {\n var a = r[o],\n n = a.getBucket(t);\n n && a.latestFeatureIndex && t.id === n.layerIds[0] && this.updateBucketOpacities(n, i, a.collisionBoxArray);\n }\n }, be.prototype.updateBucketOpacities = function (e, i, o) {\n var r = this;\n e.hasTextData() && e.text.opacityVertexArray.clear(), e.hasIconData() && e.icon.opacityVertexArray.clear(), e.hasIconCollisionBoxData() && e.iconCollisionBox.collisionVertexArray.clear(), e.hasTextCollisionBoxData() && e.textCollisionBox.collisionVertexArray.clear();\n var a = e.layers[0].layout,\n n = new _e(null, 0, !1, !1, !0),\n s = a.get("text-allow-overlap"),\n l = a.get("icon-allow-overlap"),\n c = a.get("text-variable-anchor"),\n u = "map" === a.get("text-rotation-alignment"),\n h = "map" === a.get("text-pitch-alignment"),\n p = "none" !== a.get("icon-text-fit"),\n d = new _e(null, 0, s && (l || !e.hasIconData() || a.get("icon-optional")), l && (s || !e.hasTextData() || a.get("text-optional")), !0);\n !e.collisionArrays && o && (e.hasIconCollisionBoxData() || e.hasTextCollisionBoxData()) && e.deserializeCollisionBoxes(o);\n\n for (var _ = function _(t, e, i) {\n for (var o = 0; o < e / 4; o++) {\n t.opacityVertexArray.emplaceBack(i);\n }\n }, f = function f(o) {\n var a = e.symbolInstances.get(o),\n s = a.numHorizontalGlyphVertices,\n l = a.numVerticalGlyphVertices,\n f = a.crossTileID,\n m = r.opacities[f];\n i[f] ? m = n : m || (r.opacities[f] = m = d), i[f] = !0;\n var g = a.numIconVertices > 0,\n v = r.placedOrientations[a.crossTileID],\n y = v === t.WritingMode.vertical,\n x = v === t.WritingMode.horizontal || v === t.WritingMode.horizontalOnly;\n\n if (s > 0 || l > 0) {\n var b = De(m.text);\n _(e.text, s, y ? Ae : b), _(e.text, l, x ? Ae : b);\n var w = m.text.isHidden();\n [a.rightJustifiedTextSymbolIndex, a.centerJustifiedTextSymbolIndex, a.leftJustifiedTextSymbolIndex].forEach(function (t) {\n t >= 0 && (e.text.placedSymbolArray.get(t).hidden = w || y ? 1 : 0);\n }), a.verticalPlacedTextSymbolIndex >= 0 && (e.text.placedSymbolArray.get(a.verticalPlacedTextSymbolIndex).hidden = w || x ? 1 : 0);\n var T = r.variableOffsets[a.crossTileID];\n T && r.markUsedJustification(e, T.anchor, a, v);\n var E = r.placedOrientations[a.crossTileID];\n E && (r.markUsedJustification(e, "left", a, E), r.markUsedOrientation(e, E, a));\n }\n\n if (g) {\n var I = De(m.icon),\n P = !(p && a.verticalPlacedIconSymbolIndex && y);\n a.placedIconSymbolIndex >= 0 && (_(e.icon, a.numIconVertices, P ? I : Ae), e.icon.placedSymbolArray.get(a.placedIconSymbolIndex).hidden = m.icon.isHidden()), a.verticalPlacedIconSymbolIndex >= 0 && (_(e.icon, a.numVerticalIconVertices, P ? Ae : I), e.icon.placedSymbolArray.get(a.verticalPlacedIconSymbolIndex).hidden = m.icon.isHidden());\n }\n\n if (e.hasIconCollisionBoxData() || e.hasTextCollisionBoxData()) {\n var S = e.collisionArrays[o];\n\n if (S) {\n var C = new t.Point(0, 0);\n\n if (S.textBox || S.verticalTextBox) {\n var z = !0;\n\n if (c) {\n var D = r.variableOffsets[f];\n D ? (C = ye(D.anchor, D.width, D.height, D.textOffset, D.textBoxScale), u && C._rotate(h ? r.transform.angle : -r.transform.angle)) : z = !1;\n }\n\n S.textBox && we(e.textCollisionBox.collisionVertexArray, m.text.placed, !z || y, C.x, C.y), S.verticalTextBox && we(e.textCollisionBox.collisionVertexArray, m.text.placed, !z || x, C.x, C.y);\n }\n\n var A = Boolean(!x && S.verticalIconBox);\n S.iconBox && we(e.iconCollisionBox.collisionVertexArray, m.icon.placed, A, p ? C.x : 0, p ? C.y : 0), S.verticalIconBox && we(e.iconCollisionBox.collisionVertexArray, m.icon.placed, !A, p ? C.x : 0, p ? C.y : 0);\n }\n }\n }, m = 0; m < e.symbolInstances.length; m++) {\n f(m);\n }\n\n if (e.sortFeatures(this.transform.angle), this.retainedQueryData[e.bucketInstanceId] && (this.retainedQueryData[e.bucketInstanceId].featureSortOrder = e.featureSortOrder), e.hasTextData() && e.text.opacityVertexBuffer && e.text.opacityVertexBuffer.updateData(e.text.opacityVertexArray), e.hasIconData() && e.icon.opacityVertexBuffer && e.icon.opacityVertexBuffer.updateData(e.icon.opacityVertexArray), e.hasIconCollisionBoxData() && e.iconCollisionBox.collisionVertexBuffer && e.iconCollisionBox.collisionVertexBuffer.updateData(e.iconCollisionBox.collisionVertexArray), e.hasTextCollisionBoxData() && e.textCollisionBox.collisionVertexBuffer && e.textCollisionBox.collisionVertexBuffer.updateData(e.textCollisionBox.collisionVertexArray), e.bucketInstanceId in this.collisionCircleArrays) {\n var g = this.collisionCircleArrays[e.bucketInstanceId];\n e.placementInvProjMatrix = g.invProjMatrix, e.placementViewportMatrix = g.viewportMatrix, e.collisionCircleArray = g.circles, delete this.collisionCircleArrays[e.bucketInstanceId];\n }\n }, be.prototype.symbolFadeChange = function (t) {\n return 0 === this.fadeDuration ? 1 : (t - this.commitTime) / this.fadeDuration + this.prevZoomAdjustment;\n }, be.prototype.zoomAdjustment = function (t) {\n return Math.max(0, (this.transform.zoom - t) / 1.5);\n }, be.prototype.hasTransitions = function (t) {\n return this.stale || t - this.lastPlacementChangeTime < this.fadeDuration;\n }, be.prototype.stillRecent = function (t, e) {\n var i = this.zoomAtLastRecencyCheck === e ? 1 - this.zoomAdjustment(e) : 1;\n return this.zoomAtLastRecencyCheck = e, this.commitTime + this.fadeDuration * i > t;\n }, be.prototype.setStale = function () {\n this.stale = !0;\n };\n var Te = Math.pow(2, 25),\n Ee = Math.pow(2, 24),\n Ie = Math.pow(2, 17),\n Pe = Math.pow(2, 16),\n Se = Math.pow(2, 9),\n Ce = Math.pow(2, 8),\n ze = Math.pow(2, 1);\n\n function De(t) {\n if (0 === t.opacity && !t.placed) return 0;\n if (1 === t.opacity && t.placed) return 4294967295;\n var e = t.placed ? 1 : 0,\n i = Math.floor(127 * t.opacity);\n return i * Te + e * Ee + i * Ie + e * Pe + i * Se + e * Ce + i * ze + e;\n }\n\n var Ae = 0,\n Me = function Me(t) {\n this._sortAcrossTiles = "viewport-y" !== t.layout.get("symbol-z-order") && void 0 !== t.layout.get("symbol-sort-key").constantOr(1), this._currentTileIndex = 0, this._currentPartIndex = 0, this._seenCrossTileIDs = {}, this._bucketParts = [];\n };\n\n Me.prototype.continuePlacement = function (t, e, i, o, r) {\n for (var a = this._bucketParts; this._currentTileIndex < t.length;) {\n if (e.getBucketParts(a, o, t[this._currentTileIndex], this._sortAcrossTiles), this._currentTileIndex++, r()) return !0;\n }\n\n for (this._sortAcrossTiles && (this._sortAcrossTiles = !1, a.sort(function (t, e) {\n return t.sortKey - e.sortKey;\n })); this._currentPartIndex < a.length;) {\n if (e.placeLayerBucketPart(a[this._currentPartIndex], this._seenCrossTileIDs, i), this._currentPartIndex++, r()) return !0;\n }\n\n return !1;\n };\n\n var Le = function Le(t, e, i, o, r, a, n) {\n this.placement = new be(t, r, a, n), this._currentPlacementIndex = e.length - 1, this._forceFullPlacement = i, this._showCollisionBoxes = o, this._done = !1;\n };\n\n Le.prototype.isDone = function () {\n return this._done;\n }, Le.prototype.continuePlacement = function (e, i, o) {\n for (var r = this, a = t.browser.now(), n = function n() {\n var e = t.browser.now() - a;\n return !r._forceFullPlacement && e > 2;\n }; this._currentPlacementIndex >= 0;) {\n var s = i[e[this._currentPlacementIndex]],\n l = this.placement.collisionIndex.transform.zoom;\n\n if ("symbol" === s.type && (!s.minzoom || s.minzoom <= l) && (!s.maxzoom || s.maxzoom > l)) {\n if (this._inProgressLayer || (this._inProgressLayer = new Me(s)), this._inProgressLayer.continuePlacement(o[s.source], this.placement, this._showCollisionBoxes, s, n)) return;\n delete this._inProgressLayer;\n }\n\n this._currentPlacementIndex--;\n }\n\n this._done = !0;\n }, Le.prototype.commit = function (t) {\n return this.placement.commit(t), this.placement;\n };\n\n var Re = 512 / t.EXTENT / 2,\n ke = function ke(t, e, i) {\n this.tileID = t, this.indexedSymbolInstances = {}, this.bucketInstanceId = i;\n\n for (var o = 0; o < e.length; o++) {\n var r = e.get(o),\n a = r.key;\n this.indexedSymbolInstances[a] || (this.indexedSymbolInstances[a] = []), this.indexedSymbolInstances[a].push({\n crossTileID: r.crossTileID,\n coord: this.getScaledCoordinates(r, t)\n });\n }\n };\n\n ke.prototype.getScaledCoordinates = function (e, i) {\n var o = Re / Math.pow(2, i.canonical.z - this.tileID.canonical.z);\n return {\n x: Math.floor((i.canonical.x * t.EXTENT + e.anchorX) * o),\n y: Math.floor((i.canonical.y * t.EXTENT + e.anchorY) * o)\n };\n }, ke.prototype.findMatches = function (t, e, i) {\n for (var o = this.tileID.canonical.z < e.canonical.z ? 1 : Math.pow(2, this.tileID.canonical.z - e.canonical.z), r = 0; r < t.length; r++) {\n var a = t.get(r);\n\n if (!a.crossTileID) {\n var n = this.indexedSymbolInstances[a.key];\n if (n) for (var s = this.getScaledCoordinates(a, e), l = 0, c = n; l < c.length; l += 1) {\n var u = c[l];\n\n if (Math.abs(u.coord.x - s.x) <= o && Math.abs(u.coord.y - s.y) <= o && !i[u.crossTileID]) {\n i[u.crossTileID] = !0, a.crossTileID = u.crossTileID;\n break;\n }\n }\n }\n }\n };\n\n var Be = function Be() {\n this.maxCrossTileID = 0;\n };\n\n Be.prototype.generate = function () {\n return ++this.maxCrossTileID;\n };\n\n var Oe = function Oe() {\n this.indexes = {}, this.usedCrossTileIDs = {}, this.lng = 0;\n };\n\n Oe.prototype.handleWrapJump = function (t) {\n var e = Math.round((t - this.lng) / 360);\n if (0 !== e) for (var i in this.indexes) {\n var o = this.indexes[i],\n r = {};\n\n for (var a in o) {\n var n = o[a];\n n.tileID = n.tileID.unwrapTo(n.tileID.wrap + e), r[n.tileID.key] = n;\n }\n\n this.indexes[i] = r;\n }\n this.lng = t;\n }, Oe.prototype.addBucket = function (t, e, i) {\n if (this.indexes[t.overscaledZ] && this.indexes[t.overscaledZ][t.key]) {\n if (this.indexes[t.overscaledZ][t.key].bucketInstanceId === e.bucketInstanceId) return !1;\n this.removeBucketCrossTileIDs(t.overscaledZ, this.indexes[t.overscaledZ][t.key]);\n }\n\n for (var o = 0; o < e.symbolInstances.length; o++) {\n e.symbolInstances.get(o).crossTileID = 0;\n }\n\n this.usedCrossTileIDs[t.overscaledZ] || (this.usedCrossTileIDs[t.overscaledZ] = {});\n var r = this.usedCrossTileIDs[t.overscaledZ];\n\n for (var a in this.indexes) {\n var n = this.indexes[a];\n if (Number(a) > t.overscaledZ) for (var s in n) {\n var l = n[s];\n l.tileID.isChildOf(t) && l.findMatches(e.symbolInstances, t, r);\n } else {\n var c = n[t.scaledTo(Number(a)).key];\n c && c.findMatches(e.symbolInstances, t, r);\n }\n }\n\n for (var u = 0; u < e.symbolInstances.length; u++) {\n var h = e.symbolInstances.get(u);\n h.crossTileID || (h.crossTileID = i.generate(), r[h.crossTileID] = !0);\n }\n\n return void 0 === this.indexes[t.overscaledZ] && (this.indexes[t.overscaledZ] = {}), this.indexes[t.overscaledZ][t.key] = new ke(t, e.symbolInstances, e.bucketInstanceId), !0;\n }, Oe.prototype.removeBucketCrossTileIDs = function (t, e) {\n for (var i in e.indexedSymbolInstances) {\n for (var o = 0, r = e.indexedSymbolInstances[i]; o < r.length; o += 1) {\n delete this.usedCrossTileIDs[t][r[o].crossTileID];\n }\n }\n }, Oe.prototype.removeStaleBuckets = function (t) {\n var e = !1;\n\n for (var i in this.indexes) {\n var o = this.indexes[i];\n\n for (var r in o) {\n t[o[r].bucketInstanceId] || (this.removeBucketCrossTileIDs(i, o[r]), delete o[r], e = !0);\n }\n }\n\n return e;\n };\n\n var Fe = function Fe() {\n this.layerIndexes = {}, this.crossTileIDs = new Be(), this.maxBucketInstanceId = 0, this.bucketsInCurrentPlacement = {};\n };\n\n Fe.prototype.addLayer = function (t, e, i) {\n var o = this.layerIndexes[t.id];\n void 0 === o && (o = this.layerIndexes[t.id] = new Oe());\n var r = !1,\n a = {};\n o.handleWrapJump(i);\n\n for (var n = 0, s = e; n < s.length; n += 1) {\n var l = s[n],\n c = l.getBucket(t);\n c && t.id === c.layerIds[0] && (c.bucketInstanceId || (c.bucketInstanceId = ++this.maxBucketInstanceId), o.addBucket(l.tileID, c, this.crossTileIDs) && (r = !0), a[c.bucketInstanceId] = !0);\n }\n\n return o.removeStaleBuckets(a) && (r = !0), r;\n }, Fe.prototype.pruneUnusedLayers = function (t) {\n var e = {};\n\n for (var i in t.forEach(function (t) {\n e[t] = !0;\n }), this.layerIndexes) {\n e[i] || delete this.layerIndexes[i];\n }\n };\n\n var Ue = function Ue(e, i) {\n return t.emitValidationErrors(e, i && i.filter(function (t) {\n return "source.canvas" !== t.identifier;\n }));\n },\n Ne = t.pick(Zt, ["addLayer", "removeLayer", "setPaintProperty", "setLayoutProperty", "setFilter", "addSource", "removeSource", "setLayerZoomRange", "setLight", "setTransition", "setGeoJSONSourceData"]),\n Ze = t.pick(Zt, ["setCenter", "setZoom", "setBearing", "setPitch"]),\n qe = function () {\n var e = {},\n i = t.styleSpec.$version;\n\n for (var o in t.styleSpec.$root) {\n var r,\n a = t.styleSpec.$root[o];\n if (a.required) null != (r = "version" === o ? i : "array" === a.type ? [] : {}) && (e[o] = r);\n }\n\n return e;\n }(),\n je = function (e) {\n function i(o, r) {\n var a = this;\n void 0 === r && (r = {}), e.call(this), this.map = o, this.dispatcher = new E(Ft(), this), this.imageManager = new p(), this.imageManager.setEventedParent(this), this.glyphManager = new y(o._requestManager, r.localIdeographFontFamily), this.lineAtlas = new T(256, 512), this.crossTileSymbolIndex = new Fe(), this._layers = {}, this._serializedLayers = {}, this._order = [], this.sourceCaches = {}, this.zoomHistory = new t.ZoomHistory(), this._loaded = !1, this._availableImages = [], this._resetUpdates(), this.dispatcher.broadcast("setReferrer", t.getReferrer());\n var n = this;\n this._rtlTextPluginCallback = i.registerForPluginStateChange(function (e) {\n n.dispatcher.broadcast("syncRTLPluginState", {\n pluginStatus: e.pluginStatus,\n pluginURL: e.pluginURL\n }, function (e, i) {\n if (t.triggerPluginCompletionEvent(e), i && i.every(function (t) {\n return t;\n })) for (var o in n.sourceCaches) {\n n.sourceCaches[o].reload();\n }\n });\n }), this.on("data", function (t) {\n if ("source" === t.dataType && "metadata" === t.sourceDataType) {\n var e = a.sourceCaches[t.sourceId];\n\n if (e) {\n var i = e.getSource();\n if (i && i.vectorLayerIds) for (var o in a._layers) {\n var r = a._layers[o];\n r.source === i.id && a._validateLayer(r);\n }\n }\n }\n });\n }\n\n return e && (i.__proto__ = e), (i.prototype = Object.create(e && e.prototype)).constructor = i, i.prototype.loadURL = function (e, i) {\n var o = this;\n void 0 === i && (i = {}), this.fire(new t.Event("dataloading", {\n dataType: "style"\n }));\n var r = "boolean" == typeof i.validate ? i.validate : !t.isMapboxURL(e);\n e = this.map._requestManager.normalizeStyleURL(e, i.accessToken);\n\n var a = this.map._requestManager.transformRequest(e, t.ResourceType.Style);\n\n this._request = t.getJSON(a, function (e, i) {\n o._request = null, e ? o.fire(new t.ErrorEvent(e)) : i && o._load(i, r);\n });\n }, i.prototype.loadJSON = function (e, i) {\n var o = this;\n void 0 === i && (i = {}), this.fire(new t.Event("dataloading", {\n dataType: "style"\n })), this._request = t.browser.frame(function () {\n o._request = null, o._load(e, !1 !== i.validate);\n });\n }, i.prototype.loadEmpty = function () {\n this.fire(new t.Event("dataloading", {\n dataType: "style"\n })), this._load(qe, !1);\n }, i.prototype._load = function (e, i) {\n if (!i || !Ue(this, t.validateStyle(e))) {\n for (var o in this._loaded = !0, this.stylesheet = e, e.sources) {\n this.addSource(o, e.sources[o], {\n validate: !1\n });\n }\n\n e.sprite ? this._loadSprite(e.sprite) : this.imageManager.setLoaded(!0), this.glyphManager.setURL(e.glyphs);\n var r = Nt(this.stylesheet.layers);\n this._order = r.map(function (t) {\n return t.id;\n }), this._layers = {}, this._serializedLayers = {};\n\n for (var a = 0, n = r; a < n.length; a += 1) {\n var s = n[a];\n (s = t.createStyleLayer(s)).setEventedParent(this, {\n layer: {\n id: s.id\n }\n }), this._layers[s.id] = s, this._serializedLayers[s.id] = s.serialize();\n }\n\n this.dispatcher.broadcast("setLayers", this._serializeLayers(this._order)), this.light = new w(this.stylesheet.light), this.fire(new t.Event("data", {\n dataType: "style"\n })), this.fire(new t.Event("style.load"));\n }\n }, i.prototype._loadSprite = function (e) {\n var i = this;\n\n this._spriteRequest = function (e, i, o) {\n var r,\n a,\n n,\n s = t.browser.devicePixelRatio > 1 ? "@2x" : "",\n l = t.getJSON(i.transformRequest(i.normalizeSpriteURL(e, s, ".json"), t.ResourceType.SpriteJSON), function (t, e) {\n l = null, n || (n = t, r = e, u());\n }),\n c = t.getImage(i.transformRequest(i.normalizeSpriteURL(e, s, ".png"), t.ResourceType.SpriteImage), function (t, e) {\n c = null, n || (n = t, a = e, u());\n });\n\n function u() {\n if (n) o(n);else if (r && a) {\n var e = t.browser.getImageData(a),\n i = {};\n\n for (var s in r) {\n var l = r[s],\n c = l.width,\n u = l.height,\n h = l.x,\n p = l.y,\n d = l.sdf,\n _ = l.pixelRatio,\n f = l.stretchX,\n m = l.stretchY,\n g = l.content,\n v = new t.RGBAImage({\n width: c,\n height: u\n });\n t.RGBAImage.copy(e, v, {\n x: h,\n y: p\n }, {\n x: 0,\n y: 0\n }, {\n width: c,\n height: u\n }), i[s] = {\n data: v,\n pixelRatio: _,\n sdf: d,\n stretchX: f,\n stretchY: m,\n content: g\n };\n }\n\n o(null, i);\n }\n }\n\n return {\n cancel: function cancel() {\n l && (l.cancel(), l = null), c && (c.cancel(), c = null);\n }\n };\n }(e, this.map._requestManager, function (e, o) {\n if (i._spriteRequest = null, e) i.fire(new t.ErrorEvent(e));else if (o) for (var r in o) {\n i.imageManager.addImage(r, o[r]);\n }\n i.imageManager.setLoaded(!0), i._availableImages = i.imageManager.listImages(), i.dispatcher.broadcast("setImages", i._availableImages), i.fire(new t.Event("data", {\n dataType: "style"\n }));\n });\n }, i.prototype._validateLayer = function (e) {\n var i = this.sourceCaches[e.source];\n\n if (i) {\n var o = e.sourceLayer;\n\n if (o) {\n var r = i.getSource();\n ("geojson" === r.type || r.vectorLayerIds && -1 === r.vectorLayerIds.indexOf(o)) && this.fire(new t.ErrorEvent(new Error(\'Source layer "\' + o + \'" does not exist on source "\' + r.id + \'" as specified by style layer "\' + e.id + \'"\')));\n }\n }\n }, i.prototype.loaded = function () {\n if (!this._loaded) return !1;\n if (Object.keys(this._updatedSources).length) return !1;\n\n for (var t in this.sourceCaches) {\n if (!this.sourceCaches[t].loaded()) return !1;\n }\n\n return !!this.imageManager.isLoaded();\n }, i.prototype._serializeLayers = function (t) {\n for (var e = [], i = 0, o = t; i < o.length; i += 1) {\n var r = this._layers[o[i]];\n "custom" !== r.type && e.push(r.serialize());\n }\n\n return e;\n }, i.prototype.hasTransitions = function () {\n if (this.light && this.light.hasTransition()) return !0;\n\n for (var t in this.sourceCaches) {\n if (this.sourceCaches[t].hasTransition()) return !0;\n }\n\n for (var e in this._layers) {\n if (this._layers[e].hasTransition()) return !0;\n }\n\n return !1;\n }, i.prototype._checkLoaded = function () {\n if (!this._loaded) throw new Error("Style is not done loading");\n }, i.prototype.update = function (e) {\n if (this._loaded) {\n var i = this._changed;\n\n if (this._changed) {\n var o = Object.keys(this._updatedLayers),\n r = Object.keys(this._removedLayers);\n\n for (var a in (o.length || r.length) && this._updateWorkerLayers(o, r), this._updatedSources) {\n var n = this._updatedSources[a];\n "reload" === n ? this._reloadSource(a) : "clear" === n && this._clearSource(a);\n }\n\n for (var s in this._updateTilesForChangedImages(), this._updatedPaintProps) {\n this._layers[s].updateTransitions(e);\n }\n\n this.light.updateTransitions(e), this._resetUpdates();\n }\n\n var l = {};\n\n for (var c in this.sourceCaches) {\n var u = this.sourceCaches[c];\n l[c] = u.used, u.used = !1;\n }\n\n for (var h = 0, p = this._order; h < p.length; h += 1) {\n var d = this._layers[p[h]];\n d.recalculate(e, this._availableImages), !d.isHidden(e.zoom) && d.source && (this.sourceCaches[d.source].used = !0);\n }\n\n for (var _ in l) {\n var f = this.sourceCaches[_];\n l[_] !== f.used && f.fire(new t.Event("data", {\n sourceDataType: "visibility",\n dataType: "source",\n sourceId: _\n }));\n }\n\n this.light.recalculate(e), this.z = e.zoom, i && this.fire(new t.Event("data", {\n dataType: "style"\n }));\n }\n }, i.prototype._updateTilesForChangedImages = function () {\n var t = Object.keys(this._changedImages);\n\n if (t.length) {\n for (var e in this.sourceCaches) {\n this.sourceCaches[e].reloadTilesForDependencies(["icons", "patterns"], t);\n }\n\n this._changedImages = {};\n }\n }, i.prototype._updateWorkerLayers = function (t, e) {\n this.dispatcher.broadcast("updateLayers", {\n layers: this._serializeLayers(t),\n removedIds: e\n });\n }, i.prototype._resetUpdates = function () {\n this._changed = !1, this._updatedLayers = {}, this._removedLayers = {}, this._updatedSources = {}, this._updatedPaintProps = {}, this._changedImages = {};\n }, i.prototype.setState = function (e) {\n var i = this;\n if (this._checkLoaded(), Ue(this, t.validateStyle(e))) return !1;\n (e = t.clone$1(e)).layers = Nt(e.layers);\n\n var o = function (e, i) {\n if (!e) return [{\n command: Zt.setStyle,\n args: [i]\n }];\n var o = [];\n\n try {\n if (!t.deepEqual(e.version, i.version)) return [{\n command: Zt.setStyle,\n args: [i]\n }];\n t.deepEqual(e.center, i.center) || o.push({\n command: Zt.setCenter,\n args: [i.center]\n }), t.deepEqual(e.zoom, i.zoom) || o.push({\n command: Zt.setZoom,\n args: [i.zoom]\n }), t.deepEqual(e.bearing, i.bearing) || o.push({\n command: Zt.setBearing,\n args: [i.bearing]\n }), t.deepEqual(e.pitch, i.pitch) || o.push({\n command: Zt.setPitch,\n args: [i.pitch]\n }), t.deepEqual(e.sprite, i.sprite) || o.push({\n command: Zt.setSprite,\n args: [i.sprite]\n }), t.deepEqual(e.glyphs, i.glyphs) || o.push({\n command: Zt.setGlyphs,\n args: [i.glyphs]\n }), t.deepEqual(e.transition, i.transition) || o.push({\n command: Zt.setTransition,\n args: [i.transition]\n }), t.deepEqual(e.light, i.light) || o.push({\n command: Zt.setLight,\n args: [i.light]\n });\n var r = {},\n a = [];\n !function (e, i, o, r) {\n var a;\n\n for (a in i = i || {}, e = e || {}) {\n e.hasOwnProperty(a) && (i.hasOwnProperty(a) || jt(a, o, r));\n }\n\n for (a in i) {\n i.hasOwnProperty(a) && (e.hasOwnProperty(a) ? t.deepEqual(e[a], i[a]) || ("geojson" === e[a].type && "geojson" === i[a].type && Gt(e, i, a) ? o.push({\n command: Zt.setGeoJSONSourceData,\n args: [a, i[a].data]\n }) : Vt(a, i, o, r)) : qt(a, i, o));\n }\n }(e.sources, i.sources, a, r);\n var n = [];\n e.layers && e.layers.forEach(function (t) {\n r[t.source] ? o.push({\n command: Zt.removeLayer,\n args: [t.id]\n }) : n.push(t);\n }), o = o.concat(a), function (e, i, o) {\n i = i || [];\n\n var r,\n a,\n n,\n s,\n l,\n c,\n u,\n h = (e = e || []).map(Xt),\n p = i.map(Xt),\n d = e.reduce(Ht, {}),\n _ = i.reduce(Ht, {}),\n f = h.slice(),\n m = Object.create(null);\n\n for (r = 0, a = 0; r < h.length; r++) {\n _.hasOwnProperty(n = h[r]) ? a++ : (o.push({\n command: Zt.removeLayer,\n args: [n]\n }), f.splice(f.indexOf(n, a), 1));\n }\n\n for (r = 0, a = 0; r < p.length; r++) {\n f[f.length - 1 - r] !== (n = p[p.length - 1 - r]) && (d.hasOwnProperty(n) ? (o.push({\n command: Zt.removeLayer,\n args: [n]\n }), f.splice(f.lastIndexOf(n, f.length - a), 1)) : a++, o.push({\n command: Zt.addLayer,\n args: [_[n], c = f[f.length - r]]\n }), f.splice(f.length - r, 0, n), m[n] = !0);\n }\n\n for (r = 0; r < p.length; r++) {\n if (s = d[n = p[r]], l = _[n], !m[n] && !t.deepEqual(s, l)) if (t.deepEqual(s.source, l.source) && t.deepEqual(s["source-layer"], l["source-layer"]) && t.deepEqual(s.type, l.type)) {\n for (u in Wt(s.layout, l.layout, o, n, null, Zt.setLayoutProperty), Wt(s.paint, l.paint, o, n, null, Zt.setPaintProperty), t.deepEqual(s.filter, l.filter) || o.push({\n command: Zt.setFilter,\n args: [n, l.filter]\n }), t.deepEqual(s.minzoom, l.minzoom) && t.deepEqual(s.maxzoom, l.maxzoom) || o.push({\n command: Zt.setLayerZoomRange,\n args: [n, l.minzoom, l.maxzoom]\n }), s) {\n s.hasOwnProperty(u) && "layout" !== u && "paint" !== u && "filter" !== u && "metadata" !== u && "minzoom" !== u && "maxzoom" !== u && (0 === u.indexOf("paint.") ? Wt(s[u], l[u], o, n, u.slice(6), Zt.setPaintProperty) : t.deepEqual(s[u], l[u]) || o.push({\n command: Zt.setLayerProperty,\n args: [n, u, l[u]]\n }));\n }\n\n for (u in l) {\n l.hasOwnProperty(u) && !s.hasOwnProperty(u) && "layout" !== u && "paint" !== u && "filter" !== u && "metadata" !== u && "minzoom" !== u && "maxzoom" !== u && (0 === u.indexOf("paint.") ? Wt(s[u], l[u], o, n, u.slice(6), Zt.setPaintProperty) : t.deepEqual(s[u], l[u]) || o.push({\n command: Zt.setLayerProperty,\n args: [n, u, l[u]]\n }));\n }\n } else o.push({\n command: Zt.removeLayer,\n args: [n]\n }), c = f[f.lastIndexOf(n) + 1], o.push({\n command: Zt.addLayer,\n args: [l, c]\n });\n }\n }(n, i.layers, o);\n } catch (t) {\n console.warn("Unable to compute style diff:", t), o = [{\n command: Zt.setStyle,\n args: [i]\n }];\n }\n\n return o;\n }(this.serialize(), e).filter(function (t) {\n return !(t.command in Ze);\n });\n\n if (0 === o.length) return !1;\n var r = o.filter(function (t) {\n return !(t.command in Ne);\n });\n if (r.length > 0) throw new Error("Unimplemented: " + r.map(function (t) {\n return t.command;\n }).join(", ") + ".");\n return o.forEach(function (t) {\n "setTransition" !== t.command && i[t.command].apply(i, t.args);\n }), this.stylesheet = e, !0;\n }, i.prototype.addImage = function (e, i) {\n if (this.getImage(e)) return this.fire(new t.ErrorEvent(new Error("An image with this name already exists.")));\n this.imageManager.addImage(e, i), this._afterImageUpdated(e);\n }, i.prototype.updateImage = function (t, e) {\n this.imageManager.updateImage(t, e);\n }, i.prototype.getImage = function (t) {\n return this.imageManager.getImage(t);\n }, i.prototype.removeImage = function (e) {\n if (!this.getImage(e)) return this.fire(new t.ErrorEvent(new Error("No image with this name exists.")));\n this.imageManager.removeImage(e), this._afterImageUpdated(e);\n }, i.prototype._afterImageUpdated = function (e) {\n this._availableImages = this.imageManager.listImages(), this._changedImages[e] = !0, this._changed = !0, this.dispatcher.broadcast("setImages", this._availableImages), this.fire(new t.Event("data", {\n dataType: "style"\n }));\n }, i.prototype.listImages = function () {\n return this._checkLoaded(), this.imageManager.listImages();\n }, i.prototype.addSource = function (e, i, o) {\n var r = this;\n if (void 0 === o && (o = {}), this._checkLoaded(), void 0 !== this.sourceCaches[e]) throw new Error("There is already a source with this ID");\n if (!i.type) throw new Error("The type property must be defined, but only the following properties were given: " + Object.keys(i).join(", ") + ".");\n\n if (!(["vector", "raster", "geojson", "video", "image"].indexOf(i.type) >= 0 && this._validate(t.validateStyle.source, "sources." + e, i, null, o))) {\n this.map && this.map._collectResourceTiming && (i.collectResourceTiming = !0);\n var a = this.sourceCaches[e] = new Dt(e, i, this.dispatcher);\n a.style = this, a.setEventedParent(this, function () {\n return {\n isSourceLoaded: r.loaded(),\n source: a.serialize(),\n sourceId: e\n };\n }), a.onAdd(this.map), this._changed = !0;\n }\n }, i.prototype.removeSource = function (e) {\n if (this._checkLoaded(), void 0 === this.sourceCaches[e]) throw new Error("There is no source with this ID");\n\n for (var i in this._layers) {\n if (this._layers[i].source === e) return this.fire(new t.ErrorEvent(new Error(\'Source "\' + e + \'" cannot be removed while layer "\' + i + \'" is using it.\')));\n }\n\n var o = this.sourceCaches[e];\n delete this.sourceCaches[e], delete this._updatedSources[e], o.fire(new t.Event("data", {\n sourceDataType: "metadata",\n dataType: "source",\n sourceId: e\n })), o.setEventedParent(null), o.clearTiles(), o.onRemove && o.onRemove(this.map), this._changed = !0;\n }, i.prototype.setGeoJSONSourceData = function (t, e) {\n this._checkLoaded(), this.sourceCaches[t].getSource().setData(e), this._changed = !0;\n }, i.prototype.getSource = function (t) {\n return this.sourceCaches[t] && this.sourceCaches[t].getSource();\n }, i.prototype.addLayer = function (e, i, o) {\n void 0 === o && (o = {}), this._checkLoaded();\n var r = e.id;\n if (this.getLayer(r)) this.fire(new t.ErrorEvent(new Error(\'Layer with id "\' + r + \'" already exists on this map\')));else {\n var a;\n\n if ("custom" === e.type) {\n if (Ue(this, t.validateCustomStyleLayer(e))) return;\n a = t.createStyleLayer(e);\n } else {\n if ("object" == typeof e.source && (this.addSource(r, e.source), e = t.clone$1(e), e = t.extend(e, {\n source: r\n })), this._validate(t.validateStyle.layer, "layers." + r, e, {\n arrayIndex: -1\n }, o)) return;\n a = t.createStyleLayer(e), this._validateLayer(a), a.setEventedParent(this, {\n layer: {\n id: r\n }\n }), this._serializedLayers[a.id] = a.serialize();\n }\n\n var n = i ? this._order.indexOf(i) : this._order.length;\n if (i && -1 === n) this.fire(new t.ErrorEvent(new Error(\'Layer with id "\' + i + \'" does not exist on this map.\')));else {\n if (this._order.splice(n, 0, r), this._layerOrderChanged = !0, this._layers[r] = a, this._removedLayers[r] && a.source && "custom" !== a.type) {\n var s = this._removedLayers[r];\n delete this._removedLayers[r], s.type !== a.type ? this._updatedSources[a.source] = "clear" : (this._updatedSources[a.source] = "reload", this.sourceCaches[a.source].pause());\n }\n\n this._updateLayer(a), a.onAdd && a.onAdd(this.map);\n }\n }\n }, i.prototype.moveLayer = function (e, i) {\n if (this._checkLoaded(), this._changed = !0, this._layers[e]) {\n if (e !== i) {\n var o = this._order.indexOf(e);\n\n this._order.splice(o, 1);\n\n var r = i ? this._order.indexOf(i) : this._order.length;\n i && -1 === r ? this.fire(new t.ErrorEvent(new Error(\'Layer with id "\' + i + \'" does not exist on this map.\'))) : (this._order.splice(r, 0, e), this._layerOrderChanged = !0);\n }\n } else this.fire(new t.ErrorEvent(new Error("The layer \'" + e + "\' does not exist in the map\'s style and cannot be moved.")));\n }, i.prototype.removeLayer = function (e) {\n this._checkLoaded();\n\n var i = this._layers[e];\n\n if (i) {\n i.setEventedParent(null);\n\n var o = this._order.indexOf(e);\n\n this._order.splice(o, 1), this._layerOrderChanged = !0, this._changed = !0, this._removedLayers[e] = i, delete this._layers[e], delete this._serializedLayers[e], delete this._updatedLayers[e], delete this._updatedPaintProps[e], i.onRemove && i.onRemove(this.map);\n } else this.fire(new t.ErrorEvent(new Error("The layer \'" + e + "\' does not exist in the map\'s style and cannot be removed.")));\n }, i.prototype.getLayer = function (t) {\n return this._layers[t];\n }, i.prototype.hasLayer = function (t) {\n return t in this._layers;\n }, i.prototype.setLayerZoomRange = function (e, i, o) {\n this._checkLoaded();\n\n var r = this.getLayer(e);\n r ? r.minzoom === i && r.maxzoom === o || (null != i && (r.minzoom = i), null != o && (r.maxzoom = o), this._updateLayer(r)) : this.fire(new t.ErrorEvent(new Error("The layer \'" + e + "\' does not exist in the map\'s style and cannot have zoom extent.")));\n }, i.prototype.setFilter = function (e, i, o) {\n void 0 === o && (o = {}), this._checkLoaded();\n var r = this.getLayer(e);\n\n if (r) {\n if (!t.deepEqual(r.filter, i)) return null == i ? (r.filter = void 0, void this._updateLayer(r)) : void (this._validate(t.validateStyle.filter, "layers." + r.id + ".filter", i, null, o) || (r.filter = t.clone$1(i), this._updateLayer(r)));\n } else this.fire(new t.ErrorEvent(new Error("The layer \'" + e + "\' does not exist in the map\'s style and cannot be filtered.")));\n }, i.prototype.getFilter = function (e) {\n return t.clone$1(this.getLayer(e).filter);\n }, i.prototype.setLayoutProperty = function (e, i, o, r) {\n void 0 === r && (r = {}), this._checkLoaded();\n var a = this.getLayer(e);\n a ? t.deepEqual(a.getLayoutProperty(i), o) || (a.setLayoutProperty(i, o, r), this._updateLayer(a)) : this.fire(new t.ErrorEvent(new Error("The layer \'" + e + "\' does not exist in the map\'s style and cannot be styled.")));\n }, i.prototype.getLayoutProperty = function (e, i) {\n var o = this.getLayer(e);\n if (o) return o.getLayoutProperty(i);\n this.fire(new t.ErrorEvent(new Error("The layer \'" + e + "\' does not exist in the map\'s style.")));\n }, i.prototype.setPaintProperty = function (e, i, o, r) {\n void 0 === r && (r = {}), this._checkLoaded();\n var a = this.getLayer(e);\n a ? t.deepEqual(a.getPaintProperty(i), o) || (a.setPaintProperty(i, o, r) && this._updateLayer(a), this._changed = !0, this._updatedPaintProps[e] = !0) : this.fire(new t.ErrorEvent(new Error("The layer \'" + e + "\' does not exist in the map\'s style and cannot be styled.")));\n }, i.prototype.getPaintProperty = function (t, e) {\n return this.getLayer(t).getPaintProperty(e);\n }, i.prototype.setFeatureState = function (e, i) {\n this._checkLoaded();\n\n var o = e.source,\n r = e.sourceLayer,\n a = this.sourceCaches[o];\n\n if (void 0 !== a) {\n var n = a.getSource().type;\n "geojson" === n && r ? this.fire(new t.ErrorEvent(new Error("GeoJSON sources cannot have a sourceLayer parameter."))) : "vector" !== n || r ? (void 0 === e.id && this.fire(new t.ErrorEvent(new Error("The feature id parameter must be provided."))), a.setFeatureState(r, e.id, i)) : this.fire(new t.ErrorEvent(new Error("The sourceLayer parameter must be provided for vector source types.")));\n } else this.fire(new t.ErrorEvent(new Error("The source \'" + o + "\' does not exist in the map\'s style.")));\n }, i.prototype.removeFeatureState = function (e, i) {\n this._checkLoaded();\n\n var o = e.source,\n r = this.sourceCaches[o];\n\n if (void 0 !== r) {\n var a = r.getSource().type,\n n = "vector" === a ? e.sourceLayer : void 0;\n "vector" !== a || n ? i && "string" != typeof e.id && "number" != typeof e.id ? this.fire(new t.ErrorEvent(new Error("A feature id is required to remove its specific state property."))) : r.removeFeatureState(n, e.id, i) : this.fire(new t.ErrorEvent(new Error("The sourceLayer parameter must be provided for vector source types.")));\n } else this.fire(new t.ErrorEvent(new Error("The source \'" + o + "\' does not exist in the map\'s style.")));\n }, i.prototype.getFeatureState = function (e) {\n this._checkLoaded();\n\n var i = e.source,\n o = e.sourceLayer,\n r = this.sourceCaches[i];\n\n if (void 0 !== r) {\n if ("vector" !== r.getSource().type || o) return void 0 === e.id && this.fire(new t.ErrorEvent(new Error("The feature id parameter must be provided."))), r.getFeatureState(o, e.id);\n this.fire(new t.ErrorEvent(new Error("The sourceLayer parameter must be provided for vector source types.")));\n } else this.fire(new t.ErrorEvent(new Error("The source \'" + i + "\' does not exist in the map\'s style.")));\n }, i.prototype.getTransition = function () {\n return t.extend({\n duration: 300,\n delay: 0\n }, this.stylesheet && this.stylesheet.transition);\n }, i.prototype.serialize = function () {\n return t.filterObject({\n version: this.stylesheet.version,\n name: this.stylesheet.name,\n metadata: this.stylesheet.metadata,\n light: this.stylesheet.light,\n center: this.stylesheet.center,\n zoom: this.stylesheet.zoom,\n bearing: this.stylesheet.bearing,\n pitch: this.stylesheet.pitch,\n sprite: this.stylesheet.sprite,\n glyphs: this.stylesheet.glyphs,\n transition: this.stylesheet.transition,\n sources: t.mapObject(this.sourceCaches, function (t) {\n return t.serialize();\n }),\n layers: this._serializeLayers(this._order)\n }, function (t) {\n return void 0 !== t;\n });\n }, i.prototype._updateLayer = function (t) {\n this._updatedLayers[t.id] = !0, t.source && !this._updatedSources[t.source] && "raster" !== this.sourceCaches[t.source].getSource().type && (this._updatedSources[t.source] = "reload", this.sourceCaches[t.source].pause()), this._changed = !0;\n }, i.prototype._flattenAndSortRenderedFeatures = function (t) {\n for (var e = this, i = function i(t) {\n return "fill-extrusion" === e._layers[t].type;\n }, o = {}, r = [], a = this._order.length - 1; a >= 0; a--) {\n var n = this._order[a];\n\n if (i(n)) {\n o[n] = a;\n\n for (var s = 0, l = t; s < l.length; s += 1) {\n var c = l[s][n];\n if (c) for (var u = 0, h = c; u < h.length; u += 1) {\n r.push(h[u]);\n }\n }\n }\n }\n\n r.sort(function (t, e) {\n return e.intersectionZ - t.intersectionZ;\n });\n\n for (var p = [], d = this._order.length - 1; d >= 0; d--) {\n var _ = this._order[d];\n if (i(_)) for (var f = r.length - 1; f >= 0; f--) {\n var m = r[f].feature;\n if (o[m.layer.id] < d) break;\n p.push(m), r.pop();\n } else for (var g = 0, v = t; g < v.length; g += 1) {\n var y = v[g][_];\n if (y) for (var x = 0, b = y; x < b.length; x += 1) {\n p.push(b[x].feature);\n }\n }\n }\n\n return p;\n }, i.prototype.queryRenderedFeatures = function (e, i, o) {\n i && i.filter && this._validate(t.validateStyle.filter, "queryRenderedFeatures.filter", i.filter, null, i);\n var r = {};\n\n if (i && i.layers) {\n if (!Array.isArray(i.layers)) return this.fire(new t.ErrorEvent(new Error("parameters.layers must be an Array."))), [];\n\n for (var a = 0, n = i.layers; a < n.length; a += 1) {\n var s = n[a],\n l = this._layers[s];\n if (!l) return this.fire(new t.ErrorEvent(new Error("The layer \'" + s + "\' does not exist in the map\'s style and cannot be queried for features."))), [];\n r[l.source] = !0;\n }\n }\n\n var c = [];\n\n for (var u in i.availableImages = this._availableImages, this.sourceCaches) {\n i.layers && !r[u] || c.push(O(this.sourceCaches[u], this._layers, this._serializedLayers, e, i, o));\n }\n\n return this.placement && c.push(function (t, e, i, o, r, a, n) {\n for (var s = {}, l = a.queryRenderedSymbols(o), c = [], u = 0, h = Object.keys(l).map(Number); u < h.length; u += 1) {\n c.push(n[h[u]]);\n }\n\n c.sort(F);\n\n for (var p = function p() {\n var i = _[d],\n o = i.featureIndex.lookupSymbolFeatures(l[i.bucketInstanceId], e, i.bucketIndex, i.sourceLayerIndex, r.filter, r.layers, r.availableImages, t);\n\n for (var a in o) {\n var n = s[a] = s[a] || [],\n c = o[a];\n c.sort(function (t, e) {\n var o = i.featureSortOrder;\n\n if (o) {\n var r = o.indexOf(t.featureIndex);\n return o.indexOf(e.featureIndex) - r;\n }\n\n return e.featureIndex - t.featureIndex;\n });\n\n for (var u = 0, h = c; u < h.length; u += 1) {\n n.push(h[u]);\n }\n }\n }, d = 0, _ = c; d < _.length; d += 1) {\n p();\n }\n\n var f = function f(e) {\n s[e].forEach(function (o) {\n var r = o.feature,\n a = i[t[e].source].getFeatureState(r.layer["source-layer"], r.id);\n r.source = r.layer.source, r.layer["source-layer"] && (r.sourceLayer = r.layer["source-layer"]), r.state = a;\n });\n };\n\n for (var m in s) {\n f(m);\n }\n\n return s;\n }(this._layers, this._serializedLayers, this.sourceCaches, e, i, this.placement.collisionIndex, this.placement.retainedQueryData)), this._flattenAndSortRenderedFeatures(c);\n }, i.prototype.querySourceFeatures = function (e, i) {\n i && i.filter && this._validate(t.validateStyle.filter, "querySourceFeatures.filter", i.filter, null, i);\n var o = this.sourceCaches[e];\n return o ? function (t, e) {\n for (var i = t.getRenderableIds().map(function (e) {\n return t.getTileByID(e);\n }), o = [], r = {}, a = 0; a < i.length; a++) {\n var n = i[a],\n s = n.tileID.canonical.key;\n r[s] || (r[s] = !0, n.querySourceFeatures(o, e));\n }\n\n return o;\n }(o, i) : [];\n }, i.prototype.addSourceType = function (t, e, o) {\n return i.getSourceType(t) ? o(new Error(\'A source type called "\' + t + \'" already exists.\')) : (i.setSourceType(t, e), e.workerSourceURL ? void this.dispatcher.broadcast("loadWorkerSource", {\n name: t,\n url: e.workerSourceURL\n }, o) : o(null, null));\n }, i.prototype.getLight = function () {\n return this.light.getLight();\n }, i.prototype.setLight = function (e, i) {\n void 0 === i && (i = {}), this._checkLoaded();\n var o = this.light.getLight(),\n r = !1;\n\n for (var a in e) {\n if (!t.deepEqual(e[a], o[a])) {\n r = !0;\n break;\n }\n }\n\n if (r) {\n var n = {\n now: t.browser.now(),\n transition: t.extend({\n duration: 300,\n delay: 0\n }, this.stylesheet.transition)\n };\n this.light.setLight(e, i), this.light.updateTransitions(n);\n }\n }, i.prototype._validate = function (e, i, o, r, a) {\n return void 0 === a && (a = {}), (!a || !1 !== a.validate) && Ue(this, e.call(t.validateStyle, t.extend({\n key: i,\n style: this.serialize(),\n value: o,\n styleSpec: t.styleSpec\n }, r)));\n }, i.prototype._remove = function () {\n for (var e in this._request && (this._request.cancel(), this._request = null), this._spriteRequest && (this._spriteRequest.cancel(), this._spriteRequest = null), t.evented.off("pluginStateChange", this._rtlTextPluginCallback), this._layers) {\n this._layers[e].setEventedParent(null);\n }\n\n for (var i in this.sourceCaches) {\n this.sourceCaches[i].clearTiles(), this.sourceCaches[i].setEventedParent(null);\n }\n\n this.imageManager.setEventedParent(null), this.setEventedParent(null), this.dispatcher.remove();\n }, i.prototype._clearSource = function (t) {\n this.sourceCaches[t].clearTiles();\n }, i.prototype._reloadSource = function (t) {\n this.sourceCaches[t].resume(), this.sourceCaches[t].reload();\n }, i.prototype._updateSources = function (t) {\n for (var e in this.sourceCaches) {\n this.sourceCaches[e].update(t);\n }\n }, i.prototype._generateCollisionBoxes = function () {\n for (var t in this.sourceCaches) {\n this._reloadSource(t);\n }\n }, i.prototype._updatePlacement = function (e, i, o, r, a) {\n void 0 === a && (a = !1);\n\n for (var n = !1, s = !1, l = {}, c = 0, u = this._order; c < u.length; c += 1) {\n var h = this._layers[u[c]];\n\n if ("symbol" === h.type) {\n if (!l[h.source]) {\n var p = this.sourceCaches[h.source];\n l[h.source] = p.getRenderableIds(!0).map(function (t) {\n return p.getTileByID(t);\n }).sort(function (t, e) {\n return e.tileID.overscaledZ - t.tileID.overscaledZ || (t.tileID.isLessThan(e.tileID) ? -1 : 1);\n });\n }\n\n var d = this.crossTileSymbolIndex.addLayer(h, l[h.source], e.center.lng);\n n = n || d;\n }\n }\n\n if (this.crossTileSymbolIndex.pruneUnusedLayers(this._order), ((a = a || this._layerOrderChanged || 0 === o) || !this.pauseablePlacement || this.pauseablePlacement.isDone() && !this.placement.stillRecent(t.browser.now(), e.zoom)) && (this.pauseablePlacement = new Le(e, this._order, a, i, o, r, this.placement), this._layerOrderChanged = !1), this.pauseablePlacement.isDone() ? this.placement.setStale() : (this.pauseablePlacement.continuePlacement(this._order, this._layers, l), this.pauseablePlacement.isDone() && (this.placement = this.pauseablePlacement.commit(t.browser.now()), s = !0), n && this.pauseablePlacement.placement.setStale()), s || n) for (var _ = 0, f = this._order; _ < f.length; _ += 1) {\n var m = this._layers[f[_]];\n "symbol" === m.type && this.placement.updateLayerOpacities(m, l[m.source]);\n }\n return !this.pauseablePlacement.isDone() || this.placement.hasTransitions(t.browser.now());\n }, i.prototype._releaseSymbolFadeTiles = function () {\n for (var t in this.sourceCaches) {\n this.sourceCaches[t].releaseSymbolFadeTiles();\n }\n }, i.prototype.getImages = function (t, e, i) {\n this.imageManager.getImages(e.icons, i), this._updateTilesForChangedImages();\n var o = this.sourceCaches[e.source];\n o && o.setDependencies(e.tileID.key, e.type, e.icons);\n }, i.prototype.getGlyphs = function (t, e, i) {\n this.glyphManager.getGlyphs(e.stacks, i);\n }, i.prototype.getResource = function (e, i, o) {\n return t.makeRequest(i, o);\n }, i;\n }(t.Evented);\n\n je.getSourceType = function (t) {\n return k[t];\n }, je.setSourceType = function (t, e) {\n k[t] = e;\n }, je.registerForPluginStateChange = t.registerForPluginStateChange;\n\n var Ve = t.createLayout([{\n name: "a_pos",\n type: "Int16",\n components: 2\n }]),\n Ge = gi("#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#if !defined(lowp)\\n#define lowp\\n#endif\\n#if !defined(mediump)\\n#define mediump\\n#endif\\n#if !defined(highp)\\n#define highp\\n#endif\\n#endif", "#ifdef GL_ES\\nprecision highp float;\\n#else\\n#if !defined(lowp)\\n#define lowp\\n#endif\\n#if !defined(mediump)\\n#define mediump\\n#endif\\n#if !defined(highp)\\n#define highp\\n#endif\\n#endif\\nvec2 unpack_float(const float packedValue) {int packedIntValue=int(packedValue);int v0=packedIntValue/256;return vec2(v0,packedIntValue-v0*256);}vec2 unpack_opacity(const float packedOpacity) {int intOpacity=int(packedOpacity)/2;return vec2(float(intOpacity)/127.0,mod(packedOpacity,2.0));}vec4 decode_color(const vec2 encodedColor) {return vec4(unpack_float(encodedColor[0])/255.0,unpack_float(encodedColor[1])/255.0\\n);}float unpack_mix_vec2(const vec2 packedValue,const float t) {return mix(packedValue[0],packedValue[1],t);}vec4 unpack_mix_color(const vec4 packedColors,const float t) {vec4 minColor=decode_color(vec2(packedColors[0],packedColors[1]));vec4 maxColor=decode_color(vec2(packedColors[2],packedColors[3]));return mix(minColor,maxColor,t);}vec2 get_pattern_pos(const vec2 pixel_coord_upper,const vec2 pixel_coord_lower,const vec2 pattern_size,const float tile_units_to_pixels,const vec2 pos) {vec2 offset=mod(mod(mod(pixel_coord_upper,pattern_size)*256.0,pattern_size)*256.0+pixel_coord_lower,pattern_size);return (tile_units_to_pixels*pos+offset)/pattern_size;}"),\n We = gi("uniform vec4 u_color;uniform float u_opacity;void main() {gl_FragColor=u_color*u_opacity;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}", "attribute vec2 a_pos;uniform mat4 u_matrix;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);}"),\n Xe = gi("uniform vec2 u_pattern_tl_a;uniform vec2 u_pattern_br_a;uniform vec2 u_pattern_tl_b;uniform vec2 u_pattern_br_b;uniform vec2 u_texsize;uniform float u_mix;uniform float u_opacity;uniform sampler2D u_image;varying vec2 v_pos_a;varying vec2 v_pos_b;void main() {vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(u_pattern_tl_a/u_texsize,u_pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(u_pattern_tl_b/u_texsize,u_pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);gl_FragColor=mix(color1,color2,u_mix)*u_opacity;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}", "uniform mat4 u_matrix;uniform vec2 u_pattern_size_a;uniform vec2 u_pattern_size_b;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform float u_scale_a;uniform float u_scale_b;uniform float u_tile_units_to_pixels;attribute vec2 a_pos;varying vec2 v_pos_a;varying vec2 v_pos_b;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,u_scale_a*u_pattern_size_a,u_tile_units_to_pixels,a_pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,u_scale_b*u_pattern_size_b,u_tile_units_to_pixels,a_pos);}"),\n He = gi("varying vec3 v_data;\\n#pragma mapbox: define highp vec4 color\\n#pragma mapbox: define mediump float radius\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define highp vec4 stroke_color\\n#pragma mapbox: define mediump float stroke_width\\n#pragma mapbox: define lowp float stroke_opacity\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 color\\n#pragma mapbox: initialize mediump float radius\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize highp vec4 stroke_color\\n#pragma mapbox: initialize mediump float stroke_width\\n#pragma mapbox: initialize lowp float stroke_opacity\\nvec2 extrude=v_data.xy;float extrude_length=length(extrude);lowp float antialiasblur=v_data.z;float antialiased_blur=-max(blur,antialiasblur);float opacity_t=smoothstep(0.0,antialiased_blur,extrude_length-1.0);float color_t=stroke_width < 0.01 ? 0.0 : smoothstep(antialiased_blur,0.0,extrude_length-radius/(radius+stroke_width));gl_FragColor=opacity_t*mix(color*opacity,stroke_color*stroke_opacity,color_t);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}", "uniform mat4 u_matrix;uniform bool u_scale_with_map;uniform bool u_pitch_with_map;uniform vec2 u_extrude_scale;uniform lowp float u_device_pixel_ratio;uniform highp float u_camera_to_center_distance;attribute vec2 a_pos;varying vec3 v_data;\\n#pragma mapbox: define highp vec4 color\\n#pragma mapbox: define mediump float radius\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define highp vec4 stroke_color\\n#pragma mapbox: define mediump float stroke_width\\n#pragma mapbox: define lowp float stroke_opacity\\nvoid main(void) {\\n#pragma mapbox: initialize highp vec4 color\\n#pragma mapbox: initialize mediump float radius\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize highp vec4 stroke_color\\n#pragma mapbox: initialize mediump float stroke_width\\n#pragma mapbox: initialize lowp float stroke_opacity\\nvec2 extrude=vec2(mod(a_pos,2.0)*2.0-1.0);vec2 circle_center=floor(a_pos*0.5);if (u_pitch_with_map) {vec2 corner_position=circle_center;if (u_scale_with_map) {corner_position+=extrude*(radius+stroke_width)*u_extrude_scale;} else {vec4 projected_center=u_matrix*vec4(circle_center,0,1);corner_position+=extrude*(radius+stroke_width)*u_extrude_scale*(projected_center.w/u_camera_to_center_distance);}gl_Position=u_matrix*vec4(corner_position,0,1);} else {gl_Position=u_matrix*vec4(circle_center,0,1);if (u_scale_with_map) {gl_Position.xy+=extrude*(radius+stroke_width)*u_extrude_scale*u_camera_to_center_distance;} else {gl_Position.xy+=extrude*(radius+stroke_width)*u_extrude_scale*gl_Position.w;}}lowp float antialiasblur=1.0/u_device_pixel_ratio/(radius+stroke_width);v_data=vec3(extrude.x,extrude.y,antialiasblur);}"),\n Ke = gi("void main() {gl_FragColor=vec4(1.0);}", "attribute vec2 a_pos;uniform mat4 u_matrix;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);}"),\n Ye = gi("uniform highp float u_intensity;varying vec2 v_extrude;\\n#pragma mapbox: define highp float weight\\n#define GAUSS_COEF 0.3989422804014327\\nvoid main() {\\n#pragma mapbox: initialize highp float weight\\nfloat d=-0.5*3.0*3.0*dot(v_extrude,v_extrude);float val=weight*u_intensity*GAUSS_COEF*exp(d);gl_FragColor=vec4(val,1.0,1.0,1.0);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}", "uniform mat4 u_matrix;uniform float u_extrude_scale;uniform float u_opacity;uniform float u_intensity;attribute vec2 a_pos;varying vec2 v_extrude;\\n#pragma mapbox: define highp float weight\\n#pragma mapbox: define mediump float radius\\nconst highp float ZERO=1.0/255.0/16.0;\\n#define GAUSS_COEF 0.3989422804014327\\nvoid main(void) {\\n#pragma mapbox: initialize highp float weight\\n#pragma mapbox: initialize mediump float radius\\nvec2 unscaled_extrude=vec2(mod(a_pos,2.0)*2.0-1.0);float S=sqrt(-2.0*log(ZERO/weight/u_intensity/GAUSS_COEF))/3.0;v_extrude=S*unscaled_extrude;vec2 extrude=v_extrude*radius*u_extrude_scale;vec4 pos=vec4(floor(a_pos*0.5)+extrude,0,1);gl_Position=u_matrix*pos;}"),\n Je = gi("uniform sampler2D u_image;uniform sampler2D u_color_ramp;uniform float u_opacity;varying vec2 v_pos;void main() {float t=texture2D(u_image,v_pos).r;vec4 color=texture2D(u_color_ramp,vec2(t,0.5));gl_FragColor=color*u_opacity;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(0.0);\\n#endif\\n}", "uniform mat4 u_matrix;uniform vec2 u_world;attribute vec2 a_pos;varying vec2 v_pos;void main() {gl_Position=u_matrix*vec4(a_pos*u_world,0,1);v_pos.x=a_pos.x;v_pos.y=1.0-a_pos.y;}"),\n Qe = gi("varying float v_placed;varying float v_notUsed;void main() {float alpha=0.5;gl_FragColor=vec4(1.0,0.0,0.0,1.0)*alpha;if (v_placed > 0.5) {gl_FragColor=vec4(0.0,0.0,1.0,0.5)*alpha;}if (v_notUsed > 0.5) {gl_FragColor*=.1;}}", "attribute vec2 a_pos;attribute vec2 a_anchor_pos;attribute vec2 a_extrude;attribute vec2 a_placed;attribute vec2 a_shift;uniform mat4 u_matrix;uniform vec2 u_extrude_scale;uniform float u_camera_to_center_distance;varying float v_placed;varying float v_notUsed;void main() {vec4 projectedPoint=u_matrix*vec4(a_anchor_pos,0,1);highp float camera_to_anchor_distance=projectedPoint.w;highp float collision_perspective_ratio=clamp(0.5+0.5*(u_camera_to_center_distance/camera_to_anchor_distance),0.0,4.0);gl_Position=u_matrix*vec4(a_pos,0.0,1.0);gl_Position.xy+=(a_extrude+a_shift)*u_extrude_scale*gl_Position.w*collision_perspective_ratio;v_placed=a_placed.x;v_notUsed=a_placed.y;}"),\n $e = gi("varying float v_radius;varying vec2 v_extrude;varying float v_perspective_ratio;varying float v_collision;void main() {float alpha=0.5*min(v_perspective_ratio,1.0);float stroke_radius=0.9*max(v_perspective_ratio,1.0);float distance_to_center=length(v_extrude);float distance_to_edge=abs(distance_to_center-v_radius);float opacity_t=smoothstep(-stroke_radius,0.0,-distance_to_edge);vec4 color=mix(vec4(0.0,0.0,1.0,0.5),vec4(1.0,0.0,0.0,1.0),v_collision);gl_FragColor=color*alpha*opacity_t;}", "attribute vec2 a_pos;attribute float a_radius;attribute vec2 a_flags;uniform mat4 u_matrix;uniform mat4 u_inv_matrix;uniform vec2 u_viewport_size;uniform float u_camera_to_center_distance;varying float v_radius;varying vec2 v_extrude;varying float v_perspective_ratio;varying float v_collision;vec3 toTilePosition(vec2 screenPos) {vec4 rayStart=u_inv_matrix*vec4(screenPos,-1.0,1.0);vec4 rayEnd =u_inv_matrix*vec4(screenPos, 1.0,1.0);rayStart.xyz/=rayStart.w;rayEnd.xyz /=rayEnd.w;highp float t=(0.0-rayStart.z)/(rayEnd.z-rayStart.z);return mix(rayStart.xyz,rayEnd.xyz,t);}void main() {vec2 quadCenterPos=a_pos;float radius=a_radius;float collision=a_flags.x;float vertexIdx=a_flags.y;vec2 quadVertexOffset=vec2(mix(-1.0,1.0,float(vertexIdx >=2.0)),mix(-1.0,1.0,float(vertexIdx >=1.0 && vertexIdx <=2.0)));vec2 quadVertexExtent=quadVertexOffset*radius;vec3 tilePos=toTilePosition(quadCenterPos);vec4 clipPos=u_matrix*vec4(tilePos,1.0);highp float camera_to_anchor_distance=clipPos.w;highp float collision_perspective_ratio=clamp(0.5+0.5*(u_camera_to_center_distance/camera_to_anchor_distance),0.0,4.0);float padding_factor=1.2;v_radius=radius;v_extrude=quadVertexExtent*padding_factor;v_perspective_ratio=collision_perspective_ratio;v_collision=collision;gl_Position=vec4(clipPos.xyz/clipPos.w,1.0)+vec4(quadVertexExtent*padding_factor/u_viewport_size*2.0,0.0,0.0);}"),\n ti = gi("uniform highp vec4 u_color;uniform sampler2D u_overlay;varying vec2 v_uv;void main() {vec4 overlay_color=texture2D(u_overlay,v_uv);gl_FragColor=mix(u_color,overlay_color,overlay_color.a);}", "attribute vec2 a_pos;varying vec2 v_uv;uniform mat4 u_matrix;uniform float u_overlay_scale;void main() {v_uv=a_pos/8192.0;gl_Position=u_matrix*vec4(a_pos*u_overlay_scale,0,1);}"),\n ei = gi("#pragma mapbox: define highp vec4 color\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 color\\n#pragma mapbox: initialize lowp float opacity\\ngl_FragColor=color*opacity;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}", "attribute vec2 a_pos;uniform mat4 u_matrix;\\n#pragma mapbox: define highp vec4 color\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 color\\n#pragma mapbox: initialize lowp float opacity\\ngl_Position=u_matrix*vec4(a_pos,0,1);}"),\n ii = gi("varying vec2 v_pos;\\n#pragma mapbox: define highp vec4 outline_color\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 outline_color\\n#pragma mapbox: initialize lowp float opacity\\nfloat dist=length(v_pos-gl_FragCoord.xy);float alpha=1.0-smoothstep(0.0,1.0,dist);gl_FragColor=outline_color*(alpha*opacity);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}", "attribute vec2 a_pos;uniform mat4 u_matrix;uniform vec2 u_world;varying vec2 v_pos;\\n#pragma mapbox: define highp vec4 outline_color\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 outline_color\\n#pragma mapbox: initialize lowp float opacity\\ngl_Position=u_matrix*vec4(a_pos,0,1);v_pos=(gl_Position.xy/gl_Position.w+1.0)/2.0*u_world;}"),\n oi = gi("uniform vec2 u_texsize;uniform sampler2D u_image;uniform float u_fade;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec2 v_pos;\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp vec4 pattern_from\\n#pragma mapbox: define lowp vec4 pattern_to\\nvoid main() {\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump vec4 pattern_from\\n#pragma mapbox: initialize mediump vec4 pattern_to\\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(pattern_tl_a/u_texsize,pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(pattern_tl_b/u_texsize,pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);float dist=length(v_pos-gl_FragCoord.xy);float alpha=1.0-smoothstep(0.0,1.0,dist);gl_FragColor=mix(color1,color2,u_fade)*alpha*opacity;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}", "uniform mat4 u_matrix;uniform vec2 u_world;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform vec3 u_scale;attribute vec2 a_pos;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec2 v_pos;\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp vec4 pattern_from\\n#pragma mapbox: define lowp vec4 pattern_to\\n#pragma mapbox: define lowp float pixel_ratio_from\\n#pragma mapbox: define lowp float pixel_ratio_to\\nvoid main() {\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump vec4 pattern_from\\n#pragma mapbox: initialize mediump vec4 pattern_to\\n#pragma mapbox: initialize lowp float pixel_ratio_from\\n#pragma mapbox: initialize lowp float pixel_ratio_to\\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;gl_Position=u_matrix*vec4(a_pos,0,1);vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,fromScale*display_size_a,tileRatio,a_pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,toScale*display_size_b,tileRatio,a_pos);v_pos=(gl_Position.xy/gl_Position.w+1.0)/2.0*u_world;}"),\n ri = gi("uniform vec2 u_texsize;uniform float u_fade;uniform sampler2D u_image;varying vec2 v_pos_a;varying vec2 v_pos_b;\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp vec4 pattern_from\\n#pragma mapbox: define lowp vec4 pattern_to\\nvoid main() {\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump vec4 pattern_from\\n#pragma mapbox: initialize mediump vec4 pattern_to\\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(pattern_tl_a/u_texsize,pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(pattern_tl_b/u_texsize,pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);gl_FragColor=mix(color1,color2,u_fade)*opacity;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}", "uniform mat4 u_matrix;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform vec3 u_scale;attribute vec2 a_pos;varying vec2 v_pos_a;varying vec2 v_pos_b;\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp vec4 pattern_from\\n#pragma mapbox: define lowp vec4 pattern_to\\n#pragma mapbox: define lowp float pixel_ratio_from\\n#pragma mapbox: define lowp float pixel_ratio_to\\nvoid main() {\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump vec4 pattern_from\\n#pragma mapbox: initialize mediump vec4 pattern_to\\n#pragma mapbox: initialize lowp float pixel_ratio_from\\n#pragma mapbox: initialize lowp float pixel_ratio_to\\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileZoomRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;gl_Position=u_matrix*vec4(a_pos,0,1);v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,fromScale*display_size_a,tileZoomRatio,a_pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,toScale*display_size_b,tileZoomRatio,a_pos);}"),\n ai = gi("varying vec4 v_color;void main() {gl_FragColor=v_color;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}", "uniform mat4 u_matrix;uniform vec3 u_lightcolor;uniform lowp vec3 u_lightpos;uniform lowp float u_lightintensity;uniform float u_vertical_gradient;uniform lowp float u_opacity;attribute vec2 a_pos;attribute vec4 a_normal_ed;varying vec4 v_color;\\n#pragma mapbox: define highp float base\\n#pragma mapbox: define highp float height\\n#pragma mapbox: define highp vec4 color\\nvoid main() {\\n#pragma mapbox: initialize highp float base\\n#pragma mapbox: initialize highp float height\\n#pragma mapbox: initialize highp vec4 color\\nvec3 normal=a_normal_ed.xyz;base=max(0.0,base);height=max(0.0,height);float t=mod(normal.x,2.0);gl_Position=u_matrix*vec4(a_pos,t > 0.0 ? height : base,1);float colorvalue=color.r*0.2126+color.g*0.7152+color.b*0.0722;v_color=vec4(0.0,0.0,0.0,1.0);vec4 ambientlight=vec4(0.03,0.03,0.03,1.0);color+=ambientlight;float directional=clamp(dot(normal/16384.0,u_lightpos),0.0,1.0);directional=mix((1.0-u_lightintensity),max((1.0-colorvalue+u_lightintensity),1.0),directional);if (normal.y !=0.0) {directional*=((1.0-u_vertical_gradient)+(u_vertical_gradient*clamp((t+base)*pow(height/150.0,0.5),mix(0.7,0.98,1.0-u_lightintensity),1.0)));}v_color.r+=clamp(color.r*directional*u_lightcolor.r,mix(0.0,0.3,1.0-u_lightcolor.r),1.0);v_color.g+=clamp(color.g*directional*u_lightcolor.g,mix(0.0,0.3,1.0-u_lightcolor.g),1.0);v_color.b+=clamp(color.b*directional*u_lightcolor.b,mix(0.0,0.3,1.0-u_lightcolor.b),1.0);v_color*=u_opacity;}"),\n ni = gi("uniform vec2 u_texsize;uniform float u_fade;uniform sampler2D u_image;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec4 v_lighting;\\n#pragma mapbox: define lowp float base\\n#pragma mapbox: define lowp float height\\n#pragma mapbox: define lowp vec4 pattern_from\\n#pragma mapbox: define lowp vec4 pattern_to\\n#pragma mapbox: define lowp float pixel_ratio_from\\n#pragma mapbox: define lowp float pixel_ratio_to\\nvoid main() {\\n#pragma mapbox: initialize lowp float base\\n#pragma mapbox: initialize lowp float height\\n#pragma mapbox: initialize mediump vec4 pattern_from\\n#pragma mapbox: initialize mediump vec4 pattern_to\\n#pragma mapbox: initialize lowp float pixel_ratio_from\\n#pragma mapbox: initialize lowp float pixel_ratio_to\\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(pattern_tl_a/u_texsize,pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(pattern_tl_b/u_texsize,pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);vec4 mixedColor=mix(color1,color2,u_fade);gl_FragColor=mixedColor*v_lighting;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}", "uniform mat4 u_matrix;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform float u_height_factor;uniform vec3 u_scale;uniform float u_vertical_gradient;uniform lowp float u_opacity;uniform vec3 u_lightcolor;uniform lowp vec3 u_lightpos;uniform lowp float u_lightintensity;attribute vec2 a_pos;attribute vec4 a_normal_ed;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec4 v_lighting;\\n#pragma mapbox: define lowp float base\\n#pragma mapbox: define lowp float height\\n#pragma mapbox: define lowp vec4 pattern_from\\n#pragma mapbox: define lowp vec4 pattern_to\\n#pragma mapbox: define lowp float pixel_ratio_from\\n#pragma mapbox: define lowp float pixel_ratio_to\\nvoid main() {\\n#pragma mapbox: initialize lowp float base\\n#pragma mapbox: initialize lowp float height\\n#pragma mapbox: initialize mediump vec4 pattern_from\\n#pragma mapbox: initialize mediump vec4 pattern_to\\n#pragma mapbox: initialize lowp float pixel_ratio_from\\n#pragma mapbox: initialize lowp float pixel_ratio_to\\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;vec3 normal=a_normal_ed.xyz;float edgedistance=a_normal_ed.w;vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;base=max(0.0,base);height=max(0.0,height);float t=mod(normal.x,2.0);float z=t > 0.0 ? height : base;gl_Position=u_matrix*vec4(a_pos,z,1);vec2 pos=normal.x==1.0 && normal.y==0.0 && normal.z==16384.0\\n? a_pos\\n: vec2(edgedistance,z*u_height_factor);v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,fromScale*display_size_a,tileRatio,pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,toScale*display_size_b,tileRatio,pos);v_lighting=vec4(0.0,0.0,0.0,1.0);float directional=clamp(dot(normal/16383.0,u_lightpos),0.0,1.0);directional=mix((1.0-u_lightintensity),max((0.5+u_lightintensity),1.0),directional);if (normal.y !=0.0) {directional*=((1.0-u_vertical_gradient)+(u_vertical_gradient*clamp((t+base)*pow(height/150.0,0.5),mix(0.7,0.98,1.0-u_lightintensity),1.0)));}v_lighting.rgb+=clamp(directional*u_lightcolor,mix(vec3(0.0),vec3(0.3),1.0-u_lightcolor),vec3(1.0));v_lighting*=u_opacity;}"),\n si = gi("#ifdef GL_ES\\nprecision highp float;\\n#endif\\nuniform sampler2D u_image;varying vec2 v_pos;uniform vec2 u_dimension;uniform float u_zoom;uniform vec4 u_unpack;float getElevation(vec2 coord,float bias) {vec4 data=texture2D(u_image,coord)*255.0;data.a=-1.0;return dot(data,u_unpack)/4.0;}void main() {vec2 epsilon=1.0/u_dimension;float a=getElevation(v_pos+vec2(-epsilon.x,-epsilon.y),0.0);float b=getElevation(v_pos+vec2(0,-epsilon.y),0.0);float c=getElevation(v_pos+vec2(epsilon.x,-epsilon.y),0.0);float d=getElevation(v_pos+vec2(-epsilon.x,0),0.0);float e=getElevation(v_pos,0.0);float f=getElevation(v_pos+vec2(epsilon.x,0),0.0);float g=getElevation(v_pos+vec2(-epsilon.x,epsilon.y),0.0);float h=getElevation(v_pos+vec2(0,epsilon.y),0.0);float i=getElevation(v_pos+vec2(epsilon.x,epsilon.y),0.0);float exaggerationFactor=u_zoom < 2.0 ? 0.4 : u_zoom < 4.5 ? 0.35 : 0.3;float exaggeration=u_zoom < 15.0 ? (u_zoom-15.0)*exaggerationFactor : 0.0;vec2 deriv=vec2((c+f+f+i)-(a+d+d+g),(g+h+h+i)-(a+b+b+c))/pow(2.0,exaggeration+(19.2562-u_zoom));gl_FragColor=clamp(vec4(deriv.x/2.0+0.5,deriv.y/2.0+0.5,1.0,1.0),0.0,1.0);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}", "uniform mat4 u_matrix;uniform vec2 u_dimension;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying vec2 v_pos;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);highp vec2 epsilon=1.0/u_dimension;float scale=(u_dimension.x-2.0)/u_dimension.x;v_pos=(a_texture_pos/8192.0)*scale+epsilon;}"),\n li = gi("uniform sampler2D u_image;varying vec2 v_pos;uniform vec2 u_latrange;uniform vec2 u_light;uniform vec4 u_shadow;uniform vec4 u_highlight;uniform vec4 u_accent;\\n#define PI 3.141592653589793\\nvoid main() {vec4 pixel=texture2D(u_image,v_pos);vec2 deriv=((pixel.rg*2.0)-1.0);float scaleFactor=cos(radians((u_latrange[0]-u_latrange[1])*(1.0-v_pos.y)+u_latrange[1]));float slope=atan(1.25*length(deriv)/scaleFactor);float aspect=deriv.x !=0.0 ? atan(deriv.y,-deriv.x) : PI/2.0*(deriv.y > 0.0 ? 1.0 :-1.0);float intensity=u_light.x;float azimuth=u_light.y+PI;float base=1.875-intensity*1.75;float maxValue=0.5*PI;float scaledSlope=intensity !=0.5 ? ((pow(base,slope)-1.0)/(pow(base,maxValue)-1.0))*maxValue : slope;float accent=cos(scaledSlope);vec4 accent_color=(1.0-accent)*u_accent*clamp(intensity*2.0,0.0,1.0);float shade=abs(mod((aspect+azimuth)/PI+0.5,2.0)-1.0);vec4 shade_color=mix(u_shadow,u_highlight,shade)*sin(scaledSlope)*clamp(intensity*2.0,0.0,1.0);gl_FragColor=accent_color*(1.0-shade_color.a)+shade_color;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}", "uniform mat4 u_matrix;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying vec2 v_pos;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);v_pos=a_texture_pos/8192.0;}"),\n ci = gi("uniform lowp float u_device_pixel_ratio;varying vec2 v_width2;varying vec2 v_normal;varying float v_gamma_scale;\\n#pragma mapbox: define highp vec4 color\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 color\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\nfloat dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);gl_FragColor=color*(alpha*opacity);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}", "\\n#define scale 0.015873016\\nattribute vec2 a_pos_normal;attribute vec4 a_data;uniform mat4 u_matrix;uniform mediump float u_ratio;uniform vec2 u_units_to_pixels;uniform lowp float u_device_pixel_ratio;varying vec2 v_normal;varying vec2 v_width2;varying float v_gamma_scale;varying highp float v_linesofar;\\n#pragma mapbox: define highp vec4 color\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define mediump float gapwidth\\n#pragma mapbox: define lowp float offset\\n#pragma mapbox: define mediump float width\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 color\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump float gapwidth\\n#pragma mapbox: initialize lowp float offset\\n#pragma mapbox: initialize mediump float width\\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;v_linesofar=(floor(a_data.z/4.0)+a_data.w*64.0)*2.0;vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;float extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;v_width2=vec2(outset,inset);}"),\n ui = gi("uniform lowp float u_device_pixel_ratio;uniform sampler2D u_image;varying vec2 v_width2;varying vec2 v_normal;varying float v_gamma_scale;varying highp vec2 v_uv;\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\nfloat dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);vec4 color=texture2D(u_image,v_uv);gl_FragColor=color*(alpha*opacity);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}", "\\n#define scale 0.015873016\\nattribute vec2 a_pos_normal;attribute vec4 a_data;attribute float a_uv_x;attribute float a_split_index;uniform mat4 u_matrix;uniform mediump float u_ratio;uniform lowp float u_device_pixel_ratio;uniform vec2 u_units_to_pixels;uniform float u_image_height;varying vec2 v_normal;varying vec2 v_width2;varying float v_gamma_scale;varying highp vec2 v_uv;\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define mediump float gapwidth\\n#pragma mapbox: define lowp float offset\\n#pragma mapbox: define mediump float width\\nvoid main() {\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump float gapwidth\\n#pragma mapbox: initialize lowp float offset\\n#pragma mapbox: initialize mediump float width\\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;highp float texel_height=1.0/u_image_height;highp float half_texel_height=0.5*texel_height;v_uv=vec2(a_uv_x,a_split_index*texel_height-half_texel_height);vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;float extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;v_width2=vec2(outset,inset);}"),\n hi = gi("uniform lowp float u_device_pixel_ratio;uniform vec2 u_texsize;uniform float u_fade;uniform mediump vec3 u_scale;uniform sampler2D u_image;varying vec2 v_normal;varying vec2 v_width2;varying float v_linesofar;varying float v_gamma_scale;varying float v_width;\\n#pragma mapbox: define lowp vec4 pattern_from\\n#pragma mapbox: define lowp vec4 pattern_to\\n#pragma mapbox: define lowp float pixel_ratio_from\\n#pragma mapbox: define lowp float pixel_ratio_to\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize mediump vec4 pattern_from\\n#pragma mapbox: initialize mediump vec4 pattern_to\\n#pragma mapbox: initialize lowp float pixel_ratio_from\\n#pragma mapbox: initialize lowp float pixel_ratio_to\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileZoomRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;vec2 pattern_size_a=vec2(display_size_a.x*fromScale/tileZoomRatio,display_size_a.y);vec2 pattern_size_b=vec2(display_size_b.x*toScale/tileZoomRatio,display_size_b.y);float aspect_a=display_size_a.y/v_width;float aspect_b=display_size_b.y/v_width;float dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);float x_a=mod(v_linesofar/pattern_size_a.x*aspect_a,1.0);float x_b=mod(v_linesofar/pattern_size_b.x*aspect_b,1.0);float y=0.5*v_normal.y+0.5;vec2 texel_size=1.0/u_texsize;vec2 pos_a=mix(pattern_tl_a*texel_size-texel_size,pattern_br_a*texel_size+texel_size,vec2(x_a,y));vec2 pos_b=mix(pattern_tl_b*texel_size-texel_size,pattern_br_b*texel_size+texel_size,vec2(x_b,y));vec4 color=mix(texture2D(u_image,pos_a),texture2D(u_image,pos_b),u_fade);gl_FragColor=color*alpha*opacity;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}", "\\n#define scale 0.015873016\\n#define LINE_DISTANCE_SCALE 2.0\\nattribute vec2 a_pos_normal;attribute vec4 a_data;uniform mat4 u_matrix;uniform vec2 u_units_to_pixels;uniform mediump float u_ratio;uniform lowp float u_device_pixel_ratio;varying vec2 v_normal;varying vec2 v_width2;varying float v_linesofar;varying float v_gamma_scale;varying float v_width;\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp float offset\\n#pragma mapbox: define mediump float gapwidth\\n#pragma mapbox: define mediump float width\\n#pragma mapbox: define lowp float floorwidth\\n#pragma mapbox: define lowp vec4 pattern_from\\n#pragma mapbox: define lowp vec4 pattern_to\\n#pragma mapbox: define lowp float pixel_ratio_from\\n#pragma mapbox: define lowp float pixel_ratio_to\\nvoid main() {\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize lowp float offset\\n#pragma mapbox: initialize mediump float gapwidth\\n#pragma mapbox: initialize mediump float width\\n#pragma mapbox: initialize lowp float floorwidth\\n#pragma mapbox: initialize mediump vec4 pattern_from\\n#pragma mapbox: initialize mediump vec4 pattern_to\\n#pragma mapbox: initialize lowp float pixel_ratio_from\\n#pragma mapbox: initialize lowp float pixel_ratio_to\\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;float a_linesofar=(floor(a_data.z/4.0)+a_data.w*64.0)*LINE_DISTANCE_SCALE;vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;float extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;v_linesofar=a_linesofar;v_width2=vec2(outset,inset);v_width=floorwidth;}"),\n pi = gi("uniform lowp float u_device_pixel_ratio;uniform sampler2D u_image;uniform float u_sdfgamma;uniform float u_mix;varying vec2 v_normal;varying vec2 v_width2;varying vec2 v_tex_a;varying vec2 v_tex_b;varying float v_gamma_scale;\\n#pragma mapbox: define highp vec4 color\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define mediump float width\\n#pragma mapbox: define lowp float floorwidth\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 color\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump float width\\n#pragma mapbox: initialize lowp float floorwidth\\nfloat dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);float sdfdist_a=texture2D(u_image,v_tex_a).a;float sdfdist_b=texture2D(u_image,v_tex_b).a;float sdfdist=mix(sdfdist_a,sdfdist_b,u_mix);alpha*=smoothstep(0.5-u_sdfgamma/floorwidth,0.5+u_sdfgamma/floorwidth,sdfdist);gl_FragColor=color*(alpha*opacity);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}", "\\n#define scale 0.015873016\\n#define LINE_DISTANCE_SCALE 2.0\\nattribute vec2 a_pos_normal;attribute vec4 a_data;uniform mat4 u_matrix;uniform mediump float u_ratio;uniform lowp float u_device_pixel_ratio;uniform vec2 u_patternscale_a;uniform float u_tex_y_a;uniform vec2 u_patternscale_b;uniform float u_tex_y_b;uniform vec2 u_units_to_pixels;varying vec2 v_normal;varying vec2 v_width2;varying vec2 v_tex_a;varying vec2 v_tex_b;varying float v_gamma_scale;\\n#pragma mapbox: define highp vec4 color\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define mediump float gapwidth\\n#pragma mapbox: define lowp float offset\\n#pragma mapbox: define mediump float width\\n#pragma mapbox: define lowp float floorwidth\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 color\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump float gapwidth\\n#pragma mapbox: initialize lowp float offset\\n#pragma mapbox: initialize mediump float width\\n#pragma mapbox: initialize lowp float floorwidth\\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;float a_linesofar=(floor(a_data.z/4.0)+a_data.w*64.0)*LINE_DISTANCE_SCALE;vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;float extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;v_tex_a=vec2(a_linesofar*u_patternscale_a.x/floorwidth,normal.y*u_patternscale_a.y+u_tex_y_a);v_tex_b=vec2(a_linesofar*u_patternscale_b.x/floorwidth,normal.y*u_patternscale_b.y+u_tex_y_b);v_width2=vec2(outset,inset);}"),\n di = gi("uniform float u_fade_t;uniform float u_opacity;uniform sampler2D u_image0;uniform sampler2D u_image1;varying vec2 v_pos0;varying vec2 v_pos1;uniform float u_brightness_low;uniform float u_brightness_high;uniform float u_saturation_factor;uniform float u_contrast_factor;uniform vec3 u_spin_weights;void main() {vec4 color0=texture2D(u_image0,v_pos0);vec4 color1=texture2D(u_image1,v_pos1);if (color0.a > 0.0) {color0.rgb=color0.rgb/color0.a;}if (color1.a > 0.0) {color1.rgb=color1.rgb/color1.a;}vec4 color=mix(color0,color1,u_fade_t);color.a*=u_opacity;vec3 rgb=color.rgb;rgb=vec3(dot(rgb,u_spin_weights.xyz),dot(rgb,u_spin_weights.zxy),dot(rgb,u_spin_weights.yzx));float average=(color.r+color.g+color.b)/3.0;rgb+=(average-rgb)*u_saturation_factor;rgb=(rgb-0.5)*u_contrast_factor+0.5;vec3 u_high_vec=vec3(u_brightness_low,u_brightness_low,u_brightness_low);vec3 u_low_vec=vec3(u_brightness_high,u_brightness_high,u_brightness_high);gl_FragColor=vec4(mix(u_high_vec,u_low_vec,rgb)*color.a,color.a);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}", "uniform mat4 u_matrix;uniform vec2 u_tl_parent;uniform float u_scale_parent;uniform float u_buffer_scale;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying vec2 v_pos0;varying vec2 v_pos1;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);v_pos0=(((a_texture_pos/8192.0)-0.5)/u_buffer_scale )+0.5;v_pos1=(v_pos0*u_scale_parent)+u_tl_parent;}"),\n _i = gi("uniform sampler2D u_texture;varying vec2 v_tex;varying float v_fade_opacity;\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize lowp float opacity\\nlowp float alpha=opacity*v_fade_opacity;gl_FragColor=texture2D(u_texture,v_tex)*alpha;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}", "const float PI=3.141592653589793;attribute vec4 a_pos_offset;attribute vec4 a_data;attribute vec4 a_pixeloffset;attribute vec3 a_projected_pos;attribute float a_fade_opacity;uniform bool u_is_size_zoom_constant;uniform bool u_is_size_feature_constant;uniform highp float u_size_t;uniform highp float u_size;uniform highp float u_camera_to_center_distance;uniform highp float u_pitch;uniform bool u_rotate_symbol;uniform highp float u_aspect_ratio;uniform float u_fade_change;uniform mat4 u_matrix;uniform mat4 u_label_plane_matrix;uniform mat4 u_coord_matrix;uniform bool u_is_text;uniform bool u_pitch_with_map;uniform vec2 u_texsize;varying vec2 v_tex;varying float v_fade_opacity;\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize lowp float opacity\\nvec2 a_pos=a_pos_offset.xy;vec2 a_offset=a_pos_offset.zw;vec2 a_tex=a_data.xy;vec2 a_size=a_data.zw;float a_size_min=floor(a_size[0]*0.5);vec2 a_pxoffset=a_pixeloffset.xy;vec2 a_minFontScale=a_pixeloffset.zw/256.0;highp float segment_angle=-a_projected_pos[2];float size;if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {size=mix(a_size_min,a_size[1],u_size_t)/128.0;} else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {size=a_size_min/128.0;} else {size=u_size;}vec4 projectedPoint=u_matrix*vec4(a_pos,0,1);highp float camera_to_anchor_distance=projectedPoint.w;highp float distance_ratio=u_pitch_with_map ?\\ncamera_to_anchor_distance/u_camera_to_center_distance :\\nu_camera_to_center_distance/camera_to_anchor_distance;highp float perspective_ratio=clamp(0.5+0.5*distance_ratio,0.0,4.0);size*=perspective_ratio;float fontScale=u_is_text ? size/24.0 : size;highp float symbol_rotation=0.0;if (u_rotate_symbol) {vec4 offsetProjectedPoint=u_matrix*vec4(a_pos+vec2(1,0),0,1);vec2 a=projectedPoint.xy/projectedPoint.w;vec2 b=offsetProjectedPoint.xy/offsetProjectedPoint.w;symbol_rotation=atan((b.y-a.y)/u_aspect_ratio,b.x-a.x);}highp float angle_sin=sin(segment_angle+symbol_rotation);highp float angle_cos=cos(segment_angle+symbol_rotation);mat2 rotation_matrix=mat2(angle_cos,-1.0*angle_sin,angle_sin,angle_cos);vec4 projected_pos=u_label_plane_matrix*vec4(a_projected_pos.xy,0.0,1.0);gl_Position=u_coord_matrix*vec4(projected_pos.xy/projected_pos.w+rotation_matrix*(a_offset/32.0*max(a_minFontScale,fontScale)+a_pxoffset/16.0),0.0,1.0);v_tex=a_tex/u_texsize;vec2 fade_opacity=unpack_opacity(a_fade_opacity);float fade_change=fade_opacity[1] > 0.5 ? u_fade_change :-u_fade_change;v_fade_opacity=max(0.0,min(1.0,fade_opacity[0]+fade_change));}"),\n fi = gi("#define SDF_PX 8.0\\nuniform bool u_is_halo;uniform sampler2D u_texture;uniform highp float u_gamma_scale;uniform lowp float u_device_pixel_ratio;uniform bool u_is_text;varying vec2 v_data0;varying vec3 v_data1;\\n#pragma mapbox: define highp vec4 fill_color\\n#pragma mapbox: define highp vec4 halo_color\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp float halo_width\\n#pragma mapbox: define lowp float halo_blur\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 fill_color\\n#pragma mapbox: initialize highp vec4 halo_color\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize lowp float halo_width\\n#pragma mapbox: initialize lowp float halo_blur\\nfloat EDGE_GAMMA=0.105/u_device_pixel_ratio;vec2 tex=v_data0.xy;float gamma_scale=v_data1.x;float size=v_data1.y;float fade_opacity=v_data1[2];float fontScale=u_is_text ? size/24.0 : size;lowp vec4 color=fill_color;highp float gamma=EDGE_GAMMA/(fontScale*u_gamma_scale);lowp float buff=(256.0-64.0)/256.0;if (u_is_halo) {color=halo_color;gamma=(halo_blur*1.19/SDF_PX+EDGE_GAMMA)/(fontScale*u_gamma_scale);buff=(6.0-halo_width/fontScale)/SDF_PX;}lowp float dist=texture2D(u_texture,tex).a;highp float gamma_scaled=gamma*gamma_scale;highp float alpha=smoothstep(buff-gamma_scaled,buff+gamma_scaled,dist);gl_FragColor=color*(alpha*opacity*fade_opacity);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}", "const float PI=3.141592653589793;attribute vec4 a_pos_offset;attribute vec4 a_data;attribute vec4 a_pixeloffset;attribute vec3 a_projected_pos;attribute float a_fade_opacity;uniform bool u_is_size_zoom_constant;uniform bool u_is_size_feature_constant;uniform highp float u_size_t;uniform highp float u_size;uniform mat4 u_matrix;uniform mat4 u_label_plane_matrix;uniform mat4 u_coord_matrix;uniform bool u_is_text;uniform bool u_pitch_with_map;uniform highp float u_pitch;uniform bool u_rotate_symbol;uniform highp float u_aspect_ratio;uniform highp float u_camera_to_center_distance;uniform float u_fade_change;uniform vec2 u_texsize;varying vec2 v_data0;varying vec3 v_data1;\\n#pragma mapbox: define highp vec4 fill_color\\n#pragma mapbox: define highp vec4 halo_color\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp float halo_width\\n#pragma mapbox: define lowp float halo_blur\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 fill_color\\n#pragma mapbox: initialize highp vec4 halo_color\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize lowp float halo_width\\n#pragma mapbox: initialize lowp float halo_blur\\nvec2 a_pos=a_pos_offset.xy;vec2 a_offset=a_pos_offset.zw;vec2 a_tex=a_data.xy;vec2 a_size=a_data.zw;float a_size_min=floor(a_size[0]*0.5);vec2 a_pxoffset=a_pixeloffset.xy;highp float segment_angle=-a_projected_pos[2];float size;if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {size=mix(a_size_min,a_size[1],u_size_t)/128.0;} else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {size=a_size_min/128.0;} else {size=u_size;}vec4 projectedPoint=u_matrix*vec4(a_pos,0,1);highp float camera_to_anchor_distance=projectedPoint.w;highp float distance_ratio=u_pitch_with_map ?\\ncamera_to_anchor_distance/u_camera_to_center_distance :\\nu_camera_to_center_distance/camera_to_anchor_distance;highp float perspective_ratio=clamp(0.5+0.5*distance_ratio,0.0,4.0);size*=perspective_ratio;float fontScale=u_is_text ? size/24.0 : size;highp float symbol_rotation=0.0;if (u_rotate_symbol) {vec4 offsetProjectedPoint=u_matrix*vec4(a_pos+vec2(1,0),0,1);vec2 a=projectedPoint.xy/projectedPoint.w;vec2 b=offsetProjectedPoint.xy/offsetProjectedPoint.w;symbol_rotation=atan((b.y-a.y)/u_aspect_ratio,b.x-a.x);}highp float angle_sin=sin(segment_angle+symbol_rotation);highp float angle_cos=cos(segment_angle+symbol_rotation);mat2 rotation_matrix=mat2(angle_cos,-1.0*angle_sin,angle_sin,angle_cos);vec4 projected_pos=u_label_plane_matrix*vec4(a_projected_pos.xy,0.0,1.0);gl_Position=u_coord_matrix*vec4(projected_pos.xy/projected_pos.w+rotation_matrix*(a_offset/32.0*fontScale+a_pxoffset),0.0,1.0);float gamma_scale=gl_Position.w;vec2 fade_opacity=unpack_opacity(a_fade_opacity);float fade_change=fade_opacity[1] > 0.5 ? u_fade_change :-u_fade_change;float interpolated_fade_opacity=max(0.0,min(1.0,fade_opacity[0]+fade_change));v_data0=a_tex/u_texsize;v_data1=vec3(gamma_scale,size,interpolated_fade_opacity);}"),\n mi = gi("#define SDF_PX 8.0\\n#define SDF 1.0\\n#define ICON 0.0\\nuniform bool u_is_halo;uniform sampler2D u_texture;uniform sampler2D u_texture_icon;uniform highp float u_gamma_scale;uniform lowp float u_device_pixel_ratio;varying vec4 v_data0;varying vec4 v_data1;\\n#pragma mapbox: define highp vec4 fill_color\\n#pragma mapbox: define highp vec4 halo_color\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp float halo_width\\n#pragma mapbox: define lowp float halo_blur\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 fill_color\\n#pragma mapbox: initialize highp vec4 halo_color\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize lowp float halo_width\\n#pragma mapbox: initialize lowp float halo_blur\\nfloat fade_opacity=v_data1[2];if (v_data1.w==ICON) {vec2 tex_icon=v_data0.zw;lowp float alpha=opacity*fade_opacity;gl_FragColor=texture2D(u_texture_icon,tex_icon)*alpha;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\nreturn;}vec2 tex=v_data0.xy;float EDGE_GAMMA=0.105/u_device_pixel_ratio;float gamma_scale=v_data1.x;float size=v_data1.y;float fontScale=size/24.0;lowp vec4 color=fill_color;highp float gamma=EDGE_GAMMA/(fontScale*u_gamma_scale);lowp float buff=(256.0-64.0)/256.0;if (u_is_halo) {color=halo_color;gamma=(halo_blur*1.19/SDF_PX+EDGE_GAMMA)/(fontScale*u_gamma_scale);buff=(6.0-halo_width/fontScale)/SDF_PX;}lowp float dist=texture2D(u_texture,tex).a;highp float gamma_scaled=gamma*gamma_scale;highp float alpha=smoothstep(buff-gamma_scaled,buff+gamma_scaled,dist);gl_FragColor=color*(alpha*opacity*fade_opacity);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}", "const float PI=3.141592653589793;attribute vec4 a_pos_offset;attribute vec4 a_data;attribute vec3 a_projected_pos;attribute float a_fade_opacity;uniform bool u_is_size_zoom_constant;uniform bool u_is_size_feature_constant;uniform highp float u_size_t;uniform highp float u_size;uniform mat4 u_matrix;uniform mat4 u_label_plane_matrix;uniform mat4 u_coord_matrix;uniform bool u_is_text;uniform bool u_pitch_with_map;uniform highp float u_pitch;uniform bool u_rotate_symbol;uniform highp float u_aspect_ratio;uniform highp float u_camera_to_center_distance;uniform float u_fade_change;uniform vec2 u_texsize;uniform vec2 u_texsize_icon;varying vec4 v_data0;varying vec4 v_data1;\\n#pragma mapbox: define highp vec4 fill_color\\n#pragma mapbox: define highp vec4 halo_color\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp float halo_width\\n#pragma mapbox: define lowp float halo_blur\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 fill_color\\n#pragma mapbox: initialize highp vec4 halo_color\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize lowp float halo_width\\n#pragma mapbox: initialize lowp float halo_blur\\nvec2 a_pos=a_pos_offset.xy;vec2 a_offset=a_pos_offset.zw;vec2 a_tex=a_data.xy;vec2 a_size=a_data.zw;float a_size_min=floor(a_size[0]*0.5);float is_sdf=a_size[0]-2.0*a_size_min;highp float segment_angle=-a_projected_pos[2];float size;if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {size=mix(a_size_min,a_size[1],u_size_t)/128.0;} else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {size=a_size_min/128.0;} else {size=u_size;}vec4 projectedPoint=u_matrix*vec4(a_pos,0,1);highp float camera_to_anchor_distance=projectedPoint.w;highp float distance_ratio=u_pitch_with_map ?\\ncamera_to_anchor_distance/u_camera_to_center_distance :\\nu_camera_to_center_distance/camera_to_anchor_distance;highp float perspective_ratio=clamp(0.5+0.5*distance_ratio,0.0,4.0);size*=perspective_ratio;float fontScale=size/24.0;highp float symbol_rotation=0.0;if (u_rotate_symbol) {vec4 offsetProjectedPoint=u_matrix*vec4(a_pos+vec2(1,0),0,1);vec2 a=projectedPoint.xy/projectedPoint.w;vec2 b=offsetProjectedPoint.xy/offsetProjectedPoint.w;symbol_rotation=atan((b.y-a.y)/u_aspect_ratio,b.x-a.x);}highp float angle_sin=sin(segment_angle+symbol_rotation);highp float angle_cos=cos(segment_angle+symbol_rotation);mat2 rotation_matrix=mat2(angle_cos,-1.0*angle_sin,angle_sin,angle_cos);vec4 projected_pos=u_label_plane_matrix*vec4(a_projected_pos.xy,0.0,1.0);gl_Position=u_coord_matrix*vec4(projected_pos.xy/projected_pos.w+rotation_matrix*(a_offset/32.0*fontScale),0.0,1.0);float gamma_scale=gl_Position.w;vec2 fade_opacity=unpack_opacity(a_fade_opacity);float fade_change=fade_opacity[1] > 0.5 ? u_fade_change :-u_fade_change;float interpolated_fade_opacity=max(0.0,min(1.0,fade_opacity[0]+fade_change));v_data0.xy=a_tex/u_texsize;v_data0.zw=a_tex/u_texsize_icon;v_data1=vec4(gamma_scale,size,interpolated_fade_opacity,is_sdf);}");\n\n function gi(t, e) {\n var i = /#pragma mapbox: ([\\w]+) ([\\w]+) ([\\w]+) ([\\w]+)/g,\n o = e.match(/attribute ([\\w]+) ([\\w]+)/g),\n r = t.match(/uniform ([\\w]+) ([\\w]+)([\\s]*)([\\w]*)/g),\n a = e.match(/uniform ([\\w]+) ([\\w]+)([\\s]*)([\\w]*)/g),\n n = a ? a.concat(r) : r,\n s = {};\n return {\n fragmentSource: t = t.replace(i, function (t, e, i, o, r) {\n return s[r] = !0, "define" === e ? "\\n#ifndef HAS_UNIFORM_u_" + r + "\\nvarying " + i + " " + o + " " + r + ";\\n#else\\nuniform " + i + " " + o + " u_" + r + ";\\n#endif\\n" : "\\n#ifdef HAS_UNIFORM_u_" + r + "\\n " + i + " " + o + " " + r + " = u_" + r + ";\\n#endif\\n";\n }),\n vertexSource: e = e.replace(i, function (t, e, i, o, r) {\n var a = "float" === o ? "vec2" : "vec4",\n n = r.match(/color/) ? "color" : a;\n return s[r] ? "define" === e ? "\\n#ifndef HAS_UNIFORM_u_" + r + "\\nuniform lowp float u_" + r + "_t;\\nattribute " + i + " " + a + " a_" + r + ";\\nvarying " + i + " " + o + " " + r + ";\\n#else\\nuniform " + i + " " + o + " u_" + r + ";\\n#endif\\n" : "vec4" === n ? "\\n#ifndef HAS_UNIFORM_u_" + r + "\\n " + r + " = a_" + r + ";\\n#else\\n " + i + " " + o + " " + r + " = u_" + r + ";\\n#endif\\n" : "\\n#ifndef HAS_UNIFORM_u_" + r + "\\n " + r + " = unpack_mix_" + n + "(a_" + r + ", u_" + r + "_t);\\n#else\\n " + i + " " + o + " " + r + " = u_" + r + ";\\n#endif\\n" : "define" === e ? "\\n#ifndef HAS_UNIFORM_u_" + r + "\\nuniform lowp float u_" + r + "_t;\\nattribute " + i + " " + a + " a_" + r + ";\\n#else\\nuniform " + i + " " + o + " u_" + r + ";\\n#endif\\n" : "vec4" === n ? "\\n#ifndef HAS_UNIFORM_u_" + r + "\\n " + i + " " + o + " " + r + " = a_" + r + ";\\n#else\\n " + i + " " + o + " " + r + " = u_" + r + ";\\n#endif\\n" : "\\n#ifndef HAS_UNIFORM_u_" + r + "\\n " + i + " " + o + " " + r + " = unpack_mix_" + n + "(a_" + r + ", u_" + r + "_t);\\n#else\\n " + i + " " + o + " " + r + " = u_" + r + ";\\n#endif\\n";\n }),\n staticAttributes: o,\n staticUniforms: n\n };\n }\n\n var vi = Object.freeze({\n __proto__: null,\n prelude: Ge,\n background: We,\n backgroundPattern: Xe,\n circle: He,\n clippingMask: Ke,\n heatmap: Ye,\n heatmapTexture: Je,\n collisionBox: Qe,\n collisionCircle: $e,\n debug: ti,\n fill: ei,\n fillOutline: ii,\n fillOutlinePattern: oi,\n fillPattern: ri,\n fillExtrusion: ai,\n fillExtrusionPattern: ni,\n hillshadePrepare: si,\n hillshade: li,\n line: ci,\n lineGradient: ui,\n linePattern: hi,\n lineSDF: pi,\n raster: di,\n symbolIcon: _i,\n symbolSDF: fi,\n symbolTextAndIcon: mi\n }),\n yi = function yi() {\n this.boundProgram = null, this.boundLayoutVertexBuffer = null, this.boundPaintVertexBuffers = [], this.boundIndexBuffer = null, this.boundVertexOffset = null, this.boundDynamicVertexBuffer = null, this.vao = null;\n };\n\n function xi(t) {\n for (var e = [], i = 0; i < t.length; i++) {\n if (null !== t[i]) {\n var o = t[i].split(" ");\n e.push(o.pop());\n }\n }\n\n return e;\n }\n\n yi.prototype.bind = function (t, e, i, o, r, a, n, s) {\n this.context = t;\n\n for (var l = this.boundPaintVertexBuffers.length !== o.length, c = 0; !l && c < o.length; c++) {\n this.boundPaintVertexBuffers[c] !== o[c] && (l = !0);\n }\n\n t.extVertexArrayObject && this.vao && this.boundProgram === e && this.boundLayoutVertexBuffer === i && !l && this.boundIndexBuffer === r && this.boundVertexOffset === a && this.boundDynamicVertexBuffer === n && this.boundDynamicVertexBuffer2 === s ? (t.bindVertexArrayOES.set(this.vao), n && n.bind(), r && r.dynamicDraw && r.bind(), s && s.bind()) : this.freshBind(e, i, o, r, a, n, s);\n }, yi.prototype.freshBind = function (t, e, i, o, r, a, n) {\n var s,\n l = t.numAttributes,\n c = this.context,\n u = c.gl;\n if (c.extVertexArrayObject) this.vao && this.destroy(), this.vao = c.extVertexArrayObject.createVertexArrayOES(), c.bindVertexArrayOES.set(this.vao), s = 0, this.boundProgram = t, this.boundLayoutVertexBuffer = e, this.boundPaintVertexBuffers = i, this.boundIndexBuffer = o, this.boundVertexOffset = r, this.boundDynamicVertexBuffer = a, this.boundDynamicVertexBuffer2 = n;else {\n s = c.currentNumAttributes || 0;\n\n for (var h = l; h < s; h++) {\n u.disableVertexAttribArray(h);\n }\n }\n e.enableAttributes(u, t);\n\n for (var p = 0, d = i; p < d.length; p += 1) {\n d[p].enableAttributes(u, t);\n }\n\n a && a.enableAttributes(u, t), n && n.enableAttributes(u, t), e.bind(), e.setVertexAttribPointers(u, t, r);\n\n for (var _ = 0, f = i; _ < f.length; _ += 1) {\n var m = f[_];\n m.bind(), m.setVertexAttribPointers(u, t, r);\n }\n\n a && (a.bind(), a.setVertexAttribPointers(u, t, r)), o && o.bind(), n && (n.bind(), n.setVertexAttribPointers(u, t, r)), c.currentNumAttributes = l;\n }, yi.prototype.destroy = function () {\n this.vao && (this.context.extVertexArrayObject.deleteVertexArrayOES(this.vao), this.vao = null);\n };\n\n var bi = function bi(t, e, i, o, r, a) {\n var n = t.gl;\n this.program = n.createProgram();\n\n for (var s = xi(i.staticAttributes), l = o ? o.getBinderAttributes() : [], c = s.concat(l), u = i.staticUniforms ? xi(i.staticUniforms) : [], h = o ? o.getBinderUniforms() : [], p = [], d = 0, _ = u.concat(h); d < _.length; d += 1) {\n var f = _[d];\n p.indexOf(f) < 0 && p.push(f);\n }\n\n var m = o ? o.defines() : [];\n a && m.push("#define OVERDRAW_INSPECTOR;");\n var g = m.concat(Ge.fragmentSource, i.fragmentSource).join("\\n"),\n v = m.concat(Ge.vertexSource, i.vertexSource).join("\\n"),\n y = n.createShader(n.FRAGMENT_SHADER);\n if (n.isContextLost()) this.failedToCreate = !0;else {\n n.shaderSource(y, g), n.compileShader(y), n.attachShader(this.program, y);\n var x = n.createShader(n.VERTEX_SHADER);\n if (n.isContextLost()) this.failedToCreate = !0;else {\n n.shaderSource(x, v), n.compileShader(x), n.attachShader(this.program, x), this.attributes = {};\n var b = {};\n this.numAttributes = c.length;\n\n for (var w = 0; w < this.numAttributes; w++) {\n c[w] && (n.bindAttribLocation(this.program, w, c[w]), this.attributes[c[w]] = w);\n }\n\n n.linkProgram(this.program), n.deleteShader(x), n.deleteShader(y);\n\n for (var T = 0; T < p.length; T++) {\n var E = p[T];\n\n if (E && !b[E]) {\n var I = n.getUniformLocation(this.program, E);\n I && (b[E] = I);\n }\n }\n\n this.fixedUniforms = r(t, b), this.binderUniforms = o ? o.getUniforms(t, b) : [];\n }\n }\n };\n\n function wi(t, e, i) {\n var o = 1 / pe(i, 1, e.transform.tileZoom),\n r = Math.pow(2, i.tileID.overscaledZ),\n a = i.tileSize * Math.pow(2, e.transform.tileZoom) / r,\n n = a * (i.tileID.canonical.x + i.tileID.wrap * r),\n s = a * i.tileID.canonical.y;\n return {\n u_image: 0,\n u_texsize: i.imageAtlasTexture.size,\n u_scale: [o, t.fromScale, t.toScale],\n u_fade: t.t,\n u_pixel_coord_upper: [n >> 16, s >> 16],\n u_pixel_coord_lower: [65535 & n, 65535 & s]\n };\n }\n\n bi.prototype.draw = function (t, e, i, o, r, a, n, s, l, c, u, h, p, d, _, f) {\n var m,\n g = t.gl;\n\n if (!this.failedToCreate) {\n for (var v in t.program.set(this.program), t.setDepthMode(i), t.setStencilMode(o), t.setColorMode(r), t.setCullFace(a), this.fixedUniforms) {\n this.fixedUniforms[v].set(n[v]);\n }\n\n d && d.setUniforms(t, this.binderUniforms, h, {\n zoom: p\n });\n\n for (var y = (m = {}, m[g.LINES] = 2, m[g.TRIANGLES] = 3, m[g.LINE_STRIP] = 1, m)[e], x = 0, b = u.get(); x < b.length; x += 1) {\n var w = b[x],\n T = w.vaos || (w.vaos = {});\n (T[s] || (T[s] = new yi())).bind(t, this, l, d ? d.getPaintVertexBuffers() : [], c, w.vertexOffset, _, f), g.drawElements(e, w.primitiveLength * y, g.UNSIGNED_SHORT, w.primitiveOffset * y * 2);\n }\n }\n };\n\n var Ti = function Ti(e, i, o, r) {\n var a = i.style.light,\n n = a.properties.get("position"),\n s = [n.x, n.y, n.z],\n l = t.create$1();\n "viewport" === a.properties.get("anchor") && t.fromRotation(l, -i.transform.angle), t.transformMat3(s, s, l);\n var c = a.properties.get("color");\n return {\n u_matrix: e,\n u_lightpos: s,\n u_lightintensity: a.properties.get("intensity"),\n u_lightcolor: [c.r, c.g, c.b],\n u_vertical_gradient: +o,\n u_opacity: r\n };\n },\n Ei = function Ei(e, i, o, r, a, n, s) {\n return t.extend(Ti(e, i, o, r), wi(n, i, s), {\n u_height_factor: -Math.pow(2, a.overscaledZ) / s.tileSize / 8\n });\n },\n Ii = function Ii(t) {\n return {\n u_matrix: t\n };\n },\n Pi = function Pi(e, i, o, r) {\n return t.extend(Ii(e), wi(o, i, r));\n },\n Si = function Si(t, e) {\n return {\n u_matrix: t,\n u_world: e\n };\n },\n Ci = function Ci(e, i, o, r, a) {\n return t.extend(Pi(e, i, o, r), {\n u_world: a\n });\n },\n zi = function zi(e, i, o, r) {\n var a,\n n,\n s = e.transform;\n\n if ("map" === r.paint.get("circle-pitch-alignment")) {\n var l = pe(o, 1, s.zoom);\n a = !0, n = [l, l];\n } else a = !1, n = s.pixelsToGLUnits;\n\n return {\n u_camera_to_center_distance: s.cameraToCenterDistance,\n u_scale_with_map: +("map" === r.paint.get("circle-pitch-scale")),\n u_matrix: e.translatePosMatrix(i.posMatrix, o, r.paint.get("circle-translate"), r.paint.get("circle-translate-anchor")),\n u_pitch_with_map: +a,\n u_device_pixel_ratio: t.browser.devicePixelRatio,\n u_extrude_scale: n\n };\n },\n Di = function Di(t, e, i) {\n var o = pe(i, 1, e.zoom),\n r = Math.pow(2, e.zoom - i.tileID.overscaledZ),\n a = i.tileID.overscaleFactor();\n return {\n u_matrix: t,\n u_camera_to_center_distance: e.cameraToCenterDistance,\n u_pixels_to_tile_units: o,\n u_extrude_scale: [e.pixelsToGLUnits[0] / (o * r), e.pixelsToGLUnits[1] / (o * r)],\n u_overscale_factor: a\n };\n },\n Ai = function Ai(t, e, i) {\n return {\n u_matrix: t,\n u_inv_matrix: e,\n u_camera_to_center_distance: i.cameraToCenterDistance,\n u_viewport_size: [i.width, i.height]\n };\n },\n Mi = function Mi(t, e, i) {\n return void 0 === i && (i = 1), {\n u_matrix: t,\n u_color: e,\n u_overlay: 0,\n u_overlay_scale: i\n };\n },\n Li = function Li(t) {\n return {\n u_matrix: t\n };\n },\n Ri = function Ri(t, e, i, o) {\n return {\n u_matrix: t,\n u_extrude_scale: pe(e, 1, i),\n u_intensity: o\n };\n },\n ki = function ki(e, i, o) {\n var r = e.transform;\n return {\n u_matrix: Ni(e, i, o),\n u_ratio: 1 / pe(i, 1, r.zoom),\n u_device_pixel_ratio: t.browser.devicePixelRatio,\n u_units_to_pixels: [1 / r.pixelsToGLUnits[0], 1 / r.pixelsToGLUnits[1]]\n };\n },\n Bi = function Bi(e, i, o, r) {\n return t.extend(ki(e, i, o), {\n u_image: 0,\n u_image_height: r\n });\n },\n Oi = function Oi(e, i, o, r) {\n var a = e.transform,\n n = Ui(i, a);\n return {\n u_matrix: Ni(e, i, o),\n u_texsize: i.imageAtlasTexture.size,\n u_ratio: 1 / pe(i, 1, a.zoom),\n u_device_pixel_ratio: t.browser.devicePixelRatio,\n u_image: 0,\n u_scale: [n, r.fromScale, r.toScale],\n u_fade: r.t,\n u_units_to_pixels: [1 / a.pixelsToGLUnits[0], 1 / a.pixelsToGLUnits[1]]\n };\n },\n Fi = function Fi(e, i, o, r, a) {\n var n = e.lineAtlas,\n s = Ui(i, e.transform),\n l = "round" === o.layout.get("line-cap"),\n c = n.getDash(r.from, l),\n u = n.getDash(r.to, l),\n h = c.width * a.fromScale,\n p = u.width * a.toScale;\n return t.extend(ki(e, i, o), {\n u_patternscale_a: [s / h, -c.height / 2],\n u_patternscale_b: [s / p, -u.height / 2],\n u_sdfgamma: n.width / (256 * Math.min(h, p) * t.browser.devicePixelRatio) / 2,\n u_image: 0,\n u_tex_y_a: c.y,\n u_tex_y_b: u.y,\n u_mix: a.t\n });\n };\n\n function Ui(t, e) {\n return 1 / pe(t, 1, e.tileZoom);\n }\n\n function Ni(t, e, i) {\n return t.translatePosMatrix(e.tileID.posMatrix, e, i.paint.get("line-translate"), i.paint.get("line-translate-anchor"));\n }\n\n var Zi = function Zi(t, e, i, o, r) {\n return {\n u_matrix: t,\n u_tl_parent: e,\n u_scale_parent: i,\n u_buffer_scale: 1,\n u_fade_t: o.mix,\n u_opacity: o.opacity * r.paint.get("raster-opacity"),\n u_image0: 0,\n u_image1: 1,\n u_brightness_low: r.paint.get("raster-brightness-min"),\n u_brightness_high: r.paint.get("raster-brightness-max"),\n u_saturation_factor: (n = r.paint.get("raster-saturation"), n > 0 ? 1 - 1 / (1.001 - n) : -n),\n u_contrast_factor: (a = r.paint.get("raster-contrast"), a > 0 ? 1 / (1 - a) : 1 + a),\n u_spin_weights: qi(r.paint.get("raster-hue-rotate"))\n };\n var a, n;\n };\n\n function qi(t) {\n t *= Math.PI / 180;\n var e = Math.sin(t),\n i = Math.cos(t);\n return [(2 * i + 1) / 3, (-Math.sqrt(3) * e - i + 1) / 3, (Math.sqrt(3) * e - i + 1) / 3];\n }\n\n var ji,\n Vi = function Vi(t, e, i, o, r, a, n, s, l, c) {\n var u = r.transform;\n return {\n u_is_size_zoom_constant: +("constant" === t || "source" === t),\n u_is_size_feature_constant: +("constant" === t || "camera" === t),\n u_size_t: e ? e.uSizeT : 0,\n u_size: e ? e.uSize : 0,\n u_camera_to_center_distance: u.cameraToCenterDistance,\n u_pitch: u.pitch / 360 * 2 * Math.PI,\n u_rotate_symbol: +i,\n u_aspect_ratio: u.width / u.height,\n u_fade_change: r.options.fadeDuration ? r.symbolFadeChange : 1,\n u_matrix: a,\n u_label_plane_matrix: n,\n u_coord_matrix: s,\n u_is_text: +l,\n u_pitch_with_map: +o,\n u_texsize: c,\n u_texture: 0\n };\n },\n Gi = function Gi(e, i, o, r, a, n, s, l, c, u, h) {\n var p = a.transform;\n return t.extend(Vi(e, i, o, r, a, n, s, l, c, u), {\n u_gamma_scale: r ? Math.cos(p._pitch) * p.cameraToCenterDistance : 1,\n u_device_pixel_ratio: t.browser.devicePixelRatio,\n u_is_halo: +h\n });\n },\n Wi = function Wi(e, i, o, r, a, n, s, l, c, u) {\n return t.extend(Gi(e, i, o, r, a, n, s, l, !0, c, !0), {\n u_texsize_icon: u,\n u_texture_icon: 1\n });\n },\n Xi = function Xi(t, e, i) {\n return {\n u_matrix: t,\n u_opacity: e,\n u_color: i\n };\n },\n Hi = function Hi(e, i, o, r, a, n) {\n return t.extend(function (t, e, i, o) {\n var r = i.imageManager.getPattern(t.from.toString()),\n a = i.imageManager.getPattern(t.to.toString()),\n n = i.imageManager.getPixelSize(),\n s = n.width,\n l = n.height,\n c = Math.pow(2, o.tileID.overscaledZ),\n u = o.tileSize * Math.pow(2, i.transform.tileZoom) / c,\n h = u * (o.tileID.canonical.x + o.tileID.wrap * c),\n p = u * o.tileID.canonical.y;\n return {\n u_image: 0,\n u_pattern_tl_a: r.tl,\n u_pattern_br_a: r.br,\n u_pattern_tl_b: a.tl,\n u_pattern_br_b: a.br,\n u_texsize: [s, l],\n u_mix: e.t,\n u_pattern_size_a: r.displaySize,\n u_pattern_size_b: a.displaySize,\n u_scale_a: e.fromScale,\n u_scale_b: e.toScale,\n u_tile_units_to_pixels: 1 / pe(o, 1, i.transform.tileZoom),\n u_pixel_coord_upper: [h >> 16, p >> 16],\n u_pixel_coord_lower: [65535 & h, 65535 & p]\n };\n }(r, n, o, a), {\n u_matrix: e,\n u_opacity: i\n });\n },\n Ki = {\n fillExtrusion: function fillExtrusion(e, i) {\n return {\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix),\n u_lightpos: new t.Uniform3f(e, i.u_lightpos),\n u_lightintensity: new t.Uniform1f(e, i.u_lightintensity),\n u_lightcolor: new t.Uniform3f(e, i.u_lightcolor),\n u_vertical_gradient: new t.Uniform1f(e, i.u_vertical_gradient),\n u_opacity: new t.Uniform1f(e, i.u_opacity)\n };\n },\n fillExtrusionPattern: function fillExtrusionPattern(e, i) {\n return {\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix),\n u_lightpos: new t.Uniform3f(e, i.u_lightpos),\n u_lightintensity: new t.Uniform1f(e, i.u_lightintensity),\n u_lightcolor: new t.Uniform3f(e, i.u_lightcolor),\n u_vertical_gradient: new t.Uniform1f(e, i.u_vertical_gradient),\n u_height_factor: new t.Uniform1f(e, i.u_height_factor),\n u_image: new t.Uniform1i(e, i.u_image),\n u_texsize: new t.Uniform2f(e, i.u_texsize),\n u_pixel_coord_upper: new t.Uniform2f(e, i.u_pixel_coord_upper),\n u_pixel_coord_lower: new t.Uniform2f(e, i.u_pixel_coord_lower),\n u_scale: new t.Uniform3f(e, i.u_scale),\n u_fade: new t.Uniform1f(e, i.u_fade),\n u_opacity: new t.Uniform1f(e, i.u_opacity)\n };\n },\n fill: function fill(e, i) {\n return {\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix)\n };\n },\n fillPattern: function fillPattern(e, i) {\n return {\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix),\n u_image: new t.Uniform1i(e, i.u_image),\n u_texsize: new t.Uniform2f(e, i.u_texsize),\n u_pixel_coord_upper: new t.Uniform2f(e, i.u_pixel_coord_upper),\n u_pixel_coord_lower: new t.Uniform2f(e, i.u_pixel_coord_lower),\n u_scale: new t.Uniform3f(e, i.u_scale),\n u_fade: new t.Uniform1f(e, i.u_fade)\n };\n },\n fillOutline: function fillOutline(e, i) {\n return {\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix),\n u_world: new t.Uniform2f(e, i.u_world)\n };\n },\n fillOutlinePattern: function fillOutlinePattern(e, i) {\n return {\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix),\n u_world: new t.Uniform2f(e, i.u_world),\n u_image: new t.Uniform1i(e, i.u_image),\n u_texsize: new t.Uniform2f(e, i.u_texsize),\n u_pixel_coord_upper: new t.Uniform2f(e, i.u_pixel_coord_upper),\n u_pixel_coord_lower: new t.Uniform2f(e, i.u_pixel_coord_lower),\n u_scale: new t.Uniform3f(e, i.u_scale),\n u_fade: new t.Uniform1f(e, i.u_fade)\n };\n },\n circle: function circle(e, i) {\n return {\n u_camera_to_center_distance: new t.Uniform1f(e, i.u_camera_to_center_distance),\n u_scale_with_map: new t.Uniform1i(e, i.u_scale_with_map),\n u_pitch_with_map: new t.Uniform1i(e, i.u_pitch_with_map),\n u_extrude_scale: new t.Uniform2f(e, i.u_extrude_scale),\n u_device_pixel_ratio: new t.Uniform1f(e, i.u_device_pixel_ratio),\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix)\n };\n },\n collisionBox: function collisionBox(e, i) {\n return {\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix),\n u_camera_to_center_distance: new t.Uniform1f(e, i.u_camera_to_center_distance),\n u_pixels_to_tile_units: new t.Uniform1f(e, i.u_pixels_to_tile_units),\n u_extrude_scale: new t.Uniform2f(e, i.u_extrude_scale),\n u_overscale_factor: new t.Uniform1f(e, i.u_overscale_factor)\n };\n },\n collisionCircle: function collisionCircle(e, i) {\n return {\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix),\n u_inv_matrix: new t.UniformMatrix4f(e, i.u_inv_matrix),\n u_camera_to_center_distance: new t.Uniform1f(e, i.u_camera_to_center_distance),\n u_viewport_size: new t.Uniform2f(e, i.u_viewport_size)\n };\n },\n debug: function debug(e, i) {\n return {\n u_color: new t.UniformColor(e, i.u_color),\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix),\n u_overlay: new t.Uniform1i(e, i.u_overlay),\n u_overlay_scale: new t.Uniform1f(e, i.u_overlay_scale)\n };\n },\n clippingMask: function clippingMask(e, i) {\n return {\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix)\n };\n },\n heatmap: function heatmap(e, i) {\n return {\n u_extrude_scale: new t.Uniform1f(e, i.u_extrude_scale),\n u_intensity: new t.Uniform1f(e, i.u_intensity),\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix)\n };\n },\n heatmapTexture: function heatmapTexture(e, i) {\n return {\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix),\n u_world: new t.Uniform2f(e, i.u_world),\n u_image: new t.Uniform1i(e, i.u_image),\n u_color_ramp: new t.Uniform1i(e, i.u_color_ramp),\n u_opacity: new t.Uniform1f(e, i.u_opacity)\n };\n },\n hillshade: function hillshade(e, i) {\n return {\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix),\n u_image: new t.Uniform1i(e, i.u_image),\n u_latrange: new t.Uniform2f(e, i.u_latrange),\n u_light: new t.Uniform2f(e, i.u_light),\n u_shadow: new t.UniformColor(e, i.u_shadow),\n u_highlight: new t.UniformColor(e, i.u_highlight),\n u_accent: new t.UniformColor(e, i.u_accent)\n };\n },\n hillshadePrepare: function hillshadePrepare(e, i) {\n return {\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix),\n u_image: new t.Uniform1i(e, i.u_image),\n u_dimension: new t.Uniform2f(e, i.u_dimension),\n u_zoom: new t.Uniform1f(e, i.u_zoom),\n u_unpack: new t.Uniform4f(e, i.u_unpack)\n };\n },\n line: function line(e, i) {\n return {\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix),\n u_ratio: new t.Uniform1f(e, i.u_ratio),\n u_device_pixel_ratio: new t.Uniform1f(e, i.u_device_pixel_ratio),\n u_units_to_pixels: new t.Uniform2f(e, i.u_units_to_pixels)\n };\n },\n lineGradient: function lineGradient(e, i) {\n return {\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix),\n u_ratio: new t.Uniform1f(e, i.u_ratio),\n u_device_pixel_ratio: new t.Uniform1f(e, i.u_device_pixel_ratio),\n u_units_to_pixels: new t.Uniform2f(e, i.u_units_to_pixels),\n u_image: new t.Uniform1i(e, i.u_image),\n u_image_height: new t.Uniform1f(e, i.u_image_height)\n };\n },\n linePattern: function linePattern(e, i) {\n return {\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix),\n u_texsize: new t.Uniform2f(e, i.u_texsize),\n u_ratio: new t.Uniform1f(e, i.u_ratio),\n u_device_pixel_ratio: new t.Uniform1f(e, i.u_device_pixel_ratio),\n u_image: new t.Uniform1i(e, i.u_image),\n u_units_to_pixels: new t.Uniform2f(e, i.u_units_to_pixels),\n u_scale: new t.Uniform3f(e, i.u_scale),\n u_fade: new t.Uniform1f(e, i.u_fade)\n };\n },\n lineSDF: function lineSDF(e, i) {\n return {\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix),\n u_ratio: new t.Uniform1f(e, i.u_ratio),\n u_device_pixel_ratio: new t.Uniform1f(e, i.u_device_pixel_ratio),\n u_units_to_pixels: new t.Uniform2f(e, i.u_units_to_pixels),\n u_patternscale_a: new t.Uniform2f(e, i.u_patternscale_a),\n u_patternscale_b: new t.Uniform2f(e, i.u_patternscale_b),\n u_sdfgamma: new t.Uniform1f(e, i.u_sdfgamma),\n u_image: new t.Uniform1i(e, i.u_image),\n u_tex_y_a: new t.Uniform1f(e, i.u_tex_y_a),\n u_tex_y_b: new t.Uniform1f(e, i.u_tex_y_b),\n u_mix: new t.Uniform1f(e, i.u_mix)\n };\n },\n raster: function raster(e, i) {\n return {\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix),\n u_tl_parent: new t.Uniform2f(e, i.u_tl_parent),\n u_scale_parent: new t.Uniform1f(e, i.u_scale_parent),\n u_buffer_scale: new t.Uniform1f(e, i.u_buffer_scale),\n u_fade_t: new t.Uniform1f(e, i.u_fade_t),\n u_opacity: new t.Uniform1f(e, i.u_opacity),\n u_image0: new t.Uniform1i(e, i.u_image0),\n u_image1: new t.Uniform1i(e, i.u_image1),\n u_brightness_low: new t.Uniform1f(e, i.u_brightness_low),\n u_brightness_high: new t.Uniform1f(e, i.u_brightness_high),\n u_saturation_factor: new t.Uniform1f(e, i.u_saturation_factor),\n u_contrast_factor: new t.Uniform1f(e, i.u_contrast_factor),\n u_spin_weights: new t.Uniform3f(e, i.u_spin_weights)\n };\n },\n symbolIcon: function symbolIcon(e, i) {\n return {\n u_is_size_zoom_constant: new t.Uniform1i(e, i.u_is_size_zoom_constant),\n u_is_size_feature_constant: new t.Uniform1i(e, i.u_is_size_feature_constant),\n u_size_t: new t.Uniform1f(e, i.u_size_t),\n u_size: new t.Uniform1f(e, i.u_size),\n u_camera_to_center_distance: new t.Uniform1f(e, i.u_camera_to_center_distance),\n u_pitch: new t.Uniform1f(e, i.u_pitch),\n u_rotate_symbol: new t.Uniform1i(e, i.u_rotate_symbol),\n u_aspect_ratio: new t.Uniform1f(e, i.u_aspect_ratio),\n u_fade_change: new t.Uniform1f(e, i.u_fade_change),\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix),\n u_label_plane_matrix: new t.UniformMatrix4f(e, i.u_label_plane_matrix),\n u_coord_matrix: new t.UniformMatrix4f(e, i.u_coord_matrix),\n u_is_text: new t.Uniform1i(e, i.u_is_text),\n u_pitch_with_map: new t.Uniform1i(e, i.u_pitch_with_map),\n u_texsize: new t.Uniform2f(e, i.u_texsize),\n u_texture: new t.Uniform1i(e, i.u_texture)\n };\n },\n symbolSDF: function symbolSDF(e, i) {\n return {\n u_is_size_zoom_constant: new t.Uniform1i(e, i.u_is_size_zoom_constant),\n u_is_size_feature_constant: new t.Uniform1i(e, i.u_is_size_feature_constant),\n u_size_t: new t.Uniform1f(e, i.u_size_t),\n u_size: new t.Uniform1f(e, i.u_size),\n u_camera_to_center_distance: new t.Uniform1f(e, i.u_camera_to_center_distance),\n u_pitch: new t.Uniform1f(e, i.u_pitch),\n u_rotate_symbol: new t.Uniform1i(e, i.u_rotate_symbol),\n u_aspect_ratio: new t.Uniform1f(e, i.u_aspect_ratio),\n u_fade_change: new t.Uniform1f(e, i.u_fade_change),\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix),\n u_label_plane_matrix: new t.UniformMatrix4f(e, i.u_label_plane_matrix),\n u_coord_matrix: new t.UniformMatrix4f(e, i.u_coord_matrix),\n u_is_text: new t.Uniform1i(e, i.u_is_text),\n u_pitch_with_map: new t.Uniform1i(e, i.u_pitch_with_map),\n u_texsize: new t.Uniform2f(e, i.u_texsize),\n u_texture: new t.Uniform1i(e, i.u_texture),\n u_gamma_scale: new t.Uniform1f(e, i.u_gamma_scale),\n u_device_pixel_ratio: new t.Uniform1f(e, i.u_device_pixel_ratio),\n u_is_halo: new t.Uniform1i(e, i.u_is_halo)\n };\n },\n symbolTextAndIcon: function symbolTextAndIcon(e, i) {\n return {\n u_is_size_zoom_constant: new t.Uniform1i(e, i.u_is_size_zoom_constant),\n u_is_size_feature_constant: new t.Uniform1i(e, i.u_is_size_feature_constant),\n u_size_t: new t.Uniform1f(e, i.u_size_t),\n u_size: new t.Uniform1f(e, i.u_size),\n u_camera_to_center_distance: new t.Uniform1f(e, i.u_camera_to_center_distance),\n u_pitch: new t.Uniform1f(e, i.u_pitch),\n u_rotate_symbol: new t.Uniform1i(e, i.u_rotate_symbol),\n u_aspect_ratio: new t.Uniform1f(e, i.u_aspect_ratio),\n u_fade_change: new t.Uniform1f(e, i.u_fade_change),\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix),\n u_label_plane_matrix: new t.UniformMatrix4f(e, i.u_label_plane_matrix),\n u_coord_matrix: new t.UniformMatrix4f(e, i.u_coord_matrix),\n u_is_text: new t.Uniform1i(e, i.u_is_text),\n u_pitch_with_map: new t.Uniform1i(e, i.u_pitch_with_map),\n u_texsize: new t.Uniform2f(e, i.u_texsize),\n u_texsize_icon: new t.Uniform2f(e, i.u_texsize_icon),\n u_texture: new t.Uniform1i(e, i.u_texture),\n u_texture_icon: new t.Uniform1i(e, i.u_texture_icon),\n u_gamma_scale: new t.Uniform1f(e, i.u_gamma_scale),\n u_device_pixel_ratio: new t.Uniform1f(e, i.u_device_pixel_ratio),\n u_is_halo: new t.Uniform1i(e, i.u_is_halo)\n };\n },\n background: function background(e, i) {\n return {\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix),\n u_opacity: new t.Uniform1f(e, i.u_opacity),\n u_color: new t.UniformColor(e, i.u_color)\n };\n },\n backgroundPattern: function backgroundPattern(e, i) {\n return {\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix),\n u_opacity: new t.Uniform1f(e, i.u_opacity),\n u_image: new t.Uniform1i(e, i.u_image),\n u_pattern_tl_a: new t.Uniform2f(e, i.u_pattern_tl_a),\n u_pattern_br_a: new t.Uniform2f(e, i.u_pattern_br_a),\n u_pattern_tl_b: new t.Uniform2f(e, i.u_pattern_tl_b),\n u_pattern_br_b: new t.Uniform2f(e, i.u_pattern_br_b),\n u_texsize: new t.Uniform2f(e, i.u_texsize),\n u_mix: new t.Uniform1f(e, i.u_mix),\n u_pattern_size_a: new t.Uniform2f(e, i.u_pattern_size_a),\n u_pattern_size_b: new t.Uniform2f(e, i.u_pattern_size_b),\n u_scale_a: new t.Uniform1f(e, i.u_scale_a),\n u_scale_b: new t.Uniform1f(e, i.u_scale_b),\n u_pixel_coord_upper: new t.Uniform2f(e, i.u_pixel_coord_upper),\n u_pixel_coord_lower: new t.Uniform2f(e, i.u_pixel_coord_lower),\n u_tile_units_to_pixels: new t.Uniform1f(e, i.u_tile_units_to_pixels)\n };\n }\n };\n\n function Yi(e, i, o, r, a, n, s) {\n for (var l = e.context, c = l.gl, u = e.useProgram("collisionBox"), h = [], p = 0, d = 0, _ = 0; _ < r.length; _++) {\n var f = r[_],\n m = i.getTile(f),\n g = m.getBucket(o);\n\n if (g) {\n var v = f.posMatrix;\n 0 === a[0] && 0 === a[1] || (v = e.translatePosMatrix(f.posMatrix, m, a, n));\n var y = s ? g.textCollisionBox : g.iconCollisionBox,\n x = g.collisionCircleArray;\n\n if (x.length > 0) {\n var b = t.create(),\n w = v;\n t.mul(b, g.placementInvProjMatrix, e.transform.glCoordMatrix), t.mul(b, b, g.placementViewportMatrix), h.push({\n circleArray: x,\n circleOffset: d,\n transform: w,\n invTransform: b\n }), d = p += x.length / 4;\n }\n\n y && u.draw(l, c.LINES, It.disabled, Pt.disabled, e.colorModeForRenderPass(), Ct.disabled, Di(v, e.transform, m), o.id, y.layoutVertexBuffer, y.indexBuffer, y.segments, null, e.transform.zoom, null, null, y.collisionVertexBuffer);\n }\n }\n\n if (s && h.length) {\n var T = e.useProgram("collisionCircle"),\n E = new t.StructArrayLayout2f1f2i16();\n E.resize(4 * p), E._trim();\n\n for (var I = 0, P = 0, S = h; P < S.length; P += 1) {\n for (var C = S[P], z = 0; z < C.circleArray.length / 4; z++) {\n var D = 4 * z,\n A = C.circleArray[D + 0],\n M = C.circleArray[D + 1],\n L = C.circleArray[D + 2],\n R = C.circleArray[D + 3];\n E.emplace(I++, A, M, L, R, 0), E.emplace(I++, A, M, L, R, 1), E.emplace(I++, A, M, L, R, 2), E.emplace(I++, A, M, L, R, 3);\n }\n }\n\n (!ji || ji.length < 2 * p) && (ji = function (e) {\n var i = 2 * e,\n o = new t.StructArrayLayout3ui6();\n o.resize(i), o._trim();\n\n for (var r = 0; r < i; r++) {\n var a = 6 * r;\n o.uint16[a + 0] = 4 * r + 0, o.uint16[a + 1] = 4 * r + 1, o.uint16[a + 2] = 4 * r + 2, o.uint16[a + 3] = 4 * r + 2, o.uint16[a + 4] = 4 * r + 3, o.uint16[a + 5] = 4 * r + 0;\n }\n\n return o;\n }(p));\n\n for (var k = l.createIndexBuffer(ji, !0), B = l.createVertexBuffer(E, t.collisionCircleLayout.members, !0), O = 0, F = h; O < F.length; O += 1) {\n var U = F[O],\n N = Ai(U.transform, U.invTransform, e.transform);\n T.draw(l, c.TRIANGLES, It.disabled, Pt.disabled, e.colorModeForRenderPass(), Ct.disabled, N, o.id, B, k, t.SegmentVector.simpleSegment(0, 2 * U.circleOffset, U.circleArray.length, U.circleArray.length / 2), null, e.transform.zoom, null, null, null);\n }\n\n B.destroy(), k.destroy();\n }\n }\n\n var Ji = t.identity(new Float32Array(16));\n\n function Qi(e, i, o, r, a, n) {\n var s = t.getAnchorAlignment(e),\n l = -(s.horizontalAlign - .5) * i,\n c = -(s.verticalAlign - .5) * o,\n u = t.evaluateVariableOffset(e, r);\n return new t.Point((l / a + u[0]) * n, (c / a + u[1]) * n);\n }\n\n function $i(e, i, o, r, a, n, s, l, c, u, h) {\n var p = e.text.placedSymbolArray,\n d = e.text.dynamicLayoutVertexArray,\n _ = e.icon.dynamicLayoutVertexArray,\n f = {};\n d.clear();\n\n for (var m = 0; m < p.length; m++) {\n var g = p.get(m),\n v = g.hidden || !g.crossTileID || e.allowVerticalPlacement && !g.placedOrientation ? null : r[g.crossTileID];\n\n if (v) {\n var y = new t.Point(g.anchorX, g.anchorY),\n x = $t(y, o ? l : s),\n b = te(n.cameraToCenterDistance, x.signedDistanceFromCamera),\n w = a.evaluateSizeForFeature(e.textSizeData, u, g) * b / t.ONE_EM;\n o && (w *= e.tilePixelRatio / c);\n\n for (var T = Qi(v.anchor, v.width, v.height, v.textOffset, v.textBoxScale, w), E = o ? $t(y.add(T), s).point : x.point.add(i ? T.rotate(-n.angle) : T), I = e.allowVerticalPlacement && g.placedOrientation === t.WritingMode.vertical ? Math.PI / 2 : 0, P = 0; P < g.numGlyphs; P++) {\n t.addDynamicAttributes(d, E, I);\n }\n\n h && g.associatedIconIndex >= 0 && (f[g.associatedIconIndex] = {\n shiftedAnchor: E,\n angle: I\n });\n } else ce(g.numGlyphs, d);\n }\n\n if (h) {\n _.clear();\n\n for (var S = e.icon.placedSymbolArray, C = 0; C < S.length; C++) {\n var z = S.get(C);\n if (z.hidden) ce(z.numGlyphs, _);else {\n var D = f[C];\n if (D) for (var A = 0; A < z.numGlyphs; A++) {\n t.addDynamicAttributes(_, D.shiftedAnchor, D.angle);\n } else ce(z.numGlyphs, _);\n }\n }\n\n e.icon.dynamicLayoutVertexBuffer.updateData(_);\n }\n\n e.text.dynamicLayoutVertexBuffer.updateData(d);\n }\n\n function to(t, e, i) {\n return i.iconsInText && e ? "symbolTextAndIcon" : t ? "symbolSDF" : "symbolIcon";\n }\n\n function eo(e, i, o, r, a, n, s, l, c, u, h, p) {\n for (var d = e.context, _ = d.gl, f = e.transform, m = "map" === l, g = "map" === c, v = m && "point" !== o.layout.get("symbol-placement"), y = m && !g && !v, x = void 0 !== o.layout.get("symbol-sort-key").constantOr(1), b = !1, w = e.depthModeForSublayer(0, It.ReadOnly), T = o.layout.get("text-variable-anchor"), E = [], I = 0, P = r; I < P.length; I += 1) {\n var S = P[I],\n C = i.getTile(S),\n z = C.getBucket(o);\n\n if (z) {\n var D = a ? z.text : z.icon;\n\n if (D && D.segments.get().length) {\n var A = D.programConfigurations.get(o.id),\n M = a || z.sdfIcons,\n L = a ? z.textSizeData : z.iconSizeData,\n R = g || 0 !== f.pitch,\n k = e.useProgram(to(M, a, z), A),\n B = t.evaluateSizeForZoom(L, f.zoom),\n O = void 0,\n F = [0, 0],\n U = void 0,\n N = void 0,\n Z = null,\n q = void 0;\n if (a) U = C.glyphAtlasTexture, N = _.LINEAR, O = C.glyphAtlasTexture.size, z.iconsInText && (F = C.imageAtlasTexture.size, Z = C.imageAtlasTexture, q = R || e.options.rotating || e.options.zooming || "composite" === L.kind || "camera" === L.kind ? _.LINEAR : _.NEAREST);else {\n var j = 1 !== o.layout.get("icon-size").constantOr(0) || z.iconsNeedLinear;\n U = C.imageAtlasTexture, N = M || e.options.rotating || e.options.zooming || j || R ? _.LINEAR : _.NEAREST, O = C.imageAtlasTexture.size;\n }\n var V = pe(C, 1, e.transform.zoom),\n G = Jt(S.posMatrix, g, m, e.transform, V),\n W = Qt(S.posMatrix, g, m, e.transform, V),\n X = T && z.hasTextData(),\n H = "none" !== o.layout.get("icon-text-fit") && X && z.hasIconData();\n v && ie(z, S.posMatrix, e, a, G, W, g, u);\n var K = e.translatePosMatrix(S.posMatrix, C, n, s),\n Y = v || a && T || H ? Ji : G,\n J = e.translatePosMatrix(W, C, n, s, !0),\n Q = M && 0 !== o.paint.get(a ? "text-halo-width" : "icon-halo-width").constantOr(1),\n $ = {\n program: k,\n buffers: D,\n uniformValues: M ? z.iconsInText ? Wi(L.kind, B, y, g, e, K, Y, J, O, F) : Gi(L.kind, B, y, g, e, K, Y, J, a, O, !0) : Vi(L.kind, B, y, g, e, K, Y, J, a, O),\n atlasTexture: U,\n atlasTextureIcon: Z,\n atlasInterpolation: N,\n atlasInterpolationIcon: q,\n isSDF: M,\n hasHalo: Q\n };\n\n if (x && z.canOverlap) {\n b = !0;\n\n for (var tt = 0, et = D.segments.get(); tt < et.length; tt += 1) {\n var it = et[tt];\n E.push({\n segments: new t.SegmentVector([it]),\n sortKey: it.sortKey,\n state: $\n });\n }\n } else E.push({\n segments: D.segments,\n sortKey: 0,\n state: $\n });\n }\n }\n }\n\n b && E.sort(function (t, e) {\n return t.sortKey - e.sortKey;\n });\n\n for (var ot = 0, rt = E; ot < rt.length; ot += 1) {\n var at = rt[ot],\n nt = at.state;\n\n if (d.activeTexture.set(_.TEXTURE0), nt.atlasTexture.bind(nt.atlasInterpolation, _.CLAMP_TO_EDGE), nt.atlasTextureIcon && (d.activeTexture.set(_.TEXTURE1), nt.atlasTextureIcon && nt.atlasTextureIcon.bind(nt.atlasInterpolationIcon, _.CLAMP_TO_EDGE)), nt.isSDF) {\n var st = nt.uniformValues;\n nt.hasHalo && (st.u_is_halo = 1, io(nt.buffers, at.segments, o, e, nt.program, w, h, p, st)), st.u_is_halo = 0;\n }\n\n io(nt.buffers, at.segments, o, e, nt.program, w, h, p, nt.uniformValues);\n }\n }\n\n function io(t, e, i, o, r, a, n, s, l) {\n var c = o.context;\n r.draw(c, c.gl.TRIANGLES, a, n, s, Ct.disabled, l, i.id, t.layoutVertexBuffer, t.indexBuffer, e, i.paint, o.transform.zoom, t.programConfigurations.get(i.id), t.dynamicLayoutVertexBuffer, t.opacityVertexBuffer);\n }\n\n function oo(t, e, i, o, r, a, n) {\n var s,\n l,\n c,\n u,\n h,\n p = t.context.gl,\n d = i.paint.get("fill-pattern"),\n _ = d && d.constantOr(1),\n f = i.getCrossfadeParameters();\n\n n ? (l = _ && !i.getPaintProperty("fill-outline-color") ? "fillOutlinePattern" : "fillOutline", s = p.LINES) : (l = _ ? "fillPattern" : "fill", s = p.TRIANGLES);\n\n for (var m = 0, g = o; m < g.length; m += 1) {\n var v = g[m],\n y = e.getTile(v);\n\n if (!_ || y.patternsLoaded()) {\n var x = y.getBucket(i);\n\n if (x) {\n var b = x.programConfigurations.get(i.id),\n w = t.useProgram(l, b);\n _ && (t.context.activeTexture.set(p.TEXTURE0), y.imageAtlasTexture.bind(p.LINEAR, p.CLAMP_TO_EDGE), b.updatePaintBuffers(f));\n var T = d.constantOr(null);\n\n if (T && y.imageAtlas) {\n var E = y.imageAtlas,\n I = E.patternPositions[T.to.toString()],\n P = E.patternPositions[T.from.toString()];\n I && P && b.setConstantPatternPositions(I, P);\n }\n\n var S = t.translatePosMatrix(v.posMatrix, y, i.paint.get("fill-translate"), i.paint.get("fill-translate-anchor"));\n\n if (n) {\n u = x.indexBuffer2, h = x.segments2;\n var C = [p.drawingBufferWidth, p.drawingBufferHeight];\n c = "fillOutlinePattern" === l && _ ? Ci(S, t, f, y, C) : Si(S, C);\n } else u = x.indexBuffer, h = x.segments, c = _ ? Pi(S, t, f, y) : Ii(S);\n\n w.draw(t.context, s, r, t.stencilModeForClipping(v), a, Ct.disabled, c, i.id, x.layoutVertexBuffer, u, h, i.paint, t.transform.zoom, b);\n }\n }\n }\n }\n\n function ro(t, e, i, o, r, a, n) {\n for (var s = t.context, l = s.gl, c = i.paint.get("fill-extrusion-pattern"), u = c.constantOr(1), h = i.getCrossfadeParameters(), p = i.paint.get("fill-extrusion-opacity"), d = 0, _ = o; d < _.length; d += 1) {\n var f = _[d],\n m = e.getTile(f),\n g = m.getBucket(i);\n\n if (g) {\n var v = g.programConfigurations.get(i.id),\n y = t.useProgram(u ? "fillExtrusionPattern" : "fillExtrusion", v);\n u && (t.context.activeTexture.set(l.TEXTURE0), m.imageAtlasTexture.bind(l.LINEAR, l.CLAMP_TO_EDGE), v.updatePaintBuffers(h));\n var x = c.constantOr(null);\n\n if (x && m.imageAtlas) {\n var b = m.imageAtlas,\n w = b.patternPositions[x.to.toString()],\n T = b.patternPositions[x.from.toString()];\n w && T && v.setConstantPatternPositions(w, T);\n }\n\n var E = t.translatePosMatrix(f.posMatrix, m, i.paint.get("fill-extrusion-translate"), i.paint.get("fill-extrusion-translate-anchor")),\n I = i.paint.get("fill-extrusion-vertical-gradient"),\n P = u ? Ei(E, t, I, p, f, h, m) : Ti(E, t, I, p);\n y.draw(s, s.gl.TRIANGLES, r, a, n, Ct.backCCW, P, i.id, g.layoutVertexBuffer, g.indexBuffer, g.segments, i.paint, t.transform.zoom, v);\n }\n }\n }\n\n function ao(e, i, o, r, a, n) {\n var s = e.context,\n l = s.gl,\n c = i.fbo;\n\n if (c) {\n var u = e.useProgram("hillshade");\n s.activeTexture.set(l.TEXTURE0), l.bindTexture(l.TEXTURE_2D, c.colorAttachment.get());\n\n var h = function (e, i, o) {\n var r = o.paint.get("hillshade-shadow-color"),\n a = o.paint.get("hillshade-highlight-color"),\n n = o.paint.get("hillshade-accent-color"),\n s = o.paint.get("hillshade-illumination-direction") * (Math.PI / 180);\n "viewport" === o.paint.get("hillshade-illumination-anchor") && (s -= e.transform.angle);\n var l,\n c,\n u,\n h = !e.options.moving;\n return {\n u_matrix: e.transform.calculatePosMatrix(i.tileID.toUnwrapped(), h),\n u_image: 0,\n u_latrange: (l = i.tileID, c = Math.pow(2, l.canonical.z), u = l.canonical.y, [new t.MercatorCoordinate(0, u / c).toLngLat().lat, new t.MercatorCoordinate(0, (u + 1) / c).toLngLat().lat]),\n u_light: [o.paint.get("hillshade-exaggeration"), s],\n u_shadow: r,\n u_highlight: a,\n u_accent: n\n };\n }(e, i, o);\n\n u.draw(s, l.TRIANGLES, r, a, n, Ct.disabled, h, o.id, e.rasterBoundsBuffer, e.quadTriangleIndexBuffer, e.rasterBoundsSegments);\n }\n }\n\n function no(e, i, o, r, a, n) {\n var s = e.context,\n l = s.gl,\n c = i.dem;\n\n if (c && c.data) {\n var u = c.dim,\n h = c.stride,\n p = c.getPixels();\n\n if (s.activeTexture.set(l.TEXTURE1), s.pixelStoreUnpackPremultiplyAlpha.set(!1), i.demTexture = i.demTexture || e.getTileTexture(h), i.demTexture) {\n var d = i.demTexture;\n d.update(p, {\n premultiply: !1\n }), d.bind(l.NEAREST, l.CLAMP_TO_EDGE);\n } else i.demTexture = new t.Texture(s, p, l.RGBA, {\n premultiply: !1\n }), i.demTexture.bind(l.NEAREST, l.CLAMP_TO_EDGE);\n\n s.activeTexture.set(l.TEXTURE0);\n var _ = i.fbo;\n\n if (!_) {\n var f = new t.Texture(s, {\n width: u,\n height: u,\n data: null\n }, l.RGBA);\n f.bind(l.LINEAR, l.CLAMP_TO_EDGE), (_ = i.fbo = s.createFramebuffer(u, u, !0)).colorAttachment.set(f.texture);\n }\n\n s.bindFramebuffer.set(_.framebuffer), s.viewport.set([0, 0, u, u]), e.useProgram("hillshadePrepare").draw(s, l.TRIANGLES, r, a, n, Ct.disabled, function (e, i) {\n var o = i.stride,\n r = t.create();\n return t.ortho(r, 0, t.EXTENT, -t.EXTENT, 0, 0, 1), t.translate(r, r, [0, -t.EXTENT, 0]), {\n u_matrix: r,\n u_image: 1,\n u_dimension: [o, o],\n u_zoom: e.overscaledZ,\n u_unpack: i.getUnpackVector()\n };\n }(i.tileID, c), o.id, e.rasterBoundsBuffer, e.quadTriangleIndexBuffer, e.rasterBoundsSegments), i.needsHillshadePrepare = !1;\n }\n }\n\n function so(e, i, o, r, a) {\n var n = r.paint.get("raster-fade-duration");\n\n if (n > 0) {\n var s = t.browser.now(),\n l = (s - e.timeAdded) / n,\n c = i ? (s - i.timeAdded) / n : -1,\n u = o.getSource(),\n h = a.coveringZoomLevel({\n tileSize: u.tileSize,\n roundZoom: u.roundZoom\n }),\n p = !i || Math.abs(i.tileID.overscaledZ - h) > Math.abs(e.tileID.overscaledZ - h),\n d = p && e.refreshedUponExpiration ? 1 : t.clamp(p ? l : 1 - c, 0, 1);\n return e.refreshedUponExpiration && l >= 1 && (e.refreshedUponExpiration = !1), i ? {\n opacity: 1,\n mix: 1 - d\n } : {\n opacity: d,\n mix: 0\n };\n }\n\n return {\n opacity: 1,\n mix: 0\n };\n }\n\n var lo = new t.Color(1, 0, 0, 1),\n co = new t.Color(0, 1, 0, 1),\n uo = new t.Color(0, 0, 1, 1),\n ho = new t.Color(1, 0, 1, 1),\n po = new t.Color(0, 1, 1, 1);\n\n function _o(t, e, i, o) {\n mo(t, 0, e + i / 2, t.transform.width, i, o);\n }\n\n function fo(t, e, i, o) {\n mo(t, e - i / 2, 0, i, t.transform.height, o);\n }\n\n function mo(e, i, o, r, a, n) {\n var s = e.context,\n l = s.gl;\n l.enable(l.SCISSOR_TEST), l.scissor(i * t.browser.devicePixelRatio, o * t.browser.devicePixelRatio, r * t.browser.devicePixelRatio, a * t.browser.devicePixelRatio), s.clear({\n color: n\n }), l.disable(l.SCISSOR_TEST);\n }\n\n function go(e, i, o) {\n var r = e.context,\n a = r.gl,\n n = o.posMatrix,\n s = e.useProgram("debug"),\n l = It.disabled,\n c = Pt.disabled,\n u = e.colorModeForRenderPass();\n r.activeTexture.set(a.TEXTURE0), e.emptyTexture.bind(a.LINEAR, a.CLAMP_TO_EDGE), s.draw(r, a.LINE_STRIP, l, c, u, Ct.disabled, Mi(n, t.Color.red), "$debug", e.debugBuffer, e.tileBorderIndexBuffer, e.debugSegments);\n\n var h = i.getTileByID(o.key).latestRawTileData,\n p = Math.floor((h && h.byteLength || 0) / 1024),\n d = i.getTile(o).tileSize,\n _ = 512 / Math.min(d, 512) * (o.overscaledZ / e.transform.zoom) * .5,\n f = o.canonical.toString();\n\n o.overscaledZ !== o.canonical.z && (f += " => " + o.overscaledZ), function (t, e) {\n t.initDebugOverlayCanvas();\n var i = t.debugOverlayCanvas,\n o = t.context.gl,\n r = t.debugOverlayCanvas.getContext("2d");\n r.clearRect(0, 0, i.width, i.height), r.shadowColor = "white", r.shadowBlur = 2, r.lineWidth = 1.5, r.strokeStyle = "white", r.textBaseline = "top", r.font = "bold 36px Open Sans, sans-serif", r.fillText(e, 5, 5), r.strokeText(e, 5, 5), t.debugOverlayTexture.update(i), t.debugOverlayTexture.bind(o.LINEAR, o.CLAMP_TO_EDGE);\n }(e, f + " " + p + "kb"), s.draw(r, a.TRIANGLES, l, c, St.alphaBlended, Ct.disabled, Mi(n, t.Color.transparent, _), "$debug", e.debugBuffer, e.quadTriangleIndexBuffer, e.debugSegments);\n }\n\n var vo = {\n symbol: function symbol(e, i, o, r, a) {\n if ("translucent" === e.renderPass) {\n var n = Pt.disabled,\n s = e.colorModeForRenderPass();\n o.layout.get("text-variable-anchor") && function (e, i, o, r, a, n, s) {\n for (var l = i.transform, c = "map" === a, u = "map" === n, h = 0, p = e; h < p.length; h += 1) {\n var d = p[h],\n _ = r.getTile(d),\n f = _.getBucket(o);\n\n if (f && f.text && f.text.segments.get().length) {\n var m = t.evaluateSizeForZoom(f.textSizeData, l.zoom),\n g = pe(_, 1, i.transform.zoom),\n v = Jt(d.posMatrix, u, c, i.transform, g),\n y = "none" !== o.layout.get("icon-text-fit") && f.hasIconData();\n\n if (m) {\n var x = Math.pow(2, l.zoom - _.tileID.overscaledZ);\n $i(f, c, u, s, t.symbolSize, l, v, d.posMatrix, x, m, y);\n }\n }\n }\n }(r, e, o, i, o.layout.get("text-rotation-alignment"), o.layout.get("text-pitch-alignment"), a), 0 !== o.paint.get("icon-opacity").constantOr(1) && eo(e, i, o, r, !1, o.paint.get("icon-translate"), o.paint.get("icon-translate-anchor"), o.layout.get("icon-rotation-alignment"), o.layout.get("icon-pitch-alignment"), o.layout.get("icon-keep-upright"), n, s), 0 !== o.paint.get("text-opacity").constantOr(1) && eo(e, i, o, r, !0, o.paint.get("text-translate"), o.paint.get("text-translate-anchor"), o.layout.get("text-rotation-alignment"), o.layout.get("text-pitch-alignment"), o.layout.get("text-keep-upright"), n, s), i.map.showCollisionBoxes && (Yi(e, i, o, r, o.paint.get("text-translate"), o.paint.get("text-translate-anchor"), !0), Yi(e, i, o, r, o.paint.get("icon-translate"), o.paint.get("icon-translate-anchor"), !1));\n }\n },\n circle: function circle(e, i, o, r) {\n if ("translucent" === e.renderPass) {\n var a = o.paint.get("circle-opacity"),\n n = o.paint.get("circle-stroke-width"),\n s = o.paint.get("circle-stroke-opacity"),\n l = void 0 !== o.layout.get("circle-sort-key").constantOr(1);\n\n if (0 !== a.constantOr(1) || 0 !== n.constantOr(1) && 0 !== s.constantOr(1)) {\n for (var c = e.context, u = c.gl, h = e.depthModeForSublayer(0, It.ReadOnly), p = Pt.disabled, d = e.colorModeForRenderPass(), _ = [], f = 0; f < r.length; f++) {\n var m = r[f],\n g = i.getTile(m),\n v = g.getBucket(o);\n\n if (v) {\n var y = v.programConfigurations.get(o.id),\n x = {\n programConfiguration: y,\n program: e.useProgram("circle", y),\n layoutVertexBuffer: v.layoutVertexBuffer,\n indexBuffer: v.indexBuffer,\n uniformValues: zi(e, m, g, o)\n };\n if (l) for (var b = 0, w = v.segments.get(); b < w.length; b += 1) {\n var T = w[b];\n\n _.push({\n segments: new t.SegmentVector([T]),\n sortKey: T.sortKey,\n state: x\n });\n } else _.push({\n segments: v.segments,\n sortKey: 0,\n state: x\n });\n }\n }\n\n l && _.sort(function (t, e) {\n return t.sortKey - e.sortKey;\n });\n\n for (var E = 0, I = _; E < I.length; E += 1) {\n var P = I[E],\n S = P.state;\n S.program.draw(c, u.TRIANGLES, h, p, d, Ct.disabled, S.uniformValues, o.id, S.layoutVertexBuffer, S.indexBuffer, P.segments, o.paint, e.transform.zoom, S.programConfiguration);\n }\n }\n }\n },\n heatmap: function heatmap(e, i, o, r) {\n if (0 !== o.paint.get("heatmap-opacity")) if ("offscreen" === e.renderPass) {\n var a = e.context,\n n = a.gl,\n s = Pt.disabled,\n l = new St([n.ONE, n.ONE], t.Color.transparent, [!0, !0, !0, !0]);\n !function (t, e, i) {\n var o = t.gl;\n t.activeTexture.set(o.TEXTURE1), t.viewport.set([0, 0, e.width / 4, e.height / 4]);\n var r = i.heatmapFbo;\n if (r) o.bindTexture(o.TEXTURE_2D, r.colorAttachment.get()), t.bindFramebuffer.set(r.framebuffer);else {\n var a = o.createTexture();\n o.bindTexture(o.TEXTURE_2D, a), o.texParameteri(o.TEXTURE_2D, o.TEXTURE_WRAP_S, o.CLAMP_TO_EDGE), o.texParameteri(o.TEXTURE_2D, o.TEXTURE_WRAP_T, o.CLAMP_TO_EDGE), o.texParameteri(o.TEXTURE_2D, o.TEXTURE_MIN_FILTER, o.LINEAR), o.texParameteri(o.TEXTURE_2D, o.TEXTURE_MAG_FILTER, o.LINEAR), r = i.heatmapFbo = t.createFramebuffer(e.width / 4, e.height / 4, !1), function (t, e, i, o) {\n var r = t.gl;\n r.texImage2D(r.TEXTURE_2D, 0, r.RGBA, e.width / 4, e.height / 4, 0, r.RGBA, t.extRenderToTextureHalfFloat ? t.extTextureHalfFloat.HALF_FLOAT_OES : r.UNSIGNED_BYTE, null), o.colorAttachment.set(i);\n }(t, e, a, r);\n }\n }(a, e, o), a.clear({\n color: t.Color.transparent\n });\n\n for (var c = 0; c < r.length; c++) {\n var u = r[c];\n\n if (!i.hasRenderableParent(u)) {\n var h = i.getTile(u),\n p = h.getBucket(o);\n\n if (p) {\n var d = p.programConfigurations.get(o.id);\n e.useProgram("heatmap", d).draw(a, n.TRIANGLES, It.disabled, s, l, Ct.disabled, Ri(u.posMatrix, h, e.transform.zoom, o.paint.get("heatmap-intensity")), o.id, p.layoutVertexBuffer, p.indexBuffer, p.segments, o.paint, e.transform.zoom, d);\n }\n }\n }\n\n a.viewport.set([0, 0, e.width, e.height]);\n } else "translucent" === e.renderPass && (e.context.setColorMode(e.colorModeForRenderPass()), function (e, i) {\n var o = e.context,\n r = o.gl,\n a = i.heatmapFbo;\n\n if (a) {\n o.activeTexture.set(r.TEXTURE0), r.bindTexture(r.TEXTURE_2D, a.colorAttachment.get()), o.activeTexture.set(r.TEXTURE1);\n var n = i.colorRampTexture;\n n || (n = i.colorRampTexture = new t.Texture(o, i.colorRamp, r.RGBA)), n.bind(r.LINEAR, r.CLAMP_TO_EDGE), e.useProgram("heatmapTexture").draw(o, r.TRIANGLES, It.disabled, Pt.disabled, e.colorModeForRenderPass(), Ct.disabled, function (e, i, o, r) {\n var a = t.create();\n t.ortho(a, 0, e.width, e.height, 0, 0, 1);\n var n = e.context.gl;\n return {\n u_matrix: a,\n u_world: [n.drawingBufferWidth, n.drawingBufferHeight],\n u_image: 0,\n u_color_ramp: 1,\n u_opacity: i.paint.get("heatmap-opacity")\n };\n }(e, i), i.id, e.viewportBuffer, e.quadTriangleIndexBuffer, e.viewportSegments, i.paint, e.transform.zoom);\n }\n }(e, o));\n },\n line: function line(e, i, o, r) {\n if ("translucent" === e.renderPass) {\n var a = o.paint.get("line-opacity"),\n n = o.paint.get("line-width");\n if (0 !== a.constantOr(1) && 0 !== n.constantOr(1)) for (var s = e.depthModeForSublayer(0, It.ReadOnly), l = e.colorModeForRenderPass(), c = o.paint.get("line-dasharray"), u = o.paint.get("line-pattern"), h = u.constantOr(1), p = o.paint.get("line-gradient"), d = o.getCrossfadeParameters(), _ = h ? "linePattern" : c ? "lineSDF" : p ? "lineGradient" : "line", f = e.context, m = f.gl, g = !0, v = 0, y = r; v < y.length; v += 1) {\n var x = y[v],\n b = i.getTile(x);\n\n if (!h || b.patternsLoaded()) {\n var w = b.getBucket(o);\n\n if (w) {\n var T = w.programConfigurations.get(o.id),\n E = e.context.program.get(),\n I = e.useProgram(_, T),\n P = g || I.program !== E,\n S = u.constantOr(null);\n\n if (S && b.imageAtlas) {\n var C = b.imageAtlas,\n z = C.patternPositions[S.to.toString()],\n D = C.patternPositions[S.from.toString()];\n z && D && T.setConstantPatternPositions(z, D);\n }\n\n var A = h ? Oi(e, b, o, d) : c ? Fi(e, b, o, c, d) : p ? Bi(e, b, o, w.lineClipsArray.length) : ki(e, b, o);\n if (h) f.activeTexture.set(m.TEXTURE0), b.imageAtlasTexture.bind(m.LINEAR, m.CLAMP_TO_EDGE), T.updatePaintBuffers(d);else if (c && (P || e.lineAtlas.dirty)) f.activeTexture.set(m.TEXTURE0), e.lineAtlas.bind(f);else if (p) {\n var M = w.gradients[o.id],\n L = M.texture;\n\n if (o.gradientVersion !== M.version) {\n var R = 256;\n\n if (o.stepInterpolant) {\n var k = i.getSource().maxzoom,\n B = x.canonical.z === k ? Math.ceil(1 << e.transform.maxZoom - x.canonical.z) : 1;\n R = t.clamp(t.nextPowerOfTwo(w.maxLineLength / t.EXTENT * 1024 * B), 256, f.maxTextureSize);\n }\n\n M.gradient = t.renderColorRamp({\n expression: o.gradientExpression(),\n evaluationKey: "lineProgress",\n resolution: R,\n image: M.gradient || void 0,\n clips: w.lineClipsArray\n }), M.texture ? M.texture.update(M.gradient) : M.texture = new t.Texture(f, M.gradient, m.RGBA), M.version = o.gradientVersion, L = M.texture;\n }\n\n f.activeTexture.set(m.TEXTURE0), L.bind(o.stepInterpolant ? m.NEAREST : m.LINEAR, m.CLAMP_TO_EDGE);\n }\n I.draw(f, m.TRIANGLES, s, e.stencilModeForClipping(x), l, Ct.disabled, A, o.id, w.layoutVertexBuffer, w.indexBuffer, w.segments, o.paint, e.transform.zoom, T, w.layoutVertexBuffer2), g = !1;\n }\n }\n }\n }\n },\n fill: function fill(e, i, o, r) {\n var a = o.paint.get("fill-color"),\n n = o.paint.get("fill-opacity");\n\n if (0 !== n.constantOr(1)) {\n var s = e.colorModeForRenderPass(),\n l = o.paint.get("fill-pattern"),\n c = e.opaquePassEnabledForLayer() && !l.constantOr(1) && 1 === a.constantOr(t.Color.transparent).a && 1 === n.constantOr(0) ? "opaque" : "translucent";\n\n if (e.renderPass === c) {\n var u = e.depthModeForSublayer(1, "opaque" === e.renderPass ? It.ReadWrite : It.ReadOnly);\n oo(e, i, o, r, u, s, !1);\n }\n\n if ("translucent" === e.renderPass && o.paint.get("fill-antialias")) {\n var h = e.depthModeForSublayer(o.getPaintProperty("fill-outline-color") ? 2 : 0, It.ReadOnly);\n oo(e, i, o, r, h, s, !0);\n }\n }\n },\n "fill-extrusion": function fillExtrusion(t, e, i, o) {\n var r = i.paint.get("fill-extrusion-opacity");\n\n if (0 !== r && "translucent" === t.renderPass) {\n var a = new It(t.context.gl.LEQUAL, It.ReadWrite, t.depthRangeFor3D);\n if (1 !== r || i.paint.get("fill-extrusion-pattern").constantOr(1)) ro(t, e, i, o, a, Pt.disabled, St.disabled), ro(t, e, i, o, a, t.stencilModeFor3D(), t.colorModeForRenderPass());else {\n var n = t.colorModeForRenderPass();\n ro(t, e, i, o, a, Pt.disabled, n);\n }\n }\n },\n hillshade: function hillshade(t, e, i, o) {\n if ("offscreen" === t.renderPass || "translucent" === t.renderPass) {\n for (var r = t.context, a = t.depthModeForSublayer(0, It.ReadOnly), n = t.colorModeForRenderPass(), s = "translucent" === t.renderPass ? t.stencilConfigForOverlap(o) : [{}, o], l = s[0], c = 0, u = s[1]; c < u.length; c += 1) {\n var h = u[c],\n p = e.getTile(h);\n p.needsHillshadePrepare && "offscreen" === t.renderPass ? no(t, p, i, a, Pt.disabled, n) : "translucent" === t.renderPass && ao(t, p, i, a, l[h.overscaledZ], n);\n }\n\n r.viewport.set([0, 0, t.width, t.height]);\n }\n },\n raster: function raster(t, e, i, o) {\n if ("translucent" === t.renderPass && 0 !== i.paint.get("raster-opacity") && o.length) for (var r = t.context, a = r.gl, n = e.getSource(), s = t.useProgram("raster"), l = t.colorModeForRenderPass(), c = n instanceof M ? [{}, o] : t.stencilConfigForOverlap(o), u = c[0], h = c[1], p = h[h.length - 1].overscaledZ, d = !t.options.moving, _ = 0, f = h; _ < f.length; _ += 1) {\n var m = f[_],\n g = t.depthModeForSublayer(m.overscaledZ - p, 1 === i.paint.get("raster-opacity") ? It.ReadWrite : It.ReadOnly, a.LESS),\n v = e.getTile(m),\n y = t.transform.calculatePosMatrix(m.toUnwrapped(), d);\n v.registerFadeDuration(i.paint.get("raster-fade-duration"));\n var x = e.findLoadedParent(m, 0),\n b = so(v, x, e, i, t.transform),\n w = void 0,\n T = void 0,\n E = "nearest" === i.paint.get("raster-resampling") ? a.NEAREST : a.LINEAR;\n r.activeTexture.set(a.TEXTURE0), v.texture.bind(E, a.CLAMP_TO_EDGE, a.LINEAR_MIPMAP_NEAREST), r.activeTexture.set(a.TEXTURE1), x ? (x.texture.bind(E, a.CLAMP_TO_EDGE, a.LINEAR_MIPMAP_NEAREST), w = Math.pow(2, x.tileID.overscaledZ - v.tileID.overscaledZ), T = [v.tileID.canonical.x * w % 1, v.tileID.canonical.y * w % 1]) : v.texture.bind(E, a.CLAMP_TO_EDGE, a.LINEAR_MIPMAP_NEAREST);\n var I = Zi(y, T || [0, 0], w || 1, b, i);\n n instanceof M ? s.draw(r, a.TRIANGLES, g, Pt.disabled, l, Ct.disabled, I, i.id, n.boundsBuffer, t.quadTriangleIndexBuffer, n.boundsSegments) : s.draw(r, a.TRIANGLES, g, u[m.overscaledZ], l, Ct.disabled, I, i.id, t.rasterBoundsBuffer, t.quadTriangleIndexBuffer, t.rasterBoundsSegments);\n }\n },\n background: function background(t, e, i) {\n var o = i.paint.get("background-color"),\n r = i.paint.get("background-opacity");\n\n if (0 !== r) {\n var a = t.context,\n n = a.gl,\n s = t.transform,\n l = s.tileSize,\n c = i.paint.get("background-pattern");\n\n if (!t.isPatternMissing(c)) {\n var u = !c && 1 === o.a && 1 === r && t.opaquePassEnabledForLayer() ? "opaque" : "translucent";\n\n if (t.renderPass === u) {\n var h = Pt.disabled,\n p = t.depthModeForSublayer(0, "opaque" === u ? It.ReadWrite : It.ReadOnly),\n d = t.colorModeForRenderPass(),\n _ = t.useProgram(c ? "backgroundPattern" : "background"),\n f = s.coveringTiles({\n tileSize: l\n });\n\n c && (a.activeTexture.set(n.TEXTURE0), t.imageManager.bind(t.context));\n\n for (var m = i.getCrossfadeParameters(), g = 0, v = f; g < v.length; g += 1) {\n var y = v[g],\n x = t.transform.calculatePosMatrix(y.toUnwrapped()),\n b = c ? Hi(x, r, t, c, {\n tileID: y,\n tileSize: l\n }, m) : Xi(x, r, o);\n\n _.draw(a, n.TRIANGLES, p, h, d, Ct.disabled, b, i.id, t.tileExtentBuffer, t.quadTriangleIndexBuffer, t.tileExtentSegments);\n }\n }\n }\n }\n },\n debug: function debug(t, e, i) {\n for (var o = 0; o < i.length; o++) {\n go(t, e, i[o]);\n }\n },\n custom: function custom(t, e, i) {\n var o = t.context,\n r = i.implementation;\n\n if ("offscreen" === t.renderPass) {\n var a = r.prerender;\n a && (t.setCustomLayerDefaults(), o.setColorMode(t.colorModeForRenderPass()), a.call(r, o.gl, t.transform.customLayerMatrix()), o.setDirty(), t.setBaseState());\n } else if ("translucent" === t.renderPass) {\n t.setCustomLayerDefaults(), o.setColorMode(t.colorModeForRenderPass()), o.setStencilMode(Pt.disabled);\n var n = "3d" === r.renderingMode ? new It(t.context.gl.LEQUAL, It.ReadWrite, t.depthRangeFor3D) : t.depthModeForSublayer(0, It.ReadOnly);\n o.setDepthMode(n), r.render(o.gl, t.transform.customLayerMatrix()), o.setDirty(), t.setBaseState(), o.bindFramebuffer.set(null);\n }\n }\n },\n yo = function yo(t, e) {\n this.context = new zt(t), this.transform = e, this._tileTextures = {}, this.setup(), this.numSublayers = Dt.maxUnderzooming + Dt.maxOverzooming + 1, this.depthEpsilon = 1 / Math.pow(2, 16), this.crossTileSymbolIndex = new Fe(), this.gpuTimers = {};\n };\n\n yo.prototype.resize = function (e, i) {\n if (this.width = e * t.browser.devicePixelRatio, this.height = i * t.browser.devicePixelRatio, this.context.viewport.set([0, 0, this.width, this.height]), this.style) for (var o = 0, r = this.style._order; o < r.length; o += 1) {\n this.style._layers[r[o]].resize();\n }\n }, yo.prototype.setup = function () {\n var e = this.context,\n i = new t.StructArrayLayout2i4();\n i.emplaceBack(0, 0), i.emplaceBack(t.EXTENT, 0), i.emplaceBack(0, t.EXTENT), i.emplaceBack(t.EXTENT, t.EXTENT), this.tileExtentBuffer = e.createVertexBuffer(i, Ve.members), this.tileExtentSegments = t.SegmentVector.simpleSegment(0, 0, 4, 2);\n var o = new t.StructArrayLayout2i4();\n o.emplaceBack(0, 0), o.emplaceBack(t.EXTENT, 0), o.emplaceBack(0, t.EXTENT), o.emplaceBack(t.EXTENT, t.EXTENT), this.debugBuffer = e.createVertexBuffer(o, Ve.members), this.debugSegments = t.SegmentVector.simpleSegment(0, 0, 4, 5);\n var r = new t.StructArrayLayout4i8();\n r.emplaceBack(0, 0, 0, 0), r.emplaceBack(t.EXTENT, 0, t.EXTENT, 0), r.emplaceBack(0, t.EXTENT, 0, t.EXTENT), r.emplaceBack(t.EXTENT, t.EXTENT, t.EXTENT, t.EXTENT), this.rasterBoundsBuffer = e.createVertexBuffer(r, A.members), this.rasterBoundsSegments = t.SegmentVector.simpleSegment(0, 0, 4, 2);\n var a = new t.StructArrayLayout2i4();\n a.emplaceBack(0, 0), a.emplaceBack(1, 0), a.emplaceBack(0, 1), a.emplaceBack(1, 1), this.viewportBuffer = e.createVertexBuffer(a, Ve.members), this.viewportSegments = t.SegmentVector.simpleSegment(0, 0, 4, 2);\n var n = new t.StructArrayLayout1ui2();\n n.emplaceBack(0), n.emplaceBack(1), n.emplaceBack(3), n.emplaceBack(2), n.emplaceBack(0), this.tileBorderIndexBuffer = e.createIndexBuffer(n);\n var s = new t.StructArrayLayout3ui6();\n s.emplaceBack(0, 1, 2), s.emplaceBack(2, 1, 3), this.quadTriangleIndexBuffer = e.createIndexBuffer(s), this.emptyTexture = new t.Texture(e, {\n width: 1,\n height: 1,\n data: new Uint8Array([0, 0, 0, 0])\n }, e.gl.RGBA);\n var l = this.context.gl;\n this.stencilClearMode = new Pt({\n func: l.ALWAYS,\n mask: 0\n }, 0, 255, l.ZERO, l.ZERO, l.ZERO);\n }, yo.prototype.clearStencil = function () {\n var e = this.context,\n i = e.gl;\n this.nextStencilID = 1, this.currentStencilSource = void 0;\n var o = t.create();\n t.ortho(o, 0, this.width, this.height, 0, 0, 1), t.scale(o, o, [i.drawingBufferWidth, i.drawingBufferHeight, 0]), this.useProgram("clippingMask").draw(e, i.TRIANGLES, It.disabled, this.stencilClearMode, St.disabled, Ct.disabled, Li(o), "$clipping", this.viewportBuffer, this.quadTriangleIndexBuffer, this.viewportSegments);\n }, yo.prototype._renderTileClippingMasks = function (t, e) {\n if (this.currentStencilSource !== t.source && t.isTileClipped() && e && e.length) {\n this.currentStencilSource = t.source;\n var i = this.context,\n o = i.gl;\n this.nextStencilID + e.length > 256 && this.clearStencil(), i.setColorMode(St.disabled), i.setDepthMode(It.disabled);\n var r = this.useProgram("clippingMask");\n this._tileClippingMaskIDs = {};\n\n for (var a = 0, n = e; a < n.length; a += 1) {\n var s = n[a],\n l = this._tileClippingMaskIDs[s.key] = this.nextStencilID++;\n r.draw(i, o.TRIANGLES, It.disabled, new Pt({\n func: o.ALWAYS,\n mask: 0\n }, l, 255, o.KEEP, o.KEEP, o.REPLACE), St.disabled, Ct.disabled, Li(s.posMatrix), "$clipping", this.tileExtentBuffer, this.quadTriangleIndexBuffer, this.tileExtentSegments);\n }\n }\n }, yo.prototype.stencilModeFor3D = function () {\n this.currentStencilSource = void 0, this.nextStencilID + 1 > 256 && this.clearStencil();\n var t = this.nextStencilID++,\n e = this.context.gl;\n return new Pt({\n func: e.NOTEQUAL,\n mask: 255\n }, t, 255, e.KEEP, e.KEEP, e.REPLACE);\n }, yo.prototype.stencilModeForClipping = function (t) {\n var e = this.context.gl;\n return new Pt({\n func: e.EQUAL,\n mask: 255\n }, this._tileClippingMaskIDs[t.key], 0, e.KEEP, e.KEEP, e.REPLACE);\n }, yo.prototype.stencilConfigForOverlap = function (t) {\n var e,\n i = this.context.gl,\n o = t.sort(function (t, e) {\n return e.overscaledZ - t.overscaledZ;\n }),\n r = o[o.length - 1].overscaledZ,\n a = o[0].overscaledZ - r + 1;\n\n if (a > 1) {\n this.currentStencilSource = void 0, this.nextStencilID + a > 256 && this.clearStencil();\n\n for (var n = {}, s = 0; s < a; s++) {\n n[s + r] = new Pt({\n func: i.GEQUAL,\n mask: 255\n }, s + this.nextStencilID, 255, i.KEEP, i.KEEP, i.REPLACE);\n }\n\n return this.nextStencilID += a, [n, o];\n }\n\n return [(e = {}, e[r] = Pt.disabled, e), o];\n }, yo.prototype.colorModeForRenderPass = function () {\n var e = this.context.gl;\n return this._showOverdrawInspector ? new St([e.CONSTANT_COLOR, e.ONE], new t.Color(1 / 8, 1 / 8, 1 / 8, 0), [!0, !0, !0, !0]) : "opaque" === this.renderPass ? St.unblended : St.alphaBlended;\n }, yo.prototype.depthModeForSublayer = function (t, e, i) {\n if (!this.opaquePassEnabledForLayer()) return It.disabled;\n var o = 1 - ((1 + this.currentLayer) * this.numSublayers + t) * this.depthEpsilon;\n return new It(i || this.context.gl.LEQUAL, e, [o, o]);\n }, yo.prototype.opaquePassEnabledForLayer = function () {\n return this.currentLayer < this.opaquePassCutoff;\n }, yo.prototype.render = function (e, i) {\n var o = this;\n this.style = e, this.options = i, this.lineAtlas = e.lineAtlas, this.imageManager = e.imageManager, this.glyphManager = e.glyphManager, this.symbolFadeChange = e.placement.symbolFadeChange(t.browser.now()), this.imageManager.beginFrame();\n var r = this.style._order,\n a = this.style.sourceCaches;\n\n for (var n in a) {\n var s = a[n];\n s.used && s.prepare(this.context);\n }\n\n var l,\n c,\n u = {},\n h = {},\n p = {};\n\n for (var d in a) {\n var _ = a[d];\n u[d] = _.getVisibleCoordinates(), h[d] = u[d].slice().reverse(), p[d] = _.getVisibleCoordinates(!0).reverse();\n }\n\n this.opaquePassCutoff = 1 / 0;\n\n for (var f = 0; f < r.length; f++) {\n if (this.style._layers[r[f]].is3D()) {\n this.opaquePassCutoff = f;\n break;\n }\n }\n\n this.renderPass = "offscreen";\n\n for (var m = 0, g = r; m < g.length; m += 1) {\n var v = this.style._layers[g[m]];\n\n if (v.hasOffscreenPass() && !v.isHidden(this.transform.zoom)) {\n var y = h[v.source];\n ("custom" === v.type || y.length) && this.renderLayer(this, a[v.source], v, y);\n }\n }\n\n for (this.context.bindFramebuffer.set(null), this.context.clear({\n color: i.showOverdrawInspector ? t.Color.black : t.Color.transparent,\n depth: 1\n }), this.clearStencil(), this._showOverdrawInspector = i.showOverdrawInspector, this.depthRangeFor3D = [0, 1 - (e._order.length + 2) * this.numSublayers * this.depthEpsilon], this.renderPass = "opaque", this.currentLayer = r.length - 1; this.currentLayer >= 0; this.currentLayer--) {\n var x = this.style._layers[r[this.currentLayer]],\n b = a[x.source],\n w = u[x.source];\n this._renderTileClippingMasks(x, w), this.renderLayer(this, b, x, w);\n }\n\n for (this.renderPass = "translucent", this.currentLayer = 0; this.currentLayer < r.length; this.currentLayer++) {\n var T = this.style._layers[r[this.currentLayer]],\n E = a[T.source],\n I = ("symbol" === T.type ? p : h)[T.source];\n this._renderTileClippingMasks(T, u[T.source]), this.renderLayer(this, E, T, I);\n }\n\n this.options.showTileBoundaries && (t.values(this.style._layers).forEach(function (t) {\n t.source && !t.isHidden(o.transform.zoom) && (t.source !== (c && c.id) && (c = o.style.sourceCaches[t.source]), (!l || l.getSource().maxzoom < c.getSource().maxzoom) && (l = c));\n }), l && vo.debug(this, l, l.getVisibleCoordinates())), this.options.showPadding && function (t) {\n var e = t.transform.padding;\n _o(t, t.transform.height - (e.top || 0), 3, lo), _o(t, e.bottom || 0, 3, co), fo(t, e.left || 0, 3, uo), fo(t, t.transform.width - (e.right || 0), 3, ho);\n var i = t.transform.centerPoint;\n !function (t, e, i, o) {\n mo(t, e - 1, i - 10, 2, 20, o), mo(t, e - 10, i - 1, 20, 2, o);\n }(t, i.x, t.transform.height - i.y, po);\n }(this), this.context.setDefault();\n }, yo.prototype.renderLayer = function (t, e, i, o) {\n i.isHidden(this.transform.zoom) || ("background" === i.type || "custom" === i.type || o.length) && (this.id = i.id, this.gpuTimingStart(i), vo[i.type](t, e, i, o, this.style.placement.variableOffsets), this.gpuTimingEnd());\n }, yo.prototype.gpuTimingStart = function (t) {\n if (this.options.gpuTiming) {\n var e = this.context.extTimerQuery,\n i = this.gpuTimers[t.id];\n i || (i = this.gpuTimers[t.id] = {\n calls: 0,\n cpuTime: 0,\n query: e.createQueryEXT()\n }), i.calls++, e.beginQueryEXT(e.TIME_ELAPSED_EXT, i.query);\n }\n }, yo.prototype.gpuTimingEnd = function () {\n if (this.options.gpuTiming) {\n var t = this.context.extTimerQuery;\n t.endQueryEXT(t.TIME_ELAPSED_EXT);\n }\n }, yo.prototype.collectGpuTimers = function () {\n var t = this.gpuTimers;\n return this.gpuTimers = {}, t;\n }, yo.prototype.queryGpuTimers = function (t) {\n var e = {};\n\n for (var i in t) {\n var o = t[i],\n r = this.context.extTimerQuery,\n a = r.getQueryObjectEXT(o.query, r.QUERY_RESULT_EXT) / 1e6;\n r.deleteQueryEXT(o.query), e[i] = a;\n }\n\n return e;\n }, yo.prototype.translatePosMatrix = function (e, i, o, r, a) {\n if (!o[0] && !o[1]) return e;\n var n = a ? "map" === r ? this.transform.angle : 0 : "viewport" === r ? -this.transform.angle : 0;\n\n if (n) {\n var s = Math.sin(n),\n l = Math.cos(n);\n o = [o[0] * l - o[1] * s, o[0] * s + o[1] * l];\n }\n\n var c = [a ? o[0] : pe(i, o[0], this.transform.zoom), a ? o[1] : pe(i, o[1], this.transform.zoom), 0],\n u = new Float32Array(16);\n return t.translate(u, e, c), u;\n }, yo.prototype.saveTileTexture = function (t) {\n var e = this._tileTextures[t.size[0]];\n e ? e.push(t) : this._tileTextures[t.size[0]] = [t];\n }, yo.prototype.getTileTexture = function (t) {\n var e = this._tileTextures[t];\n return e && e.length > 0 ? e.pop() : null;\n }, yo.prototype.isPatternMissing = function (t) {\n if (!t) return !1;\n if (!t.from || !t.to) return !0;\n var e = this.imageManager.getPattern(t.from.toString()),\n i = this.imageManager.getPattern(t.to.toString());\n return !e || !i;\n }, yo.prototype.useProgram = function (t, e) {\n this.cache = this.cache || {};\n var i = "" + t + (e ? e.cacheKey : "") + (this._showOverdrawInspector ? "/overdraw" : "");\n return this.cache[i] || (this.cache[i] = new bi(this.context, t, vi[t], e, Ki[t], this._showOverdrawInspector)), this.cache[i];\n }, yo.prototype.setCustomLayerDefaults = function () {\n this.context.unbindVAO(), this.context.cullFace.setDefault(), this.context.activeTexture.setDefault(), this.context.pixelStoreUnpack.setDefault(), this.context.pixelStoreUnpackPremultiplyAlpha.setDefault(), this.context.pixelStoreUnpackFlipY.setDefault();\n }, yo.prototype.setBaseState = function () {\n var t = this.context.gl;\n this.context.cullFace.set(!1), this.context.viewport.set([0, 0, this.width, this.height]), this.context.blendEquation.set(t.FUNC_ADD);\n }, yo.prototype.initDebugOverlayCanvas = function () {\n null == this.debugOverlayCanvas && (this.debugOverlayCanvas = t.window.document.createElement("canvas"), this.debugOverlayCanvas.width = 512, this.debugOverlayCanvas.height = 512, this.debugOverlayTexture = new t.Texture(this.context, this.debugOverlayCanvas, this.context.gl.RGBA));\n }, yo.prototype.destroy = function () {\n this.emptyTexture.destroy(), this.debugOverlayTexture && this.debugOverlayTexture.destroy();\n };\n\n var xo = function xo(t, e) {\n this.points = t, this.planes = e;\n };\n\n xo.fromInvProjectionMatrix = function (e, i, o) {\n var r = Math.pow(2, o),\n a = [[-1, 1, -1, 1], [1, 1, -1, 1], [1, -1, -1, 1], [-1, -1, -1, 1], [-1, 1, 1, 1], [1, 1, 1, 1], [1, -1, 1, 1], [-1, -1, 1, 1]].map(function (i) {\n return t.transformMat4([], i, e);\n }).map(function (e) {\n return t.scale$1([], e, 1 / e[3] / i * r);\n }),\n n = [[0, 1, 2], [6, 5, 4], [0, 3, 7], [2, 1, 5], [3, 2, 6], [0, 4, 5]].map(function (e) {\n var i = t.sub([], a[e[0]], a[e[1]]),\n o = t.sub([], a[e[2]], a[e[1]]),\n r = t.normalize([], t.cross([], i, o)),\n n = -t.dot(r, a[e[1]]);\n return r.concat(n);\n });\n return new xo(a, n);\n };\n\n var bo = function bo(e, i) {\n this.min = e, this.max = i, this.center = t.scale$2([], t.add([], this.min, this.max), .5);\n };\n\n bo.prototype.quadrant = function (e) {\n for (var i = [e % 2 == 0, e < 2], o = t.clone$2(this.min), r = t.clone$2(this.max), a = 0; a < i.length; a++) {\n o[a] = i[a] ? this.min[a] : this.center[a], r[a] = i[a] ? this.center[a] : this.max[a];\n }\n\n return r[2] = this.max[2], new bo(o, r);\n }, bo.prototype.distanceX = function (t) {\n return Math.max(Math.min(this.max[0], t[0]), this.min[0]) - t[0];\n }, bo.prototype.distanceY = function (t) {\n return Math.max(Math.min(this.max[1], t[1]), this.min[1]) - t[1];\n }, bo.prototype.intersects = function (e) {\n for (var i = [[this.min[0], this.min[1], 0, 1], [this.max[0], this.min[1], 0, 1], [this.max[0], this.max[1], 0, 1], [this.min[0], this.max[1], 0, 1]], o = !0, r = 0; r < e.planes.length; r++) {\n for (var a = e.planes[r], n = 0, s = 0; s < i.length; s++) {\n n += t.dot$1(a, i[s]) >= 0;\n }\n\n if (0 === n) return 0;\n n !== i.length && (o = !1);\n }\n\n if (o) return 2;\n\n for (var l = 0; l < 3; l++) {\n for (var c = Number.MAX_VALUE, u = -Number.MAX_VALUE, h = 0; h < e.points.length; h++) {\n var p = e.points[h][l] - this.min[l];\n c = Math.min(c, p), u = Math.max(u, p);\n }\n\n if (u < 0 || c > this.max[l] - this.min[l]) return 0;\n }\n\n return 1;\n };\n\n var wo = function wo(t, e, i, o) {\n if (void 0 === t && (t = 0), void 0 === e && (e = 0), void 0 === i && (i = 0), void 0 === o && (o = 0), isNaN(t) || t < 0 || isNaN(e) || e < 0 || isNaN(i) || i < 0 || isNaN(o) || o < 0) throw new Error("Invalid value for edge-insets, top, bottom, left and right must all be numbers");\n this.top = t, this.bottom = e, this.left = i, this.right = o;\n };\n\n wo.prototype.interpolate = function (e, i, o) {\n return null != i.top && null != e.top && (this.top = t.number(e.top, i.top, o)), null != i.bottom && null != e.bottom && (this.bottom = t.number(e.bottom, i.bottom, o)), null != i.left && null != e.left && (this.left = t.number(e.left, i.left, o)), null != i.right && null != e.right && (this.right = t.number(e.right, i.right, o)), this;\n }, wo.prototype.getCenter = function (e, i) {\n var o = t.clamp((this.left + e - this.right) / 2, 0, e),\n r = t.clamp((this.top + i - this.bottom) / 2, 0, i);\n return new t.Point(o, r);\n }, wo.prototype.equals = function (t) {\n return this.top === t.top && this.bottom === t.bottom && this.left === t.left && this.right === t.right;\n }, wo.prototype.clone = function () {\n return new wo(this.top, this.bottom, this.left, this.right);\n }, wo.prototype.toJSON = function () {\n return {\n top: this.top,\n bottom: this.bottom,\n left: this.left,\n right: this.right\n };\n };\n\n var To = function To(e, i, o, r, a) {\n this.tileSize = 512, this.maxValidLatitude = 85.051129, this._renderWorldCopies = void 0 === a || a, this._minZoom = e || 0, this._maxZoom = i || 22, this._minPitch = null == o ? 0 : o, this._maxPitch = null == r ? 60 : r, this.setMaxBounds(), this.width = 0, this.height = 0, this._center = new t.LngLat(0, 0), this.zoom = 0, this.angle = 0, this._fov = .6435011087932844, this._pitch = 0, this._unmodified = !0, this._edgeInsets = new wo(), this._posMatrixCache = {}, this._alignedPosMatrixCache = {};\n },\n Eo = {\n minZoom: {\n configurable: !0\n },\n maxZoom: {\n configurable: !0\n },\n minPitch: {\n configurable: !0\n },\n maxPitch: {\n configurable: !0\n },\n renderWorldCopies: {\n configurable: !0\n },\n worldSize: {\n configurable: !0\n },\n centerOffset: {\n configurable: !0\n },\n size: {\n configurable: !0\n },\n bearing: {\n configurable: !0\n },\n pitch: {\n configurable: !0\n },\n fov: {\n configurable: !0\n },\n zoom: {\n configurable: !0\n },\n center: {\n configurable: !0\n },\n padding: {\n configurable: !0\n },\n centerPoint: {\n configurable: !0\n },\n unmodified: {\n configurable: !0\n },\n point: {\n configurable: !0\n }\n };\n\n To.prototype.clone = function () {\n var t = new To(this._minZoom, this._maxZoom, this._minPitch, this.maxPitch, this._renderWorldCopies);\n return t.tileSize = this.tileSize, t.latRange = this.latRange, t.width = this.width, t.height = this.height, t._center = this._center, t.zoom = this.zoom, t.angle = this.angle, t._fov = this._fov, t._pitch = this._pitch, t._unmodified = this._unmodified, t._edgeInsets = this._edgeInsets.clone(), t._calcMatrices(), t;\n }, Eo.minZoom.get = function () {\n return this._minZoom;\n }, Eo.minZoom.set = function (t) {\n this._minZoom !== t && (this._minZoom = t, this.zoom = Math.max(this.zoom, t));\n }, Eo.maxZoom.get = function () {\n return this._maxZoom;\n }, Eo.maxZoom.set = function (t) {\n this._maxZoom !== t && (this._maxZoom = t, this.zoom = Math.min(this.zoom, t));\n }, Eo.minPitch.get = function () {\n return this._minPitch;\n }, Eo.minPitch.set = function (t) {\n this._minPitch !== t && (this._minPitch = t, this.pitch = Math.max(this.pitch, t));\n }, Eo.maxPitch.get = function () {\n return this._maxPitch;\n }, Eo.maxPitch.set = function (t) {\n this._maxPitch !== t && (this._maxPitch = t, this.pitch = Math.min(this.pitch, t));\n }, Eo.renderWorldCopies.get = function () {\n return this._renderWorldCopies;\n }, Eo.renderWorldCopies.set = function (t) {\n void 0 === t ? t = !0 : null === t && (t = !1), this._renderWorldCopies = t;\n }, Eo.worldSize.get = function () {\n return this.tileSize * this.scale;\n }, Eo.centerOffset.get = function () {\n return this.centerPoint._sub(this.size._div(2));\n }, Eo.size.get = function () {\n return new t.Point(this.width, this.height);\n }, Eo.bearing.get = function () {\n return -this.angle / Math.PI * 180;\n }, Eo.bearing.set = function (e) {\n var i = -t.wrap(e, -180, 180) * Math.PI / 180;\n this.angle !== i && (this._unmodified = !1, this.angle = i, this._calcMatrices(), this.rotationMatrix = t.create$2(), t.rotate(this.rotationMatrix, this.rotationMatrix, this.angle));\n }, Eo.pitch.get = function () {\n return this._pitch / Math.PI * 180;\n }, Eo.pitch.set = function (e) {\n var i = t.clamp(e, this.minPitch, this.maxPitch) / 180 * Math.PI;\n this._pitch !== i && (this._unmodified = !1, this._pitch = i, this._calcMatrices());\n }, Eo.fov.get = function () {\n return this._fov / Math.PI * 180;\n }, Eo.fov.set = function (t) {\n t = Math.max(.01, Math.min(60, t)), this._fov !== t && (this._unmodified = !1, this._fov = t / 180 * Math.PI, this._calcMatrices());\n }, Eo.zoom.get = function () {\n return this._zoom;\n }, Eo.zoom.set = function (t) {\n var e = Math.min(Math.max(t, this.minZoom), this.maxZoom);\n this._zoom !== e && (this._unmodified = !1, this._zoom = e, this.scale = this.zoomScale(e), this.tileZoom = Math.floor(e), this.zoomFraction = e - this.tileZoom, this._constrain(), this._calcMatrices());\n }, Eo.center.get = function () {\n return this._center;\n }, Eo.center.set = function (t) {\n t.lat === this._center.lat && t.lng === this._center.lng || (this._unmodified = !1, this._center = t, this._constrain(), this._calcMatrices());\n }, Eo.padding.get = function () {\n return this._edgeInsets.toJSON();\n }, Eo.padding.set = function (t) {\n this._edgeInsets.equals(t) || (this._unmodified = !1, this._edgeInsets.interpolate(this._edgeInsets, t, 1), this._calcMatrices());\n }, Eo.centerPoint.get = function () {\n return this._edgeInsets.getCenter(this.width, this.height);\n }, To.prototype.isPaddingEqual = function (t) {\n return this._edgeInsets.equals(t);\n }, To.prototype.interpolatePadding = function (t, e, i) {\n this._unmodified = !1, this._edgeInsets.interpolate(t, e, i), this._constrain(), this._calcMatrices();\n }, To.prototype.coveringZoomLevel = function (t) {\n var e = (t.roundZoom ? Math.round : Math.floor)(this.zoom + this.scaleZoom(this.tileSize / t.tileSize));\n return Math.max(0, e);\n }, To.prototype.getVisibleUnwrappedCoordinates = function (e) {\n var i = [new t.UnwrappedTileID(0, e)];\n if (this._renderWorldCopies) for (var o = this.pointCoordinate(new t.Point(0, 0)), r = this.pointCoordinate(new t.Point(this.width, 0)), a = this.pointCoordinate(new t.Point(this.width, this.height)), n = this.pointCoordinate(new t.Point(0, this.height)), s = Math.floor(Math.min(o.x, r.x, a.x, n.x)), l = Math.floor(Math.max(o.x, r.x, a.x, n.x)), c = s - 1; c <= l + 1; c++) {\n 0 !== c && i.push(new t.UnwrappedTileID(c, e));\n }\n return i;\n }, To.prototype.coveringTiles = function (e) {\n var i = this.coveringZoomLevel(e),\n o = i;\n if (void 0 !== e.minzoom && i < e.minzoom) return [];\n void 0 !== e.maxzoom && i > e.maxzoom && (i = e.maxzoom);\n var r = t.MercatorCoordinate.fromLngLat(this.center),\n a = Math.pow(2, i),\n n = [a * r.x, a * r.y, 0],\n s = xo.fromInvProjectionMatrix(this.invProjMatrix, this.worldSize, i),\n l = e.minzoom || 0;\n this.pitch <= 60 && this._edgeInsets.top < .1 && (l = i);\n\n var c = function c(t) {\n return {\n aabb: new bo([t * a, 0, 0], [(t + 1) * a, a, 0]),\n zoom: 0,\n x: 0,\n y: 0,\n wrap: t,\n fullyVisible: !1\n };\n },\n u = [],\n h = [],\n p = i,\n d = e.reparseOverscaled ? o : i;\n\n if (this._renderWorldCopies) for (var _ = 1; _ <= 3; _++) {\n u.push(c(-_)), u.push(c(_));\n }\n\n for (u.push(c(0)); u.length > 0;) {\n var f = u.pop(),\n m = f.x,\n g = f.y,\n v = f.fullyVisible;\n\n if (!v) {\n var y = f.aabb.intersects(s);\n if (0 === y) continue;\n v = 2 === y;\n }\n\n var x = f.aabb.distanceX(n),\n b = f.aabb.distanceY(n),\n w = Math.max(Math.abs(x), Math.abs(b));\n if (f.zoom === p || w > 3 + (1 << p - f.zoom) - 2 && f.zoom >= l) h.push({\n tileID: new t.OverscaledTileID(f.zoom === p ? d : f.zoom, f.wrap, f.zoom, m, g),\n distanceSq: t.sqrLen([n[0] - .5 - m, n[1] - .5 - g])\n });else for (var T = 0; T < 4; T++) {\n var E = (m << 1) + T % 2,\n I = (g << 1) + (T >> 1);\n u.push({\n aabb: f.aabb.quadrant(T),\n zoom: f.zoom + 1,\n x: E,\n y: I,\n wrap: f.wrap,\n fullyVisible: v\n });\n }\n }\n\n return h.sort(function (t, e) {\n return t.distanceSq - e.distanceSq;\n }).map(function (t) {\n return t.tileID;\n });\n }, To.prototype.resize = function (t, e) {\n this.width = t, this.height = e, this.pixelsToGLUnits = [2 / t, -2 / e], this._constrain(), this._calcMatrices();\n }, Eo.unmodified.get = function () {\n return this._unmodified;\n }, To.prototype.zoomScale = function (t) {\n return Math.pow(2, t);\n }, To.prototype.scaleZoom = function (t) {\n return Math.log(t) / Math.LN2;\n }, To.prototype.project = function (e) {\n var i = t.clamp(e.lat, -this.maxValidLatitude, this.maxValidLatitude);\n return new t.Point(t.mercatorXfromLng(e.lng) * this.worldSize, t.mercatorYfromLat(i) * this.worldSize);\n }, To.prototype.unproject = function (e) {\n return new t.MercatorCoordinate(e.x / this.worldSize, e.y / this.worldSize).toLngLat();\n }, Eo.point.get = function () {\n return this.project(this.center);\n }, To.prototype.setLocationAtPoint = function (e, i) {\n var o = this.pointCoordinate(i),\n r = this.pointCoordinate(this.centerPoint),\n a = this.locationCoordinate(e),\n n = new t.MercatorCoordinate(a.x - (o.x - r.x), a.y - (o.y - r.y));\n this.center = this.coordinateLocation(n), this._renderWorldCopies && (this.center = this.center.wrap());\n }, To.prototype.locationPoint = function (t) {\n return this.coordinatePoint(this.locationCoordinate(t));\n }, To.prototype.pointLocation = function (t) {\n return this.coordinateLocation(this.pointCoordinate(t));\n }, To.prototype.locationCoordinate = function (e) {\n return t.MercatorCoordinate.fromLngLat(e);\n }, To.prototype.coordinateLocation = function (t) {\n return t.toLngLat();\n }, To.prototype.pointCoordinate = function (e) {\n var i = [e.x, e.y, 0, 1],\n o = [e.x, e.y, 1, 1];\n t.transformMat4(i, i, this.pixelMatrixInverse), t.transformMat4(o, o, this.pixelMatrixInverse);\n var r = i[3],\n a = o[3],\n n = i[1] / r,\n s = o[1] / a,\n l = i[2] / r,\n c = o[2] / a,\n u = l === c ? 0 : (0 - l) / (c - l);\n return new t.MercatorCoordinate(t.number(i[0] / r, o[0] / a, u) / this.worldSize, t.number(n, s, u) / this.worldSize);\n }, To.prototype.coordinatePoint = function (e) {\n var i = [e.x * this.worldSize, e.y * this.worldSize, 0, 1];\n return t.transformMat4(i, i, this.pixelMatrix), new t.Point(i[0] / i[3], i[1] / i[3]);\n }, To.prototype.getBounds = function () {\n return new t.LngLatBounds().extend(this.pointLocation(new t.Point(0, 0))).extend(this.pointLocation(new t.Point(this.width, 0))).extend(this.pointLocation(new t.Point(this.width, this.height))).extend(this.pointLocation(new t.Point(0, this.height)));\n }, To.prototype.getMaxBounds = function () {\n return this.latRange && 2 === this.latRange.length && this.lngRange && 2 === this.lngRange.length ? new t.LngLatBounds([this.lngRange[0], this.latRange[0]], [this.lngRange[1], this.latRange[1]]) : null;\n }, To.prototype.setMaxBounds = function (t) {\n t ? (this.lngRange = [t.getWest(), t.getEast()], this.latRange = [t.getSouth(), t.getNorth()], this._constrain()) : (this.lngRange = null, this.latRange = [-this.maxValidLatitude, this.maxValidLatitude]);\n }, To.prototype.calculatePosMatrix = function (e, i) {\n void 0 === i && (i = !1);\n var o = e.key,\n r = i ? this._alignedPosMatrixCache : this._posMatrixCache;\n if (r[o]) return r[o];\n var a = e.canonical,\n n = this.worldSize / this.zoomScale(a.z),\n s = a.x + Math.pow(2, a.z) * e.wrap,\n l = t.identity(new Float64Array(16));\n return t.translate(l, l, [s * n, a.y * n, 0]), t.scale(l, l, [n / t.EXTENT, n / t.EXTENT, 1]), t.multiply(l, i ? this.alignedProjMatrix : this.projMatrix, l), r[o] = new Float32Array(l), r[o];\n }, To.prototype.customLayerMatrix = function () {\n return this.mercatorMatrix.slice();\n }, To.prototype._constrain = function () {\n if (this.center && this.width && this.height && !this._constraining) {\n this._constraining = !0;\n var e,\n i,\n o,\n r,\n a = -90,\n n = 90,\n s = -180,\n l = 180,\n c = this.size,\n u = this._unmodified;\n\n if (this.latRange) {\n var h = this.latRange;\n a = t.mercatorYfromLat(h[1]) * this.worldSize, e = (n = t.mercatorYfromLat(h[0]) * this.worldSize) - a < c.y ? c.y / (n - a) : 0;\n }\n\n if (this.lngRange) {\n var p = this.lngRange;\n s = t.mercatorXfromLng(p[0]) * this.worldSize, i = (l = t.mercatorXfromLng(p[1]) * this.worldSize) - s < c.x ? c.x / (l - s) : 0;\n }\n\n var d = this.point,\n _ = Math.max(i || 0, e || 0);\n\n if (_) return this.center = this.unproject(new t.Point(i ? (l + s) / 2 : d.x, e ? (n + a) / 2 : d.y)), this.zoom += this.scaleZoom(_), this._unmodified = u, void (this._constraining = !1);\n\n if (this.latRange) {\n var f = d.y,\n m = c.y / 2;\n f - m < a && (r = a + m), f + m > n && (r = n - m);\n }\n\n if (this.lngRange) {\n var g = d.x,\n v = c.x / 2;\n g - v < s && (o = s + v), g + v > l && (o = l - v);\n }\n\n void 0 === o && void 0 === r || (this.center = this.unproject(new t.Point(void 0 !== o ? o : d.x, void 0 !== r ? r : d.y))), this._unmodified = u, this._constraining = !1;\n }\n }, To.prototype._calcMatrices = function () {\n if (this.height) {\n var e = this.centerOffset;\n this.cameraToCenterDistance = .5 / Math.tan(this._fov / 2) * this.height;\n var i = Math.PI / 2 + this._pitch,\n o = this._fov * (.5 + e.y / this.height),\n r = Math.sin(o) * this.cameraToCenterDistance / Math.sin(t.clamp(Math.PI - i - o, .01, Math.PI - .01)),\n a = this.point,\n n = a.x,\n s = a.y,\n l = 1.01 * (Math.cos(Math.PI / 2 - this._pitch) * r + this.cameraToCenterDistance),\n c = this.height / 50,\n u = new Float64Array(16);\n t.perspective(u, this._fov, this.width / this.height, c, l), u[8] = 2 * -e.x / this.width, u[9] = 2 * e.y / this.height, t.scale(u, u, [1, -1, 1]), t.translate(u, u, [0, 0, -this.cameraToCenterDistance]), t.rotateX(u, u, this._pitch), t.rotateZ(u, u, this.angle), t.translate(u, u, [-n, -s, 0]), this.mercatorMatrix = t.scale([], u, [this.worldSize, this.worldSize, this.worldSize]), t.scale(u, u, [1, 1, t.mercatorZfromAltitude(1, this.center.lat) * this.worldSize, 1]), this.projMatrix = u, this.invProjMatrix = t.invert([], this.projMatrix);\n\n var h = this.width % 2 / 2,\n p = this.height % 2 / 2,\n d = Math.cos(this.angle),\n _ = Math.sin(this.angle),\n f = n - Math.round(n) + d * h + _ * p,\n m = s - Math.round(s) + d * p + _ * h,\n g = new Float64Array(u);\n\n if (t.translate(g, g, [f > .5 ? f - 1 : f, m > .5 ? m - 1 : m, 0]), this.alignedProjMatrix = g, u = t.create(), t.scale(u, u, [this.width / 2, -this.height / 2, 1]), t.translate(u, u, [1, -1, 0]), this.labelPlaneMatrix = u, u = t.create(), t.scale(u, u, [1, -1, 1]), t.translate(u, u, [-1, -1, 0]), t.scale(u, u, [2 / this.width, 2 / this.height, 1]), this.glCoordMatrix = u, this.pixelMatrix = t.multiply(new Float64Array(16), this.labelPlaneMatrix, this.projMatrix), !(u = t.invert(new Float64Array(16), this.pixelMatrix))) throw new Error("failed to invert matrix");\n this.pixelMatrixInverse = u, this._posMatrixCache = {}, this._alignedPosMatrixCache = {};\n }\n }, To.prototype.maxPitchScaleFactor = function () {\n if (!this.pixelMatrixInverse) return 1;\n var e = this.pointCoordinate(new t.Point(0, 0)),\n i = [e.x * this.worldSize, e.y * this.worldSize, 0, 1];\n return t.transformMat4(i, i, this.pixelMatrix)[3] / this.cameraToCenterDistance;\n }, To.prototype.getCameraPoint = function () {\n var e = Math.tan(this._pitch) * (this.cameraToCenterDistance || 1);\n return this.centerPoint.add(new t.Point(0, e));\n }, To.prototype.getCameraQueryGeometry = function (e) {\n var i = this.getCameraPoint();\n if (1 === e.length) return [e[0], i];\n\n for (var o = i.x, r = i.y, a = i.x, n = i.y, s = 0, l = e; s < l.length; s += 1) {\n var c = l[s];\n o = Math.min(o, c.x), r = Math.min(r, c.y), a = Math.max(a, c.x), n = Math.max(n, c.y);\n }\n\n return [new t.Point(o, r), new t.Point(a, r), new t.Point(a, n), new t.Point(o, n), new t.Point(o, r)];\n }, Object.defineProperties(To.prototype, Eo);\n\n var Io = function Io(e) {\n var i, o, r, _a3;\n\n this._hashName = e && encodeURIComponent(e), t.bindAll(["_getCurrentHash", "_onHashChange", "_updateHash"], this), this._updateHash = (i = this._updateHashUnthrottled.bind(this), o = !1, r = null, _a3 = function a() {\n r = null, o && (i(), r = setTimeout(_a3, 300), o = !1);\n }, function () {\n return o = !0, r || _a3(), r;\n });\n };\n\n Io.prototype.addTo = function (e) {\n return this._map = e, t.window.addEventListener("hashchange", this._onHashChange, !1), this._map.on("moveend", this._updateHash), this;\n }, Io.prototype.remove = function () {\n return t.window.removeEventListener("hashchange", this._onHashChange, !1), this._map.off("moveend", this._updateHash), clearTimeout(this._updateHash()), delete this._map, this;\n }, Io.prototype.getHashString = function (e) {\n var i = this._map.getCenter(),\n o = Math.round(100 * this._map.getZoom()) / 100,\n r = Math.ceil((o * Math.LN2 + Math.log(512 / 360 / .5)) / Math.LN10),\n a = Math.pow(10, r),\n n = Math.round(i.lng * a) / a,\n s = Math.round(i.lat * a) / a,\n l = this._map.getBearing(),\n c = this._map.getPitch(),\n u = "";\n\n if (u += e ? "/" + n + "/" + s + "/" + o : o + "/" + s + "/" + n, (l || c) && (u += "/" + Math.round(10 * l) / 10), c && (u += "/" + Math.round(c)), this._hashName) {\n var h = this._hashName,\n p = !1,\n d = t.window.location.hash.slice(1).split("&").map(function (t) {\n var e = t.split("=")[0];\n return e === h ? (p = !0, e + "=" + u) : t;\n }).filter(function (t) {\n return t;\n });\n return p || d.push(h + "=" + u), "#" + d.join("&");\n }\n\n return "#" + u;\n }, Io.prototype._getCurrentHash = function () {\n var e,\n i = this,\n o = t.window.location.hash.replace("#", "");\n return this._hashName ? (o.split("&").map(function (t) {\n return t.split("=");\n }).forEach(function (t) {\n t[0] === i._hashName && (e = t);\n }), (e && e[1] || "").split("/")) : o.split("/");\n }, Io.prototype._onHashChange = function () {\n var t = this._getCurrentHash();\n\n if (t.length >= 3 && !t.some(function (t) {\n return isNaN(t);\n })) {\n var e = this._map.dragRotate.isEnabled() && this._map.touchZoomRotate.isEnabled() ? +(t[3] || 0) : this._map.getBearing();\n return this._map.jumpTo({\n center: [+t[2], +t[1]],\n zoom: +t[0],\n bearing: e,\n pitch: +(t[4] || 0)\n }), !0;\n }\n\n return !1;\n }, Io.prototype._updateHashUnthrottled = function () {\n var e = t.window.location.href.replace(/(#.+)?$/, this.getHashString());\n\n try {\n t.window.history.replaceState(t.window.history.state, null, e);\n } catch (t) {}\n };\n\n var Po = {\n linearity: .3,\n easing: t.bezier(0, 0, .3, 1)\n },\n So = t.extend({\n deceleration: 2500,\n maxSpeed: 1400\n }, Po),\n Co = t.extend({\n deceleration: 20,\n maxSpeed: 1400\n }, Po),\n zo = t.extend({\n deceleration: 1e3,\n maxSpeed: 360\n }, Po),\n Do = t.extend({\n deceleration: 1e3,\n maxSpeed: 90\n }, Po),\n Ao = function Ao(t) {\n this._map = t, this.clear();\n };\n\n function Mo(t, e) {\n (!t.duration || t.duration < e.duration) && (t.duration = e.duration, t.easing = e.easing);\n }\n\n function Lo(e, i, o) {\n var r = o.maxSpeed,\n a = o.linearity,\n n = o.deceleration,\n s = t.clamp(e * a / (i / 1e3), -r, r),\n l = Math.abs(s) / (n * a);\n return {\n easing: o.easing,\n duration: 1e3 * l,\n amount: s * (l / 2)\n };\n }\n\n Ao.prototype.clear = function () {\n this._inertiaBuffer = [];\n }, Ao.prototype.record = function (e) {\n this._drainInertiaBuffer(), this._inertiaBuffer.push({\n time: t.browser.now(),\n settings: e\n });\n }, Ao.prototype._drainInertiaBuffer = function () {\n for (var e = this._inertiaBuffer, i = t.browser.now(); e.length > 0 && i - e[0].time > 160;) {\n e.shift();\n }\n }, Ao.prototype._onMoveEnd = function (e) {\n if (this._drainInertiaBuffer(), !(this._inertiaBuffer.length < 2)) {\n for (var i = {\n zoom: 0,\n bearing: 0,\n pitch: 0,\n pan: new t.Point(0, 0),\n pinchAround: void 0,\n around: void 0\n }, o = 0, r = this._inertiaBuffer; o < r.length; o += 1) {\n var a = r[o].settings;\n i.zoom += a.zoomDelta || 0, i.bearing += a.bearingDelta || 0, i.pitch += a.pitchDelta || 0, a.panDelta && i.pan._add(a.panDelta), a.around && (i.around = a.around), a.pinchAround && (i.pinchAround = a.pinchAround);\n }\n\n var n = this._inertiaBuffer[this._inertiaBuffer.length - 1].time - this._inertiaBuffer[0].time,\n s = {};\n\n if (i.pan.mag()) {\n var l = Lo(i.pan.mag(), n, t.extend({}, So, e || {}));\n s.offset = i.pan.mult(l.amount / i.pan.mag()), s.center = this._map.transform.center, Mo(s, l);\n }\n\n if (i.zoom) {\n var c = Lo(i.zoom, n, Co);\n s.zoom = this._map.transform.zoom + c.amount, Mo(s, c);\n }\n\n if (i.bearing) {\n var u = Lo(i.bearing, n, zo);\n s.bearing = this._map.transform.bearing + t.clamp(u.amount, -179, 179), Mo(s, u);\n }\n\n if (i.pitch) {\n var h = Lo(i.pitch, n, Do);\n s.pitch = this._map.transform.pitch + h.amount, Mo(s, h);\n }\n\n if (s.zoom || s.bearing) {\n var p = void 0 === i.pinchAround ? i.around : i.pinchAround;\n s.around = p ? this._map.unproject(p) : this._map.getCenter();\n }\n\n return this.clear(), t.extend(s, {\n noMoveStart: !0\n });\n }\n };\n\n var Ro = function (e) {\n function o(o, r, a, n) {\n void 0 === n && (n = {});\n var s = i.mousePos(r.getCanvasContainer(), a),\n l = r.unproject(s);\n e.call(this, o, t.extend({\n point: s,\n lngLat: l,\n originalEvent: a\n }, n)), this._defaultPrevented = !1, this.target = r;\n }\n\n e && (o.__proto__ = e), (o.prototype = Object.create(e && e.prototype)).constructor = o;\n var r = {\n defaultPrevented: {\n configurable: !0\n }\n };\n return o.prototype.preventDefault = function () {\n this._defaultPrevented = !0;\n }, r.defaultPrevented.get = function () {\n return this._defaultPrevented;\n }, Object.defineProperties(o.prototype, r), o;\n }(t.Event),\n ko = function (e) {\n function o(o, r, a) {\n var n = "touchend" === o ? a.changedTouches : a.touches,\n s = i.touchPos(r.getCanvasContainer(), n),\n l = s.map(function (t) {\n return r.unproject(t);\n }),\n c = s.reduce(function (t, e, i, o) {\n return t.add(e.div(o.length));\n }, new t.Point(0, 0)),\n u = r.unproject(c);\n e.call(this, o, {\n points: s,\n point: c,\n lngLats: l,\n lngLat: u,\n originalEvent: a\n }), this._defaultPrevented = !1;\n }\n\n e && (o.__proto__ = e), (o.prototype = Object.create(e && e.prototype)).constructor = o;\n var r = {\n defaultPrevented: {\n configurable: !0\n }\n };\n return o.prototype.preventDefault = function () {\n this._defaultPrevented = !0;\n }, r.defaultPrevented.get = function () {\n return this._defaultPrevented;\n }, Object.defineProperties(o.prototype, r), o;\n }(t.Event),\n Bo = function (t) {\n function e(e, i, o) {\n t.call(this, e, {\n originalEvent: o\n }), this._defaultPrevented = !1;\n }\n\n t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e;\n var i = {\n defaultPrevented: {\n configurable: !0\n }\n };\n return e.prototype.preventDefault = function () {\n this._defaultPrevented = !0;\n }, i.defaultPrevented.get = function () {\n return this._defaultPrevented;\n }, Object.defineProperties(e.prototype, i), e;\n }(t.Event),\n Oo = function Oo(t, e) {\n this._map = t, this._clickTolerance = e.clickTolerance;\n };\n\n Oo.prototype.reset = function () {\n delete this._mousedownPos;\n }, Oo.prototype.wheel = function (t) {\n return this._firePreventable(new Bo(t.type, this._map, t));\n }, Oo.prototype.mousedown = function (t, e) {\n return this._mousedownPos = e, this._firePreventable(new Ro(t.type, this._map, t));\n }, Oo.prototype.mouseup = function (t) {\n this._map.fire(new Ro(t.type, this._map, t));\n }, Oo.prototype.click = function (t, e) {\n this._mousedownPos && this._mousedownPos.dist(e) >= this._clickTolerance || this._map.fire(new Ro(t.type, this._map, t));\n }, Oo.prototype.dblclick = function (t) {\n return this._firePreventable(new Ro(t.type, this._map, t));\n }, Oo.prototype.mouseover = function (t) {\n this._map.fire(new Ro(t.type, this._map, t));\n }, Oo.prototype.mouseout = function (t) {\n this._map.fire(new Ro(t.type, this._map, t));\n }, Oo.prototype.touchstart = function (t) {\n return this._firePreventable(new ko(t.type, this._map, t));\n }, Oo.prototype.touchmove = function (t) {\n this._map.fire(new ko(t.type, this._map, t));\n }, Oo.prototype.touchend = function (t) {\n this._map.fire(new ko(t.type, this._map, t));\n }, Oo.prototype.touchcancel = function (t) {\n this._map.fire(new ko(t.type, this._map, t));\n }, Oo.prototype._firePreventable = function (t) {\n if (this._map.fire(t), t.defaultPrevented) return {};\n }, Oo.prototype.isEnabled = function () {\n return !0;\n }, Oo.prototype.isActive = function () {\n return !1;\n }, Oo.prototype.enable = function () {}, Oo.prototype.disable = function () {};\n\n var Fo = function Fo(t) {\n this._map = t;\n };\n\n Fo.prototype.reset = function () {\n this._delayContextMenu = !1, delete this._contextMenuEvent;\n }, Fo.prototype.mousemove = function (t) {\n this._map.fire(new Ro(t.type, this._map, t));\n }, Fo.prototype.mousedown = function () {\n this._delayContextMenu = !0;\n }, Fo.prototype.mouseup = function () {\n this._delayContextMenu = !1, this._contextMenuEvent && (this._map.fire(new Ro("contextmenu", this._map, this._contextMenuEvent)), delete this._contextMenuEvent);\n }, Fo.prototype.contextmenu = function (t) {\n this._delayContextMenu ? this._contextMenuEvent = t : this._map.fire(new Ro(t.type, this._map, t)), this._map.listens("contextmenu") && t.preventDefault();\n }, Fo.prototype.isEnabled = function () {\n return !0;\n }, Fo.prototype.isActive = function () {\n return !1;\n }, Fo.prototype.enable = function () {}, Fo.prototype.disable = function () {};\n\n var Uo = function Uo(t, e) {\n this._map = t, this._el = t.getCanvasContainer(), this._container = t.getContainer(), this._clickTolerance = e.clickTolerance || 1;\n };\n\n function No(t, e) {\n for (var i = {}, o = 0; o < t.length; o++) {\n i[t[o].identifier] = e[o];\n }\n\n return i;\n }\n\n Uo.prototype.isEnabled = function () {\n return !!this._enabled;\n }, Uo.prototype.isActive = function () {\n return !!this._active;\n }, Uo.prototype.enable = function () {\n this.isEnabled() || (this._enabled = !0);\n }, Uo.prototype.disable = function () {\n this.isEnabled() && (this._enabled = !1);\n }, Uo.prototype.mousedown = function (t, e) {\n this.isEnabled() && t.shiftKey && 0 === t.button && (i.disableDrag(), this._startPos = this._lastPos = e, this._active = !0);\n }, Uo.prototype.mousemoveWindow = function (t, e) {\n if (this._active) {\n var o = e;\n\n if (!(this._lastPos.equals(o) || !this._box && o.dist(this._startPos) < this._clickTolerance)) {\n var r = this._startPos;\n this._lastPos = o, this._box || (this._box = i.create("div", "mapboxgl-boxzoom", this._container), this._container.classList.add("mapboxgl-crosshair"), this._fireEvent("boxzoomstart", t));\n var a = Math.min(r.x, o.x),\n n = Math.max(r.x, o.x),\n s = Math.min(r.y, o.y),\n l = Math.max(r.y, o.y);\n i.setTransform(this._box, "translate(" + a + "px," + s + "px)"), this._box.style.width = n - a + "px", this._box.style.height = l - s + "px";\n }\n }\n }, Uo.prototype.mouseupWindow = function (e, o) {\n var r = this;\n\n if (this._active && 0 === e.button) {\n var a = this._startPos,\n n = o;\n if (this.reset(), i.suppressClick(), a.x !== n.x || a.y !== n.y) return this._map.fire(new t.Event("boxzoomend", {\n originalEvent: e\n })), {\n cameraAnimation: function cameraAnimation(t) {\n return t.fitScreenCoordinates(a, n, r._map.getBearing(), {\n linear: !0\n });\n }\n };\n\n this._fireEvent("boxzoomcancel", e);\n }\n }, Uo.prototype.keydown = function (t) {\n this._active && 27 === t.keyCode && (this.reset(), this._fireEvent("boxzoomcancel", t));\n }, Uo.prototype.reset = function () {\n this._active = !1, this._container.classList.remove("mapboxgl-crosshair"), this._box && (i.remove(this._box), this._box = null), i.enableDrag(), delete this._startPos, delete this._lastPos;\n }, Uo.prototype._fireEvent = function (e, i) {\n return this._map.fire(new t.Event(e, {\n originalEvent: i\n }));\n };\n\n var Zo = function Zo(t) {\n this.reset(), this.numTouches = t.numTouches;\n };\n\n Zo.prototype.reset = function () {\n delete this.centroid, delete this.startTime, delete this.touches, this.aborted = !1;\n }, Zo.prototype.touchstart = function (e, i, o) {\n (this.centroid || o.length > this.numTouches) && (this.aborted = !0), this.aborted || (void 0 === this.startTime && (this.startTime = e.timeStamp), o.length === this.numTouches && (this.centroid = function (e) {\n for (var i = new t.Point(0, 0), o = 0, r = e; o < r.length; o += 1) {\n i._add(r[o]);\n }\n\n return i.div(e.length);\n }(i), this.touches = No(o, i)));\n }, Zo.prototype.touchmove = function (t, e, i) {\n if (!this.aborted && this.centroid) {\n var o = No(i, e);\n\n for (var r in this.touches) {\n var a = o[r];\n (!a || a.dist(this.touches[r]) > 30) && (this.aborted = !0);\n }\n }\n }, Zo.prototype.touchend = function (t, e, i) {\n if ((!this.centroid || t.timeStamp - this.startTime > 500) && (this.aborted = !0), 0 === i.length) {\n var o = !this.aborted && this.centroid;\n if (this.reset(), o) return o;\n }\n };\n\n var qo = function qo(t) {\n this.singleTap = new Zo(t), this.numTaps = t.numTaps, this.reset();\n };\n\n qo.prototype.reset = function () {\n this.lastTime = 1 / 0, delete this.lastTap, this.count = 0, this.singleTap.reset();\n }, qo.prototype.touchstart = function (t, e, i) {\n this.singleTap.touchstart(t, e, i);\n }, qo.prototype.touchmove = function (t, e, i) {\n this.singleTap.touchmove(t, e, i);\n }, qo.prototype.touchend = function (t, e, i) {\n var o = this.singleTap.touchend(t, e, i);\n\n if (o) {\n var r = t.timeStamp - this.lastTime < 500,\n a = !this.lastTap || this.lastTap.dist(o) < 30;\n if (r && a || this.reset(), this.count++, this.lastTime = t.timeStamp, this.lastTap = o, this.count === this.numTaps) return this.reset(), o;\n }\n };\n\n var jo = function jo() {\n this._zoomIn = new qo({\n numTouches: 1,\n numTaps: 2\n }), this._zoomOut = new qo({\n numTouches: 2,\n numTaps: 1\n }), this.reset();\n };\n\n jo.prototype.reset = function () {\n this._active = !1, this._zoomIn.reset(), this._zoomOut.reset();\n }, jo.prototype.touchstart = function (t, e, i) {\n this._zoomIn.touchstart(t, e, i), this._zoomOut.touchstart(t, e, i);\n }, jo.prototype.touchmove = function (t, e, i) {\n this._zoomIn.touchmove(t, e, i), this._zoomOut.touchmove(t, e, i);\n }, jo.prototype.touchend = function (t, e, i) {\n var o = this,\n r = this._zoomIn.touchend(t, e, i),\n a = this._zoomOut.touchend(t, e, i);\n\n return r ? (this._active = !0, t.preventDefault(), setTimeout(function () {\n return o.reset();\n }, 0), {\n cameraAnimation: function cameraAnimation(e) {\n return e.easeTo({\n duration: 300,\n zoom: e.getZoom() + 1,\n around: e.unproject(r)\n }, {\n originalEvent: t\n });\n }\n }) : a ? (this._active = !0, t.preventDefault(), setTimeout(function () {\n return o.reset();\n }, 0), {\n cameraAnimation: function cameraAnimation(e) {\n return e.easeTo({\n duration: 300,\n zoom: e.getZoom() - 1,\n around: e.unproject(a)\n }, {\n originalEvent: t\n });\n }\n }) : void 0;\n }, jo.prototype.touchcancel = function () {\n this.reset();\n }, jo.prototype.enable = function () {\n this._enabled = !0;\n }, jo.prototype.disable = function () {\n this._enabled = !1, this.reset();\n }, jo.prototype.isEnabled = function () {\n return this._enabled;\n }, jo.prototype.isActive = function () {\n return this._active;\n };\n\n var Vo = {\n 0: 1,\n 2: 2\n },\n Go = function Go(t) {\n this.reset(), this._clickTolerance = t.clickTolerance || 1;\n };\n\n Go.prototype.reset = function () {\n this._active = !1, this._moved = !1, delete this._lastPoint, delete this._eventButton;\n }, Go.prototype._correctButton = function (t, e) {\n return !1;\n }, Go.prototype._move = function (t, e) {\n return {};\n }, Go.prototype.mousedown = function (t, e) {\n if (!this._lastPoint) {\n var o = i.mouseButton(t);\n this._correctButton(t, o) && (this._lastPoint = e, this._eventButton = o);\n }\n }, Go.prototype.mousemoveWindow = function (t, e) {\n var i = this._lastPoint;\n if (i) if (t.preventDefault(), function (t, e) {\n var i = Vo[e];\n return void 0 === t.buttons || (t.buttons & i) !== i;\n }(t, this._eventButton)) this.reset();else if (this._moved || !(e.dist(i) < this._clickTolerance)) return this._moved = !0, this._lastPoint = e, this._move(i, e);\n }, Go.prototype.mouseupWindow = function (t) {\n this._lastPoint && i.mouseButton(t) === this._eventButton && (this._moved && i.suppressClick(), this.reset());\n }, Go.prototype.enable = function () {\n this._enabled = !0;\n }, Go.prototype.disable = function () {\n this._enabled = !1, this.reset();\n }, Go.prototype.isEnabled = function () {\n return this._enabled;\n }, Go.prototype.isActive = function () {\n return this._active;\n };\n\n var Wo = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.mousedown = function (e, i) {\n t.prototype.mousedown.call(this, e, i), this._lastPoint && (this._active = !0);\n }, e.prototype._correctButton = function (t, e) {\n return 0 === e && !t.ctrlKey;\n }, e.prototype._move = function (t, e) {\n return {\n around: e,\n panDelta: e.sub(t)\n };\n }, e;\n }(Go),\n Xo = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._correctButton = function (t, e) {\n return 0 === e && t.ctrlKey || 2 === e;\n }, e.prototype._move = function (t, e) {\n var i = .8 * (e.x - t.x);\n if (i) return this._active = !0, {\n bearingDelta: i\n };\n }, e.prototype.contextmenu = function (t) {\n t.preventDefault();\n }, e;\n }(Go),\n Ho = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._correctButton = function (t, e) {\n return 0 === e && t.ctrlKey || 2 === e;\n }, e.prototype._move = function (t, e) {\n var i = -.5 * (e.y - t.y);\n if (i) return this._active = !0, {\n pitchDelta: i\n };\n }, e.prototype.contextmenu = function (t) {\n t.preventDefault();\n }, e;\n }(Go),\n Ko = function Ko(t) {\n this._minTouches = 1, this._clickTolerance = t.clickTolerance || 1, this.reset();\n };\n\n Ko.prototype.reset = function () {\n this._active = !1, this._touches = {}, this._sum = new t.Point(0, 0);\n }, Ko.prototype.touchstart = function (t, e, i) {\n return this._calculateTransform(t, e, i);\n }, Ko.prototype.touchmove = function (t, e, i) {\n if (this._active && !(i.length < this._minTouches)) return t.preventDefault(), this._calculateTransform(t, e, i);\n }, Ko.prototype.touchend = function (t, e, i) {\n this._calculateTransform(t, e, i), this._active && i.length < this._minTouches && this.reset();\n }, Ko.prototype.touchcancel = function () {\n this.reset();\n }, Ko.prototype._calculateTransform = function (e, i, o) {\n o.length > 0 && (this._active = !0);\n var r = No(o, i),\n a = new t.Point(0, 0),\n n = new t.Point(0, 0),\n s = 0;\n\n for (var l in r) {\n var c = r[l],\n u = this._touches[l];\n u && (a._add(c), n._add(c.sub(u)), s++, r[l] = c);\n }\n\n if (this._touches = r, !(s < this._minTouches) && n.mag()) {\n var h = n.div(s);\n if (this._sum._add(h), !(this._sum.mag() < this._clickTolerance)) return {\n around: a.div(s),\n panDelta: h\n };\n }\n }, Ko.prototype.enable = function () {\n this._enabled = !0;\n }, Ko.prototype.disable = function () {\n this._enabled = !1, this.reset();\n }, Ko.prototype.isEnabled = function () {\n return this._enabled;\n }, Ko.prototype.isActive = function () {\n return this._active;\n };\n\n var Yo = function Yo() {\n this.reset();\n };\n\n function Jo(t, e, i) {\n for (var o = 0; o < t.length; o++) {\n if (t[o].identifier === i) return e[o];\n }\n }\n\n function Qo(t, e) {\n return Math.log(t / e) / Math.LN2;\n }\n\n Yo.prototype.reset = function () {\n this._active = !1, delete this._firstTwoTouches;\n }, Yo.prototype._start = function (t) {}, Yo.prototype._move = function (t, e, i) {\n return {};\n }, Yo.prototype.touchstart = function (t, e, i) {\n this._firstTwoTouches || i.length < 2 || (this._firstTwoTouches = [i[0].identifier, i[1].identifier], this._start([e[0], e[1]]));\n }, Yo.prototype.touchmove = function (t, e, i) {\n if (this._firstTwoTouches) {\n t.preventDefault();\n var o = this._firstTwoTouches,\n r = o[1],\n a = Jo(i, e, o[0]),\n n = Jo(i, e, r);\n\n if (a && n) {\n var s = this._aroundCenter ? null : a.add(n).div(2);\n return this._move([a, n], s, t);\n }\n }\n }, Yo.prototype.touchend = function (t, e, o) {\n if (this._firstTwoTouches) {\n var r = this._firstTwoTouches,\n a = r[1],\n n = Jo(o, e, r[0]),\n s = Jo(o, e, a);\n n && s || (this._active && i.suppressClick(), this.reset());\n }\n }, Yo.prototype.touchcancel = function () {\n this.reset();\n }, Yo.prototype.enable = function (t) {\n this._enabled = !0, this._aroundCenter = !!t && "center" === t.around;\n }, Yo.prototype.disable = function () {\n this._enabled = !1, this.reset();\n }, Yo.prototype.isEnabled = function () {\n return this._enabled;\n }, Yo.prototype.isActive = function () {\n return this._active;\n };\n\n var $o = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.reset = function () {\n t.prototype.reset.call(this), delete this._distance, delete this._startDistance;\n }, e.prototype._start = function (t) {\n this._startDistance = this._distance = t[0].dist(t[1]);\n }, e.prototype._move = function (t, e) {\n var i = this._distance;\n if (this._distance = t[0].dist(t[1]), this._active || !(Math.abs(Qo(this._distance, this._startDistance)) < .1)) return this._active = !0, {\n zoomDelta: Qo(this._distance, i),\n pinchAround: e\n };\n }, e;\n }(Yo);\n\n function tr(t, e) {\n return 180 * t.angleWith(e) / Math.PI;\n }\n\n var er = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.reset = function () {\n t.prototype.reset.call(this), delete this._minDiameter, delete this._startVector, delete this._vector;\n }, e.prototype._start = function (t) {\n this._startVector = this._vector = t[0].sub(t[1]), this._minDiameter = t[0].dist(t[1]);\n }, e.prototype._move = function (t, e) {\n var i = this._vector;\n if (this._vector = t[0].sub(t[1]), this._active || !this._isBelowThreshold(this._vector)) return this._active = !0, {\n bearingDelta: tr(this._vector, i),\n pinchAround: e\n };\n }, e.prototype._isBelowThreshold = function (t) {\n this._minDiameter = Math.min(this._minDiameter, t.mag());\n var e = 25 / (Math.PI * this._minDiameter) * 360,\n i = tr(t, this._startVector);\n return Math.abs(i) < e;\n }, e;\n }(Yo);\n\n function ir(t) {\n return Math.abs(t.y) > Math.abs(t.x);\n }\n\n var or = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.reset = function () {\n t.prototype.reset.call(this), this._valid = void 0, delete this._firstMove, delete this._lastPoints;\n }, e.prototype._start = function (t) {\n this._lastPoints = t, ir(t[0].sub(t[1])) && (this._valid = !1);\n }, e.prototype._move = function (t, e, i) {\n var o = t[0].sub(this._lastPoints[0]),\n r = t[1].sub(this._lastPoints[1]);\n if (this._valid = this.gestureBeginsVertically(o, r, i.timeStamp), this._valid) return this._lastPoints = t, this._active = !0, {\n pitchDelta: (o.y + r.y) / 2 * -.5\n };\n }, e.prototype.gestureBeginsVertically = function (t, e, i) {\n if (void 0 !== this._valid) return this._valid;\n var o = t.mag() >= 2,\n r = e.mag() >= 2;\n\n if (o || r) {\n if (!o || !r) return void 0 === this._firstMove && (this._firstMove = i), i - this._firstMove < 100 && void 0;\n var a = t.y > 0 == e.y > 0;\n return ir(t) && ir(e) && a;\n }\n }, e;\n }(Yo),\n rr = {\n panStep: 100,\n bearingStep: 15,\n pitchStep: 10\n },\n ar = function ar() {\n var t = rr;\n this._panStep = t.panStep, this._bearingStep = t.bearingStep, this._pitchStep = t.pitchStep, this._rotationDisabled = !1;\n };\n\n function nr(t) {\n return t * (2 - t);\n }\n\n ar.prototype.reset = function () {\n this._active = !1;\n }, ar.prototype.keydown = function (t) {\n var e = this;\n\n if (!(t.altKey || t.ctrlKey || t.metaKey)) {\n var i = 0,\n o = 0,\n r = 0,\n a = 0,\n n = 0;\n\n switch (t.keyCode) {\n case 61:\n case 107:\n case 171:\n case 187:\n i = 1;\n break;\n\n case 189:\n case 109:\n case 173:\n i = -1;\n break;\n\n case 37:\n t.shiftKey ? o = -1 : (t.preventDefault(), a = -1);\n break;\n\n case 39:\n t.shiftKey ? o = 1 : (t.preventDefault(), a = 1);\n break;\n\n case 38:\n t.shiftKey ? r = 1 : (t.preventDefault(), n = -1);\n break;\n\n case 40:\n t.shiftKey ? r = -1 : (t.preventDefault(), n = 1);\n break;\n\n default:\n return;\n }\n\n return this._rotationDisabled && (o = 0, r = 0), {\n cameraAnimation: function cameraAnimation(s) {\n var l = s.getZoom();\n s.easeTo({\n duration: 300,\n easeId: "keyboardHandler",\n easing: nr,\n zoom: i ? Math.round(l) + i * (t.shiftKey ? 2 : 1) : l,\n bearing: s.getBearing() + o * e._bearingStep,\n pitch: s.getPitch() + r * e._pitchStep,\n offset: [-a * e._panStep, -n * e._panStep],\n center: s.getCenter()\n }, {\n originalEvent: t\n });\n }\n };\n }\n }, ar.prototype.enable = function () {\n this._enabled = !0;\n }, ar.prototype.disable = function () {\n this._enabled = !1, this.reset();\n }, ar.prototype.isEnabled = function () {\n return this._enabled;\n }, ar.prototype.isActive = function () {\n return this._active;\n }, ar.prototype.disableRotation = function () {\n this._rotationDisabled = !0;\n }, ar.prototype.enableRotation = function () {\n this._rotationDisabled = !1;\n };\n\n var sr = function sr(e, i) {\n this._map = e, this._el = e.getCanvasContainer(), this._handler = i, this._delta = 0, this._defaultZoomRate = .01, this._wheelZoomRate = 1 / 450, t.bindAll(["_onTimeout"], this);\n };\n\n sr.prototype.setZoomRate = function (t) {\n this._defaultZoomRate = t;\n }, sr.prototype.setWheelZoomRate = function (t) {\n this._wheelZoomRate = t;\n }, sr.prototype.isEnabled = function () {\n return !!this._enabled;\n }, sr.prototype.isActive = function () {\n return !!this._active || void 0 !== this._finishTimeout;\n }, sr.prototype.isZooming = function () {\n return !!this._zooming;\n }, sr.prototype.enable = function (t) {\n this.isEnabled() || (this._enabled = !0, this._aroundCenter = t && "center" === t.around);\n }, sr.prototype.disable = function () {\n this.isEnabled() && (this._enabled = !1);\n }, sr.prototype.wheel = function (e) {\n if (this.isEnabled()) {\n var i = e.deltaMode === t.window.WheelEvent.DOM_DELTA_LINE ? 40 * e.deltaY : e.deltaY,\n o = t.browser.now(),\n r = o - (this._lastWheelEventTime || 0);\n this._lastWheelEventTime = o, 0 !== i && i % 4.000244140625 == 0 ? this._type = "wheel" : 0 !== i && Math.abs(i) < 4 ? this._type = "trackpad" : r > 400 ? (this._type = null, this._lastValue = i, this._timeout = setTimeout(this._onTimeout, 40, e)) : this._type || (this._type = Math.abs(r * i) < 200 ? "trackpad" : "wheel", this._timeout && (clearTimeout(this._timeout), this._timeout = null, i += this._lastValue)), e.shiftKey && i && (i /= 4), this._type && (this._lastWheelEvent = e, this._delta -= i, this._active || this._start(e)), e.preventDefault();\n }\n }, sr.prototype._onTimeout = function (t) {\n this._type = "wheel", this._delta -= this._lastValue, this._active || this._start(t);\n }, sr.prototype._start = function (e) {\n if (this._delta) {\n this._frameId && (this._frameId = null), this._active = !0, this.isZooming() || (this._zooming = !0), this._finishTimeout && (clearTimeout(this._finishTimeout), delete this._finishTimeout);\n var o = i.mousePos(this._el, e);\n this._around = t.LngLat.convert(this._aroundCenter ? this._map.getCenter() : this._map.unproject(o)), this._aroundPoint = this._map.transform.locationPoint(this._around), this._frameId || (this._frameId = !0, this._handler._triggerRenderFrame());\n }\n }, sr.prototype.renderFrame = function () {\n var e = this;\n\n if (this._frameId && (this._frameId = null, this.isActive())) {\n var i = this._map.transform;\n\n if (0 !== this._delta) {\n var o = "wheel" === this._type && Math.abs(this._delta) > 4.000244140625 ? this._wheelZoomRate : this._defaultZoomRate,\n r = 2 / (1 + Math.exp(-Math.abs(this._delta * o)));\n this._delta < 0 && 0 !== r && (r = 1 / r);\n var a = "number" == typeof this._targetZoom ? i.zoomScale(this._targetZoom) : i.scale;\n this._targetZoom = Math.min(i.maxZoom, Math.max(i.minZoom, i.scaleZoom(a * r))), "wheel" === this._type && (this._startZoom = i.zoom, this._easing = this._smoothOutEasing(200)), this._delta = 0;\n }\n\n var n,\n s = "number" == typeof this._targetZoom ? this._targetZoom : i.zoom,\n l = this._startZoom,\n c = this._easing,\n u = !1;\n\n if ("wheel" === this._type && l && c) {\n var h = Math.min((t.browser.now() - this._lastWheelEventTime) / 200, 1),\n p = c(h);\n n = t.number(l, s, p), h < 1 ? this._frameId || (this._frameId = !0) : u = !0;\n } else n = s, u = !0;\n\n return this._active = !0, u && (this._active = !1, this._finishTimeout = setTimeout(function () {\n e._zooming = !1, e._handler._triggerRenderFrame(), delete e._targetZoom, delete e._finishTimeout;\n }, 200)), {\n noInertia: !0,\n needsRenderFrame: !u,\n zoomDelta: n - i.zoom,\n around: this._aroundPoint,\n originalEvent: this._lastWheelEvent\n };\n }\n }, sr.prototype._smoothOutEasing = function (e) {\n var i = t.ease;\n\n if (this._prevEase) {\n var o = this._prevEase,\n r = (t.browser.now() - o.start) / o.duration,\n a = o.easing(r + .01) - o.easing(r),\n n = .27 / Math.sqrt(a * a + 1e-4) * .01,\n s = Math.sqrt(.0729 - n * n);\n i = t.bezier(n, s, .25, 1);\n }\n\n return this._prevEase = {\n start: t.browser.now(),\n duration: e,\n easing: i\n }, i;\n }, sr.prototype.reset = function () {\n this._active = !1;\n };\n\n var lr = function lr(t, e) {\n this._clickZoom = t, this._tapZoom = e;\n };\n\n lr.prototype.enable = function () {\n this._clickZoom.enable(), this._tapZoom.enable();\n }, lr.prototype.disable = function () {\n this._clickZoom.disable(), this._tapZoom.disable();\n }, lr.prototype.isEnabled = function () {\n return this._clickZoom.isEnabled() && this._tapZoom.isEnabled();\n }, lr.prototype.isActive = function () {\n return this._clickZoom.isActive() || this._tapZoom.isActive();\n };\n\n var cr = function cr() {\n this.reset();\n };\n\n cr.prototype.reset = function () {\n this._active = !1;\n }, cr.prototype.dblclick = function (t, e) {\n return t.preventDefault(), {\n cameraAnimation: function cameraAnimation(i) {\n i.easeTo({\n duration: 300,\n zoom: i.getZoom() + (t.shiftKey ? -1 : 1),\n around: i.unproject(e)\n }, {\n originalEvent: t\n });\n }\n };\n }, cr.prototype.enable = function () {\n this._enabled = !0;\n }, cr.prototype.disable = function () {\n this._enabled = !1, this.reset();\n }, cr.prototype.isEnabled = function () {\n return this._enabled;\n }, cr.prototype.isActive = function () {\n return this._active;\n };\n\n var ur = function ur() {\n this._tap = new qo({\n numTouches: 1,\n numTaps: 1\n }), this.reset();\n };\n\n ur.prototype.reset = function () {\n this._active = !1, delete this._swipePoint, delete this._swipeTouch, delete this._tapTime, this._tap.reset();\n }, ur.prototype.touchstart = function (t, e, i) {\n this._swipePoint || (this._tapTime && t.timeStamp - this._tapTime > 500 && this.reset(), this._tapTime ? i.length > 0 && (this._swipePoint = e[0], this._swipeTouch = i[0].identifier) : this._tap.touchstart(t, e, i));\n }, ur.prototype.touchmove = function (t, e, i) {\n if (this._tapTime) {\n if (this._swipePoint) {\n if (i[0].identifier !== this._swipeTouch) return;\n var o = e[0],\n r = o.y - this._swipePoint.y;\n return this._swipePoint = o, t.preventDefault(), this._active = !0, {\n zoomDelta: r / 128\n };\n }\n } else this._tap.touchmove(t, e, i);\n }, ur.prototype.touchend = function (t, e, i) {\n this._tapTime ? this._swipePoint && 0 === i.length && this.reset() : this._tap.touchend(t, e, i) && (this._tapTime = t.timeStamp);\n }, ur.prototype.touchcancel = function () {\n this.reset();\n }, ur.prototype.enable = function () {\n this._enabled = !0;\n }, ur.prototype.disable = function () {\n this._enabled = !1, this.reset();\n }, ur.prototype.isEnabled = function () {\n return this._enabled;\n }, ur.prototype.isActive = function () {\n return this._active;\n };\n\n var hr = function hr(t, e, i) {\n this._el = t, this._mousePan = e, this._touchPan = i;\n };\n\n hr.prototype.enable = function (t) {\n this._inertiaOptions = t || {}, this._mousePan.enable(), this._touchPan.enable(), this._el.classList.add("mapboxgl-touch-drag-pan");\n }, hr.prototype.disable = function () {\n this._mousePan.disable(), this._touchPan.disable(), this._el.classList.remove("mapboxgl-touch-drag-pan");\n }, hr.prototype.isEnabled = function () {\n return this._mousePan.isEnabled() && this._touchPan.isEnabled();\n }, hr.prototype.isActive = function () {\n return this._mousePan.isActive() || this._touchPan.isActive();\n };\n\n var pr = function pr(t, e, i) {\n this._pitchWithRotate = t.pitchWithRotate, this._mouseRotate = e, this._mousePitch = i;\n };\n\n pr.prototype.enable = function () {\n this._mouseRotate.enable(), this._pitchWithRotate && this._mousePitch.enable();\n }, pr.prototype.disable = function () {\n this._mouseRotate.disable(), this._mousePitch.disable();\n }, pr.prototype.isEnabled = function () {\n return this._mouseRotate.isEnabled() && (!this._pitchWithRotate || this._mousePitch.isEnabled());\n }, pr.prototype.isActive = function () {\n return this._mouseRotate.isActive() || this._mousePitch.isActive();\n };\n\n var dr = function dr(t, e, i, o) {\n this._el = t, this._touchZoom = e, this._touchRotate = i, this._tapDragZoom = o, this._rotationDisabled = !1, this._enabled = !0;\n };\n\n dr.prototype.enable = function (t) {\n this._touchZoom.enable(t), this._rotationDisabled || this._touchRotate.enable(t), this._tapDragZoom.enable(), this._el.classList.add("mapboxgl-touch-zoom-rotate");\n }, dr.prototype.disable = function () {\n this._touchZoom.disable(), this._touchRotate.disable(), this._tapDragZoom.disable(), this._el.classList.remove("mapboxgl-touch-zoom-rotate");\n }, dr.prototype.isEnabled = function () {\n return this._touchZoom.isEnabled() && (this._rotationDisabled || this._touchRotate.isEnabled()) && this._tapDragZoom.isEnabled();\n }, dr.prototype.isActive = function () {\n return this._touchZoom.isActive() || this._touchRotate.isActive() || this._tapDragZoom.isActive();\n }, dr.prototype.disableRotation = function () {\n this._rotationDisabled = !0, this._touchRotate.disable();\n }, dr.prototype.enableRotation = function () {\n this._rotationDisabled = !1, this._touchZoom.isEnabled() && this._touchRotate.enable();\n };\n\n var _r = function _r(t) {\n return t.zoom || t.drag || t.pitch || t.rotate;\n },\n fr = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e;\n }(t.Event);\n\n function mr(t) {\n return t.panDelta && t.panDelta.mag() || t.zoomDelta || t.bearingDelta || t.pitchDelta;\n }\n\n var gr = function gr(e, o) {\n this._map = e, this._el = this._map.getCanvasContainer(), this._handlers = [], this._handlersById = {}, this._changes = [], this._inertia = new Ao(e), this._bearingSnap = o.bearingSnap, this._previousActiveHandlers = {}, this._eventsInProgress = {}, this._addDefaultHandlers(o), t.bindAll(["handleEvent", "handleWindowEvent"], this);\n var r = this._el;\n this._listeners = [[r, "touchstart", {\n passive: !0\n }], [r, "touchmove", {\n passive: !1\n }], [r, "touchend", void 0], [r, "touchcancel", void 0], [r, "mousedown", void 0], [r, "mousemove", void 0], [r, "mouseup", void 0], [t.window.document, "mousemove", {\n capture: !0\n }], [t.window.document, "mouseup", void 0], [r, "mouseover", void 0], [r, "mouseout", void 0], [r, "dblclick", void 0], [r, "click", void 0], [r, "keydown", {\n capture: !1\n }], [r, "keyup", void 0], [r, "wheel", {\n passive: !1\n }], [r, "contextmenu", void 0], [t.window, "blur", void 0]];\n\n for (var a = 0, n = this._listeners; a < n.length; a += 1) {\n var s = n[a],\n l = s[0];\n i.addEventListener(l, s[1], l === t.window.document ? this.handleWindowEvent : this.handleEvent, s[2]);\n }\n };\n\n gr.prototype.destroy = function () {\n for (var e = 0, o = this._listeners; e < o.length; e += 1) {\n var r = o[e],\n a = r[0];\n i.removeEventListener(a, r[1], a === t.window.document ? this.handleWindowEvent : this.handleEvent, r[2]);\n }\n }, gr.prototype._addDefaultHandlers = function (t) {\n var e = this._map,\n i = e.getCanvasContainer();\n\n this._add("mapEvent", new Oo(e, t));\n\n var o = e.boxZoom = new Uo(e, t);\n\n this._add("boxZoom", o);\n\n var r = new jo(),\n a = new cr();\n e.doubleClickZoom = new lr(a, r), this._add("tapZoom", r), this._add("clickZoom", a);\n var n = new ur();\n\n this._add("tapDragZoom", n);\n\n var s = e.touchPitch = new or();\n\n this._add("touchPitch", s);\n\n var l = new Xo(t),\n c = new Ho(t);\n e.dragRotate = new pr(t, l, c), this._add("mouseRotate", l, ["mousePitch"]), this._add("mousePitch", c, ["mouseRotate"]);\n var u = new Wo(t),\n h = new Ko(t);\n e.dragPan = new hr(i, u, h), this._add("mousePan", u), this._add("touchPan", h, ["touchZoom", "touchRotate"]);\n var p = new er(),\n d = new $o();\n e.touchZoomRotate = new dr(i, d, p, n), this._add("touchRotate", p, ["touchPan", "touchZoom"]), this._add("touchZoom", d, ["touchPan", "touchRotate"]);\n\n var _ = e.scrollZoom = new sr(e, this);\n\n this._add("scrollZoom", _, ["mousePan"]);\n\n var f = e.keyboard = new ar();\n this._add("keyboard", f), this._add("blockableMapEvent", new Fo(e));\n\n for (var m = 0, g = ["boxZoom", "doubleClickZoom", "tapDragZoom", "touchPitch", "dragRotate", "dragPan", "touchZoomRotate", "scrollZoom", "keyboard"]; m < g.length; m += 1) {\n var v = g[m];\n t.interactive && t[v] && e[v].enable(t[v]);\n }\n }, gr.prototype._add = function (t, e, i) {\n this._handlers.push({\n handlerName: t,\n handler: e,\n allowed: i\n }), this._handlersById[t] = e;\n }, gr.prototype.stop = function (t) {\n if (!this._updatingCamera) {\n for (var e = 0, i = this._handlers; e < i.length; e += 1) {\n i[e].handler.reset();\n }\n\n this._inertia.clear(), this._fireEvents({}, {}, t), this._changes = [];\n }\n }, gr.prototype.isActive = function () {\n for (var t = 0, e = this._handlers; t < e.length; t += 1) {\n if (e[t].handler.isActive()) return !0;\n }\n\n return !1;\n }, gr.prototype.isZooming = function () {\n return !!this._eventsInProgress.zoom || this._map.scrollZoom.isZooming();\n }, gr.prototype.isRotating = function () {\n return !!this._eventsInProgress.rotate;\n }, gr.prototype.isMoving = function () {\n return Boolean(_r(this._eventsInProgress)) || this.isZooming();\n }, gr.prototype._blockedByActive = function (t, e, i) {\n for (var o in t) {\n if (o !== i && (!e || e.indexOf(o) < 0)) return !0;\n }\n\n return !1;\n }, gr.prototype.handleWindowEvent = function (t) {\n this.handleEvent(t, t.type + "Window");\n }, gr.prototype._getMapTouches = function (t) {\n for (var e = [], i = 0, o = t; i < o.length; i += 1) {\n var r = o[i];\n this._el.contains(r.target) && e.push(r);\n }\n\n return e;\n }, gr.prototype.handleEvent = function (t, e) {\n if ("blur" !== t.type) {\n this._updatingCamera = !0;\n\n for (var o = "renderFrame" === t.type ? void 0 : t, r = {\n needsRenderFrame: !1\n }, a = {}, n = {}, s = t.touches ? this._getMapTouches(t.touches) : void 0, l = s ? i.touchPos(this._el, s) : i.mousePos(this._el, t), c = 0, u = this._handlers; c < u.length; c += 1) {\n var h = u[c],\n p = h.handlerName,\n d = h.handler,\n _ = h.allowed;\n\n if (d.isEnabled()) {\n var f = void 0;\n this._blockedByActive(n, _, p) ? d.reset() : d[e || t.type] && (f = d[e || t.type](t, l, s), this.mergeHandlerResult(r, a, f, p, o), f && f.needsRenderFrame && this._triggerRenderFrame()), (f || d.isActive()) && (n[p] = d);\n }\n }\n\n var m = {};\n\n for (var g in this._previousActiveHandlers) {\n n[g] || (m[g] = o);\n }\n\n this._previousActiveHandlers = n, (Object.keys(m).length || mr(r)) && (this._changes.push([r, a, m]), this._triggerRenderFrame()), (Object.keys(n).length || mr(r)) && this._map._stop(!0), this._updatingCamera = !1;\n var v = r.cameraAnimation;\n v && (this._inertia.clear(), this._fireEvents({}, {}, !0), this._changes = [], v(this._map));\n } else this.stop(!0);\n }, gr.prototype.mergeHandlerResult = function (e, i, o, r, a) {\n if (o) {\n t.extend(e, o);\n var n = {\n handlerName: r,\n originalEvent: o.originalEvent || a\n };\n void 0 !== o.zoomDelta && (i.zoom = n), void 0 !== o.panDelta && (i.drag = n), void 0 !== o.pitchDelta && (i.pitch = n), void 0 !== o.bearingDelta && (i.rotate = n);\n }\n }, gr.prototype._applyChanges = function () {\n for (var e = {}, i = {}, o = {}, r = 0, a = this._changes; r < a.length; r += 1) {\n var n = a[r],\n s = n[0],\n l = n[1],\n c = n[2];\n s.panDelta && (e.panDelta = (e.panDelta || new t.Point(0, 0))._add(s.panDelta)), s.zoomDelta && (e.zoomDelta = (e.zoomDelta || 0) + s.zoomDelta), s.bearingDelta && (e.bearingDelta = (e.bearingDelta || 0) + s.bearingDelta), s.pitchDelta && (e.pitchDelta = (e.pitchDelta || 0) + s.pitchDelta), void 0 !== s.around && (e.around = s.around), void 0 !== s.pinchAround && (e.pinchAround = s.pinchAround), s.noInertia && (e.noInertia = s.noInertia), t.extend(i, l), t.extend(o, c);\n }\n\n this._updateMapTransform(e, i, o), this._changes = [];\n }, gr.prototype._updateMapTransform = function (t, e, i) {\n var o = this._map,\n r = o.transform;\n if (!mr(t)) return this._fireEvents(e, i, !0);\n var a = t.panDelta,\n n = t.zoomDelta,\n s = t.bearingDelta,\n l = t.pitchDelta,\n c = t.around,\n u = t.pinchAround;\n void 0 !== u && (c = u), o._stop(!0), c = c || o.transform.centerPoint;\n var h = r.pointLocation(a ? c.sub(a) : c);\n s && (r.bearing += s), l && (r.pitch += l), n && (r.zoom += n), r.setLocationAtPoint(h, c), this._map._update(), t.noInertia || this._inertia.record(t), this._fireEvents(e, i, !0);\n }, gr.prototype._fireEvents = function (e, i, o) {\n var r = this,\n a = _r(this._eventsInProgress),\n n = _r(e),\n s = {};\n\n for (var l in e) {\n this._eventsInProgress[l] || (s[l + "start"] = e[l].originalEvent), this._eventsInProgress[l] = e[l];\n }\n\n for (var c in !a && n && this._fireEvent("movestart", n.originalEvent), s) {\n this._fireEvent(c, s[c]);\n }\n\n for (var u in n && this._fireEvent("move", n.originalEvent), e) {\n this._fireEvent(u, e[u].originalEvent);\n }\n\n var h,\n p = {};\n\n for (var d in this._eventsInProgress) {\n var _ = this._eventsInProgress[d],\n f = _.handlerName,\n m = _.originalEvent;\n this._handlersById[f].isActive() || (delete this._eventsInProgress[d], p[d + "end"] = h = i[f] || m);\n }\n\n for (var g in p) {\n this._fireEvent(g, p[g]);\n }\n\n var v = _r(this._eventsInProgress);\n\n if (o && (a || n) && !v) {\n this._updatingCamera = !0;\n\n var y = this._inertia._onMoveEnd(this._map.dragPan._inertiaOptions),\n x = function x(t) {\n return 0 !== t && -r._bearingSnap < t && t < r._bearingSnap;\n };\n\n y ? (x(y.bearing || this._map.getBearing()) && (y.bearing = 0), this._map.easeTo(y, {\n originalEvent: h\n })) : (this._map.fire(new t.Event("moveend", {\n originalEvent: h\n })), x(this._map.getBearing()) && this._map.resetNorth()), this._updatingCamera = !1;\n }\n }, gr.prototype._fireEvent = function (e, i) {\n this._map.fire(new t.Event(e, i ? {\n originalEvent: i\n } : {}));\n }, gr.prototype._requestFrame = function () {\n var t = this;\n return this._map.triggerRepaint(), this._map._renderTaskQueue.add(function (e) {\n delete t._frameId, t.handleEvent(new fr("renderFrame", {\n timeStamp: e\n })), t._applyChanges();\n });\n }, gr.prototype._triggerRenderFrame = function () {\n void 0 === this._frameId && (this._frameId = this._requestFrame());\n };\n\n var vr = function (e) {\n function i(i, o) {\n e.call(this), this._moving = !1, this._zooming = !1, this.transform = i, this._bearingSnap = o.bearingSnap, t.bindAll(["_renderFrameCallback"], this);\n }\n\n return e && (i.__proto__ = e), (i.prototype = Object.create(e && e.prototype)).constructor = i, i.prototype.getCenter = function () {\n return new t.LngLat(this.transform.center.lng, this.transform.center.lat);\n }, i.prototype.setCenter = function (t, e) {\n return this.jumpTo({\n center: t\n }, e);\n }, i.prototype.panBy = function (e, i, o) {\n return e = t.Point.convert(e).mult(-1), this.panTo(this.transform.center, t.extend({\n offset: e\n }, i), o);\n }, i.prototype.panTo = function (e, i, o) {\n return this.easeTo(t.extend({\n center: e\n }, i), o);\n }, i.prototype.getZoom = function () {\n return this.transform.zoom;\n }, i.prototype.setZoom = function (t, e) {\n return this.jumpTo({\n zoom: t\n }, e), this;\n }, i.prototype.zoomTo = function (e, i, o) {\n return this.easeTo(t.extend({\n zoom: e\n }, i), o);\n }, i.prototype.zoomIn = function (t, e) {\n return this.zoomTo(this.getZoom() + 1, t, e), this;\n }, i.prototype.zoomOut = function (t, e) {\n return this.zoomTo(this.getZoom() - 1, t, e), this;\n }, i.prototype.getBearing = function () {\n return this.transform.bearing;\n }, i.prototype.setBearing = function (t, e) {\n return this.jumpTo({\n bearing: t\n }, e), this;\n }, i.prototype.getPadding = function () {\n return this.transform.padding;\n }, i.prototype.setPadding = function (t, e) {\n return this.jumpTo({\n padding: t\n }, e), this;\n }, i.prototype.rotateTo = function (e, i, o) {\n return this.easeTo(t.extend({\n bearing: e\n }, i), o);\n }, i.prototype.resetNorth = function (e, i) {\n return this.rotateTo(0, t.extend({\n duration: 1e3\n }, e), i), this;\n }, i.prototype.resetNorthPitch = function (e, i) {\n return this.easeTo(t.extend({\n bearing: 0,\n pitch: 0,\n duration: 1e3\n }, e), i), this;\n }, i.prototype.snapToNorth = function (t, e) {\n return Math.abs(this.getBearing()) < this._bearingSnap ? this.resetNorth(t, e) : this;\n }, i.prototype.getPitch = function () {\n return this.transform.pitch;\n }, i.prototype.setPitch = function (t, e) {\n return this.jumpTo({\n pitch: t\n }, e), this;\n }, i.prototype.cameraForBounds = function (e, i) {\n e = t.LngLatBounds.convert(e);\n var o = i && i.bearing || 0;\n return this._cameraForBoxAndBearing(e.getNorthWest(), e.getSouthEast(), o, i);\n }, i.prototype._cameraForBoxAndBearing = function (e, i, o, r) {\n var a = {\n top: 0,\n bottom: 0,\n right: 0,\n left: 0\n };\n\n if ("number" == typeof (r = t.extend({\n padding: a,\n offset: [0, 0],\n maxZoom: this.transform.maxZoom\n }, r)).padding) {\n var n = r.padding;\n r.padding = {\n top: n,\n bottom: n,\n right: n,\n left: n\n };\n }\n\n r.padding = t.extend(a, r.padding);\n\n var s = this.transform,\n l = s.padding,\n c = s.project(t.LngLat.convert(e)),\n u = s.project(t.LngLat.convert(i)),\n h = c.rotate(-o * Math.PI / 180),\n p = u.rotate(-o * Math.PI / 180),\n d = new t.Point(Math.max(h.x, p.x), Math.max(h.y, p.y)),\n _ = new t.Point(Math.min(h.x, p.x), Math.min(h.y, p.y)),\n f = d.sub(_),\n m = (s.width - (l.left + l.right + r.padding.left + r.padding.right)) / f.x,\n g = (s.height - (l.top + l.bottom + r.padding.top + r.padding.bottom)) / f.y;\n\n if (!(g < 0 || m < 0)) {\n var v = Math.min(s.scaleZoom(s.scale * Math.min(m, g)), r.maxZoom),\n y = "number" == typeof r.offset.x ? new t.Point(r.offset.x, r.offset.y) : t.Point.convert(r.offset),\n x = new t.Point((r.padding.left - r.padding.right) / 2, (r.padding.top - r.padding.bottom) / 2).rotate(o * Math.PI / 180),\n b = y.add(x).mult(s.scale / s.zoomScale(v));\n return {\n center: s.unproject(c.add(u).div(2).sub(b)),\n zoom: v,\n bearing: o\n };\n }\n\n t.warnOnce("Map cannot fit within canvas with the given bounds, padding, and/or offset.");\n }, i.prototype.fitBounds = function (t, e, i) {\n return this._fitInternal(this.cameraForBounds(t, e), e, i);\n }, i.prototype.fitScreenCoordinates = function (e, i, o, r, a) {\n return this._fitInternal(this._cameraForBoxAndBearing(this.transform.pointLocation(t.Point.convert(e)), this.transform.pointLocation(t.Point.convert(i)), o, r), r, a);\n }, i.prototype._fitInternal = function (e, i, o) {\n return e ? (delete (i = t.extend(e, i)).padding, i.linear ? this.easeTo(i, o) : this.flyTo(i, o)) : this;\n }, i.prototype.jumpTo = function (e, i) {\n this.stop();\n var o = this.transform,\n r = !1,\n a = !1,\n n = !1;\n return "zoom" in e && o.zoom !== +e.zoom && (r = !0, o.zoom = +e.zoom), void 0 !== e.center && (o.center = t.LngLat.convert(e.center)), "bearing" in e && o.bearing !== +e.bearing && (a = !0, o.bearing = +e.bearing), "pitch" in e && o.pitch !== +e.pitch && (n = !0, o.pitch = +e.pitch), null == e.padding || o.isPaddingEqual(e.padding) || (o.padding = e.padding), this.fire(new t.Event("movestart", i)).fire(new t.Event("move", i)), r && this.fire(new t.Event("zoomstart", i)).fire(new t.Event("zoom", i)).fire(new t.Event("zoomend", i)), a && this.fire(new t.Event("rotatestart", i)).fire(new t.Event("rotate", i)).fire(new t.Event("rotateend", i)), n && this.fire(new t.Event("pitchstart", i)).fire(new t.Event("pitch", i)).fire(new t.Event("pitchend", i)), this.fire(new t.Event("moveend", i));\n }, i.prototype.easeTo = function (e, i) {\n var o = this;\n this._stop(!1, e.easeId), (!1 === (e = t.extend({\n offset: [0, 0],\n duration: 500,\n easing: t.ease\n }, e)).animate || !e.essential && t.browser.prefersReducedMotion) && (e.duration = 0);\n\n var r = this.transform,\n a = this.getZoom(),\n n = this.getBearing(),\n s = this.getPitch(),\n l = this.getPadding(),\n c = "zoom" in e ? +e.zoom : a,\n u = "bearing" in e ? this._normalizeBearing(e.bearing, n) : n,\n h = "pitch" in e ? +e.pitch : s,\n p = "padding" in e ? e.padding : r.padding,\n d = t.Point.convert(e.offset),\n _ = r.centerPoint.add(d),\n f = r.pointLocation(_),\n m = t.LngLat.convert(e.center || f);\n\n this._normalizeCenter(m);\n\n var g,\n v,\n y = r.project(f),\n x = r.project(m).sub(y),\n b = r.zoomScale(c - a);\n e.around && (g = t.LngLat.convert(e.around), v = r.locationPoint(g));\n var w = {\n moving: this._moving,\n zooming: this._zooming,\n rotating: this._rotating,\n pitching: this._pitching\n };\n return this._zooming = this._zooming || c !== a, this._rotating = this._rotating || n !== u, this._pitching = this._pitching || h !== s, this._padding = !r.isPaddingEqual(p), this._easeId = e.easeId, this._prepareEase(i, e.noMoveStart, w), this._ease(function (e) {\n if (o._zooming && (r.zoom = t.number(a, c, e)), o._rotating && (r.bearing = t.number(n, u, e)), o._pitching && (r.pitch = t.number(s, h, e)), o._padding && (r.interpolatePadding(l, p, e), _ = r.centerPoint.add(d)), g) r.setLocationAtPoint(g, v);else {\n var f = r.zoomScale(r.zoom - a),\n m = c > a ? Math.min(2, b) : Math.max(.5, b),\n w = Math.pow(m, 1 - e),\n T = r.unproject(y.add(x.mult(e * w)).mult(f));\n r.setLocationAtPoint(r.renderWorldCopies ? T.wrap() : T, _);\n }\n\n o._fireMoveEvents(i);\n }, function (t) {\n o._afterEase(i, t);\n }, e), this;\n }, i.prototype._prepareEase = function (e, i, o) {\n void 0 === o && (o = {}), this._moving = !0, i || o.moving || this.fire(new t.Event("movestart", e)), this._zooming && !o.zooming && this.fire(new t.Event("zoomstart", e)), this._rotating && !o.rotating && this.fire(new t.Event("rotatestart", e)), this._pitching && !o.pitching && this.fire(new t.Event("pitchstart", e));\n }, i.prototype._fireMoveEvents = function (e) {\n this.fire(new t.Event("move", e)), this._zooming && this.fire(new t.Event("zoom", e)), this._rotating && this.fire(new t.Event("rotate", e)), this._pitching && this.fire(new t.Event("pitch", e));\n }, i.prototype._afterEase = function (e, i) {\n if (!this._easeId || !i || this._easeId !== i) {\n delete this._easeId;\n var o = this._zooming,\n r = this._rotating,\n a = this._pitching;\n this._moving = !1, this._zooming = !1, this._rotating = !1, this._pitching = !1, this._padding = !1, o && this.fire(new t.Event("zoomend", e)), r && this.fire(new t.Event("rotateend", e)), a && this.fire(new t.Event("pitchend", e)), this.fire(new t.Event("moveend", e));\n }\n }, i.prototype.flyTo = function (e, i) {\n var o = this;\n\n if (!e.essential && t.browser.prefersReducedMotion) {\n var r = t.pick(e, ["center", "zoom", "bearing", "pitch", "around"]);\n return this.jumpTo(r, i);\n }\n\n this.stop(), e = t.extend({\n offset: [0, 0],\n speed: 1.2,\n curve: 1.42,\n easing: t.ease\n }, e);\n\n var a = this.transform,\n n = this.getZoom(),\n s = this.getBearing(),\n l = this.getPitch(),\n c = this.getPadding(),\n u = "zoom" in e ? t.clamp(+e.zoom, a.minZoom, a.maxZoom) : n,\n h = "bearing" in e ? this._normalizeBearing(e.bearing, s) : s,\n p = "pitch" in e ? +e.pitch : l,\n d = "padding" in e ? e.padding : a.padding,\n _ = a.zoomScale(u - n),\n f = t.Point.convert(e.offset),\n m = a.centerPoint.add(f),\n g = a.pointLocation(m),\n v = t.LngLat.convert(e.center || g);\n\n this._normalizeCenter(v);\n\n var y = a.project(g),\n x = a.project(v).sub(y),\n b = e.curve,\n w = Math.max(a.width, a.height),\n T = w / _,\n E = x.mag();\n\n if ("minZoom" in e) {\n var I = t.clamp(Math.min(e.minZoom, n, u), a.minZoom, a.maxZoom),\n P = w / a.zoomScale(I - n);\n b = Math.sqrt(P / E * 2);\n }\n\n var S = b * b;\n\n function C(t) {\n var e = (T * T - w * w + (t ? -1 : 1) * S * S * E * E) / (2 * (t ? T : w) * S * E);\n return Math.log(Math.sqrt(e * e + 1) - e);\n }\n\n function z(t) {\n return (Math.exp(t) - Math.exp(-t)) / 2;\n }\n\n function D(t) {\n return (Math.exp(t) + Math.exp(-t)) / 2;\n }\n\n var A = C(0),\n M = function M(t) {\n return D(A) / D(A + b * t);\n },\n L = function L(t) {\n return w * ((D(A) * (z(e = A + b * t) / D(e)) - z(A)) / S) / E;\n var e;\n },\n R = (C(1) - A) / b;\n\n if (Math.abs(E) < 1e-6 || !isFinite(R)) {\n if (Math.abs(w - T) < 1e-6) return this.easeTo(e, i);\n var k = T < w ? -1 : 1;\n R = Math.abs(Math.log(T / w)) / b, L = function L() {\n return 0;\n }, M = function M(t) {\n return Math.exp(k * b * t);\n };\n }\n\n return e.duration = "duration" in e ? +e.duration : 1e3 * R / ("screenSpeed" in e ? +e.screenSpeed / b : +e.speed), e.maxDuration && e.duration > e.maxDuration && (e.duration = 0), this._zooming = !0, this._rotating = s !== h, this._pitching = p !== l, this._padding = !a.isPaddingEqual(d), this._prepareEase(i, !1), this._ease(function (e) {\n var r = e * R,\n _ = 1 / M(r);\n\n a.zoom = 1 === e ? u : n + a.scaleZoom(_), o._rotating && (a.bearing = t.number(s, h, e)), o._pitching && (a.pitch = t.number(l, p, e)), o._padding && (a.interpolatePadding(c, d, e), m = a.centerPoint.add(f));\n var g = 1 === e ? v : a.unproject(y.add(x.mult(L(r))).mult(_));\n a.setLocationAtPoint(a.renderWorldCopies ? g.wrap() : g, m), o._fireMoveEvents(i);\n }, function () {\n return o._afterEase(i);\n }, e), this;\n }, i.prototype.isEasing = function () {\n return !!this._easeFrameId;\n }, i.prototype.stop = function () {\n return this._stop();\n }, i.prototype._stop = function (t, e) {\n if (this._easeFrameId && (this._cancelRenderFrame(this._easeFrameId), delete this._easeFrameId, delete this._onEaseFrame), this._onEaseEnd) {\n var i = this._onEaseEnd;\n delete this._onEaseEnd, i.call(this, e);\n }\n\n if (!t) {\n var o = this.handlers;\n o && o.stop(!1);\n }\n\n return this;\n }, i.prototype._ease = function (e, i, o) {\n !1 === o.animate || 0 === o.duration ? (e(1), i()) : (this._easeStart = t.browser.now(), this._easeOptions = o, this._onEaseFrame = e, this._onEaseEnd = i, this._easeFrameId = this._requestRenderFrame(this._renderFrameCallback));\n }, i.prototype._renderFrameCallback = function () {\n var e = Math.min((t.browser.now() - this._easeStart) / this._easeOptions.duration, 1);\n this._onEaseFrame(this._easeOptions.easing(e)), e < 1 ? this._easeFrameId = this._requestRenderFrame(this._renderFrameCallback) : this.stop();\n }, i.prototype._normalizeBearing = function (e, i) {\n e = t.wrap(e, -180, 180);\n var o = Math.abs(e - i);\n return Math.abs(e - 360 - i) < o && (e -= 360), Math.abs(e + 360 - i) < o && (e += 360), e;\n }, i.prototype._normalizeCenter = function (t) {\n var e = this.transform;\n\n if (e.renderWorldCopies && !e.lngRange) {\n var i = t.lng - e.center.lng;\n t.lng += i > 180 ? -360 : i < -180 ? 360 : 0;\n }\n }, i;\n }(t.Evented),\n yr = function yr(e) {\n void 0 === e && (e = {}), this.options = e, t.bindAll(["_toggleAttribution", "_updateEditLink", "_updateData", "_updateCompact"], this);\n };\n\n yr.prototype.getDefaultPosition = function () {\n return "bottom-right";\n }, yr.prototype.onAdd = function (t) {\n var e = this.options && this.options.compact;\n return this._map = t, this._container = i.create("div", "mapboxgl-ctrl mapboxgl-ctrl-attrib"), this._compactButton = i.create("button", "mapboxgl-ctrl-attrib-button", this._container), this._compactButton.addEventListener("click", this._toggleAttribution), this._setElementTitle(this._compactButton, "ToggleAttribution"), this._innerContainer = i.create("div", "mapboxgl-ctrl-attrib-inner", this._container), this._innerContainer.setAttribute("role", "list"), e && this._container.classList.add("mapboxgl-compact"), this._updateAttributions(), this._updateEditLink(), this._map.on("styledata", this._updateData), this._map.on("sourcedata", this._updateData), this._map.on("moveend", this._updateEditLink), void 0 === e && (this._map.on("resize", this._updateCompact), this._updateCompact()), this._container;\n }, yr.prototype.onRemove = function () {\n i.remove(this._container), this._map.off("styledata", this._updateData), this._map.off("sourcedata", this._updateData), this._map.off("moveend", this._updateEditLink), this._map.off("resize", this._updateCompact), this._map = void 0, this._attribHTML = void 0;\n }, yr.prototype._setElementTitle = function (t, e) {\n var i = this._map._getUIString("AttributionControl." + e);\n\n t.title = i, t.setAttribute("aria-label", i);\n }, yr.prototype._toggleAttribution = function () {\n this._container.classList.contains("mapboxgl-compact-show") ? (this._container.classList.remove("mapboxgl-compact-show"), this._compactButton.setAttribute("aria-pressed", "false")) : (this._container.classList.add("mapboxgl-compact-show"), this._compactButton.setAttribute("aria-pressed", "true"));\n }, yr.prototype._updateEditLink = function () {\n var e = this._editLink;\n e || (e = this._editLink = this._container.querySelector(".mapbox-improve-map"));\n var i = [{\n key: "owner",\n value: this.styleOwner\n }, {\n key: "id",\n value: this.styleId\n }, {\n key: "access_token",\n value: this._map._requestManager._customAccessToken || t.config.ACCESS_TOKEN\n }];\n\n if (e) {\n var o = i.reduce(function (t, e, o) {\n return e.value && (t += e.key + "=" + e.value + (o < i.length - 1 ? "&" : "")), t;\n }, "?");\n e.href = t.config.FEEDBACK_URL + "/" + o + (this._map._hash ? this._map._hash.getHashString(!0) : ""), e.rel = "noopener nofollow", this._setElementTitle(e, "MapFeedback");\n }\n }, yr.prototype._updateData = function (t) {\n !t || "metadata" !== t.sourceDataType && "visibility" !== t.sourceDataType && "style" !== t.dataType || (this._updateAttributions(), this._updateEditLink());\n }, yr.prototype._updateAttributions = function () {\n if (this._map.style) {\n var t = [];\n\n if (this.options.customAttribution && (Array.isArray(this.options.customAttribution) ? t = t.concat(this.options.customAttribution.map(function (t) {\n return "string" != typeof t ? "" : t;\n })) : "string" == typeof this.options.customAttribution && t.push(this.options.customAttribution)), this._map.style.stylesheet) {\n var e = this._map.style.stylesheet;\n this.styleOwner = e.owner, this.styleId = e.id;\n }\n\n var i = this._map.style.sourceCaches;\n\n for (var o in i) {\n var r = i[o];\n\n if (r.used) {\n var a = r.getSource();\n a.attribution && t.indexOf(a.attribution) < 0 && t.push(a.attribution);\n }\n }\n\n t.sort(function (t, e) {\n return t.length - e.length;\n });\n var n = (t = t.filter(function (e, i) {\n for (var o = i + 1; o < t.length; o++) {\n if (t[o].indexOf(e) >= 0) return !1;\n }\n\n return !0;\n })).join(" | ");\n n !== this._attribHTML && (this._attribHTML = n, t.length ? (this._innerContainer.innerHTML = n, this._container.classList.remove("mapboxgl-attrib-empty")) : this._container.classList.add("mapboxgl-attrib-empty"), this._editLink = null);\n }\n }, yr.prototype._updateCompact = function () {\n this._map.getCanvasContainer().offsetWidth <= 640 ? this._container.classList.add("mapboxgl-compact") : this._container.classList.remove("mapboxgl-compact", "mapboxgl-compact-show");\n };\n\n var xr = function xr() {\n t.bindAll(["_updateLogo"], this), t.bindAll(["_updateCompact"], this);\n };\n\n xr.prototype.onAdd = function (t) {\n this._map = t, this._container = i.create("div", "mapboxgl-ctrl");\n var e = i.create("a", "mapboxgl-ctrl-logo");\n return e.target = "_blank", e.rel = "noopener nofollow", e.href = "https://www.mapbox.com/", e.setAttribute("aria-label", this._map._getUIString("LogoControl.Title")), e.setAttribute("rel", "noopener nofollow"), this._container.appendChild(e), this._container.style.display = "none", this._map.on("sourcedata", this._updateLogo), this._updateLogo(), this._map.on("resize", this._updateCompact), this._updateCompact(), this._container;\n }, xr.prototype.onRemove = function () {\n i.remove(this._container), this._map.off("sourcedata", this._updateLogo), this._map.off("resize", this._updateCompact);\n }, xr.prototype.getDefaultPosition = function () {\n return "bottom-left";\n }, xr.prototype._updateLogo = function (t) {\n t && "metadata" !== t.sourceDataType || (this._container.style.display = this._logoRequired() ? "block" : "none");\n }, xr.prototype._logoRequired = function () {\n if (this._map.style) {\n var t = this._map.style.sourceCaches;\n\n for (var e in t) {\n if (t[e].getSource().mapbox_logo) return !0;\n }\n\n return !1;\n }\n }, xr.prototype._updateCompact = function () {\n var t = this._container.children;\n\n if (t.length) {\n var e = t[0];\n this._map.getCanvasContainer().offsetWidth < 250 ? e.classList.add("mapboxgl-compact") : e.classList.remove("mapboxgl-compact");\n }\n };\n\n var br = function br() {\n this._queue = [], this._id = 0, this._cleared = !1, this._currentlyRunning = !1;\n };\n\n br.prototype.add = function (t) {\n var e = ++this._id;\n return this._queue.push({\n callback: t,\n id: e,\n cancelled: !1\n }), e;\n }, br.prototype.remove = function (t) {\n for (var e = this._currentlyRunning, i = 0, o = e ? this._queue.concat(e) : this._queue; i < o.length; i += 1) {\n var r = o[i];\n if (r.id === t) return void (r.cancelled = !0);\n }\n }, br.prototype.run = function (t) {\n void 0 === t && (t = 0);\n var e = this._currentlyRunning = this._queue;\n this._queue = [];\n\n for (var i = 0, o = e; i < o.length; i += 1) {\n var r = o[i];\n if (!r.cancelled && (r.callback(t), this._cleared)) break;\n }\n\n this._cleared = !1, this._currentlyRunning = !1;\n }, br.prototype.clear = function () {\n this._currentlyRunning && (this._cleared = !0), this._queue = [];\n };\n\n var wr = {\n "AttributionControl.ToggleAttribution": "Toggle attribution",\n "AttributionControl.MapFeedback": "Map feedback",\n "FullscreenControl.Enter": "Enter fullscreen",\n "FullscreenControl.Exit": "Exit fullscreen",\n "GeolocateControl.FindMyLocation": "Find my location",\n "GeolocateControl.LocationNotAvailable": "Location not available",\n "LogoControl.Title": "Mapbox logo",\n "NavigationControl.ResetBearing": "Reset bearing to north",\n "NavigationControl.ZoomIn": "Zoom in",\n "NavigationControl.ZoomOut": "Zoom out",\n "ScaleControl.Feet": "ft",\n "ScaleControl.Meters": "m",\n "ScaleControl.Kilometers": "km",\n "ScaleControl.Miles": "mi",\n "ScaleControl.NauticalMiles": "nm"\n },\n Tr = t.window.HTMLImageElement,\n Er = t.window.HTMLElement,\n Ir = t.window.ImageBitmap,\n Pr = {\n center: [0, 0],\n zoom: 0,\n bearing: 0,\n pitch: 0,\n minZoom: -2,\n maxZoom: 22,\n minPitch: 0,\n maxPitch: 60,\n interactive: !0,\n scrollZoom: !0,\n boxZoom: !0,\n dragRotate: !0,\n dragPan: !0,\n keyboard: !0,\n doubleClickZoom: !0,\n touchZoomRotate: !0,\n touchPitch: !0,\n bearingSnap: 7,\n clickTolerance: 3,\n pitchWithRotate: !0,\n hash: !1,\n attributionControl: !0,\n failIfMajorPerformanceCaveat: !1,\n preserveDrawingBuffer: !1,\n trackResize: !0,\n renderWorldCopies: !0,\n refreshExpiredTiles: !0,\n maxTileCacheSize: null,\n localIdeographFontFamily: "sans-serif",\n transformRequest: null,\n accessToken: null,\n fadeDuration: 300,\n crossSourceCollisions: !0\n },\n Sr = function (o) {\n function r(e) {\n var i = this;\n if (null != (e = t.extend({}, Pr, e)).minZoom && null != e.maxZoom && e.minZoom > e.maxZoom) throw new Error("maxZoom must be greater than or equal to minZoom");\n if (null != e.minPitch && null != e.maxPitch && e.minPitch > e.maxPitch) throw new Error("maxPitch must be greater than or equal to minPitch");\n if (null != e.minPitch && e.minPitch < 0) throw new Error("minPitch must be greater than or equal to 0");\n if (null != e.maxPitch && e.maxPitch > 60) throw new Error("maxPitch must be less than or equal to 60");\n var r = new To(e.minZoom, e.maxZoom, e.minPitch, e.maxPitch, e.renderWorldCopies);\n\n if (o.call(this, r, e), this._interactive = e.interactive, this._maxTileCacheSize = e.maxTileCacheSize, this._failIfMajorPerformanceCaveat = e.failIfMajorPerformanceCaveat, this._preserveDrawingBuffer = e.preserveDrawingBuffer, this._antialias = e.antialias, this._trackResize = e.trackResize, this._bearingSnap = e.bearingSnap, this._refreshExpiredTiles = e.refreshExpiredTiles, this._fadeDuration = e.fadeDuration, this._crossSourceCollisions = e.crossSourceCollisions, this._crossFadingFactor = 1, this._collectResourceTiming = e.collectResourceTiming, this._renderTaskQueue = new br(), this._controls = [], this._mapId = t.uniqueId(), this._locale = t.extend({}, wr, e.locale), this._clickTolerance = e.clickTolerance, this._requestManager = new t.RequestManager(e.transformRequest, e.accessToken), "string" == typeof e.container) {\n if (this._container = t.window.document.getElementById(e.container), !this._container) throw new Error("Container \'" + e.container + "\' not found.");\n } else {\n if (!(e.container instanceof Er)) throw new Error("Invalid type: \'container\' must be a String or HTMLElement.");\n this._container = e.container;\n }\n\n if (e.maxBounds && this.setMaxBounds(e.maxBounds), t.bindAll(["_onWindowOnline", "_onWindowResize", "_onMapScroll", "_contextLost", "_contextRestored"], this), this._setupContainer(), this._setupPainter(), void 0 === this.painter) throw new Error("Failed to initialize WebGL.");\n this.on("move", function () {\n return i._update(!1);\n }), this.on("moveend", function () {\n return i._update(!1);\n }), this.on("zoom", function () {\n return i._update(!0);\n }), void 0 !== t.window && (t.window.addEventListener("online", this._onWindowOnline, !1), t.window.addEventListener("resize", this._onWindowResize, !1), t.window.addEventListener("orientationchange", this._onWindowResize, !1)), this.handlers = new gr(this, e), this._hash = e.hash && new Io("string" == typeof e.hash && e.hash || void 0).addTo(this), this._hash && this._hash._onHashChange() || (this.jumpTo({\n center: e.center,\n zoom: e.zoom,\n bearing: e.bearing,\n pitch: e.pitch\n }), e.bounds && (this.resize(), this.fitBounds(e.bounds, t.extend({}, e.fitBoundsOptions, {\n duration: 0\n })))), this.resize(), this._localIdeographFontFamily = e.localIdeographFontFamily, e.style && this.setStyle(e.style, {\n localIdeographFontFamily: e.localIdeographFontFamily\n }), e.attributionControl && this.addControl(new yr({\n customAttribution: e.customAttribution\n })), this.addControl(new xr(), e.logoPosition), this.on("style.load", function () {\n i.transform.unmodified && i.jumpTo(i.style.stylesheet);\n }), this.on("data", function (e) {\n i._update("style" === e.dataType), i.fire(new t.Event(e.dataType + "data", e));\n }), this.on("dataloading", function (e) {\n i.fire(new t.Event(e.dataType + "dataloading", e));\n });\n }\n\n o && (r.__proto__ = o), (r.prototype = Object.create(o && o.prototype)).constructor = r;\n var a = {\n showTileBoundaries: {\n configurable: !0\n },\n showPadding: {\n configurable: !0\n },\n showCollisionBoxes: {\n configurable: !0\n },\n showOverdrawInspector: {\n configurable: !0\n },\n repaint: {\n configurable: !0\n },\n vertices: {\n configurable: !0\n },\n version: {\n configurable: !0\n }\n };\n return r.prototype._getMapId = function () {\n return this._mapId;\n }, r.prototype.addControl = function (e, i) {\n if (void 0 === i && (i = e.getDefaultPosition ? e.getDefaultPosition() : "top-right"), !e || !e.onAdd) return this.fire(new t.ErrorEvent(new Error("Invalid argument to map.addControl(). Argument must be a control with onAdd and onRemove methods.")));\n var o = e.onAdd(this);\n\n this._controls.push(e);\n\n var r = this._controlPositions[i];\n return -1 !== i.indexOf("bottom") ? r.insertBefore(o, r.firstChild) : r.appendChild(o), this;\n }, r.prototype.removeControl = function (e) {\n if (!e || !e.onRemove) return this.fire(new t.ErrorEvent(new Error("Invalid argument to map.removeControl(). Argument must be a control with onAdd and onRemove methods.")));\n\n var i = this._controls.indexOf(e);\n\n return i > -1 && this._controls.splice(i, 1), e.onRemove(this), this;\n }, r.prototype.hasControl = function (t) {\n return this._controls.indexOf(t) > -1;\n }, r.prototype.resize = function (e) {\n var i = this._containerDimensions(),\n o = i[0],\n r = i[1];\n\n this._resizeCanvas(o, r), this.transform.resize(o, r), this.painter.resize(o, r);\n var a = !this._moving;\n return a && (this.stop(), this.fire(new t.Event("movestart", e)).fire(new t.Event("move", e))), this.fire(new t.Event("resize", e)), a && this.fire(new t.Event("moveend", e)), this;\n }, r.prototype.getBounds = function () {\n return this.transform.getBounds();\n }, r.prototype.getMaxBounds = function () {\n return this.transform.getMaxBounds();\n }, r.prototype.setMaxBounds = function (e) {\n return this.transform.setMaxBounds(t.LngLatBounds.convert(e)), this._update();\n }, r.prototype.setMinZoom = function (t) {\n if ((t = null == t ? -2 : t) >= -2 && t <= this.transform.maxZoom) return this.transform.minZoom = t, this._update(), this.getZoom() < t && this.setZoom(t), this;\n throw new Error("minZoom must be between -2 and the current maxZoom, inclusive");\n }, r.prototype.getMinZoom = function () {\n return this.transform.minZoom;\n }, r.prototype.setMaxZoom = function (t) {\n if ((t = null == t ? 22 : t) >= this.transform.minZoom) return this.transform.maxZoom = t, this._update(), this.getZoom() > t && this.setZoom(t), this;\n throw new Error("maxZoom must be greater than the current minZoom");\n }, r.prototype.getMaxZoom = function () {\n return this.transform.maxZoom;\n }, r.prototype.setMinPitch = function (t) {\n if ((t = null == t ? 0 : t) < 0) throw new Error("minPitch must be greater than or equal to 0");\n if (t >= 0 && t <= this.transform.maxPitch) return this.transform.minPitch = t, this._update(), this.getPitch() < t && this.setPitch(t), this;\n throw new Error("minPitch must be between 0 and the current maxPitch, inclusive");\n }, r.prototype.getMinPitch = function () {\n return this.transform.minPitch;\n }, r.prototype.setMaxPitch = function (t) {\n if ((t = null == t ? 60 : t) > 60) throw new Error("maxPitch must be less than or equal to 60");\n if (t >= this.transform.minPitch) return this.transform.maxPitch = t, this._update(), this.getPitch() > t && this.setPitch(t), this;\n throw new Error("maxPitch must be greater than the current minPitch");\n }, r.prototype.getMaxPitch = function () {\n return this.transform.maxPitch;\n }, r.prototype.getRenderWorldCopies = function () {\n return this.transform.renderWorldCopies;\n }, r.prototype.setRenderWorldCopies = function (t) {\n return this.transform.renderWorldCopies = t, this._update();\n }, r.prototype.project = function (e) {\n return this.transform.locationPoint(t.LngLat.convert(e));\n }, r.prototype.unproject = function (e) {\n return this.transform.pointLocation(t.Point.convert(e));\n }, r.prototype.isMoving = function () {\n return this._moving || this.handlers.isMoving();\n }, r.prototype.isZooming = function () {\n return this._zooming || this.handlers.isZooming();\n }, r.prototype.isRotating = function () {\n return this._rotating || this.handlers.isRotating();\n }, r.prototype._createDelegatedListener = function (t, e, i) {\n var o,\n r = this;\n\n if ("mouseenter" === t || "mouseover" === t) {\n var a = !1;\n return {\n layer: e,\n listener: i,\n delegates: {\n mousemove: function mousemove(o) {\n var n = r.getLayer(e) ? r.queryRenderedFeatures(o.point, {\n layers: [e]\n }) : [];\n n.length ? a || (a = !0, i.call(r, new Ro(t, r, o.originalEvent, {\n features: n\n }))) : a = !1;\n },\n mouseout: function mouseout() {\n a = !1;\n }\n }\n };\n }\n\n if ("mouseleave" === t || "mouseout" === t) {\n var n = !1;\n return {\n layer: e,\n listener: i,\n delegates: {\n mousemove: function mousemove(o) {\n (r.getLayer(e) ? r.queryRenderedFeatures(o.point, {\n layers: [e]\n }) : []).length ? n = !0 : n && (n = !1, i.call(r, new Ro(t, r, o.originalEvent)));\n },\n mouseout: function mouseout(e) {\n n && (n = !1, i.call(r, new Ro(t, r, e.originalEvent)));\n }\n }\n };\n }\n\n return {\n layer: e,\n listener: i,\n delegates: (o = {}, o[t] = function (t) {\n var o = r.getLayer(e) ? r.queryRenderedFeatures(t.point, {\n layers: [e]\n }) : [];\n o.length && (t.features = o, i.call(r, t), delete t.features);\n }, o)\n };\n }, r.prototype.on = function (t, e, i) {\n if (void 0 === i) return o.prototype.on.call(this, t, e);\n\n var r = this._createDelegatedListener(t, e, i);\n\n for (var a in this._delegatedListeners = this._delegatedListeners || {}, this._delegatedListeners[t] = this._delegatedListeners[t] || [], this._delegatedListeners[t].push(r), r.delegates) {\n this.on(a, r.delegates[a]);\n }\n\n return this;\n }, r.prototype.once = function (t, e, i) {\n if (void 0 === i) return o.prototype.once.call(this, t, e);\n\n var r = this._createDelegatedListener(t, e, i);\n\n for (var a in r.delegates) {\n this.once(a, r.delegates[a]);\n }\n\n return this;\n }, r.prototype.off = function (t, e, i) {\n var r = this;\n return void 0 === i ? o.prototype.off.call(this, t, e) : (this._delegatedListeners && this._delegatedListeners[t] && function (o) {\n for (var a = o[t], n = 0; n < a.length; n++) {\n var s = a[n];\n\n if (s.layer === e && s.listener === i) {\n for (var l in s.delegates) {\n r.off(l, s.delegates[l]);\n }\n\n return a.splice(n, 1), r;\n }\n }\n }(this._delegatedListeners), this);\n }, r.prototype.queryRenderedFeatures = function (e, i) {\n if (!this.style) return [];\n var o;\n if (void 0 !== i || void 0 === e || e instanceof t.Point || Array.isArray(e) || (i = e, e = void 0), i = i || {}, (e = e || [[0, 0], [this.transform.width, this.transform.height]]) instanceof t.Point || "number" == typeof e[0]) o = [t.Point.convert(e)];else {\n var r = t.Point.convert(e[0]),\n a = t.Point.convert(e[1]);\n o = [r, new t.Point(a.x, r.y), a, new t.Point(r.x, a.y), r];\n }\n return this.style.queryRenderedFeatures(o, i, this.transform);\n }, r.prototype.querySourceFeatures = function (t, e) {\n return this.style.querySourceFeatures(t, e);\n }, r.prototype.setStyle = function (e, i) {\n return !1 !== (i = t.extend({}, {\n localIdeographFontFamily: this._localIdeographFontFamily\n }, i)).diff && i.localIdeographFontFamily === this._localIdeographFontFamily && this.style && e ? (this._diffStyle(e, i), this) : (this._localIdeographFontFamily = i.localIdeographFontFamily, this._updateStyle(e, i));\n }, r.prototype._getUIString = function (t) {\n var e = this._locale[t];\n if (null == e) throw new Error("Missing UI string \'" + t + "\'");\n return e;\n }, r.prototype._updateStyle = function (t, e) {\n return this.style && (this.style.setEventedParent(null), this.style._remove()), t ? (this.style = new je(this, e || {}), this.style.setEventedParent(this, {\n style: this.style\n }), "string" == typeof t ? this.style.loadURL(t) : this.style.loadJSON(t), this) : (delete this.style, this);\n }, r.prototype._lazyInitEmptyStyle = function () {\n this.style || (this.style = new je(this, {}), this.style.setEventedParent(this, {\n style: this.style\n }), this.style.loadEmpty());\n }, r.prototype._diffStyle = function (e, i) {\n var o = this;\n\n if ("string" == typeof e) {\n var r = this._requestManager.normalizeStyleURL(e),\n a = this._requestManager.transformRequest(r, t.ResourceType.Style);\n\n t.getJSON(a, function (e, r) {\n e ? o.fire(new t.ErrorEvent(e)) : r && o._updateDiff(r, i);\n });\n } else "object" == typeof e && this._updateDiff(e, i);\n }, r.prototype._updateDiff = function (e, i) {\n try {\n this.style.setState(e) && this._update(!0);\n } catch (o) {\n t.warnOnce("Unable to perform style diff: " + (o.message || o.error || o) + ". Rebuilding the style from scratch."), this._updateStyle(e, i);\n }\n }, r.prototype.getStyle = function () {\n if (this.style) return this.style.serialize();\n }, r.prototype.isStyleLoaded = function () {\n return this.style ? this.style.loaded() : t.warnOnce("There is no style added to the map.");\n }, r.prototype.addSource = function (t, e) {\n return this._lazyInitEmptyStyle(), this.style.addSource(t, e), this._update(!0);\n }, r.prototype.isSourceLoaded = function (e) {\n var i = this.style && this.style.sourceCaches[e];\n if (void 0 !== i) return i.loaded();\n this.fire(new t.ErrorEvent(new Error("There is no source with ID \'" + e + "\'")));\n }, r.prototype.areTilesLoaded = function () {\n var t = this.style && this.style.sourceCaches;\n\n for (var e in t) {\n var i = t[e]._tiles;\n\n for (var o in i) {\n var r = i[o];\n if ("loaded" !== r.state && "errored" !== r.state) return !1;\n }\n }\n\n return !0;\n }, r.prototype.addSourceType = function (t, e, i) {\n return this._lazyInitEmptyStyle(), this.style.addSourceType(t, e, i);\n }, r.prototype.removeSource = function (t) {\n return this.style.removeSource(t), this._update(!0);\n }, r.prototype.getSource = function (t) {\n return this.style.getSource(t);\n }, r.prototype.addImage = function (e, i, o) {\n void 0 === o && (o = {});\n var r = o.pixelRatio;\n void 0 === r && (r = 1);\n var a = o.sdf;\n void 0 === a && (a = !1);\n var n = o.stretchX,\n s = o.stretchY,\n l = o.content;\n\n if (this._lazyInitEmptyStyle(), i instanceof Tr || Ir && i instanceof Ir) {\n var c = t.browser.getImageData(i);\n this.style.addImage(e, {\n data: new t.RGBAImage({\n width: c.width,\n height: c.height\n }, c.data),\n pixelRatio: r,\n stretchX: n,\n stretchY: s,\n content: l,\n sdf: a,\n version: 0\n });\n } else {\n if (void 0 === i.width || void 0 === i.height) return this.fire(new t.ErrorEvent(new Error("Invalid arguments to map.addImage(). The second argument must be an `HTMLImageElement`, `ImageData`, `ImageBitmap`, or object with `width`, `height`, and `data` properties with the same format as `ImageData`")));\n var u = i;\n this.style.addImage(e, {\n data: new t.RGBAImage({\n width: i.width,\n height: i.height\n }, new Uint8Array(i.data)),\n pixelRatio: r,\n stretchX: n,\n stretchY: s,\n content: l,\n sdf: a,\n version: 0,\n userImage: u\n }), u.onAdd && u.onAdd(this, e);\n }\n }, r.prototype.updateImage = function (e, i) {\n var o = this.style.getImage(e);\n if (!o) return this.fire(new t.ErrorEvent(new Error("The map has no image with that id. If you are adding a new image use `map.addImage(...)` instead.")));\n var r = i instanceof Tr || Ir && i instanceof Ir ? t.browser.getImageData(i) : i,\n a = r.width,\n n = r.height,\n s = r.data;\n return void 0 === a || void 0 === n ? this.fire(new t.ErrorEvent(new Error("Invalid arguments to map.updateImage(). The second argument must be an `HTMLImageElement`, `ImageData`, `ImageBitmap`, or object with `width`, `height`, and `data` properties with the same format as `ImageData`"))) : a !== o.data.width || n !== o.data.height ? this.fire(new t.ErrorEvent(new Error("The width and height of the updated image must be that same as the previous version of the image"))) : (o.data.replace(s, !(i instanceof Tr || Ir && i instanceof Ir)), void this.style.updateImage(e, o));\n }, r.prototype.hasImage = function (e) {\n return e ? !!this.style.getImage(e) : (this.fire(new t.ErrorEvent(new Error("Missing required image id"))), !1);\n }, r.prototype.removeImage = function (t) {\n this.style.removeImage(t);\n }, r.prototype.loadImage = function (e, i) {\n t.getImage(this._requestManager.transformRequest(e, t.ResourceType.Image), i);\n }, r.prototype.listImages = function () {\n return this.style.listImages();\n }, r.prototype.addLayer = function (t, e) {\n return this._lazyInitEmptyStyle(), this.style.addLayer(t, e), this._update(!0);\n }, r.prototype.moveLayer = function (t, e) {\n return this.style.moveLayer(t, e), this._update(!0);\n }, r.prototype.removeLayer = function (t) {\n return this.style.removeLayer(t), this._update(!0);\n }, r.prototype.getLayer = function (t) {\n return this.style.getLayer(t);\n }, r.prototype.setLayerZoomRange = function (t, e, i) {\n return this.style.setLayerZoomRange(t, e, i), this._update(!0);\n }, r.prototype.setFilter = function (t, e, i) {\n return void 0 === i && (i = {}), this.style.setFilter(t, e, i), this._update(!0);\n }, r.prototype.getFilter = function (t) {\n return this.style.getFilter(t);\n }, r.prototype.setPaintProperty = function (t, e, i, o) {\n return void 0 === o && (o = {}), this.style.setPaintProperty(t, e, i, o), this._update(!0);\n }, r.prototype.getPaintProperty = function (t, e) {\n return this.style.getPaintProperty(t, e);\n }, r.prototype.setLayoutProperty = function (t, e, i, o) {\n return void 0 === o && (o = {}), this.style.setLayoutProperty(t, e, i, o), this._update(!0);\n }, r.prototype.getLayoutProperty = function (t, e) {\n return this.style.getLayoutProperty(t, e);\n }, r.prototype.setLight = function (t, e) {\n return void 0 === e && (e = {}), this._lazyInitEmptyStyle(), this.style.setLight(t, e), this._update(!0);\n }, r.prototype.getLight = function () {\n return this.style.getLight();\n }, r.prototype.setFeatureState = function (t, e) {\n return this.style.setFeatureState(t, e), this._update();\n }, r.prototype.removeFeatureState = function (t, e) {\n return this.style.removeFeatureState(t, e), this._update();\n }, r.prototype.getFeatureState = function (t) {\n return this.style.getFeatureState(t);\n }, r.prototype.getContainer = function () {\n return this._container;\n }, r.prototype.getCanvasContainer = function () {\n return this._canvasContainer;\n }, r.prototype.getCanvas = function () {\n return this._canvas;\n }, r.prototype._containerDimensions = function () {\n var t = 0,\n e = 0;\n return this._container && (t = this._container.clientWidth || 400, e = this._container.clientHeight || 300), [t, e];\n }, r.prototype._detectMissingCSS = function () {\n "rgb(250, 128, 114)" !== t.window.getComputedStyle(this._missingCSSCanary).getPropertyValue("background-color") && t.warnOnce("This page appears to be missing CSS declarations for Mapbox GL JS, which may cause the map to display incorrectly. Please ensure your page includes mapbox-gl.css, as described in https://www.mapbox.com/mapbox-gl-js/api/.");\n }, r.prototype._setupContainer = function () {\n var t = this._container;\n t.classList.add("mapboxgl-map"), (this._missingCSSCanary = i.create("div", "mapboxgl-canary", t)).style.visibility = "hidden", this._detectMissingCSS();\n var e = this._canvasContainer = i.create("div", "mapboxgl-canvas-container", t);\n this._interactive && e.classList.add("mapboxgl-interactive"), this._canvas = i.create("canvas", "mapboxgl-canvas", e), this._canvas.addEventListener("webglcontextlost", this._contextLost, !1), this._canvas.addEventListener("webglcontextrestored", this._contextRestored, !1), this._canvas.setAttribute("tabindex", "0"), this._canvas.setAttribute("aria-label", "Map"), this._canvas.setAttribute("role", "region");\n\n var o = this._containerDimensions();\n\n this._resizeCanvas(o[0], o[1]);\n\n var r = this._controlContainer = i.create("div", "mapboxgl-control-container", t),\n a = this._controlPositions = {};\n ["top-left", "top-right", "bottom-left", "bottom-right"].forEach(function (t) {\n a[t] = i.create("div", "mapboxgl-ctrl-" + t, r);\n }), this._container.addEventListener("scroll", this._onMapScroll, !1);\n }, r.prototype._resizeCanvas = function (e, i) {\n var o = t.browser.devicePixelRatio || 1;\n this._canvas.width = o * e, this._canvas.height = o * i, this._canvas.style.width = e + "px", this._canvas.style.height = i + "px";\n }, r.prototype._setupPainter = function () {\n var i = t.extend({}, e.webGLContextAttributes, {\n failIfMajorPerformanceCaveat: this._failIfMajorPerformanceCaveat,\n preserveDrawingBuffer: this._preserveDrawingBuffer,\n antialias: this._antialias || !1\n }),\n o = this._canvas.getContext("webgl", i) || this._canvas.getContext("experimental-webgl", i);\n\n o ? (this.painter = new yo(o, this.transform), t.webpSupported.testSupport(o)) : this.fire(new t.ErrorEvent(new Error("Failed to initialize WebGL")));\n }, r.prototype._contextLost = function (e) {\n e.preventDefault(), this._frame && (this._frame.cancel(), this._frame = null), this.fire(new t.Event("webglcontextlost", {\n originalEvent: e\n }));\n }, r.prototype._contextRestored = function (e) {\n this._setupPainter(), this.resize(), this._update(), this.fire(new t.Event("webglcontextrestored", {\n originalEvent: e\n }));\n }, r.prototype._onMapScroll = function (t) {\n if (t.target === this._container) return this._container.scrollTop = 0, this._container.scrollLeft = 0, !1;\n }, r.prototype.loaded = function () {\n return !this._styleDirty && !this._sourcesDirty && !!this.style && this.style.loaded();\n }, r.prototype._update = function (t) {\n return this.style ? (this._styleDirty = this._styleDirty || t, this._sourcesDirty = !0, this.triggerRepaint(), this) : this;\n }, r.prototype._requestRenderFrame = function (t) {\n return this._update(), this._renderTaskQueue.add(t);\n }, r.prototype._cancelRenderFrame = function (t) {\n this._renderTaskQueue.remove(t);\n }, r.prototype._render = function (e) {\n var i,\n o = this,\n r = 0,\n a = this.painter.context.extTimerQuery;\n\n if (this.listens("gpu-timing-frame") && (i = a.createQueryEXT(), a.beginQueryEXT(a.TIME_ELAPSED_EXT, i), r = t.browser.now()), this.painter.context.setDirty(), this.painter.setBaseState(), this._renderTaskQueue.run(e), !this._removed) {\n var n = !1;\n\n if (this.style && this._styleDirty) {\n this._styleDirty = !1;\n var s = this.transform.zoom,\n l = t.browser.now();\n this.style.zoomHistory.update(s, l);\n var c = new t.EvaluationParameters(s, {\n now: l,\n fadeDuration: this._fadeDuration,\n zoomHistory: this.style.zoomHistory,\n transition: this.style.getTransition()\n }),\n u = c.crossFadingFactor();\n 1 === u && u === this._crossFadingFactor || (n = !0, this._crossFadingFactor = u), this.style.update(c);\n }\n\n if (this.style && this._sourcesDirty && (this._sourcesDirty = !1, this.style._updateSources(this.transform)), this._placementDirty = this.style && this.style._updatePlacement(this.painter.transform, this.showCollisionBoxes, this._fadeDuration, this._crossSourceCollisions), this.painter.render(this.style, {\n showTileBoundaries: this.showTileBoundaries,\n showOverdrawInspector: this._showOverdrawInspector,\n rotating: this.isRotating(),\n zooming: this.isZooming(),\n moving: this.isMoving(),\n fadeDuration: this._fadeDuration,\n showPadding: this.showPadding,\n gpuTiming: !!this.listens("gpu-timing-layer")\n }), this.fire(new t.Event("render")), this.loaded() && !this._loaded && (this._loaded = !0, this.fire(new t.Event("load"))), this.style && (this.style.hasTransitions() || n) && (this._styleDirty = !0), this.style && !this._placementDirty && this.style._releaseSymbolFadeTiles(), this.listens("gpu-timing-frame")) {\n var h = t.browser.now() - r;\n a.endQueryEXT(a.TIME_ELAPSED_EXT, i), setTimeout(function () {\n var e = a.getQueryObjectEXT(i, a.QUERY_RESULT_EXT) / 1e6;\n a.deleteQueryEXT(i), o.fire(new t.Event("gpu-timing-frame", {\n cpuTime: h,\n gpuTime: e\n }));\n }, 50);\n }\n\n if (this.listens("gpu-timing-layer")) {\n var p = this.painter.collectGpuTimers();\n setTimeout(function () {\n var e = o.painter.queryGpuTimers(p);\n o.fire(new t.Event("gpu-timing-layer", {\n layerTimes: e\n }));\n }, 50);\n }\n\n var d = this._sourcesDirty || this._styleDirty || this._placementDirty;\n return d || this._repaint ? this.triggerRepaint() : !this.isMoving() && this.loaded() && this.fire(new t.Event("idle")), !this._loaded || this._fullyLoaded || d || (this._fullyLoaded = !0), this;\n }\n }, r.prototype.remove = function () {\n this._hash && this._hash.remove();\n\n for (var e = 0, i = this._controls; e < i.length; e += 1) {\n i[e].onRemove(this);\n }\n\n this._controls = [], this._frame && (this._frame.cancel(), this._frame = null), this._renderTaskQueue.clear(), this.painter.destroy(), this.handlers.destroy(), delete this.handlers, this.setStyle(null), void 0 !== t.window && (t.window.removeEventListener("resize", this._onWindowResize, !1), t.window.removeEventListener("orientationchange", this._onWindowResize, !1), t.window.removeEventListener("online", this._onWindowOnline, !1));\n var o = this.painter.context.gl.getExtension("WEBGL_lose_context");\n o && o.loseContext(), Cr(this._canvasContainer), Cr(this._controlContainer), Cr(this._missingCSSCanary), this._container.classList.remove("mapboxgl-map"), this._removed = !0, this.fire(new t.Event("remove"));\n }, r.prototype.triggerRepaint = function () {\n var e = this;\n this.style && !this._frame && (this._frame = t.browser.frame(function (t) {\n e._frame = null, e._render(t);\n }));\n }, r.prototype._onWindowOnline = function () {\n this._update();\n }, r.prototype._onWindowResize = function (t) {\n this._trackResize && this.resize({\n originalEvent: t\n })._update();\n }, a.showTileBoundaries.get = function () {\n return !!this._showTileBoundaries;\n }, a.showTileBoundaries.set = function (t) {\n this._showTileBoundaries !== t && (this._showTileBoundaries = t, this._update());\n }, a.showPadding.get = function () {\n return !!this._showPadding;\n }, a.showPadding.set = function (t) {\n this._showPadding !== t && (this._showPadding = t, this._update());\n }, a.showCollisionBoxes.get = function () {\n return !!this._showCollisionBoxes;\n }, a.showCollisionBoxes.set = function (t) {\n this._showCollisionBoxes !== t && (this._showCollisionBoxes = t, t ? this.style._generateCollisionBoxes() : this._update());\n }, a.showOverdrawInspector.get = function () {\n return !!this._showOverdrawInspector;\n }, a.showOverdrawInspector.set = function (t) {\n this._showOverdrawInspector !== t && (this._showOverdrawInspector = t, this._update());\n }, a.repaint.get = function () {\n return !!this._repaint;\n }, a.repaint.set = function (t) {\n this._repaint !== t && (this._repaint = t, this.triggerRepaint());\n }, a.vertices.get = function () {\n return !!this._vertices;\n }, a.vertices.set = function (t) {\n this._vertices = t, this._update();\n }, r.prototype._setCacheLimits = function (e, i) {\n t.setCacheLimits(e, i);\n }, a.version.get = function () {\n return t.version;\n }, Object.defineProperties(r.prototype, a), r;\n }(vr);\n\n function Cr(t) {\n t.parentNode && t.parentNode.removeChild(t);\n }\n\n var zr = {\n showCompass: !0,\n showZoom: !0,\n visualizePitch: !1\n },\n Dr = function Dr(e) {\n var o = this;\n this.options = t.extend({}, zr, e), this._container = i.create("div", "mapboxgl-ctrl mapboxgl-ctrl-group"), this._container.addEventListener("contextmenu", function (t) {\n return t.preventDefault();\n }), this.options.showZoom && (t.bindAll(["_setButtonTitle", "_updateZoomButtons"], this), this._zoomInButton = this._createButton("mapboxgl-ctrl-zoom-in", function (t) {\n return o._map.zoomIn({}, {\n originalEvent: t\n });\n }), i.create("span", "mapboxgl-ctrl-icon", this._zoomInButton).setAttribute("aria-hidden", !0), this._zoomOutButton = this._createButton("mapboxgl-ctrl-zoom-out", function (t) {\n return o._map.zoomOut({}, {\n originalEvent: t\n });\n }), i.create("span", "mapboxgl-ctrl-icon", this._zoomOutButton).setAttribute("aria-hidden", !0)), this.options.showCompass && (t.bindAll(["_rotateCompassArrow"], this), this._compass = this._createButton("mapboxgl-ctrl-compass", function (t) {\n o.options.visualizePitch ? o._map.resetNorthPitch({}, {\n originalEvent: t\n }) : o._map.resetNorth({}, {\n originalEvent: t\n });\n }), this._compassIcon = i.create("span", "mapboxgl-ctrl-icon", this._compass), this._compassIcon.setAttribute("aria-hidden", !0));\n };\n\n Dr.prototype._updateZoomButtons = function () {\n var t = this._map.getZoom(),\n e = t === this._map.getMaxZoom(),\n i = t === this._map.getMinZoom();\n\n this._zoomInButton.disabled = e, this._zoomOutButton.disabled = i, this._zoomInButton.setAttribute("aria-disabled", e.toString()), this._zoomOutButton.setAttribute("aria-disabled", i.toString());\n }, Dr.prototype._rotateCompassArrow = function () {\n var t = this.options.visualizePitch ? "scale(" + 1 / Math.pow(Math.cos(this._map.transform.pitch * (Math.PI / 180)), .5) + ") rotateX(" + this._map.transform.pitch + "deg) rotateZ(" + this._map.transform.angle * (180 / Math.PI) + "deg)" : "rotate(" + this._map.transform.angle * (180 / Math.PI) + "deg)";\n this._compassIcon.style.transform = t;\n }, Dr.prototype.onAdd = function (t) {\n return this._map = t, this.options.showZoom && (this._setButtonTitle(this._zoomInButton, "ZoomIn"), this._setButtonTitle(this._zoomOutButton, "ZoomOut"), this._map.on("zoom", this._updateZoomButtons), this._updateZoomButtons()), this.options.showCompass && (this._setButtonTitle(this._compass, "ResetBearing"), this.options.visualizePitch && this._map.on("pitch", this._rotateCompassArrow), this._map.on("rotate", this._rotateCompassArrow), this._rotateCompassArrow(), this._handler = new Ar(this._map, this._compass, this.options.visualizePitch)), this._container;\n }, Dr.prototype.onRemove = function () {\n i.remove(this._container), this.options.showZoom && this._map.off("zoom", this._updateZoomButtons), this.options.showCompass && (this.options.visualizePitch && this._map.off("pitch", this._rotateCompassArrow), this._map.off("rotate", this._rotateCompassArrow), this._handler.off(), delete this._handler), delete this._map;\n }, Dr.prototype._createButton = function (t, e) {\n var o = i.create("button", t, this._container);\n return o.type = "button", o.addEventListener("click", e), o;\n }, Dr.prototype._setButtonTitle = function (t, e) {\n var i = this._map._getUIString("NavigationControl." + e);\n\n t.title = i, t.setAttribute("aria-label", i);\n };\n\n var Ar = function Ar(e, o, r) {\n void 0 === r && (r = !1), this._clickTolerance = 10, this.element = o, this.mouseRotate = new Xo({\n clickTolerance: e.dragRotate._mouseRotate._clickTolerance\n }), this.map = e, r && (this.mousePitch = new Ho({\n clickTolerance: e.dragRotate._mousePitch._clickTolerance\n })), t.bindAll(["mousedown", "mousemove", "mouseup", "touchstart", "touchmove", "touchend", "reset"], this), i.addEventListener(o, "mousedown", this.mousedown), i.addEventListener(o, "touchstart", this.touchstart, {\n passive: !1\n }), i.addEventListener(o, "touchmove", this.touchmove), i.addEventListener(o, "touchend", this.touchend), i.addEventListener(o, "touchcancel", this.reset);\n };\n\n function Mr(e, i, o) {\n if (e = new t.LngLat(e.lng, e.lat), i) {\n var r = new t.LngLat(e.lng - 360, e.lat),\n a = new t.LngLat(e.lng + 360, e.lat),\n n = o.locationPoint(e).distSqr(i);\n o.locationPoint(r).distSqr(i) < n ? e = r : o.locationPoint(a).distSqr(i) < n && (e = a);\n }\n\n for (; Math.abs(e.lng - o.center.lng) > 180;) {\n var s = o.locationPoint(e);\n if (s.x >= 0 && s.y >= 0 && s.x <= o.width && s.y <= o.height) break;\n e.lng > o.center.lng ? e.lng -= 360 : e.lng += 360;\n }\n\n return e;\n }\n\n Ar.prototype.down = function (t, e) {\n this.mouseRotate.mousedown(t, e), this.mousePitch && this.mousePitch.mousedown(t, e), i.disableDrag();\n }, Ar.prototype.move = function (t, e) {\n var i = this.map,\n o = this.mouseRotate.mousemoveWindow(t, e);\n\n if (o && o.bearingDelta && i.setBearing(i.getBearing() + o.bearingDelta), this.mousePitch) {\n var r = this.mousePitch.mousemoveWindow(t, e);\n r && r.pitchDelta && i.setPitch(i.getPitch() + r.pitchDelta);\n }\n }, Ar.prototype.off = function () {\n var t = this.element;\n i.removeEventListener(t, "mousedown", this.mousedown), i.removeEventListener(t, "touchstart", this.touchstart, {\n passive: !1\n }), i.removeEventListener(t, "touchmove", this.touchmove), i.removeEventListener(t, "touchend", this.touchend), i.removeEventListener(t, "touchcancel", this.reset), this.offTemp();\n }, Ar.prototype.offTemp = function () {\n i.enableDrag(), i.removeEventListener(t.window, "mousemove", this.mousemove), i.removeEventListener(t.window, "mouseup", this.mouseup);\n }, Ar.prototype.mousedown = function (e) {\n this.down(t.extend({}, e, {\n ctrlKey: !0,\n preventDefault: function preventDefault() {\n return e.preventDefault();\n }\n }), i.mousePos(this.element, e)), i.addEventListener(t.window, "mousemove", this.mousemove), i.addEventListener(t.window, "mouseup", this.mouseup);\n }, Ar.prototype.mousemove = function (t) {\n this.move(t, i.mousePos(this.element, t));\n }, Ar.prototype.mouseup = function (t) {\n this.mouseRotate.mouseupWindow(t), this.mousePitch && this.mousePitch.mouseupWindow(t), this.offTemp();\n }, Ar.prototype.touchstart = function (t) {\n 1 !== t.targetTouches.length ? this.reset() : (this._startPos = this._lastPos = i.touchPos(this.element, t.targetTouches)[0], this.down({\n type: "mousedown",\n button: 0,\n ctrlKey: !0,\n preventDefault: function preventDefault() {\n return t.preventDefault();\n }\n }, this._startPos));\n }, Ar.prototype.touchmove = function (t) {\n 1 !== t.targetTouches.length ? this.reset() : (this._lastPos = i.touchPos(this.element, t.targetTouches)[0], this.move({\n preventDefault: function preventDefault() {\n return t.preventDefault();\n }\n }, this._lastPos));\n }, Ar.prototype.touchend = function (t) {\n 0 === t.targetTouches.length && this._startPos && this._lastPos && this._startPos.dist(this._lastPos) < this._clickTolerance && this.element.click(), this.reset();\n }, Ar.prototype.reset = function () {\n this.mouseRotate.reset(), this.mousePitch && this.mousePitch.reset(), delete this._startPos, delete this._lastPos, this.offTemp();\n };\n var Lr = {\n center: "translate(-50%,-50%)",\n top: "translate(-50%,0)",\n "top-left": "translate(0,0)",\n "top-right": "translate(-100%,0)",\n bottom: "translate(-50%,-100%)",\n "bottom-left": "translate(0,-100%)",\n "bottom-right": "translate(-100%,-100%)",\n left: "translate(0,-50%)",\n right: "translate(-100%,-50%)"\n };\n\n function Rr(t, e, i) {\n var o = t.classList;\n\n for (var r in Lr) {\n o.remove("mapboxgl-" + i + "-anchor-" + r);\n }\n\n o.add("mapboxgl-" + i + "-anchor-" + e);\n }\n\n var kr,\n Br = function (e) {\n function o(o, r) {\n if (e.call(this), (o instanceof t.window.HTMLElement || r) && (o = t.extend({\n element: o\n }, r)), t.bindAll(["_update", "_onMove", "_onUp", "_addDragHandler", "_onMapClick", "_onKeyPress"], this), this._anchor = o && o.anchor || "center", this._color = o && o.color || "#3FB1CE", this._scale = o && o.scale || 1, this._draggable = o && o.draggable || !1, this._clickTolerance = o && o.clickTolerance || 0, this._isDragging = !1, this._state = "inactive", this._rotation = o && o.rotation || 0, this._rotationAlignment = o && o.rotationAlignment || "auto", this._pitchAlignment = o && o.pitchAlignment && "auto" !== o.pitchAlignment ? o.pitchAlignment : this._rotationAlignment, o && o.element) this._element = o.element, this._offset = t.Point.convert(o && o.offset || [0, 0]);else {\n this._defaultMarker = !0, this._element = i.create("div"), this._element.setAttribute("aria-label", "Map marker");\n var a = i.createNS("http://www.w3.org/2000/svg", "svg");\n a.setAttributeNS(null, "display", "block"), a.setAttributeNS(null, "height", "41px"), a.setAttributeNS(null, "width", "27px"), a.setAttributeNS(null, "viewBox", "0 0 27 41");\n var n = i.createNS("http://www.w3.org/2000/svg", "g");\n n.setAttributeNS(null, "stroke", "none"), n.setAttributeNS(null, "stroke-width", "1"), n.setAttributeNS(null, "fill", "none"), n.setAttributeNS(null, "fill-rule", "evenodd");\n var s = i.createNS("http://www.w3.org/2000/svg", "g");\n s.setAttributeNS(null, "fill-rule", "nonzero");\n var l = i.createNS("http://www.w3.org/2000/svg", "g");\n l.setAttributeNS(null, "transform", "translate(3.0, 29.0)"), l.setAttributeNS(null, "fill", "#000000");\n\n for (var c = 0, u = [{\n rx: "10.5",\n ry: "5.25002273"\n }, {\n rx: "10.5",\n ry: "5.25002273"\n }, {\n rx: "9.5",\n ry: "4.77275007"\n }, {\n rx: "8.5",\n ry: "4.29549936"\n }, {\n rx: "7.5",\n ry: "3.81822308"\n }, {\n rx: "6.5",\n ry: "3.34094679"\n }, {\n rx: "5.5",\n ry: "2.86367051"\n }, {\n rx: "4.5",\n ry: "2.38636864"\n }]; c < u.length; c += 1) {\n var h = u[c],\n p = i.createNS("http://www.w3.org/2000/svg", "ellipse");\n p.setAttributeNS(null, "opacity", "0.04"), p.setAttributeNS(null, "cx", "10.5"), p.setAttributeNS(null, "cy", "5.80029008"), p.setAttributeNS(null, "rx", h.rx), p.setAttributeNS(null, "ry", h.ry), l.appendChild(p);\n }\n\n var d = i.createNS("http://www.w3.org/2000/svg", "g");\n d.setAttributeNS(null, "fill", this._color);\n\n var _ = i.createNS("http://www.w3.org/2000/svg", "path");\n\n _.setAttributeNS(null, "d", "M27,13.5 C27,19.074644 20.250001,27.000002 14.75,34.500002 C14.016665,35.500004 12.983335,35.500004 12.25,34.500002 C6.7499993,27.000002 0,19.222562 0,13.5 C0,6.0441559 6.0441559,0 13.5,0 C20.955844,0 27,6.0441559 27,13.5 Z"), d.appendChild(_);\n var f = i.createNS("http://www.w3.org/2000/svg", "g");\n f.setAttributeNS(null, "opacity", "0.25"), f.setAttributeNS(null, "fill", "#000000");\n var m = i.createNS("http://www.w3.org/2000/svg", "path");\n m.setAttributeNS(null, "d", "M13.5,0 C6.0441559,0 0,6.0441559 0,13.5 C0,19.222562 6.7499993,27 12.25,34.5 C13,35.522727 14.016664,35.500004 14.75,34.5 C20.250001,27 27,19.074644 27,13.5 C27,6.0441559 20.955844,0 13.5,0 Z M13.5,1 C20.415404,1 26,6.584596 26,13.5 C26,15.898657 24.495584,19.181431 22.220703,22.738281 C19.945823,26.295132 16.705119,30.142167 13.943359,33.908203 C13.743445,34.180814 13.612715,34.322738 13.5,34.441406 C13.387285,34.322738 13.256555,34.180814 13.056641,33.908203 C10.284481,30.127985 7.4148684,26.314159 5.015625,22.773438 C2.6163816,19.232715 1,15.953538 1,13.5 C1,6.584596 6.584596,1 13.5,1 Z"), f.appendChild(m);\n var g = i.createNS("http://www.w3.org/2000/svg", "g");\n g.setAttributeNS(null, "transform", "translate(6.0, 7.0)"), g.setAttributeNS(null, "fill", "#FFFFFF");\n var v = i.createNS("http://www.w3.org/2000/svg", "g");\n v.setAttributeNS(null, "transform", "translate(8.0, 8.0)");\n var y = i.createNS("http://www.w3.org/2000/svg", "circle");\n y.setAttributeNS(null, "fill", "#000000"), y.setAttributeNS(null, "opacity", "0.25"), y.setAttributeNS(null, "cx", "5.5"), y.setAttributeNS(null, "cy", "5.5"), y.setAttributeNS(null, "r", "5.4999962");\n var x = i.createNS("http://www.w3.org/2000/svg", "circle");\n x.setAttributeNS(null, "fill", "#FFFFFF"), x.setAttributeNS(null, "cx", "5.5"), x.setAttributeNS(null, "cy", "5.5"), x.setAttributeNS(null, "r", "5.4999962"), v.appendChild(y), v.appendChild(x), s.appendChild(l), s.appendChild(d), s.appendChild(f), s.appendChild(g), s.appendChild(v), a.appendChild(s), a.setAttributeNS(null, "height", 41 * this._scale + "px"), a.setAttributeNS(null, "width", 27 * this._scale + "px"), this._element.appendChild(a), this._offset = t.Point.convert(o && o.offset || [0, -14]);\n }\n this._element.classList.add("mapboxgl-marker"), this._element.addEventListener("dragstart", function (t) {\n t.preventDefault();\n }), this._element.addEventListener("mousedown", function (t) {\n t.preventDefault();\n }), Rr(this._element, this._anchor, "marker"), this._popup = null;\n }\n\n return e && (o.__proto__ = e), (o.prototype = Object.create(e && e.prototype)).constructor = o, o.prototype.addTo = function (t) {\n return this.remove(), this._map = t, t.getCanvasContainer().appendChild(this._element), t.on("move", this._update), t.on("moveend", this._update), this.setDraggable(this._draggable), this._update(), this._map.on("click", this._onMapClick), this;\n }, o.prototype.remove = function () {\n return this._map && (this._map.off("click", this._onMapClick), this._map.off("move", this._update), this._map.off("moveend", this._update), this._map.off("mousedown", this._addDragHandler), this._map.off("touchstart", this._addDragHandler), this._map.off("mouseup", this._onUp), this._map.off("touchend", this._onUp), this._map.off("mousemove", this._onMove), this._map.off("touchmove", this._onMove), delete this._map), i.remove(this._element), this._popup && this._popup.remove(), this;\n }, o.prototype.getLngLat = function () {\n return this._lngLat;\n }, o.prototype.setLngLat = function (e) {\n return this._lngLat = t.LngLat.convert(e), this._pos = null, this._popup && this._popup.setLngLat(this._lngLat), this._update(), this;\n }, o.prototype.getElement = function () {\n return this._element;\n }, o.prototype.setPopup = function (t) {\n if (this._popup && (this._popup.remove(), this._popup = null, this._element.removeEventListener("keypress", this._onKeyPress), this._originalTabIndex || this._element.removeAttribute("tabindex")), t) {\n if (!("offset" in t.options)) {\n var e = Math.sqrt(Math.pow(13.5, 2) / 2);\n t.options.offset = this._defaultMarker ? {\n top: [0, 0],\n "top-left": [0, 0],\n "top-right": [0, 0],\n bottom: [0, -38.1],\n "bottom-left": [e, -1 * (24.6 + e)],\n "bottom-right": [-e, -1 * (24.6 + e)],\n left: [13.5, -24.6],\n right: [-13.5, -24.6]\n } : this._offset;\n }\n\n this._popup = t, this._lngLat && this._popup.setLngLat(this._lngLat), this._originalTabIndex = this._element.getAttribute("tabindex"), this._originalTabIndex || this._element.setAttribute("tabindex", "0"), this._element.addEventListener("keypress", this._onKeyPress);\n }\n\n return this;\n }, o.prototype._onKeyPress = function (t) {\n var e = t.code,\n i = t.charCode || t.keyCode;\n "Space" !== e && "Enter" !== e && 32 !== i && 13 !== i || this.togglePopup();\n }, o.prototype._onMapClick = function (t) {\n var e = t.originalEvent.target,\n i = this._element;\n this._popup && (e === i || i.contains(e)) && this.togglePopup();\n }, o.prototype.getPopup = function () {\n return this._popup;\n }, o.prototype.togglePopup = function () {\n var t = this._popup;\n return t ? (t.isOpen() ? t.remove() : t.addTo(this._map), this) : this;\n }, o.prototype._update = function (t) {\n if (this._map) {\n this._map.transform.renderWorldCopies && (this._lngLat = Mr(this._lngLat, this._pos, this._map.transform)), this._pos = this._map.project(this._lngLat)._add(this._offset);\n var e = "";\n "viewport" === this._rotationAlignment || "auto" === this._rotationAlignment ? e = "rotateZ(" + this._rotation + "deg)" : "map" === this._rotationAlignment && (e = "rotateZ(" + (this._rotation - this._map.getBearing()) + "deg)");\n var o = "";\n "viewport" === this._pitchAlignment || "auto" === this._pitchAlignment ? o = "rotateX(0deg)" : "map" === this._pitchAlignment && (o = "rotateX(" + this._map.getPitch() + "deg)"), t && "moveend" !== t.type || (this._pos = this._pos.round()), i.setTransform(this._element, Lr[this._anchor] + " translate(" + this._pos.x + "px, " + this._pos.y + "px) " + o + " " + e);\n }\n }, o.prototype.getOffset = function () {\n return this._offset;\n }, o.prototype.setOffset = function (e) {\n return this._offset = t.Point.convert(e), this._update(), this;\n }, o.prototype._onMove = function (e) {\n if (!this._isDragging) {\n var i = this._clickTolerance || this._map._clickTolerance;\n this._isDragging = e.point.dist(this._pointerdownPos) >= i;\n }\n\n this._isDragging && (this._pos = e.point.sub(this._positionDelta), this._lngLat = this._map.unproject(this._pos), this.setLngLat(this._lngLat), this._element.style.pointerEvents = "none", "pending" === this._state && (this._state = "active", this.fire(new t.Event("dragstart"))), this.fire(new t.Event("drag")));\n }, o.prototype._onUp = function () {\n this._element.style.pointerEvents = "auto", this._positionDelta = null, this._pointerdownPos = null, this._isDragging = !1, this._map.off("mousemove", this._onMove), this._map.off("touchmove", this._onMove), "active" === this._state && this.fire(new t.Event("dragend")), this._state = "inactive";\n }, o.prototype._addDragHandler = function (t) {\n this._element.contains(t.originalEvent.target) && (t.preventDefault(), this._positionDelta = t.point.sub(this._pos).add(this._offset), this._pointerdownPos = t.point, this._state = "pending", this._map.on("mousemove", this._onMove), this._map.on("touchmove", this._onMove), this._map.once("mouseup", this._onUp), this._map.once("touchend", this._onUp));\n }, o.prototype.setDraggable = function (t) {\n return this._draggable = !!t, this._map && (t ? (this._map.on("mousedown", this._addDragHandler), this._map.on("touchstart", this._addDragHandler)) : (this._map.off("mousedown", this._addDragHandler), this._map.off("touchstart", this._addDragHandler))), this;\n }, o.prototype.isDraggable = function () {\n return this._draggable;\n }, o.prototype.setRotation = function (t) {\n return this._rotation = t || 0, this._update(), this;\n }, o.prototype.getRotation = function () {\n return this._rotation;\n }, o.prototype.setRotationAlignment = function (t) {\n return this._rotationAlignment = t || "auto", this._update(), this;\n }, o.prototype.getRotationAlignment = function () {\n return this._rotationAlignment;\n }, o.prototype.setPitchAlignment = function (t) {\n return this._pitchAlignment = t && "auto" !== t ? t : this._rotationAlignment, this._update(), this;\n }, o.prototype.getPitchAlignment = function () {\n return this._pitchAlignment;\n }, o;\n }(t.Evented),\n Or = {\n positionOptions: {\n enableHighAccuracy: !1,\n maximumAge: 0,\n timeout: 6e3\n },\n fitBoundsOptions: {\n maxZoom: 15\n },\n trackUserLocation: !1,\n showAccuracyCircle: !0,\n showUserLocation: !0\n },\n Fr = 0,\n Ur = !1,\n Nr = function (e) {\n function o(i) {\n e.call(this), this.options = t.extend({}, Or, i), t.bindAll(["_onSuccess", "_onError", "_onZoom", "_finish", "_setupUI", "_updateCamera", "_updateMarker"], this);\n }\n\n return e && (o.__proto__ = e), (o.prototype = Object.create(e && e.prototype)).constructor = o, o.prototype.onAdd = function (e) {\n var o;\n return this._map = e, this._container = i.create("div", "mapboxgl-ctrl mapboxgl-ctrl-group"), o = this._setupUI, void 0 !== kr ? o(kr) : void 0 !== t.window.navigator.permissions ? t.window.navigator.permissions.query({\n name: "geolocation"\n }).then(function (t) {\n o(kr = "denied" !== t.state);\n }) : o(kr = !!t.window.navigator.geolocation), this._container;\n }, o.prototype.onRemove = function () {\n void 0 !== this._geolocationWatchID && (t.window.navigator.geolocation.clearWatch(this._geolocationWatchID), this._geolocationWatchID = void 0), this.options.showUserLocation && this._userLocationDotMarker && this._userLocationDotMarker.remove(), this.options.showAccuracyCircle && this._accuracyCircleMarker && this._accuracyCircleMarker.remove(), i.remove(this._container), this._map.off("zoom", this._onZoom), this._map = void 0, Fr = 0, Ur = !1;\n }, o.prototype._isOutOfMapMaxBounds = function (t) {\n var e = this._map.getMaxBounds(),\n i = t.coords;\n\n return e && (i.longitude < e.getWest() || i.longitude > e.getEast() || i.latitude < e.getSouth() || i.latitude > e.getNorth());\n }, o.prototype._setErrorState = function () {\n switch (this._watchState) {\n case "WAITING_ACTIVE":\n this._watchState = "ACTIVE_ERROR", this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-active"), this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-active-error");\n break;\n\n case "ACTIVE_LOCK":\n this._watchState = "ACTIVE_ERROR", this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-active"), this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-active-error"), this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-waiting");\n break;\n\n case "BACKGROUND":\n this._watchState = "BACKGROUND_ERROR", this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-background"), this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-background-error"), this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-waiting");\n }\n }, o.prototype._onSuccess = function (e) {\n if (this._map) {\n if (this._isOutOfMapMaxBounds(e)) return this._setErrorState(), this.fire(new t.Event("outofmaxbounds", e)), this._updateMarker(), void this._finish();\n if (this.options.trackUserLocation) switch (this._lastKnownPosition = e, this._watchState) {\n case "WAITING_ACTIVE":\n case "ACTIVE_LOCK":\n case "ACTIVE_ERROR":\n this._watchState = "ACTIVE_LOCK", this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-waiting"), this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-active-error"), this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-active");\n break;\n\n case "BACKGROUND":\n case "BACKGROUND_ERROR":\n this._watchState = "BACKGROUND", this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-waiting"), this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-background-error"), this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-background");\n }\n this.options.showUserLocation && "OFF" !== this._watchState && this._updateMarker(e), this.options.trackUserLocation && "ACTIVE_LOCK" !== this._watchState || this._updateCamera(e), this.options.showUserLocation && this._dotElement.classList.remove("mapboxgl-user-location-dot-stale"), this.fire(new t.Event("geolocate", e)), this._finish();\n }\n }, o.prototype._updateCamera = function (e) {\n var i = new t.LngLat(e.coords.longitude, e.coords.latitude),\n o = e.coords.accuracy,\n r = this._map.getBearing(),\n a = t.extend({\n bearing: r\n }, this.options.fitBoundsOptions);\n\n this._map.fitBounds(i.toBounds(o), a, {\n geolocateSource: !0\n });\n }, o.prototype._updateMarker = function (e) {\n if (e) {\n var i = new t.LngLat(e.coords.longitude, e.coords.latitude);\n this._accuracyCircleMarker.setLngLat(i).addTo(this._map), this._userLocationDotMarker.setLngLat(i).addTo(this._map), this._accuracy = e.coords.accuracy, this.options.showUserLocation && this.options.showAccuracyCircle && this._updateCircleRadius();\n } else this._userLocationDotMarker.remove(), this._accuracyCircleMarker.remove();\n }, o.prototype._updateCircleRadius = function () {\n var t = this._map._container.clientHeight / 2,\n e = this._map.unproject([0, t]),\n i = this._map.unproject([1, t]),\n o = e.distanceTo(i),\n r = Math.ceil(2 * this._accuracy / o);\n\n this._circleElement.style.width = r + "px", this._circleElement.style.height = r + "px";\n }, o.prototype._onZoom = function () {\n this.options.showUserLocation && this.options.showAccuracyCircle && this._updateCircleRadius();\n }, o.prototype._onError = function (e) {\n if (this._map) {\n if (this.options.trackUserLocation) if (1 === e.code) {\n this._watchState = "OFF", this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-waiting"), this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-active"), this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-active-error"), this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-background"), this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-background-error"), this._geolocateButton.disabled = !0;\n\n var i = this._map._getUIString("GeolocateControl.LocationNotAvailable");\n\n this._geolocateButton.title = i, this._geolocateButton.setAttribute("aria-label", i), void 0 !== this._geolocationWatchID && this._clearWatch();\n } else {\n if (3 === e.code && Ur) return;\n\n this._setErrorState();\n }\n "OFF" !== this._watchState && this.options.showUserLocation && this._dotElement.classList.add("mapboxgl-user-location-dot-stale"), this.fire(new t.Event("error", e)), this._finish();\n }\n }, o.prototype._finish = function () {\n this._timeoutId && clearTimeout(this._timeoutId), this._timeoutId = void 0;\n }, o.prototype._setupUI = function (e) {\n var o = this;\n\n if (this._container.addEventListener("contextmenu", function (t) {\n return t.preventDefault();\n }), this._geolocateButton = i.create("button", "mapboxgl-ctrl-geolocate", this._container), i.create("span", "mapboxgl-ctrl-icon", this._geolocateButton).setAttribute("aria-hidden", !0), this._geolocateButton.type = "button", !1 === e) {\n t.warnOnce("Geolocation support is not available so the GeolocateControl will be disabled.");\n\n var r = this._map._getUIString("GeolocateControl.LocationNotAvailable");\n\n this._geolocateButton.disabled = !0, this._geolocateButton.title = r, this._geolocateButton.setAttribute("aria-label", r);\n } else {\n var a = this._map._getUIString("GeolocateControl.FindMyLocation");\n\n this._geolocateButton.title = a, this._geolocateButton.setAttribute("aria-label", a);\n }\n\n this.options.trackUserLocation && (this._geolocateButton.setAttribute("aria-pressed", "false"), this._watchState = "OFF"), this.options.showUserLocation && (this._dotElement = i.create("div", "mapboxgl-user-location-dot"), this._userLocationDotMarker = new Br(this._dotElement), this._circleElement = i.create("div", "mapboxgl-user-location-accuracy-circle"), this._accuracyCircleMarker = new Br({\n element: this._circleElement,\n pitchAlignment: "map"\n }), this.options.trackUserLocation && (this._watchState = "OFF"), this._map.on("zoom", this._onZoom)), this._geolocateButton.addEventListener("click", this.trigger.bind(this)), this._setup = !0, this.options.trackUserLocation && this._map.on("movestart", function (e) {\n e.geolocateSource || "ACTIVE_LOCK" !== o._watchState || e.originalEvent && "resize" === e.originalEvent.type || (o._watchState = "BACKGROUND", o._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-background"), o._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-active"), o.fire(new t.Event("trackuserlocationend")));\n });\n }, o.prototype.trigger = function () {\n if (!this._setup) return t.warnOnce("Geolocate control triggered before added to a map"), !1;\n\n if (this.options.trackUserLocation) {\n switch (this._watchState) {\n case "OFF":\n this._watchState = "WAITING_ACTIVE", this.fire(new t.Event("trackuserlocationstart"));\n break;\n\n case "WAITING_ACTIVE":\n case "ACTIVE_LOCK":\n case "ACTIVE_ERROR":\n case "BACKGROUND_ERROR":\n Fr--, Ur = !1, this._watchState = "OFF", this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-waiting"), this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-active"), this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-active-error"), this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-background"), this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-background-error"), this.fire(new t.Event("trackuserlocationend"));\n break;\n\n case "BACKGROUND":\n this._watchState = "ACTIVE_LOCK", this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-background"), this._lastKnownPosition && this._updateCamera(this._lastKnownPosition), this.fire(new t.Event("trackuserlocationstart"));\n }\n\n switch (this._watchState) {\n case "WAITING_ACTIVE":\n this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-waiting"), this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-active");\n break;\n\n case "ACTIVE_LOCK":\n this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-active");\n\n break;\n\n case "ACTIVE_ERROR":\n this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-waiting"), this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-active-error");\n break;\n\n case "BACKGROUND":\n this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-background");\n\n break;\n\n case "BACKGROUND_ERROR":\n this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-waiting"), this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-background-error");\n }\n\n if ("OFF" === this._watchState && void 0 !== this._geolocationWatchID) this._clearWatch();else if (void 0 === this._geolocationWatchID) {\n var e;\n this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-waiting"), this._geolocateButton.setAttribute("aria-pressed", "true"), ++Fr > 1 ? (e = {\n maximumAge: 6e5,\n timeout: 0\n }, Ur = !0) : (e = this.options.positionOptions, Ur = !1), this._geolocationWatchID = t.window.navigator.geolocation.watchPosition(this._onSuccess, this._onError, e);\n }\n } else t.window.navigator.geolocation.getCurrentPosition(this._onSuccess, this._onError, this.options.positionOptions), this._timeoutId = setTimeout(this._finish, 1e4);\n\n return !0;\n }, o.prototype._clearWatch = function () {\n t.window.navigator.geolocation.clearWatch(this._geolocationWatchID), this._geolocationWatchID = void 0, this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-waiting"), this._geolocateButton.setAttribute("aria-pressed", "false"), this.options.showUserLocation && this._updateMarker(null);\n }, o;\n }(t.Evented),\n Zr = {\n maxWidth: 100,\n unit: "metric"\n },\n qr = function qr(e) {\n this.options = t.extend({}, Zr, e), t.bindAll(["_onMove", "setUnit"], this);\n };\n\n function jr(t, e, i) {\n var o = i && i.maxWidth || 100,\n r = t._container.clientHeight / 2,\n a = t.unproject([0, r]),\n n = t.unproject([o, r]),\n s = a.distanceTo(n);\n\n if (i && "imperial" === i.unit) {\n var l = 3.2808 * s;\n l > 5280 ? Vr(e, o, l / 5280, t._getUIString("ScaleControl.Miles")) : Vr(e, o, l, t._getUIString("ScaleControl.Feet"));\n } else i && "nautical" === i.unit ? Vr(e, o, s / 1852, t._getUIString("ScaleControl.NauticalMiles")) : s >= 1e3 ? Vr(e, o, s / 1e3, t._getUIString("ScaleControl.Kilometers")) : Vr(e, o, s, t._getUIString("ScaleControl.Meters"));\n }\n\n function Vr(t, e, i, o) {\n var r,\n a,\n n,\n s = (r = i, (a = Math.pow(10, ("" + Math.floor(r)).length - 1)) * (n = (n = r / a) >= 10 ? 10 : n >= 5 ? 5 : n >= 3 ? 3 : n >= 2 ? 2 : n >= 1 ? 1 : function (t) {\n var e = Math.pow(10, Math.ceil(-Math.log(t) / Math.LN10));\n return Math.round(t * e) / e;\n }(n)));\n t.style.width = e * (s / i) + "px", t.innerHTML = s + " " + o;\n }\n\n qr.prototype.getDefaultPosition = function () {\n return "bottom-left";\n }, qr.prototype._onMove = function () {\n jr(this._map, this._container, this.options);\n }, qr.prototype.onAdd = function (t) {\n return this._map = t, this._container = i.create("div", "mapboxgl-ctrl mapboxgl-ctrl-scale", t.getContainer()), this._map.on("move", this._onMove), this._onMove(), this._container;\n }, qr.prototype.onRemove = function () {\n i.remove(this._container), this._map.off("move", this._onMove), this._map = void 0;\n }, qr.prototype.setUnit = function (t) {\n this.options.unit = t, jr(this._map, this._container, this.options);\n };\n\n var Gr = function Gr(e) {\n this._fullscreen = !1, e && e.container && (e.container instanceof t.window.HTMLElement ? this._container = e.container : t.warnOnce("Full screen control \'container\' must be a DOM element.")), t.bindAll(["_onClickFullscreen", "_changeIcon"], this), "onfullscreenchange" in t.window.document ? this._fullscreenchange = "fullscreenchange" : "onmozfullscreenchange" in t.window.document ? this._fullscreenchange = "mozfullscreenchange" : "onwebkitfullscreenchange" in t.window.document ? this._fullscreenchange = "webkitfullscreenchange" : "onmsfullscreenchange" in t.window.document && (this._fullscreenchange = "MSFullscreenChange");\n };\n\n Gr.prototype.onAdd = function (e) {\n return this._map = e, this._container || (this._container = this._map.getContainer()), this._controlContainer = i.create("div", "mapboxgl-ctrl mapboxgl-ctrl-group"), this._checkFullscreenSupport() ? this._setupUI() : (this._controlContainer.style.display = "none", t.warnOnce("This device does not support fullscreen mode.")), this._controlContainer;\n }, Gr.prototype.onRemove = function () {\n i.remove(this._controlContainer), this._map = null, t.window.document.removeEventListener(this._fullscreenchange, this._changeIcon);\n }, Gr.prototype._checkFullscreenSupport = function () {\n return !!(t.window.document.fullscreenEnabled || t.window.document.mozFullScreenEnabled || t.window.document.msFullscreenEnabled || t.window.document.webkitFullscreenEnabled);\n }, Gr.prototype._setupUI = function () {\n var e = this._fullscreenButton = i.create("button", "mapboxgl-ctrl-fullscreen", this._controlContainer);\n i.create("span", "mapboxgl-ctrl-icon", e).setAttribute("aria-hidden", !0), e.type = "button", this._updateTitle(), this._fullscreenButton.addEventListener("click", this._onClickFullscreen), t.window.document.addEventListener(this._fullscreenchange, this._changeIcon);\n }, Gr.prototype._updateTitle = function () {\n var t = this._getTitle();\n\n this._fullscreenButton.setAttribute("aria-label", t), this._fullscreenButton.title = t;\n }, Gr.prototype._getTitle = function () {\n return this._map._getUIString(this._isFullscreen() ? "FullscreenControl.Exit" : "FullscreenControl.Enter");\n }, Gr.prototype._isFullscreen = function () {\n return this._fullscreen;\n }, Gr.prototype._changeIcon = function () {\n (t.window.document.fullscreenElement || t.window.document.mozFullScreenElement || t.window.document.webkitFullscreenElement || t.window.document.msFullscreenElement) === this._container !== this._fullscreen && (this._fullscreen = !this._fullscreen, this._fullscreenButton.classList.toggle("mapboxgl-ctrl-shrink"), this._fullscreenButton.classList.toggle("mapboxgl-ctrl-fullscreen"), this._updateTitle());\n }, Gr.prototype._onClickFullscreen = function () {\n this._isFullscreen() ? t.window.document.exitFullscreen ? t.window.document.exitFullscreen() : t.window.document.mozCancelFullScreen ? t.window.document.mozCancelFullScreen() : t.window.document.msExitFullscreen ? t.window.document.msExitFullscreen() : t.window.document.webkitCancelFullScreen && t.window.document.webkitCancelFullScreen() : this._container.requestFullscreen ? this._container.requestFullscreen() : this._container.mozRequestFullScreen ? this._container.mozRequestFullScreen() : this._container.msRequestFullscreen ? this._container.msRequestFullscreen() : this._container.webkitRequestFullscreen && this._container.webkitRequestFullscreen();\n };\n\n var Wr = {\n closeButton: !0,\n closeOnClick: !0,\n focusAfterOpen: !0,\n className: "",\n maxWidth: "240px"\n },\n Xr = ["a[href]", "[tabindex]:not([tabindex=\'-1\'])", "[contenteditable]:not([contenteditable=\'false\'])", "button:not([disabled])", "input:not([disabled])", "select:not([disabled])", "textarea:not([disabled])"].join(", "),\n Hr = function (e) {\n function o(i) {\n e.call(this), this.options = t.extend(Object.create(Wr), i), t.bindAll(["_update", "_onClose", "remove", "_onMouseMove", "_onMouseUp", "_onDrag"], this);\n }\n\n return e && (o.__proto__ = e), (o.prototype = Object.create(e && e.prototype)).constructor = o, o.prototype.addTo = function (e) {\n return this._map && this.remove(), this._map = e, this.options.closeOnClick && this._map.on("click", this._onClose), this.options.closeOnMove && this._map.on("move", this._onClose), this._map.on("remove", this.remove), this._update(), this._focusFirstElement(), this._trackPointer ? (this._map.on("mousemove", this._onMouseMove), this._map.on("mouseup", this._onMouseUp), this._container && this._container.classList.add("mapboxgl-popup-track-pointer"), this._map._canvasContainer.classList.add("mapboxgl-track-pointer")) : this._map.on("move", this._update), this.fire(new t.Event("open")), this;\n }, o.prototype.isOpen = function () {\n return !!this._map;\n }, o.prototype.remove = function () {\n return this._content && i.remove(this._content), this._container && (i.remove(this._container), delete this._container), this._map && (this._map.off("move", this._update), this._map.off("move", this._onClose), this._map.off("click", this._onClose), this._map.off("remove", this.remove), this._map.off("mousemove", this._onMouseMove), this._map.off("mouseup", this._onMouseUp), this._map.off("drag", this._onDrag), delete this._map), this.fire(new t.Event("close")), this;\n }, o.prototype.getLngLat = function () {\n return this._lngLat;\n }, o.prototype.setLngLat = function (e) {\n return this._lngLat = t.LngLat.convert(e), this._pos = null, this._trackPointer = !1, this._update(), this._map && (this._map.on("move", this._update), this._map.off("mousemove", this._onMouseMove), this._container && this._container.classList.remove("mapboxgl-popup-track-pointer"), this._map._canvasContainer.classList.remove("mapboxgl-track-pointer")), this;\n }, o.prototype.trackPointer = function () {\n return this._trackPointer = !0, this._pos = null, this._update(), this._map && (this._map.off("move", this._update), this._map.on("mousemove", this._onMouseMove), this._map.on("drag", this._onDrag), this._container && this._container.classList.add("mapboxgl-popup-track-pointer"), this._map._canvasContainer.classList.add("mapboxgl-track-pointer")), this;\n }, o.prototype.getElement = function () {\n return this._container;\n }, o.prototype.setText = function (e) {\n return this.setDOMContent(t.window.document.createTextNode(e));\n }, o.prototype.setHTML = function (e) {\n var i,\n o = t.window.document.createDocumentFragment(),\n r = t.window.document.createElement("body");\n\n for (r.innerHTML = e; i = r.firstChild;) {\n o.appendChild(i);\n }\n\n return this.setDOMContent(o);\n }, o.prototype.getMaxWidth = function () {\n return this._container && this._container.style.maxWidth;\n }, o.prototype.setMaxWidth = function (t) {\n return this.options.maxWidth = t, this._update(), this;\n }, o.prototype.setDOMContent = function (t) {\n if (this._content) for (; this._content.hasChildNodes();) {\n this._content.firstChild && this._content.removeChild(this._content.firstChild);\n } else this._content = i.create("div", "mapboxgl-popup-content", this._container);\n return this._content.appendChild(t), this._createCloseButton(), this._update(), this._focusFirstElement(), this;\n }, o.prototype.addClassName = function (t) {\n this._container && this._container.classList.add(t);\n }, o.prototype.removeClassName = function (t) {\n this._container && this._container.classList.remove(t);\n }, o.prototype.setOffset = function (t) {\n return this.options.offset = t, this._update(), this;\n }, o.prototype.toggleClassName = function (t) {\n if (this._container) return this._container.classList.toggle(t);\n }, o.prototype._createCloseButton = function () {\n this.options.closeButton && (this._closeButton = i.create("button", "mapboxgl-popup-close-button", this._content), this._closeButton.type = "button", this._closeButton.setAttribute("aria-label", "Close popup"), this._closeButton.innerHTML = "×", this._closeButton.addEventListener("click", this._onClose));\n }, o.prototype._onMouseUp = function (t) {\n this._update(t.point);\n }, o.prototype._onMouseMove = function (t) {\n this._update(t.point);\n }, o.prototype._onDrag = function (t) {\n this._update(t.point);\n }, o.prototype._update = function (e) {\n var o = this;\n\n if (this._map && (this._lngLat || this._trackPointer) && this._content && (this._container || (this._container = i.create("div", "mapboxgl-popup", this._map.getContainer()), this._tip = i.create("div", "mapboxgl-popup-tip", this._container), this._container.appendChild(this._content), this.options.className && this.options.className.split(" ").forEach(function (t) {\n return o._container.classList.add(t);\n }), this._trackPointer && this._container.classList.add("mapboxgl-popup-track-pointer")), this.options.maxWidth && this._container.style.maxWidth !== this.options.maxWidth && (this._container.style.maxWidth = this.options.maxWidth), this._map.transform.renderWorldCopies && !this._trackPointer && (this._lngLat = Mr(this._lngLat, this._pos, this._map.transform)), !this._trackPointer || e)) {\n var r = this._pos = this._trackPointer && e ? e : this._map.project(this._lngLat),\n a = this.options.anchor,\n n = function e(i) {\n if (i) {\n if ("number" == typeof i) {\n var o = Math.round(Math.sqrt(.5 * Math.pow(i, 2)));\n return {\n center: new t.Point(0, 0),\n top: new t.Point(0, i),\n "top-left": new t.Point(o, o),\n "top-right": new t.Point(-o, o),\n bottom: new t.Point(0, -i),\n "bottom-left": new t.Point(o, -o),\n "bottom-right": new t.Point(-o, -o),\n left: new t.Point(i, 0),\n right: new t.Point(-i, 0)\n };\n }\n\n if (i instanceof t.Point || Array.isArray(i)) {\n var r = t.Point.convert(i);\n return {\n center: r,\n top: r,\n "top-left": r,\n "top-right": r,\n bottom: r,\n "bottom-left": r,\n "bottom-right": r,\n left: r,\n right: r\n };\n }\n\n return {\n center: t.Point.convert(i.center || [0, 0]),\n top: t.Point.convert(i.top || [0, 0]),\n "top-left": t.Point.convert(i["top-left"] || [0, 0]),\n "top-right": t.Point.convert(i["top-right"] || [0, 0]),\n bottom: t.Point.convert(i.bottom || [0, 0]),\n "bottom-left": t.Point.convert(i["bottom-left"] || [0, 0]),\n "bottom-right": t.Point.convert(i["bottom-right"] || [0, 0]),\n left: t.Point.convert(i.left || [0, 0]),\n right: t.Point.convert(i.right || [0, 0])\n };\n }\n\n return e(new t.Point(0, 0));\n }(this.options.offset);\n\n if (!a) {\n var s,\n l = this._container.offsetWidth,\n c = this._container.offsetHeight;\n s = r.y + n.bottom.y < c ? ["top"] : r.y > this._map.transform.height - c ? ["bottom"] : [], r.x < l / 2 ? s.push("left") : r.x > this._map.transform.width - l / 2 && s.push("right"), a = 0 === s.length ? "bottom" : s.join("-");\n }\n\n var u = r.add(n[a]).round();\n i.setTransform(this._container, Lr[a] + " translate(" + u.x + "px," + u.y + "px)"), Rr(this._container, a, "popup");\n }\n }, o.prototype._focusFirstElement = function () {\n if (this.options.focusAfterOpen && this._container) {\n var t = this._container.querySelector(Xr);\n\n t && t.focus();\n }\n }, o.prototype._onClose = function () {\n this.remove();\n }, o;\n }(t.Evented),\n Kr = {\n version: t.version,\n supported: e,\n setRTLTextPlugin: t.setRTLTextPlugin,\n getRTLTextPluginStatus: t.getRTLTextPluginStatus,\n Map: Sr,\n NavigationControl: Dr,\n GeolocateControl: Nr,\n AttributionControl: yr,\n ScaleControl: qr,\n FullscreenControl: Gr,\n Popup: Hr,\n Marker: Br,\n Style: je,\n LngLat: t.LngLat,\n LngLatBounds: t.LngLatBounds,\n Point: t.Point,\n MercatorCoordinate: t.MercatorCoordinate,\n Evented: t.Evented,\n config: t.config,\n prewarm: function prewarm() {\n Ft().acquire(Rt);\n },\n clearPrewarmedResources: function clearPrewarmedResources() {\n var t = Bt;\n t && (t.isPreloaded() && 1 === t.numActive() ? (t.release(Rt), Bt = null) : console.warn("Could not clear WebWorkers since there are active Map instances that still reference it. The pre-warmed WebWorker pool can only be cleared when all map instances have been removed with map.remove()"));\n },\n\n get accessToken() {\n return t.config.ACCESS_TOKEN;\n },\n\n set accessToken(e) {\n t.config.ACCESS_TOKEN = e;\n },\n\n get baseApiUrl() {\n return t.config.API_URL;\n },\n\n set baseApiUrl(e) {\n t.config.API_URL = e;\n },\n\n get workerCount() {\n return kt.workerCount;\n },\n\n set workerCount(t) {\n kt.workerCount = t;\n },\n\n get maxParallelImageRequests() {\n return t.config.MAX_PARALLEL_IMAGE_REQUESTS;\n },\n\n set maxParallelImageRequests(e) {\n t.config.MAX_PARALLEL_IMAGE_REQUESTS = e;\n },\n\n clearStorage: function clearStorage(e) {\n t.clearTileCache(e);\n },\n workerUrl: ""\n };\n\n return Kr;\n }); //\n\n return mapboxgl;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9tYXBib3gtZ2wvZGlzdC9tYXBib3gtZ2wuanM/M2E5MSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxtQkFBTyxDQUFDLElBQWtDOztBQUUxQztBQUNBO0FBQ0EsRUFBRSxLQUE0RCxnQ0FBZ0MsQ0FBcUg7QUFDbk4sQ0FBQztBQUNEO0FBQ0E7O0FBRUEsK0JBQStCO0FBQy9COztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTCxxREFBcUQsK0JBQStCLCtCQUErQjtBQUNuSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDs7QUFFQSxvREFBb0QsT0FBTztBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsWUFBWSxPQUFPO0FBQ25CO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7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Q0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtB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QUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCLHlCQUF5QjtBQUN6QjtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQixpQkFBaUI7QUFDakIsa0JBQWtCO0FBQ2xCLGlCQUFpQjtBQUNqQixrQkFBa0I7QUFDbEIsZ0JBQWdCO0FBQ2hCLG1CQUFtQjtBQUNuQixpQkFBaUI7QUFDakIsaUJBQWlCO0FBQ2pCLGtCQUFrQjtBQUNsQixpQkFBaUI7QUFDakIsb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QjtBQUN4QiwyQkFBMkI7QUFDM0Isd0JBQXdCO0FBQ3hCO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQixtQkFBbUI7QUFDbkI7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGdEQUFnRCxTQUFTO0FBQ3pEO0FBQ0E7O0FBRUEsNEJBQTRCLGNBQWM7QUFDMUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQSw0QkFBNEIsY0FBYztBQUMxQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSx1REFBdUQsY0FBYztBQUNyRTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMLHdEQUF3RCxjQUFjO0FBQ3RFO0FBQ0EscURBQXFEO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhCQUE4QixjQUFjO0FBQzVDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsK0NBQStDLGNBQWM7QUFDN0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLLHlDQUF5QztBQUM5QztBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87O0FBRVAsc0JBQXNCLGNBQWM7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0wscUJBQXFCLHNCQUFzQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFP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S0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLDRCQUE0QixjQUFjO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscUJBQXFCLGNBQWM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUEsdUNBQXVDLGNBQWM7QUFDckQ7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTCwyREFBMkQsd0JBQXdCO0FBQ25GO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7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O0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0RBQWdELEtBQUs7QUFDckQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQSx3REFBd0Q7QUFDeEQsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxxQ0FBcUMsY0FBYztBQUNuRDtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQO0FBQ0EscUNBQXFDLGNBQWM7QUFDbkQ7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULGdDQUFnQyxjQUFjO0FBQzlDO0FBQ0E7O0FBRUE7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsZ0NBQWdDLGNBQWM7QUFDOUM7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLOztBQUVMO0FBQ0Esb0RBQW9EO0FBQ3BEO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDZDQUE2QyxxREFBcUQsZ0NBQWdDO0FBQ2xJO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPOztBQUVQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBLFNBQVM7QUFDVCx3Q0FBd0Msa0NBQWtDO0FBQzFFOztBQUVBLHNDQUFzQyxjQUFjO0FBQ3BEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx5QkFBeUIsZ0JBQWdCLG9CQUFvQjtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBLHdDQUF3QyxjQUFjO0FBQ3REO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CLDZDQUE2QztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLHNCQUFzQiw0QkFBNEI7QUFDN0U7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDZCQUE2QixjQUFjO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUVBQXVFO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5Q0FBeUMsY0FBYztBQUN2RDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSwwQ0FBMEM7QUFDMUMsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQSx5QkFBeUIsY0FBYztBQUN2QztBQUNBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSwyQkFBMkIsY0FBYztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGNBQWM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLDhEQUE4RCxJQUFJLElBQUksbUlBQW1JLCtEQUErRDtBQUN4UTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLGtCQUFrQjtBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTyxpS0FBaUs7QUFDeEs7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0EsYUFBYTtBQUNiLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7O0FBRVg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7O0FBRVg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXOztBQUVYO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9JQUFvSTtBQUNwSTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxVQUFVLHlEQUF5RCxVQUFVLCtCQUErQixNQUFNLHlEQUF5RCxNQUFNO0FBQzlOOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBLDhDQUE4QyxLQUFLO0FBQ25EO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLCtDQUErQyxjQUFjO0FBQzdEO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsdUJBQXVCLHFCQUFxQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBLHVCQUF1QixxQkFBcUI7QUFDNUM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpRUFBaUU7QUFDakUsS0FBSztBQUNMO0FBQ0EscUVBQXFFLGNBQWM7QUFDbkY7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCx5SkFBeUosUUFBUTtBQUNqSyx1QkFBdUIsUUFBUTtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDs7QUFFQSwrRUFBK0UsdUJBQXVCO0FBQ3RHO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSw0QkFBNEIsY0FBYztBQUMxQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0Esc0NBQXNDLGNBQWM7QUFDcEQ7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwyRUFBMkUsY0FBYztBQUN6Rjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw0QkFBNEIsY0FBYztBQUMxQztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNEJBQTRCLGNBQWM7QUFDMUM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFL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QUFxQztBQUM1QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7O0FBRUw7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7O0FBRUw7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7O0FBRUw7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQLEtBQUs7O0FBRUw7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7O0FBRUw7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1AsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7O0FBRUw7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1AsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1AsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7O0FBRUw7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQLEtBQUs7O0FBRUw7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1AsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7O0FBRUw7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1AsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUCxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTCx3Q0FBd0MsY0FBYztBQUN0RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUEsNEZBQTRGLE9BQU87QUFDbkc7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsbURBQW1ELFFBQVE7QUFDM0Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wseURBQXlELE9BQU87QUFDaEU7QUFDQTtBQUNBOztBQUVBLHNCQUFzQixtQkFBbUI7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsY0FBYyxPQUFPO0FBQ3JCLDREQUE0RDtBQUM1RDtBQUNBO0FBQ0EsYUFBYTs7QUFFYjtBQUNBO0FBQ0EsYUFBYTs7QUFFYjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsdUJBQXVCLFFBQVE7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQSx1REFBdUQ7QUFDdkQ7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQSxLQUFLO0FBQ0wsMkRBQTJELE9BQU87QUFDbEU7QUFDQSxPQUFPO0FBQ1AsdUJBQXVCLE9BQU87QUFDOUI7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBLCtEQUErRDtBQUMvRCxtRUFBbUU7QUFDbkU7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0EsS0FBSztBQUNMLHNFQUFzRSxPQUFPO0FBQzdFO0FBQ0EsT0FBTztBQUNQLHVCQUF1QixPQUFPO0FBQzlCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLE9BQU87QUFDL0M7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQSx1QkFBdUI7QUFDdkI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkhBQTJIO0FBQzNIO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0EsOENBQThDLGNBQWM7QUFDNUQ7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQSwrREFBK0Qsb0NBQW9DO0FBQ25HO0FBQ0EsU0FBUywwQ0FBMEMsdUJBQXVCO0FBQzFFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0Esc0dBQXNHLGNBQWM7QUFDcEg7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQSxzR0FBc0csY0FBYztBQUNwSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMLDRCQUE0QixjQUFjO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQLDRCQUE0QixjQUFjO0FBQzFDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTzs7QUFFUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMLDRCQUE0QixjQUFjO0FBQzFDO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0EsZ0VBQWdFLGNBQWM7QUFDOUUsaUNBQWlDLGNBQWM7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFF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O0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQSwrREFBK0Q7QUFDL0Q7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwyREFBMkQsT0FBTztBQUNsRTtBQUNBOztBQUVBLG1EQUFtRCxPQUFPO0FBQzFEO0FBQ0E7O0FBRUEsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMllBQTJZLFFBQVE7QUFDblo7QUFDQTs7QUFFQSxrQ0FBa0MsT0FBTztBQUN6QztBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLDZCQUE2QixRQUFRO0FBQ3JDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHFCQUFxQixjQUFjO0FBQ25DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHFCQUFxQixjQUFjO0FBQ25DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHFCQUFxQixjQUFjO0FBQ25DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHFCQUFxQixjQUFjO0FBQ25DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHFCQUFxQixjQUFjO0FBQ25DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHFCQUFxQixjQUFjO0FBQ25DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHFCQUFxQixjQUFjO0FBQ25DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHFCQUFxQixjQUFjO0FBQ25DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHFCQUFxQixjQUFjO0FBQ25DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9DQUFvQztBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBDQUEwQyxjQUFjO0FBQ3hEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyw4QkFBOEIsY0FBYztBQUNuRCw0Q0FBNEMsUUFBUTtBQUNwRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLGtDQUFrQyxjQUFjO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxpQ0FBaUMsT0FBTztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQSx5QkFBeUIsY0FBYztBQUN2QztBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQSx5QkFBeUIsY0FBYztBQUN2QztBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQSx5QkFBeUIsY0FBYztBQUN2QztBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQSx5QkFBeUIsY0FBYztBQUN2QztBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQSx5QkFBeUIsY0FBYztBQUN2QztBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQSx5QkFBeUIsY0FBYztBQUN2QztBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQSx5QkFBeUIsY0FBYztBQUN2QztBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQSx5QkFBeUIsY0FBYztBQUN2QztBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQSx5QkFBeUIsY0FBYztBQUN2QztBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxtQ0FBbUMsNEJBQTRCO0FBQy9EO0FBQ0EsU0FBUyxrRUFBa0UseUNBQXlDO0FBQ3BIO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsdUNBQXVDLGtCQUFrQjtBQUN6RDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwrQkFBK0IsY0FBYztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsYUFBYTs7QUFFYjtBQUNBOztBQUVBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUEsdUJBQXVCLE9BQU87QUFDOUI7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7O0FBRUw7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVB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ZTtBQUN6VCxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQkFBcUIsT0FBTztBQUM1QjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsMkRBQTJELE9BQU87QUFDbEUsdUJBQXVCLE9BQU87QUFDOUI7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLCtCQUErQjs7QUFFL0IscUJBQXFCLGNBQWM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFF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S0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQSx1QkFBdUIsY0FBYztBQUNyQztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSx5QkFBeUIsa0JBQWtCO0FBQzNDO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFCQUFxQixjQUFjO0FBQ25DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFD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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0Esc1RBQXNUO0FBQ3RUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCw2Q0FBNkM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FB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O0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0Es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Q0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7O0FBRUEsOENBQThDLGNBQWM7QUFDNUQ7QUFDQTs7QUFFQSxxQkFBcUIsY0FBYztBQUNuQztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsMkJBQTJCLGFBQWE7QUFDeEM7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxxQkFBcUIsd0JBQXdCO0FBQzdDO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQSx1RkFBdUYscUNBQXFDO0FBQzVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFCQUFxQix1Q0FBdUM7QUFDNUQ7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVCw0QkFBNEIscUZBQXFGLGNBQWM7QUFDL0g7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FB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QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGdNQUFnTSxjQUFjO0FBQzlNO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQSxTQUFTOztBQUVUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtB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QUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMGRBQTBkO0FBQzFkLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSw0V0FBNFcsWUFBWTtBQUN4WDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtEQUFrRCxRQUFRO0FBQzFEO0FBQ0E7O0FBRUEsd0JBQXdCLGNBQWM7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLEVBQUUsb0JBQW9CLE9BQU87QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFBOEQ7QUFDOUQ7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBLGdFQUFnRSxjQUFjO0FBQzlFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0wsNERBQTRELHFDQUFxQztBQUNqRztBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLGlDQUFpQyxjQUFjO0FBQ3hEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsZ0RBQWdELGFBQWE7QUFDN0Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLCtCQUErQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLLHNDQUFzQzs7QUFFM0M7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLLHNDQUFzQzs7QUFFM0M7QUFDQTtBQUNBOztBQUVBO0FBQ0EscUJBQXFCLFFBQVEsY0FBYztBQUMzQztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EscURBQXFELGNBQWM7QUFDbkU7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsV0FBVztBQUNYO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxXQUFXO0FBQ1g7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxxQ0FBcUM7QUFDNUMsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMkNBQTJDO0FBQzNDLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxxQkFBcUIsY0FBYztBQUNuQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLLHVDQUF1QztBQUM1QztBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0NBQW9DO0FBQ3BDLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw0R0FBNEcscUhBQXFILDZCQUE2QjtBQUM5UDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPOztBQUVQLDBDQUEwQyxjQUFjO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQ0FBMEMsY0FBYztBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBLDRKQUE0SixjQUFjO0FBQzFLO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQSwyQ0FBMkMsY0FBYztBQUN6RDtBQUNBOztBQUVBLGtEQUFrRCxJQUFJO0FBQ3REO0FBQ0EsS0FBSztBQUNMLHlDQUF5QyxjQUFjO0FBQ3ZEO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMLG9DQUFvQyxjQUFjO0FBQ2xEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTLFFBQVEsUUFBUSxnSkFBZ0osY0FBYztBQUN2TDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esd0RBQXdELElBQUk7QUFDNUQsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLHFCQUFxQixRQUFRLFFBQVEsMkJBQTJCLGNBQWM7QUFDOUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxPQUFPLEtBQUs7QUFDWixLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK1BBQStQO0FBQy9QO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1AsK0JBQStCO0FBQy9CLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQSw2QkFBNkI7QUFDN0I7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsNkJBQTZCLGNBQWM7QUFDM0M7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTCw4RkFBOEYsY0FBYztBQUM1RztBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBLDRCQUE0QixjQUFjO0FBQzFDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQztBQUNwQztBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpcUJBQWlxQjtBQUNqcUI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsbUVBQW1FO0FBQzVFO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBOztBQUVBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7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V0FBVztBQUNYO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsV0FBVyxFQUFFLGNBQWM7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRDtBQUNoRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxXQUFXO0FBQ1g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBLG9HQUFvRztBQUNwRztBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLFNBQVM7O0FBRVQ7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLGdDQUFnQztBQUNoQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLG1FQUFtRTtBQUNuRTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBLDZCQUE2QixrQkFBa0I7QUFDL0M7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUCxpQ0FBaUMsK0JBQStCO0FBQ2hFO0FBQ0EsU0FBUztBQUNUO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQLGdRQUFnUTtBQUNoUSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXOztBQUVYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBLEdBQUcsRUFBRTs7QUFFTDtBQUNBLENBQUMiLCJmaWxlIjoiMjk3NC5qcyIsInNvdXJjZXNDb250ZW50IjpbInJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMubWF0aC5oeXBvdC5qc1wiKTtcblxuLyogTWFwYm94IEdMIEpTIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSAzLUNsYXVzZSBCU0QgTGljZW5zZS4gRnVsbCB0ZXh0IG9mIGxpY2Vuc2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2Jsb2IvdjEuMTMuMS9MSUNFTlNFLnR4dCAqL1xuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOiB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOiAoZ2xvYmFsID0gZ2xvYmFsIHx8IHNlbGYsIGdsb2JhbC5tYXBib3hnbCA9IGZhY3RvcnkoKSk7XG59KSh0aGlzLCBmdW5jdGlvbiAoKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgLyogZXNsaW50LWRpc2FibGUgKi9cblxuICB2YXIgc2hhcmVkLCB3b3JrZXIsIG1hcGJveGdsOyAvLyBkZWZpbmUgZ2V0cyBjYWxsZWQgdGhyZWUgdGltZXM6IG9uZSBmb3IgZWFjaCBjaHVuay4gd2UgcmVseSBvbiB0aGUgb3JkZXJcbiAgLy8gdGhleSdyZSBpbXBvcnRlZCB0byBrbm93IHdoaWNoIGlzIHdoaWNoXG5cbiAgZnVuY3Rpb24gZGVmaW5lKF8sIGNodW5rKSB7XG4gICAgaWYgKCFzaGFyZWQpIHtcbiAgICAgIHNoYXJlZCA9IGNodW5rO1xuICAgIH0gZWxzZSBpZiAoIXdvcmtlcikge1xuICAgICAgd29ya2VyID0gY2h1bms7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB3b3JrZXJCdW5kbGVTdHJpbmcgPSAndmFyIHNoYXJlZENodW5rID0ge307ICgnICsgc2hhcmVkICsgJykoc2hhcmVkQ2h1bmspOyAoJyArIHdvcmtlciArICcpKHNoYXJlZENodW5rKTsnO1xuICAgICAgdmFyIHNoYXJlZENodW5rID0ge307XG4gICAgICBzaGFyZWQoc2hhcmVkQ2h1bmspO1xuICAgICAgbWFwYm94Z2wgPSBjaHVuayhzaGFyZWRDaHVuayk7XG5cbiAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBtYXBib3hnbC53b3JrZXJVcmwgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbd29ya2VyQnVuZGxlU3RyaW5nXSwge1xuICAgICAgICAgIHR5cGU6ICd0ZXh0L2phdmFzY3JpcHQnXG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBkZWZpbmUoW1wiZXhwb3J0c1wiXSwgZnVuY3Rpb24gKHQpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIGZ1bmN0aW9uIGUodCwgZSkge1xuICAgICAgcmV0dXJuIHQoZSA9IHtcbiAgICAgICAgZXhwb3J0czoge31cbiAgICAgIH0sIGUuZXhwb3J0cyksIGUuZXhwb3J0cztcbiAgICB9XG5cbiAgICB2YXIgciA9IG47XG5cbiAgICBmdW5jdGlvbiBuKHQsIGUsIHIsIG4pIHtcbiAgICAgIHRoaXMuY3ggPSAzICogdCwgdGhpcy5ieCA9IDMgKiAociAtIHQpIC0gdGhpcy5jeCwgdGhpcy5heCA9IDEgLSB0aGlzLmN4IC0gdGhpcy5ieCwgdGhpcy5jeSA9IDMgKiBlLCB0aGlzLmJ5ID0gMyAqIChuIC0gZSkgLSB0aGlzLmN5LCB0aGlzLmF5ID0gMSAtIHRoaXMuY3kgLSB0aGlzLmJ5LCB0aGlzLnAxeCA9IHQsIHRoaXMucDF5ID0gbiwgdGhpcy5wMnggPSByLCB0aGlzLnAyeSA9IG47XG4gICAgfVxuXG4gICAgbi5wcm90b3R5cGUuc2FtcGxlQ3VydmVYID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiAoKHRoaXMuYXggKiB0ICsgdGhpcy5ieCkgKiB0ICsgdGhpcy5jeCkgKiB0O1xuICAgIH0sIG4ucHJvdG90eXBlLnNhbXBsZUN1cnZlWSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gKCh0aGlzLmF5ICogdCArIHRoaXMuYnkpICogdCArIHRoaXMuY3kpICogdDtcbiAgICB9LCBuLnByb3RvdHlwZS5zYW1wbGVDdXJ2ZURlcml2YXRpdmVYID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiAoMyAqIHRoaXMuYXggKiB0ICsgMiAqIHRoaXMuYngpICogdCArIHRoaXMuY3g7XG4gICAgfSwgbi5wcm90b3R5cGUuc29sdmVDdXJ2ZVggPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgdmFyIHIsIG4sIGksIGEsIG87XG5cbiAgICAgIGZvciAodm9pZCAwID09PSBlICYmIChlID0gMWUtNiksIGkgPSB0LCBvID0gMDsgbyA8IDg7IG8rKykge1xuICAgICAgICBpZiAoYSA9IHRoaXMuc2FtcGxlQ3VydmVYKGkpIC0gdCwgTWF0aC5hYnMoYSkgPCBlKSByZXR1cm4gaTtcbiAgICAgICAgdmFyIHMgPSB0aGlzLnNhbXBsZUN1cnZlRGVyaXZhdGl2ZVgoaSk7XG4gICAgICAgIGlmIChNYXRoLmFicyhzKSA8IDFlLTYpIGJyZWFrO1xuICAgICAgICBpIC09IGEgLyBzO1xuICAgICAgfVxuXG4gICAgICBpZiAoKGkgPSB0KSA8IChyID0gMCkpIHJldHVybiByO1xuICAgICAgaWYgKGkgPiAobiA9IDEpKSByZXR1cm4gbjtcblxuICAgICAgZm9yICg7IHIgPCBuOykge1xuICAgICAgICBpZiAoYSA9IHRoaXMuc2FtcGxlQ3VydmVYKGkpLCBNYXRoLmFicyhhIC0gdCkgPCBlKSByZXR1cm4gaTtcbiAgICAgICAgdCA+IGEgPyByID0gaSA6IG4gPSBpLCBpID0gLjUgKiAobiAtIHIpICsgcjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGk7XG4gICAgfSwgbi5wcm90b3R5cGUuc29sdmUgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2FtcGxlQ3VydmVZKHRoaXMuc29sdmVDdXJ2ZVgodCwgZSkpO1xuICAgIH07XG4gICAgdmFyIGkgPSBhO1xuXG4gICAgZnVuY3Rpb24gYSh0LCBlKSB7XG4gICAgICB0aGlzLnggPSB0LCB0aGlzLnkgPSBlO1xuICAgIH1cblxuICAgIGEucHJvdG90eXBlID0ge1xuICAgICAgY2xvbmU6IGZ1bmN0aW9uIGNsb25lKCkge1xuICAgICAgICByZXR1cm4gbmV3IGEodGhpcy54LCB0aGlzLnkpO1xuICAgICAgfSxcbiAgICAgIGFkZDogZnVuY3Rpb24gYWRkKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5fYWRkKHQpO1xuICAgICAgfSxcbiAgICAgIHN1YjogZnVuY3Rpb24gc3ViKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5fc3ViKHQpO1xuICAgICAgfSxcbiAgICAgIG11bHRCeVBvaW50OiBmdW5jdGlvbiBtdWx0QnlQb2ludCh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuX211bHRCeVBvaW50KHQpO1xuICAgICAgfSxcbiAgICAgIGRpdkJ5UG9pbnQ6IGZ1bmN0aW9uIGRpdkJ5UG9pbnQodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLl9kaXZCeVBvaW50KHQpO1xuICAgICAgfSxcbiAgICAgIG11bHQ6IGZ1bmN0aW9uIG11bHQodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLl9tdWx0KHQpO1xuICAgICAgfSxcbiAgICAgIGRpdjogZnVuY3Rpb24gZGl2KHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5fZGl2KHQpO1xuICAgICAgfSxcbiAgICAgIHJvdGF0ZTogZnVuY3Rpb24gcm90YXRlKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5fcm90YXRlKHQpO1xuICAgICAgfSxcbiAgICAgIHJvdGF0ZUFyb3VuZDogZnVuY3Rpb24gcm90YXRlQXJvdW5kKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5fcm90YXRlQXJvdW5kKHQsIGUpO1xuICAgICAgfSxcbiAgICAgIG1hdE11bHQ6IGZ1bmN0aW9uIG1hdE11bHQodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLl9tYXRNdWx0KHQpO1xuICAgICAgfSxcbiAgICAgIHVuaXQ6IGZ1bmN0aW9uIHVuaXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuX3VuaXQoKTtcbiAgICAgIH0sXG4gICAgICBwZXJwOiBmdW5jdGlvbiBwZXJwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLl9wZXJwKCk7XG4gICAgICB9LFxuICAgICAgcm91bmQ6IGZ1bmN0aW9uIHJvdW5kKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLl9yb3VuZCgpO1xuICAgICAgfSxcbiAgICAgIG1hZzogZnVuY3Rpb24gbWFnKCkge1xuICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueSk7XG4gICAgICB9LFxuICAgICAgZXF1YWxzOiBmdW5jdGlvbiBlcXVhbHModCkge1xuICAgICAgICByZXR1cm4gdGhpcy54ID09PSB0LnggJiYgdGhpcy55ID09PSB0Lnk7XG4gICAgICB9LFxuICAgICAgZGlzdDogZnVuY3Rpb24gZGlzdCh0KSB7XG4gICAgICAgIHJldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0U3FyKHQpKTtcbiAgICAgIH0sXG4gICAgICBkaXN0U3FyOiBmdW5jdGlvbiBkaXN0U3FyKHQpIHtcbiAgICAgICAgdmFyIGUgPSB0LnggLSB0aGlzLngsXG4gICAgICAgICAgICByID0gdC55IC0gdGhpcy55O1xuICAgICAgICByZXR1cm4gZSAqIGUgKyByICogcjtcbiAgICAgIH0sXG4gICAgICBhbmdsZTogZnVuY3Rpb24gYW5nbGUoKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmF0YW4yKHRoaXMueSwgdGhpcy54KTtcbiAgICAgIH0sXG4gICAgICBhbmdsZVRvOiBmdW5jdGlvbiBhbmdsZVRvKHQpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguYXRhbjIodGhpcy55IC0gdC55LCB0aGlzLnggLSB0LngpO1xuICAgICAgfSxcbiAgICAgIGFuZ2xlV2l0aDogZnVuY3Rpb24gYW5nbGVXaXRoKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYW5nbGVXaXRoU2VwKHQueCwgdC55KTtcbiAgICAgIH0sXG4gICAgICBhbmdsZVdpdGhTZXA6IGZ1bmN0aW9uIGFuZ2xlV2l0aFNlcCh0LCBlKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmF0YW4yKHRoaXMueCAqIGUgLSB0aGlzLnkgKiB0LCB0aGlzLnggKiB0ICsgdGhpcy55ICogZSk7XG4gICAgICB9LFxuICAgICAgX21hdE11bHQ6IGZ1bmN0aW9uIF9tYXRNdWx0KHQpIHtcbiAgICAgICAgdmFyIGUgPSB0WzJdICogdGhpcy54ICsgdFszXSAqIHRoaXMueTtcbiAgICAgICAgcmV0dXJuIHRoaXMueCA9IHRbMF0gKiB0aGlzLnggKyB0WzFdICogdGhpcy55LCB0aGlzLnkgPSBlLCB0aGlzO1xuICAgICAgfSxcbiAgICAgIF9hZGQ6IGZ1bmN0aW9uIF9hZGQodCkge1xuICAgICAgICByZXR1cm4gdGhpcy54ICs9IHQueCwgdGhpcy55ICs9IHQueSwgdGhpcztcbiAgICAgIH0sXG4gICAgICBfc3ViOiBmdW5jdGlvbiBfc3ViKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueCAtPSB0LngsIHRoaXMueSAtPSB0LnksIHRoaXM7XG4gICAgICB9LFxuICAgICAgX211bHQ6IGZ1bmN0aW9uIF9tdWx0KHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueCAqPSB0LCB0aGlzLnkgKj0gdCwgdGhpcztcbiAgICAgIH0sXG4gICAgICBfZGl2OiBmdW5jdGlvbiBfZGl2KHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueCAvPSB0LCB0aGlzLnkgLz0gdCwgdGhpcztcbiAgICAgIH0sXG4gICAgICBfbXVsdEJ5UG9pbnQ6IGZ1bmN0aW9uIF9tdWx0QnlQb2ludCh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnggKj0gdC54LCB0aGlzLnkgKj0gdC55LCB0aGlzO1xuICAgICAgfSxcbiAgICAgIF9kaXZCeVBvaW50OiBmdW5jdGlvbiBfZGl2QnlQb2ludCh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnggLz0gdC54LCB0aGlzLnkgLz0gdC55LCB0aGlzO1xuICAgICAgfSxcbiAgICAgIF91bml0OiBmdW5jdGlvbiBfdW5pdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpdih0aGlzLm1hZygpKSwgdGhpcztcbiAgICAgIH0sXG4gICAgICBfcGVycDogZnVuY3Rpb24gX3BlcnAoKSB7XG4gICAgICAgIHZhciB0ID0gdGhpcy55O1xuICAgICAgICByZXR1cm4gdGhpcy55ID0gdGhpcy54LCB0aGlzLnggPSAtdCwgdGhpcztcbiAgICAgIH0sXG4gICAgICBfcm90YXRlOiBmdW5jdGlvbiBfcm90YXRlKHQpIHtcbiAgICAgICAgdmFyIGUgPSBNYXRoLmNvcyh0KSxcbiAgICAgICAgICAgIHIgPSBNYXRoLnNpbih0KSxcbiAgICAgICAgICAgIG4gPSByICogdGhpcy54ICsgZSAqIHRoaXMueTtcbiAgICAgICAgcmV0dXJuIHRoaXMueCA9IGUgKiB0aGlzLnggLSByICogdGhpcy55LCB0aGlzLnkgPSBuLCB0aGlzO1xuICAgICAgfSxcbiAgICAgIF9yb3RhdGVBcm91bmQ6IGZ1bmN0aW9uIF9yb3RhdGVBcm91bmQodCwgZSkge1xuICAgICAgICB2YXIgciA9IE1hdGguY29zKHQpLFxuICAgICAgICAgICAgbiA9IE1hdGguc2luKHQpLFxuICAgICAgICAgICAgaSA9IGUueSArIG4gKiAodGhpcy54IC0gZS54KSArIHIgKiAodGhpcy55IC0gZS55KTtcbiAgICAgICAgcmV0dXJuIHRoaXMueCA9IGUueCArIHIgKiAodGhpcy54IC0gZS54KSAtIG4gKiAodGhpcy55IC0gZS55KSwgdGhpcy55ID0gaSwgdGhpcztcbiAgICAgIH0sXG4gICAgICBfcm91bmQ6IGZ1bmN0aW9uIF9yb3VuZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueCA9IE1hdGgucm91bmQodGhpcy54KSwgdGhpcy55ID0gTWF0aC5yb3VuZCh0aGlzLnkpLCB0aGlzO1xuICAgICAgfVxuICAgIH0sIGEuY29udmVydCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gdCBpbnN0YW5jZW9mIGEgPyB0IDogQXJyYXkuaXNBcnJheSh0KSA/IG5ldyBhKHRbMF0sIHRbMV0pIDogdDtcbiAgICB9O1xuICAgIHZhciBvID0gXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2Ygc2VsZiA/IHNlbGYgOiB7fSxcbiAgICAgICAgcyA9IE1hdGgucG93KDIsIDUzKSAtIDE7XG5cbiAgICBmdW5jdGlvbiB1KHQsIGUsIG4sIGkpIHtcbiAgICAgIHZhciBhID0gbmV3IHIodCwgZSwgbiwgaSk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIGEuc29sdmUodCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBsID0gdSguMjUsIC4xLCAuMjUsIDEpO1xuXG4gICAgZnVuY3Rpb24gcCh0LCBlLCByKSB7XG4gICAgICByZXR1cm4gTWF0aC5taW4ociwgTWF0aC5tYXgoZSwgdCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGModCwgZSwgcikge1xuICAgICAgdmFyIG4gPSByIC0gZSxcbiAgICAgICAgICBpID0gKCh0IC0gZSkgJSBuICsgbikgJSBuICsgZTtcbiAgICAgIHJldHVybiBpID09PSBlID8gciA6IGk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaCh0KSB7XG4gICAgICBmb3IgKHZhciBlID0gW10sIHIgPSBhcmd1bWVudHMubGVuZ3RoIC0gMTsgci0tID4gMDspIHtcbiAgICAgICAgZVtyXSA9IGFyZ3VtZW50c1tyICsgMV07XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIG4gPSAwLCBpID0gZTsgbiA8IGkubGVuZ3RoOyBuICs9IDEpIHtcbiAgICAgICAgdmFyIGEgPSBpW25dO1xuXG4gICAgICAgIGZvciAodmFyIG8gaW4gYSkge1xuICAgICAgICAgIHRbb10gPSBhW29dO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0O1xuICAgIH1cblxuICAgIHZhciBmID0gMTtcblxuICAgIGZ1bmN0aW9uIHkoKSB7XG4gICAgICByZXR1cm4gZisrO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGQoKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gdChlKSB7XG4gICAgICAgIHJldHVybiBlID8gKGUgXiAxNiAqIE1hdGgucmFuZG9tKCkgPj4gZSAvIDQpLnRvU3RyaW5nKDE2KSA6IChbMWU3XSArIC1bMWUzXSArIC00ZTMgKyAtOGUzICsgLTFlMTEpLnJlcGxhY2UoL1swMThdL2csIHQpO1xuICAgICAgfSgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG0odCkge1xuICAgICAgcmV0dXJuICEhdCAmJiAvXlswLTlhLWZdezh9LVswLTlhLWZdezR9LVs0XVswLTlhLWZdezN9LVs4OWFiXVswLTlhLWZdezN9LVswLTlhLWZdezEyfSQvaS50ZXN0KHQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHYodCwgZSkge1xuICAgICAgdC5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGVbdF0gJiYgKGVbdF0gPSBlW3RdLmJpbmQoZSkpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZyh0LCBlKSB7XG4gICAgICByZXR1cm4gLTEgIT09IHQuaW5kZXhPZihlLCB0Lmxlbmd0aCAtIGUubGVuZ3RoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB4KHQsIGUsIHIpIHtcbiAgICAgIHZhciBuID0ge307XG5cbiAgICAgIGZvciAodmFyIGkgaW4gdCkge1xuICAgICAgICBuW2ldID0gZS5jYWxsKHIgfHwgdGhpcywgdFtpXSwgaSwgdCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGIodCwgZSwgcikge1xuICAgICAgdmFyIG4gPSB7fTtcblxuICAgICAgZm9yICh2YXIgaSBpbiB0KSB7XG4gICAgICAgIGUuY2FsbChyIHx8IHRoaXMsIHRbaV0sIGksIHQpICYmIChuW2ldID0gdFtpXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHcodCkge1xuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodCkgPyB0Lm1hcCh3KSA6IFwib2JqZWN0XCIgPT0gdHlwZW9mIHQgJiYgdCA/IHgodCwgdykgOiB0O1xuICAgIH1cblxuICAgIHZhciBfID0ge307XG5cbiAgICBmdW5jdGlvbiBBKHQpIHtcbiAgICAgIF9bdF0gfHwgKFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIGNvbnNvbGUgJiYgY29uc29sZS53YXJuKHQpLCBfW3RdID0gITApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFModCwgZSwgcikge1xuICAgICAgcmV0dXJuIChyLnkgLSB0LnkpICogKGUueCAtIHQueCkgPiAoZS55IC0gdC55KSAqIChyLnggLSB0LngpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGsodCkge1xuICAgICAgZm9yICh2YXIgZSA9IDAsIHIgPSAwLCBuID0gdC5sZW5ndGgsIGkgPSBuIC0gMSwgYSA9IHZvaWQgMCwgbyA9IHZvaWQgMDsgciA8IG47IGkgPSByKyspIHtcbiAgICAgICAgZSArPSAoKG8gPSB0W2ldKS54IC0gKGEgPSB0W3JdKS54KSAqIChhLnkgKyBvLnkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBJKCkge1xuICAgICAgcmV0dXJuIFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlICYmIFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIHNlbGYgJiYgc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHoodCkge1xuICAgICAgdmFyIGUgPSB7fTtcblxuICAgICAgaWYgKHQucmVwbGFjZSgvKD86XnwoPzpcXHMqXFwsXFxzKikpKFteXFx4MDAtXFx4MjBcXChcXCk8PkBcXCw7XFw6XFxcXFwiXFwvXFxbXFxdXFw/XFw9XFx7XFx9XFx4N0ZdKykoPzpcXD0oPzooW15cXHgwMC1cXHgyMFxcKFxcKTw+QFxcLDtcXDpcXFxcXCJcXC9cXFtcXF1cXD9cXD1cXHtcXH1cXHg3Rl0rKXwoPzpcXFwiKCg/OlteXCJcXFxcXXxcXFxcLikqKVxcXCIpKSk/L2csIGZ1bmN0aW9uICh0LCByLCBuLCBpKSB7XG4gICAgICAgIHZhciBhID0gbiB8fCBpO1xuICAgICAgICByZXR1cm4gZVtyXSA9ICFhIHx8IGEudG9Mb3dlckNhc2UoKSwgXCJcIjtcbiAgICAgIH0pLCBlW1wibWF4LWFnZVwiXSkge1xuICAgICAgICB2YXIgciA9IHBhcnNlSW50KGVbXCJtYXgtYWdlXCJdLCAxMCk7XG4gICAgICAgIGlzTmFOKHIpID8gZGVsZXRlIGVbXCJtYXgtYWdlXCJdIDogZVtcIm1heC1hZ2VcIl0gPSByO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZTtcbiAgICB9XG5cbiAgICB2YXIgQyA9IG51bGw7XG5cbiAgICBmdW5jdGlvbiBFKHQpIHtcbiAgICAgIGlmIChudWxsID09IEMpIHtcbiAgICAgICAgdmFyIGUgPSB0Lm5hdmlnYXRvciA/IHQubmF2aWdhdG9yLnVzZXJBZ2VudCA6IG51bGw7XG4gICAgICAgIEMgPSAhIXQuc2FmYXJpIHx8ICEoIWUgfHwgISgvXFxiKGlQYWR8aVBob25lfGlQb2QpXFxiLy50ZXN0KGUpIHx8IGUubWF0Y2goXCJTYWZhcmlcIikgJiYgIWUubWF0Y2goXCJDaHJvbWVcIikpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIEM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gUCh0KSB7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgZSA9IG9bdF07XG4gICAgICAgIHJldHVybiBlLnNldEl0ZW0oXCJfbWFwYm94X3Rlc3RfXCIsIDEpLCBlLnJlbW92ZUl0ZW0oXCJfbWFwYm94X3Rlc3RfXCIpLCAhMDtcbiAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgcmV0dXJuICExO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBNLFxuICAgICAgICBCLFxuICAgICAgICBULFxuICAgICAgICBWLFxuICAgICAgICBGID0gby5wZXJmb3JtYW5jZSAmJiBvLnBlcmZvcm1hbmNlLm5vdyA/IG8ucGVyZm9ybWFuY2Uubm93LmJpbmQoby5wZXJmb3JtYW5jZSkgOiBEYXRlLm5vdy5iaW5kKERhdGUpLFxuICAgICAgICBEID0gby5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgby5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgby53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgby5tc1JlcXVlc3RBbmltYXRpb25GcmFtZSxcbiAgICAgICAgTCA9IG8uY2FuY2VsQW5pbWF0aW9uRnJhbWUgfHwgby5tb3pDYW5jZWxBbmltYXRpb25GcmFtZSB8fCBvLndlYmtpdENhbmNlbEFuaW1hdGlvbkZyYW1lIHx8IG8ubXNDYW5jZWxBbmltYXRpb25GcmFtZSxcbiAgICAgICAgTyA9IHtcbiAgICAgIG5vdzogRixcbiAgICAgIGZyYW1lOiBmdW5jdGlvbiBmcmFtZSh0KSB7XG4gICAgICAgIHZhciBlID0gRCh0KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uIGNhbmNlbCgpIHtcbiAgICAgICAgICAgIHJldHVybiBMKGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBnZXRJbWFnZURhdGE6IGZ1bmN0aW9uIGdldEltYWdlRGF0YSh0LCBlKSB7XG4gICAgICAgIHZvaWQgMCA9PT0gZSAmJiAoZSA9IDApO1xuICAgICAgICB2YXIgciA9IG8uZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKSxcbiAgICAgICAgICAgIG4gPSByLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgICAgaWYgKCFuKSB0aHJvdyBuZXcgRXJyb3IoXCJmYWlsZWQgdG8gY3JlYXRlIGNhbnZhcyAyZCBjb250ZXh0XCIpO1xuICAgICAgICByZXR1cm4gci53aWR0aCA9IHQud2lkdGgsIHIuaGVpZ2h0ID0gdC5oZWlnaHQsIG4uZHJhd0ltYWdlKHQsIDAsIDAsIHQud2lkdGgsIHQuaGVpZ2h0KSwgbi5nZXRJbWFnZURhdGEoLWUsIC1lLCB0LndpZHRoICsgMiAqIGUsIHQuaGVpZ2h0ICsgMiAqIGUpO1xuICAgICAgfSxcbiAgICAgIHJlc29sdmVVUkw6IGZ1bmN0aW9uIHJlc29sdmVVUkwodCkge1xuICAgICAgICByZXR1cm4gTSB8fCAoTSA9IG8uZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIikpLCBNLmhyZWYgPSB0LCBNLmhyZWY7XG4gICAgICB9LFxuICAgICAgaGFyZHdhcmVDb25jdXJyZW5jeTogby5uYXZpZ2F0b3IgJiYgby5uYXZpZ2F0b3IuaGFyZHdhcmVDb25jdXJyZW5jeSB8fCA0LFxuXG4gICAgICBnZXQgZGV2aWNlUGl4ZWxSYXRpbygpIHtcbiAgICAgICAgcmV0dXJuIG8uZGV2aWNlUGl4ZWxSYXRpbztcbiAgICAgIH0sXG5cbiAgICAgIGdldCBwcmVmZXJzUmVkdWNlZE1vdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICEhby5tYXRjaE1lZGlhICYmIChudWxsID09IEIgJiYgKEIgPSBvLm1hdGNoTWVkaWEoXCIocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKVwiKSksIEIubWF0Y2hlcyk7XG4gICAgICB9XG5cbiAgICB9LFxuICAgICAgICBSID0ge1xuICAgICAgQVBJX1VSTDogXCJodHRwczovL2FwaS5tYXBib3guY29tXCIsXG5cbiAgICAgIGdldCBFVkVOVFNfVVJMKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5BUElfVVJMID8gMCA9PT0gdGhpcy5BUElfVVJMLmluZGV4T2YoXCJodHRwczovL2FwaS5tYXBib3guY25cIikgPyBcImh0dHBzOi8vZXZlbnRzLm1hcGJveC5jbi9ldmVudHMvdjJcIiA6IDAgPT09IHRoaXMuQVBJX1VSTC5pbmRleE9mKFwiaHR0cHM6Ly9hcGkubWFwYm94LmNvbVwiKSA/IFwiaHR0cHM6Ly9ldmVudHMubWFwYm94LmNvbS9ldmVudHMvdjJcIiA6IG51bGwgOiBudWxsO1xuICAgICAgfSxcblxuICAgICAgRkVFREJBQ0tfVVJMOiBcImh0dHBzOi8vYXBwcy5tYXBib3guY29tL2ZlZWRiYWNrXCIsXG4gICAgICBSRVFVSVJFX0FDQ0VTU19UT0tFTjogITAsXG4gICAgICBBQ0NFU1NfVE9LRU46IG51bGwsXG4gICAgICBNQVhfUEFSQUxMRUxfSU1BR0VfUkVRVUVTVFM6IDE2XG4gICAgfSxcbiAgICAgICAgVSA9IHtcbiAgICAgIHN1cHBvcnRlZDogITEsXG4gICAgICB0ZXN0U3VwcG9ydDogZnVuY3Rpb24gdGVzdFN1cHBvcnQodCkge1xuICAgICAgICAhaiAmJiBWICYmIChxID8gTih0KSA6IFQgPSB0KTtcbiAgICAgIH1cbiAgICB9LFxuICAgICAgICBqID0gITEsXG4gICAgICAgIHEgPSAhMTtcblxuICAgIGZ1bmN0aW9uIE4odCkge1xuICAgICAgdmFyIGUgPSB0LmNyZWF0ZVRleHR1cmUoKTtcbiAgICAgIHQuYmluZFRleHR1cmUodC5URVhUVVJFXzJELCBlKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHQudGV4SW1hZ2UyRCh0LlRFWFRVUkVfMkQsIDAsIHQuUkdCQSwgdC5SR0JBLCB0LlVOU0lHTkVEX0JZVEUsIFYpLCB0LmlzQ29udGV4dExvc3QoKSkgcmV0dXJuO1xuICAgICAgICBVLnN1cHBvcnRlZCA9ICEwO1xuICAgICAgfSBjYXRjaCAodCkge31cblxuICAgICAgdC5kZWxldGVUZXh0dXJlKGUpLCBqID0gITA7XG4gICAgfVxuXG4gICAgby5kb2N1bWVudCAmJiAoKFYgPSBvLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIikpLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIFQgJiYgTihUKSwgVCA9IG51bGwsIHEgPSAhMDtcbiAgICB9LCBWLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBqID0gITAsIFQgPSBudWxsO1xuICAgIH0sIFYuc3JjID0gXCJkYXRhOmltYWdlL3dlYnA7YmFzZTY0LFVrbEdSaDRBQUFCWFJVSlFWbEE0VEJFQUFBQXZBUUFBQUFmUS8vNzN2LytCaU9oL0FBQT1cIik7XG5cbiAgICB2YXIgSyA9IFwiMDFcIixcbiAgICAgICAgRyA9IGZ1bmN0aW9uIEcodCwgZSkge1xuICAgICAgdGhpcy5fdHJhbnNmb3JtUmVxdWVzdEZuID0gdCwgdGhpcy5fY3VzdG9tQWNjZXNzVG9rZW4gPSBlLCB0aGlzLl9jcmVhdGVTa3VUb2tlbigpO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBaKHQpIHtcbiAgICAgIHJldHVybiAwID09PSB0LmluZGV4T2YoXCJtYXBib3g6XCIpO1xuICAgIH1cblxuICAgIEcucHJvdG90eXBlLl9jcmVhdGVTa3VUb2tlbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBmb3IgKHZhciB0ID0gXCJcIiwgZSA9IDA7IGUgPCAxMDsgZSsrKSB7XG4gICAgICAgICAgdCArPSBcIjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaXCJbTWF0aC5mbG9vcig2MiAqIE1hdGgucmFuZG9tKCkpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdG9rZW46IFtcIjFcIiwgSywgdF0uam9pbihcIlwiKSxcbiAgICAgICAgICB0b2tlbkV4cGlyZXNBdDogRGF0ZS5ub3coKSArIDQzMmU1XG4gICAgICAgIH07XG4gICAgICB9KCk7XG5cbiAgICAgIHRoaXMuX3NrdVRva2VuID0gdC50b2tlbiwgdGhpcy5fc2t1VG9rZW5FeHBpcmVzQXQgPSB0LnRva2VuRXhwaXJlc0F0O1xuICAgIH0sIEcucHJvdG90eXBlLl9pc1NrdVRva2VuRXhwaXJlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBEYXRlLm5vdygpID4gdGhpcy5fc2t1VG9rZW5FeHBpcmVzQXQ7XG4gICAgfSwgRy5wcm90b3R5cGUudHJhbnNmb3JtUmVxdWVzdCA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdHJhbnNmb3JtUmVxdWVzdEZuICYmIHRoaXMuX3RyYW5zZm9ybVJlcXVlc3RGbih0LCBlKSB8fCB7XG4gICAgICAgIHVybDogdFxuICAgICAgfTtcbiAgICB9LCBHLnByb3RvdHlwZS5ub3JtYWxpemVTdHlsZVVSTCA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICBpZiAoIVoodCkpIHJldHVybiB0O1xuICAgICAgdmFyIHIgPSBZKHQpO1xuICAgICAgcmV0dXJuIHIucGF0aCA9IFwiL3N0eWxlcy92MVwiICsgci5wYXRoLCB0aGlzLl9tYWtlQVBJVVJMKHIsIHRoaXMuX2N1c3RvbUFjY2Vzc1Rva2VuIHx8IGUpO1xuICAgIH0sIEcucHJvdG90eXBlLm5vcm1hbGl6ZUdseXBoc1VSTCA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICBpZiAoIVoodCkpIHJldHVybiB0O1xuICAgICAgdmFyIHIgPSBZKHQpO1xuICAgICAgcmV0dXJuIHIucGF0aCA9IFwiL2ZvbnRzL3YxXCIgKyByLnBhdGgsIHRoaXMuX21ha2VBUElVUkwociwgdGhpcy5fY3VzdG9tQWNjZXNzVG9rZW4gfHwgZSk7XG4gICAgfSwgRy5wcm90b3R5cGUubm9ybWFsaXplU291cmNlVVJMID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIGlmICghWih0KSkgcmV0dXJuIHQ7XG4gICAgICB2YXIgciA9IFkodCk7XG4gICAgICByZXR1cm4gci5wYXRoID0gXCIvdjQvXCIgKyByLmF1dGhvcml0eSArIFwiLmpzb25cIiwgci5wYXJhbXMucHVzaChcInNlY3VyZVwiKSwgdGhpcy5fbWFrZUFQSVVSTChyLCB0aGlzLl9jdXN0b21BY2Nlc3NUb2tlbiB8fCBlKTtcbiAgICB9LCBHLnByb3RvdHlwZS5ub3JtYWxpemVTcHJpdGVVUkwgPSBmdW5jdGlvbiAodCwgZSwgciwgbikge1xuICAgICAgdmFyIGkgPSBZKHQpO1xuICAgICAgcmV0dXJuIFoodCkgPyAoaS5wYXRoID0gXCIvc3R5bGVzL3YxXCIgKyBpLnBhdGggKyBcIi9zcHJpdGVcIiArIGUgKyByLCB0aGlzLl9tYWtlQVBJVVJMKGksIHRoaXMuX2N1c3RvbUFjY2Vzc1Rva2VuIHx8IG4pKSA6IChpLnBhdGggKz0gXCJcIiArIGUgKyByLCAkKGkpKTtcbiAgICB9LCBHLnByb3RvdHlwZS5ub3JtYWxpemVUaWxlVVJMID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIGlmICh0aGlzLl9pc1NrdVRva2VuRXhwaXJlZCgpICYmIHRoaXMuX2NyZWF0ZVNrdVRva2VuKCksIHQgJiYgIVoodCkpIHJldHVybiB0O1xuICAgICAgdmFyIHIgPSBZKHQpO1xuICAgICAgci5wYXRoID0gci5wYXRoLnJlcGxhY2UoLyhcXC4ocG5nfGpwZylcXGQqKSg/PSQpLywgKE8uZGV2aWNlUGl4ZWxSYXRpbyA+PSAyIHx8IDUxMiA9PT0gZSA/IFwiQDJ4XCIgOiBcIlwiKSArIChVLnN1cHBvcnRlZCA/IFwiLndlYnBcIiA6IFwiJDFcIikpLCByLnBhdGggPSByLnBhdGgucmVwbGFjZSgvXi4rXFwvdjRcXC8vLCBcIi9cIiksIHIucGF0aCA9IFwiL3Y0XCIgKyByLnBhdGg7XG5cbiAgICAgIHZhciBuID0gdGhpcy5fY3VzdG9tQWNjZXNzVG9rZW4gfHwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgZm9yICh2YXIgZSA9IDAsIHIgPSB0OyBlIDwgci5sZW5ndGg7IGUgKz0gMSkge1xuICAgICAgICAgIHZhciBuID0gcltlXS5tYXRjaCgvXmFjY2Vzc190b2tlbj0oLiopJC8pO1xuICAgICAgICAgIGlmIChuKSByZXR1cm4gblsxXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfShyLnBhcmFtcykgfHwgUi5BQ0NFU1NfVE9LRU47XG5cbiAgICAgIHJldHVybiBSLlJFUVVJUkVfQUNDRVNTX1RPS0VOICYmIG4gJiYgdGhpcy5fc2t1VG9rZW4gJiYgci5wYXJhbXMucHVzaChcInNrdT1cIiArIHRoaXMuX3NrdVRva2VuKSwgdGhpcy5fbWFrZUFQSVVSTChyLCBuKTtcbiAgICB9LCBHLnByb3RvdHlwZS5jYW5vbmljYWxpemVUaWxlVVJMID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHZhciByID0gWSh0KTtcbiAgICAgIGlmICghci5wYXRoLm1hdGNoKC8oXlxcL3Y0XFwvKS8pIHx8ICFyLnBhdGgubWF0Y2goL1xcLltcXHddKyQvKSkgcmV0dXJuIHQ7XG4gICAgICB2YXIgbiA9IFwibWFwYm94Oi8vdGlsZXMvXCI7XG4gICAgICBuICs9IHIucGF0aC5yZXBsYWNlKFwiL3Y0L1wiLCBcIlwiKTtcbiAgICAgIHZhciBpID0gci5wYXJhbXM7XG4gICAgICByZXR1cm4gZSAmJiAoaSA9IGkuZmlsdGVyKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiAhdC5tYXRjaCgvXmFjY2Vzc190b2tlbj0vKTtcbiAgICAgIH0pKSwgaS5sZW5ndGggJiYgKG4gKz0gXCI/XCIgKyBpLmpvaW4oXCImXCIpKSwgbjtcbiAgICB9LCBHLnByb3RvdHlwZS5jYW5vbmljYWxpemVUaWxlc2V0ID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIGZvciAodmFyIHIgPSAhIWUgJiYgWihlKSwgbiA9IFtdLCBpID0gMCwgYSA9IHQudGlsZXMgfHwgW107IGkgPCBhLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBvID0gYVtpXTtcbiAgICAgICAgSihvKSA/IG4ucHVzaCh0aGlzLmNhbm9uaWNhbGl6ZVRpbGVVUkwobywgcikpIDogbi5wdXNoKG8pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbjtcbiAgICB9LCBHLnByb3RvdHlwZS5fbWFrZUFQSVVSTCA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB2YXIgciA9IFwiU2VlIGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vYXBpLWRvY3VtZW50YXRpb24vI2FjY2Vzcy10b2tlbnMtYW5kLXRva2VuLXNjb3Blc1wiLFxuICAgICAgICAgIG4gPSBZKFIuQVBJX1VSTCk7XG5cbiAgICAgIGlmICh0LnByb3RvY29sID0gbi5wcm90b2NvbCwgdC5hdXRob3JpdHkgPSBuLmF1dGhvcml0eSwgXCJodHRwXCIgPT09IHQucHJvdG9jb2wpIHtcbiAgICAgICAgdmFyIGkgPSB0LnBhcmFtcy5pbmRleE9mKFwic2VjdXJlXCIpO1xuICAgICAgICBpID49IDAgJiYgdC5wYXJhbXMuc3BsaWNlKGksIDEpO1xuICAgICAgfVxuXG4gICAgICBpZiAoXCIvXCIgIT09IG4ucGF0aCAmJiAodC5wYXRoID0gXCJcIiArIG4ucGF0aCArIHQucGF0aCksICFSLlJFUVVJUkVfQUNDRVNTX1RPS0VOKSByZXR1cm4gJCh0KTtcbiAgICAgIGlmICghKGUgPSBlIHx8IFIuQUNDRVNTX1RPS0VOKSkgdGhyb3cgbmV3IEVycm9yKFwiQW4gQVBJIGFjY2VzcyB0b2tlbiBpcyByZXF1aXJlZCB0byB1c2UgTWFwYm94IEdMLiBcIiArIHIpO1xuICAgICAgaWYgKFwic1wiID09PSBlWzBdKSB0aHJvdyBuZXcgRXJyb3IoXCJVc2UgYSBwdWJsaWMgYWNjZXNzIHRva2VuIChway4qKSB3aXRoIE1hcGJveCBHTCwgbm90IGEgc2VjcmV0IGFjY2VzcyB0b2tlbiAoc2suKikuIFwiICsgcik7XG4gICAgICByZXR1cm4gdC5wYXJhbXMgPSB0LnBhcmFtcy5maWx0ZXIoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIC0xID09PSB0LmluZGV4T2YoXCJhY2Nlc3NfdG9rZW5cIik7XG4gICAgICB9KSwgdC5wYXJhbXMucHVzaChcImFjY2Vzc190b2tlbj1cIiArIGUpLCAkKHQpO1xuICAgIH07XG4gICAgdmFyIFggPSAvXigoaHR0cHM/Oik/XFwvXFwvKT8oW15cXC9dK1xcLik/bWFwYm94XFwuYyhufG9tKShcXC98XFw/fCQpL2k7XG5cbiAgICBmdW5jdGlvbiBKKHQpIHtcbiAgICAgIHJldHVybiBYLnRlc3QodCk7XG4gICAgfVxuXG4gICAgdmFyIEggPSAvXihcXHcrKTpcXC9cXC8oW14vP10qKShcXC9bXj9dKyk/XFw/PyguKyk/LztcblxuICAgIGZ1bmN0aW9uIFkodCkge1xuICAgICAgdmFyIGUgPSB0Lm1hdGNoKEgpO1xuICAgICAgaWYgKCFlKSB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gcGFyc2UgVVJMIG9iamVjdFwiKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByb3RvY29sOiBlWzFdLFxuICAgICAgICBhdXRob3JpdHk6IGVbMl0sXG4gICAgICAgIHBhdGg6IGVbM10gfHwgXCIvXCIsXG4gICAgICAgIHBhcmFtczogZVs0XSA/IGVbNF0uc3BsaXQoXCImXCIpIDogW11cbiAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gJCh0KSB7XG4gICAgICB2YXIgZSA9IHQucGFyYW1zLmxlbmd0aCA/IFwiP1wiICsgdC5wYXJhbXMuam9pbihcIiZcIikgOiBcIlwiO1xuICAgICAgcmV0dXJuIHQucHJvdG9jb2wgKyBcIjovL1wiICsgdC5hdXRob3JpdHkgKyB0LnBhdGggKyBlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFcodCkge1xuICAgICAgaWYgKCF0KSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciBlID0gdC5zcGxpdChcIi5cIik7XG4gICAgICBpZiAoIWUgfHwgMyAhPT0gZS5sZW5ndGgpIHJldHVybiBudWxsO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShkZWNvZGVVUklDb21wb25lbnQoby5hdG9iKGVbMV0pLnNwbGl0KFwiXCIpLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHJldHVybiBcIiVcIiArIChcIjAwXCIgKyB0LmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtMik7XG4gICAgICAgIH0pLmpvaW4oXCJcIikpKTtcbiAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIFEgPSBmdW5jdGlvbiBRKHQpIHtcbiAgICAgIHRoaXMudHlwZSA9IHQsIHRoaXMuYW5vbklkID0gbnVsbCwgdGhpcy5ldmVudERhdGEgPSB7fSwgdGhpcy5xdWV1ZSA9IFtdLCB0aGlzLnBlbmRpbmdSZXF1ZXN0ID0gbnVsbDtcbiAgICB9O1xuXG4gICAgUS5wcm90b3R5cGUuZ2V0U3RvcmFnZUtleSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2YXIgZSxcbiAgICAgICAgICByID0gVyhSLkFDQ0VTU19UT0tFTik7XG4gICAgICByZXR1cm4gZSA9IHIgJiYgci51ID8gby5idG9hKGVuY29kZVVSSUNvbXBvbmVudChyLnUpLnJlcGxhY2UoLyUoWzAtOUEtRl17Mn0pL2csIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKE51bWJlcihcIjB4XCIgKyBlKSk7XG4gICAgICB9KSkgOiBSLkFDQ0VTU19UT0tFTiB8fCBcIlwiLCB0ID8gXCJtYXBib3guZXZlbnREYXRhLlwiICsgdCArIFwiOlwiICsgZSA6IFwibWFwYm94LmV2ZW50RGF0YTpcIiArIGU7XG4gICAgfSwgUS5wcm90b3R5cGUuZmV0Y2hFdmVudERhdGEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdCA9IFAoXCJsb2NhbFN0b3JhZ2VcIiksXG4gICAgICAgICAgZSA9IHRoaXMuZ2V0U3RvcmFnZUtleSgpLFxuICAgICAgICAgIHIgPSB0aGlzLmdldFN0b3JhZ2VLZXkoXCJ1dWlkXCIpO1xuICAgICAgaWYgKHQpIHRyeSB7XG4gICAgICAgIHZhciBuID0gby5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShlKTtcbiAgICAgICAgbiAmJiAodGhpcy5ldmVudERhdGEgPSBKU09OLnBhcnNlKG4pKTtcbiAgICAgICAgdmFyIGkgPSBvLmxvY2FsU3RvcmFnZS5nZXRJdGVtKHIpO1xuICAgICAgICBpICYmICh0aGlzLmFub25JZCA9IGkpO1xuICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICBBKFwiVW5hYmxlIHRvIHJlYWQgZnJvbSBMb2NhbFN0b3JhZ2VcIik7XG4gICAgICB9XG4gICAgfSwgUS5wcm90b3R5cGUuc2F2ZUV2ZW50RGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0ID0gUChcImxvY2FsU3RvcmFnZVwiKSxcbiAgICAgICAgICBlID0gdGhpcy5nZXRTdG9yYWdlS2V5KCksXG4gICAgICAgICAgciA9IHRoaXMuZ2V0U3RvcmFnZUtleShcInV1aWRcIik7XG4gICAgICBpZiAodCkgdHJ5IHtcbiAgICAgICAgby5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShyLCB0aGlzLmFub25JZCksIE9iamVjdC5rZXlzKHRoaXMuZXZlbnREYXRhKS5sZW5ndGggPj0gMSAmJiBvLmxvY2FsU3RvcmFnZS5zZXRJdGVtKGUsIEpTT04uc3RyaW5naWZ5KHRoaXMuZXZlbnREYXRhKSk7XG4gICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgIEEoXCJVbmFibGUgdG8gd3JpdGUgdG8gTG9jYWxTdG9yYWdlXCIpO1xuICAgICAgfVxuICAgIH0sIFEucHJvdG90eXBlLnByb2Nlc3NSZXF1ZXN0cyA9IGZ1bmN0aW9uICh0KSB7fSwgUS5wcm90b3R5cGUucG9zdEV2ZW50ID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4pIHtcbiAgICAgIHZhciBpID0gdGhpcztcblxuICAgICAgaWYgKFIuRVZFTlRTX1VSTCkge1xuICAgICAgICB2YXIgYSA9IFkoUi5FVkVOVFNfVVJMKTtcbiAgICAgICAgYS5wYXJhbXMucHVzaChcImFjY2Vzc190b2tlbj1cIiArIChuIHx8IFIuQUNDRVNTX1RPS0VOIHx8IFwiXCIpKTtcbiAgICAgICAgdmFyIG8gPSB7XG4gICAgICAgICAgZXZlbnQ6IHRoaXMudHlwZSxcbiAgICAgICAgICBjcmVhdGVkOiBuZXcgRGF0ZSh0KS50b0lTT1N0cmluZygpLFxuICAgICAgICAgIHNka0lkZW50aWZpZXI6IFwibWFwYm94LWdsLWpzXCIsXG4gICAgICAgICAgc2RrVmVyc2lvbjogXCIxLjEzLjFcIixcbiAgICAgICAgICBza3VJZDogSyxcbiAgICAgICAgICB1c2VySWQ6IHRoaXMuYW5vbklkXG4gICAgICAgIH0sXG4gICAgICAgICAgICBzID0gZSA/IGgobywgZSkgOiBvLFxuICAgICAgICAgICAgdSA9IHtcbiAgICAgICAgICB1cmw6ICQoYSksXG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJ0ZXh0L3BsYWluXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KFtzXSlcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdCA9IHd0KHUsIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgaS5wZW5kaW5nUmVxdWVzdCA9IG51bGwsIHIodCksIGkuc2F2ZUV2ZW50RGF0YSgpLCBpLnByb2Nlc3NSZXF1ZXN0cyhuKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgUS5wcm90b3R5cGUucXVldWVSZXF1ZXN0ID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHRoaXMucXVldWUucHVzaCh0KSwgdGhpcy5wcm9jZXNzUmVxdWVzdHMoZSk7XG4gICAgfTtcblxuICAgIHZhciB0dCxcbiAgICAgICAgZXQsXG4gICAgICAgIHJ0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuY2FsbCh0aGlzLCBcIm1hcC5sb2FkXCIpLCB0aGlzLnN1Y2Nlc3MgPSB7fSwgdGhpcy5za3VUb2tlbiA9IFwiXCI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLnBvc3RNYXBMb2FkRXZlbnQgPSBmdW5jdGlvbiAodCwgZSwgciwgbikge1xuICAgICAgICB0aGlzLnNrdVRva2VuID0gciwgKFIuRVZFTlRTX1VSTCAmJiBuIHx8IFIuQUNDRVNTX1RPS0VOICYmIEFycmF5LmlzQXJyYXkodCkgJiYgdC5zb21lKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgcmV0dXJuIFoodCkgfHwgSih0KTtcbiAgICAgICAgfSkpICYmIHRoaXMucXVldWVSZXF1ZXN0KHtcbiAgICAgICAgICBpZDogZSxcbiAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KClcbiAgICAgICAgfSwgbik7XG4gICAgICB9LCBlLnByb3RvdHlwZS5wcm9jZXNzUmVxdWVzdHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgZSA9IHRoaXM7XG5cbiAgICAgICAgaWYgKCF0aGlzLnBlbmRpbmdSZXF1ZXN0ICYmIDAgIT09IHRoaXMucXVldWUubGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIHIgPSB0aGlzLnF1ZXVlLnNoaWZ0KCksXG4gICAgICAgICAgICAgIG4gPSByLmlkLFxuICAgICAgICAgICAgICBpID0gci50aW1lc3RhbXA7XG4gICAgICAgICAgbiAmJiB0aGlzLnN1Y2Nlc3Nbbl0gfHwgKHRoaXMuYW5vbklkIHx8IHRoaXMuZmV0Y2hFdmVudERhdGEoKSwgbSh0aGlzLmFub25JZCkgfHwgKHRoaXMuYW5vbklkID0gZCgpKSwgdGhpcy5wb3N0RXZlbnQoaSwge1xuICAgICAgICAgICAgc2t1VG9rZW46IHRoaXMuc2t1VG9rZW5cbiAgICAgICAgICB9LCBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgdCB8fCBuICYmIChlLnN1Y2Nlc3Nbbl0gPSAhMCk7XG4gICAgICAgICAgfSwgdCkpO1xuICAgICAgICB9XG4gICAgICB9LCBlO1xuICAgIH0oUSksXG4gICAgICAgIG50ID0gbmV3IChmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZShlKSB7XG4gICAgICAgIHQuY2FsbCh0aGlzLCBcImFwcFVzZXJUdXJuc3RpbGVcIiksIHRoaXMuX2N1c3RvbUFjY2Vzc1Rva2VuID0gZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUucG9zdFR1cm5zdGlsZUV2ZW50ID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgUi5FVkVOVFNfVVJMICYmIFIuQUNDRVNTX1RPS0VOICYmIEFycmF5LmlzQXJyYXkodCkgJiYgdC5zb21lKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgcmV0dXJuIFoodCkgfHwgSih0KTtcbiAgICAgICAgfSkgJiYgdGhpcy5xdWV1ZVJlcXVlc3QoRGF0ZS5ub3coKSwgZSk7XG4gICAgICB9LCBlLnByb3RvdHlwZS5wcm9jZXNzUmVxdWVzdHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgZSA9IHRoaXM7XG5cbiAgICAgICAgaWYgKCF0aGlzLnBlbmRpbmdSZXF1ZXN0ICYmIDAgIT09IHRoaXMucXVldWUubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5hbm9uSWQgJiYgdGhpcy5ldmVudERhdGEubGFzdFN1Y2Nlc3MgJiYgdGhpcy5ldmVudERhdGEudG9rZW5VIHx8IHRoaXMuZmV0Y2hFdmVudERhdGEoKTtcbiAgICAgICAgICB2YXIgciA9IFcoUi5BQ0NFU1NfVE9LRU4pLFxuICAgICAgICAgICAgICBuID0gciA/IHIudSA6IFIuQUNDRVNTX1RPS0VOLFxuICAgICAgICAgICAgICBpID0gbiAhPT0gdGhpcy5ldmVudERhdGEudG9rZW5VO1xuICAgICAgICAgIG0odGhpcy5hbm9uSWQpIHx8ICh0aGlzLmFub25JZCA9IGQoKSwgaSA9ICEwKTtcbiAgICAgICAgICB2YXIgYSA9IHRoaXMucXVldWUuc2hpZnQoKTtcblxuICAgICAgICAgIGlmICh0aGlzLmV2ZW50RGF0YS5sYXN0U3VjY2Vzcykge1xuICAgICAgICAgICAgdmFyIG8gPSBuZXcgRGF0ZSh0aGlzLmV2ZW50RGF0YS5sYXN0U3VjY2VzcyksXG4gICAgICAgICAgICAgICAgcyA9IG5ldyBEYXRlKGEpLFxuICAgICAgICAgICAgICAgIHUgPSAoYSAtIHRoaXMuZXZlbnREYXRhLmxhc3RTdWNjZXNzKSAvIDg2NGU1O1xuICAgICAgICAgICAgaSA9IGkgfHwgdSA+PSAxIHx8IHUgPCAtMSB8fCBvLmdldERhdGUoKSAhPT0gcy5nZXREYXRlKCk7XG4gICAgICAgICAgfSBlbHNlIGkgPSAhMDtcblxuICAgICAgICAgIGlmICghaSkgcmV0dXJuIHRoaXMucHJvY2Vzc1JlcXVlc3RzKCk7XG4gICAgICAgICAgdGhpcy5wb3N0RXZlbnQoYSwge1xuICAgICAgICAgICAgXCJlbmFibGVkLnRlbGVtZXRyeVwiOiAhMVxuICAgICAgICAgIH0sIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICB0IHx8IChlLmV2ZW50RGF0YS5sYXN0U3VjY2VzcyA9IGEsIGUuZXZlbnREYXRhLnRva2VuVSA9IG4pO1xuICAgICAgICAgIH0sIHQpO1xuICAgICAgICB9XG4gICAgICB9LCBlO1xuICAgIH0oUSkpKCksXG4gICAgICAgIGl0ID0gbnQucG9zdFR1cm5zdGlsZUV2ZW50LmJpbmQobnQpLFxuICAgICAgICBhdCA9IG5ldyBydCgpLFxuICAgICAgICBvdCA9IGF0LnBvc3RNYXBMb2FkRXZlbnQuYmluZChhdCksXG4gICAgICAgIHN0ID0gNTAwLFxuICAgICAgICB1dCA9IDUwO1xuXG4gICAgZnVuY3Rpb24gbHQoKSB7XG4gICAgICBvLmNhY2hlcyAmJiAhdHQgJiYgKHR0ID0gby5jYWNoZXMub3BlbihcIm1hcGJveC10aWxlc1wiKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHQodCkge1xuICAgICAgdmFyIGUgPSB0LmluZGV4T2YoXCI/XCIpO1xuICAgICAgcmV0dXJuIGUgPCAwID8gdCA6IHQuc2xpY2UoMCwgZSk7XG4gICAgfVxuXG4gICAgdmFyIGN0LFxuICAgICAgICBodCA9IDEgLyAwO1xuXG4gICAgZnVuY3Rpb24gZnQoKSB7XG4gICAgICByZXR1cm4gbnVsbCA9PSBjdCAmJiAoY3QgPSBvLk9mZnNjcmVlbkNhbnZhcyAmJiBuZXcgby5PZmZzY3JlZW5DYW52YXMoMSwgMSkuZ2V0Q29udGV4dChcIjJkXCIpICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2Ygby5jcmVhdGVJbWFnZUJpdG1hcCksIGN0O1xuICAgIH1cblxuICAgIHZhciB5dCA9IHtcbiAgICAgIFVua25vd246IFwiVW5rbm93blwiLFxuICAgICAgU3R5bGU6IFwiU3R5bGVcIixcbiAgICAgIFNvdXJjZTogXCJTb3VyY2VcIixcbiAgICAgIFRpbGU6IFwiVGlsZVwiLFxuICAgICAgR2x5cGhzOiBcIkdseXBoc1wiLFxuICAgICAgU3ByaXRlSW1hZ2U6IFwiU3ByaXRlSW1hZ2VcIixcbiAgICAgIFNwcml0ZUpTT046IFwiU3ByaXRlSlNPTlwiLFxuICAgICAgSW1hZ2U6IFwiSW1hZ2VcIlxuICAgIH07XG4gICAgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZnJlZXplICYmIE9iamVjdC5mcmVlemUoeXQpO1xuXG4gICAgdmFyIGR0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoZSwgciwgbikge1xuICAgICAgICA0MDEgPT09IHIgJiYgSihuKSAmJiAoZSArPSBcIjogeW91IG1heSBoYXZlIHByb3ZpZGVkIGFuIGludmFsaWQgTWFwYm94IGFjY2VzcyB0b2tlbi4gU2VlIGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vYXBpLWRvY3VtZW50YXRpb24vI2FjY2Vzcy10b2tlbnMtYW5kLXRva2VuLXNjb3Blc1wiKSwgdC5jYWxsKHRoaXMsIGUpLCB0aGlzLnN0YXR1cyA9IHIsIHRoaXMudXJsID0gbiwgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lLCB0aGlzLm1lc3NhZ2UgPSBlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZSArIFwiOiBcIiArIHRoaXMubWVzc2FnZSArIFwiIChcIiArIHRoaXMuc3RhdHVzICsgXCIpOiBcIiArIHRoaXMudXJsO1xuICAgICAgfSwgZTtcbiAgICB9KEVycm9yKSxcbiAgICAgICAgbXQgPSBJKCkgPyBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gc2VsZi53b3JrZXIgJiYgc2VsZi53b3JrZXIucmVmZXJyZXI7XG4gICAgfSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAoXCJibG9iOlwiID09PSBvLmxvY2F0aW9uLnByb3RvY29sID8gby5wYXJlbnQgOiBvKS5sb2NhdGlvbi5ocmVmO1xuICAgIH07XG5cbiAgICB2YXIgdnQsXG4gICAgICAgIGd0LFxuICAgICAgICB4dCA9IGZ1bmN0aW9uIHh0KHQsIGUpIHtcbiAgICAgIGlmICghKC9eZmlsZTovLnRlc3QociA9IHQudXJsKSB8fCAvXmZpbGU6Ly50ZXN0KG10KCkpICYmICEvXlxcdys6Ly50ZXN0KHIpKSkge1xuICAgICAgICBpZiAoby5mZXRjaCAmJiBvLlJlcXVlc3QgJiYgby5BYm9ydENvbnRyb2xsZXIgJiYgby5SZXF1ZXN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eShcInNpZ25hbFwiKSkgcmV0dXJuIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgdmFyIHIsXG4gICAgICAgICAgICAgIG4gPSBuZXcgby5BYm9ydENvbnRyb2xsZXIoKSxcbiAgICAgICAgICAgICAgaSA9IG5ldyBvLlJlcXVlc3QodC51cmwsIHtcbiAgICAgICAgICAgIG1ldGhvZDogdC5tZXRob2QgfHwgXCJHRVRcIixcbiAgICAgICAgICAgIGJvZHk6IHQuYm9keSxcbiAgICAgICAgICAgIGNyZWRlbnRpYWxzOiB0LmNyZWRlbnRpYWxzLFxuICAgICAgICAgICAgaGVhZGVyczogdC5oZWFkZXJzLFxuICAgICAgICAgICAgcmVmZXJyZXI6IG10KCksXG4gICAgICAgICAgICBzaWduYWw6IG4uc2lnbmFsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgICAgIGEgPSAhMSxcbiAgICAgICAgICAgICAgcyA9ICExLFxuICAgICAgICAgICAgICB1ID0gKHIgPSBpLnVybCkuaW5kZXhPZihcInNrdT1cIikgPiAwICYmIEoocik7XG4gICAgICAgICAgXCJqc29uXCIgPT09IHQudHlwZSAmJiBpLmhlYWRlcnMuc2V0KFwiQWNjZXB0XCIsIFwiYXBwbGljYXRpb24vanNvblwiKTtcblxuICAgICAgICAgIHZhciBsID0gZnVuY3Rpb24gbChyLCBuLCBhKSB7XG4gICAgICAgICAgICBpZiAoIXMpIHtcbiAgICAgICAgICAgICAgaWYgKHIgJiYgXCJTZWN1cml0eUVycm9yXCIgIT09IHIubWVzc2FnZSAmJiBBKHIpLCBuICYmIGEpIHJldHVybiBwKG4pO1xuICAgICAgICAgICAgICB2YXIgbCA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgIG8uZmV0Y2goaSkudGhlbihmdW5jdGlvbiAocikge1xuICAgICAgICAgICAgICAgIGlmIChyLm9rKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgbiA9IHUgPyByLmNsb25lKCkgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHAociwgbiwgbCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGUobmV3IGR0KHIuc3RhdHVzVGV4dCwgci5zdGF0dXMsIHQudXJsKSk7XG4gICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgMjAgIT09IHQuY29kZSAmJiBlKG5ldyBFcnJvcih0Lm1lc3NhZ2UpKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICAgICAgcCA9IGZ1bmN0aW9uIHAociwgbiwgdSkge1xuICAgICAgICAgICAgKFwiYXJyYXlCdWZmZXJcIiA9PT0gdC50eXBlID8gci5hcnJheUJ1ZmZlcigpIDogXCJqc29uXCIgPT09IHQudHlwZSA/IHIuanNvbigpIDogci50ZXh0KCkpLnRoZW4oZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgcyB8fCAobiAmJiB1ICYmIGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICAgICAgICAgICAgaWYgKGx0KCksIHR0KSB7XG4gICAgICAgICAgICAgICAgICB2YXIgbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBlLnN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzVGV4dDogZS5zdGF0dXNUZXh0LFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBuZXcgby5IZWFkZXJzKClcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICBlLmhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5oZWFkZXJzLnNldChlLCB0KTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgdmFyIGkgPSB6KGUuaGVhZGVycy5nZXQoXCJDYWNoZS1Db250cm9sXCIpIHx8IFwiXCIpO1xuICAgICAgICAgICAgICAgICAgaVtcIm5vLXN0b3JlXCJdIHx8IChpW1wibWF4LWFnZVwiXSAmJiBuLmhlYWRlcnMuc2V0KFwiRXhwaXJlc1wiLCBuZXcgRGF0ZShyICsgMWUzICogaVtcIm1heC1hZ2VcIl0pLnRvVVRDU3RyaW5nKCkpLCBuZXcgRGF0ZShuLmhlYWRlcnMuZ2V0KFwiRXhwaXJlc1wiKSkuZ2V0VGltZSgpIC0gciA8IDQyZTQgfHwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZvaWQgMCA9PT0gZXQpIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgbmV3IFJlc3BvbnNlKG5ldyBSZWFkYWJsZVN0cmVhbSgpKSwgZXQgPSAhMDtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgICAgICAgICAgIGV0ID0gITE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZXQgPyBlKHQuYm9keSkgOiB0LmJsb2IoKS50aGVuKGUpO1xuICAgICAgICAgICAgICAgICAgfShlLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG5ldyBvLlJlc3BvbnNlKGUsIG4pO1xuICAgICAgICAgICAgICAgICAgICBsdCgpLCB0dCAmJiB0dC50aGVuKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUucHV0KHB0KHQudXJsKSwgcik7XG4gICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEEodC5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KGksIG4sIHUpLCBhID0gITAsIGUobnVsbCwgdCwgci5oZWFkZXJzLmdldChcIkNhY2hlLUNvbnRyb2xcIiksIHIuaGVhZGVycy5nZXQoXCJFeHBpcmVzXCIpKSk7XG4gICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICBzIHx8IGUobmV3IEVycm9yKHQubWVzc2FnZSkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHJldHVybiB1ID8gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICAgIGlmIChsdCgpLCAhdHQpIHJldHVybiBlKG51bGwpO1xuICAgICAgICAgICAgdmFyIHIgPSBwdCh0LnVybCk7XG4gICAgICAgICAgICB0dC50aGVuKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgIHQubWF0Y2gocikudGhlbihmdW5jdGlvbiAobikge1xuICAgICAgICAgICAgICAgIHZhciBpID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgIGlmICghdCkgcmV0dXJuICExO1xuICAgICAgICAgICAgICAgICAgdmFyIGUgPSBuZXcgRGF0ZSh0LmhlYWRlcnMuZ2V0KFwiRXhwaXJlc1wiKSB8fCAwKSxcbiAgICAgICAgICAgICAgICAgICAgICByID0geih0LmhlYWRlcnMuZ2V0KFwiQ2FjaGUtQ29udHJvbFwiKSB8fCBcIlwiKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBlID4gRGF0ZS5ub3coKSAmJiAhcltcIm5vLWNhY2hlXCJdO1xuICAgICAgICAgICAgICAgIH0obik7XG5cbiAgICAgICAgICAgICAgICB0LmRlbGV0ZShyKSwgaSAmJiB0LnB1dChyLCBuLmNsb25lKCkpLCBlKG51bGwsIG4sIGkpO1xuICAgICAgICAgICAgICB9KS5jYXRjaChlKTtcbiAgICAgICAgICAgIH0pLmNhdGNoKGUpO1xuICAgICAgICAgIH0oaSwgbCkgOiBsKG51bGwsIG51bGwpLCB7XG4gICAgICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uIGNhbmNlbCgpIHtcbiAgICAgICAgICAgICAgcyA9ICEwLCBhIHx8IG4uYWJvcnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9KHQsIGUpO1xuICAgICAgICBpZiAoSSgpICYmIHNlbGYud29ya2VyICYmIHNlbGYud29ya2VyLmFjdG9yKSByZXR1cm4gc2VsZi53b3JrZXIuYWN0b3Iuc2VuZChcImdldFJlc291cmNlXCIsIHQsIGUsIHZvaWQgMCwgITApO1xuICAgICAgfVxuXG4gICAgICB2YXIgcjtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICB2YXIgciA9IG5ldyBvLlhNTEh0dHBSZXF1ZXN0KCk7XG5cbiAgICAgICAgZm9yICh2YXIgbiBpbiByLm9wZW4odC5tZXRob2QgfHwgXCJHRVRcIiwgdC51cmwsICEwKSwgXCJhcnJheUJ1ZmZlclwiID09PSB0LnR5cGUgJiYgKHIucmVzcG9uc2VUeXBlID0gXCJhcnJheWJ1ZmZlclwiKSwgdC5oZWFkZXJzKSB7XG4gICAgICAgICAgci5zZXRSZXF1ZXN0SGVhZGVyKG4sIHQuaGVhZGVyc1tuXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gXCJqc29uXCIgPT09IHQudHlwZSAmJiAoci5yZXNwb25zZVR5cGUgPSBcInRleHRcIiwgci5zZXRSZXF1ZXN0SGVhZGVyKFwiQWNjZXB0XCIsIFwiYXBwbGljYXRpb24vanNvblwiKSksIHIud2l0aENyZWRlbnRpYWxzID0gXCJpbmNsdWRlXCIgPT09IHQuY3JlZGVudGlhbHMsIHIub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBlKG5ldyBFcnJvcihyLnN0YXR1c1RleHQpKTtcbiAgICAgICAgfSwgci5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKChyLnN0YXR1cyA+PSAyMDAgJiYgci5zdGF0dXMgPCAzMDAgfHwgMCA9PT0gci5zdGF0dXMpICYmIG51bGwgIT09IHIucmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHZhciBuID0gci5yZXNwb25zZTtcbiAgICAgICAgICAgIGlmIChcImpzb25cIiA9PT0gdC50eXBlKSB0cnkge1xuICAgICAgICAgICAgICBuID0gSlNPTi5wYXJzZShyLnJlc3BvbnNlKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGUodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlKG51bGwsIG4sIHIuZ2V0UmVzcG9uc2VIZWFkZXIoXCJDYWNoZS1Db250cm9sXCIpLCByLmdldFJlc3BvbnNlSGVhZGVyKFwiRXhwaXJlc1wiKSk7XG4gICAgICAgICAgfSBlbHNlIGUobmV3IGR0KHIuc3RhdHVzVGV4dCwgci5zdGF0dXMsIHQudXJsKSk7XG4gICAgICAgIH0sIHIuc2VuZCh0LmJvZHkpLCB7XG4gICAgICAgICAgY2FuY2VsOiBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgICAgICAgICByZXR1cm4gci5hYm9ydCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0odCwgZSk7XG4gICAgfSxcbiAgICAgICAgYnQgPSBmdW5jdGlvbiBidCh0LCBlKSB7XG4gICAgICByZXR1cm4geHQoaCh0LCB7XG4gICAgICAgIHR5cGU6IFwiYXJyYXlCdWZmZXJcIlxuICAgICAgfSksIGUpO1xuICAgIH0sXG4gICAgICAgIHd0ID0gZnVuY3Rpb24gd3QodCwgZSkge1xuICAgICAgcmV0dXJuIHh0KGgodCwge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiXG4gICAgICB9KSwgZSk7XG4gICAgfSxcbiAgICAgICAgX3QgPSBcImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQUVBQUFBQkNBWUFBQUFmRmNTSkFBQUFDMGxFUVZRWVYyTmdBQUlBQUFVQUFhclZ5RkVBQUFBQVNVVk9SSzVDWUlJPVwiO1xuXG4gICAgdnQgPSBbXSwgZ3QgPSAwO1xuXG4gICAgdmFyIEF0ID0gZnVuY3Rpb24gQXQodCwgZSkge1xuICAgICAgaWYgKFUuc3VwcG9ydGVkICYmICh0LmhlYWRlcnMgfHwgKHQuaGVhZGVycyA9IHt9KSwgdC5oZWFkZXJzLmFjY2VwdCA9IFwiaW1hZ2Uvd2VicCwqLypcIiksIGd0ID49IFIuTUFYX1BBUkFMTEVMX0lNQUdFX1JFUVVFU1RTKSB7XG4gICAgICAgIHZhciByID0ge1xuICAgICAgICAgIHJlcXVlc3RQYXJhbWV0ZXJzOiB0LFxuICAgICAgICAgIGNhbGxiYWNrOiBlLFxuICAgICAgICAgIGNhbmNlbGxlZDogITEsXG4gICAgICAgICAgY2FuY2VsOiBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgICAgICAgICB0aGlzLmNhbmNlbGxlZCA9ICEwO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHZ0LnB1c2gociksIHI7XG4gICAgICB9XG5cbiAgICAgIGd0Kys7XG5cbiAgICAgIHZhciBuID0gITEsXG4gICAgICAgICAgaSA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICAgIGlmICghbikgZm9yIChuID0gITAsIGd0LS07IHZ0Lmxlbmd0aCAmJiBndCA8IFIuTUFYX1BBUkFMTEVMX0lNQUdFX1JFUVVFU1RTOykge1xuICAgICAgICAgIHZhciB0ID0gdnQuc2hpZnQoKTtcbiAgICAgICAgICB0LmNhbmNlbGxlZCB8fCAodC5jYW5jZWwgPSBBdCh0LnJlcXVlc3RQYXJhbWV0ZXJzLCB0LmNhbGxiYWNrKS5jYW5jZWwpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgICAgIGEgPSBidCh0LCBmdW5jdGlvbiAodCwgciwgbiwgYSkge1xuICAgICAgICBpKCksIHQgPyBlKHQpIDogciAmJiAoZnQoKSA/IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgdmFyIHIgPSBuZXcgby5CbG9iKFtuZXcgVWludDhBcnJheSh0KV0sIHtcbiAgICAgICAgICAgIHR5cGU6IFwiaW1hZ2UvcG5nXCJcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBvLmNyZWF0ZUltYWdlQml0bWFwKHIpLnRoZW4oZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgIGUobnVsbCwgdCk7XG4gICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgIGUobmV3IEVycm9yKFwiQ291bGQgbm90IGxvYWQgaW1hZ2UgYmVjYXVzZSBvZiBcIiArIHQubWVzc2FnZSArIFwiLiBQbGVhc2UgbWFrZSBzdXJlIHRvIHVzZSBhIHN1cHBvcnRlZCBpbWFnZSB0eXBlIHN1Y2ggYXMgUE5HIG9yIEpQRUcuIE5vdGUgdGhhdCBTVkdzIGFyZSBub3Qgc3VwcG9ydGVkLlwiKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0ociwgZSkgOiBmdW5jdGlvbiAodCwgZSwgciwgbikge1xuICAgICAgICAgIHZhciBpID0gbmV3IG8uSW1hZ2UoKSxcbiAgICAgICAgICAgICAgYSA9IG8uVVJMO1xuICAgICAgICAgIGkub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZShudWxsLCBpKSwgYS5yZXZva2VPYmplY3RVUkwoaS5zcmMpLCBpLm9ubG9hZCA9IG51bGwsIG8ucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgaS5zcmMgPSBfdDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sIGkub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBlKG5ldyBFcnJvcihcIkNvdWxkIG5vdCBsb2FkIGltYWdlLiBQbGVhc2UgbWFrZSBzdXJlIHRvIHVzZSBhIHN1cHBvcnRlZCBpbWFnZSB0eXBlIHN1Y2ggYXMgUE5HIG9yIEpQRUcuIE5vdGUgdGhhdCBTVkdzIGFyZSBub3Qgc3VwcG9ydGVkLlwiKSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICB2YXIgcyA9IG5ldyBvLkJsb2IoW25ldyBVaW50OEFycmF5KHQpXSwge1xuICAgICAgICAgICAgdHlwZTogXCJpbWFnZS9wbmdcIlxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGkuY2FjaGVDb250cm9sID0gciwgaS5leHBpcmVzID0gbiwgaS5zcmMgPSB0LmJ5dGVMZW5ndGggPyBhLmNyZWF0ZU9iamVjdFVSTChzKSA6IF90O1xuICAgICAgICB9KHIsIGUsIG4sIGEpKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uIGNhbmNlbCgpIHtcbiAgICAgICAgICBhLmNhbmNlbCgpLCBpKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIFN0KHQsIGUsIHIpIHtcbiAgICAgIHJbdF0gJiYgLTEgIT09IHJbdF0uaW5kZXhPZihlKSB8fCAoclt0XSA9IHJbdF0gfHwgW10sIHJbdF0ucHVzaChlKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24ga3QodCwgZSwgcikge1xuICAgICAgaWYgKHIgJiYgclt0XSkge1xuICAgICAgICB2YXIgbiA9IHJbdF0uaW5kZXhPZihlKTtcbiAgICAgICAgLTEgIT09IG4gJiYgclt0XS5zcGxpY2UobiwgMSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIEl0ID0gZnVuY3Rpb24gSXQodCwgZSkge1xuICAgICAgdm9pZCAwID09PSBlICYmIChlID0ge30pLCBoKHRoaXMsIGUpLCB0aGlzLnR5cGUgPSB0O1xuICAgIH0sXG4gICAgICAgIHp0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoZSwgcikge1xuICAgICAgICB2b2lkIDAgPT09IHIgJiYgKHIgPSB7fSksIHQuY2FsbCh0aGlzLCBcImVycm9yXCIsIGgoe1xuICAgICAgICAgIGVycm9yOiBlXG4gICAgICAgIH0sIHIpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZTtcbiAgICB9KEl0KSxcbiAgICAgICAgQ3QgPSBmdW5jdGlvbiBDdCgpIHt9O1xuXG4gICAgQ3QucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHJldHVybiB0aGlzLl9saXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnMgfHwge30sIFN0KHQsIGUsIHRoaXMuX2xpc3RlbmVycyksIHRoaXM7XG4gICAgfSwgQ3QucHJvdG90eXBlLm9mZiA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICByZXR1cm4ga3QodCwgZSwgdGhpcy5fbGlzdGVuZXJzKSwga3QodCwgZSwgdGhpcy5fb25lVGltZUxpc3RlbmVycyksIHRoaXM7XG4gICAgfSwgQ3QucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX29uZVRpbWVMaXN0ZW5lcnMgPSB0aGlzLl9vbmVUaW1lTGlzdGVuZXJzIHx8IHt9LCBTdCh0LCBlLCB0aGlzLl9vbmVUaW1lTGlzdGVuZXJzKSwgdGhpcztcbiAgICB9LCBDdC5wcm90b3R5cGUuZmlyZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICBcInN0cmluZ1wiID09IHR5cGVvZiB0ICYmICh0ID0gbmV3IEl0KHQsIGUgfHwge30pKTtcbiAgICAgIHZhciByID0gdC50eXBlO1xuXG4gICAgICBpZiAodGhpcy5saXN0ZW5zKHIpKSB7XG4gICAgICAgIHQudGFyZ2V0ID0gdGhpcztcblxuICAgICAgICBmb3IgKHZhciBuID0gMCwgaSA9IHRoaXMuX2xpc3RlbmVycyAmJiB0aGlzLl9saXN0ZW5lcnNbcl0gPyB0aGlzLl9saXN0ZW5lcnNbcl0uc2xpY2UoKSA6IFtdOyBuIDwgaS5sZW5ndGg7IG4gKz0gMSkge1xuICAgICAgICAgIGlbbl0uY2FsbCh0aGlzLCB0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGEgPSAwLCBvID0gdGhpcy5fb25lVGltZUxpc3RlbmVycyAmJiB0aGlzLl9vbmVUaW1lTGlzdGVuZXJzW3JdID8gdGhpcy5fb25lVGltZUxpc3RlbmVyc1tyXS5zbGljZSgpIDogW107IGEgPCBvLmxlbmd0aDsgYSArPSAxKSB7XG4gICAgICAgICAgdmFyIHMgPSBvW2FdO1xuICAgICAgICAgIGt0KHIsIHMsIHRoaXMuX29uZVRpbWVMaXN0ZW5lcnMpLCBzLmNhbGwodGhpcywgdCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdSA9IHRoaXMuX2V2ZW50ZWRQYXJlbnQ7XG4gICAgICAgIHUgJiYgKGgodCwgXCJmdW5jdGlvblwiID09IHR5cGVvZiB0aGlzLl9ldmVudGVkUGFyZW50RGF0YSA/IHRoaXMuX2V2ZW50ZWRQYXJlbnREYXRhKCkgOiB0aGlzLl9ldmVudGVkUGFyZW50RGF0YSksIHUuZmlyZSh0KSk7XG4gICAgICB9IGVsc2UgdCBpbnN0YW5jZW9mIHp0ICYmIGNvbnNvbGUuZXJyb3IodC5lcnJvcik7XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sIEN0LnByb3RvdHlwZS5saXN0ZW5zID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9saXN0ZW5lcnMgJiYgdGhpcy5fbGlzdGVuZXJzW3RdICYmIHRoaXMuX2xpc3RlbmVyc1t0XS5sZW5ndGggPiAwIHx8IHRoaXMuX29uZVRpbWVMaXN0ZW5lcnMgJiYgdGhpcy5fb25lVGltZUxpc3RlbmVyc1t0XSAmJiB0aGlzLl9vbmVUaW1lTGlzdGVuZXJzW3RdLmxlbmd0aCA+IDAgfHwgdGhpcy5fZXZlbnRlZFBhcmVudCAmJiB0aGlzLl9ldmVudGVkUGFyZW50Lmxpc3RlbnModCk7XG4gICAgfSwgQ3QucHJvdG90eXBlLnNldEV2ZW50ZWRQYXJlbnQgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2V2ZW50ZWRQYXJlbnQgPSB0LCB0aGlzLl9ldmVudGVkUGFyZW50RGF0YSA9IGUsIHRoaXM7XG4gICAgfTtcblxuICAgIHZhciBFdCA9IHtcbiAgICAgICR2ZXJzaW9uOiA4LFxuICAgICAgJHJvb3Q6IHtcbiAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgIHJlcXVpcmVkOiAhMCxcbiAgICAgICAgICB0eXBlOiBcImVudW1cIixcbiAgICAgICAgICB2YWx1ZXM6IFs4XVxuICAgICAgICB9LFxuICAgICAgICBuYW1lOiB7XG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIlxuICAgICAgICB9LFxuICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgIHR5cGU6IFwiKlwiXG4gICAgICAgIH0sXG4gICAgICAgIGNlbnRlcjoge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICB2YWx1ZTogXCJudW1iZXJcIlxuICAgICAgICB9LFxuICAgICAgICB6b29tOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIlxuICAgICAgICB9LFxuICAgICAgICBiZWFyaW5nOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAwLFxuICAgICAgICAgIHBlcmlvZDogMzYwLFxuICAgICAgICAgIHVuaXRzOiBcImRlZ3JlZXNcIlxuICAgICAgICB9LFxuICAgICAgICBwaXRjaDoge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogMCxcbiAgICAgICAgICB1bml0czogXCJkZWdyZWVzXCJcbiAgICAgICAgfSxcbiAgICAgICAgbGlnaHQ6IHtcbiAgICAgICAgICB0eXBlOiBcImxpZ2h0XCJcbiAgICAgICAgfSxcbiAgICAgICAgc291cmNlczoge1xuICAgICAgICAgIHJlcXVpcmVkOiAhMCxcbiAgICAgICAgICB0eXBlOiBcInNvdXJjZXNcIlxuICAgICAgICB9LFxuICAgICAgICBzcHJpdGU6IHtcbiAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIGdseXBoczoge1xuICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCJcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNpdGlvbjoge1xuICAgICAgICAgIHR5cGU6IFwidHJhbnNpdGlvblwiXG4gICAgICAgIH0sXG4gICAgICAgIGxheWVyczoge1xuICAgICAgICAgIHJlcXVpcmVkOiAhMCxcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgdmFsdWU6IFwibGF5ZXJcIlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc291cmNlczoge1xuICAgICAgICBcIipcIjoge1xuICAgICAgICAgIHR5cGU6IFwic291cmNlXCJcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNvdXJjZTogW1wic291cmNlX3ZlY3RvclwiLCBcInNvdXJjZV9yYXN0ZXJcIiwgXCJzb3VyY2VfcmFzdGVyX2RlbVwiLCBcInNvdXJjZV9nZW9qc29uXCIsIFwic291cmNlX3ZpZGVvXCIsIFwic291cmNlX2ltYWdlXCJdLFxuICAgICAgc291cmNlX3ZlY3Rvcjoge1xuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgcmVxdWlyZWQ6ICEwLFxuICAgICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgdmVjdG9yOiB7fVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgdXJsOiB7XG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIlxuICAgICAgICB9LFxuICAgICAgICB0aWxlczoge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICB2YWx1ZTogXCJzdHJpbmdcIlxuICAgICAgICB9LFxuICAgICAgICBib3VuZHM6IHtcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgdmFsdWU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgbGVuZ3RoOiA0LFxuICAgICAgICAgIGRlZmF1bHQ6IFstMTgwLCAtODUuMDUxMTI5LCAxODAsIDg1LjA1MTEyOV1cbiAgICAgICAgfSxcbiAgICAgICAgc2NoZW1lOiB7XG4gICAgICAgICAgdHlwZTogXCJlbnVtXCIsXG4gICAgICAgICAgdmFsdWVzOiB7XG4gICAgICAgICAgICB4eXo6IHt9LFxuICAgICAgICAgICAgdG1zOiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGVmYXVsdDogXCJ4eXpcIlxuICAgICAgICB9LFxuICAgICAgICBtaW56b29tOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAwXG4gICAgICAgIH0sXG4gICAgICAgIG1heHpvb206IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDIyXG4gICAgICAgIH0sXG4gICAgICAgIGF0dHJpYnV0aW9uOiB7XG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIlxuICAgICAgICB9LFxuICAgICAgICBwcm9tb3RlSWQ6IHtcbiAgICAgICAgICB0eXBlOiBcInByb21vdGVJZFwiXG4gICAgICAgIH0sXG4gICAgICAgIHZvbGF0aWxlOiB7XG4gICAgICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICAgICAgZGVmYXVsdDogITFcbiAgICAgICAgfSxcbiAgICAgICAgXCIqXCI6IHtcbiAgICAgICAgICB0eXBlOiBcIipcIlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc291cmNlX3Jhc3Rlcjoge1xuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgcmVxdWlyZWQ6ICEwLFxuICAgICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgcmFzdGVyOiB7fVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgdXJsOiB7XG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIlxuICAgICAgICB9LFxuICAgICAgICB0aWxlczoge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICB2YWx1ZTogXCJzdHJpbmdcIlxuICAgICAgICB9LFxuICAgICAgICBib3VuZHM6IHtcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgdmFsdWU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgbGVuZ3RoOiA0LFxuICAgICAgICAgIGRlZmF1bHQ6IFstMTgwLCAtODUuMDUxMTI5LCAxODAsIDg1LjA1MTEyOV1cbiAgICAgICAgfSxcbiAgICAgICAgbWluem9vbToge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogMFxuICAgICAgICB9LFxuICAgICAgICBtYXh6b29tOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAyMlxuICAgICAgICB9LFxuICAgICAgICB0aWxlU2l6ZToge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogNTEyLFxuICAgICAgICAgIHVuaXRzOiBcInBpeGVsc1wiXG4gICAgICAgIH0sXG4gICAgICAgIHNjaGVtZToge1xuICAgICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgeHl6OiB7fSxcbiAgICAgICAgICAgIHRtczoge31cbiAgICAgICAgICB9LFxuICAgICAgICAgIGRlZmF1bHQ6IFwieHl6XCJcbiAgICAgICAgfSxcbiAgICAgICAgYXR0cmlidXRpb246IHtcbiAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIHZvbGF0aWxlOiB7XG4gICAgICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICAgICAgZGVmYXVsdDogITFcbiAgICAgICAgfSxcbiAgICAgICAgXCIqXCI6IHtcbiAgICAgICAgICB0eXBlOiBcIipcIlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc291cmNlX3Jhc3Rlcl9kZW06IHtcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgIHJlcXVpcmVkOiAhMCxcbiAgICAgICAgICB0eXBlOiBcImVudW1cIixcbiAgICAgICAgICB2YWx1ZXM6IHtcbiAgICAgICAgICAgIFwicmFzdGVyLWRlbVwiOiB7fVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgdXJsOiB7XG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIlxuICAgICAgICB9LFxuICAgICAgICB0aWxlczoge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICB2YWx1ZTogXCJzdHJpbmdcIlxuICAgICAgICB9LFxuICAgICAgICBib3VuZHM6IHtcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgdmFsdWU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgbGVuZ3RoOiA0LFxuICAgICAgICAgIGRlZmF1bHQ6IFstMTgwLCAtODUuMDUxMTI5LCAxODAsIDg1LjA1MTEyOV1cbiAgICAgICAgfSxcbiAgICAgICAgbWluem9vbToge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogMFxuICAgICAgICB9LFxuICAgICAgICBtYXh6b29tOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAyMlxuICAgICAgICB9LFxuICAgICAgICB0aWxlU2l6ZToge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogNTEyLFxuICAgICAgICAgIHVuaXRzOiBcInBpeGVsc1wiXG4gICAgICAgIH0sXG4gICAgICAgIGF0dHJpYnV0aW9uOiB7XG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIlxuICAgICAgICB9LFxuICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgdGVycmFyaXVtOiB7fSxcbiAgICAgICAgICAgIG1hcGJveDoge31cbiAgICAgICAgICB9LFxuICAgICAgICAgIGRlZmF1bHQ6IFwibWFwYm94XCJcbiAgICAgICAgfSxcbiAgICAgICAgdm9sYXRpbGU6IHtcbiAgICAgICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgICAgICBkZWZhdWx0OiAhMVxuICAgICAgICB9LFxuICAgICAgICBcIipcIjoge1xuICAgICAgICAgIHR5cGU6IFwiKlwiXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzb3VyY2VfZ2VvanNvbjoge1xuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgcmVxdWlyZWQ6ICEwLFxuICAgICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgZ2VvanNvbjoge31cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICB0eXBlOiBcIipcIlxuICAgICAgICB9LFxuICAgICAgICBtYXh6b29tOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAxOFxuICAgICAgICB9LFxuICAgICAgICBhdHRyaWJ1dGlvbjoge1xuICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCJcbiAgICAgICAgfSxcbiAgICAgICAgYnVmZmVyOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAxMjgsXG4gICAgICAgICAgbWF4aW11bTogNTEyLFxuICAgICAgICAgIG1pbmltdW06IDBcbiAgICAgICAgfSxcbiAgICAgICAgZmlsdGVyOiB7XG4gICAgICAgICAgdHlwZTogXCIqXCJcbiAgICAgICAgfSxcbiAgICAgICAgdG9sZXJhbmNlOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAuMzc1XG4gICAgICAgIH0sXG4gICAgICAgIGNsdXN0ZXI6IHtcbiAgICAgICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgICAgICBkZWZhdWx0OiAhMVxuICAgICAgICB9LFxuICAgICAgICBjbHVzdGVyUmFkaXVzOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiA1MCxcbiAgICAgICAgICBtaW5pbXVtOiAwXG4gICAgICAgIH0sXG4gICAgICAgIGNsdXN0ZXJNYXhab29tOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIlxuICAgICAgICB9LFxuICAgICAgICBjbHVzdGVyTWluUG9pbnRzOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIlxuICAgICAgICB9LFxuICAgICAgICBjbHVzdGVyUHJvcGVydGllczoge1xuICAgICAgICAgIHR5cGU6IFwiKlwiXG4gICAgICAgIH0sXG4gICAgICAgIGxpbmVNZXRyaWNzOiB7XG4gICAgICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICAgICAgZGVmYXVsdDogITFcbiAgICAgICAgfSxcbiAgICAgICAgZ2VuZXJhdGVJZDoge1xuICAgICAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgICAgIGRlZmF1bHQ6ICExXG4gICAgICAgIH0sXG4gICAgICAgIHByb21vdGVJZDoge1xuICAgICAgICAgIHR5cGU6IFwicHJvbW90ZUlkXCJcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNvdXJjZV92aWRlbzoge1xuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgcmVxdWlyZWQ6ICEwLFxuICAgICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgdmlkZW86IHt9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB1cmxzOiB7XG4gICAgICAgICAgcmVxdWlyZWQ6ICEwLFxuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICB2YWx1ZTogXCJzdHJpbmdcIlxuICAgICAgICB9LFxuICAgICAgICBjb29yZGluYXRlczoge1xuICAgICAgICAgIHJlcXVpcmVkOiAhMCxcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgbGVuZ3RoOiA0LFxuICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgICBsZW5ndGg6IDIsXG4gICAgICAgICAgICB2YWx1ZTogXCJudW1iZXJcIlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNvdXJjZV9pbWFnZToge1xuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgcmVxdWlyZWQ6ICEwLFxuICAgICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgaW1hZ2U6IHt9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB1cmw6IHtcbiAgICAgICAgICByZXF1aXJlZDogITAsXG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIlxuICAgICAgICB9LFxuICAgICAgICBjb29yZGluYXRlczoge1xuICAgICAgICAgIHJlcXVpcmVkOiAhMCxcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgbGVuZ3RoOiA0LFxuICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgICBsZW5ndGg6IDIsXG4gICAgICAgICAgICB2YWx1ZTogXCJudW1iZXJcIlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGxheWVyOiB7XG4gICAgICAgIGlkOiB7XG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICByZXF1aXJlZDogITBcbiAgICAgICAgfSxcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgZmlsbDoge30sXG4gICAgICAgICAgICBsaW5lOiB7fSxcbiAgICAgICAgICAgIHN5bWJvbDoge30sXG4gICAgICAgICAgICBjaXJjbGU6IHt9LFxuICAgICAgICAgICAgaGVhdG1hcDoge30sXG4gICAgICAgICAgICBcImZpbGwtZXh0cnVzaW9uXCI6IHt9LFxuICAgICAgICAgICAgcmFzdGVyOiB7fSxcbiAgICAgICAgICAgIGhpbGxzaGFkZToge30sXG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVxdWlyZWQ6ICEwXG4gICAgICAgIH0sXG4gICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgdHlwZTogXCIqXCJcbiAgICAgICAgfSxcbiAgICAgICAgc291cmNlOiB7XG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIlxuICAgICAgICB9LFxuICAgICAgICBcInNvdXJjZS1sYXllclwiOiB7XG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIlxuICAgICAgICB9LFxuICAgICAgICBtaW56b29tOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBtaW5pbXVtOiAwLFxuICAgICAgICAgIG1heGltdW06IDI0XG4gICAgICAgIH0sXG4gICAgICAgIG1heHpvb206IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIG1pbmltdW06IDAsXG4gICAgICAgICAgbWF4aW11bTogMjRcbiAgICAgICAgfSxcbiAgICAgICAgZmlsdGVyOiB7XG4gICAgICAgICAgdHlwZTogXCJmaWx0ZXJcIlxuICAgICAgICB9LFxuICAgICAgICBsYXlvdXQ6IHtcbiAgICAgICAgICB0eXBlOiBcImxheW91dFwiXG4gICAgICAgIH0sXG4gICAgICAgIHBhaW50OiB7XG4gICAgICAgICAgdHlwZTogXCJwYWludFwiXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBsYXlvdXQ6IFtcImxheW91dF9maWxsXCIsIFwibGF5b3V0X2xpbmVcIiwgXCJsYXlvdXRfY2lyY2xlXCIsIFwibGF5b3V0X2hlYXRtYXBcIiwgXCJsYXlvdXRfZmlsbC1leHRydXNpb25cIiwgXCJsYXlvdXRfc3ltYm9sXCIsIFwibGF5b3V0X3Jhc3RlclwiLCBcImxheW91dF9oaWxsc2hhZGVcIiwgXCJsYXlvdXRfYmFja2dyb3VuZFwiXSxcbiAgICAgIGxheW91dF9iYWNrZ3JvdW5kOiB7XG4gICAgICAgIHZpc2liaWxpdHk6IHtcbiAgICAgICAgICB0eXBlOiBcImVudW1cIixcbiAgICAgICAgICB2YWx1ZXM6IHtcbiAgICAgICAgICAgIHZpc2libGU6IHt9LFxuICAgICAgICAgICAgbm9uZToge31cbiAgICAgICAgICB9LFxuICAgICAgICAgIGRlZmF1bHQ6IFwidmlzaWJsZVwiLFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImNvbnN0YW50XCJcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGxheW91dF9maWxsOiB7XG4gICAgICAgIFwiZmlsbC1zb3J0LWtleVwiOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICExLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtZHJpdmVuXCJcbiAgICAgICAgfSxcbiAgICAgICAgdmlzaWJpbGl0eToge1xuICAgICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgdmlzaWJsZToge30sXG4gICAgICAgICAgICBub25lOiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGVmYXVsdDogXCJ2aXNpYmxlXCIsXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiY29uc3RhbnRcIlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgbGF5b3V0X2NpcmNsZToge1xuICAgICAgICBcImNpcmNsZS1zb3J0LWtleVwiOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICExLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtZHJpdmVuXCJcbiAgICAgICAgfSxcbiAgICAgICAgdmlzaWJpbGl0eToge1xuICAgICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgdmlzaWJsZToge30sXG4gICAgICAgICAgICBub25lOiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGVmYXVsdDogXCJ2aXNpYmxlXCIsXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiY29uc3RhbnRcIlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgbGF5b3V0X2hlYXRtYXA6IHtcbiAgICAgICAgdmlzaWJpbGl0eToge1xuICAgICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgdmlzaWJsZToge30sXG4gICAgICAgICAgICBub25lOiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGVmYXVsdDogXCJ2aXNpYmxlXCIsXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiY29uc3RhbnRcIlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJsYXlvdXRfZmlsbC1leHRydXNpb25cIjoge1xuICAgICAgICB2aXNpYmlsaXR5OiB7XG4gICAgICAgICAgdHlwZTogXCJlbnVtXCIsXG4gICAgICAgICAgdmFsdWVzOiB7XG4gICAgICAgICAgICB2aXNpYmxlOiB7fSxcbiAgICAgICAgICAgIG5vbmU6IHt9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBkZWZhdWx0OiBcInZpc2libGVcIixcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJjb25zdGFudFwiXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBsYXlvdXRfbGluZToge1xuICAgICAgICBcImxpbmUtY2FwXCI6IHtcbiAgICAgICAgICB0eXBlOiBcImVudW1cIixcbiAgICAgICAgICB2YWx1ZXM6IHtcbiAgICAgICAgICAgIGJ1dHQ6IHt9LFxuICAgICAgICAgICAgcm91bmQ6IHt9LFxuICAgICAgICAgICAgc3F1YXJlOiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGVmYXVsdDogXCJidXR0XCIsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImxpbmUtam9pblwiOiB7XG4gICAgICAgICAgdHlwZTogXCJlbnVtXCIsXG4gICAgICAgICAgdmFsdWVzOiB7XG4gICAgICAgICAgICBiZXZlbDoge30sXG4gICAgICAgICAgICByb3VuZDoge30sXG4gICAgICAgICAgICBtaXRlcjoge31cbiAgICAgICAgICB9LFxuICAgICAgICAgIGRlZmF1bHQ6IFwibWl0ZXJcIixcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICExLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtZHJpdmVuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJsaW5lLW1pdGVyLWxpbWl0XCI6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDIsXG4gICAgICAgICAgcmVxdWlyZXM6IFt7XG4gICAgICAgICAgICBcImxpbmUtam9pblwiOiBcIm1pdGVyXCJcbiAgICAgICAgICB9XSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1jb25zdGFudFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibGluZS1yb3VuZC1saW1pdFwiOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAxLjA1LFxuICAgICAgICAgIHJlcXVpcmVzOiBbe1xuICAgICAgICAgICAgXCJsaW5lLWpvaW5cIjogXCJyb3VuZFwiXG4gICAgICAgICAgfV0sXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImxpbmUtc29ydC1rZXlcIjoge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIiwgXCJmZWF0dXJlXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWRyaXZlblwiXG4gICAgICAgIH0sXG4gICAgICAgIHZpc2liaWxpdHk6IHtcbiAgICAgICAgICB0eXBlOiBcImVudW1cIixcbiAgICAgICAgICB2YWx1ZXM6IHtcbiAgICAgICAgICAgIHZpc2libGU6IHt9LFxuICAgICAgICAgICAgbm9uZToge31cbiAgICAgICAgICB9LFxuICAgICAgICAgIGRlZmF1bHQ6IFwidmlzaWJsZVwiLFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImNvbnN0YW50XCJcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGxheW91dF9zeW1ib2w6IHtcbiAgICAgICAgXCJzeW1ib2wtcGxhY2VtZW50XCI6IHtcbiAgICAgICAgICB0eXBlOiBcImVudW1cIixcbiAgICAgICAgICB2YWx1ZXM6IHtcbiAgICAgICAgICAgIHBvaW50OiB7fSxcbiAgICAgICAgICAgIGxpbmU6IHt9LFxuICAgICAgICAgICAgXCJsaW5lLWNlbnRlclwiOiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGVmYXVsdDogXCJwb2ludFwiLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITEsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzeW1ib2wtc3BhY2luZ1wiOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAyNTAsXG4gICAgICAgICAgbWluaW11bTogMSxcbiAgICAgICAgICB1bml0czogXCJwaXhlbHNcIixcbiAgICAgICAgICByZXF1aXJlczogW3tcbiAgICAgICAgICAgIFwic3ltYm9sLXBsYWNlbWVudFwiOiBcImxpbmVcIlxuICAgICAgICAgIH1dLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzeW1ib2wtYXZvaWQtZWRnZXNcIjoge1xuICAgICAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgICAgIGRlZmF1bHQ6ICExLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITEsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzeW1ib2wtc29ydC1rZXlcIjoge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIiwgXCJmZWF0dXJlXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWRyaXZlblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwic3ltYm9sLXotb3JkZXJcIjoge1xuICAgICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgYXV0bzoge30sXG4gICAgICAgICAgICBcInZpZXdwb3J0LXlcIjoge30sXG4gICAgICAgICAgICBzb3VyY2U6IHt9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBkZWZhdWx0OiBcImF1dG9cIixcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICExLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1jb25zdGFudFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiaWNvbi1hbGxvdy1vdmVybGFwXCI6IHtcbiAgICAgICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgICAgICBkZWZhdWx0OiAhMSxcbiAgICAgICAgICByZXF1aXJlczogW1wiaWNvbi1pbWFnZVwiXSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICExLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1jb25zdGFudFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiaWNvbi1pZ25vcmUtcGxhY2VtZW50XCI6IHtcbiAgICAgICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgICAgICBkZWZhdWx0OiAhMSxcbiAgICAgICAgICByZXF1aXJlczogW1wiaWNvbi1pbWFnZVwiXSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICExLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1jb25zdGFudFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiaWNvbi1vcHRpb25hbFwiOiB7XG4gICAgICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICAgICAgZGVmYXVsdDogITEsXG4gICAgICAgICAgcmVxdWlyZXM6IFtcImljb24taW1hZ2VcIiwgXCJ0ZXh0LWZpZWxkXCJdLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITEsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJpY29uLXJvdGF0aW9uLWFsaWdubWVudFwiOiB7XG4gICAgICAgICAgdHlwZTogXCJlbnVtXCIsXG4gICAgICAgICAgdmFsdWVzOiB7XG4gICAgICAgICAgICBtYXA6IHt9LFxuICAgICAgICAgICAgdmlld3BvcnQ6IHt9LFxuICAgICAgICAgICAgYXV0bzoge31cbiAgICAgICAgICB9LFxuICAgICAgICAgIGRlZmF1bHQ6IFwiYXV0b1wiLFxuICAgICAgICAgIHJlcXVpcmVzOiBbXCJpY29uLWltYWdlXCJdLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITEsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJpY29uLXNpemVcIjoge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogMSxcbiAgICAgICAgICBtaW5pbXVtOiAwLFxuICAgICAgICAgIHVuaXRzOiBcImZhY3RvciBvZiB0aGUgb3JpZ2luYWwgaWNvbiBzaXplXCIsXG4gICAgICAgICAgcmVxdWlyZXM6IFtcImljb24taW1hZ2VcIl0sXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIiwgXCJmZWF0dXJlXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWRyaXZlblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiaWNvbi10ZXh0LWZpdFwiOiB7XG4gICAgICAgICAgdHlwZTogXCJlbnVtXCIsXG4gICAgICAgICAgdmFsdWVzOiB7XG4gICAgICAgICAgICBub25lOiB7fSxcbiAgICAgICAgICAgIHdpZHRoOiB7fSxcbiAgICAgICAgICAgIGhlaWdodDoge30sXG4gICAgICAgICAgICBib3RoOiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGVmYXVsdDogXCJub25lXCIsXG4gICAgICAgICAgcmVxdWlyZXM6IFtcImljb24taW1hZ2VcIiwgXCJ0ZXh0LWZpZWxkXCJdLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITEsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJpY29uLXRleHQtZml0LXBhZGRpbmdcIjoge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICB2YWx1ZTogXCJudW1iZXJcIixcbiAgICAgICAgICBsZW5ndGg6IDQsXG4gICAgICAgICAgZGVmYXVsdDogWzAsIDAsIDAsIDBdLFxuICAgICAgICAgIHVuaXRzOiBcInBpeGVsc1wiLFxuICAgICAgICAgIHJlcXVpcmVzOiBbXCJpY29uLWltYWdlXCIsIFwidGV4dC1maWVsZFwiLCB7XG4gICAgICAgICAgICBcImljb24tdGV4dC1maXRcIjogW1wiYm90aFwiLCBcIndpZHRoXCIsIFwiaGVpZ2h0XCJdXG4gICAgICAgICAgfV0sXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImljb24taW1hZ2VcIjoge1xuICAgICAgICAgIHR5cGU6IFwicmVzb2x2ZWRJbWFnZVwiLFxuICAgICAgICAgIHRva2VuczogITAsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIiwgXCJmZWF0dXJlXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWRyaXZlblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiaWNvbi1yb3RhdGVcIjoge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogMCxcbiAgICAgICAgICBwZXJpb2Q6IDM2MCxcbiAgICAgICAgICB1bml0czogXCJkZWdyZWVzXCIsXG4gICAgICAgICAgcmVxdWlyZXM6IFtcImljb24taW1hZ2VcIl0sXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIiwgXCJmZWF0dXJlXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWRyaXZlblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiaWNvbi1wYWRkaW5nXCI6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDIsXG4gICAgICAgICAgbWluaW11bTogMCxcbiAgICAgICAgICB1bml0czogXCJwaXhlbHNcIixcbiAgICAgICAgICByZXF1aXJlczogW1wiaWNvbi1pbWFnZVwiXSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1jb25zdGFudFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiaWNvbi1rZWVwLXVwcmlnaHRcIjoge1xuICAgICAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgICAgIGRlZmF1bHQ6ICExLFxuICAgICAgICAgIHJlcXVpcmVzOiBbXCJpY29uLWltYWdlXCIsIHtcbiAgICAgICAgICAgIFwiaWNvbi1yb3RhdGlvbi1hbGlnbm1lbnRcIjogXCJtYXBcIlxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIFwic3ltYm9sLXBsYWNlbWVudFwiOiBbXCJsaW5lXCIsIFwibGluZS1jZW50ZXJcIl1cbiAgICAgICAgICB9XSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICExLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1jb25zdGFudFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiaWNvbi1vZmZzZXRcIjoge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICB2YWx1ZTogXCJudW1iZXJcIixcbiAgICAgICAgICBsZW5ndGg6IDIsXG4gICAgICAgICAgZGVmYXVsdDogWzAsIDBdLFxuICAgICAgICAgIHJlcXVpcmVzOiBbXCJpY29uLWltYWdlXCJdLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCIsIFwiZmVhdHVyZVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1kcml2ZW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImljb24tYW5jaG9yXCI6IHtcbiAgICAgICAgICB0eXBlOiBcImVudW1cIixcbiAgICAgICAgICB2YWx1ZXM6IHtcbiAgICAgICAgICAgIGNlbnRlcjoge30sXG4gICAgICAgICAgICBsZWZ0OiB7fSxcbiAgICAgICAgICAgIHJpZ2h0OiB7fSxcbiAgICAgICAgICAgIHRvcDoge30sXG4gICAgICAgICAgICBib3R0b206IHt9LFxuICAgICAgICAgICAgXCJ0b3AtbGVmdFwiOiB7fSxcbiAgICAgICAgICAgIFwidG9wLXJpZ2h0XCI6IHt9LFxuICAgICAgICAgICAgXCJib3R0b20tbGVmdFwiOiB7fSxcbiAgICAgICAgICAgIFwiYm90dG9tLXJpZ2h0XCI6IHt9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBkZWZhdWx0OiBcImNlbnRlclwiLFxuICAgICAgICAgIHJlcXVpcmVzOiBbXCJpY29uLWltYWdlXCJdLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITEsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCIsIFwiZmVhdHVyZVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1kcml2ZW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImljb24tcGl0Y2gtYWxpZ25tZW50XCI6IHtcbiAgICAgICAgICB0eXBlOiBcImVudW1cIixcbiAgICAgICAgICB2YWx1ZXM6IHtcbiAgICAgICAgICAgIG1hcDoge30sXG4gICAgICAgICAgICB2aWV3cG9ydDoge30sXG4gICAgICAgICAgICBhdXRvOiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGVmYXVsdDogXCJhdXRvXCIsXG4gICAgICAgICAgcmVxdWlyZXM6IFtcImljb24taW1hZ2VcIl0sXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcInRleHQtcGl0Y2gtYWxpZ25tZW50XCI6IHtcbiAgICAgICAgICB0eXBlOiBcImVudW1cIixcbiAgICAgICAgICB2YWx1ZXM6IHtcbiAgICAgICAgICAgIG1hcDoge30sXG4gICAgICAgICAgICB2aWV3cG9ydDoge30sXG4gICAgICAgICAgICBhdXRvOiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGVmYXVsdDogXCJhdXRvXCIsXG4gICAgICAgICAgcmVxdWlyZXM6IFtcInRleHQtZmllbGRcIl0sXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcInRleHQtcm90YXRpb24tYWxpZ25tZW50XCI6IHtcbiAgICAgICAgICB0eXBlOiBcImVudW1cIixcbiAgICAgICAgICB2YWx1ZXM6IHtcbiAgICAgICAgICAgIG1hcDoge30sXG4gICAgICAgICAgICB2aWV3cG9ydDoge30sXG4gICAgICAgICAgICBhdXRvOiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGVmYXVsdDogXCJhdXRvXCIsXG4gICAgICAgICAgcmVxdWlyZXM6IFtcInRleHQtZmllbGRcIl0sXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcInRleHQtZmllbGRcIjoge1xuICAgICAgICAgIHR5cGU6IFwiZm9ybWF0dGVkXCIsXG4gICAgICAgICAgZGVmYXVsdDogXCJcIixcbiAgICAgICAgICB0b2tlbnM6ICEwLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITEsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCIsIFwiZmVhdHVyZVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1kcml2ZW5cIlxuICAgICAgICB9LFxuICAgICAgICBcInRleHQtZm9udFwiOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIHZhbHVlOiBcInN0cmluZ1wiLFxuICAgICAgICAgIGRlZmF1bHQ6IFtcIk9wZW4gU2FucyBSZWd1bGFyXCIsIFwiQXJpYWwgVW5pY29kZSBNUyBSZWd1bGFyXCJdLFxuICAgICAgICAgIHJlcXVpcmVzOiBbXCJ0ZXh0LWZpZWxkXCJdLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITEsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCIsIFwiZmVhdHVyZVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1kcml2ZW5cIlxuICAgICAgICB9LFxuICAgICAgICBcInRleHQtc2l6ZVwiOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAxNixcbiAgICAgICAgICBtaW5pbXVtOiAwLFxuICAgICAgICAgIHVuaXRzOiBcInBpeGVsc1wiLFxuICAgICAgICAgIHJlcXVpcmVzOiBbXCJ0ZXh0LWZpZWxkXCJdLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCIsIFwiZmVhdHVyZVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1kcml2ZW5cIlxuICAgICAgICB9LFxuICAgICAgICBcInRleHQtbWF4LXdpZHRoXCI6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDEwLFxuICAgICAgICAgIG1pbmltdW06IDAsXG4gICAgICAgICAgdW5pdHM6IFwiZW1zXCIsXG4gICAgICAgICAgcmVxdWlyZXM6IFtcInRleHQtZmllbGRcIl0sXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIiwgXCJmZWF0dXJlXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWRyaXZlblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidGV4dC1saW5lLWhlaWdodFwiOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAxLjIsXG4gICAgICAgICAgdW5pdHM6IFwiZW1zXCIsXG4gICAgICAgICAgcmVxdWlyZXM6IFtcInRleHQtZmllbGRcIl0sXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcInRleHQtbGV0dGVyLXNwYWNpbmdcIjoge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogMCxcbiAgICAgICAgICB1bml0czogXCJlbXNcIixcbiAgICAgICAgICByZXF1aXJlczogW1widGV4dC1maWVsZFwiXSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtZHJpdmVuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0ZXh0LWp1c3RpZnlcIjoge1xuICAgICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgYXV0bzoge30sXG4gICAgICAgICAgICBsZWZ0OiB7fSxcbiAgICAgICAgICAgIGNlbnRlcjoge30sXG4gICAgICAgICAgICByaWdodDoge31cbiAgICAgICAgICB9LFxuICAgICAgICAgIGRlZmF1bHQ6IFwiY2VudGVyXCIsXG4gICAgICAgICAgcmVxdWlyZXM6IFtcInRleHQtZmllbGRcIl0sXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIiwgXCJmZWF0dXJlXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWRyaXZlblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidGV4dC1yYWRpYWwtb2Zmc2V0XCI6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIHVuaXRzOiBcImVtc1wiLFxuICAgICAgICAgIGRlZmF1bHQ6IDAsXG4gICAgICAgICAgcmVxdWlyZXM6IFtcInRleHQtZmllbGRcIl0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1kcml2ZW5cIixcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIl1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwidGV4dC12YXJpYWJsZS1hbmNob3JcIjoge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICB2YWx1ZTogXCJlbnVtXCIsXG4gICAgICAgICAgdmFsdWVzOiB7XG4gICAgICAgICAgICBjZW50ZXI6IHt9LFxuICAgICAgICAgICAgbGVmdDoge30sXG4gICAgICAgICAgICByaWdodDoge30sXG4gICAgICAgICAgICB0b3A6IHt9LFxuICAgICAgICAgICAgYm90dG9tOiB7fSxcbiAgICAgICAgICAgIFwidG9wLWxlZnRcIjoge30sXG4gICAgICAgICAgICBcInRvcC1yaWdodFwiOiB7fSxcbiAgICAgICAgICAgIFwiYm90dG9tLWxlZnRcIjoge30sXG4gICAgICAgICAgICBcImJvdHRvbS1yaWdodFwiOiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVxdWlyZXM6IFtcInRleHQtZmllbGRcIiwge1xuICAgICAgICAgICAgXCJzeW1ib2wtcGxhY2VtZW50XCI6IFtcInBvaW50XCJdXG4gICAgICAgICAgfV0sXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcInRleHQtYW5jaG9yXCI6IHtcbiAgICAgICAgICB0eXBlOiBcImVudW1cIixcbiAgICAgICAgICB2YWx1ZXM6IHtcbiAgICAgICAgICAgIGNlbnRlcjoge30sXG4gICAgICAgICAgICBsZWZ0OiB7fSxcbiAgICAgICAgICAgIHJpZ2h0OiB7fSxcbiAgICAgICAgICAgIHRvcDoge30sXG4gICAgICAgICAgICBib3R0b206IHt9LFxuICAgICAgICAgICAgXCJ0b3AtbGVmdFwiOiB7fSxcbiAgICAgICAgICAgIFwidG9wLXJpZ2h0XCI6IHt9LFxuICAgICAgICAgICAgXCJib3R0b20tbGVmdFwiOiB7fSxcbiAgICAgICAgICAgIFwiYm90dG9tLXJpZ2h0XCI6IHt9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBkZWZhdWx0OiBcImNlbnRlclwiLFxuICAgICAgICAgIHJlcXVpcmVzOiBbXCJ0ZXh0LWZpZWxkXCIsIHtcbiAgICAgICAgICAgIFwiIVwiOiBcInRleHQtdmFyaWFibGUtYW5jaG9yXCJcbiAgICAgICAgICB9XSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICExLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtZHJpdmVuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0ZXh0LW1heC1hbmdsZVwiOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiA0NSxcbiAgICAgICAgICB1bml0czogXCJkZWdyZWVzXCIsXG4gICAgICAgICAgcmVxdWlyZXM6IFtcInRleHQtZmllbGRcIiwge1xuICAgICAgICAgICAgXCJzeW1ib2wtcGxhY2VtZW50XCI6IFtcImxpbmVcIiwgXCJsaW5lLWNlbnRlclwiXVxuICAgICAgICAgIH1dLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0ZXh0LXdyaXRpbmctbW9kZVwiOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIHZhbHVlOiBcImVudW1cIixcbiAgICAgICAgICB2YWx1ZXM6IHtcbiAgICAgICAgICAgIGhvcml6b250YWw6IHt9LFxuICAgICAgICAgICAgdmVydGljYWw6IHt9XG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXF1aXJlczogW1widGV4dC1maWVsZFwiLCB7XG4gICAgICAgICAgICBcInN5bWJvbC1wbGFjZW1lbnRcIjogW1wicG9pbnRcIl1cbiAgICAgICAgICB9XSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICExLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1jb25zdGFudFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidGV4dC1yb3RhdGVcIjoge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogMCxcbiAgICAgICAgICBwZXJpb2Q6IDM2MCxcbiAgICAgICAgICB1bml0czogXCJkZWdyZWVzXCIsXG4gICAgICAgICAgcmVxdWlyZXM6IFtcInRleHQtZmllbGRcIl0sXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIiwgXCJmZWF0dXJlXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWRyaXZlblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidGV4dC1wYWRkaW5nXCI6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDIsXG4gICAgICAgICAgbWluaW11bTogMCxcbiAgICAgICAgICB1bml0czogXCJwaXhlbHNcIixcbiAgICAgICAgICByZXF1aXJlczogW1widGV4dC1maWVsZFwiXSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1jb25zdGFudFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidGV4dC1rZWVwLXVwcmlnaHRcIjoge1xuICAgICAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgICAgIGRlZmF1bHQ6ICEwLFxuICAgICAgICAgIHJlcXVpcmVzOiBbXCJ0ZXh0LWZpZWxkXCIsIHtcbiAgICAgICAgICAgIFwidGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIjogXCJtYXBcIlxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIFwic3ltYm9sLXBsYWNlbWVudFwiOiBbXCJsaW5lXCIsIFwibGluZS1jZW50ZXJcIl1cbiAgICAgICAgICB9XSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICExLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1jb25zdGFudFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidGV4dC10cmFuc2Zvcm1cIjoge1xuICAgICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgbm9uZToge30sXG4gICAgICAgICAgICB1cHBlcmNhc2U6IHt9LFxuICAgICAgICAgICAgbG93ZXJjYXNlOiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGVmYXVsdDogXCJub25lXCIsXG4gICAgICAgICAgcmVxdWlyZXM6IFtcInRleHQtZmllbGRcIl0sXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIiwgXCJmZWF0dXJlXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWRyaXZlblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidGV4dC1vZmZzZXRcIjoge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICB2YWx1ZTogXCJudW1iZXJcIixcbiAgICAgICAgICB1bml0czogXCJlbXNcIixcbiAgICAgICAgICBsZW5ndGg6IDIsXG4gICAgICAgICAgZGVmYXVsdDogWzAsIDBdLFxuICAgICAgICAgIHJlcXVpcmVzOiBbXCJ0ZXh0LWZpZWxkXCIsIHtcbiAgICAgICAgICAgIFwiIVwiOiBcInRleHQtcmFkaWFsLW9mZnNldFwiXG4gICAgICAgICAgfV0sXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIiwgXCJmZWF0dXJlXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWRyaXZlblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidGV4dC1hbGxvdy1vdmVybGFwXCI6IHtcbiAgICAgICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgICAgICBkZWZhdWx0OiAhMSxcbiAgICAgICAgICByZXF1aXJlczogW1widGV4dC1maWVsZFwiXSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICExLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1jb25zdGFudFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidGV4dC1pZ25vcmUtcGxhY2VtZW50XCI6IHtcbiAgICAgICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgICAgICBkZWZhdWx0OiAhMSxcbiAgICAgICAgICByZXF1aXJlczogW1widGV4dC1maWVsZFwiXSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICExLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1jb25zdGFudFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidGV4dC1vcHRpb25hbFwiOiB7XG4gICAgICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICAgICAgZGVmYXVsdDogITEsXG4gICAgICAgICAgcmVxdWlyZXM6IFtcInRleHQtZmllbGRcIiwgXCJpY29uLWltYWdlXCJdLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITEsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgdmlzaWJpbGl0eToge1xuICAgICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgdmlzaWJsZToge30sXG4gICAgICAgICAgICBub25lOiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGVmYXVsdDogXCJ2aXNpYmxlXCIsXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiY29uc3RhbnRcIlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgbGF5b3V0X3Jhc3Rlcjoge1xuICAgICAgICB2aXNpYmlsaXR5OiB7XG4gICAgICAgICAgdHlwZTogXCJlbnVtXCIsXG4gICAgICAgICAgdmFsdWVzOiB7XG4gICAgICAgICAgICB2aXNpYmxlOiB7fSxcbiAgICAgICAgICAgIG5vbmU6IHt9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBkZWZhdWx0OiBcInZpc2libGVcIixcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJjb25zdGFudFwiXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBsYXlvdXRfaGlsbHNoYWRlOiB7XG4gICAgICAgIHZpc2liaWxpdHk6IHtcbiAgICAgICAgICB0eXBlOiBcImVudW1cIixcbiAgICAgICAgICB2YWx1ZXM6IHtcbiAgICAgICAgICAgIHZpc2libGU6IHt9LFxuICAgICAgICAgICAgbm9uZToge31cbiAgICAgICAgICB9LFxuICAgICAgICAgIGRlZmF1bHQ6IFwidmlzaWJsZVwiLFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImNvbnN0YW50XCJcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGZpbHRlcjoge1xuICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgIHZhbHVlOiBcIipcIlxuICAgICAgfSxcbiAgICAgIGZpbHRlcl9vcGVyYXRvcjoge1xuICAgICAgICB0eXBlOiBcImVudW1cIixcbiAgICAgICAgdmFsdWVzOiB7XG4gICAgICAgICAgXCI9PVwiOiB7fSxcbiAgICAgICAgICBcIiE9XCI6IHt9LFxuICAgICAgICAgIFwiPlwiOiB7fSxcbiAgICAgICAgICBcIj49XCI6IHt9LFxuICAgICAgICAgIFwiPFwiOiB7fSxcbiAgICAgICAgICBcIjw9XCI6IHt9LFxuICAgICAgICAgIGluOiB7fSxcbiAgICAgICAgICBcIiFpblwiOiB7fSxcbiAgICAgICAgICBhbGw6IHt9LFxuICAgICAgICAgIGFueToge30sXG4gICAgICAgICAgbm9uZToge30sXG4gICAgICAgICAgaGFzOiB7fSxcbiAgICAgICAgICBcIiFoYXNcIjoge30sXG4gICAgICAgICAgd2l0aGluOiB7fVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZ2VvbWV0cnlfdHlwZToge1xuICAgICAgICB0eXBlOiBcImVudW1cIixcbiAgICAgICAgdmFsdWVzOiB7XG4gICAgICAgICAgUG9pbnQ6IHt9LFxuICAgICAgICAgIExpbmVTdHJpbmc6IHt9LFxuICAgICAgICAgIFBvbHlnb246IHt9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBmdW5jdGlvbjoge1xuICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgdHlwZTogXCJleHByZXNzaW9uXCJcbiAgICAgICAgfSxcbiAgICAgICAgc3RvcHM6IHtcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgdmFsdWU6IFwiZnVuY3Rpb25fc3RvcFwiXG4gICAgICAgIH0sXG4gICAgICAgIGJhc2U6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDEsXG4gICAgICAgICAgbWluaW11bTogMFxuICAgICAgICB9LFxuICAgICAgICBwcm9wZXJ0eToge1xuICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgZGVmYXVsdDogXCIkem9vbVwiXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICB0eXBlOiBcImVudW1cIixcbiAgICAgICAgICB2YWx1ZXM6IHtcbiAgICAgICAgICAgIGlkZW50aXR5OiB7fSxcbiAgICAgICAgICAgIGV4cG9uZW50aWFsOiB7fSxcbiAgICAgICAgICAgIGludGVydmFsOiB7fSxcbiAgICAgICAgICAgIGNhdGVnb3JpY2FsOiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGVmYXVsdDogXCJleHBvbmVudGlhbFwiXG4gICAgICAgIH0sXG4gICAgICAgIGNvbG9yU3BhY2U6IHtcbiAgICAgICAgICB0eXBlOiBcImVudW1cIixcbiAgICAgICAgICB2YWx1ZXM6IHtcbiAgICAgICAgICAgIHJnYjoge30sXG4gICAgICAgICAgICBsYWI6IHt9LFxuICAgICAgICAgICAgaGNsOiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGVmYXVsdDogXCJyZ2JcIlxuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdHlwZTogXCIqXCIsXG4gICAgICAgICAgcmVxdWlyZWQ6ICExXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBmdW5jdGlvbl9zdG9wOiB7XG4gICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgbWluaW11bTogMCxcbiAgICAgICAgbWF4aW11bTogMjQsXG4gICAgICAgIHZhbHVlOiBbXCJudW1iZXJcIiwgXCJjb2xvclwiXSxcbiAgICAgICAgbGVuZ3RoOiAyXG4gICAgICB9LFxuICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgIHZhbHVlOiBcIipcIixcbiAgICAgICAgbWluaW11bTogMVxuICAgICAgfSxcbiAgICAgIGxpZ2h0OiB7XG4gICAgICAgIGFuY2hvcjoge1xuICAgICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICAgIGRlZmF1bHQ6IFwidmlld3BvcnRcIixcbiAgICAgICAgICB2YWx1ZXM6IHtcbiAgICAgICAgICAgIG1hcDoge30sXG4gICAgICAgICAgICB2aWV3cG9ydDoge31cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIixcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICExLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgZGVmYXVsdDogWzEuMTUsIDIxMCwgMzBdLFxuICAgICAgICAgIGxlbmd0aDogMyxcbiAgICAgICAgICB2YWx1ZTogXCJudW1iZXJcIixcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCIsXG4gICAgICAgICAgdHJhbnNpdGlvbjogITAsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNvbG9yOiB7XG4gICAgICAgICAgdHlwZTogXCJjb2xvclwiLFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIixcbiAgICAgICAgICBkZWZhdWx0OiBcIiNmZmZmZmZcIixcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgdHJhbnNpdGlvbjogITBcbiAgICAgICAgfSxcbiAgICAgICAgaW50ZW5zaXR5OiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCIsXG4gICAgICAgICAgZGVmYXVsdDogLjUsXG4gICAgICAgICAgbWluaW11bTogMCxcbiAgICAgICAgICBtYXhpbXVtOiAxLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcGFpbnQ6IFtcInBhaW50X2ZpbGxcIiwgXCJwYWludF9saW5lXCIsIFwicGFpbnRfY2lyY2xlXCIsIFwicGFpbnRfaGVhdG1hcFwiLCBcInBhaW50X2ZpbGwtZXh0cnVzaW9uXCIsIFwicGFpbnRfc3ltYm9sXCIsIFwicGFpbnRfcmFzdGVyXCIsIFwicGFpbnRfaGlsbHNoYWRlXCIsIFwicGFpbnRfYmFja2dyb3VuZFwiXSxcbiAgICAgIHBhaW50X2ZpbGw6IHtcbiAgICAgICAgXCJmaWxsLWFudGlhbGlhc1wiOiB7XG4gICAgICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICAgICAgZGVmYXVsdDogITAsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImZpbGwtb3BhY2l0eVwiOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAxLFxuICAgICAgICAgIG1pbmltdW06IDAsXG4gICAgICAgICAgbWF4aW11bTogMSxcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMCxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIiwgXCJmZWF0dXJlLXN0YXRlXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWRyaXZlblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiZmlsbC1jb2xvclwiOiB7XG4gICAgICAgICAgdHlwZTogXCJjb2xvclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IFwiIzAwMDAwMFwiLFxuICAgICAgICAgIHRyYW5zaXRpb246ICEwLFxuICAgICAgICAgIHJlcXVpcmVzOiBbe1xuICAgICAgICAgICAgXCIhXCI6IFwiZmlsbC1wYXR0ZXJuXCJcbiAgICAgICAgICB9XSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIiwgXCJmZWF0dXJlLXN0YXRlXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWRyaXZlblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiZmlsbC1vdXRsaW5lLWNvbG9yXCI6IHtcbiAgICAgICAgICB0eXBlOiBcImNvbG9yXCIsXG4gICAgICAgICAgdHJhbnNpdGlvbjogITAsXG4gICAgICAgICAgcmVxdWlyZXM6IFt7XG4gICAgICAgICAgICBcIiFcIjogXCJmaWxsLXBhdHRlcm5cIlxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIFwiZmlsbC1hbnRpYWxpYXNcIjogITBcbiAgICAgICAgICB9XSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIiwgXCJmZWF0dXJlLXN0YXRlXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWRyaXZlblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiZmlsbC10cmFuc2xhdGVcIjoge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICB2YWx1ZTogXCJudW1iZXJcIixcbiAgICAgICAgICBsZW5ndGg6IDIsXG4gICAgICAgICAgZGVmYXVsdDogWzAsIDBdLFxuICAgICAgICAgIHRyYW5zaXRpb246ICEwLFxuICAgICAgICAgIHVuaXRzOiBcInBpeGVsc1wiLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJmaWxsLXRyYW5zbGF0ZS1hbmNob3JcIjoge1xuICAgICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgbWFwOiB7fSxcbiAgICAgICAgICAgIHZpZXdwb3J0OiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGVmYXVsdDogXCJtYXBcIixcbiAgICAgICAgICByZXF1aXJlczogW1wiZmlsbC10cmFuc2xhdGVcIl0sXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImZpbGwtcGF0dGVyblwiOiB7XG4gICAgICAgICAgdHlwZTogXCJyZXNvbHZlZEltYWdlXCIsXG4gICAgICAgICAgdHJhbnNpdGlvbjogITAsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIiwgXCJmZWF0dXJlXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJjcm9zcy1mYWRlZC1kYXRhLWRyaXZlblwiXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcInBhaW50X2ZpbGwtZXh0cnVzaW9uXCI6IHtcbiAgICAgICAgXCJmaWxsLWV4dHJ1c2lvbi1vcGFjaXR5XCI6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDEsXG4gICAgICAgICAgbWluaW11bTogMCxcbiAgICAgICAgICBtYXhpbXVtOiAxLFxuICAgICAgICAgIHRyYW5zaXRpb246ICEwLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJmaWxsLWV4dHJ1c2lvbi1jb2xvclwiOiB7XG4gICAgICAgICAgdHlwZTogXCJjb2xvclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IFwiIzAwMDAwMFwiLFxuICAgICAgICAgIHRyYW5zaXRpb246ICEwLFxuICAgICAgICAgIHJlcXVpcmVzOiBbe1xuICAgICAgICAgICAgXCIhXCI6IFwiZmlsbC1leHRydXNpb24tcGF0dGVyblwiXG4gICAgICAgICAgfV0sXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIiwgXCJmZWF0dXJlXCIsIFwiZmVhdHVyZS1zdGF0ZVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1kcml2ZW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImZpbGwtZXh0cnVzaW9uLXRyYW5zbGF0ZVwiOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIHZhbHVlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGxlbmd0aDogMixcbiAgICAgICAgICBkZWZhdWx0OiBbMCwgMF0sXG4gICAgICAgICAgdHJhbnNpdGlvbjogITAsXG4gICAgICAgICAgdW5pdHM6IFwicGl4ZWxzXCIsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImZpbGwtZXh0cnVzaW9uLXRyYW5zbGF0ZS1hbmNob3JcIjoge1xuICAgICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgbWFwOiB7fSxcbiAgICAgICAgICAgIHZpZXdwb3J0OiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGVmYXVsdDogXCJtYXBcIixcbiAgICAgICAgICByZXF1aXJlczogW1wiZmlsbC1leHRydXNpb24tdHJhbnNsYXRlXCJdLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITEsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJmaWxsLWV4dHJ1c2lvbi1wYXR0ZXJuXCI6IHtcbiAgICAgICAgICB0eXBlOiBcInJlc29sdmVkSW1hZ2VcIixcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMCxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICExLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImNyb3NzLWZhZGVkLWRhdGEtZHJpdmVuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJmaWxsLWV4dHJ1c2lvbi1oZWlnaHRcIjoge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogMCxcbiAgICAgICAgICBtaW5pbXVtOiAwLFxuICAgICAgICAgIHVuaXRzOiBcIm1ldGVyc1wiLFxuICAgICAgICAgIHRyYW5zaXRpb246ICEwLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCIsIFwiZmVhdHVyZVwiLCBcImZlYXR1cmUtc3RhdGVcIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtZHJpdmVuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJmaWxsLWV4dHJ1c2lvbi1iYXNlXCI6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDAsXG4gICAgICAgICAgbWluaW11bTogMCxcbiAgICAgICAgICB1bml0czogXCJtZXRlcnNcIixcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMCxcbiAgICAgICAgICByZXF1aXJlczogW1wiZmlsbC1leHRydXNpb24taGVpZ2h0XCJdLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCIsIFwiZmVhdHVyZVwiLCBcImZlYXR1cmUtc3RhdGVcIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtZHJpdmVuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJmaWxsLWV4dHJ1c2lvbi12ZXJ0aWNhbC1ncmFkaWVudFwiOiB7XG4gICAgICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICAgICAgZGVmYXVsdDogITAsXG4gICAgICAgICAgdHJhbnNpdGlvbjogITEsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcGFpbnRfbGluZToge1xuICAgICAgICBcImxpbmUtb3BhY2l0eVwiOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAxLFxuICAgICAgICAgIG1pbmltdW06IDAsXG4gICAgICAgICAgbWF4aW11bTogMSxcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMCxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIiwgXCJmZWF0dXJlLXN0YXRlXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWRyaXZlblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibGluZS1jb2xvclwiOiB7XG4gICAgICAgICAgdHlwZTogXCJjb2xvclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IFwiIzAwMDAwMFwiLFxuICAgICAgICAgIHRyYW5zaXRpb246ICEwLFxuICAgICAgICAgIHJlcXVpcmVzOiBbe1xuICAgICAgICAgICAgXCIhXCI6IFwibGluZS1wYXR0ZXJuXCJcbiAgICAgICAgICB9XSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIiwgXCJmZWF0dXJlLXN0YXRlXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWRyaXZlblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibGluZS10cmFuc2xhdGVcIjoge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICB2YWx1ZTogXCJudW1iZXJcIixcbiAgICAgICAgICBsZW5ndGg6IDIsXG4gICAgICAgICAgZGVmYXVsdDogWzAsIDBdLFxuICAgICAgICAgIHRyYW5zaXRpb246ICEwLFxuICAgICAgICAgIHVuaXRzOiBcInBpeGVsc1wiLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJsaW5lLXRyYW5zbGF0ZS1hbmNob3JcIjoge1xuICAgICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgbWFwOiB7fSxcbiAgICAgICAgICAgIHZpZXdwb3J0OiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGVmYXVsdDogXCJtYXBcIixcbiAgICAgICAgICByZXF1aXJlczogW1wibGluZS10cmFuc2xhdGVcIl0sXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImxpbmUtd2lkdGhcIjoge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogMSxcbiAgICAgICAgICBtaW5pbXVtOiAwLFxuICAgICAgICAgIHRyYW5zaXRpb246ICEwLFxuICAgICAgICAgIHVuaXRzOiBcInBpeGVsc1wiLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCIsIFwiZmVhdHVyZVwiLCBcImZlYXR1cmUtc3RhdGVcIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtZHJpdmVuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJsaW5lLWdhcC13aWR0aFwiOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAwLFxuICAgICAgICAgIG1pbmltdW06IDAsXG4gICAgICAgICAgdHJhbnNpdGlvbjogITAsXG4gICAgICAgICAgdW5pdHM6IFwicGl4ZWxzXCIsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIiwgXCJmZWF0dXJlXCIsIFwiZmVhdHVyZS1zdGF0ZVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1kcml2ZW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImxpbmUtb2Zmc2V0XCI6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDAsXG4gICAgICAgICAgdHJhbnNpdGlvbjogITAsXG4gICAgICAgICAgdW5pdHM6IFwicGl4ZWxzXCIsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIiwgXCJmZWF0dXJlXCIsIFwiZmVhdHVyZS1zdGF0ZVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1kcml2ZW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImxpbmUtYmx1clwiOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAwLFxuICAgICAgICAgIG1pbmltdW06IDAsXG4gICAgICAgICAgdHJhbnNpdGlvbjogITAsXG4gICAgICAgICAgdW5pdHM6IFwicGl4ZWxzXCIsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIiwgXCJmZWF0dXJlXCIsIFwiZmVhdHVyZS1zdGF0ZVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1kcml2ZW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImxpbmUtZGFzaGFycmF5XCI6IHtcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgdmFsdWU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgbWluaW11bTogMCxcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMCxcbiAgICAgICAgICB1bml0czogXCJsaW5lIHdpZHRoc1wiLFxuICAgICAgICAgIHJlcXVpcmVzOiBbe1xuICAgICAgICAgICAgXCIhXCI6IFwibGluZS1wYXR0ZXJuXCJcbiAgICAgICAgICB9XSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICExLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiY3Jvc3MtZmFkZWRcIlxuICAgICAgICB9LFxuICAgICAgICBcImxpbmUtcGF0dGVyblwiOiB7XG4gICAgICAgICAgdHlwZTogXCJyZXNvbHZlZEltYWdlXCIsXG4gICAgICAgICAgdHJhbnNpdGlvbjogITAsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIiwgXCJmZWF0dXJlXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJjcm9zcy1mYWRlZC1kYXRhLWRyaXZlblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibGluZS1ncmFkaWVudFwiOiB7XG4gICAgICAgICAgdHlwZTogXCJjb2xvclwiLFxuICAgICAgICAgIHRyYW5zaXRpb246ICExLFxuICAgICAgICAgIHJlcXVpcmVzOiBbe1xuICAgICAgICAgICAgXCIhXCI6IFwibGluZS1kYXNoYXJyYXlcIlxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIFwiIVwiOiBcImxpbmUtcGF0dGVyblwiXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgc291cmNlOiBcImdlb2pzb25cIixcbiAgICAgICAgICAgIGhhczoge1xuICAgICAgICAgICAgICBsaW5lTWV0cmljczogITBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wibGluZS1wcm9ncmVzc1wiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiY29sb3ItcmFtcFwiXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBwYWludF9jaXJjbGU6IHtcbiAgICAgICAgXCJjaXJjbGUtcmFkaXVzXCI6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDUsXG4gICAgICAgICAgbWluaW11bTogMCxcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMCxcbiAgICAgICAgICB1bml0czogXCJwaXhlbHNcIixcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIiwgXCJmZWF0dXJlLXN0YXRlXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWRyaXZlblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiY2lyY2xlLWNvbG9yXCI6IHtcbiAgICAgICAgICB0eXBlOiBcImNvbG9yXCIsXG4gICAgICAgICAgZGVmYXVsdDogXCIjMDAwMDAwXCIsXG4gICAgICAgICAgdHJhbnNpdGlvbjogITAsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIiwgXCJmZWF0dXJlXCIsIFwiZmVhdHVyZS1zdGF0ZVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1kcml2ZW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImNpcmNsZS1ibHVyXCI6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDAsXG4gICAgICAgICAgdHJhbnNpdGlvbjogITAsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIiwgXCJmZWF0dXJlXCIsIFwiZmVhdHVyZS1zdGF0ZVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1kcml2ZW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImNpcmNsZS1vcGFjaXR5XCI6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDEsXG4gICAgICAgICAgbWluaW11bTogMCxcbiAgICAgICAgICBtYXhpbXVtOiAxLFxuICAgICAgICAgIHRyYW5zaXRpb246ICEwLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCIsIFwiZmVhdHVyZVwiLCBcImZlYXR1cmUtc3RhdGVcIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtZHJpdmVuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJjaXJjbGUtdHJhbnNsYXRlXCI6IHtcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgdmFsdWU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgbGVuZ3RoOiAyLFxuICAgICAgICAgIGRlZmF1bHQ6IFswLCAwXSxcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMCxcbiAgICAgICAgICB1bml0czogXCJwaXhlbHNcIixcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1jb25zdGFudFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiY2lyY2xlLXRyYW5zbGF0ZS1hbmNob3JcIjoge1xuICAgICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgbWFwOiB7fSxcbiAgICAgICAgICAgIHZpZXdwb3J0OiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGVmYXVsdDogXCJtYXBcIixcbiAgICAgICAgICByZXF1aXJlczogW1wiY2lyY2xlLXRyYW5zbGF0ZVwiXSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICExLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1jb25zdGFudFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiY2lyY2xlLXBpdGNoLXNjYWxlXCI6IHtcbiAgICAgICAgICB0eXBlOiBcImVudW1cIixcbiAgICAgICAgICB2YWx1ZXM6IHtcbiAgICAgICAgICAgIG1hcDoge30sXG4gICAgICAgICAgICB2aWV3cG9ydDoge31cbiAgICAgICAgICB9LFxuICAgICAgICAgIGRlZmF1bHQ6IFwibWFwXCIsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImNpcmNsZS1waXRjaC1hbGlnbm1lbnRcIjoge1xuICAgICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgbWFwOiB7fSxcbiAgICAgICAgICAgIHZpZXdwb3J0OiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGVmYXVsdDogXCJ2aWV3cG9ydFwiLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITEsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJjaXJjbGUtc3Ryb2tlLXdpZHRoXCI6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDAsXG4gICAgICAgICAgbWluaW11bTogMCxcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMCxcbiAgICAgICAgICB1bml0czogXCJwaXhlbHNcIixcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIiwgXCJmZWF0dXJlLXN0YXRlXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWRyaXZlblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiY2lyY2xlLXN0cm9rZS1jb2xvclwiOiB7XG4gICAgICAgICAgdHlwZTogXCJjb2xvclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IFwiIzAwMDAwMFwiLFxuICAgICAgICAgIHRyYW5zaXRpb246ICEwLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCIsIFwiZmVhdHVyZVwiLCBcImZlYXR1cmUtc3RhdGVcIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtZHJpdmVuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJjaXJjbGUtc3Ryb2tlLW9wYWNpdHlcIjoge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogMSxcbiAgICAgICAgICBtaW5pbXVtOiAwLFxuICAgICAgICAgIG1heGltdW06IDEsXG4gICAgICAgICAgdHJhbnNpdGlvbjogITAsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIiwgXCJmZWF0dXJlXCIsIFwiZmVhdHVyZS1zdGF0ZVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1kcml2ZW5cIlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcGFpbnRfaGVhdG1hcDoge1xuICAgICAgICBcImhlYXRtYXAtcmFkaXVzXCI6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDMwLFxuICAgICAgICAgIG1pbmltdW06IDEsXG4gICAgICAgICAgdHJhbnNpdGlvbjogITAsXG4gICAgICAgICAgdW5pdHM6IFwicGl4ZWxzXCIsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIiwgXCJmZWF0dXJlXCIsIFwiZmVhdHVyZS1zdGF0ZVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1kcml2ZW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImhlYXRtYXAtd2VpZ2h0XCI6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDEsXG4gICAgICAgICAgbWluaW11bTogMCxcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIiwgXCJmZWF0dXJlLXN0YXRlXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWRyaXZlblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiaGVhdG1hcC1pbnRlbnNpdHlcIjoge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogMSxcbiAgICAgICAgICBtaW5pbXVtOiAwLFxuICAgICAgICAgIHRyYW5zaXRpb246ICEwLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJoZWF0bWFwLWNvbG9yXCI6IHtcbiAgICAgICAgICB0eXBlOiBcImNvbG9yXCIsXG4gICAgICAgICAgZGVmYXVsdDogW1wiaW50ZXJwb2xhdGVcIiwgW1wibGluZWFyXCJdLCBbXCJoZWF0bWFwLWRlbnNpdHlcIl0sIDAsIFwicmdiYSgwLCAwLCAyNTUsIDApXCIsIC4xLCBcInJveWFsYmx1ZVwiLCAuMywgXCJjeWFuXCIsIC41LCBcImxpbWVcIiwgLjcsIFwieWVsbG93XCIsIDEsIFwicmVkXCJdLFxuICAgICAgICAgIHRyYW5zaXRpb246ICExLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJoZWF0bWFwLWRlbnNpdHlcIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImNvbG9yLXJhbXBcIlxuICAgICAgICB9LFxuICAgICAgICBcImhlYXRtYXAtb3BhY2l0eVwiOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAxLFxuICAgICAgICAgIG1pbmltdW06IDAsXG4gICAgICAgICAgbWF4aW11bTogMSxcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMCxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1jb25zdGFudFwiXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBwYWludF9zeW1ib2w6IHtcbiAgICAgICAgXCJpY29uLW9wYWNpdHlcIjoge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogMSxcbiAgICAgICAgICBtaW5pbXVtOiAwLFxuICAgICAgICAgIG1heGltdW06IDEsXG4gICAgICAgICAgdHJhbnNpdGlvbjogITAsXG4gICAgICAgICAgcmVxdWlyZXM6IFtcImljb24taW1hZ2VcIl0sXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIiwgXCJmZWF0dXJlXCIsIFwiZmVhdHVyZS1zdGF0ZVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1kcml2ZW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImljb24tY29sb3JcIjoge1xuICAgICAgICAgIHR5cGU6IFwiY29sb3JcIixcbiAgICAgICAgICBkZWZhdWx0OiBcIiMwMDAwMDBcIixcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMCxcbiAgICAgICAgICByZXF1aXJlczogW1wiaWNvbi1pbWFnZVwiXSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIiwgXCJmZWF0dXJlLXN0YXRlXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWRyaXZlblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiaWNvbi1oYWxvLWNvbG9yXCI6IHtcbiAgICAgICAgICB0eXBlOiBcImNvbG9yXCIsXG4gICAgICAgICAgZGVmYXVsdDogXCJyZ2JhKDAsIDAsIDAsIDApXCIsXG4gICAgICAgICAgdHJhbnNpdGlvbjogITAsXG4gICAgICAgICAgcmVxdWlyZXM6IFtcImljb24taW1hZ2VcIl0sXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIiwgXCJmZWF0dXJlXCIsIFwiZmVhdHVyZS1zdGF0ZVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1kcml2ZW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImljb24taGFsby13aWR0aFwiOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAwLFxuICAgICAgICAgIG1pbmltdW06IDAsXG4gICAgICAgICAgdHJhbnNpdGlvbjogITAsXG4gICAgICAgICAgdW5pdHM6IFwicGl4ZWxzXCIsXG4gICAgICAgICAgcmVxdWlyZXM6IFtcImljb24taW1hZ2VcIl0sXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIiwgXCJmZWF0dXJlXCIsIFwiZmVhdHVyZS1zdGF0ZVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1kcml2ZW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImljb24taGFsby1ibHVyXCI6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDAsXG4gICAgICAgICAgbWluaW11bTogMCxcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMCxcbiAgICAgICAgICB1bml0czogXCJwaXhlbHNcIixcbiAgICAgICAgICByZXF1aXJlczogW1wiaWNvbi1pbWFnZVwiXSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIiwgXCJmZWF0dXJlLXN0YXRlXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWRyaXZlblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiaWNvbi10cmFuc2xhdGVcIjoge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICB2YWx1ZTogXCJudW1iZXJcIixcbiAgICAgICAgICBsZW5ndGg6IDIsXG4gICAgICAgICAgZGVmYXVsdDogWzAsIDBdLFxuICAgICAgICAgIHRyYW5zaXRpb246ICEwLFxuICAgICAgICAgIHVuaXRzOiBcInBpeGVsc1wiLFxuICAgICAgICAgIHJlcXVpcmVzOiBbXCJpY29uLWltYWdlXCJdLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJpY29uLXRyYW5zbGF0ZS1hbmNob3JcIjoge1xuICAgICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgbWFwOiB7fSxcbiAgICAgICAgICAgIHZpZXdwb3J0OiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGVmYXVsdDogXCJtYXBcIixcbiAgICAgICAgICByZXF1aXJlczogW1wiaWNvbi1pbWFnZVwiLCBcImljb24tdHJhbnNsYXRlXCJdLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITEsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0ZXh0LW9wYWNpdHlcIjoge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogMSxcbiAgICAgICAgICBtaW5pbXVtOiAwLFxuICAgICAgICAgIG1heGltdW06IDEsXG4gICAgICAgICAgdHJhbnNpdGlvbjogITAsXG4gICAgICAgICAgcmVxdWlyZXM6IFtcInRleHQtZmllbGRcIl0sXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIiwgXCJmZWF0dXJlXCIsIFwiZmVhdHVyZS1zdGF0ZVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1kcml2ZW5cIlxuICAgICAgICB9LFxuICAgICAgICBcInRleHQtY29sb3JcIjoge1xuICAgICAgICAgIHR5cGU6IFwiY29sb3JcIixcbiAgICAgICAgICBkZWZhdWx0OiBcIiMwMDAwMDBcIixcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMCxcbiAgICAgICAgICBvdmVycmlkYWJsZTogITAsXG4gICAgICAgICAgcmVxdWlyZXM6IFtcInRleHQtZmllbGRcIl0sXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIiwgXCJmZWF0dXJlXCIsIFwiZmVhdHVyZS1zdGF0ZVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1kcml2ZW5cIlxuICAgICAgICB9LFxuICAgICAgICBcInRleHQtaGFsby1jb2xvclwiOiB7XG4gICAgICAgICAgdHlwZTogXCJjb2xvclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IFwicmdiYSgwLCAwLCAwLCAwKVwiLFxuICAgICAgICAgIHRyYW5zaXRpb246ICEwLFxuICAgICAgICAgIHJlcXVpcmVzOiBbXCJ0ZXh0LWZpZWxkXCJdLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCIsIFwiZmVhdHVyZVwiLCBcImZlYXR1cmUtc3RhdGVcIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtZHJpdmVuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0ZXh0LWhhbG8td2lkdGhcIjoge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogMCxcbiAgICAgICAgICBtaW5pbXVtOiAwLFxuICAgICAgICAgIHRyYW5zaXRpb246ICEwLFxuICAgICAgICAgIHVuaXRzOiBcInBpeGVsc1wiLFxuICAgICAgICAgIHJlcXVpcmVzOiBbXCJ0ZXh0LWZpZWxkXCJdLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCIsIFwiZmVhdHVyZVwiLCBcImZlYXR1cmUtc3RhdGVcIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtZHJpdmVuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0ZXh0LWhhbG8tYmx1clwiOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAwLFxuICAgICAgICAgIG1pbmltdW06IDAsXG4gICAgICAgICAgdHJhbnNpdGlvbjogITAsXG4gICAgICAgICAgdW5pdHM6IFwicGl4ZWxzXCIsXG4gICAgICAgICAgcmVxdWlyZXM6IFtcInRleHQtZmllbGRcIl0sXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIiwgXCJmZWF0dXJlXCIsIFwiZmVhdHVyZS1zdGF0ZVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1kcml2ZW5cIlxuICAgICAgICB9LFxuICAgICAgICBcInRleHQtdHJhbnNsYXRlXCI6IHtcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgdmFsdWU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgbGVuZ3RoOiAyLFxuICAgICAgICAgIGRlZmF1bHQ6IFswLCAwXSxcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMCxcbiAgICAgICAgICB1bml0czogXCJwaXhlbHNcIixcbiAgICAgICAgICByZXF1aXJlczogW1widGV4dC1maWVsZFwiXSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1jb25zdGFudFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidGV4dC10cmFuc2xhdGUtYW5jaG9yXCI6IHtcbiAgICAgICAgICB0eXBlOiBcImVudW1cIixcbiAgICAgICAgICB2YWx1ZXM6IHtcbiAgICAgICAgICAgIG1hcDoge30sXG4gICAgICAgICAgICB2aWV3cG9ydDoge31cbiAgICAgICAgICB9LFxuICAgICAgICAgIGRlZmF1bHQ6IFwibWFwXCIsXG4gICAgICAgICAgcmVxdWlyZXM6IFtcInRleHQtZmllbGRcIiwgXCJ0ZXh0LXRyYW5zbGF0ZVwiXSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICExLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1jb25zdGFudFwiXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBwYWludF9yYXN0ZXI6IHtcbiAgICAgICAgXCJyYXN0ZXItb3BhY2l0eVwiOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAxLFxuICAgICAgICAgIG1pbmltdW06IDAsXG4gICAgICAgICAgbWF4aW11bTogMSxcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMCxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1jb25zdGFudFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwicmFzdGVyLWh1ZS1yb3RhdGVcIjoge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogMCxcbiAgICAgICAgICBwZXJpb2Q6IDM2MCxcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMCxcbiAgICAgICAgICB1bml0czogXCJkZWdyZWVzXCIsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcInJhc3Rlci1icmlnaHRuZXNzLW1pblwiOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAwLFxuICAgICAgICAgIG1pbmltdW06IDAsXG4gICAgICAgICAgbWF4aW11bTogMSxcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMCxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1jb25zdGFudFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwicmFzdGVyLWJyaWdodG5lc3MtbWF4XCI6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDEsXG4gICAgICAgICAgbWluaW11bTogMCxcbiAgICAgICAgICBtYXhpbXVtOiAxLFxuICAgICAgICAgIHRyYW5zaXRpb246ICEwLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJyYXN0ZXItc2F0dXJhdGlvblwiOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAwLFxuICAgICAgICAgIG1pbmltdW06IC0xLFxuICAgICAgICAgIG1heGltdW06IDEsXG4gICAgICAgICAgdHJhbnNpdGlvbjogITAsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcInJhc3Rlci1jb250cmFzdFwiOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAwLFxuICAgICAgICAgIG1pbmltdW06IC0xLFxuICAgICAgICAgIG1heGltdW06IDEsXG4gICAgICAgICAgdHJhbnNpdGlvbjogITAsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcInJhc3Rlci1yZXNhbXBsaW5nXCI6IHtcbiAgICAgICAgICB0eXBlOiBcImVudW1cIixcbiAgICAgICAgICB2YWx1ZXM6IHtcbiAgICAgICAgICAgIGxpbmVhcjoge30sXG4gICAgICAgICAgICBuZWFyZXN0OiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGVmYXVsdDogXCJsaW5lYXJcIixcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICExLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1jb25zdGFudFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwicmFzdGVyLWZhZGUtZHVyYXRpb25cIjoge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogMzAwLFxuICAgICAgICAgIG1pbmltdW06IDAsXG4gICAgICAgICAgdHJhbnNpdGlvbjogITEsXG4gICAgICAgICAgdW5pdHM6IFwibWlsbGlzZWNvbmRzXCIsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcGFpbnRfaGlsbHNoYWRlOiB7XG4gICAgICAgIFwiaGlsbHNoYWRlLWlsbHVtaW5hdGlvbi1kaXJlY3Rpb25cIjoge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogMzM1LFxuICAgICAgICAgIG1pbmltdW06IDAsXG4gICAgICAgICAgbWF4aW11bTogMzU5LFxuICAgICAgICAgIHRyYW5zaXRpb246ICExLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJoaWxsc2hhZGUtaWxsdW1pbmF0aW9uLWFuY2hvclwiOiB7XG4gICAgICAgICAgdHlwZTogXCJlbnVtXCIsXG4gICAgICAgICAgdmFsdWVzOiB7XG4gICAgICAgICAgICBtYXA6IHt9LFxuICAgICAgICAgICAgdmlld3BvcnQ6IHt9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBkZWZhdWx0OiBcInZpZXdwb3J0XCIsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImhpbGxzaGFkZS1leGFnZ2VyYXRpb25cIjoge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogLjUsXG4gICAgICAgICAgbWluaW11bTogMCxcbiAgICAgICAgICBtYXhpbXVtOiAxLFxuICAgICAgICAgIHRyYW5zaXRpb246ICEwLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJoaWxsc2hhZGUtc2hhZG93LWNvbG9yXCI6IHtcbiAgICAgICAgICB0eXBlOiBcImNvbG9yXCIsXG4gICAgICAgICAgZGVmYXVsdDogXCIjMDAwMDAwXCIsXG4gICAgICAgICAgdHJhbnNpdGlvbjogITAsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImhpbGxzaGFkZS1oaWdobGlnaHQtY29sb3JcIjoge1xuICAgICAgICAgIHR5cGU6IFwiY29sb3JcIixcbiAgICAgICAgICBkZWZhdWx0OiBcIiNGRkZGRkZcIixcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMCxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1jb25zdGFudFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiaGlsbHNoYWRlLWFjY2VudC1jb2xvclwiOiB7XG4gICAgICAgICAgdHlwZTogXCJjb2xvclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IFwiIzAwMDAwMFwiLFxuICAgICAgICAgIHRyYW5zaXRpb246ICEwLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCJcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHBhaW50X2JhY2tncm91bmQ6IHtcbiAgICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yXCI6IHtcbiAgICAgICAgICB0eXBlOiBcImNvbG9yXCIsXG4gICAgICAgICAgZGVmYXVsdDogXCIjMDAwMDAwXCIsXG4gICAgICAgICAgdHJhbnNpdGlvbjogITAsXG4gICAgICAgICAgcmVxdWlyZXM6IFt7XG4gICAgICAgICAgICBcIiFcIjogXCJiYWNrZ3JvdW5kLXBhdHRlcm5cIlxuICAgICAgICAgIH1dLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJiYWNrZ3JvdW5kLXBhdHRlcm5cIjoge1xuICAgICAgICAgIHR5cGU6IFwicmVzb2x2ZWRJbWFnZVwiLFxuICAgICAgICAgIHRyYW5zaXRpb246ICEwLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITEsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJjcm9zcy1mYWRlZFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYmFja2dyb3VuZC1vcGFjaXR5XCI6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDEsXG4gICAgICAgICAgbWluaW11bTogMCxcbiAgICAgICAgICBtYXhpbXVtOiAxLFxuICAgICAgICAgIHRyYW5zaXRpb246ICEwLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCJcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHRyYW5zaXRpb246IHtcbiAgICAgICAgZHVyYXRpb246IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDMwMCxcbiAgICAgICAgICBtaW5pbXVtOiAwLFxuICAgICAgICAgIHVuaXRzOiBcIm1pbGxpc2Vjb25kc1wiXG4gICAgICAgIH0sXG4gICAgICAgIGRlbGF5OiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAwLFxuICAgICAgICAgIG1pbmltdW06IDAsXG4gICAgICAgICAgdW5pdHM6IFwibWlsbGlzZWNvbmRzXCJcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFwicHJvcGVydHktdHlwZVwiOiB7XG4gICAgICAgIFwiZGF0YS1kcml2ZW5cIjoge1xuICAgICAgICAgIHR5cGU6IFwicHJvcGVydHktdHlwZVwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiY3Jvc3MtZmFkZWRcIjoge1xuICAgICAgICAgIHR5cGU6IFwicHJvcGVydHktdHlwZVwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiY3Jvc3MtZmFkZWQtZGF0YS1kcml2ZW5cIjoge1xuICAgICAgICAgIHR5cGU6IFwicHJvcGVydHktdHlwZVwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiY29sb3ItcmFtcFwiOiB7XG4gICAgICAgICAgdHlwZTogXCJwcm9wZXJ0eS10eXBlXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJkYXRhLWNvbnN0YW50XCI6IHtcbiAgICAgICAgICB0eXBlOiBcInByb3BlcnR5LXR5cGVcIlxuICAgICAgICB9LFxuICAgICAgICBjb25zdGFudDoge1xuICAgICAgICAgIHR5cGU6IFwicHJvcGVydHktdHlwZVwiXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBwcm9tb3RlSWQ6IHtcbiAgICAgICAgXCIqXCI6IHtcbiAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgICAgICBQdCA9IGZ1bmN0aW9uIFB0KHQsIGUsIHIsIG4pIHtcbiAgICAgIHRoaXMubWVzc2FnZSA9ICh0ID8gdCArIFwiOiBcIiA6IFwiXCIpICsgciwgbiAmJiAodGhpcy5pZGVudGlmaWVyID0gbiksIG51bGwgIT0gZSAmJiBlLl9fbGluZV9fICYmICh0aGlzLmxpbmUgPSBlLl9fbGluZV9fKTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gTXQodCkge1xuICAgICAgdmFyIGUgPSB0LnZhbHVlO1xuICAgICAgcmV0dXJuIGUgPyBbbmV3IFB0KHQua2V5LCBlLCBcImNvbnN0YW50cyBoYXZlIGJlZW4gZGVwcmVjYXRlZCBhcyBvZiB2OFwiKV0gOiBbXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBCdCh0KSB7XG4gICAgICBmb3IgKHZhciBlID0gW10sIHIgPSBhcmd1bWVudHMubGVuZ3RoIC0gMTsgci0tID4gMDspIHtcbiAgICAgICAgZVtyXSA9IGFyZ3VtZW50c1tyICsgMV07XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIG4gPSAwLCBpID0gZTsgbiA8IGkubGVuZ3RoOyBuICs9IDEpIHtcbiAgICAgICAgdmFyIGEgPSBpW25dO1xuXG4gICAgICAgIGZvciAodmFyIG8gaW4gYSkge1xuICAgICAgICAgIHRbb10gPSBhW29dO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFR0KHQpIHtcbiAgICAgIHJldHVybiB0IGluc3RhbmNlb2YgTnVtYmVyIHx8IHQgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdCBpbnN0YW5jZW9mIEJvb2xlYW4gPyB0LnZhbHVlT2YoKSA6IHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gVnQodCkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodCkpIHJldHVybiB0Lm1hcChWdCk7XG5cbiAgICAgIGlmICh0IGluc3RhbmNlb2YgT2JqZWN0ICYmICEodCBpbnN0YW5jZW9mIE51bWJlciB8fCB0IGluc3RhbmNlb2YgU3RyaW5nIHx8IHQgaW5zdGFuY2VvZiBCb29sZWFuKSkge1xuICAgICAgICB2YXIgZSA9IHt9O1xuXG4gICAgICAgIGZvciAodmFyIHIgaW4gdCkge1xuICAgICAgICAgIGVbcl0gPSBWdCh0W3JdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gVHQodCk7XG4gICAgfVxuXG4gICAgdmFyIEZ0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoZSwgcikge1xuICAgICAgICB0LmNhbGwodGhpcywgciksIHRoaXMubWVzc2FnZSA9IHIsIHRoaXMua2V5ID0gZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZTtcbiAgICB9KEVycm9yKSxcbiAgICAgICAgRHQgPSBmdW5jdGlvbiBEdCh0LCBlKSB7XG4gICAgICB2b2lkIDAgPT09IGUgJiYgKGUgPSBbXSksIHRoaXMucGFyZW50ID0gdCwgdGhpcy5iaW5kaW5ncyA9IHt9O1xuXG4gICAgICBmb3IgKHZhciByID0gMCwgbiA9IGU7IHIgPCBuLmxlbmd0aDsgciArPSAxKSB7XG4gICAgICAgIHZhciBpID0gbltyXTtcbiAgICAgICAgdGhpcy5iaW5kaW5nc1tpWzBdXSA9IGlbMV07XG4gICAgICB9XG4gICAgfTtcblxuICAgIER0LnByb3RvdHlwZS5jb25jYXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIG5ldyBEdCh0aGlzLCB0KTtcbiAgICB9LCBEdC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGlmICh0aGlzLmJpbmRpbmdzW3RdKSByZXR1cm4gdGhpcy5iaW5kaW5nc1t0XTtcbiAgICAgIGlmICh0aGlzLnBhcmVudCkgcmV0dXJuIHRoaXMucGFyZW50LmdldCh0KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcih0ICsgXCIgbm90IGZvdW5kIGluIHNjb3BlLlwiKTtcbiAgICB9LCBEdC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiAhIXRoaXMuYmluZGluZ3NbdF0gfHwgISF0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC5oYXModCk7XG4gICAgfTtcbiAgICB2YXIgTHQgPSB7XG4gICAgICBraW5kOiBcIm51bGxcIlxuICAgIH0sXG4gICAgICAgIE90ID0ge1xuICAgICAga2luZDogXCJudW1iZXJcIlxuICAgIH0sXG4gICAgICAgIFJ0ID0ge1xuICAgICAga2luZDogXCJzdHJpbmdcIlxuICAgIH0sXG4gICAgICAgIFV0ID0ge1xuICAgICAga2luZDogXCJib29sZWFuXCJcbiAgICB9LFxuICAgICAgICBqdCA9IHtcbiAgICAgIGtpbmQ6IFwiY29sb3JcIlxuICAgIH0sXG4gICAgICAgIHF0ID0ge1xuICAgICAga2luZDogXCJvYmplY3RcIlxuICAgIH0sXG4gICAgICAgIE50ID0ge1xuICAgICAga2luZDogXCJ2YWx1ZVwiXG4gICAgfSxcbiAgICAgICAgS3QgPSB7XG4gICAgICBraW5kOiBcImNvbGxhdG9yXCJcbiAgICB9LFxuICAgICAgICBHdCA9IHtcbiAgICAgIGtpbmQ6IFwiZm9ybWF0dGVkXCJcbiAgICB9LFxuICAgICAgICBadCA9IHtcbiAgICAgIGtpbmQ6IFwicmVzb2x2ZWRJbWFnZVwiXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIFh0KHQsIGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtpbmQ6IFwiYXJyYXlcIixcbiAgICAgICAgaXRlbVR5cGU6IHQsXG4gICAgICAgIE46IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gSnQodCkge1xuICAgICAgaWYgKFwiYXJyYXlcIiA9PT0gdC5raW5kKSB7XG4gICAgICAgIHZhciBlID0gSnQodC5pdGVtVHlwZSk7XG4gICAgICAgIHJldHVybiBcIm51bWJlclwiID09IHR5cGVvZiB0Lk4gPyBcImFycmF5PFwiICsgZSArIFwiLCBcIiArIHQuTiArIFwiPlwiIDogXCJ2YWx1ZVwiID09PSB0Lml0ZW1UeXBlLmtpbmQgPyBcImFycmF5XCIgOiBcImFycmF5PFwiICsgZSArIFwiPlwiO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdC5raW5kO1xuICAgIH1cblxuICAgIHZhciBIdCA9IFtMdCwgT3QsIFJ0LCBVdCwganQsIEd0LCBxdCwgWHQoTnQpLCBadF07XG5cbiAgICBmdW5jdGlvbiBZdCh0LCBlKSB7XG4gICAgICBpZiAoXCJlcnJvclwiID09PSBlLmtpbmQpIHJldHVybiBudWxsO1xuXG4gICAgICBpZiAoXCJhcnJheVwiID09PSB0LmtpbmQpIHtcbiAgICAgICAgaWYgKFwiYXJyYXlcIiA9PT0gZS5raW5kICYmICgwID09PSBlLk4gJiYgXCJ2YWx1ZVwiID09PSBlLml0ZW1UeXBlLmtpbmQgfHwgIVl0KHQuaXRlbVR5cGUsIGUuaXRlbVR5cGUpKSAmJiAoXCJudW1iZXJcIiAhPSB0eXBlb2YgdC5OIHx8IHQuTiA9PT0gZS5OKSkgcmV0dXJuIG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodC5raW5kID09PSBlLmtpbmQpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoXCJ2YWx1ZVwiID09PSB0LmtpbmQpIGZvciAodmFyIHIgPSAwLCBuID0gSHQ7IHIgPCBuLmxlbmd0aDsgciArPSAxKSB7XG4gICAgICAgICAgaWYgKCFZdChuW3JdLCBlKSkgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFwiRXhwZWN0ZWQgXCIgKyBKdCh0KSArIFwiIGJ1dCBmb3VuZCBcIiArIEp0KGUpICsgXCIgaW5zdGVhZC5cIjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiAkdCh0LCBlKSB7XG4gICAgICByZXR1cm4gZS5zb21lKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBlLmtpbmQgPT09IHQua2luZDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFd0KHQsIGUpIHtcbiAgICAgIHJldHVybiBlLnNvbWUoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIFwibnVsbFwiID09PSBlID8gbnVsbCA9PT0gdCA6IFwiYXJyYXlcIiA9PT0gZSA/IEFycmF5LmlzQXJyYXkodCkgOiBcIm9iamVjdFwiID09PSBlID8gdCAmJiAhQXJyYXkuaXNBcnJheSh0KSAmJiBcIm9iamVjdFwiID09IHR5cGVvZiB0IDogZSA9PT0gdHlwZW9mIHQ7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB2YXIgUXQgPSBlKGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB2YXIgciA9IHtcbiAgICAgICAgdHJhbnNwYXJlbnQ6IFswLCAwLCAwLCAwXSxcbiAgICAgICAgYWxpY2VibHVlOiBbMjQwLCAyNDgsIDI1NSwgMV0sXG4gICAgICAgIGFudGlxdWV3aGl0ZTogWzI1MCwgMjM1LCAyMTUsIDFdLFxuICAgICAgICBhcXVhOiBbMCwgMjU1LCAyNTUsIDFdLFxuICAgICAgICBhcXVhbWFyaW5lOiBbMTI3LCAyNTUsIDIxMiwgMV0sXG4gICAgICAgIGF6dXJlOiBbMjQwLCAyNTUsIDI1NSwgMV0sXG4gICAgICAgIGJlaWdlOiBbMjQ1LCAyNDUsIDIyMCwgMV0sXG4gICAgICAgIGJpc3F1ZTogWzI1NSwgMjI4LCAxOTYsIDFdLFxuICAgICAgICBibGFjazogWzAsIDAsIDAsIDFdLFxuICAgICAgICBibGFuY2hlZGFsbW9uZDogWzI1NSwgMjM1LCAyMDUsIDFdLFxuICAgICAgICBibHVlOiBbMCwgMCwgMjU1LCAxXSxcbiAgICAgICAgYmx1ZXZpb2xldDogWzEzOCwgNDMsIDIyNiwgMV0sXG4gICAgICAgIGJyb3duOiBbMTY1LCA0MiwgNDIsIDFdLFxuICAgICAgICBidXJseXdvb2Q6IFsyMjIsIDE4NCwgMTM1LCAxXSxcbiAgICAgICAgY2FkZXRibHVlOiBbOTUsIDE1OCwgMTYwLCAxXSxcbiAgICAgICAgY2hhcnRyZXVzZTogWzEyNywgMjU1LCAwLCAxXSxcbiAgICAgICAgY2hvY29sYXRlOiBbMjEwLCAxMDUsIDMwLCAxXSxcbiAgICAgICAgY29yYWw6IFsyNTUsIDEyNywgODAsIDFdLFxuICAgICAgICBjb3JuZmxvd2VyYmx1ZTogWzEwMCwgMTQ5LCAyMzcsIDFdLFxuICAgICAgICBjb3Juc2lsazogWzI1NSwgMjQ4LCAyMjAsIDFdLFxuICAgICAgICBjcmltc29uOiBbMjIwLCAyMCwgNjAsIDFdLFxuICAgICAgICBjeWFuOiBbMCwgMjU1LCAyNTUsIDFdLFxuICAgICAgICBkYXJrYmx1ZTogWzAsIDAsIDEzOSwgMV0sXG4gICAgICAgIGRhcmtjeWFuOiBbMCwgMTM5LCAxMzksIDFdLFxuICAgICAgICBkYXJrZ29sZGVucm9kOiBbMTg0LCAxMzQsIDExLCAxXSxcbiAgICAgICAgZGFya2dyYXk6IFsxNjksIDE2OSwgMTY5LCAxXSxcbiAgICAgICAgZGFya2dyZWVuOiBbMCwgMTAwLCAwLCAxXSxcbiAgICAgICAgZGFya2dyZXk6IFsxNjksIDE2OSwgMTY5LCAxXSxcbiAgICAgICAgZGFya2toYWtpOiBbMTg5LCAxODMsIDEwNywgMV0sXG4gICAgICAgIGRhcmttYWdlbnRhOiBbMTM5LCAwLCAxMzksIDFdLFxuICAgICAgICBkYXJrb2xpdmVncmVlbjogWzg1LCAxMDcsIDQ3LCAxXSxcbiAgICAgICAgZGFya29yYW5nZTogWzI1NSwgMTQwLCAwLCAxXSxcbiAgICAgICAgZGFya29yY2hpZDogWzE1MywgNTAsIDIwNCwgMV0sXG4gICAgICAgIGRhcmtyZWQ6IFsxMzksIDAsIDAsIDFdLFxuICAgICAgICBkYXJrc2FsbW9uOiBbMjMzLCAxNTAsIDEyMiwgMV0sXG4gICAgICAgIGRhcmtzZWFncmVlbjogWzE0MywgMTg4LCAxNDMsIDFdLFxuICAgICAgICBkYXJrc2xhdGVibHVlOiBbNzIsIDYxLCAxMzksIDFdLFxuICAgICAgICBkYXJrc2xhdGVncmF5OiBbNDcsIDc5LCA3OSwgMV0sXG4gICAgICAgIGRhcmtzbGF0ZWdyZXk6IFs0NywgNzksIDc5LCAxXSxcbiAgICAgICAgZGFya3R1cnF1b2lzZTogWzAsIDIwNiwgMjA5LCAxXSxcbiAgICAgICAgZGFya3Zpb2xldDogWzE0OCwgMCwgMjExLCAxXSxcbiAgICAgICAgZGVlcHBpbms6IFsyNTUsIDIwLCAxNDcsIDFdLFxuICAgICAgICBkZWVwc2t5Ymx1ZTogWzAsIDE5MSwgMjU1LCAxXSxcbiAgICAgICAgZGltZ3JheTogWzEwNSwgMTA1LCAxMDUsIDFdLFxuICAgICAgICBkaW1ncmV5OiBbMTA1LCAxMDUsIDEwNSwgMV0sXG4gICAgICAgIGRvZGdlcmJsdWU6IFszMCwgMTQ0LCAyNTUsIDFdLFxuICAgICAgICBmaXJlYnJpY2s6IFsxNzgsIDM0LCAzNCwgMV0sXG4gICAgICAgIGZsb3JhbHdoaXRlOiBbMjU1LCAyNTAsIDI0MCwgMV0sXG4gICAgICAgIGZvcmVzdGdyZWVuOiBbMzQsIDEzOSwgMzQsIDFdLFxuICAgICAgICBmdWNoc2lhOiBbMjU1LCAwLCAyNTUsIDFdLFxuICAgICAgICBnYWluc2Jvcm86IFsyMjAsIDIyMCwgMjIwLCAxXSxcbiAgICAgICAgZ2hvc3R3aGl0ZTogWzI0OCwgMjQ4LCAyNTUsIDFdLFxuICAgICAgICBnb2xkOiBbMjU1LCAyMTUsIDAsIDFdLFxuICAgICAgICBnb2xkZW5yb2Q6IFsyMTgsIDE2NSwgMzIsIDFdLFxuICAgICAgICBncmF5OiBbMTI4LCAxMjgsIDEyOCwgMV0sXG4gICAgICAgIGdyZWVuOiBbMCwgMTI4LCAwLCAxXSxcbiAgICAgICAgZ3JlZW55ZWxsb3c6IFsxNzMsIDI1NSwgNDcsIDFdLFxuICAgICAgICBncmV5OiBbMTI4LCAxMjgsIDEyOCwgMV0sXG4gICAgICAgIGhvbmV5ZGV3OiBbMjQwLCAyNTUsIDI0MCwgMV0sXG4gICAgICAgIGhvdHBpbms6IFsyNTUsIDEwNSwgMTgwLCAxXSxcbiAgICAgICAgaW5kaWFucmVkOiBbMjA1LCA5MiwgOTIsIDFdLFxuICAgICAgICBpbmRpZ286IFs3NSwgMCwgMTMwLCAxXSxcbiAgICAgICAgaXZvcnk6IFsyNTUsIDI1NSwgMjQwLCAxXSxcbiAgICAgICAga2hha2k6IFsyNDAsIDIzMCwgMTQwLCAxXSxcbiAgICAgICAgbGF2ZW5kZXI6IFsyMzAsIDIzMCwgMjUwLCAxXSxcbiAgICAgICAgbGF2ZW5kZXJibHVzaDogWzI1NSwgMjQwLCAyNDUsIDFdLFxuICAgICAgICBsYXduZ3JlZW46IFsxMjQsIDI1MiwgMCwgMV0sXG4gICAgICAgIGxlbW9uY2hpZmZvbjogWzI1NSwgMjUwLCAyMDUsIDFdLFxuICAgICAgICBsaWdodGJsdWU6IFsxNzMsIDIxNiwgMjMwLCAxXSxcbiAgICAgICAgbGlnaHRjb3JhbDogWzI0MCwgMTI4LCAxMjgsIDFdLFxuICAgICAgICBsaWdodGN5YW46IFsyMjQsIDI1NSwgMjU1LCAxXSxcbiAgICAgICAgbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IFsyNTAsIDI1MCwgMjEwLCAxXSxcbiAgICAgICAgbGlnaHRncmF5OiBbMjExLCAyMTEsIDIxMSwgMV0sXG4gICAgICAgIGxpZ2h0Z3JlZW46IFsxNDQsIDIzOCwgMTQ0LCAxXSxcbiAgICAgICAgbGlnaHRncmV5OiBbMjExLCAyMTEsIDIxMSwgMV0sXG4gICAgICAgIGxpZ2h0cGluazogWzI1NSwgMTgyLCAxOTMsIDFdLFxuICAgICAgICBsaWdodHNhbG1vbjogWzI1NSwgMTYwLCAxMjIsIDFdLFxuICAgICAgICBsaWdodHNlYWdyZWVuOiBbMzIsIDE3OCwgMTcwLCAxXSxcbiAgICAgICAgbGlnaHRza3libHVlOiBbMTM1LCAyMDYsIDI1MCwgMV0sXG4gICAgICAgIGxpZ2h0c2xhdGVncmF5OiBbMTE5LCAxMzYsIDE1MywgMV0sXG4gICAgICAgIGxpZ2h0c2xhdGVncmV5OiBbMTE5LCAxMzYsIDE1MywgMV0sXG4gICAgICAgIGxpZ2h0c3RlZWxibHVlOiBbMTc2LCAxOTYsIDIyMiwgMV0sXG4gICAgICAgIGxpZ2h0eWVsbG93OiBbMjU1LCAyNTUsIDIyNCwgMV0sXG4gICAgICAgIGxpbWU6IFswLCAyNTUsIDAsIDFdLFxuICAgICAgICBsaW1lZ3JlZW46IFs1MCwgMjA1LCA1MCwgMV0sXG4gICAgICAgIGxpbmVuOiBbMjUwLCAyNDAsIDIzMCwgMV0sXG4gICAgICAgIG1hZ2VudGE6IFsyNTUsIDAsIDI1NSwgMV0sXG4gICAgICAgIG1hcm9vbjogWzEyOCwgMCwgMCwgMV0sXG4gICAgICAgIG1lZGl1bWFxdWFtYXJpbmU6IFsxMDIsIDIwNSwgMTcwLCAxXSxcbiAgICAgICAgbWVkaXVtYmx1ZTogWzAsIDAsIDIwNSwgMV0sXG4gICAgICAgIG1lZGl1bW9yY2hpZDogWzE4NiwgODUsIDIxMSwgMV0sXG4gICAgICAgIG1lZGl1bXB1cnBsZTogWzE0NywgMTEyLCAyMTksIDFdLFxuICAgICAgICBtZWRpdW1zZWFncmVlbjogWzYwLCAxNzksIDExMywgMV0sXG4gICAgICAgIG1lZGl1bXNsYXRlYmx1ZTogWzEyMywgMTA0LCAyMzgsIDFdLFxuICAgICAgICBtZWRpdW1zcHJpbmdncmVlbjogWzAsIDI1MCwgMTU0LCAxXSxcbiAgICAgICAgbWVkaXVtdHVycXVvaXNlOiBbNzIsIDIwOSwgMjA0LCAxXSxcbiAgICAgICAgbWVkaXVtdmlvbGV0cmVkOiBbMTk5LCAyMSwgMTMzLCAxXSxcbiAgICAgICAgbWlkbmlnaHRibHVlOiBbMjUsIDI1LCAxMTIsIDFdLFxuICAgICAgICBtaW50Y3JlYW06IFsyNDUsIDI1NSwgMjUwLCAxXSxcbiAgICAgICAgbWlzdHlyb3NlOiBbMjU1LCAyMjgsIDIyNSwgMV0sXG4gICAgICAgIG1vY2Nhc2luOiBbMjU1LCAyMjgsIDE4MSwgMV0sXG4gICAgICAgIG5hdmFqb3doaXRlOiBbMjU1LCAyMjIsIDE3MywgMV0sXG4gICAgICAgIG5hdnk6IFswLCAwLCAxMjgsIDFdLFxuICAgICAgICBvbGRsYWNlOiBbMjUzLCAyNDUsIDIzMCwgMV0sXG4gICAgICAgIG9saXZlOiBbMTI4LCAxMjgsIDAsIDFdLFxuICAgICAgICBvbGl2ZWRyYWI6IFsxMDcsIDE0MiwgMzUsIDFdLFxuICAgICAgICBvcmFuZ2U6IFsyNTUsIDE2NSwgMCwgMV0sXG4gICAgICAgIG9yYW5nZXJlZDogWzI1NSwgNjksIDAsIDFdLFxuICAgICAgICBvcmNoaWQ6IFsyMTgsIDExMiwgMjE0LCAxXSxcbiAgICAgICAgcGFsZWdvbGRlbnJvZDogWzIzOCwgMjMyLCAxNzAsIDFdLFxuICAgICAgICBwYWxlZ3JlZW46IFsxNTIsIDI1MSwgMTUyLCAxXSxcbiAgICAgICAgcGFsZXR1cnF1b2lzZTogWzE3NSwgMjM4LCAyMzgsIDFdLFxuICAgICAgICBwYWxldmlvbGV0cmVkOiBbMjE5LCAxMTIsIDE0NywgMV0sXG4gICAgICAgIHBhcGF5YXdoaXA6IFsyNTUsIDIzOSwgMjEzLCAxXSxcbiAgICAgICAgcGVhY2hwdWZmOiBbMjU1LCAyMTgsIDE4NSwgMV0sXG4gICAgICAgIHBlcnU6IFsyMDUsIDEzMywgNjMsIDFdLFxuICAgICAgICBwaW5rOiBbMjU1LCAxOTIsIDIwMywgMV0sXG4gICAgICAgIHBsdW06IFsyMjEsIDE2MCwgMjIxLCAxXSxcbiAgICAgICAgcG93ZGVyYmx1ZTogWzE3NiwgMjI0LCAyMzAsIDFdLFxuICAgICAgICBwdXJwbGU6IFsxMjgsIDAsIDEyOCwgMV0sXG4gICAgICAgIHJlYmVjY2FwdXJwbGU6IFsxMDIsIDUxLCAxNTMsIDFdLFxuICAgICAgICByZWQ6IFsyNTUsIDAsIDAsIDFdLFxuICAgICAgICByb3N5YnJvd246IFsxODgsIDE0MywgMTQzLCAxXSxcbiAgICAgICAgcm95YWxibHVlOiBbNjUsIDEwNSwgMjI1LCAxXSxcbiAgICAgICAgc2FkZGxlYnJvd246IFsxMzksIDY5LCAxOSwgMV0sXG4gICAgICAgIHNhbG1vbjogWzI1MCwgMTI4LCAxMTQsIDFdLFxuICAgICAgICBzYW5keWJyb3duOiBbMjQ0LCAxNjQsIDk2LCAxXSxcbiAgICAgICAgc2VhZ3JlZW46IFs0NiwgMTM5LCA4NywgMV0sXG4gICAgICAgIHNlYXNoZWxsOiBbMjU1LCAyNDUsIDIzOCwgMV0sXG4gICAgICAgIHNpZW5uYTogWzE2MCwgODIsIDQ1LCAxXSxcbiAgICAgICAgc2lsdmVyOiBbMTkyLCAxOTIsIDE5MiwgMV0sXG4gICAgICAgIHNreWJsdWU6IFsxMzUsIDIwNiwgMjM1LCAxXSxcbiAgICAgICAgc2xhdGVibHVlOiBbMTA2LCA5MCwgMjA1LCAxXSxcbiAgICAgICAgc2xhdGVncmF5OiBbMTEyLCAxMjgsIDE0NCwgMV0sXG4gICAgICAgIHNsYXRlZ3JleTogWzExMiwgMTI4LCAxNDQsIDFdLFxuICAgICAgICBzbm93OiBbMjU1LCAyNTAsIDI1MCwgMV0sXG4gICAgICAgIHNwcmluZ2dyZWVuOiBbMCwgMjU1LCAxMjcsIDFdLFxuICAgICAgICBzdGVlbGJsdWU6IFs3MCwgMTMwLCAxODAsIDFdLFxuICAgICAgICB0YW46IFsyMTAsIDE4MCwgMTQwLCAxXSxcbiAgICAgICAgdGVhbDogWzAsIDEyOCwgMTI4LCAxXSxcbiAgICAgICAgdGhpc3RsZTogWzIxNiwgMTkxLCAyMTYsIDFdLFxuICAgICAgICB0b21hdG86IFsyNTUsIDk5LCA3MSwgMV0sXG4gICAgICAgIHR1cnF1b2lzZTogWzY0LCAyMjQsIDIwOCwgMV0sXG4gICAgICAgIHZpb2xldDogWzIzOCwgMTMwLCAyMzgsIDFdLFxuICAgICAgICB3aGVhdDogWzI0NSwgMjIyLCAxNzksIDFdLFxuICAgICAgICB3aGl0ZTogWzI1NSwgMjU1LCAyNTUsIDFdLFxuICAgICAgICB3aGl0ZXNtb2tlOiBbMjQ1LCAyNDUsIDI0NSwgMV0sXG4gICAgICAgIHllbGxvdzogWzI1NSwgMjU1LCAwLCAxXSxcbiAgICAgICAgeWVsbG93Z3JlZW46IFsxNTQsIDIwNSwgNTAsIDFdXG4gICAgICB9O1xuXG4gICAgICBmdW5jdGlvbiBuKHQpIHtcbiAgICAgICAgcmV0dXJuICh0ID0gTWF0aC5yb3VuZCh0KSkgPCAwID8gMCA6IHQgPiAyNTUgPyAyNTUgOiB0O1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBpKHQpIHtcbiAgICAgICAgcmV0dXJuIG4oXCIlXCIgPT09IHRbdC5sZW5ndGggLSAxXSA/IHBhcnNlRmxvYXQodCkgLyAxMDAgKiAyNTUgOiBwYXJzZUludCh0KSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGEodCkge1xuICAgICAgICByZXR1cm4gKGUgPSBcIiVcIiA9PT0gdFt0Lmxlbmd0aCAtIDFdID8gcGFyc2VGbG9hdCh0KSAvIDEwMCA6IHBhcnNlRmxvYXQodCkpIDwgMCA/IDAgOiBlID4gMSA/IDEgOiBlO1xuICAgICAgICB2YXIgZTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gbyh0LCBlLCByKSB7XG4gICAgICAgIHJldHVybiByIDwgMCA/IHIgKz0gMSA6IHIgPiAxICYmIChyIC09IDEpLCA2ICogciA8IDEgPyB0ICsgKGUgLSB0KSAqIHIgKiA2IDogMiAqIHIgPCAxID8gZSA6IDMgKiByIDwgMiA/IHQgKyAoZSAtIHQpICogKDIgLyAzIC0gcikgKiA2IDogdDtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgZS5wYXJzZUNTU0NvbG9yID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICB2YXIgZSxcbiAgICAgICAgICAgICAgcyA9IHQucmVwbGFjZSgvIC9nLCBcIlwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGlmIChzIGluIHIpIHJldHVybiByW3NdLnNsaWNlKCk7XG4gICAgICAgICAgaWYgKFwiI1wiID09PSBzWzBdKSByZXR1cm4gNCA9PT0gcy5sZW5ndGggPyAoZSA9IHBhcnNlSW50KHMuc3Vic3RyKDEpLCAxNikpID49IDAgJiYgZSA8PSA0MDk1ID8gWygzODQwICYgZSkgPj4gNCB8ICgzODQwICYgZSkgPj4gOCwgMjQwICYgZSB8ICgyNDAgJiBlKSA+PiA0LCAxNSAmIGUgfCAoMTUgJiBlKSA8PCA0LCAxXSA6IG51bGwgOiA3ID09PSBzLmxlbmd0aCAmJiAoZSA9IHBhcnNlSW50KHMuc3Vic3RyKDEpLCAxNikpID49IDAgJiYgZSA8PSAxNjc3NzIxNSA/IFsoMTY3MTE2ODAgJiBlKSA+PiAxNiwgKDY1MjgwICYgZSkgPj4gOCwgMjU1ICYgZSwgMV0gOiBudWxsO1xuICAgICAgICAgIHZhciB1ID0gcy5pbmRleE9mKFwiKFwiKSxcbiAgICAgICAgICAgICAgbCA9IHMuaW5kZXhPZihcIilcIik7XG5cbiAgICAgICAgICBpZiAoLTEgIT09IHUgJiYgbCArIDEgPT09IHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgcCA9IHMuc3Vic3RyKDAsIHUpLFxuICAgICAgICAgICAgICAgIGMgPSBzLnN1YnN0cih1ICsgMSwgbCAtICh1ICsgMSkpLnNwbGl0KFwiLFwiKSxcbiAgICAgICAgICAgICAgICBoID0gMTtcblxuICAgICAgICAgICAgc3dpdGNoIChwKSB7XG4gICAgICAgICAgICAgIGNhc2UgXCJyZ2JhXCI6XG4gICAgICAgICAgICAgICAgaWYgKDQgIT09IGMubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBoID0gYShjLnBvcCgpKTtcblxuICAgICAgICAgICAgICBjYXNlIFwicmdiXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIDMgIT09IGMubGVuZ3RoID8gbnVsbCA6IFtpKGNbMF0pLCBpKGNbMV0pLCBpKGNbMl0pLCBoXTtcblxuICAgICAgICAgICAgICBjYXNlIFwiaHNsYVwiOlxuICAgICAgICAgICAgICAgIGlmICg0ICE9PSBjLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgaCA9IGEoYy5wb3AoKSk7XG5cbiAgICAgICAgICAgICAgY2FzZSBcImhzbFwiOlxuICAgICAgICAgICAgICAgIGlmICgzICE9PSBjLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgdmFyIGYgPSAocGFyc2VGbG9hdChjWzBdKSAlIDM2MCArIDM2MCkgJSAzNjAgLyAzNjAsXG4gICAgICAgICAgICAgICAgICAgIHkgPSBhKGNbMV0pLFxuICAgICAgICAgICAgICAgICAgICBkID0gYShjWzJdKSxcbiAgICAgICAgICAgICAgICAgICAgbSA9IGQgPD0gLjUgPyBkICogKHkgKyAxKSA6IGQgKyB5IC0gZCAqIHksXG4gICAgICAgICAgICAgICAgICAgIHYgPSAyICogZCAtIG07XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtuKDI1NSAqIG8odiwgbSwgZiArIDEgLyAzKSksIG4oMjU1ICogbyh2LCBtLCBmKSksIG4oMjU1ICogbyh2LCBtLCBmIC0gMSAvIDMpKSwgaF07XG5cbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2ggKHQpIHt9XG4gICAgfSkucGFyc2VDU1NDb2xvcixcbiAgICAgICAgdGUgPSBmdW5jdGlvbiB0ZSh0LCBlLCByLCBuKSB7XG4gICAgICB2b2lkIDAgPT09IG4gJiYgKG4gPSAxKSwgdGhpcy5yID0gdCwgdGhpcy5nID0gZSwgdGhpcy5iID0gciwgdGhpcy5hID0gbjtcbiAgICB9O1xuXG4gICAgdGUucGFyc2UgPSBmdW5jdGlvbiAodCkge1xuICAgICAgaWYgKHQpIHtcbiAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiB0ZSkgcmV0dXJuIHQ7XG5cbiAgICAgICAgaWYgKFwic3RyaW5nXCIgPT0gdHlwZW9mIHQpIHtcbiAgICAgICAgICB2YXIgZSA9IFF0KHQpO1xuICAgICAgICAgIGlmIChlKSByZXR1cm4gbmV3IHRlKGVbMF0gLyAyNTUgKiBlWzNdLCBlWzFdIC8gMjU1ICogZVszXSwgZVsyXSAvIDI1NSAqIGVbM10sIGVbM10pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgdGUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHQgPSB0aGlzLnRvQXJyYXkoKSxcbiAgICAgICAgICBlID0gdFsxXSxcbiAgICAgICAgICByID0gdFsyXSxcbiAgICAgICAgICBuID0gdFszXTtcbiAgICAgIHJldHVybiBcInJnYmEoXCIgKyBNYXRoLnJvdW5kKHRbMF0pICsgXCIsXCIgKyBNYXRoLnJvdW5kKGUpICsgXCIsXCIgKyBNYXRoLnJvdW5kKHIpICsgXCIsXCIgKyBuICsgXCIpXCI7XG4gICAgfSwgdGUucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdCA9IHRoaXMuYTtcbiAgICAgIHJldHVybiAwID09PSB0ID8gWzAsIDAsIDAsIDBdIDogWzI1NSAqIHRoaXMuciAvIHQsIDI1NSAqIHRoaXMuZyAvIHQsIDI1NSAqIHRoaXMuYiAvIHQsIHRdO1xuICAgIH0sIHRlLmJsYWNrID0gbmV3IHRlKDAsIDAsIDAsIDEpLCB0ZS53aGl0ZSA9IG5ldyB0ZSgxLCAxLCAxLCAxKSwgdGUudHJhbnNwYXJlbnQgPSBuZXcgdGUoMCwgMCwgMCwgMCksIHRlLnJlZCA9IG5ldyB0ZSgxLCAwLCAwLCAxKTtcblxuICAgIHZhciBlZSA9IGZ1bmN0aW9uIGVlKHQsIGUsIHIpIHtcbiAgICAgIHRoaXMuc2Vuc2l0aXZpdHkgPSB0ID8gZSA/IFwidmFyaWFudFwiIDogXCJjYXNlXCIgOiBlID8gXCJhY2NlbnRcIiA6IFwiYmFzZVwiLCB0aGlzLmxvY2FsZSA9IHIsIHRoaXMuY29sbGF0b3IgPSBuZXcgSW50bC5Db2xsYXRvcih0aGlzLmxvY2FsZSA/IHRoaXMubG9jYWxlIDogW10sIHtcbiAgICAgICAgc2Vuc2l0aXZpdHk6IHRoaXMuc2Vuc2l0aXZpdHksXG4gICAgICAgIHVzYWdlOiBcInNlYXJjaFwiXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgZWUucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgcmV0dXJuIHRoaXMuY29sbGF0b3IuY29tcGFyZSh0LCBlKTtcbiAgICB9LCBlZS5wcm90b3R5cGUucmVzb2x2ZWRMb2NhbGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbmV3IEludGwuQ29sbGF0b3IodGhpcy5sb2NhbGUgPyB0aGlzLmxvY2FsZSA6IFtdKS5yZXNvbHZlZE9wdGlvbnMoKS5sb2NhbGU7XG4gICAgfTtcblxuICAgIHZhciByZSA9IGZ1bmN0aW9uIHJlKHQsIGUsIHIsIG4sIGkpIHtcbiAgICAgIHRoaXMudGV4dCA9IHQsIHRoaXMuaW1hZ2UgPSBlLCB0aGlzLnNjYWxlID0gciwgdGhpcy5mb250U3RhY2sgPSBuLCB0aGlzLnRleHRDb2xvciA9IGk7XG4gICAgfSxcbiAgICAgICAgbmUgPSBmdW5jdGlvbiBuZSh0KSB7XG4gICAgICB0aGlzLnNlY3Rpb25zID0gdDtcbiAgICB9O1xuXG4gICAgbmUuZnJvbVN0cmluZyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gbmV3IG5lKFtuZXcgcmUodCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCldKTtcbiAgICB9LCBuZS5wcm90b3R5cGUuaXNFbXB0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAwID09PSB0aGlzLnNlY3Rpb25zLmxlbmd0aCB8fCAhdGhpcy5zZWN0aW9ucy5zb21lKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiAwICE9PSB0LnRleHQubGVuZ3RoIHx8IHQuaW1hZ2UgJiYgMCAhPT0gdC5pbWFnZS5uYW1lLmxlbmd0aDtcbiAgICAgIH0pO1xuICAgIH0sIG5lLmZhY3RvcnkgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHQgaW5zdGFuY2VvZiBuZSA/IHQgOiBuZS5mcm9tU3RyaW5nKHQpO1xuICAgIH0sIG5lLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAwID09PSB0aGlzLnNlY3Rpb25zLmxlbmd0aCA/IFwiXCIgOiB0aGlzLnNlY3Rpb25zLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdC50ZXh0O1xuICAgICAgfSkuam9pbihcIlwiKTtcbiAgICB9LCBuZS5wcm90b3R5cGUuc2VyaWFsaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgZm9yICh2YXIgdCA9IFtcImZvcm1hdFwiXSwgZSA9IDAsIHIgPSB0aGlzLnNlY3Rpb25zOyBlIDwgci5sZW5ndGg7IGUgKz0gMSkge1xuICAgICAgICB2YXIgbiA9IHJbZV07XG4gICAgICAgIGlmIChuLmltYWdlKSB0LnB1c2goW1wiaW1hZ2VcIiwgbi5pbWFnZS5uYW1lXSk7ZWxzZSB7XG4gICAgICAgICAgdC5wdXNoKG4udGV4dCk7XG4gICAgICAgICAgdmFyIGkgPSB7fTtcbiAgICAgICAgICBuLmZvbnRTdGFjayAmJiAoaVtcInRleHQtZm9udFwiXSA9IFtcImxpdGVyYWxcIiwgbi5mb250U3RhY2suc3BsaXQoXCIsXCIpXSksIG4uc2NhbGUgJiYgKGlbXCJmb250LXNjYWxlXCJdID0gbi5zY2FsZSksIG4udGV4dENvbG9yICYmIChpW1widGV4dC1jb2xvclwiXSA9IFtcInJnYmFcIl0uY29uY2F0KG4udGV4dENvbG9yLnRvQXJyYXkoKSkpLCB0LnB1c2goaSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcblxuICAgIHZhciBpZSA9IGZ1bmN0aW9uIGllKHQpIHtcbiAgICAgIHRoaXMubmFtZSA9IHQubmFtZSwgdGhpcy5hdmFpbGFibGUgPSB0LmF2YWlsYWJsZTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gYWUodCwgZSwgciwgbikge1xuICAgICAgcmV0dXJuIFwibnVtYmVyXCIgPT0gdHlwZW9mIHQgJiYgdCA+PSAwICYmIHQgPD0gMjU1ICYmIFwibnVtYmVyXCIgPT0gdHlwZW9mIGUgJiYgZSA+PSAwICYmIGUgPD0gMjU1ICYmIFwibnVtYmVyXCIgPT0gdHlwZW9mIHIgJiYgciA+PSAwICYmIHIgPD0gMjU1ID8gdm9pZCAwID09PSBuIHx8IFwibnVtYmVyXCIgPT0gdHlwZW9mIG4gJiYgbiA+PSAwICYmIG4gPD0gMSA/IG51bGwgOiBcIkludmFsaWQgcmdiYSB2YWx1ZSBbXCIgKyBbdCwgZSwgciwgbl0uam9pbihcIiwgXCIpICsgXCJdOiAnYScgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEuXCIgOiBcIkludmFsaWQgcmdiYSB2YWx1ZSBbXCIgKyAoXCJudW1iZXJcIiA9PSB0eXBlb2YgbiA/IFt0LCBlLCByLCBuXSA6IFt0LCBlLCByXSkuam9pbihcIiwgXCIpICsgXCJdOiAncicsICdnJywgYW5kICdiJyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMjU1LlwiO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9lKHQpIHtcbiAgICAgIGlmIChudWxsID09PSB0KSByZXR1cm4gITA7XG4gICAgICBpZiAoXCJzdHJpbmdcIiA9PSB0eXBlb2YgdCkgcmV0dXJuICEwO1xuICAgICAgaWYgKFwiYm9vbGVhblwiID09IHR5cGVvZiB0KSByZXR1cm4gITA7XG4gICAgICBpZiAoXCJudW1iZXJcIiA9PSB0eXBlb2YgdCkgcmV0dXJuICEwO1xuICAgICAgaWYgKHQgaW5zdGFuY2VvZiB0ZSkgcmV0dXJuICEwO1xuICAgICAgaWYgKHQgaW5zdGFuY2VvZiBlZSkgcmV0dXJuICEwO1xuICAgICAgaWYgKHQgaW5zdGFuY2VvZiBuZSkgcmV0dXJuICEwO1xuICAgICAgaWYgKHQgaW5zdGFuY2VvZiBpZSkgcmV0dXJuICEwO1xuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0KSkge1xuICAgICAgICBmb3IgKHZhciBlID0gMCwgciA9IHQ7IGUgPCByLmxlbmd0aDsgZSArPSAxKSB7XG4gICAgICAgICAgaWYgKCFvZShyW2VdKSkgcmV0dXJuICExO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICEwO1xuICAgICAgfVxuXG4gICAgICBpZiAoXCJvYmplY3RcIiA9PSB0eXBlb2YgdCkge1xuICAgICAgICBmb3IgKHZhciBuIGluIHQpIHtcbiAgICAgICAgICBpZiAoIW9lKHRbbl0pKSByZXR1cm4gITE7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gITA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAhMTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZSh0KSB7XG4gICAgICBpZiAobnVsbCA9PT0gdCkgcmV0dXJuIEx0O1xuICAgICAgaWYgKFwic3RyaW5nXCIgPT0gdHlwZW9mIHQpIHJldHVybiBSdDtcbiAgICAgIGlmIChcImJvb2xlYW5cIiA9PSB0eXBlb2YgdCkgcmV0dXJuIFV0O1xuICAgICAgaWYgKFwibnVtYmVyXCIgPT0gdHlwZW9mIHQpIHJldHVybiBPdDtcbiAgICAgIGlmICh0IGluc3RhbmNlb2YgdGUpIHJldHVybiBqdDtcbiAgICAgIGlmICh0IGluc3RhbmNlb2YgZWUpIHJldHVybiBLdDtcbiAgICAgIGlmICh0IGluc3RhbmNlb2YgbmUpIHJldHVybiBHdDtcbiAgICAgIGlmICh0IGluc3RhbmNlb2YgaWUpIHJldHVybiBadDtcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodCkpIHtcbiAgICAgICAgZm9yICh2YXIgZSwgciA9IHQubGVuZ3RoLCBuID0gMCwgaSA9IHQ7IG4gPCBpLmxlbmd0aDsgbiArPSAxKSB7XG4gICAgICAgICAgdmFyIGEgPSBzZShpW25dKTtcblxuICAgICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICBpZiAoZSA9PT0gYSkgY29udGludWU7XG4gICAgICAgICAgICBlID0gTnQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlID0gYTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBYdChlIHx8IE50LCByKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHF0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVlKHQpIHtcbiAgICAgIHZhciBlID0gdHlwZW9mIHQ7XG4gICAgICByZXR1cm4gbnVsbCA9PT0gdCA/IFwiXCIgOiBcInN0cmluZ1wiID09PSBlIHx8IFwibnVtYmVyXCIgPT09IGUgfHwgXCJib29sZWFuXCIgPT09IGUgPyBTdHJpbmcodCkgOiB0IGluc3RhbmNlb2YgdGUgfHwgdCBpbnN0YW5jZW9mIG5lIHx8IHQgaW5zdGFuY2VvZiBpZSA/IHQudG9TdHJpbmcoKSA6IEpTT04uc3RyaW5naWZ5KHQpO1xuICAgIH1cblxuICAgIGllLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgfSwgaWUuZnJvbVN0cmluZyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gdCA/IG5ldyBpZSh7XG4gICAgICAgIG5hbWU6IHQsXG4gICAgICAgIGF2YWlsYWJsZTogITFcbiAgICAgIH0pIDogbnVsbDtcbiAgICB9LCBpZS5wcm90b3R5cGUuc2VyaWFsaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIFtcImltYWdlXCIsIHRoaXMubmFtZV07XG4gICAgfTtcblxuICAgIHZhciBsZSA9IGZ1bmN0aW9uIGxlKHQsIGUpIHtcbiAgICAgIHRoaXMudHlwZSA9IHQsIHRoaXMudmFsdWUgPSBlO1xuICAgIH07XG5cbiAgICBsZS5wYXJzZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICBpZiAoMiAhPT0gdC5sZW5ndGgpIHJldHVybiBlLmVycm9yKFwiJ2xpdGVyYWwnIGV4cHJlc3Npb24gcmVxdWlyZXMgZXhhY3RseSBvbmUgYXJndW1lbnQsIGJ1dCBmb3VuZCBcIiArICh0Lmxlbmd0aCAtIDEpICsgXCIgaW5zdGVhZC5cIik7XG4gICAgICBpZiAoIW9lKHRbMV0pKSByZXR1cm4gZS5lcnJvcihcImludmFsaWQgdmFsdWVcIik7XG4gICAgICB2YXIgciA9IHRbMV0sXG4gICAgICAgICAgbiA9IHNlKHIpLFxuICAgICAgICAgIGkgPSBlLmV4cGVjdGVkVHlwZTtcbiAgICAgIHJldHVybiBcImFycmF5XCIgIT09IG4ua2luZCB8fCAwICE9PSBuLk4gfHwgIWkgfHwgXCJhcnJheVwiICE9PSBpLmtpbmQgfHwgXCJudW1iZXJcIiA9PSB0eXBlb2YgaS5OICYmIDAgIT09IGkuTiB8fCAobiA9IGkpLCBuZXcgbGUobiwgcik7XG4gICAgfSwgbGUucHJvdG90eXBlLmV2YWx1YXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgfSwgbGUucHJvdG90eXBlLmVhY2hDaGlsZCA9IGZ1bmN0aW9uICgpIHt9LCBsZS5wcm90b3R5cGUub3V0cHV0RGVmaW5lZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhMDtcbiAgICB9LCBsZS5wcm90b3R5cGUuc2VyaWFsaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIFwiYXJyYXlcIiA9PT0gdGhpcy50eXBlLmtpbmQgfHwgXCJvYmplY3RcIiA9PT0gdGhpcy50eXBlLmtpbmQgPyBbXCJsaXRlcmFsXCIsIHRoaXMudmFsdWVdIDogdGhpcy52YWx1ZSBpbnN0YW5jZW9mIHRlID8gW1wicmdiYVwiXS5jb25jYXQodGhpcy52YWx1ZS50b0FycmF5KCkpIDogdGhpcy52YWx1ZSBpbnN0YW5jZW9mIG5lID8gdGhpcy52YWx1ZS5zZXJpYWxpemUoKSA6IHRoaXMudmFsdWU7XG4gICAgfTtcblxuICAgIHZhciBwZSA9IGZ1bmN0aW9uIHBlKHQpIHtcbiAgICAgIHRoaXMubmFtZSA9IFwiRXhwcmVzc2lvbkV2YWx1YXRpb25FcnJvclwiLCB0aGlzLm1lc3NhZ2UgPSB0O1xuICAgIH07XG5cbiAgICBwZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZTtcbiAgICB9O1xuXG4gICAgdmFyIGNlID0ge1xuICAgICAgc3RyaW5nOiBSdCxcbiAgICAgIG51bWJlcjogT3QsXG4gICAgICBib29sZWFuOiBVdCxcbiAgICAgIG9iamVjdDogcXRcbiAgICB9LFxuICAgICAgICBoZSA9IGZ1bmN0aW9uIGhlKHQsIGUpIHtcbiAgICAgIHRoaXMudHlwZSA9IHQsIHRoaXMuYXJncyA9IGU7XG4gICAgfTtcblxuICAgIGhlLnBhcnNlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIGlmICh0Lmxlbmd0aCA8IDIpIHJldHVybiBlLmVycm9yKFwiRXhwZWN0ZWQgYXQgbGVhc3Qgb25lIGFyZ3VtZW50LlwiKTtcbiAgICAgIHZhciByLFxuICAgICAgICAgIG4gPSAxLFxuICAgICAgICAgIGkgPSB0WzBdO1xuXG4gICAgICBpZiAoXCJhcnJheVwiID09PSBpKSB7XG4gICAgICAgIHZhciBhLCBvO1xuXG4gICAgICAgIGlmICh0Lmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICB2YXIgcyA9IHRbMV07XG4gICAgICAgICAgaWYgKFwic3RyaW5nXCIgIT0gdHlwZW9mIHMgfHwgIShzIGluIGNlKSB8fCBcIm9iamVjdFwiID09PSBzKSByZXR1cm4gZS5lcnJvcignVGhlIGl0ZW0gdHlwZSBhcmd1bWVudCBvZiBcImFycmF5XCIgbXVzdCBiZSBvbmUgb2Ygc3RyaW5nLCBudW1iZXIsIGJvb2xlYW4nLCAxKTtcbiAgICAgICAgICBhID0gY2Vbc10sIG4rKztcbiAgICAgICAgfSBlbHNlIGEgPSBOdDtcblxuICAgICAgICBpZiAodC5sZW5ndGggPiAzKSB7XG4gICAgICAgICAgaWYgKG51bGwgIT09IHRbMl0gJiYgKFwibnVtYmVyXCIgIT0gdHlwZW9mIHRbMl0gfHwgdFsyXSA8IDAgfHwgdFsyXSAhPT0gTWF0aC5mbG9vcih0WzJdKSkpIHJldHVybiBlLmVycm9yKCdUaGUgbGVuZ3RoIGFyZ3VtZW50IHRvIFwiYXJyYXlcIiBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBsaXRlcmFsJywgMik7XG4gICAgICAgICAgbyA9IHRbMl0sIG4rKztcbiAgICAgICAgfVxuXG4gICAgICAgIHIgPSBYdChhLCBvKTtcbiAgICAgIH0gZWxzZSByID0gY2VbaV07XG5cbiAgICAgIGZvciAodmFyIHUgPSBbXTsgbiA8IHQubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgdmFyIGwgPSBlLnBhcnNlKHRbbl0sIG4sIE50KTtcbiAgICAgICAgaWYgKCFsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgdS5wdXNoKGwpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IGhlKHIsIHUpO1xuICAgIH0sIGhlLnByb3RvdHlwZS5ldmFsdWF0ZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmb3IgKHZhciBlID0gMDsgZSA8IHRoaXMuYXJncy5sZW5ndGg7IGUrKykge1xuICAgICAgICB2YXIgciA9IHRoaXMuYXJnc1tlXS5ldmFsdWF0ZSh0KTtcbiAgICAgICAgaWYgKCFZdCh0aGlzLnR5cGUsIHNlKHIpKSkgcmV0dXJuIHI7XG4gICAgICAgIGlmIChlID09PSB0aGlzLmFyZ3MubGVuZ3RoIC0gMSkgdGhyb3cgbmV3IHBlKFwiRXhwZWN0ZWQgdmFsdWUgdG8gYmUgb2YgdHlwZSBcIiArIEp0KHRoaXMudHlwZSkgKyBcIiwgYnV0IGZvdW5kIFwiICsgSnQoc2UocikpICsgXCIgaW5zdGVhZC5cIik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0sIGhlLnByb3RvdHlwZS5lYWNoQ2hpbGQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdGhpcy5hcmdzLmZvckVhY2godCk7XG4gICAgfSwgaGUucHJvdG90eXBlLm91dHB1dERlZmluZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5hcmdzLmV2ZXJ5KGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0Lm91dHB1dERlZmluZWQoKTtcbiAgICAgIH0pO1xuICAgIH0sIGhlLnByb3RvdHlwZS5zZXJpYWxpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdCA9IHRoaXMudHlwZSxcbiAgICAgICAgICBlID0gW3Qua2luZF07XG5cbiAgICAgIGlmIChcImFycmF5XCIgPT09IHQua2luZCkge1xuICAgICAgICB2YXIgciA9IHQuaXRlbVR5cGU7XG5cbiAgICAgICAgaWYgKFwic3RyaW5nXCIgPT09IHIua2luZCB8fCBcIm51bWJlclwiID09PSByLmtpbmQgfHwgXCJib29sZWFuXCIgPT09IHIua2luZCkge1xuICAgICAgICAgIGUucHVzaChyLmtpbmQpO1xuICAgICAgICAgIHZhciBuID0gdC5OO1xuICAgICAgICAgIChcIm51bWJlclwiID09IHR5cGVvZiBuIHx8IHRoaXMuYXJncy5sZW5ndGggPiAxKSAmJiBlLnB1c2gobik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGUuY29uY2F0KHRoaXMuYXJncy5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQuc2VyaWFsaXplKCk7XG4gICAgICB9KSk7XG4gICAgfTtcblxuICAgIHZhciBmZSA9IGZ1bmN0aW9uIGZlKHQpIHtcbiAgICAgIHRoaXMudHlwZSA9IEd0LCB0aGlzLnNlY3Rpb25zID0gdDtcbiAgICB9O1xuXG4gICAgZmUucGFyc2UgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgaWYgKHQubGVuZ3RoIDwgMikgcmV0dXJuIGUuZXJyb3IoXCJFeHBlY3RlZCBhdCBsZWFzdCBvbmUgYXJndW1lbnQuXCIpO1xuICAgICAgdmFyIHIgPSB0WzFdO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHIpICYmIFwib2JqZWN0XCIgPT0gdHlwZW9mIHIpIHJldHVybiBlLmVycm9yKFwiRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhbiBpbWFnZSBvciB0ZXh0IHNlY3Rpb24uXCIpO1xuXG4gICAgICBmb3IgKHZhciBuID0gW10sIGkgPSAhMSwgYSA9IDE7IGEgPD0gdC5sZW5ndGggLSAxOyArK2EpIHtcbiAgICAgICAgdmFyIG8gPSB0W2FdO1xuXG4gICAgICAgIGlmIChpICYmIFwib2JqZWN0XCIgPT0gdHlwZW9mIG8gJiYgIUFycmF5LmlzQXJyYXkobykpIHtcbiAgICAgICAgICBpID0gITE7XG4gICAgICAgICAgdmFyIHMgPSBudWxsO1xuICAgICAgICAgIGlmIChvW1wiZm9udC1zY2FsZVwiXSAmJiAhKHMgPSBlLnBhcnNlKG9bXCJmb250LXNjYWxlXCJdLCAxLCBPdCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICB2YXIgdSA9IG51bGw7XG4gICAgICAgICAgaWYgKG9bXCJ0ZXh0LWZvbnRcIl0gJiYgISh1ID0gZS5wYXJzZShvW1widGV4dC1mb250XCJdLCAxLCBYdChSdCkpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgdmFyIGwgPSBudWxsO1xuICAgICAgICAgIGlmIChvW1widGV4dC1jb2xvclwiXSAmJiAhKGwgPSBlLnBhcnNlKG9bXCJ0ZXh0LWNvbG9yXCJdLCAxLCBqdCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICB2YXIgcCA9IG5bbi5sZW5ndGggLSAxXTtcbiAgICAgICAgICBwLnNjYWxlID0gcywgcC5mb250ID0gdSwgcC50ZXh0Q29sb3IgPSBsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBjID0gZS5wYXJzZSh0W2FdLCAxLCBOdCk7XG4gICAgICAgICAgaWYgKCFjKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICB2YXIgaCA9IGMudHlwZS5raW5kO1xuICAgICAgICAgIGlmIChcInN0cmluZ1wiICE9PSBoICYmIFwidmFsdWVcIiAhPT0gaCAmJiBcIm51bGxcIiAhPT0gaCAmJiBcInJlc29sdmVkSW1hZ2VcIiAhPT0gaCkgcmV0dXJuIGUuZXJyb3IoXCJGb3JtYXR0ZWQgdGV4dCB0eXBlIG11c3QgYmUgJ3N0cmluZycsICd2YWx1ZScsICdpbWFnZScgb3IgJ251bGwnLlwiKTtcbiAgICAgICAgICBpID0gITAsIG4ucHVzaCh7XG4gICAgICAgICAgICBjb250ZW50OiBjLFxuICAgICAgICAgICAgc2NhbGU6IG51bGwsXG4gICAgICAgICAgICBmb250OiBudWxsLFxuICAgICAgICAgICAgdGV4dENvbG9yOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBmZShuKTtcbiAgICB9LCBmZS5wcm90b3R5cGUuZXZhbHVhdGUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIG5ldyBuZSh0aGlzLnNlY3Rpb25zLm1hcChmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgciA9IGUuY29udGVudC5ldmFsdWF0ZSh0KTtcbiAgICAgICAgcmV0dXJuIHNlKHIpID09PSBadCA/IG5ldyByZShcIlwiLCByLCBudWxsLCBudWxsLCBudWxsKSA6IG5ldyByZSh1ZShyKSwgbnVsbCwgZS5zY2FsZSA/IGUuc2NhbGUuZXZhbHVhdGUodCkgOiBudWxsLCBlLmZvbnQgPyBlLmZvbnQuZXZhbHVhdGUodCkuam9pbihcIixcIikgOiBudWxsLCBlLnRleHRDb2xvciA/IGUudGV4dENvbG9yLmV2YWx1YXRlKHQpIDogbnVsbCk7XG4gICAgICB9KSk7XG4gICAgfSwgZmUucHJvdG90eXBlLmVhY2hDaGlsZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmb3IgKHZhciBlID0gMCwgciA9IHRoaXMuc2VjdGlvbnM7IGUgPCByLmxlbmd0aDsgZSArPSAxKSB7XG4gICAgICAgIHZhciBuID0gcltlXTtcbiAgICAgICAgdChuLmNvbnRlbnQpLCBuLnNjYWxlICYmIHQobi5zY2FsZSksIG4uZm9udCAmJiB0KG4uZm9udCksIG4udGV4dENvbG9yICYmIHQobi50ZXh0Q29sb3IpO1xuICAgICAgfVxuICAgIH0sIGZlLnByb3RvdHlwZS5vdXRwdXREZWZpbmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICExO1xuICAgIH0sIGZlLnByb3RvdHlwZS5zZXJpYWxpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKHZhciB0ID0gW1wiZm9ybWF0XCJdLCBlID0gMCwgciA9IHRoaXMuc2VjdGlvbnM7IGUgPCByLmxlbmd0aDsgZSArPSAxKSB7XG4gICAgICAgIHZhciBuID0gcltlXTtcbiAgICAgICAgdC5wdXNoKG4uY29udGVudC5zZXJpYWxpemUoKSk7XG4gICAgICAgIHZhciBpID0ge307XG4gICAgICAgIG4uc2NhbGUgJiYgKGlbXCJmb250LXNjYWxlXCJdID0gbi5zY2FsZS5zZXJpYWxpemUoKSksIG4uZm9udCAmJiAoaVtcInRleHQtZm9udFwiXSA9IG4uZm9udC5zZXJpYWxpemUoKSksIG4udGV4dENvbG9yICYmIChpW1widGV4dC1jb2xvclwiXSA9IG4udGV4dENvbG9yLnNlcmlhbGl6ZSgpKSwgdC5wdXNoKGkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdDtcbiAgICB9O1xuXG4gICAgdmFyIHllID0gZnVuY3Rpb24geWUodCkge1xuICAgICAgdGhpcy50eXBlID0gWnQsIHRoaXMuaW5wdXQgPSB0O1xuICAgIH07XG5cbiAgICB5ZS5wYXJzZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICBpZiAoMiAhPT0gdC5sZW5ndGgpIHJldHVybiBlLmVycm9yKFwiRXhwZWN0ZWQgdHdvIGFyZ3VtZW50cy5cIik7XG4gICAgICB2YXIgciA9IGUucGFyc2UodFsxXSwgMSwgUnQpO1xuICAgICAgcmV0dXJuIHIgPyBuZXcgeWUocikgOiBlLmVycm9yKFwiTm8gaW1hZ2UgbmFtZSBwcm92aWRlZC5cIik7XG4gICAgfSwgeWUucHJvdG90eXBlLmV2YWx1YXRlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHZhciBlID0gdGhpcy5pbnB1dC5ldmFsdWF0ZSh0KSxcbiAgICAgICAgICByID0gaWUuZnJvbVN0cmluZyhlKTtcbiAgICAgIHJldHVybiByICYmIHQuYXZhaWxhYmxlSW1hZ2VzICYmIChyLmF2YWlsYWJsZSA9IHQuYXZhaWxhYmxlSW1hZ2VzLmluZGV4T2YoZSkgPiAtMSksIHI7XG4gICAgfSwgeWUucHJvdG90eXBlLmVhY2hDaGlsZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0KHRoaXMuaW5wdXQpO1xuICAgIH0sIHllLnByb3RvdHlwZS5vdXRwdXREZWZpbmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICExO1xuICAgIH0sIHllLnByb3RvdHlwZS5zZXJpYWxpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gW1wiaW1hZ2VcIiwgdGhpcy5pbnB1dC5zZXJpYWxpemUoKV07XG4gICAgfTtcblxuICAgIHZhciBkZSA9IHtcbiAgICAgIFwidG8tYm9vbGVhblwiOiBVdCxcbiAgICAgIFwidG8tY29sb3JcIjoganQsXG4gICAgICBcInRvLW51bWJlclwiOiBPdCxcbiAgICAgIFwidG8tc3RyaW5nXCI6IFJ0XG4gICAgfSxcbiAgICAgICAgbWUgPSBmdW5jdGlvbiBtZSh0LCBlKSB7XG4gICAgICB0aGlzLnR5cGUgPSB0LCB0aGlzLmFyZ3MgPSBlO1xuICAgIH07XG5cbiAgICBtZS5wYXJzZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICBpZiAodC5sZW5ndGggPCAyKSByZXR1cm4gZS5lcnJvcihcIkV4cGVjdGVkIGF0IGxlYXN0IG9uZSBhcmd1bWVudC5cIik7XG4gICAgICB2YXIgciA9IHRbMF07XG4gICAgICBpZiAoKFwidG8tYm9vbGVhblwiID09PSByIHx8IFwidG8tc3RyaW5nXCIgPT09IHIpICYmIDIgIT09IHQubGVuZ3RoKSByZXR1cm4gZS5lcnJvcihcIkV4cGVjdGVkIG9uZSBhcmd1bWVudC5cIik7XG5cbiAgICAgIGZvciAodmFyIG4gPSBkZVtyXSwgaSA9IFtdLCBhID0gMTsgYSA8IHQubGVuZ3RoOyBhKyspIHtcbiAgICAgICAgdmFyIG8gPSBlLnBhcnNlKHRbYV0sIGEsIE50KTtcbiAgICAgICAgaWYgKCFvKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaS5wdXNoKG8pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IG1lKG4sIGkpO1xuICAgIH0sIG1lLnByb3RvdHlwZS5ldmFsdWF0ZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBpZiAoXCJib29sZWFuXCIgPT09IHRoaXMudHlwZS5raW5kKSByZXR1cm4gQm9vbGVhbih0aGlzLmFyZ3NbMF0uZXZhbHVhdGUodCkpO1xuXG4gICAgICBpZiAoXCJjb2xvclwiID09PSB0aGlzLnR5cGUua2luZCkge1xuICAgICAgICBmb3IgKHZhciBlLCByLCBuID0gMCwgaSA9IHRoaXMuYXJnczsgbiA8IGkubGVuZ3RoOyBuICs9IDEpIHtcbiAgICAgICAgICBpZiAociA9IG51bGwsIChlID0gaVtuXS5ldmFsdWF0ZSh0KSkgaW5zdGFuY2VvZiB0ZSkgcmV0dXJuIGU7XG5cbiAgICAgICAgICBpZiAoXCJzdHJpbmdcIiA9PSB0eXBlb2YgZSkge1xuICAgICAgICAgICAgdmFyIGEgPSB0LnBhcnNlQ29sb3IoZSk7XG4gICAgICAgICAgICBpZiAoYSkgcmV0dXJuIGE7XG4gICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGUpICYmICEociA9IGUubGVuZ3RoIDwgMyB8fCBlLmxlbmd0aCA+IDQgPyBcIkludmFsaWQgcmJnYSB2YWx1ZSBcIiArIEpTT04uc3RyaW5naWZ5KGUpICsgXCI6IGV4cGVjdGVkIGFuIGFycmF5IGNvbnRhaW5pbmcgZWl0aGVyIHRocmVlIG9yIGZvdXIgbnVtZXJpYyB2YWx1ZXMuXCIgOiBhZShlWzBdLCBlWzFdLCBlWzJdLCBlWzNdKSkpIHJldHVybiBuZXcgdGUoZVswXSAvIDI1NSwgZVsxXSAvIDI1NSwgZVsyXSAvIDI1NSwgZVszXSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgcGUociB8fCBcIkNvdWxkIG5vdCBwYXJzZSBjb2xvciBmcm9tIHZhbHVlICdcIiArIChcInN0cmluZ1wiID09IHR5cGVvZiBlID8gZSA6IFN0cmluZyhKU09OLnN0cmluZ2lmeShlKSkpICsgXCInXCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoXCJudW1iZXJcIiA9PT0gdGhpcy50eXBlLmtpbmQpIHtcbiAgICAgICAgZm9yICh2YXIgbyA9IG51bGwsIHMgPSAwLCB1ID0gdGhpcy5hcmdzOyBzIDwgdS5sZW5ndGg7IHMgKz0gMSkge1xuICAgICAgICAgIGlmIChudWxsID09PSAobyA9IHVbc10uZXZhbHVhdGUodCkpKSByZXR1cm4gMDtcbiAgICAgICAgICB2YXIgbCA9IE51bWJlcihvKTtcbiAgICAgICAgICBpZiAoIWlzTmFOKGwpKSByZXR1cm4gbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBwZShcIkNvdWxkIG5vdCBjb252ZXJ0IFwiICsgSlNPTi5zdHJpbmdpZnkobykgKyBcIiB0byBudW1iZXIuXCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gXCJmb3JtYXR0ZWRcIiA9PT0gdGhpcy50eXBlLmtpbmQgPyBuZS5mcm9tU3RyaW5nKHVlKHRoaXMuYXJnc1swXS5ldmFsdWF0ZSh0KSkpIDogXCJyZXNvbHZlZEltYWdlXCIgPT09IHRoaXMudHlwZS5raW5kID8gaWUuZnJvbVN0cmluZyh1ZSh0aGlzLmFyZ3NbMF0uZXZhbHVhdGUodCkpKSA6IHVlKHRoaXMuYXJnc1swXS5ldmFsdWF0ZSh0KSk7XG4gICAgfSwgbWUucHJvdG90eXBlLmVhY2hDaGlsZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0aGlzLmFyZ3MuZm9yRWFjaCh0KTtcbiAgICB9LCBtZS5wcm90b3R5cGUub3V0cHV0RGVmaW5lZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLmFyZ3MuZXZlcnkoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQub3V0cHV0RGVmaW5lZCgpO1xuICAgICAgfSk7XG4gICAgfSwgbWUucHJvdG90eXBlLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChcImZvcm1hdHRlZFwiID09PSB0aGlzLnR5cGUua2luZCkgcmV0dXJuIG5ldyBmZShbe1xuICAgICAgICBjb250ZW50OiB0aGlzLmFyZ3NbMF0sXG4gICAgICAgIHNjYWxlOiBudWxsLFxuICAgICAgICBmb250OiBudWxsLFxuICAgICAgICB0ZXh0Q29sb3I6IG51bGxcbiAgICAgIH1dKS5zZXJpYWxpemUoKTtcbiAgICAgIGlmIChcInJlc29sdmVkSW1hZ2VcIiA9PT0gdGhpcy50eXBlLmtpbmQpIHJldHVybiBuZXcgeWUodGhpcy5hcmdzWzBdKS5zZXJpYWxpemUoKTtcbiAgICAgIHZhciB0ID0gW1widG8tXCIgKyB0aGlzLnR5cGUua2luZF07XG4gICAgICByZXR1cm4gdGhpcy5lYWNoQ2hpbGQoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdC5wdXNoKGUuc2VyaWFsaXplKCkpO1xuICAgICAgfSksIHQ7XG4gICAgfTtcblxuICAgIHZhciB2ZSA9IFtcIlVua25vd25cIiwgXCJQb2ludFwiLCBcIkxpbmVTdHJpbmdcIiwgXCJQb2x5Z29uXCJdLFxuICAgICAgICBnZSA9IGZ1bmN0aW9uIGdlKCkge1xuICAgICAgdGhpcy5nbG9iYWxzID0gbnVsbCwgdGhpcy5mZWF0dXJlID0gbnVsbCwgdGhpcy5mZWF0dXJlU3RhdGUgPSBudWxsLCB0aGlzLmZvcm1hdHRlZFNlY3Rpb24gPSBudWxsLCB0aGlzLl9wYXJzZUNvbG9yQ2FjaGUgPSB7fSwgdGhpcy5hdmFpbGFibGVJbWFnZXMgPSBudWxsLCB0aGlzLmNhbm9uaWNhbCA9IG51bGw7XG4gICAgfTtcblxuICAgIGdlLnByb3RvdHlwZS5pZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLmZlYXR1cmUgJiYgXCJpZFwiIGluIHRoaXMuZmVhdHVyZSA/IHRoaXMuZmVhdHVyZS5pZCA6IG51bGw7XG4gICAgfSwgZ2UucHJvdG90eXBlLmdlb21ldHJ5VHlwZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLmZlYXR1cmUgPyBcIm51bWJlclwiID09IHR5cGVvZiB0aGlzLmZlYXR1cmUudHlwZSA/IHZlW3RoaXMuZmVhdHVyZS50eXBlXSA6IHRoaXMuZmVhdHVyZS50eXBlIDogbnVsbDtcbiAgICB9LCBnZS5wcm90b3R5cGUuZ2VvbWV0cnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5mZWF0dXJlICYmIFwiZ2VvbWV0cnlcIiBpbiB0aGlzLmZlYXR1cmUgPyB0aGlzLmZlYXR1cmUuZ2VvbWV0cnkgOiBudWxsO1xuICAgIH0sIGdlLnByb3RvdHlwZS5jYW5vbmljYWxJRCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNhbm9uaWNhbDtcbiAgICB9LCBnZS5wcm90b3R5cGUucHJvcGVydGllcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLmZlYXR1cmUgJiYgdGhpcy5mZWF0dXJlLnByb3BlcnRpZXMgfHwge307XG4gICAgfSwgZ2UucHJvdG90eXBlLnBhcnNlQ29sb3IgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGUgPSB0aGlzLl9wYXJzZUNvbG9yQ2FjaGVbdF07XG4gICAgICByZXR1cm4gZSB8fCAoZSA9IHRoaXMuX3BhcnNlQ29sb3JDYWNoZVt0XSA9IHRlLnBhcnNlKHQpKSwgZTtcbiAgICB9O1xuXG4gICAgdmFyIHhlID0gZnVuY3Rpb24geGUodCwgZSwgciwgbikge1xuICAgICAgdGhpcy5uYW1lID0gdCwgdGhpcy50eXBlID0gZSwgdGhpcy5fZXZhbHVhdGUgPSByLCB0aGlzLmFyZ3MgPSBuO1xuICAgIH07XG5cbiAgICB4ZS5wcm90b3R5cGUuZXZhbHVhdGUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2V2YWx1YXRlKHQsIHRoaXMuYXJncyk7XG4gICAgfSwgeGUucHJvdG90eXBlLmVhY2hDaGlsZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0aGlzLmFyZ3MuZm9yRWFjaCh0KTtcbiAgICB9LCB4ZS5wcm90b3R5cGUub3V0cHV0RGVmaW5lZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhMTtcbiAgICB9LCB4ZS5wcm90b3R5cGUuc2VyaWFsaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIFt0aGlzLm5hbWVdLmNvbmNhdCh0aGlzLmFyZ3MubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0LnNlcmlhbGl6ZSgpO1xuICAgICAgfSkpO1xuICAgIH0sIHhlLnBhcnNlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHZhciByLFxuICAgICAgICAgIG4gPSB0WzBdLFxuICAgICAgICAgIGkgPSB4ZS5kZWZpbml0aW9uc1tuXTtcbiAgICAgIGlmICghaSkgcmV0dXJuIGUuZXJyb3IoJ1Vua25vd24gZXhwcmVzc2lvbiBcIicgKyBuICsgJ1wiLiBJZiB5b3Ugd2FudGVkIGEgbGl0ZXJhbCBhcnJheSwgdXNlIFtcImxpdGVyYWxcIiwgWy4uLl1dLicsIDApO1xuXG4gICAgICBmb3IgKHZhciBhID0gQXJyYXkuaXNBcnJheShpKSA/IGlbMF0gOiBpLnR5cGUsIG8gPSBBcnJheS5pc0FycmF5KGkpID8gW1tpWzFdLCBpWzJdXV0gOiBpLm92ZXJsb2FkcywgcyA9IG8uZmlsdGVyKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciByID0gZVswXTtcbiAgICAgICAgcmV0dXJuICFBcnJheS5pc0FycmF5KHIpIHx8IHIubGVuZ3RoID09PSB0Lmxlbmd0aCAtIDE7XG4gICAgICB9KSwgdSA9IG51bGwsIGwgPSAwLCBwID0gczsgbCA8IHAubGVuZ3RoOyBsICs9IDEpIHtcbiAgICAgICAgdmFyIGMgPSBwW2xdLFxuICAgICAgICAgICAgaCA9IGNbMF0sXG4gICAgICAgICAgICBmID0gY1sxXTtcbiAgICAgICAgdSA9IG5ldyBqZShlLnJlZ2lzdHJ5LCBlLnBhdGgsIG51bGwsIGUuc2NvcGUpO1xuXG4gICAgICAgIGZvciAodmFyIHkgPSBbXSwgZCA9ICExLCBtID0gMTsgbSA8IHQubGVuZ3RoOyBtKyspIHtcbiAgICAgICAgICB2YXIgdiA9IHRbbV0sXG4gICAgICAgICAgICAgIGcgPSBBcnJheS5pc0FycmF5KGgpID8gaFttIC0gMV0gOiBoLnR5cGUsXG4gICAgICAgICAgICAgIHggPSB1LnBhcnNlKHYsIDEgKyB5Lmxlbmd0aCwgZyk7XG5cbiAgICAgICAgICBpZiAoIXgpIHtcbiAgICAgICAgICAgIGQgPSAhMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHkucHVzaCh4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZCkgaWYgKEFycmF5LmlzQXJyYXkoaCkgJiYgaC5sZW5ndGggIT09IHkubGVuZ3RoKSB1LmVycm9yKFwiRXhwZWN0ZWQgXCIgKyBoLmxlbmd0aCArIFwiIGFyZ3VtZW50cywgYnV0IGZvdW5kIFwiICsgeS5sZW5ndGggKyBcIiBpbnN0ZWFkLlwiKTtlbHNlIHtcbiAgICAgICAgICBmb3IgKHZhciBiID0gMDsgYiA8IHkubGVuZ3RoOyBiKyspIHtcbiAgICAgICAgICAgIHZhciB3ID0gQXJyYXkuaXNBcnJheShoKSA/IGhbYl0gOiBoLnR5cGUsXG4gICAgICAgICAgICAgICAgXyA9IHlbYl07XG4gICAgICAgICAgICB1LmNvbmNhdChiICsgMSkuY2hlY2tTdWJ0eXBlKHcsIF8udHlwZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKDAgPT09IHUuZXJyb3JzLmxlbmd0aCkgcmV0dXJuIG5ldyB4ZShuLCBhLCBmLCB5KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoMSA9PT0gcy5sZW5ndGgpIChyID0gZS5lcnJvcnMpLnB1c2guYXBwbHkociwgdS5lcnJvcnMpO2Vsc2Uge1xuICAgICAgICBmb3IgKHZhciBBID0gKHMubGVuZ3RoID8gcyA6IG8pLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHZhciBlO1xuICAgICAgICAgIHJldHVybiBlID0gdFswXSwgQXJyYXkuaXNBcnJheShlKSA/IFwiKFwiICsgZS5tYXAoSnQpLmpvaW4oXCIsIFwiKSArIFwiKVwiIDogXCIoXCIgKyBKdChlLnR5cGUpICsgXCIuLi4pXCI7XG4gICAgICAgIH0pLmpvaW4oXCIgfCBcIiksIFMgPSBbXSwgayA9IDE7IGsgPCB0Lmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgdmFyIEkgPSBlLnBhcnNlKHRba10sIDEgKyBTLmxlbmd0aCk7XG4gICAgICAgICAgaWYgKCFJKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICBTLnB1c2goSnQoSS50eXBlKSk7XG4gICAgICAgIH1cblxuICAgICAgICBlLmVycm9yKFwiRXhwZWN0ZWQgYXJndW1lbnRzIG9mIHR5cGUgXCIgKyBBICsgXCIsIGJ1dCBmb3VuZCAoXCIgKyBTLmpvaW4oXCIsIFwiKSArIFwiKSBpbnN0ZWFkLlwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0sIHhlLnJlZ2lzdGVyID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIGZvciAodmFyIHIgaW4geGUuZGVmaW5pdGlvbnMgPSBlLCBlKSB7XG4gICAgICAgIHRbcl0gPSB4ZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIGJlID0gZnVuY3Rpb24gYmUodCwgZSwgcikge1xuICAgICAgdGhpcy50eXBlID0gS3QsIHRoaXMubG9jYWxlID0gciwgdGhpcy5jYXNlU2Vuc2l0aXZlID0gdCwgdGhpcy5kaWFjcml0aWNTZW5zaXRpdmUgPSBlO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiB3ZSh0LCBlKSB7XG4gICAgICB0WzBdID0gTWF0aC5taW4odFswXSwgZVswXSksIHRbMV0gPSBNYXRoLm1pbih0WzFdLCBlWzFdKSwgdFsyXSA9IE1hdGgubWF4KHRbMl0sIGVbMF0pLCB0WzNdID0gTWF0aC5tYXgodFszXSwgZVsxXSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gX2UodCwgZSkge1xuICAgICAgcmV0dXJuICEodFswXSA8PSBlWzBdIHx8IHRbMl0gPj0gZVsyXSB8fCB0WzFdIDw9IGVbMV0gfHwgdFszXSA+PSBlWzNdKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBBZSh0LCBlKSB7XG4gICAgICB2YXIgciA9ICgxODAgKyB0WzBdKSAvIDM2MCxcbiAgICAgICAgICBuID0gKDE4MCAtIDE4MCAvIE1hdGguUEkgKiBNYXRoLmxvZyhNYXRoLnRhbihNYXRoLlBJIC8gNCArIHRbMV0gKiBNYXRoLlBJIC8gMzYwKSkpIC8gMzYwLFxuICAgICAgICAgIGkgPSBNYXRoLnBvdygyLCBlLnopO1xuICAgICAgcmV0dXJuIFtNYXRoLnJvdW5kKHIgKiBpICogODE5MiksIE1hdGgucm91bmQobiAqIGkgKiA4MTkyKV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gU2UodCwgZSwgcikge1xuICAgICAgcmV0dXJuIGVbMV0gPiB0WzFdICE9IHJbMV0gPiB0WzFdICYmIHRbMF0gPCAoclswXSAtIGVbMF0pICogKHRbMV0gLSBlWzFdKSAvIChyWzFdIC0gZVsxXSkgKyBlWzBdO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGtlKHQsIGUpIHtcbiAgICAgIGZvciAodmFyIHIsIG4sIGksIGEsIG8sIHMsIHUsIGwgPSAhMSwgcCA9IDAsIGMgPSBlLmxlbmd0aDsgcCA8IGM7IHArKykge1xuICAgICAgICBmb3IgKHZhciBoID0gZVtwXSwgZiA9IDAsIHkgPSBoLmxlbmd0aDsgZiA8IHkgLSAxOyBmKyspIHtcbiAgICAgICAgICBpZiAoKGEgPSAociA9IHQpWzBdIC0gKG4gPSBoW2ZdKVswXSkgKiAodSA9IHJbMV0gLSAoaSA9IGhbZiArIDFdKVsxXSkgLSAocyA9IHJbMF0gLSBpWzBdKSAqIChvID0gclsxXSAtIG5bMV0pID09IDAgJiYgYSAqIHMgPD0gMCAmJiBvICogdSA8PSAwKSByZXR1cm4gITE7XG4gICAgICAgICAgU2UodCwgaFtmXSwgaFtmICsgMV0pICYmIChsID0gIWwpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIEllKHQsIGUpIHtcbiAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgZS5sZW5ndGg7IHIrKykge1xuICAgICAgICBpZiAoa2UodCwgZVtyXSkpIHJldHVybiAhMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICExO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHplKHQsIGUsIHIsIG4pIHtcbiAgICAgIHZhciBpID0gblswXSAtIHJbMF0sXG4gICAgICAgICAgYSA9IG5bMV0gLSByWzFdLFxuICAgICAgICAgIG8gPSAodFswXSAtIHJbMF0pICogYSAtIGkgKiAodFsxXSAtIHJbMV0pLFxuICAgICAgICAgIHMgPSAoZVswXSAtIHJbMF0pICogYSAtIGkgKiAoZVsxXSAtIHJbMV0pO1xuICAgICAgcmV0dXJuIG8gPiAwICYmIHMgPCAwIHx8IG8gPCAwICYmIHMgPiAwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIENlKHQsIGUsIHIpIHtcbiAgICAgIGZvciAodmFyIG4gPSAwLCBpID0gcjsgbiA8IGkubGVuZ3RoOyBuICs9IDEpIHtcbiAgICAgICAgZm9yICh2YXIgYSA9IGlbbl0sIG8gPSAwOyBvIDwgYS5sZW5ndGggLSAxOyArK28pIHtcbiAgICAgICAgICBpZiAoMCAhPSAoYyA9IFsocCA9IGFbbyArIDFdKVswXSAtIChsID0gYVtvXSlbMF0sIHBbMV0gLSBsWzFdXSlbMF0gKiAoaCA9IFsodSA9IGUpWzBdIC0gKHMgPSB0KVswXSwgdVsxXSAtIHNbMV1dKVsxXSAtIGNbMV0gKiBoWzBdICYmIHplKHMsIHUsIGwsIHApICYmIHplKGwsIHAsIHMsIHUpKSByZXR1cm4gITA7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHMsIHUsIGwsIHAsIGMsIGg7XG4gICAgICByZXR1cm4gITE7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gRWUodCwgZSkge1xuICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCB0Lmxlbmd0aDsgKytyKSB7XG4gICAgICAgIGlmICgha2UodFtyXSwgZSkpIHJldHVybiAhMTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgbiA9IDA7IG4gPCB0Lmxlbmd0aCAtIDE7ICsrbikge1xuICAgICAgICBpZiAoQ2UodFtuXSwgdFtuICsgMV0sIGUpKSByZXR1cm4gITE7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAhMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBQZSh0LCBlKSB7XG4gICAgICBmb3IgKHZhciByID0gMDsgciA8IGUubGVuZ3RoOyByKyspIHtcbiAgICAgICAgaWYgKEVlKHQsIGVbcl0pKSByZXR1cm4gITA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAhMTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBNZSh0LCBlLCByKSB7XG4gICAgICBmb3IgKHZhciBuID0gW10sIGkgPSAwOyBpIDwgdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBmb3IgKHZhciBhID0gW10sIG8gPSAwOyBvIDwgdFtpXS5sZW5ndGg7IG8rKykge1xuICAgICAgICAgIHZhciBzID0gQWUodFtpXVtvXSwgcik7XG4gICAgICAgICAgd2UoZSwgcyksIGEucHVzaChzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG4ucHVzaChhKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gQmUodCwgZSwgcikge1xuICAgICAgZm9yICh2YXIgbiA9IFtdLCBpID0gMDsgaSA8IHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGEgPSBNZSh0W2ldLCBlLCByKTtcbiAgICAgICAgbi5wdXNoKGEpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBUZSh0LCBlLCByLCBuKSB7XG4gICAgICBpZiAodFswXSA8IHJbMF0gfHwgdFswXSA+IHJbMl0pIHtcbiAgICAgICAgdmFyIGkgPSAuNSAqIG4sXG4gICAgICAgICAgICBhID0gdFswXSAtIHJbMF0gPiBpID8gLW4gOiByWzBdIC0gdFswXSA+IGkgPyBuIDogMDtcbiAgICAgICAgMCA9PT0gYSAmJiAoYSA9IHRbMF0gLSByWzJdID4gaSA/IC1uIDogclsyXSAtIHRbMF0gPiBpID8gbiA6IDApLCB0WzBdICs9IGE7XG4gICAgICB9XG5cbiAgICAgIHdlKGUsIHQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFZlKHQsIGUsIHIsIG4pIHtcbiAgICAgIGZvciAodmFyIGkgPSA4MTkyICogTWF0aC5wb3coMiwgbi56KSwgYSA9IFs4MTkyICogbi54LCA4MTkyICogbi55XSwgbyA9IFtdLCBzID0gMCwgdSA9IHQ7IHMgPCB1Lmxlbmd0aDsgcyArPSAxKSB7XG4gICAgICAgIGZvciAodmFyIGwgPSAwLCBwID0gdVtzXTsgbCA8IHAubGVuZ3RoOyBsICs9IDEpIHtcbiAgICAgICAgICB2YXIgYyA9IHBbbF0sXG4gICAgICAgICAgICAgIGggPSBbYy54ICsgYVswXSwgYy55ICsgYVsxXV07XG4gICAgICAgICAgVGUoaCwgZSwgciwgaSksIG8ucHVzaChoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBGZSh0LCBlLCByLCBuKSB7XG4gICAgICBmb3IgKHZhciBpLCBhID0gODE5MiAqIE1hdGgucG93KDIsIG4ueiksIG8gPSBbODE5MiAqIG4ueCwgODE5MiAqIG4ueV0sIHMgPSBbXSwgdSA9IDAsIGwgPSB0OyB1IDwgbC5sZW5ndGg7IHUgKz0gMSkge1xuICAgICAgICBmb3IgKHZhciBwID0gW10sIGMgPSAwLCBoID0gbFt1XTsgYyA8IGgubGVuZ3RoOyBjICs9IDEpIHtcbiAgICAgICAgICB2YXIgZiA9IGhbY10sXG4gICAgICAgICAgICAgIHkgPSBbZi54ICsgb1swXSwgZi55ICsgb1sxXV07XG4gICAgICAgICAgd2UoZSwgeSksIHAucHVzaCh5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHMucHVzaChwKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVbMl0gLSBlWzBdIDw9IGEgLyAyKSB7XG4gICAgICAgIChpID0gZSlbMF0gPSBpWzFdID0gMSAvIDAsIGlbMl0gPSBpWzNdID0gLTEgLyAwO1xuXG4gICAgICAgIGZvciAodmFyIGQgPSAwLCBtID0gczsgZCA8IG0ubGVuZ3RoOyBkICs9IDEpIHtcbiAgICAgICAgICBmb3IgKHZhciB2ID0gMCwgZyA9IG1bZF07IHYgPCBnLmxlbmd0aDsgdiArPSAxKSB7XG4gICAgICAgICAgICBUZShnW3ZdLCBlLCByLCBhKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHM7XG4gICAgfVxuXG4gICAgYmUucGFyc2UgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgaWYgKDIgIT09IHQubGVuZ3RoKSByZXR1cm4gZS5lcnJvcihcIkV4cGVjdGVkIG9uZSBhcmd1bWVudC5cIik7XG4gICAgICB2YXIgciA9IHRbMV07XG4gICAgICBpZiAoXCJvYmplY3RcIiAhPSB0eXBlb2YgciB8fCBBcnJheS5pc0FycmF5KHIpKSByZXR1cm4gZS5lcnJvcihcIkNvbGxhdG9yIG9wdGlvbnMgYXJndW1lbnQgbXVzdCBiZSBhbiBvYmplY3QuXCIpO1xuICAgICAgdmFyIG4gPSBlLnBhcnNlKHZvaWQgMCAhPT0gcltcImNhc2Utc2Vuc2l0aXZlXCJdICYmIHJbXCJjYXNlLXNlbnNpdGl2ZVwiXSwgMSwgVXQpO1xuICAgICAgaWYgKCFuKSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciBpID0gZS5wYXJzZSh2b2lkIDAgIT09IHJbXCJkaWFjcml0aWMtc2Vuc2l0aXZlXCJdICYmIHJbXCJkaWFjcml0aWMtc2Vuc2l0aXZlXCJdLCAxLCBVdCk7XG4gICAgICBpZiAoIWkpIHJldHVybiBudWxsO1xuICAgICAgdmFyIGEgPSBudWxsO1xuICAgICAgcmV0dXJuIHIubG9jYWxlICYmICEoYSA9IGUucGFyc2Uoci5sb2NhbGUsIDEsIFJ0KSkgPyBudWxsIDogbmV3IGJlKG4sIGksIGEpO1xuICAgIH0sIGJlLnByb3RvdHlwZS5ldmFsdWF0ZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gbmV3IGVlKHRoaXMuY2FzZVNlbnNpdGl2ZS5ldmFsdWF0ZSh0KSwgdGhpcy5kaWFjcml0aWNTZW5zaXRpdmUuZXZhbHVhdGUodCksIHRoaXMubG9jYWxlID8gdGhpcy5sb2NhbGUuZXZhbHVhdGUodCkgOiBudWxsKTtcbiAgICB9LCBiZS5wcm90b3R5cGUuZWFjaENoaWxkID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHQodGhpcy5jYXNlU2Vuc2l0aXZlKSwgdCh0aGlzLmRpYWNyaXRpY1NlbnNpdGl2ZSksIHRoaXMubG9jYWxlICYmIHQodGhpcy5sb2NhbGUpO1xuICAgIH0sIGJlLnByb3RvdHlwZS5vdXRwdXREZWZpbmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICExO1xuICAgIH0sIGJlLnByb3RvdHlwZS5zZXJpYWxpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdCA9IHt9O1xuICAgICAgcmV0dXJuIHRbXCJjYXNlLXNlbnNpdGl2ZVwiXSA9IHRoaXMuY2FzZVNlbnNpdGl2ZS5zZXJpYWxpemUoKSwgdFtcImRpYWNyaXRpYy1zZW5zaXRpdmVcIl0gPSB0aGlzLmRpYWNyaXRpY1NlbnNpdGl2ZS5zZXJpYWxpemUoKSwgdGhpcy5sb2NhbGUgJiYgKHQubG9jYWxlID0gdGhpcy5sb2NhbGUuc2VyaWFsaXplKCkpLCBbXCJjb2xsYXRvclwiLCB0XTtcbiAgICB9O1xuXG4gICAgdmFyIERlID0gZnVuY3Rpb24gRGUodCwgZSkge1xuICAgICAgdGhpcy50eXBlID0gVXQsIHRoaXMuZ2VvanNvbiA9IHQsIHRoaXMuZ2VvbWV0cmllcyA9IGU7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIExlKHQpIHtcbiAgICAgIGlmICh0IGluc3RhbmNlb2YgeGUpIHtcbiAgICAgICAgaWYgKFwiZ2V0XCIgPT09IHQubmFtZSAmJiAxID09PSB0LmFyZ3MubGVuZ3RoKSByZXR1cm4gITE7XG4gICAgICAgIGlmIChcImZlYXR1cmUtc3RhdGVcIiA9PT0gdC5uYW1lKSByZXR1cm4gITE7XG4gICAgICAgIGlmIChcImhhc1wiID09PSB0Lm5hbWUgJiYgMSA9PT0gdC5hcmdzLmxlbmd0aCkgcmV0dXJuICExO1xuICAgICAgICBpZiAoXCJwcm9wZXJ0aWVzXCIgPT09IHQubmFtZSB8fCBcImdlb21ldHJ5LXR5cGVcIiA9PT0gdC5uYW1lIHx8IFwiaWRcIiA9PT0gdC5uYW1lKSByZXR1cm4gITE7XG4gICAgICAgIGlmICgvXmZpbHRlci0vLnRlc3QodC5uYW1lKSkgcmV0dXJuICExO1xuICAgICAgfVxuXG4gICAgICBpZiAodCBpbnN0YW5jZW9mIERlKSByZXR1cm4gITE7XG4gICAgICB2YXIgZSA9ICEwO1xuICAgICAgcmV0dXJuIHQuZWFjaENoaWxkKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGUgJiYgIUxlKHQpICYmIChlID0gITEpO1xuICAgICAgfSksIGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gT2UodCkge1xuICAgICAgaWYgKHQgaW5zdGFuY2VvZiB4ZSAmJiBcImZlYXR1cmUtc3RhdGVcIiA9PT0gdC5uYW1lKSByZXR1cm4gITE7XG4gICAgICB2YXIgZSA9ICEwO1xuICAgICAgcmV0dXJuIHQuZWFjaENoaWxkKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGUgJiYgIU9lKHQpICYmIChlID0gITEpO1xuICAgICAgfSksIGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gUmUodCwgZSkge1xuICAgICAgaWYgKHQgaW5zdGFuY2VvZiB4ZSAmJiBlLmluZGV4T2YodC5uYW1lKSA+PSAwKSByZXR1cm4gITE7XG4gICAgICB2YXIgciA9ICEwO1xuICAgICAgcmV0dXJuIHQuZWFjaENoaWxkKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHIgJiYgIVJlKHQsIGUpICYmIChyID0gITEpO1xuICAgICAgfSksIHI7XG4gICAgfVxuXG4gICAgRGUucGFyc2UgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgaWYgKDIgIT09IHQubGVuZ3RoKSByZXR1cm4gZS5lcnJvcihcIid3aXRoaW4nIGV4cHJlc3Npb24gcmVxdWlyZXMgZXhhY3RseSBvbmUgYXJndW1lbnQsIGJ1dCBmb3VuZCBcIiArICh0Lmxlbmd0aCAtIDEpICsgXCIgaW5zdGVhZC5cIik7XG5cbiAgICAgIGlmIChvZSh0WzFdKSkge1xuICAgICAgICB2YXIgciA9IHRbMV07XG4gICAgICAgIGlmIChcIkZlYXR1cmVDb2xsZWN0aW9uXCIgPT09IHIudHlwZSkgZm9yICh2YXIgbiA9IDA7IG4gPCByLmZlYXR1cmVzLmxlbmd0aDsgKytuKSB7XG4gICAgICAgICAgdmFyIGkgPSByLmZlYXR1cmVzW25dLmdlb21ldHJ5LnR5cGU7XG4gICAgICAgICAgaWYgKFwiUG9seWdvblwiID09PSBpIHx8IFwiTXVsdGlQb2x5Z29uXCIgPT09IGkpIHJldHVybiBuZXcgRGUociwgci5mZWF0dXJlc1tuXS5nZW9tZXRyeSk7XG4gICAgICAgIH0gZWxzZSBpZiAoXCJGZWF0dXJlXCIgPT09IHIudHlwZSkge1xuICAgICAgICAgIHZhciBhID0gci5nZW9tZXRyeS50eXBlO1xuICAgICAgICAgIGlmIChcIlBvbHlnb25cIiA9PT0gYSB8fCBcIk11bHRpUG9seWdvblwiID09PSBhKSByZXR1cm4gbmV3IERlKHIsIHIuZ2VvbWV0cnkpO1xuICAgICAgICB9IGVsc2UgaWYgKFwiUG9seWdvblwiID09PSByLnR5cGUgfHwgXCJNdWx0aVBvbHlnb25cIiA9PT0gci50eXBlKSByZXR1cm4gbmV3IERlKHIsIHIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZS5lcnJvcihcIid3aXRoaW4nIGV4cHJlc3Npb24gcmVxdWlyZXMgdmFsaWQgZ2VvanNvbiBvYmplY3QgdGhhdCBjb250YWlucyBwb2x5Z29uIGdlb21ldHJ5IHR5cGUuXCIpO1xuICAgIH0sIERlLnByb3RvdHlwZS5ldmFsdWF0ZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBpZiAobnVsbCAhPSB0Lmdlb21ldHJ5KCkgJiYgbnVsbCAhPSB0LmNhbm9uaWNhbElEKCkpIHtcbiAgICAgICAgaWYgKFwiUG9pbnRcIiA9PT0gdC5nZW9tZXRyeVR5cGUoKSkgcmV0dXJuIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgdmFyIHIgPSBbMSAvIDAsIDEgLyAwLCAtMSAvIDAsIC0xIC8gMF0sXG4gICAgICAgICAgICAgIG4gPSBbMSAvIDAsIDEgLyAwLCAtMSAvIDAsIC0xIC8gMF0sXG4gICAgICAgICAgICAgIGkgPSB0LmNhbm9uaWNhbElEKCk7XG5cbiAgICAgICAgICBpZiAoXCJQb2x5Z29uXCIgPT09IGUudHlwZSkge1xuICAgICAgICAgICAgdmFyIGEgPSBNZShlLmNvb3JkaW5hdGVzLCBuLCBpKSxcbiAgICAgICAgICAgICAgICBvID0gVmUodC5nZW9tZXRyeSgpLCByLCBuLCBpKTtcbiAgICAgICAgICAgIGlmICghX2UociwgbikpIHJldHVybiAhMTtcblxuICAgICAgICAgICAgZm9yICh2YXIgcyA9IDAsIHUgPSBvOyBzIDwgdS5sZW5ndGg7IHMgKz0gMSkge1xuICAgICAgICAgICAgICBpZiAoIWtlKHVbc10sIGEpKSByZXR1cm4gITE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKFwiTXVsdGlQb2x5Z29uXCIgPT09IGUudHlwZSkge1xuICAgICAgICAgICAgdmFyIGwgPSBCZShlLmNvb3JkaW5hdGVzLCBuLCBpKSxcbiAgICAgICAgICAgICAgICBwID0gVmUodC5nZW9tZXRyeSgpLCByLCBuLCBpKTtcbiAgICAgICAgICAgIGlmICghX2UociwgbikpIHJldHVybiAhMTtcblxuICAgICAgICAgICAgZm9yICh2YXIgYyA9IDAsIGggPSBwOyBjIDwgaC5sZW5ndGg7IGMgKz0gMSkge1xuICAgICAgICAgICAgICBpZiAoIUllKGhbY10sIGwpKSByZXR1cm4gITE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuICEwO1xuICAgICAgICB9KHQsIHRoaXMuZ2VvbWV0cmllcyk7XG4gICAgICAgIGlmIChcIkxpbmVTdHJpbmdcIiA9PT0gdC5nZW9tZXRyeVR5cGUoKSkgcmV0dXJuIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgdmFyIHIgPSBbMSAvIDAsIDEgLyAwLCAtMSAvIDAsIC0xIC8gMF0sXG4gICAgICAgICAgICAgIG4gPSBbMSAvIDAsIDEgLyAwLCAtMSAvIDAsIC0xIC8gMF0sXG4gICAgICAgICAgICAgIGkgPSB0LmNhbm9uaWNhbElEKCk7XG5cbiAgICAgICAgICBpZiAoXCJQb2x5Z29uXCIgPT09IGUudHlwZSkge1xuICAgICAgICAgICAgdmFyIGEgPSBNZShlLmNvb3JkaW5hdGVzLCBuLCBpKSxcbiAgICAgICAgICAgICAgICBvID0gRmUodC5nZW9tZXRyeSgpLCByLCBuLCBpKTtcbiAgICAgICAgICAgIGlmICghX2UociwgbikpIHJldHVybiAhMTtcblxuICAgICAgICAgICAgZm9yICh2YXIgcyA9IDAsIHUgPSBvOyBzIDwgdS5sZW5ndGg7IHMgKz0gMSkge1xuICAgICAgICAgICAgICBpZiAoIUVlKHVbc10sIGEpKSByZXR1cm4gITE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKFwiTXVsdGlQb2x5Z29uXCIgPT09IGUudHlwZSkge1xuICAgICAgICAgICAgdmFyIGwgPSBCZShlLmNvb3JkaW5hdGVzLCBuLCBpKSxcbiAgICAgICAgICAgICAgICBwID0gRmUodC5nZW9tZXRyeSgpLCByLCBuLCBpKTtcbiAgICAgICAgICAgIGlmICghX2UociwgbikpIHJldHVybiAhMTtcblxuICAgICAgICAgICAgZm9yICh2YXIgYyA9IDAsIGggPSBwOyBjIDwgaC5sZW5ndGg7IGMgKz0gMSkge1xuICAgICAgICAgICAgICBpZiAoIVBlKGhbY10sIGwpKSByZXR1cm4gITE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuICEwO1xuICAgICAgICB9KHQsIHRoaXMuZ2VvbWV0cmllcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAhMTtcbiAgICB9LCBEZS5wcm90b3R5cGUuZWFjaENoaWxkID0gZnVuY3Rpb24gKCkge30sIERlLnByb3RvdHlwZS5vdXRwdXREZWZpbmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICEwO1xuICAgIH0sIERlLnByb3RvdHlwZS5zZXJpYWxpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gW1wid2l0aGluXCIsIHRoaXMuZ2VvanNvbl07XG4gICAgfTtcblxuICAgIHZhciBVZSA9IGZ1bmN0aW9uIFVlKHQsIGUpIHtcbiAgICAgIHRoaXMudHlwZSA9IGUudHlwZSwgdGhpcy5uYW1lID0gdCwgdGhpcy5ib3VuZEV4cHJlc3Npb24gPSBlO1xuICAgIH07XG5cbiAgICBVZS5wYXJzZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICBpZiAoMiAhPT0gdC5sZW5ndGggfHwgXCJzdHJpbmdcIiAhPSB0eXBlb2YgdFsxXSkgcmV0dXJuIGUuZXJyb3IoXCIndmFyJyBleHByZXNzaW9uIHJlcXVpcmVzIGV4YWN0bHkgb25lIHN0cmluZyBsaXRlcmFsIGFyZ3VtZW50LlwiKTtcbiAgICAgIHZhciByID0gdFsxXTtcbiAgICAgIHJldHVybiBlLnNjb3BlLmhhcyhyKSA/IG5ldyBVZShyLCBlLnNjb3BlLmdldChyKSkgOiBlLmVycm9yKCdVbmtub3duIHZhcmlhYmxlIFwiJyArIHIgKyAnXCIuIE1ha2Ugc3VyZSBcIicgKyByICsgJ1wiIGhhcyBiZWVuIGJvdW5kIGluIGFuIGVuY2xvc2luZyBcImxldFwiIGV4cHJlc3Npb24gYmVmb3JlIHVzaW5nIGl0LicsIDEpO1xuICAgIH0sIFVlLnByb3RvdHlwZS5ldmFsdWF0ZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gdGhpcy5ib3VuZEV4cHJlc3Npb24uZXZhbHVhdGUodCk7XG4gICAgfSwgVWUucHJvdG90eXBlLmVhY2hDaGlsZCA9IGZ1bmN0aW9uICgpIHt9LCBVZS5wcm90b3R5cGUub3V0cHV0RGVmaW5lZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhMTtcbiAgICB9LCBVZS5wcm90b3R5cGUuc2VyaWFsaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIFtcInZhclwiLCB0aGlzLm5hbWVdO1xuICAgIH07XG5cbiAgICB2YXIgamUgPSBmdW5jdGlvbiBqZSh0LCBlLCByLCBuLCBpKSB7XG4gICAgICB2b2lkIDAgPT09IGUgJiYgKGUgPSBbXSksIHZvaWQgMCA9PT0gbiAmJiAobiA9IG5ldyBEdCgpKSwgdm9pZCAwID09PSBpICYmIChpID0gW10pLCB0aGlzLnJlZ2lzdHJ5ID0gdCwgdGhpcy5wYXRoID0gZSwgdGhpcy5rZXkgPSBlLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gXCJbXCIgKyB0ICsgXCJdXCI7XG4gICAgICB9KS5qb2luKFwiXCIpLCB0aGlzLnNjb3BlID0gbiwgdGhpcy5lcnJvcnMgPSBpLCB0aGlzLmV4cGVjdGVkVHlwZSA9IHI7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHFlKHQsIGUpIHtcbiAgICAgIGZvciAodmFyIHIsIG4gPSB0Lmxlbmd0aCAtIDEsIGkgPSAwLCBhID0gbiwgbyA9IDA7IGkgPD0gYTspIHtcbiAgICAgICAgaWYgKChyID0gdFtvID0gTWF0aC5mbG9vcigoaSArIGEpIC8gMildKSA8PSBlKSB7XG4gICAgICAgICAgaWYgKG8gPT09IG4gfHwgZSA8IHRbbyArIDFdKSByZXR1cm4gbztcbiAgICAgICAgICBpID0gbyArIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCEociA+IGUpKSB0aHJvdyBuZXcgcGUoXCJJbnB1dCBpcyBub3QgYSBudW1iZXIuXCIpO1xuICAgICAgICAgIGEgPSBvIC0gMTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBqZS5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSkge1xuICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gaSAmJiAoaSA9IHt9KSwgZSA/IHRoaXMuY29uY2F0KGUsIHIsIG4pLl9wYXJzZSh0LCBpKSA6IHRoaXMuX3BhcnNlKHQsIGkpO1xuICAgIH0sIGplLnByb3RvdHlwZS5fcGFyc2UgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgZnVuY3Rpb24gcih0LCBlLCByKSB7XG4gICAgICAgIHJldHVybiBcImFzc2VydFwiID09PSByID8gbmV3IGhlKGUsIFt0XSkgOiBcImNvZXJjZVwiID09PSByID8gbmV3IG1lKGUsIFt0XSkgOiB0O1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPT0gdCAmJiBcInN0cmluZ1wiICE9IHR5cGVvZiB0ICYmIFwiYm9vbGVhblwiICE9IHR5cGVvZiB0ICYmIFwibnVtYmVyXCIgIT0gdHlwZW9mIHQgfHwgKHQgPSBbXCJsaXRlcmFsXCIsIHRdKSwgQXJyYXkuaXNBcnJheSh0KSkge1xuICAgICAgICBpZiAoMCA9PT0gdC5sZW5ndGgpIHJldHVybiB0aGlzLmVycm9yKCdFeHBlY3RlZCBhbiBhcnJheSB3aXRoIGF0IGxlYXN0IG9uZSBlbGVtZW50LiBJZiB5b3Ugd2FudGVkIGEgbGl0ZXJhbCBhcnJheSwgdXNlIFtcImxpdGVyYWxcIiwgW11dLicpO1xuICAgICAgICB2YXIgbiA9IHRbMF07XG4gICAgICAgIGlmIChcInN0cmluZ1wiICE9IHR5cGVvZiBuKSByZXR1cm4gdGhpcy5lcnJvcihcIkV4cHJlc3Npb24gbmFtZSBtdXN0IGJlIGEgc3RyaW5nLCBidXQgZm91bmQgXCIgKyB0eXBlb2YgbiArICcgaW5zdGVhZC4gSWYgeW91IHdhbnRlZCBhIGxpdGVyYWwgYXJyYXksIHVzZSBbXCJsaXRlcmFsXCIsIFsuLi5dXS4nLCAwKSwgbnVsbDtcbiAgICAgICAgdmFyIGkgPSB0aGlzLnJlZ2lzdHJ5W25dO1xuXG4gICAgICAgIGlmIChpKSB7XG4gICAgICAgICAgdmFyIGEgPSBpLnBhcnNlKHQsIHRoaXMpO1xuICAgICAgICAgIGlmICghYSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICBpZiAodGhpcy5leHBlY3RlZFR5cGUpIHtcbiAgICAgICAgICAgIHZhciBvID0gdGhpcy5leHBlY3RlZFR5cGUsXG4gICAgICAgICAgICAgICAgcyA9IGEudHlwZTtcbiAgICAgICAgICAgIGlmIChcInN0cmluZ1wiICE9PSBvLmtpbmQgJiYgXCJudW1iZXJcIiAhPT0gby5raW5kICYmIFwiYm9vbGVhblwiICE9PSBvLmtpbmQgJiYgXCJvYmplY3RcIiAhPT0gby5raW5kICYmIFwiYXJyYXlcIiAhPT0gby5raW5kIHx8IFwidmFsdWVcIiAhPT0gcy5raW5kKSB7XG4gICAgICAgICAgICAgIGlmIChcImNvbG9yXCIgIT09IG8ua2luZCAmJiBcImZvcm1hdHRlZFwiICE9PSBvLmtpbmQgJiYgXCJyZXNvbHZlZEltYWdlXCIgIT09IG8ua2luZCB8fCBcInZhbHVlXCIgIT09IHMua2luZCAmJiBcInN0cmluZ1wiICE9PSBzLmtpbmQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jaGVja1N1YnR5cGUobywgcykpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICB9IGVsc2UgYSA9IHIoYSwgbywgZS50eXBlQW5ub3RhdGlvbiB8fCBcImNvZXJjZVwiKTtcbiAgICAgICAgICAgIH0gZWxzZSBhID0gcihhLCBvLCBlLnR5cGVBbm5vdGF0aW9uIHx8IFwiYXNzZXJ0XCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghKGEgaW5zdGFuY2VvZiBsZSkgJiYgXCJyZXNvbHZlZEltYWdlXCIgIT09IGEudHlwZS5raW5kICYmIGZ1bmN0aW9uIHQoZSkge1xuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBVZSkgcmV0dXJuIHQoZS5ib3VuZEV4cHJlc3Npb24pO1xuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiB4ZSAmJiBcImVycm9yXCIgPT09IGUubmFtZSkgcmV0dXJuICExO1xuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBiZSkgcmV0dXJuICExO1xuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBEZSkgcmV0dXJuICExO1xuICAgICAgICAgICAgdmFyIHIgPSBlIGluc3RhbmNlb2YgbWUgfHwgZSBpbnN0YW5jZW9mIGhlLFxuICAgICAgICAgICAgICAgIG4gPSAhMDtcbiAgICAgICAgICAgIHJldHVybiBlLmVhY2hDaGlsZChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICBuID0gciA/IG4gJiYgdChlKSA6IG4gJiYgZSBpbnN0YW5jZW9mIGxlO1xuICAgICAgICAgICAgfSksICEhbiAmJiBMZShlKSAmJiBSZShlLCBbXCJ6b29tXCIsIFwiaGVhdG1hcC1kZW5zaXR5XCIsIFwibGluZS1wcm9ncmVzc1wiLCBcImFjY3VtdWxhdGVkXCIsIFwiaXMtc3VwcG9ydGVkLXNjcmlwdFwiXSk7XG4gICAgICAgICAgfShhKSkge1xuICAgICAgICAgICAgdmFyIHUgPSBuZXcgZ2UoKTtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgYSA9IG5ldyBsZShhLnR5cGUsIGEuZXZhbHVhdGUodSkpO1xuICAgICAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lcnJvcih0Lm1lc3NhZ2UpLCBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBhO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3IoJ1Vua25vd24gZXhwcmVzc2lvbiBcIicgKyBuICsgJ1wiLiBJZiB5b3Ugd2FudGVkIGEgbGl0ZXJhbCBhcnJheSwgdXNlIFtcImxpdGVyYWxcIiwgWy4uLl1dLicsIDApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5lcnJvcih2b2lkIDAgPT09IHQgPyBcIid1bmRlZmluZWQnIHZhbHVlIGludmFsaWQuIFVzZSBudWxsIGluc3RlYWQuXCIgOiBcIm9iamVjdFwiID09IHR5cGVvZiB0ID8gJ0JhcmUgb2JqZWN0cyBpbnZhbGlkLiBVc2UgW1wibGl0ZXJhbFwiLCB7Li4ufV0gaW5zdGVhZC4nIDogXCJFeHBlY3RlZCBhbiBhcnJheSwgYnV0IGZvdW5kIFwiICsgdHlwZW9mIHQgKyBcIiBpbnN0ZWFkLlwiKTtcbiAgICB9LCBqZS5wcm90b3R5cGUuY29uY2F0ID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgIHZhciBuID0gXCJudW1iZXJcIiA9PSB0eXBlb2YgdCA/IHRoaXMucGF0aC5jb25jYXQodCkgOiB0aGlzLnBhdGgsXG4gICAgICAgICAgaSA9IHIgPyB0aGlzLnNjb3BlLmNvbmNhdChyKSA6IHRoaXMuc2NvcGU7XG4gICAgICByZXR1cm4gbmV3IGplKHRoaXMucmVnaXN0cnksIG4sIGUgfHwgbnVsbCwgaSwgdGhpcy5lcnJvcnMpO1xuICAgIH0sIGplLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmb3IgKHZhciBlID0gW10sIHIgPSBhcmd1bWVudHMubGVuZ3RoIC0gMTsgci0tID4gMDspIHtcbiAgICAgICAgZVtyXSA9IGFyZ3VtZW50c1tyICsgMV07XG4gICAgICB9XG5cbiAgICAgIHZhciBuID0gXCJcIiArIHRoaXMua2V5ICsgZS5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIFwiW1wiICsgdCArIFwiXVwiO1xuICAgICAgfSkuam9pbihcIlwiKTtcbiAgICAgIHRoaXMuZXJyb3JzLnB1c2gobmV3IEZ0KG4sIHQpKTtcbiAgICB9LCBqZS5wcm90b3R5cGUuY2hlY2tTdWJ0eXBlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHZhciByID0gWXQodCwgZSk7XG4gICAgICByZXR1cm4gciAmJiB0aGlzLmVycm9yKHIpLCByO1xuICAgIH07XG5cbiAgICB2YXIgTmUgPSBmdW5jdGlvbiBOZSh0LCBlLCByKSB7XG4gICAgICB0aGlzLnR5cGUgPSB0LCB0aGlzLmlucHV0ID0gZSwgdGhpcy5sYWJlbHMgPSBbXSwgdGhpcy5vdXRwdXRzID0gW107XG5cbiAgICAgIGZvciAodmFyIG4gPSAwLCBpID0gcjsgbiA8IGkubGVuZ3RoOyBuICs9IDEpIHtcbiAgICAgICAgdmFyIGEgPSBpW25dLFxuICAgICAgICAgICAgbyA9IGFbMV07XG4gICAgICAgIHRoaXMubGFiZWxzLnB1c2goYVswXSksIHRoaXMub3V0cHV0cy5wdXNoKG8pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBLZSh0LCBlLCByKSB7XG4gICAgICByZXR1cm4gdCAqICgxIC0gcikgKyBlICogcjtcbiAgICB9XG5cbiAgICBOZS5wYXJzZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICBpZiAodC5sZW5ndGggLSAxIDwgNCkgcmV0dXJuIGUuZXJyb3IoXCJFeHBlY3RlZCBhdCBsZWFzdCA0IGFyZ3VtZW50cywgYnV0IGZvdW5kIG9ubHkgXCIgKyAodC5sZW5ndGggLSAxKSArIFwiLlwiKTtcbiAgICAgIGlmICgodC5sZW5ndGggLSAxKSAlIDIgIT0gMCkgcmV0dXJuIGUuZXJyb3IoXCJFeHBlY3RlZCBhbiBldmVuIG51bWJlciBvZiBhcmd1bWVudHMuXCIpO1xuICAgICAgdmFyIHIgPSBlLnBhcnNlKHRbMV0sIDEsIE90KTtcbiAgICAgIGlmICghcikgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgbiA9IFtdLFxuICAgICAgICAgIGkgPSBudWxsO1xuICAgICAgZS5leHBlY3RlZFR5cGUgJiYgXCJ2YWx1ZVwiICE9PSBlLmV4cGVjdGVkVHlwZS5raW5kICYmIChpID0gZS5leHBlY3RlZFR5cGUpO1xuXG4gICAgICBmb3IgKHZhciBhID0gMTsgYSA8IHQubGVuZ3RoOyBhICs9IDIpIHtcbiAgICAgICAgdmFyIG8gPSAxID09PSBhID8gLTEgLyAwIDogdFthXSxcbiAgICAgICAgICAgIHMgPSB0W2EgKyAxXSxcbiAgICAgICAgICAgIHUgPSBhLFxuICAgICAgICAgICAgbCA9IGEgKyAxO1xuICAgICAgICBpZiAoXCJudW1iZXJcIiAhPSB0eXBlb2YgbykgcmV0dXJuIGUuZXJyb3IoJ0lucHV0L291dHB1dCBwYWlycyBmb3IgXCJzdGVwXCIgZXhwcmVzc2lvbnMgbXVzdCBiZSBkZWZpbmVkIHVzaW5nIGxpdGVyYWwgbnVtZXJpYyB2YWx1ZXMgKG5vdCBjb21wdXRlZCBleHByZXNzaW9ucykgZm9yIHRoZSBpbnB1dCB2YWx1ZXMuJywgdSk7XG4gICAgICAgIGlmIChuLmxlbmd0aCAmJiBuW24ubGVuZ3RoIC0gMV1bMF0gPj0gbykgcmV0dXJuIGUuZXJyb3IoJ0lucHV0L291dHB1dCBwYWlycyBmb3IgXCJzdGVwXCIgZXhwcmVzc2lvbnMgbXVzdCBiZSBhcnJhbmdlZCB3aXRoIGlucHV0IHZhbHVlcyBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIuJywgdSk7XG4gICAgICAgIHZhciBwID0gZS5wYXJzZShzLCBsLCBpKTtcbiAgICAgICAgaWYgKCFwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaSA9IGkgfHwgcC50eXBlLCBuLnB1c2goW28sIHBdKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBOZShpLCByLCBuKTtcbiAgICB9LCBOZS5wcm90b3R5cGUuZXZhbHVhdGUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGUgPSB0aGlzLmxhYmVscyxcbiAgICAgICAgICByID0gdGhpcy5vdXRwdXRzO1xuICAgICAgaWYgKDEgPT09IGUubGVuZ3RoKSByZXR1cm4gclswXS5ldmFsdWF0ZSh0KTtcbiAgICAgIHZhciBuID0gdGhpcy5pbnB1dC5ldmFsdWF0ZSh0KTtcbiAgICAgIGlmIChuIDw9IGVbMF0pIHJldHVybiByWzBdLmV2YWx1YXRlKHQpO1xuICAgICAgdmFyIGkgPSBlLmxlbmd0aDtcbiAgICAgIHJldHVybiBuID49IGVbaSAtIDFdID8gcltpIC0gMV0uZXZhbHVhdGUodCkgOiByW3FlKGUsIG4pXS5ldmFsdWF0ZSh0KTtcbiAgICB9LCBOZS5wcm90b3R5cGUuZWFjaENoaWxkID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHQodGhpcy5pbnB1dCk7XG5cbiAgICAgIGZvciAodmFyIGUgPSAwLCByID0gdGhpcy5vdXRwdXRzOyBlIDwgci5sZW5ndGg7IGUgKz0gMSkge1xuICAgICAgICB0KHJbZV0pO1xuICAgICAgfVxuICAgIH0sIE5lLnByb3RvdHlwZS5vdXRwdXREZWZpbmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMub3V0cHV0cy5ldmVyeShmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdC5vdXRwdXREZWZpbmVkKCk7XG4gICAgICB9KTtcbiAgICB9LCBOZS5wcm90b3R5cGUuc2VyaWFsaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgZm9yICh2YXIgdCA9IFtcInN0ZXBcIiwgdGhpcy5pbnB1dC5zZXJpYWxpemUoKV0sIGUgPSAwOyBlIDwgdGhpcy5sYWJlbHMubGVuZ3RoOyBlKyspIHtcbiAgICAgICAgZSA+IDAgJiYgdC5wdXNoKHRoaXMubGFiZWxzW2VdKSwgdC5wdXNoKHRoaXMub3V0cHV0c1tlXS5zZXJpYWxpemUoKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0O1xuICAgIH07XG4gICAgdmFyIEdlID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICBudW1iZXI6IEtlLFxuICAgICAgY29sb3I6IGZ1bmN0aW9uIGNvbG9yKHQsIGUsIHIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyB0ZShLZSh0LnIsIGUuciwgciksIEtlKHQuZywgZS5nLCByKSwgS2UodC5iLCBlLmIsIHIpLCBLZSh0LmEsIGUuYSwgcikpO1xuICAgICAgfSxcbiAgICAgIGFycmF5OiBmdW5jdGlvbiBhcnJheSh0LCBlLCByKSB7XG4gICAgICAgIHJldHVybiB0Lm1hcChmdW5jdGlvbiAodCwgbikge1xuICAgICAgICAgIHJldHVybiBLZSh0LCBlW25dLCByKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSksXG4gICAgICAgIFplID0gNiAvIDI5ICogMyAqICg2IC8gMjkpLFxuICAgICAgICBYZSA9IE1hdGguUEkgLyAxODAsXG4gICAgICAgIEplID0gMTgwIC8gTWF0aC5QSTtcblxuICAgIGZ1bmN0aW9uIEhlKHQpIHtcbiAgICAgIHJldHVybiB0ID4gLjAwODg1NjQ1MTY3OTAzNTYzMSA/IE1hdGgucG93KHQsIDEgLyAzKSA6IHQgLyBaZSArIDQgLyAyOTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBZZSh0KSB7XG4gICAgICByZXR1cm4gdCA+IDYgLyAyOSA/IHQgKiB0ICogdCA6IFplICogKHQgLSA0IC8gMjkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uICRlKHQpIHtcbiAgICAgIHJldHVybiAyNTUgKiAodCA8PSAuMDAzMTMwOCA/IDEyLjkyICogdCA6IDEuMDU1ICogTWF0aC5wb3codCwgMSAvIDIuNCkgLSAuMDU1KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBXZSh0KSB7XG4gICAgICByZXR1cm4gKHQgLz0gMjU1KSA8PSAuMDQwNDUgPyB0IC8gMTIuOTIgOiBNYXRoLnBvdygodCArIC4wNTUpIC8gMS4wNTUsIDIuNCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gUWUodCkge1xuICAgICAgdmFyIGUgPSBXZSh0LnIpLFxuICAgICAgICAgIHIgPSBXZSh0LmcpLFxuICAgICAgICAgIG4gPSBXZSh0LmIpLFxuICAgICAgICAgIGkgPSBIZSgoLjQxMjQ1NjQgKiBlICsgLjM1NzU3NjEgKiByICsgLjE4MDQzNzUgKiBuKSAvIC45NTA0NyksXG4gICAgICAgICAgYSA9IEhlKCguMjEyNjcyOSAqIGUgKyAuNzE1MTUyMiAqIHIgKyAuMDcyMTc1ICogbikgLyAxKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGw6IDExNiAqIGEgLSAxNixcbiAgICAgICAgYTogNTAwICogKGkgLSBhKSxcbiAgICAgICAgYjogMjAwICogKGEgLSBIZSgoLjAxOTMzMzkgKiBlICsgLjExOTE5MiAqIHIgKyAuOTUwMzA0MSAqIG4pIC8gMS4wODg4MykpLFxuICAgICAgICBhbHBoYTogdC5hXG4gICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRyKHQpIHtcbiAgICAgIHZhciBlID0gKHQubCArIDE2KSAvIDExNixcbiAgICAgICAgICByID0gaXNOYU4odC5hKSA/IGUgOiBlICsgdC5hIC8gNTAwLFxuICAgICAgICAgIG4gPSBpc05hTih0LmIpID8gZSA6IGUgLSB0LmIgLyAyMDA7XG4gICAgICByZXR1cm4gZSA9IDEgKiBZZShlKSwgciA9IC45NTA0NyAqIFllKHIpLCBuID0gMS4wODg4MyAqIFllKG4pLCBuZXcgdGUoJGUoMy4yNDA0NTQyICogciAtIDEuNTM3MTM4NSAqIGUgLSAuNDk4NTMxNCAqIG4pLCAkZSgtLjk2OTI2NiAqIHIgKyAxLjg3NjAxMDggKiBlICsgLjA0MTU1NiAqIG4pLCAkZSguMDU1NjQzNCAqIHIgLSAuMjA0MDI1OSAqIGUgKyAxLjA1NzIyNTIgKiBuKSwgdC5hbHBoYSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXIodCwgZSwgcikge1xuICAgICAgdmFyIG4gPSBlIC0gdDtcbiAgICAgIHJldHVybiB0ICsgciAqIChuID4gMTgwIHx8IG4gPCAtMTgwID8gbiAtIDM2MCAqIE1hdGgucm91bmQobiAvIDM2MCkgOiBuKTtcbiAgICB9XG5cbiAgICB2YXIgcnIgPSB7XG4gICAgICBmb3J3YXJkOiBRZSxcbiAgICAgIHJldmVyc2U6IHRyLFxuICAgICAgaW50ZXJwb2xhdGU6IGZ1bmN0aW9uIGludGVycG9sYXRlKHQsIGUsIHIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsOiBLZSh0LmwsIGUubCwgciksXG4gICAgICAgICAgYTogS2UodC5hLCBlLmEsIHIpLFxuICAgICAgICAgIGI6IEtlKHQuYiwgZS5iLCByKSxcbiAgICAgICAgICBhbHBoYTogS2UodC5hbHBoYSwgZS5hbHBoYSwgcilcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9LFxuICAgICAgICBuciA9IHtcbiAgICAgIGZvcndhcmQ6IGZ1bmN0aW9uIGZvcndhcmQodCkge1xuICAgICAgICB2YXIgZSA9IFFlKHQpLFxuICAgICAgICAgICAgciA9IGUubCxcbiAgICAgICAgICAgIG4gPSBlLmEsXG4gICAgICAgICAgICBpID0gZS5iLFxuICAgICAgICAgICAgYSA9IE1hdGguYXRhbjIoaSwgbikgKiBKZTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBoOiBhIDwgMCA/IGEgKyAzNjAgOiBhLFxuICAgICAgICAgIGM6IE1hdGguc3FydChuICogbiArIGkgKiBpKSxcbiAgICAgICAgICBsOiByLFxuICAgICAgICAgIGFscGhhOiB0LmFcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICByZXZlcnNlOiBmdW5jdGlvbiByZXZlcnNlKHQpIHtcbiAgICAgICAgdmFyIGUgPSB0LmggKiBYZSxcbiAgICAgICAgICAgIHIgPSB0LmM7XG4gICAgICAgIHJldHVybiB0cih7XG4gICAgICAgICAgbDogdC5sLFxuICAgICAgICAgIGE6IE1hdGguY29zKGUpICogcixcbiAgICAgICAgICBiOiBNYXRoLnNpbihlKSAqIHIsXG4gICAgICAgICAgYWxwaGE6IHQuYWxwaGFcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgaW50ZXJwb2xhdGU6IGZ1bmN0aW9uIGludGVycG9sYXRlKHQsIGUsIHIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBoOiBlcih0LmgsIGUuaCwgciksXG4gICAgICAgICAgYzogS2UodC5jLCBlLmMsIHIpLFxuICAgICAgICAgIGw6IEtlKHQubCwgZS5sLCByKSxcbiAgICAgICAgICBhbHBoYTogS2UodC5hbHBoYSwgZS5hbHBoYSwgcilcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9LFxuICAgICAgICBpciA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgX19wcm90b19fOiBudWxsLFxuICAgICAgbGFiOiBycixcbiAgICAgIGhjbDogbnJcbiAgICB9KSxcbiAgICAgICAgYXIgPSBmdW5jdGlvbiBhcih0LCBlLCByLCBuLCBpKSB7XG4gICAgICB0aGlzLnR5cGUgPSB0LCB0aGlzLm9wZXJhdG9yID0gZSwgdGhpcy5pbnRlcnBvbGF0aW9uID0gciwgdGhpcy5pbnB1dCA9IG4sIHRoaXMubGFiZWxzID0gW10sIHRoaXMub3V0cHV0cyA9IFtdO1xuXG4gICAgICBmb3IgKHZhciBhID0gMCwgbyA9IGk7IGEgPCBvLmxlbmd0aDsgYSArPSAxKSB7XG4gICAgICAgIHZhciBzID0gb1thXSxcbiAgICAgICAgICAgIHUgPSBzWzFdO1xuICAgICAgICB0aGlzLmxhYmVscy5wdXNoKHNbMF0pLCB0aGlzLm91dHB1dHMucHVzaCh1KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gb3IodCwgZSwgciwgbikge1xuICAgICAgdmFyIGkgPSBuIC0gcixcbiAgICAgICAgICBhID0gdCAtIHI7XG4gICAgICByZXR1cm4gMCA9PT0gaSA/IDAgOiAxID09PSBlID8gYSAvIGkgOiAoTWF0aC5wb3coZSwgYSkgLSAxKSAvIChNYXRoLnBvdyhlLCBpKSAtIDEpO1xuICAgIH1cblxuICAgIGFyLmludGVycG9sYXRpb25GYWN0b3IgPSBmdW5jdGlvbiAodCwgZSwgbiwgaSkge1xuICAgICAgdmFyIGEgPSAwO1xuICAgICAgaWYgKFwiZXhwb25lbnRpYWxcIiA9PT0gdC5uYW1lKSBhID0gb3IoZSwgdC5iYXNlLCBuLCBpKTtlbHNlIGlmIChcImxpbmVhclwiID09PSB0Lm5hbWUpIGEgPSBvcihlLCAxLCBuLCBpKTtlbHNlIGlmIChcImN1YmljLWJlemllclwiID09PSB0Lm5hbWUpIHtcbiAgICAgICAgdmFyIG8gPSB0LmNvbnRyb2xQb2ludHM7XG4gICAgICAgIGEgPSBuZXcgcihvWzBdLCBvWzFdLCBvWzJdLCBvWzNdKS5zb2x2ZShvcihlLCAxLCBuLCBpKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYTtcbiAgICB9LCBhci5wYXJzZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB2YXIgciA9IHRbMF0sXG4gICAgICAgICAgbiA9IHRbMV0sXG4gICAgICAgICAgaSA9IHRbMl0sXG4gICAgICAgICAgYSA9IHQuc2xpY2UoMyk7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkobikgfHwgMCA9PT0gbi5sZW5ndGgpIHJldHVybiBlLmVycm9yKFwiRXhwZWN0ZWQgYW4gaW50ZXJwb2xhdGlvbiB0eXBlIGV4cHJlc3Npb24uXCIsIDEpO1xuICAgICAgaWYgKFwibGluZWFyXCIgPT09IG5bMF0pIG4gPSB7XG4gICAgICAgIG5hbWU6IFwibGluZWFyXCJcbiAgICAgIH07ZWxzZSBpZiAoXCJleHBvbmVudGlhbFwiID09PSBuWzBdKSB7XG4gICAgICAgIHZhciBvID0gblsxXTtcbiAgICAgICAgaWYgKFwibnVtYmVyXCIgIT0gdHlwZW9mIG8pIHJldHVybiBlLmVycm9yKFwiRXhwb25lbnRpYWwgaW50ZXJwb2xhdGlvbiByZXF1aXJlcyBhIG51bWVyaWMgYmFzZS5cIiwgMSwgMSk7XG4gICAgICAgIG4gPSB7XG4gICAgICAgICAgbmFtZTogXCJleHBvbmVudGlhbFwiLFxuICAgICAgICAgIGJhc2U6IG9cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChcImN1YmljLWJlemllclwiICE9PSBuWzBdKSByZXR1cm4gZS5lcnJvcihcIlVua25vd24gaW50ZXJwb2xhdGlvbiB0eXBlIFwiICsgU3RyaW5nKG5bMF0pLCAxLCAwKTtcbiAgICAgICAgdmFyIHMgPSBuLnNsaWNlKDEpO1xuICAgICAgICBpZiAoNCAhPT0gcy5sZW5ndGggfHwgcy5zb21lKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgcmV0dXJuIFwibnVtYmVyXCIgIT0gdHlwZW9mIHQgfHwgdCA8IDAgfHwgdCA+IDE7XG4gICAgICAgIH0pKSByZXR1cm4gZS5lcnJvcihcIkN1YmljIGJlemllciBpbnRlcnBvbGF0aW9uIHJlcXVpcmVzIGZvdXIgbnVtZXJpYyBhcmd1bWVudHMgd2l0aCB2YWx1ZXMgYmV0d2VlbiAwIGFuZCAxLlwiLCAxKTtcbiAgICAgICAgbiA9IHtcbiAgICAgICAgICBuYW1lOiBcImN1YmljLWJlemllclwiLFxuICAgICAgICAgIGNvbnRyb2xQb2ludHM6IHNcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmICh0Lmxlbmd0aCAtIDEgPCA0KSByZXR1cm4gZS5lcnJvcihcIkV4cGVjdGVkIGF0IGxlYXN0IDQgYXJndW1lbnRzLCBidXQgZm91bmQgb25seSBcIiArICh0Lmxlbmd0aCAtIDEpICsgXCIuXCIpO1xuICAgICAgaWYgKCh0Lmxlbmd0aCAtIDEpICUgMiAhPSAwKSByZXR1cm4gZS5lcnJvcihcIkV4cGVjdGVkIGFuIGV2ZW4gbnVtYmVyIG9mIGFyZ3VtZW50cy5cIik7XG4gICAgICBpZiAoIShpID0gZS5wYXJzZShpLCAyLCBPdCkpKSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciB1ID0gW10sXG4gICAgICAgICAgbCA9IG51bGw7XG4gICAgICBcImludGVycG9sYXRlLWhjbFwiID09PSByIHx8IFwiaW50ZXJwb2xhdGUtbGFiXCIgPT09IHIgPyBsID0ganQgOiBlLmV4cGVjdGVkVHlwZSAmJiBcInZhbHVlXCIgIT09IGUuZXhwZWN0ZWRUeXBlLmtpbmQgJiYgKGwgPSBlLmV4cGVjdGVkVHlwZSk7XG5cbiAgICAgIGZvciAodmFyIHAgPSAwOyBwIDwgYS5sZW5ndGg7IHAgKz0gMikge1xuICAgICAgICB2YXIgYyA9IGFbcF0sXG4gICAgICAgICAgICBoID0gYVtwICsgMV0sXG4gICAgICAgICAgICBmID0gcCArIDMsXG4gICAgICAgICAgICB5ID0gcCArIDQ7XG4gICAgICAgIGlmIChcIm51bWJlclwiICE9IHR5cGVvZiBjKSByZXR1cm4gZS5lcnJvcignSW5wdXQvb3V0cHV0IHBhaXJzIGZvciBcImludGVycG9sYXRlXCIgZXhwcmVzc2lvbnMgbXVzdCBiZSBkZWZpbmVkIHVzaW5nIGxpdGVyYWwgbnVtZXJpYyB2YWx1ZXMgKG5vdCBjb21wdXRlZCBleHByZXNzaW9ucykgZm9yIHRoZSBpbnB1dCB2YWx1ZXMuJywgZik7XG4gICAgICAgIGlmICh1Lmxlbmd0aCAmJiB1W3UubGVuZ3RoIC0gMV1bMF0gPj0gYykgcmV0dXJuIGUuZXJyb3IoJ0lucHV0L291dHB1dCBwYWlycyBmb3IgXCJpbnRlcnBvbGF0ZVwiIGV4cHJlc3Npb25zIG11c3QgYmUgYXJyYW5nZWQgd2l0aCBpbnB1dCB2YWx1ZXMgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyLicsIGYpO1xuICAgICAgICB2YXIgZCA9IGUucGFyc2UoaCwgeSwgbCk7XG4gICAgICAgIGlmICghZCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGwgPSBsIHx8IGQudHlwZSwgdS5wdXNoKFtjLCBkXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBcIm51bWJlclwiID09PSBsLmtpbmQgfHwgXCJjb2xvclwiID09PSBsLmtpbmQgfHwgXCJhcnJheVwiID09PSBsLmtpbmQgJiYgXCJudW1iZXJcIiA9PT0gbC5pdGVtVHlwZS5raW5kICYmIFwibnVtYmVyXCIgPT0gdHlwZW9mIGwuTiA/IG5ldyBhcihsLCByLCBuLCBpLCB1KSA6IGUuZXJyb3IoXCJUeXBlIFwiICsgSnQobCkgKyBcIiBpcyBub3QgaW50ZXJwb2xhdGFibGUuXCIpO1xuICAgIH0sIGFyLnByb3RvdHlwZS5ldmFsdWF0ZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2YXIgZSA9IHRoaXMubGFiZWxzLFxuICAgICAgICAgIHIgPSB0aGlzLm91dHB1dHM7XG4gICAgICBpZiAoMSA9PT0gZS5sZW5ndGgpIHJldHVybiByWzBdLmV2YWx1YXRlKHQpO1xuICAgICAgdmFyIG4gPSB0aGlzLmlucHV0LmV2YWx1YXRlKHQpO1xuICAgICAgaWYgKG4gPD0gZVswXSkgcmV0dXJuIHJbMF0uZXZhbHVhdGUodCk7XG4gICAgICB2YXIgaSA9IGUubGVuZ3RoO1xuICAgICAgaWYgKG4gPj0gZVtpIC0gMV0pIHJldHVybiByW2kgLSAxXS5ldmFsdWF0ZSh0KTtcbiAgICAgIHZhciBhID0gcWUoZSwgbiksXG4gICAgICAgICAgbyA9IGFyLmludGVycG9sYXRpb25GYWN0b3IodGhpcy5pbnRlcnBvbGF0aW9uLCBuLCBlW2FdLCBlW2EgKyAxXSksXG4gICAgICAgICAgcyA9IHJbYV0uZXZhbHVhdGUodCksXG4gICAgICAgICAgdSA9IHJbYSArIDFdLmV2YWx1YXRlKHQpO1xuICAgICAgcmV0dXJuIFwiaW50ZXJwb2xhdGVcIiA9PT0gdGhpcy5vcGVyYXRvciA/IEdlW3RoaXMudHlwZS5raW5kLnRvTG93ZXJDYXNlKCldKHMsIHUsIG8pIDogXCJpbnRlcnBvbGF0ZS1oY2xcIiA9PT0gdGhpcy5vcGVyYXRvciA/IG5yLnJldmVyc2UobnIuaW50ZXJwb2xhdGUobnIuZm9yd2FyZChzKSwgbnIuZm9yd2FyZCh1KSwgbykpIDogcnIucmV2ZXJzZShyci5pbnRlcnBvbGF0ZShyci5mb3J3YXJkKHMpLCByci5mb3J3YXJkKHUpLCBvKSk7XG4gICAgfSwgYXIucHJvdG90eXBlLmVhY2hDaGlsZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0KHRoaXMuaW5wdXQpO1xuXG4gICAgICBmb3IgKHZhciBlID0gMCwgciA9IHRoaXMub3V0cHV0czsgZSA8IHIubGVuZ3RoOyBlICs9IDEpIHtcbiAgICAgICAgdChyW2VdKTtcbiAgICAgIH1cbiAgICB9LCBhci5wcm90b3R5cGUub3V0cHV0RGVmaW5lZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLm91dHB1dHMuZXZlcnkoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQub3V0cHV0RGVmaW5lZCgpO1xuICAgICAgfSk7XG4gICAgfSwgYXIucHJvdG90eXBlLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0O1xuICAgICAgdCA9IFwibGluZWFyXCIgPT09IHRoaXMuaW50ZXJwb2xhdGlvbi5uYW1lID8gW1wibGluZWFyXCJdIDogXCJleHBvbmVudGlhbFwiID09PSB0aGlzLmludGVycG9sYXRpb24ubmFtZSA/IDEgPT09IHRoaXMuaW50ZXJwb2xhdGlvbi5iYXNlID8gW1wibGluZWFyXCJdIDogW1wiZXhwb25lbnRpYWxcIiwgdGhpcy5pbnRlcnBvbGF0aW9uLmJhc2VdIDogW1wiY3ViaWMtYmV6aWVyXCJdLmNvbmNhdCh0aGlzLmludGVycG9sYXRpb24uY29udHJvbFBvaW50cyk7XG5cbiAgICAgIGZvciAodmFyIGUgPSBbdGhpcy5vcGVyYXRvciwgdCwgdGhpcy5pbnB1dC5zZXJpYWxpemUoKV0sIHIgPSAwOyByIDwgdGhpcy5sYWJlbHMubGVuZ3RoOyByKyspIHtcbiAgICAgICAgZS5wdXNoKHRoaXMubGFiZWxzW3JdLCB0aGlzLm91dHB1dHNbcl0uc2VyaWFsaXplKCkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZTtcbiAgICB9O1xuXG4gICAgdmFyIHNyID0gZnVuY3Rpb24gc3IodCwgZSkge1xuICAgICAgdGhpcy50eXBlID0gdCwgdGhpcy5hcmdzID0gZTtcbiAgICB9O1xuXG4gICAgc3IucGFyc2UgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgaWYgKHQubGVuZ3RoIDwgMikgcmV0dXJuIGUuZXJyb3IoXCJFeHBlY3RlY3RlZCBhdCBsZWFzdCBvbmUgYXJndW1lbnQuXCIpO1xuICAgICAgdmFyIHIgPSBudWxsLFxuICAgICAgICAgIG4gPSBlLmV4cGVjdGVkVHlwZTtcbiAgICAgIG4gJiYgXCJ2YWx1ZVwiICE9PSBuLmtpbmQgJiYgKHIgPSBuKTtcblxuICAgICAgZm9yICh2YXIgaSA9IFtdLCBhID0gMCwgbyA9IHQuc2xpY2UoMSk7IGEgPCBvLmxlbmd0aDsgYSArPSAxKSB7XG4gICAgICAgIHZhciBzID0gZS5wYXJzZShvW2FdLCAxICsgaS5sZW5ndGgsIHIsIHZvaWQgMCwge1xuICAgICAgICAgIHR5cGVBbm5vdGF0aW9uOiBcIm9taXRcIlxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFzKSByZXR1cm4gbnVsbDtcbiAgICAgICAgciA9IHIgfHwgcy50eXBlLCBpLnB1c2gocyk7XG4gICAgICB9XG5cbiAgICAgIHZhciB1ID0gbiAmJiBpLnNvbWUoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIFl0KG4sIHQudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuZXcgc3IodSA/IE50IDogciwgaSk7XG4gICAgfSwgc3IucHJvdG90eXBlLmV2YWx1YXRlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZvciAodmFyIGUsIHIgPSBudWxsLCBuID0gMCwgaSA9IDAsIGEgPSB0aGlzLmFyZ3M7IGkgPCBhLmxlbmd0aCAmJiAobisrLCAociA9IGFbaV0uZXZhbHVhdGUodCkpICYmIHIgaW5zdGFuY2VvZiBpZSAmJiAhci5hdmFpbGFibGUgJiYgKGUgfHwgKGUgPSByLm5hbWUpLCByID0gbnVsbCwgbiA9PT0gdGhpcy5hcmdzLmxlbmd0aCAmJiAociA9IGUpKSwgbnVsbCA9PT0gcik7IGkgKz0gMSkge1xuICAgICAgICA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sIHNyLnByb3RvdHlwZS5lYWNoQ2hpbGQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdGhpcy5hcmdzLmZvckVhY2godCk7XG4gICAgfSwgc3IucHJvdG90eXBlLm91dHB1dERlZmluZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5hcmdzLmV2ZXJ5KGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0Lm91dHB1dERlZmluZWQoKTtcbiAgICAgIH0pO1xuICAgIH0sIHNyLnByb3RvdHlwZS5zZXJpYWxpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdCA9IFtcImNvYWxlc2NlXCJdO1xuICAgICAgcmV0dXJuIHRoaXMuZWFjaENoaWxkKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHQucHVzaChlLnNlcmlhbGl6ZSgpKTtcbiAgICAgIH0pLCB0O1xuICAgIH07XG5cbiAgICB2YXIgdXIgPSBmdW5jdGlvbiB1cih0LCBlKSB7XG4gICAgICB0aGlzLnR5cGUgPSBlLnR5cGUsIHRoaXMuYmluZGluZ3MgPSBbXS5jb25jYXQodCksIHRoaXMucmVzdWx0ID0gZTtcbiAgICB9O1xuXG4gICAgdXIucHJvdG90eXBlLmV2YWx1YXRlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc3VsdC5ldmFsdWF0ZSh0KTtcbiAgICB9LCB1ci5wcm90b3R5cGUuZWFjaENoaWxkID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZvciAodmFyIGUgPSAwLCByID0gdGhpcy5iaW5kaW5nczsgZSA8IHIubGVuZ3RoOyBlICs9IDEpIHtcbiAgICAgICAgdChyW2VdWzFdKTtcbiAgICAgIH1cblxuICAgICAgdCh0aGlzLnJlc3VsdCk7XG4gICAgfSwgdXIucGFyc2UgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgaWYgKHQubGVuZ3RoIDwgNCkgcmV0dXJuIGUuZXJyb3IoXCJFeHBlY3RlZCBhdCBsZWFzdCAzIGFyZ3VtZW50cywgYnV0IGZvdW5kIFwiICsgKHQubGVuZ3RoIC0gMSkgKyBcIiBpbnN0ZWFkLlwiKTtcblxuICAgICAgZm9yICh2YXIgciA9IFtdLCBuID0gMTsgbiA8IHQubGVuZ3RoIC0gMTsgbiArPSAyKSB7XG4gICAgICAgIHZhciBpID0gdFtuXTtcbiAgICAgICAgaWYgKFwic3RyaW5nXCIgIT0gdHlwZW9mIGkpIHJldHVybiBlLmVycm9yKFwiRXhwZWN0ZWQgc3RyaW5nLCBidXQgZm91bmQgXCIgKyB0eXBlb2YgaSArIFwiIGluc3RlYWQuXCIsIG4pO1xuICAgICAgICBpZiAoL1teYS16QS1aMC05X10vLnRlc3QoaSkpIHJldHVybiBlLmVycm9yKFwiVmFyaWFibGUgbmFtZXMgbXVzdCBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb3IgJ18nLlwiLCBuKTtcbiAgICAgICAgdmFyIGEgPSBlLnBhcnNlKHRbbiArIDFdLCBuICsgMSk7XG4gICAgICAgIGlmICghYSkgcmV0dXJuIG51bGw7XG4gICAgICAgIHIucHVzaChbaSwgYV0pO1xuICAgICAgfVxuXG4gICAgICB2YXIgbyA9IGUucGFyc2UodFt0Lmxlbmd0aCAtIDFdLCB0Lmxlbmd0aCAtIDEsIGUuZXhwZWN0ZWRUeXBlLCByKTtcbiAgICAgIHJldHVybiBvID8gbmV3IHVyKHIsIG8pIDogbnVsbDtcbiAgICB9LCB1ci5wcm90b3R5cGUub3V0cHV0RGVmaW5lZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc3VsdC5vdXRwdXREZWZpbmVkKCk7XG4gICAgfSwgdXIucHJvdG90eXBlLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIHQgPSBbXCJsZXRcIl0sIGUgPSAwLCByID0gdGhpcy5iaW5kaW5nczsgZSA8IHIubGVuZ3RoOyBlICs9IDEpIHtcbiAgICAgICAgdmFyIG4gPSByW2VdO1xuICAgICAgICB0LnB1c2goblswXSwgblsxXS5zZXJpYWxpemUoKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0LnB1c2godGhpcy5yZXN1bHQuc2VyaWFsaXplKCkpLCB0O1xuICAgIH07XG5cbiAgICB2YXIgbHIgPSBmdW5jdGlvbiBscih0LCBlLCByKSB7XG4gICAgICB0aGlzLnR5cGUgPSB0LCB0aGlzLmluZGV4ID0gZSwgdGhpcy5pbnB1dCA9IHI7XG4gICAgfTtcblxuICAgIGxyLnBhcnNlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIGlmICgzICE9PSB0Lmxlbmd0aCkgcmV0dXJuIGUuZXJyb3IoXCJFeHBlY3RlZCAyIGFyZ3VtZW50cywgYnV0IGZvdW5kIFwiICsgKHQubGVuZ3RoIC0gMSkgKyBcIiBpbnN0ZWFkLlwiKTtcbiAgICAgIHZhciByID0gZS5wYXJzZSh0WzFdLCAxLCBPdCksXG4gICAgICAgICAgbiA9IGUucGFyc2UodFsyXSwgMiwgWHQoZS5leHBlY3RlZFR5cGUgfHwgTnQpKTtcbiAgICAgIHJldHVybiByICYmIG4gPyBuZXcgbHIobi50eXBlLml0ZW1UeXBlLCByLCBuKSA6IG51bGw7XG4gICAgfSwgbHIucHJvdG90eXBlLmV2YWx1YXRlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHZhciBlID0gdGhpcy5pbmRleC5ldmFsdWF0ZSh0KSxcbiAgICAgICAgICByID0gdGhpcy5pbnB1dC5ldmFsdWF0ZSh0KTtcbiAgICAgIGlmIChlIDwgMCkgdGhyb3cgbmV3IHBlKFwiQXJyYXkgaW5kZXggb3V0IG9mIGJvdW5kczogXCIgKyBlICsgXCIgPCAwLlwiKTtcbiAgICAgIGlmIChlID49IHIubGVuZ3RoKSB0aHJvdyBuZXcgcGUoXCJBcnJheSBpbmRleCBvdXQgb2YgYm91bmRzOiBcIiArIGUgKyBcIiA+IFwiICsgKHIubGVuZ3RoIC0gMSkgKyBcIi5cIik7XG4gICAgICBpZiAoZSAhPT0gTWF0aC5mbG9vcihlKSkgdGhyb3cgbmV3IHBlKFwiQXJyYXkgaW5kZXggbXVzdCBiZSBhbiBpbnRlZ2VyLCBidXQgZm91bmQgXCIgKyBlICsgXCIgaW5zdGVhZC5cIik7XG4gICAgICByZXR1cm4gcltlXTtcbiAgICB9LCBsci5wcm90b3R5cGUuZWFjaENoaWxkID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHQodGhpcy5pbmRleCksIHQodGhpcy5pbnB1dCk7XG4gICAgfSwgbHIucHJvdG90eXBlLm91dHB1dERlZmluZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gITE7XG4gICAgfSwgbHIucHJvdG90eXBlLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBbXCJhdFwiLCB0aGlzLmluZGV4LnNlcmlhbGl6ZSgpLCB0aGlzLmlucHV0LnNlcmlhbGl6ZSgpXTtcbiAgICB9O1xuXG4gICAgdmFyIHByID0gZnVuY3Rpb24gcHIodCwgZSkge1xuICAgICAgdGhpcy50eXBlID0gVXQsIHRoaXMubmVlZGxlID0gdCwgdGhpcy5oYXlzdGFjayA9IGU7XG4gICAgfTtcblxuICAgIHByLnBhcnNlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIGlmICgzICE9PSB0Lmxlbmd0aCkgcmV0dXJuIGUuZXJyb3IoXCJFeHBlY3RlZCAyIGFyZ3VtZW50cywgYnV0IGZvdW5kIFwiICsgKHQubGVuZ3RoIC0gMSkgKyBcIiBpbnN0ZWFkLlwiKTtcbiAgICAgIHZhciByID0gZS5wYXJzZSh0WzFdLCAxLCBOdCksXG4gICAgICAgICAgbiA9IGUucGFyc2UodFsyXSwgMiwgTnQpO1xuICAgICAgcmV0dXJuIHIgJiYgbiA/ICR0KHIudHlwZSwgW1V0LCBSdCwgT3QsIEx0LCBOdF0pID8gbmV3IHByKHIsIG4pIDogZS5lcnJvcihcIkV4cGVjdGVkIGZpcnN0IGFyZ3VtZW50IHRvIGJlIG9mIHR5cGUgYm9vbGVhbiwgc3RyaW5nLCBudW1iZXIgb3IgbnVsbCwgYnV0IGZvdW5kIFwiICsgSnQoci50eXBlKSArIFwiIGluc3RlYWRcIikgOiBudWxsO1xuICAgIH0sIHByLnByb3RvdHlwZS5ldmFsdWF0ZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2YXIgZSA9IHRoaXMubmVlZGxlLmV2YWx1YXRlKHQpLFxuICAgICAgICAgIHIgPSB0aGlzLmhheXN0YWNrLmV2YWx1YXRlKHQpO1xuICAgICAgaWYgKCFyKSByZXR1cm4gITE7XG4gICAgICBpZiAoIVd0KGUsIFtcImJvb2xlYW5cIiwgXCJzdHJpbmdcIiwgXCJudW1iZXJcIiwgXCJudWxsXCJdKSkgdGhyb3cgbmV3IHBlKFwiRXhwZWN0ZWQgZmlyc3QgYXJndW1lbnQgdG8gYmUgb2YgdHlwZSBib29sZWFuLCBzdHJpbmcsIG51bWJlciBvciBudWxsLCBidXQgZm91bmQgXCIgKyBKdChzZShlKSkgKyBcIiBpbnN0ZWFkLlwiKTtcbiAgICAgIGlmICghV3QociwgW1wic3RyaW5nXCIsIFwiYXJyYXlcIl0pKSB0aHJvdyBuZXcgcGUoXCJFeHBlY3RlZCBzZWNvbmQgYXJndW1lbnQgdG8gYmUgb2YgdHlwZSBhcnJheSBvciBzdHJpbmcsIGJ1dCBmb3VuZCBcIiArIEp0KHNlKHIpKSArIFwiIGluc3RlYWQuXCIpO1xuICAgICAgcmV0dXJuIHIuaW5kZXhPZihlKSA+PSAwO1xuICAgIH0sIHByLnByb3RvdHlwZS5lYWNoQ2hpbGQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdCh0aGlzLm5lZWRsZSksIHQodGhpcy5oYXlzdGFjayk7XG4gICAgfSwgcHIucHJvdG90eXBlLm91dHB1dERlZmluZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gITA7XG4gICAgfSwgcHIucHJvdG90eXBlLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBbXCJpblwiLCB0aGlzLm5lZWRsZS5zZXJpYWxpemUoKSwgdGhpcy5oYXlzdGFjay5zZXJpYWxpemUoKV07XG4gICAgfTtcblxuICAgIHZhciBjciA9IGZ1bmN0aW9uIGNyKHQsIGUsIHIpIHtcbiAgICAgIHRoaXMudHlwZSA9IE90LCB0aGlzLm5lZWRsZSA9IHQsIHRoaXMuaGF5c3RhY2sgPSBlLCB0aGlzLmZyb21JbmRleCA9IHI7XG4gICAgfTtcblxuICAgIGNyLnBhcnNlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIGlmICh0Lmxlbmd0aCA8PSAyIHx8IHQubGVuZ3RoID49IDUpIHJldHVybiBlLmVycm9yKFwiRXhwZWN0ZWQgMyBvciA0IGFyZ3VtZW50cywgYnV0IGZvdW5kIFwiICsgKHQubGVuZ3RoIC0gMSkgKyBcIiBpbnN0ZWFkLlwiKTtcbiAgICAgIHZhciByID0gZS5wYXJzZSh0WzFdLCAxLCBOdCksXG4gICAgICAgICAgbiA9IGUucGFyc2UodFsyXSwgMiwgTnQpO1xuICAgICAgaWYgKCFyIHx8ICFuKSByZXR1cm4gbnVsbDtcbiAgICAgIGlmICghJHQoci50eXBlLCBbVXQsIFJ0LCBPdCwgTHQsIE50XSkpIHJldHVybiBlLmVycm9yKFwiRXhwZWN0ZWQgZmlyc3QgYXJndW1lbnQgdG8gYmUgb2YgdHlwZSBib29sZWFuLCBzdHJpbmcsIG51bWJlciBvciBudWxsLCBidXQgZm91bmQgXCIgKyBKdChyLnR5cGUpICsgXCIgaW5zdGVhZFwiKTtcblxuICAgICAgaWYgKDQgPT09IHQubGVuZ3RoKSB7XG4gICAgICAgIHZhciBpID0gZS5wYXJzZSh0WzNdLCAzLCBPdCk7XG4gICAgICAgIHJldHVybiBpID8gbmV3IGNyKHIsIG4sIGkpIDogbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBjcihyLCBuKTtcbiAgICB9LCBjci5wcm90b3R5cGUuZXZhbHVhdGUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGUgPSB0aGlzLm5lZWRsZS5ldmFsdWF0ZSh0KSxcbiAgICAgICAgICByID0gdGhpcy5oYXlzdGFjay5ldmFsdWF0ZSh0KTtcbiAgICAgIGlmICghV3QoZSwgW1wiYm9vbGVhblwiLCBcInN0cmluZ1wiLCBcIm51bWJlclwiLCBcIm51bGxcIl0pKSB0aHJvdyBuZXcgcGUoXCJFeHBlY3RlZCBmaXJzdCBhcmd1bWVudCB0byBiZSBvZiB0eXBlIGJvb2xlYW4sIHN0cmluZywgbnVtYmVyIG9yIG51bGwsIGJ1dCBmb3VuZCBcIiArIEp0KHNlKGUpKSArIFwiIGluc3RlYWQuXCIpO1xuICAgICAgaWYgKCFXdChyLCBbXCJzdHJpbmdcIiwgXCJhcnJheVwiXSkpIHRocm93IG5ldyBwZShcIkV4cGVjdGVkIHNlY29uZCBhcmd1bWVudCB0byBiZSBvZiB0eXBlIGFycmF5IG9yIHN0cmluZywgYnV0IGZvdW5kIFwiICsgSnQoc2UocikpICsgXCIgaW5zdGVhZC5cIik7XG5cbiAgICAgIGlmICh0aGlzLmZyb21JbmRleCkge1xuICAgICAgICB2YXIgbiA9IHRoaXMuZnJvbUluZGV4LmV2YWx1YXRlKHQpO1xuICAgICAgICByZXR1cm4gci5pbmRleE9mKGUsIG4pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gci5pbmRleE9mKGUpO1xuICAgIH0sIGNyLnByb3RvdHlwZS5lYWNoQ2hpbGQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdCh0aGlzLm5lZWRsZSksIHQodGhpcy5oYXlzdGFjayksIHRoaXMuZnJvbUluZGV4ICYmIHQodGhpcy5mcm9tSW5kZXgpO1xuICAgIH0sIGNyLnByb3RvdHlwZS5vdXRwdXREZWZpbmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICExO1xuICAgIH0sIGNyLnByb3RvdHlwZS5zZXJpYWxpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAobnVsbCAhPSB0aGlzLmZyb21JbmRleCAmJiB2b2lkIDAgIT09IHRoaXMuZnJvbUluZGV4KSB7XG4gICAgICAgIHZhciB0ID0gdGhpcy5mcm9tSW5kZXguc2VyaWFsaXplKCk7XG4gICAgICAgIHJldHVybiBbXCJpbmRleC1vZlwiLCB0aGlzLm5lZWRsZS5zZXJpYWxpemUoKSwgdGhpcy5oYXlzdGFjay5zZXJpYWxpemUoKSwgdF07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbXCJpbmRleC1vZlwiLCB0aGlzLm5lZWRsZS5zZXJpYWxpemUoKSwgdGhpcy5oYXlzdGFjay5zZXJpYWxpemUoKV07XG4gICAgfTtcblxuICAgIHZhciBociA9IGZ1bmN0aW9uIGhyKHQsIGUsIHIsIG4sIGksIGEpIHtcbiAgICAgIHRoaXMuaW5wdXRUeXBlID0gdCwgdGhpcy50eXBlID0gZSwgdGhpcy5pbnB1dCA9IHIsIHRoaXMuY2FzZXMgPSBuLCB0aGlzLm91dHB1dHMgPSBpLCB0aGlzLm90aGVyd2lzZSA9IGE7XG4gICAgfTtcblxuICAgIGhyLnBhcnNlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIGlmICh0Lmxlbmd0aCA8IDUpIHJldHVybiBlLmVycm9yKFwiRXhwZWN0ZWQgYXQgbGVhc3QgNCBhcmd1bWVudHMsIGJ1dCBmb3VuZCBvbmx5IFwiICsgKHQubGVuZ3RoIC0gMSkgKyBcIi5cIik7XG4gICAgICBpZiAodC5sZW5ndGggJSAyICE9IDEpIHJldHVybiBlLmVycm9yKFwiRXhwZWN0ZWQgYW4gZXZlbiBudW1iZXIgb2YgYXJndW1lbnRzLlwiKTtcbiAgICAgIHZhciByLCBuO1xuICAgICAgZS5leHBlY3RlZFR5cGUgJiYgXCJ2YWx1ZVwiICE9PSBlLmV4cGVjdGVkVHlwZS5raW5kICYmIChuID0gZS5leHBlY3RlZFR5cGUpO1xuXG4gICAgICBmb3IgKHZhciBpID0ge30sIGEgPSBbXSwgbyA9IDI7IG8gPCB0Lmxlbmd0aCAtIDE7IG8gKz0gMikge1xuICAgICAgICB2YXIgcyA9IHRbb10sXG4gICAgICAgICAgICB1ID0gdFtvICsgMV07XG4gICAgICAgIEFycmF5LmlzQXJyYXkocykgfHwgKHMgPSBbc10pO1xuICAgICAgICB2YXIgbCA9IGUuY29uY2F0KG8pO1xuICAgICAgICBpZiAoMCA9PT0gcy5sZW5ndGgpIHJldHVybiBsLmVycm9yKFwiRXhwZWN0ZWQgYXQgbGVhc3Qgb25lIGJyYW5jaCBsYWJlbC5cIik7XG5cbiAgICAgICAgZm9yICh2YXIgcCA9IDAsIGMgPSBzOyBwIDwgYy5sZW5ndGg7IHAgKz0gMSkge1xuICAgICAgICAgIHZhciBoID0gY1twXTtcbiAgICAgICAgICBpZiAoXCJudW1iZXJcIiAhPSB0eXBlb2YgaCAmJiBcInN0cmluZ1wiICE9IHR5cGVvZiBoKSByZXR1cm4gbC5lcnJvcihcIkJyYW5jaCBsYWJlbHMgbXVzdCBiZSBudW1iZXJzIG9yIHN0cmluZ3MuXCIpO1xuICAgICAgICAgIGlmIChcIm51bWJlclwiID09IHR5cGVvZiBoICYmIE1hdGguYWJzKGgpID4gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpIHJldHVybiBsLmVycm9yKFwiQnJhbmNoIGxhYmVscyBtdXN0IGJlIGludGVnZXJzIG5vIGxhcmdlciB0aGFuIFwiICsgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgKyBcIi5cIik7XG4gICAgICAgICAgaWYgKFwibnVtYmVyXCIgPT0gdHlwZW9mIGggJiYgTWF0aC5mbG9vcihoKSAhPT0gaCkgcmV0dXJuIGwuZXJyb3IoXCJOdW1lcmljIGJyYW5jaCBsYWJlbHMgbXVzdCBiZSBpbnRlZ2VyIHZhbHVlcy5cIik7XG5cbiAgICAgICAgICBpZiAocikge1xuICAgICAgICAgICAgaWYgKGwuY2hlY2tTdWJ0eXBlKHIsIHNlKGgpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfSBlbHNlIHIgPSBzZShoKTtcblxuICAgICAgICAgIGlmICh2b2lkIDAgIT09IGlbU3RyaW5nKGgpXSkgcmV0dXJuIGwuZXJyb3IoXCJCcmFuY2ggbGFiZWxzIG11c3QgYmUgdW5pcXVlLlwiKTtcbiAgICAgICAgICBpW1N0cmluZyhoKV0gPSBhLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBmID0gZS5wYXJzZSh1LCBvLCBuKTtcbiAgICAgICAgaWYgKCFmKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbiA9IG4gfHwgZi50eXBlLCBhLnB1c2goZik7XG4gICAgICB9XG5cbiAgICAgIHZhciB5ID0gZS5wYXJzZSh0WzFdLCAxLCBOdCk7XG4gICAgICBpZiAoIXkpIHJldHVybiBudWxsO1xuICAgICAgdmFyIGQgPSBlLnBhcnNlKHRbdC5sZW5ndGggLSAxXSwgdC5sZW5ndGggLSAxLCBuKTtcbiAgICAgIHJldHVybiBkID8gXCJ2YWx1ZVwiICE9PSB5LnR5cGUua2luZCAmJiBlLmNvbmNhdCgxKS5jaGVja1N1YnR5cGUociwgeS50eXBlKSA/IG51bGwgOiBuZXcgaHIociwgbiwgeSwgaSwgYSwgZCkgOiBudWxsO1xuICAgIH0sIGhyLnByb3RvdHlwZS5ldmFsdWF0ZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2YXIgZSA9IHRoaXMuaW5wdXQuZXZhbHVhdGUodCk7XG4gICAgICByZXR1cm4gKHNlKGUpID09PSB0aGlzLmlucHV0VHlwZSAmJiB0aGlzLm91dHB1dHNbdGhpcy5jYXNlc1tlXV0gfHwgdGhpcy5vdGhlcndpc2UpLmV2YWx1YXRlKHQpO1xuICAgIH0sIGhyLnByb3RvdHlwZS5lYWNoQ2hpbGQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdCh0aGlzLmlucHV0KSwgdGhpcy5vdXRwdXRzLmZvckVhY2godCksIHQodGhpcy5vdGhlcndpc2UpO1xuICAgIH0sIGhyLnByb3RvdHlwZS5vdXRwdXREZWZpbmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMub3V0cHV0cy5ldmVyeShmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdC5vdXRwdXREZWZpbmVkKCk7XG4gICAgICB9KSAmJiB0aGlzLm90aGVyd2lzZS5vdXRwdXREZWZpbmVkKCk7XG4gICAgfSwgaHIucHJvdG90eXBlLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIHQgPSB0aGlzLCBlID0gW1wibWF0Y2hcIiwgdGhpcy5pbnB1dC5zZXJpYWxpemUoKV0sIHIgPSBbXSwgbiA9IHt9LCBpID0gMCwgYSA9IE9iamVjdC5rZXlzKHRoaXMuY2FzZXMpLnNvcnQoKTsgaSA8IGEubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIG8gPSBhW2ldO1xuICAgICAgICB2b2lkIDAgPT09IChjID0gblt0aGlzLmNhc2VzW29dXSkgPyAoblt0aGlzLmNhc2VzW29dXSA9IHIubGVuZ3RoLCByLnB1c2goW3RoaXMuY2FzZXNbb10sIFtvXV0pKSA6IHJbY11bMV0ucHVzaChvKTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgcyA9IGZ1bmN0aW9uIHMoZSkge1xuICAgICAgICByZXR1cm4gXCJudW1iZXJcIiA9PT0gdC5pbnB1dFR5cGUua2luZCA/IE51bWJlcihlKSA6IGU7XG4gICAgICB9LCB1ID0gMCwgbCA9IHI7IHUgPCBsLmxlbmd0aDsgdSArPSAxKSB7XG4gICAgICAgIHZhciBwID0gbFt1XSxcbiAgICAgICAgICAgIGMgPSBwWzBdLFxuICAgICAgICAgICAgaCA9IHBbMV07XG4gICAgICAgIGUucHVzaCgxID09PSBoLmxlbmd0aCA/IHMoaFswXSkgOiBoLm1hcChzKSksIGUucHVzaCh0aGlzLm91dHB1dHNbb3V0cHV0SW5kZXgkMV0uc2VyaWFsaXplKCkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZS5wdXNoKHRoaXMub3RoZXJ3aXNlLnNlcmlhbGl6ZSgpKSwgZTtcbiAgICB9O1xuXG4gICAgdmFyIGZyID0gZnVuY3Rpb24gZnIodCwgZSwgcikge1xuICAgICAgdGhpcy50eXBlID0gdCwgdGhpcy5icmFuY2hlcyA9IGUsIHRoaXMub3RoZXJ3aXNlID0gcjtcbiAgICB9O1xuXG4gICAgZnIucGFyc2UgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgaWYgKHQubGVuZ3RoIDwgNCkgcmV0dXJuIGUuZXJyb3IoXCJFeHBlY3RlZCBhdCBsZWFzdCAzIGFyZ3VtZW50cywgYnV0IGZvdW5kIG9ubHkgXCIgKyAodC5sZW5ndGggLSAxKSArIFwiLlwiKTtcbiAgICAgIGlmICh0Lmxlbmd0aCAlIDIgIT0gMCkgcmV0dXJuIGUuZXJyb3IoXCJFeHBlY3RlZCBhbiBvZGQgbnVtYmVyIG9mIGFyZ3VtZW50cy5cIik7XG4gICAgICB2YXIgcjtcbiAgICAgIGUuZXhwZWN0ZWRUeXBlICYmIFwidmFsdWVcIiAhPT0gZS5leHBlY3RlZFR5cGUua2luZCAmJiAociA9IGUuZXhwZWN0ZWRUeXBlKTtcblxuICAgICAgZm9yICh2YXIgbiA9IFtdLCBpID0gMTsgaSA8IHQubGVuZ3RoIC0gMTsgaSArPSAyKSB7XG4gICAgICAgIHZhciBhID0gZS5wYXJzZSh0W2ldLCBpLCBVdCk7XG4gICAgICAgIGlmICghYSkgcmV0dXJuIG51bGw7XG4gICAgICAgIHZhciBvID0gZS5wYXJzZSh0W2kgKyAxXSwgaSArIDEsIHIpO1xuICAgICAgICBpZiAoIW8pIHJldHVybiBudWxsO1xuICAgICAgICBuLnB1c2goW2EsIG9dKSwgciA9IHIgfHwgby50eXBlO1xuICAgICAgfVxuXG4gICAgICB2YXIgcyA9IGUucGFyc2UodFt0Lmxlbmd0aCAtIDFdLCB0Lmxlbmd0aCAtIDEsIHIpO1xuICAgICAgcmV0dXJuIHMgPyBuZXcgZnIociwgbiwgcykgOiBudWxsO1xuICAgIH0sIGZyLnByb3RvdHlwZS5ldmFsdWF0ZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmb3IgKHZhciBlID0gMCwgciA9IHRoaXMuYnJhbmNoZXM7IGUgPCByLmxlbmd0aDsgZSArPSAxKSB7XG4gICAgICAgIHZhciBuID0gcltlXSxcbiAgICAgICAgICAgIGkgPSBuWzFdO1xuICAgICAgICBpZiAoblswXS5ldmFsdWF0ZSh0KSkgcmV0dXJuIGkuZXZhbHVhdGUodCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLm90aGVyd2lzZS5ldmFsdWF0ZSh0KTtcbiAgICB9LCBmci5wcm90b3R5cGUuZWFjaENoaWxkID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZvciAodmFyIGUgPSAwLCByID0gdGhpcy5icmFuY2hlczsgZSA8IHIubGVuZ3RoOyBlICs9IDEpIHtcbiAgICAgICAgdmFyIG4gPSByW2VdLFxuICAgICAgICAgICAgaSA9IG5bMV07XG4gICAgICAgIHQoblswXSksIHQoaSk7XG4gICAgICB9XG5cbiAgICAgIHQodGhpcy5vdGhlcndpc2UpO1xuICAgIH0sIGZyLnByb3RvdHlwZS5vdXRwdXREZWZpbmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuYnJhbmNoZXMuZXZlcnkoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHRbMV0ub3V0cHV0RGVmaW5lZCgpO1xuICAgICAgfSkgJiYgdGhpcy5vdGhlcndpc2Uub3V0cHV0RGVmaW5lZCgpO1xuICAgIH0sIGZyLnByb3RvdHlwZS5zZXJpYWxpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdCA9IFtcImNhc2VcIl07XG4gICAgICByZXR1cm4gdGhpcy5lYWNoQ2hpbGQoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdC5wdXNoKGUuc2VyaWFsaXplKCkpO1xuICAgICAgfSksIHQ7XG4gICAgfTtcblxuICAgIHZhciB5ciA9IGZ1bmN0aW9uIHlyKHQsIGUsIHIsIG4pIHtcbiAgICAgIHRoaXMudHlwZSA9IHQsIHRoaXMuaW5wdXQgPSBlLCB0aGlzLmJlZ2luSW5kZXggPSByLCB0aGlzLmVuZEluZGV4ID0gbjtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gZHIodCwgZSkge1xuICAgICAgcmV0dXJuIFwiPT1cIiA9PT0gdCB8fCBcIiE9XCIgPT09IHQgPyBcImJvb2xlYW5cIiA9PT0gZS5raW5kIHx8IFwic3RyaW5nXCIgPT09IGUua2luZCB8fCBcIm51bWJlclwiID09PSBlLmtpbmQgfHwgXCJudWxsXCIgPT09IGUua2luZCB8fCBcInZhbHVlXCIgPT09IGUua2luZCA6IFwic3RyaW5nXCIgPT09IGUua2luZCB8fCBcIm51bWJlclwiID09PSBlLmtpbmQgfHwgXCJ2YWx1ZVwiID09PSBlLmtpbmQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbXIodCwgZSwgciwgbikge1xuICAgICAgcmV0dXJuIDAgPT09IG4uY29tcGFyZShlLCByKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2cih0LCBlLCByKSB7XG4gICAgICB2YXIgbiA9IFwiPT1cIiAhPT0gdCAmJiBcIiE9XCIgIT09IHQ7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICBmdW5jdGlvbiBpKHQsIGUsIHIpIHtcbiAgICAgICAgICB0aGlzLnR5cGUgPSBVdCwgdGhpcy5saHMgPSB0LCB0aGlzLnJocyA9IGUsIHRoaXMuY29sbGF0b3IgPSByLCB0aGlzLmhhc1VudHlwZWRBcmd1bWVudCA9IFwidmFsdWVcIiA9PT0gdC50eXBlLmtpbmQgfHwgXCJ2YWx1ZVwiID09PSBlLnR5cGUua2luZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpLnBhcnNlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICBpZiAoMyAhPT0gdC5sZW5ndGggJiYgNCAhPT0gdC5sZW5ndGgpIHJldHVybiBlLmVycm9yKFwiRXhwZWN0ZWQgdHdvIG9yIHRocmVlIGFyZ3VtZW50cy5cIik7XG4gICAgICAgICAgdmFyIHIgPSB0WzBdLFxuICAgICAgICAgICAgICBhID0gZS5wYXJzZSh0WzFdLCAxLCBOdCk7XG4gICAgICAgICAgaWYgKCFhKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICBpZiAoIWRyKHIsIGEudHlwZSkpIHJldHVybiBlLmNvbmNhdCgxKS5lcnJvcignXCInICsgciArIFwiXFxcIiBjb21wYXJpc29ucyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgdHlwZSAnXCIgKyBKdChhLnR5cGUpICsgXCInLlwiKTtcbiAgICAgICAgICB2YXIgbyA9IGUucGFyc2UodFsyXSwgMiwgTnQpO1xuICAgICAgICAgIGlmICghbykgcmV0dXJuIG51bGw7XG4gICAgICAgICAgaWYgKCFkcihyLCBvLnR5cGUpKSByZXR1cm4gZS5jb25jYXQoMikuZXJyb3IoJ1wiJyArIHIgKyBcIlxcXCIgY29tcGFyaXNvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIHR5cGUgJ1wiICsgSnQoby50eXBlKSArIFwiJy5cIik7XG4gICAgICAgICAgaWYgKGEudHlwZS5raW5kICE9PSBvLnR5cGUua2luZCAmJiBcInZhbHVlXCIgIT09IGEudHlwZS5raW5kICYmIFwidmFsdWVcIiAhPT0gby50eXBlLmtpbmQpIHJldHVybiBlLmVycm9yKFwiQ2Fubm90IGNvbXBhcmUgdHlwZXMgJ1wiICsgSnQoYS50eXBlKSArIFwiJyBhbmQgJ1wiICsgSnQoby50eXBlKSArIFwiJy5cIik7XG4gICAgICAgICAgbiAmJiAoXCJ2YWx1ZVwiID09PSBhLnR5cGUua2luZCAmJiBcInZhbHVlXCIgIT09IG8udHlwZS5raW5kID8gYSA9IG5ldyBoZShvLnR5cGUsIFthXSkgOiBcInZhbHVlXCIgIT09IGEudHlwZS5raW5kICYmIFwidmFsdWVcIiA9PT0gby50eXBlLmtpbmQgJiYgKG8gPSBuZXcgaGUoYS50eXBlLCBbb10pKSk7XG4gICAgICAgICAgdmFyIHMgPSBudWxsO1xuXG4gICAgICAgICAgaWYgKDQgPT09IHQubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoXCJzdHJpbmdcIiAhPT0gYS50eXBlLmtpbmQgJiYgXCJzdHJpbmdcIiAhPT0gby50eXBlLmtpbmQgJiYgXCJ2YWx1ZVwiICE9PSBhLnR5cGUua2luZCAmJiBcInZhbHVlXCIgIT09IG8udHlwZS5raW5kKSByZXR1cm4gZS5lcnJvcihcIkNhbm5vdCB1c2UgY29sbGF0b3IgdG8gY29tcGFyZSBub24tc3RyaW5nIHR5cGVzLlwiKTtcbiAgICAgICAgICAgIGlmICghKHMgPSBlLnBhcnNlKHRbM10sIDMsIEt0KSkpIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBuZXcgaShhLCBvLCBzKTtcbiAgICAgICAgfSwgaS5wcm90b3R5cGUuZXZhbHVhdGUgPSBmdW5jdGlvbiAoaSkge1xuICAgICAgICAgIHZhciBhID0gdGhpcy5saHMuZXZhbHVhdGUoaSksXG4gICAgICAgICAgICAgIG8gPSB0aGlzLnJocy5ldmFsdWF0ZShpKTtcblxuICAgICAgICAgIGlmIChuICYmIHRoaXMuaGFzVW50eXBlZEFyZ3VtZW50KSB7XG4gICAgICAgICAgICB2YXIgcyA9IHNlKGEpLFxuICAgICAgICAgICAgICAgIHUgPSBzZShvKTtcbiAgICAgICAgICAgIGlmIChzLmtpbmQgIT09IHUua2luZCB8fCBcInN0cmluZ1wiICE9PSBzLmtpbmQgJiYgXCJudW1iZXJcIiAhPT0gcy5raW5kKSB0aHJvdyBuZXcgcGUoJ0V4cGVjdGVkIGFyZ3VtZW50cyBmb3IgXCInICsgdCArICdcIiB0byBiZSAoc3RyaW5nLCBzdHJpbmcpIG9yIChudW1iZXIsIG51bWJlciksIGJ1dCBmb3VuZCAoJyArIHMua2luZCArIFwiLCBcIiArIHUua2luZCArIFwiKSBpbnN0ZWFkLlwiKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGhpcy5jb2xsYXRvciAmJiAhbiAmJiB0aGlzLmhhc1VudHlwZWRBcmd1bWVudCkge1xuICAgICAgICAgICAgdmFyIGwgPSBzZShhKSxcbiAgICAgICAgICAgICAgICBwID0gc2Uobyk7XG4gICAgICAgICAgICBpZiAoXCJzdHJpbmdcIiAhPT0gbC5raW5kIHx8IFwic3RyaW5nXCIgIT09IHAua2luZCkgcmV0dXJuIGUoaSwgYSwgbyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29sbGF0b3IgPyByKGksIGEsIG8sIHRoaXMuY29sbGF0b3IuZXZhbHVhdGUoaSkpIDogZShpLCBhLCBvKTtcbiAgICAgICAgfSwgaS5wcm90b3R5cGUuZWFjaENoaWxkID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICB0KHRoaXMubGhzKSwgdCh0aGlzLnJocyksIHRoaXMuY29sbGF0b3IgJiYgdCh0aGlzLmNvbGxhdG9yKTtcbiAgICAgICAgfSwgaS5wcm90b3R5cGUub3V0cHV0RGVmaW5lZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgIH0sIGkucHJvdG90eXBlLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgZSA9IFt0XTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5lYWNoQ2hpbGQoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgIGUucHVzaCh0LnNlcmlhbGl6ZSgpKTtcbiAgICAgICAgICB9KSwgZTtcbiAgICAgICAgfSwgaTtcbiAgICAgIH0oKTtcbiAgICB9XG5cbiAgICB5ci5wYXJzZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICBpZiAodC5sZW5ndGggPD0gMiB8fCB0Lmxlbmd0aCA+PSA1KSByZXR1cm4gZS5lcnJvcihcIkV4cGVjdGVkIDMgb3IgNCBhcmd1bWVudHMsIGJ1dCBmb3VuZCBcIiArICh0Lmxlbmd0aCAtIDEpICsgXCIgaW5zdGVhZC5cIik7XG4gICAgICB2YXIgciA9IGUucGFyc2UodFsxXSwgMSwgTnQpLFxuICAgICAgICAgIG4gPSBlLnBhcnNlKHRbMl0sIDIsIE90KTtcbiAgICAgIGlmICghciB8fCAhbikgcmV0dXJuIG51bGw7XG4gICAgICBpZiAoISR0KHIudHlwZSwgW1h0KE50KSwgUnQsIE50XSkpIHJldHVybiBlLmVycm9yKFwiRXhwZWN0ZWQgZmlyc3QgYXJndW1lbnQgdG8gYmUgb2YgdHlwZSBhcnJheSBvciBzdHJpbmcsIGJ1dCBmb3VuZCBcIiArIEp0KHIudHlwZSkgKyBcIiBpbnN0ZWFkXCIpO1xuXG4gICAgICBpZiAoNCA9PT0gdC5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGkgPSBlLnBhcnNlKHRbM10sIDMsIE90KTtcbiAgICAgICAgcmV0dXJuIGkgPyBuZXcgeXIoci50eXBlLCByLCBuLCBpKSA6IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgeXIoci50eXBlLCByLCBuKTtcbiAgICB9LCB5ci5wcm90b3R5cGUuZXZhbHVhdGUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGUgPSB0aGlzLmlucHV0LmV2YWx1YXRlKHQpLFxuICAgICAgICAgIHIgPSB0aGlzLmJlZ2luSW5kZXguZXZhbHVhdGUodCk7XG4gICAgICBpZiAoIVd0KGUsIFtcInN0cmluZ1wiLCBcImFycmF5XCJdKSkgdGhyb3cgbmV3IHBlKFwiRXhwZWN0ZWQgZmlyc3QgYXJndW1lbnQgdG8gYmUgb2YgdHlwZSBhcnJheSBvciBzdHJpbmcsIGJ1dCBmb3VuZCBcIiArIEp0KHNlKGUpKSArIFwiIGluc3RlYWQuXCIpO1xuXG4gICAgICBpZiAodGhpcy5lbmRJbmRleCkge1xuICAgICAgICB2YXIgbiA9IHRoaXMuZW5kSW5kZXguZXZhbHVhdGUodCk7XG4gICAgICAgIHJldHVybiBlLnNsaWNlKHIsIG4pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZS5zbGljZShyKTtcbiAgICB9LCB5ci5wcm90b3R5cGUuZWFjaENoaWxkID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHQodGhpcy5pbnB1dCksIHQodGhpcy5iZWdpbkluZGV4KSwgdGhpcy5lbmRJbmRleCAmJiB0KHRoaXMuZW5kSW5kZXgpO1xuICAgIH0sIHlyLnByb3RvdHlwZS5vdXRwdXREZWZpbmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICExO1xuICAgIH0sIHlyLnByb3RvdHlwZS5zZXJpYWxpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAobnVsbCAhPSB0aGlzLmVuZEluZGV4ICYmIHZvaWQgMCAhPT0gdGhpcy5lbmRJbmRleCkge1xuICAgICAgICB2YXIgdCA9IHRoaXMuZW5kSW5kZXguc2VyaWFsaXplKCk7XG4gICAgICAgIHJldHVybiBbXCJzbGljZVwiLCB0aGlzLmlucHV0LnNlcmlhbGl6ZSgpLCB0aGlzLmJlZ2luSW5kZXguc2VyaWFsaXplKCksIHRdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gW1wic2xpY2VcIiwgdGhpcy5pbnB1dC5zZXJpYWxpemUoKSwgdGhpcy5iZWdpbkluZGV4LnNlcmlhbGl6ZSgpXTtcbiAgICB9O1xuXG4gICAgdmFyIGdyID0gdnIoXCI9PVwiLCBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgcmV0dXJuIGUgPT09IHI7XG4gICAgfSwgbXIpLFxuICAgICAgICB4ciA9IHZyKFwiIT1cIiwgZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgIHJldHVybiBlICE9PSByO1xuICAgIH0sIGZ1bmN0aW9uICh0LCBlLCByLCBuKSB7XG4gICAgICByZXR1cm4gIW1yKDAsIGUsIHIsIG4pO1xuICAgIH0pLFxuICAgICAgICBiciA9IHZyKFwiPFwiLCBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgcmV0dXJuIGUgPCByO1xuICAgIH0sIGZ1bmN0aW9uICh0LCBlLCByLCBuKSB7XG4gICAgICByZXR1cm4gbi5jb21wYXJlKGUsIHIpIDwgMDtcbiAgICB9KSxcbiAgICAgICAgd3IgPSB2cihcIj5cIiwgZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgIHJldHVybiBlID4gcjtcbiAgICB9LCBmdW5jdGlvbiAodCwgZSwgciwgbikge1xuICAgICAgcmV0dXJuIG4uY29tcGFyZShlLCByKSA+IDA7XG4gICAgfSksXG4gICAgICAgIF9yID0gdnIoXCI8PVwiLCBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgcmV0dXJuIGUgPD0gcjtcbiAgICB9LCBmdW5jdGlvbiAodCwgZSwgciwgbikge1xuICAgICAgcmV0dXJuIG4uY29tcGFyZShlLCByKSA8PSAwO1xuICAgIH0pLFxuICAgICAgICBBciA9IHZyKFwiPj1cIiwgZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgIHJldHVybiBlID49IHI7XG4gICAgfSwgZnVuY3Rpb24gKHQsIGUsIHIsIG4pIHtcbiAgICAgIHJldHVybiBuLmNvbXBhcmUoZSwgcikgPj0gMDtcbiAgICB9KSxcbiAgICAgICAgU3IgPSBmdW5jdGlvbiBTcih0LCBlLCByLCBuLCBpKSB7XG4gICAgICB0aGlzLnR5cGUgPSBSdCwgdGhpcy5udW1iZXIgPSB0LCB0aGlzLmxvY2FsZSA9IGUsIHRoaXMuY3VycmVuY3kgPSByLCB0aGlzLm1pbkZyYWN0aW9uRGlnaXRzID0gbiwgdGhpcy5tYXhGcmFjdGlvbkRpZ2l0cyA9IGk7XG4gICAgfTtcblxuICAgIFNyLnBhcnNlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIGlmICgzICE9PSB0Lmxlbmd0aCkgcmV0dXJuIGUuZXJyb3IoXCJFeHBlY3RlZCB0d28gYXJndW1lbnRzLlwiKTtcbiAgICAgIHZhciByID0gZS5wYXJzZSh0WzFdLCAxLCBPdCk7XG4gICAgICBpZiAoIXIpIHJldHVybiBudWxsO1xuICAgICAgdmFyIG4gPSB0WzJdO1xuICAgICAgaWYgKFwib2JqZWN0XCIgIT0gdHlwZW9mIG4gfHwgQXJyYXkuaXNBcnJheShuKSkgcmV0dXJuIGUuZXJyb3IoXCJOdW1iZXJGb3JtYXQgb3B0aW9ucyBhcmd1bWVudCBtdXN0IGJlIGFuIG9iamVjdC5cIik7XG4gICAgICB2YXIgaSA9IG51bGw7XG4gICAgICBpZiAobi5sb2NhbGUgJiYgIShpID0gZS5wYXJzZShuLmxvY2FsZSwgMSwgUnQpKSkgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgYSA9IG51bGw7XG4gICAgICBpZiAobi5jdXJyZW5jeSAmJiAhKGEgPSBlLnBhcnNlKG4uY3VycmVuY3ksIDEsIFJ0KSkpIHJldHVybiBudWxsO1xuICAgICAgdmFyIG8gPSBudWxsO1xuICAgICAgaWYgKG5bXCJtaW4tZnJhY3Rpb24tZGlnaXRzXCJdICYmICEobyA9IGUucGFyc2UobltcIm1pbi1mcmFjdGlvbi1kaWdpdHNcIl0sIDEsIE90KSkpIHJldHVybiBudWxsO1xuICAgICAgdmFyIHMgPSBudWxsO1xuICAgICAgcmV0dXJuIG5bXCJtYXgtZnJhY3Rpb24tZGlnaXRzXCJdICYmICEocyA9IGUucGFyc2UobltcIm1heC1mcmFjdGlvbi1kaWdpdHNcIl0sIDEsIE90KSkgPyBudWxsIDogbmV3IFNyKHIsIGksIGEsIG8sIHMpO1xuICAgIH0sIFNyLnByb3RvdHlwZS5ldmFsdWF0ZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gbmV3IEludGwuTnVtYmVyRm9ybWF0KHRoaXMubG9jYWxlID8gdGhpcy5sb2NhbGUuZXZhbHVhdGUodCkgOiBbXSwge1xuICAgICAgICBzdHlsZTogdGhpcy5jdXJyZW5jeSA/IFwiY3VycmVuY3lcIiA6IFwiZGVjaW1hbFwiLFxuICAgICAgICBjdXJyZW5jeTogdGhpcy5jdXJyZW5jeSA/IHRoaXMuY3VycmVuY3kuZXZhbHVhdGUodCkgOiB2b2lkIDAsXG4gICAgICAgIG1pbmltdW1GcmFjdGlvbkRpZ2l0czogdGhpcy5taW5GcmFjdGlvbkRpZ2l0cyA/IHRoaXMubWluRnJhY3Rpb25EaWdpdHMuZXZhbHVhdGUodCkgOiB2b2lkIDAsXG4gICAgICAgIG1heGltdW1GcmFjdGlvbkRpZ2l0czogdGhpcy5tYXhGcmFjdGlvbkRpZ2l0cyA/IHRoaXMubWF4RnJhY3Rpb25EaWdpdHMuZXZhbHVhdGUodCkgOiB2b2lkIDBcbiAgICAgIH0pLmZvcm1hdCh0aGlzLm51bWJlci5ldmFsdWF0ZSh0KSk7XG4gICAgfSwgU3IucHJvdG90eXBlLmVhY2hDaGlsZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0KHRoaXMubnVtYmVyKSwgdGhpcy5sb2NhbGUgJiYgdCh0aGlzLmxvY2FsZSksIHRoaXMuY3VycmVuY3kgJiYgdCh0aGlzLmN1cnJlbmN5KSwgdGhpcy5taW5GcmFjdGlvbkRpZ2l0cyAmJiB0KHRoaXMubWluRnJhY3Rpb25EaWdpdHMpLCB0aGlzLm1heEZyYWN0aW9uRGlnaXRzICYmIHQodGhpcy5tYXhGcmFjdGlvbkRpZ2l0cyk7XG4gICAgfSwgU3IucHJvdG90eXBlLm91dHB1dERlZmluZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gITE7XG4gICAgfSwgU3IucHJvdG90eXBlLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0ID0ge307XG4gICAgICByZXR1cm4gdGhpcy5sb2NhbGUgJiYgKHQubG9jYWxlID0gdGhpcy5sb2NhbGUuc2VyaWFsaXplKCkpLCB0aGlzLmN1cnJlbmN5ICYmICh0LmN1cnJlbmN5ID0gdGhpcy5jdXJyZW5jeS5zZXJpYWxpemUoKSksIHRoaXMubWluRnJhY3Rpb25EaWdpdHMgJiYgKHRbXCJtaW4tZnJhY3Rpb24tZGlnaXRzXCJdID0gdGhpcy5taW5GcmFjdGlvbkRpZ2l0cy5zZXJpYWxpemUoKSksIHRoaXMubWF4RnJhY3Rpb25EaWdpdHMgJiYgKHRbXCJtYXgtZnJhY3Rpb24tZGlnaXRzXCJdID0gdGhpcy5tYXhGcmFjdGlvbkRpZ2l0cy5zZXJpYWxpemUoKSksIFtcIm51bWJlci1mb3JtYXRcIiwgdGhpcy5udW1iZXIuc2VyaWFsaXplKCksIHRdO1xuICAgIH07XG5cbiAgICB2YXIga3IgPSBmdW5jdGlvbiBrcih0KSB7XG4gICAgICB0aGlzLnR5cGUgPSBPdCwgdGhpcy5pbnB1dCA9IHQ7XG4gICAgfTtcblxuICAgIGtyLnBhcnNlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIGlmICgyICE9PSB0Lmxlbmd0aCkgcmV0dXJuIGUuZXJyb3IoXCJFeHBlY3RlZCAxIGFyZ3VtZW50LCBidXQgZm91bmQgXCIgKyAodC5sZW5ndGggLSAxKSArIFwiIGluc3RlYWQuXCIpO1xuICAgICAgdmFyIHIgPSBlLnBhcnNlKHRbMV0sIDEpO1xuICAgICAgcmV0dXJuIHIgPyBcImFycmF5XCIgIT09IHIudHlwZS5raW5kICYmIFwic3RyaW5nXCIgIT09IHIudHlwZS5raW5kICYmIFwidmFsdWVcIiAhPT0gci50eXBlLmtpbmQgPyBlLmVycm9yKFwiRXhwZWN0ZWQgYXJndW1lbnQgb2YgdHlwZSBzdHJpbmcgb3IgYXJyYXksIGJ1dCBmb3VuZCBcIiArIEp0KHIudHlwZSkgKyBcIiBpbnN0ZWFkLlwiKSA6IG5ldyBrcihyKSA6IG51bGw7XG4gICAgfSwga3IucHJvdG90eXBlLmV2YWx1YXRlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHZhciBlID0gdGhpcy5pbnB1dC5ldmFsdWF0ZSh0KTtcbiAgICAgIGlmIChcInN0cmluZ1wiID09IHR5cGVvZiBlKSByZXR1cm4gZS5sZW5ndGg7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShlKSkgcmV0dXJuIGUubGVuZ3RoO1xuICAgICAgdGhyb3cgbmV3IHBlKFwiRXhwZWN0ZWQgdmFsdWUgdG8gYmUgb2YgdHlwZSBzdHJpbmcgb3IgYXJyYXksIGJ1dCBmb3VuZCBcIiArIEp0KHNlKGUpKSArIFwiIGluc3RlYWQuXCIpO1xuICAgIH0sIGtyLnByb3RvdHlwZS5lYWNoQ2hpbGQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdCh0aGlzLmlucHV0KTtcbiAgICB9LCBrci5wcm90b3R5cGUub3V0cHV0RGVmaW5lZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhMTtcbiAgICB9LCBrci5wcm90b3R5cGUuc2VyaWFsaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHQgPSBbXCJsZW5ndGhcIl07XG4gICAgICByZXR1cm4gdGhpcy5lYWNoQ2hpbGQoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdC5wdXNoKGUuc2VyaWFsaXplKCkpO1xuICAgICAgfSksIHQ7XG4gICAgfTtcbiAgICB2YXIgSXIgPSB7XG4gICAgICBcIj09XCI6IGdyLFxuICAgICAgXCIhPVwiOiB4cixcbiAgICAgIFwiPlwiOiB3cixcbiAgICAgIFwiPFwiOiBicixcbiAgICAgIFwiPj1cIjogQXIsXG4gICAgICBcIjw9XCI6IF9yLFxuICAgICAgYXJyYXk6IGhlLFxuICAgICAgYXQ6IGxyLFxuICAgICAgYm9vbGVhbjogaGUsXG4gICAgICBjYXNlOiBmcixcbiAgICAgIGNvYWxlc2NlOiBzcixcbiAgICAgIGNvbGxhdG9yOiBiZSxcbiAgICAgIGZvcm1hdDogZmUsXG4gICAgICBpbWFnZTogeWUsXG4gICAgICBpbjogcHIsXG4gICAgICBcImluZGV4LW9mXCI6IGNyLFxuICAgICAgaW50ZXJwb2xhdGU6IGFyLFxuICAgICAgXCJpbnRlcnBvbGF0ZS1oY2xcIjogYXIsXG4gICAgICBcImludGVycG9sYXRlLWxhYlwiOiBhcixcbiAgICAgIGxlbmd0aDoga3IsXG4gICAgICBsZXQ6IHVyLFxuICAgICAgbGl0ZXJhbDogbGUsXG4gICAgICBtYXRjaDogaHIsXG4gICAgICBudW1iZXI6IGhlLFxuICAgICAgXCJudW1iZXItZm9ybWF0XCI6IFNyLFxuICAgICAgb2JqZWN0OiBoZSxcbiAgICAgIHNsaWNlOiB5cixcbiAgICAgIHN0ZXA6IE5lLFxuICAgICAgc3RyaW5nOiBoZSxcbiAgICAgIFwidG8tYm9vbGVhblwiOiBtZSxcbiAgICAgIFwidG8tY29sb3JcIjogbWUsXG4gICAgICBcInRvLW51bWJlclwiOiBtZSxcbiAgICAgIFwidG8tc3RyaW5nXCI6IG1lLFxuICAgICAgdmFyOiBVZSxcbiAgICAgIHdpdGhpbjogRGVcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24genIodCwgZSkge1xuICAgICAgdmFyIHIgPSBlWzBdLFxuICAgICAgICAgIG4gPSBlWzFdLFxuICAgICAgICAgIGkgPSBlWzJdLFxuICAgICAgICAgIGEgPSBlWzNdO1xuICAgICAgciA9IHIuZXZhbHVhdGUodCksIG4gPSBuLmV2YWx1YXRlKHQpLCBpID0gaS5ldmFsdWF0ZSh0KTtcbiAgICAgIHZhciBvID0gYSA/IGEuZXZhbHVhdGUodCkgOiAxLFxuICAgICAgICAgIHMgPSBhZShyLCBuLCBpLCBvKTtcbiAgICAgIGlmIChzKSB0aHJvdyBuZXcgcGUocyk7XG4gICAgICByZXR1cm4gbmV3IHRlKHIgLyAyNTUgKiBvLCBuIC8gMjU1ICogbywgaSAvIDI1NSAqIG8sIG8pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIENyKHQsIGUpIHtcbiAgICAgIHJldHVybiB0IGluIGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gRXIodCwgZSkge1xuICAgICAgdmFyIHIgPSBlW3RdO1xuICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gciA/IG51bGwgOiByO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFByKHQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IHRcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gTXIodCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVzdWx0OiBcInN1Y2Nlc3NcIixcbiAgICAgICAgdmFsdWU6IHRcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gQnIodCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVzdWx0OiBcImVycm9yXCIsXG4gICAgICAgIHZhbHVlOiB0XG4gICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFRyKHQpIHtcbiAgICAgIHJldHVybiBcImRhdGEtZHJpdmVuXCIgPT09IHRbXCJwcm9wZXJ0eS10eXBlXCJdIHx8IFwiY3Jvc3MtZmFkZWQtZGF0YS1kcml2ZW5cIiA9PT0gdFtcInByb3BlcnR5LXR5cGVcIl07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gVnIodCkge1xuICAgICAgcmV0dXJuICEhdC5leHByZXNzaW9uICYmIHQuZXhwcmVzc2lvbi5wYXJhbWV0ZXJzLmluZGV4T2YoXCJ6b29tXCIpID4gLTE7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gRnIodCkge1xuICAgICAgcmV0dXJuICEhdC5leHByZXNzaW9uICYmIHQuZXhwcmVzc2lvbi5pbnRlcnBvbGF0ZWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gRHIodCkge1xuICAgICAgcmV0dXJuIHQgaW5zdGFuY2VvZiBOdW1iZXIgPyBcIm51bWJlclwiIDogdCBpbnN0YW5jZW9mIFN0cmluZyA/IFwic3RyaW5nXCIgOiB0IGluc3RhbmNlb2YgQm9vbGVhbiA/IFwiYm9vbGVhblwiIDogQXJyYXkuaXNBcnJheSh0KSA/IFwiYXJyYXlcIiA6IG51bGwgPT09IHQgPyBcIm51bGxcIiA6IHR5cGVvZiB0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIExyKHQpIHtcbiAgICAgIHJldHVybiBcIm9iamVjdFwiID09IHR5cGVvZiB0ICYmIG51bGwgIT09IHQgJiYgIUFycmF5LmlzQXJyYXkodCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gT3IodCkge1xuICAgICAgcmV0dXJuIHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gUnIodCwgZSwgcikge1xuICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gdCA/IHQgOiB2b2lkIDAgIT09IGUgPyBlIDogdm9pZCAwICE9PSByID8gciA6IHZvaWQgMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBVcih0LCBlLCByLCBuLCBpKSB7XG4gICAgICByZXR1cm4gUnIodHlwZW9mIHIgPT09IGkgPyBuW3JdIDogdm9pZCAwLCB0LmRlZmF1bHQsIGUuZGVmYXVsdCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24ganIodCwgZSwgcikge1xuICAgICAgaWYgKFwibnVtYmVyXCIgIT09IERyKHIpKSByZXR1cm4gUnIodC5kZWZhdWx0LCBlLmRlZmF1bHQpO1xuICAgICAgdmFyIG4gPSB0LnN0b3BzLmxlbmd0aDtcbiAgICAgIGlmICgxID09PSBuKSByZXR1cm4gdC5zdG9wc1swXVsxXTtcbiAgICAgIGlmIChyIDw9IHQuc3RvcHNbMF1bMF0pIHJldHVybiB0LnN0b3BzWzBdWzFdO1xuICAgICAgaWYgKHIgPj0gdC5zdG9wc1tuIC0gMV1bMF0pIHJldHVybiB0LnN0b3BzW24gLSAxXVsxXTtcbiAgICAgIHZhciBpID0gcWUodC5zdG9wcy5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHRbMF07XG4gICAgICB9KSwgcik7XG4gICAgICByZXR1cm4gdC5zdG9wc1tpXVsxXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBxcih0LCBlLCByKSB7XG4gICAgICB2YXIgbiA9IHZvaWQgMCAhPT0gdC5iYXNlID8gdC5iYXNlIDogMTtcbiAgICAgIGlmIChcIm51bWJlclwiICE9PSBEcihyKSkgcmV0dXJuIFJyKHQuZGVmYXVsdCwgZS5kZWZhdWx0KTtcbiAgICAgIHZhciBpID0gdC5zdG9wcy5sZW5ndGg7XG4gICAgICBpZiAoMSA9PT0gaSkgcmV0dXJuIHQuc3RvcHNbMF1bMV07XG4gICAgICBpZiAociA8PSB0LnN0b3BzWzBdWzBdKSByZXR1cm4gdC5zdG9wc1swXVsxXTtcbiAgICAgIGlmIChyID49IHQuc3RvcHNbaSAtIDFdWzBdKSByZXR1cm4gdC5zdG9wc1tpIC0gMV1bMV07XG5cbiAgICAgIHZhciBhID0gcWUodC5zdG9wcy5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHRbMF07XG4gICAgICB9KSwgciksXG4gICAgICAgICAgbyA9IGZ1bmN0aW9uICh0LCBlLCByLCBuKSB7XG4gICAgICAgIHZhciBpID0gbiAtIHIsXG4gICAgICAgICAgICBhID0gdCAtIHI7XG4gICAgICAgIHJldHVybiAwID09PSBpID8gMCA6IDEgPT09IGUgPyBhIC8gaSA6IChNYXRoLnBvdyhlLCBhKSAtIDEpIC8gKE1hdGgucG93KGUsIGkpIC0gMSk7XG4gICAgICB9KHIsIG4sIHQuc3RvcHNbYV1bMF0sIHQuc3RvcHNbYSArIDFdWzBdKSxcbiAgICAgICAgICBzID0gdC5zdG9wc1thXVsxXSxcbiAgICAgICAgICB1ID0gdC5zdG9wc1thICsgMV1bMV0sXG4gICAgICAgICAgbCA9IEdlW2UudHlwZV0gfHwgT3I7XG5cbiAgICAgIGlmICh0LmNvbG9yU3BhY2UgJiYgXCJyZ2JcIiAhPT0gdC5jb2xvclNwYWNlKSB7XG4gICAgICAgIHZhciBwID0gaXJbdC5jb2xvclNwYWNlXTtcblxuICAgICAgICBsID0gZnVuY3Rpb24gbCh0LCBlKSB7XG4gICAgICAgICAgcmV0dXJuIHAucmV2ZXJzZShwLmludGVycG9sYXRlKHAuZm9yd2FyZCh0KSwgcC5mb3J3YXJkKGUpLCBvKSk7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIHMuZXZhbHVhdGUgPyB7XG4gICAgICAgIGV2YWx1YXRlOiBmdW5jdGlvbiBldmFsdWF0ZSgpIHtcbiAgICAgICAgICBmb3IgKHZhciB0ID0gW10sIGUgPSBhcmd1bWVudHMubGVuZ3RoOyBlLS07KSB7XG4gICAgICAgICAgICB0W2VdID0gYXJndW1lbnRzW2VdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciByID0gcy5ldmFsdWF0ZS5hcHBseSh2b2lkIDAsIHQpLFxuICAgICAgICAgICAgICBuID0gdS5ldmFsdWF0ZS5hcHBseSh2b2lkIDAsIHQpO1xuICAgICAgICAgIGlmICh2b2lkIDAgIT09IHIgJiYgdm9pZCAwICE9PSBuKSByZXR1cm4gbChyLCBuLCBvKTtcbiAgICAgICAgfVxuICAgICAgfSA6IGwocywgdSwgbyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gTnIodCwgZSwgcikge1xuICAgICAgcmV0dXJuIFwiY29sb3JcIiA9PT0gZS50eXBlID8gciA9IHRlLnBhcnNlKHIpIDogXCJmb3JtYXR0ZWRcIiA9PT0gZS50eXBlID8gciA9IG5lLmZyb21TdHJpbmcoci50b1N0cmluZygpKSA6IFwicmVzb2x2ZWRJbWFnZVwiID09PSBlLnR5cGUgPyByID0gaWUuZnJvbVN0cmluZyhyLnRvU3RyaW5nKCkpIDogRHIocikgPT09IGUudHlwZSB8fCBcImVudW1cIiA9PT0gZS50eXBlICYmIGUudmFsdWVzW3JdIHx8IChyID0gdm9pZCAwKSwgUnIociwgdC5kZWZhdWx0LCBlLmRlZmF1bHQpO1xuICAgIH1cblxuICAgIHhlLnJlZ2lzdGVyKElyLCB7XG4gICAgICBlcnJvcjogW3tcbiAgICAgICAga2luZDogXCJlcnJvclwiXG4gICAgICB9LCBbUnRdLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICB0aHJvdyBuZXcgcGUoZVswXS5ldmFsdWF0ZSh0KSk7XG4gICAgICB9XSxcbiAgICAgIHR5cGVvZjogW1J0LCBbTnRdLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gSnQoc2UoZVswXS5ldmFsdWF0ZSh0KSkpO1xuICAgICAgfV0sXG4gICAgICBcInRvLXJnYmFcIjogW1h0KE90LCA0KSwgW2p0XSwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIGVbMF0uZXZhbHVhdGUodCkudG9BcnJheSgpO1xuICAgICAgfV0sXG4gICAgICByZ2I6IFtqdCwgW090LCBPdCwgT3RdLCB6cl0sXG4gICAgICByZ2JhOiBbanQsIFtPdCwgT3QsIE90LCBPdF0sIHpyXSxcbiAgICAgIGhhczoge1xuICAgICAgICB0eXBlOiBVdCxcbiAgICAgICAgb3ZlcmxvYWRzOiBbW1tSdF0sIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgcmV0dXJuIENyKGVbMF0uZXZhbHVhdGUodCksIHQucHJvcGVydGllcygpKTtcbiAgICAgICAgfV0sIFtbUnQsIHF0XSwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICB2YXIgciA9IGVbMV07XG4gICAgICAgICAgcmV0dXJuIENyKGVbMF0uZXZhbHVhdGUodCksIHIuZXZhbHVhdGUodCkpO1xuICAgICAgICB9XV1cbiAgICAgIH0sXG4gICAgICBnZXQ6IHtcbiAgICAgICAgdHlwZTogTnQsXG4gICAgICAgIG92ZXJsb2FkczogW1tbUnRdLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgIHJldHVybiBFcihlWzBdLmV2YWx1YXRlKHQpLCB0LnByb3BlcnRpZXMoKSk7XG4gICAgICAgIH1dLCBbW1J0LCBxdF0sIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgdmFyIHIgPSBlWzFdO1xuICAgICAgICAgIHJldHVybiBFcihlWzBdLmV2YWx1YXRlKHQpLCByLmV2YWx1YXRlKHQpKTtcbiAgICAgICAgfV1dXG4gICAgICB9LFxuICAgICAgXCJmZWF0dXJlLXN0YXRlXCI6IFtOdCwgW1J0XSwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIEVyKGVbMF0uZXZhbHVhdGUodCksIHQuZmVhdHVyZVN0YXRlIHx8IHt9KTtcbiAgICAgIH1dLFxuICAgICAgcHJvcGVydGllczogW3F0LCBbXSwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQucHJvcGVydGllcygpO1xuICAgICAgfV0sXG4gICAgICBcImdlb21ldHJ5LXR5cGVcIjogW1J0LCBbXSwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQuZ2VvbWV0cnlUeXBlKCk7XG4gICAgICB9XSxcbiAgICAgIGlkOiBbTnQsIFtdLCBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdC5pZCgpO1xuICAgICAgfV0sXG4gICAgICB6b29tOiBbT3QsIFtdLCBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdC5nbG9iYWxzLnpvb207XG4gICAgICB9XSxcbiAgICAgIFwiaGVhdG1hcC1kZW5zaXR5XCI6IFtPdCwgW10sIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0Lmdsb2JhbHMuaGVhdG1hcERlbnNpdHkgfHwgMDtcbiAgICAgIH1dLFxuICAgICAgXCJsaW5lLXByb2dyZXNzXCI6IFtPdCwgW10sIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0Lmdsb2JhbHMubGluZVByb2dyZXNzIHx8IDA7XG4gICAgICB9XSxcbiAgICAgIGFjY3VtdWxhdGVkOiBbTnQsIFtdLCBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdm9pZCAwID09PSB0Lmdsb2JhbHMuYWNjdW11bGF0ZWQgPyBudWxsIDogdC5nbG9iYWxzLmFjY3VtdWxhdGVkO1xuICAgICAgfV0sXG4gICAgICBcIitcIjogW090LCBQcihPdCksIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIGZvciAodmFyIHIgPSAwLCBuID0gMCwgaSA9IGU7IG4gPCBpLmxlbmd0aDsgbiArPSAxKSB7XG4gICAgICAgICAgciArPSBpW25dLmV2YWx1YXRlKHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9XSxcbiAgICAgIFwiKlwiOiBbT3QsIFByKE90KSwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgZm9yICh2YXIgciA9IDEsIG4gPSAwLCBpID0gZTsgbiA8IGkubGVuZ3RoOyBuICs9IDEpIHtcbiAgICAgICAgICByICo9IGlbbl0uZXZhbHVhdGUodCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH1dLFxuICAgICAgXCItXCI6IHtcbiAgICAgICAgdHlwZTogT3QsXG4gICAgICAgIG92ZXJsb2FkczogW1tbT3QsIE90XSwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICB2YXIgciA9IGVbMV07XG4gICAgICAgICAgcmV0dXJuIGVbMF0uZXZhbHVhdGUodCkgLSByLmV2YWx1YXRlKHQpO1xuICAgICAgICB9XSwgW1tPdF0sIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgcmV0dXJuIC1lWzBdLmV2YWx1YXRlKHQpO1xuICAgICAgICB9XV1cbiAgICAgIH0sXG4gICAgICBcIi9cIjogW090LCBbT3QsIE90XSwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgdmFyIHIgPSBlWzFdO1xuICAgICAgICByZXR1cm4gZVswXS5ldmFsdWF0ZSh0KSAvIHIuZXZhbHVhdGUodCk7XG4gICAgICB9XSxcbiAgICAgIFwiJVwiOiBbT3QsIFtPdCwgT3RdLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICB2YXIgciA9IGVbMV07XG4gICAgICAgIHJldHVybiBlWzBdLmV2YWx1YXRlKHQpICUgci5ldmFsdWF0ZSh0KTtcbiAgICAgIH1dLFxuICAgICAgbG4yOiBbT3QsIFtdLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBNYXRoLkxOMjtcbiAgICAgIH1dLFxuICAgICAgcGk6IFtPdCwgW10sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguUEk7XG4gICAgICB9XSxcbiAgICAgIGU6IFtPdCwgW10sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguRTtcbiAgICAgIH1dLFxuICAgICAgXCJeXCI6IFtPdCwgW090LCBPdF0sIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHZhciByID0gZVsxXTtcbiAgICAgICAgcmV0dXJuIE1hdGgucG93KGVbMF0uZXZhbHVhdGUodCksIHIuZXZhbHVhdGUodCkpO1xuICAgICAgfV0sXG4gICAgICBzcXJ0OiBbT3QsIFtPdF0sIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnNxcnQoZVswXS5ldmFsdWF0ZSh0KSk7XG4gICAgICB9XSxcbiAgICAgIGxvZzEwOiBbT3QsIFtPdF0sIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmxvZyhlWzBdLmV2YWx1YXRlKHQpKSAvIE1hdGguTE4xMDtcbiAgICAgIH1dLFxuICAgICAgbG46IFtPdCwgW090XSwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgubG9nKGVbMF0uZXZhbHVhdGUodCkpO1xuICAgICAgfV0sXG4gICAgICBsb2cyOiBbT3QsIFtPdF0sIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmxvZyhlWzBdLmV2YWx1YXRlKHQpKSAvIE1hdGguTE4yO1xuICAgICAgfV0sXG4gICAgICBzaW46IFtPdCwgW090XSwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguc2luKGVbMF0uZXZhbHVhdGUodCkpO1xuICAgICAgfV0sXG4gICAgICBjb3M6IFtPdCwgW090XSwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguY29zKGVbMF0uZXZhbHVhdGUodCkpO1xuICAgICAgfV0sXG4gICAgICB0YW46IFtPdCwgW090XSwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgudGFuKGVbMF0uZXZhbHVhdGUodCkpO1xuICAgICAgfV0sXG4gICAgICBhc2luOiBbT3QsIFtPdF0sIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmFzaW4oZVswXS5ldmFsdWF0ZSh0KSk7XG4gICAgICB9XSxcbiAgICAgIGFjb3M6IFtPdCwgW090XSwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguYWNvcyhlWzBdLmV2YWx1YXRlKHQpKTtcbiAgICAgIH1dLFxuICAgICAgYXRhbjogW090LCBbT3RdLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gTWF0aC5hdGFuKGVbMF0uZXZhbHVhdGUodCkpO1xuICAgICAgfV0sXG4gICAgICBtaW46IFtPdCwgUHIoT3QpLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gTWF0aC5taW4uYXBwbHkoTWF0aCwgZS5tYXAoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICByZXR1cm4gZS5ldmFsdWF0ZSh0KTtcbiAgICAgICAgfSkpO1xuICAgICAgfV0sXG4gICAgICBtYXg6IFtPdCwgUHIoT3QpLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gTWF0aC5tYXguYXBwbHkoTWF0aCwgZS5tYXAoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICByZXR1cm4gZS5ldmFsdWF0ZSh0KTtcbiAgICAgICAgfSkpO1xuICAgICAgfV0sXG4gICAgICBhYnM6IFtPdCwgW090XSwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguYWJzKGVbMF0uZXZhbHVhdGUodCkpO1xuICAgICAgfV0sXG4gICAgICByb3VuZDogW090LCBbT3RdLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICB2YXIgciA9IGVbMF0uZXZhbHVhdGUodCk7XG4gICAgICAgIHJldHVybiByIDwgMCA/IC1NYXRoLnJvdW5kKC1yKSA6IE1hdGgucm91bmQocik7XG4gICAgICB9XSxcbiAgICAgIGZsb29yOiBbT3QsIFtPdF0sIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKGVbMF0uZXZhbHVhdGUodCkpO1xuICAgICAgfV0sXG4gICAgICBjZWlsOiBbT3QsIFtPdF0sIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmNlaWwoZVswXS5ldmFsdWF0ZSh0KSk7XG4gICAgICB9XSxcbiAgICAgIFwiZmlsdGVyLT09XCI6IFtVdCwgW1J0LCBOdF0sIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHZhciByID0gZVswXSxcbiAgICAgICAgICAgIG4gPSBlWzFdO1xuICAgICAgICByZXR1cm4gdC5wcm9wZXJ0aWVzKClbci52YWx1ZV0gPT09IG4udmFsdWU7XG4gICAgICB9XSxcbiAgICAgIFwiZmlsdGVyLWlkLT09XCI6IFtVdCwgW050XSwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgdmFyIHIgPSBlWzBdO1xuICAgICAgICByZXR1cm4gdC5pZCgpID09PSByLnZhbHVlO1xuICAgICAgfV0sXG4gICAgICBcImZpbHRlci10eXBlLT09XCI6IFtVdCwgW1J0XSwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgdmFyIHIgPSBlWzBdO1xuICAgICAgICByZXR1cm4gdC5nZW9tZXRyeVR5cGUoKSA9PT0gci52YWx1ZTtcbiAgICAgIH1dLFxuICAgICAgXCJmaWx0ZXItPFwiOiBbVXQsIFtSdCwgTnRdLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICB2YXIgciA9IGVbMF0sXG4gICAgICAgICAgICBuID0gZVsxXSxcbiAgICAgICAgICAgIGkgPSB0LnByb3BlcnRpZXMoKVtyLnZhbHVlXSxcbiAgICAgICAgICAgIGEgPSBuLnZhbHVlO1xuICAgICAgICByZXR1cm4gdHlwZW9mIGkgPT0gdHlwZW9mIGEgJiYgaSA8IGE7XG4gICAgICB9XSxcbiAgICAgIFwiZmlsdGVyLWlkLTxcIjogW1V0LCBbTnRdLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICB2YXIgciA9IGVbMF0sXG4gICAgICAgICAgICBuID0gdC5pZCgpLFxuICAgICAgICAgICAgaSA9IHIudmFsdWU7XG4gICAgICAgIHJldHVybiB0eXBlb2YgbiA9PSB0eXBlb2YgaSAmJiBuIDwgaTtcbiAgICAgIH1dLFxuICAgICAgXCJmaWx0ZXItPlwiOiBbVXQsIFtSdCwgTnRdLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICB2YXIgciA9IGVbMF0sXG4gICAgICAgICAgICBuID0gZVsxXSxcbiAgICAgICAgICAgIGkgPSB0LnByb3BlcnRpZXMoKVtyLnZhbHVlXSxcbiAgICAgICAgICAgIGEgPSBuLnZhbHVlO1xuICAgICAgICByZXR1cm4gdHlwZW9mIGkgPT0gdHlwZW9mIGEgJiYgaSA+IGE7XG4gICAgICB9XSxcbiAgICAgIFwiZmlsdGVyLWlkLT5cIjogW1V0LCBbTnRdLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICB2YXIgciA9IGVbMF0sXG4gICAgICAgICAgICBuID0gdC5pZCgpLFxuICAgICAgICAgICAgaSA9IHIudmFsdWU7XG4gICAgICAgIHJldHVybiB0eXBlb2YgbiA9PSB0eXBlb2YgaSAmJiBuID4gaTtcbiAgICAgIH1dLFxuICAgICAgXCJmaWx0ZXItPD1cIjogW1V0LCBbUnQsIE50XSwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgdmFyIHIgPSBlWzBdLFxuICAgICAgICAgICAgbiA9IGVbMV0sXG4gICAgICAgICAgICBpID0gdC5wcm9wZXJ0aWVzKClbci52YWx1ZV0sXG4gICAgICAgICAgICBhID0gbi52YWx1ZTtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBpID09IHR5cGVvZiBhICYmIGkgPD0gYTtcbiAgICAgIH1dLFxuICAgICAgXCJmaWx0ZXItaWQtPD1cIjogW1V0LCBbTnRdLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICB2YXIgciA9IGVbMF0sXG4gICAgICAgICAgICBuID0gdC5pZCgpLFxuICAgICAgICAgICAgaSA9IHIudmFsdWU7XG4gICAgICAgIHJldHVybiB0eXBlb2YgbiA9PSB0eXBlb2YgaSAmJiBuIDw9IGk7XG4gICAgICB9XSxcbiAgICAgIFwiZmlsdGVyLT49XCI6IFtVdCwgW1J0LCBOdF0sIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHZhciByID0gZVswXSxcbiAgICAgICAgICAgIG4gPSBlWzFdLFxuICAgICAgICAgICAgaSA9IHQucHJvcGVydGllcygpW3IudmFsdWVdLFxuICAgICAgICAgICAgYSA9IG4udmFsdWU7XG4gICAgICAgIHJldHVybiB0eXBlb2YgaSA9PSB0eXBlb2YgYSAmJiBpID49IGE7XG4gICAgICB9XSxcbiAgICAgIFwiZmlsdGVyLWlkLT49XCI6IFtVdCwgW050XSwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgdmFyIHIgPSBlWzBdLFxuICAgICAgICAgICAgbiA9IHQuaWQoKSxcbiAgICAgICAgICAgIGkgPSByLnZhbHVlO1xuICAgICAgICByZXR1cm4gdHlwZW9mIG4gPT0gdHlwZW9mIGkgJiYgbiA+PSBpO1xuICAgICAgfV0sXG4gICAgICBcImZpbHRlci1oYXNcIjogW1V0LCBbTnRdLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gZVswXS52YWx1ZSBpbiB0LnByb3BlcnRpZXMoKTtcbiAgICAgIH1dLFxuICAgICAgXCJmaWx0ZXItaGFzLWlkXCI6IFtVdCwgW10sIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiBudWxsICE9PSB0LmlkKCkgJiYgdm9pZCAwICE9PSB0LmlkKCk7XG4gICAgICB9XSxcbiAgICAgIFwiZmlsdGVyLXR5cGUtaW5cIjogW1V0LCBbWHQoUnQpXSwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIGVbMF0udmFsdWUuaW5kZXhPZih0Lmdlb21ldHJ5VHlwZSgpKSA+PSAwO1xuICAgICAgfV0sXG4gICAgICBcImZpbHRlci1pZC1pblwiOiBbVXQsIFtYdChOdCldLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gZVswXS52YWx1ZS5pbmRleE9mKHQuaWQoKSkgPj0gMDtcbiAgICAgIH1dLFxuICAgICAgXCJmaWx0ZXItaW4tc21hbGxcIjogW1V0LCBbUnQsIFh0KE50KV0sIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHZhciByID0gZVswXTtcbiAgICAgICAgcmV0dXJuIGVbMV0udmFsdWUuaW5kZXhPZih0LnByb3BlcnRpZXMoKVtyLnZhbHVlXSkgPj0gMDtcbiAgICAgIH1dLFxuICAgICAgXCJmaWx0ZXItaW4tbGFyZ2VcIjogW1V0LCBbUnQsIFh0KE50KV0sIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHZhciByID0gZVswXSxcbiAgICAgICAgICAgIG4gPSBlWzFdO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHQsIGUsIHIsIG4pIHtcbiAgICAgICAgICBmb3IgKDsgciA8PSBuOykge1xuICAgICAgICAgICAgdmFyIGkgPSByICsgbiA+PiAxO1xuICAgICAgICAgICAgaWYgKGVbaV0gPT09IHQpIHJldHVybiAhMDtcbiAgICAgICAgICAgIGVbaV0gPiB0ID8gbiA9IGkgLSAxIDogciA9IGkgKyAxO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgfSh0LnByb3BlcnRpZXMoKVtyLnZhbHVlXSwgbi52YWx1ZSwgMCwgbi52YWx1ZS5sZW5ndGggLSAxKTtcbiAgICAgIH1dLFxuICAgICAgYWxsOiB7XG4gICAgICAgIHR5cGU6IFV0LFxuICAgICAgICBvdmVybG9hZHM6IFtbW1V0LCBVdF0sIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgdmFyIHIgPSBlWzFdO1xuICAgICAgICAgIHJldHVybiBlWzBdLmV2YWx1YXRlKHQpICYmIHIuZXZhbHVhdGUodCk7XG4gICAgICAgIH1dLCBbUHIoVXQpLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgIGZvciAodmFyIHIgPSAwLCBuID0gZTsgciA8IG4ubGVuZ3RoOyByICs9IDEpIHtcbiAgICAgICAgICAgIGlmICghbltyXS5ldmFsdWF0ZSh0KSkgcmV0dXJuICExO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgfV1dXG4gICAgICB9LFxuICAgICAgYW55OiB7XG4gICAgICAgIHR5cGU6IFV0LFxuICAgICAgICBvdmVybG9hZHM6IFtbW1V0LCBVdF0sIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgdmFyIHIgPSBlWzFdO1xuICAgICAgICAgIHJldHVybiBlWzBdLmV2YWx1YXRlKHQpIHx8IHIuZXZhbHVhdGUodCk7XG4gICAgICAgIH1dLCBbUHIoVXQpLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgIGZvciAodmFyIHIgPSAwLCBuID0gZTsgciA8IG4ubGVuZ3RoOyByICs9IDEpIHtcbiAgICAgICAgICAgIGlmIChuW3JdLmV2YWx1YXRlKHQpKSByZXR1cm4gITA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuICExO1xuICAgICAgICB9XV1cbiAgICAgIH0sXG4gICAgICBcIiFcIjogW1V0LCBbVXRdLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gIWVbMF0uZXZhbHVhdGUodCk7XG4gICAgICB9XSxcbiAgICAgIFwiaXMtc3VwcG9ydGVkLXNjcmlwdFwiOiBbVXQsIFtSdF0sIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHZhciByID0gdC5nbG9iYWxzICYmIHQuZ2xvYmFscy5pc1N1cHBvcnRlZFNjcmlwdDtcbiAgICAgICAgcmV0dXJuICFyIHx8IHIoZVswXS5ldmFsdWF0ZSh0KSk7XG4gICAgICB9XSxcbiAgICAgIHVwY2FzZTogW1J0LCBbUnRdLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gZVswXS5ldmFsdWF0ZSh0KS50b1VwcGVyQ2FzZSgpO1xuICAgICAgfV0sXG4gICAgICBkb3duY2FzZTogW1J0LCBbUnRdLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gZVswXS5ldmFsdWF0ZSh0KS50b0xvd2VyQ2FzZSgpO1xuICAgICAgfV0sXG4gICAgICBjb25jYXQ6IFtSdCwgUHIoTnQpLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gZS5tYXAoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICByZXR1cm4gdWUoZS5ldmFsdWF0ZSh0KSk7XG4gICAgICAgIH0pLmpvaW4oXCJcIik7XG4gICAgICB9XSxcbiAgICAgIFwicmVzb2x2ZWQtbG9jYWxlXCI6IFtSdCwgW0t0XSwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIGVbMF0uZXZhbHVhdGUodCkucmVzb2x2ZWRMb2NhbGUoKTtcbiAgICAgIH1dXG4gICAgfSk7XG5cbiAgICB2YXIgS3IgPSBmdW5jdGlvbiBLcih0LCBlKSB7XG4gICAgICB0aGlzLmV4cHJlc3Npb24gPSB0LCB0aGlzLl93YXJuaW5nSGlzdG9yeSA9IHt9LCB0aGlzLl9ldmFsdWF0b3IgPSBuZXcgZ2UoKSwgdGhpcy5fZGVmYXVsdFZhbHVlID0gZSA/IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiBcImNvbG9yXCIgPT09IHQudHlwZSAmJiBMcih0LmRlZmF1bHQpID8gbmV3IHRlKDAsIDAsIDAsIDApIDogXCJjb2xvclwiID09PSB0LnR5cGUgPyB0ZS5wYXJzZSh0LmRlZmF1bHQpIHx8IG51bGwgOiB2b2lkIDAgPT09IHQuZGVmYXVsdCA/IG51bGwgOiB0LmRlZmF1bHQ7XG4gICAgICB9KGUpIDogbnVsbCwgdGhpcy5fZW51bVZhbHVlcyA9IGUgJiYgXCJlbnVtXCIgPT09IGUudHlwZSA/IGUudmFsdWVzIDogbnVsbDtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gR3IodCkge1xuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodCkgJiYgdC5sZW5ndGggPiAwICYmIFwic3RyaW5nXCIgPT0gdHlwZW9mIHRbMF0gJiYgdFswXSBpbiBJcjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBacih0LCBlKSB7XG4gICAgICB2YXIgciA9IG5ldyBqZShJciwgW10sIGUgPyBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgZSA9IHtcbiAgICAgICAgICBjb2xvcjoganQsXG4gICAgICAgICAgc3RyaW5nOiBSdCxcbiAgICAgICAgICBudW1iZXI6IE90LFxuICAgICAgICAgIGVudW06IFJ0LFxuICAgICAgICAgIGJvb2xlYW46IFV0LFxuICAgICAgICAgIGZvcm1hdHRlZDogR3QsXG4gICAgICAgICAgcmVzb2x2ZWRJbWFnZTogWnRcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIFwiYXJyYXlcIiA9PT0gdC50eXBlID8gWHQoZVt0LnZhbHVlXSB8fCBOdCwgdC5sZW5ndGgpIDogZVt0LnR5cGVdO1xuICAgICAgfShlKSA6IHZvaWQgMCksXG4gICAgICAgICAgbiA9IHIucGFyc2UodCwgdm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZSAmJiBcInN0cmluZ1wiID09PSBlLnR5cGUgPyB7XG4gICAgICAgIHR5cGVBbm5vdGF0aW9uOiBcImNvZXJjZVwiXG4gICAgICB9IDogdm9pZCAwKTtcbiAgICAgIHJldHVybiBuID8gTXIobmV3IEtyKG4sIGUpKSA6IEJyKHIuZXJyb3JzKTtcbiAgICB9XG5cbiAgICBLci5wcm90b3R5cGUuZXZhbHVhdGVXaXRob3V0RXJyb3JIYW5kbGluZyA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpLCBhKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZXZhbHVhdG9yLmdsb2JhbHMgPSB0LCB0aGlzLl9ldmFsdWF0b3IuZmVhdHVyZSA9IGUsIHRoaXMuX2V2YWx1YXRvci5mZWF0dXJlU3RhdGUgPSByLCB0aGlzLl9ldmFsdWF0b3IuY2Fub25pY2FsID0gbiwgdGhpcy5fZXZhbHVhdG9yLmF2YWlsYWJsZUltYWdlcyA9IGkgfHwgbnVsbCwgdGhpcy5fZXZhbHVhdG9yLmZvcm1hdHRlZFNlY3Rpb24gPSBhLCB0aGlzLmV4cHJlc3Npb24uZXZhbHVhdGUodGhpcy5fZXZhbHVhdG9yKTtcbiAgICB9LCBLci5wcm90b3R5cGUuZXZhbHVhdGUgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSwgYSkge1xuICAgICAgdGhpcy5fZXZhbHVhdG9yLmdsb2JhbHMgPSB0LCB0aGlzLl9ldmFsdWF0b3IuZmVhdHVyZSA9IGUgfHwgbnVsbCwgdGhpcy5fZXZhbHVhdG9yLmZlYXR1cmVTdGF0ZSA9IHIgfHwgbnVsbCwgdGhpcy5fZXZhbHVhdG9yLmNhbm9uaWNhbCA9IG4sIHRoaXMuX2V2YWx1YXRvci5hdmFpbGFibGVJbWFnZXMgPSBpIHx8IG51bGwsIHRoaXMuX2V2YWx1YXRvci5mb3JtYXR0ZWRTZWN0aW9uID0gYSB8fCBudWxsO1xuXG4gICAgICB0cnkge1xuICAgICAgICB2YXIgbyA9IHRoaXMuZXhwcmVzc2lvbi5ldmFsdWF0ZSh0aGlzLl9ldmFsdWF0b3IpO1xuICAgICAgICBpZiAobnVsbCA9PSBvIHx8IFwibnVtYmVyXCIgPT0gdHlwZW9mIG8gJiYgbyAhPSBvKSByZXR1cm4gdGhpcy5fZGVmYXVsdFZhbHVlO1xuICAgICAgICBpZiAodGhpcy5fZW51bVZhbHVlcyAmJiAhKG8gaW4gdGhpcy5fZW51bVZhbHVlcykpIHRocm93IG5ldyBwZShcIkV4cGVjdGVkIHZhbHVlIHRvIGJlIG9uZSBvZiBcIiArIE9iamVjdC5rZXlzKHRoaXMuX2VudW1WYWx1ZXMpLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0KTtcbiAgICAgICAgfSkuam9pbihcIiwgXCIpICsgXCIsIGJ1dCBmb3VuZCBcIiArIEpTT04uc3RyaW5naWZ5KG8pICsgXCIgaW5zdGVhZC5cIik7XG4gICAgICAgIHJldHVybiBvO1xuICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2FybmluZ0hpc3RvcnlbdC5tZXNzYWdlXSB8fCAodGhpcy5fd2FybmluZ0hpc3RvcnlbdC5tZXNzYWdlXSA9ICEwLCBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBjb25zb2xlICYmIGNvbnNvbGUud2Fybih0Lm1lc3NhZ2UpKSwgdGhpcy5fZGVmYXVsdFZhbHVlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgWHIgPSBmdW5jdGlvbiBYcih0LCBlKSB7XG4gICAgICB0aGlzLmtpbmQgPSB0LCB0aGlzLl9zdHlsZUV4cHJlc3Npb24gPSBlLCB0aGlzLmlzU3RhdGVEZXBlbmRlbnQgPSBcImNvbnN0YW50XCIgIT09IHQgJiYgIU9lKGUuZXhwcmVzc2lvbik7XG4gICAgfTtcblxuICAgIFhyLnByb3RvdHlwZS5ldmFsdWF0ZVdpdGhvdXRFcnJvckhhbmRsaW5nID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGksIGEpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zdHlsZUV4cHJlc3Npb24uZXZhbHVhdGVXaXRob3V0RXJyb3JIYW5kbGluZyh0LCBlLCByLCBuLCBpLCBhKTtcbiAgICB9LCBYci5wcm90b3R5cGUuZXZhbHVhdGUgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSwgYSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3N0eWxlRXhwcmVzc2lvbi5ldmFsdWF0ZSh0LCBlLCByLCBuLCBpLCBhKTtcbiAgICB9O1xuXG4gICAgdmFyIEpyID0gZnVuY3Rpb24gSnIodCwgZSwgciwgbikge1xuICAgICAgdGhpcy5raW5kID0gdCwgdGhpcy56b29tU3RvcHMgPSByLCB0aGlzLl9zdHlsZUV4cHJlc3Npb24gPSBlLCB0aGlzLmlzU3RhdGVEZXBlbmRlbnQgPSBcImNhbWVyYVwiICE9PSB0ICYmICFPZShlLmV4cHJlc3Npb24pLCB0aGlzLmludGVycG9sYXRpb25UeXBlID0gbjtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gSHIodCwgZSkge1xuICAgICAgaWYgKFwiZXJyb3JcIiA9PT0gKHQgPSBacih0LCBlKSkucmVzdWx0KSByZXR1cm4gdDtcbiAgICAgIHZhciByID0gdC52YWx1ZS5leHByZXNzaW9uLFxuICAgICAgICAgIG4gPSBMZShyKTtcbiAgICAgIGlmICghbiAmJiAhVHIoZSkpIHJldHVybiBCcihbbmV3IEZ0KFwiXCIsIFwiZGF0YSBleHByZXNzaW9ucyBub3Qgc3VwcG9ydGVkXCIpXSk7XG4gICAgICB2YXIgaSA9IFJlKHIsIFtcInpvb21cIl0pO1xuICAgICAgaWYgKCFpICYmICFWcihlKSkgcmV0dXJuIEJyKFtuZXcgRnQoXCJcIiwgXCJ6b29tIGV4cHJlc3Npb25zIG5vdCBzdXBwb3J0ZWRcIildKTtcblxuICAgICAgdmFyIGEgPSBmdW5jdGlvbiB0KGUpIHtcbiAgICAgICAgdmFyIHIgPSBudWxsO1xuICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIHVyKSByID0gdChlLnJlc3VsdCk7ZWxzZSBpZiAoZSBpbnN0YW5jZW9mIHNyKSBmb3IgKHZhciBuID0gMCwgaSA9IGUuYXJnczsgbiA8IGkubGVuZ3RoICYmICEociA9IHQoaVtuXSkpOyBuICs9IDEpIHtcbiAgICAgICAgICA7XG4gICAgICAgIH0gZWxzZSAoZSBpbnN0YW5jZW9mIE5lIHx8IGUgaW5zdGFuY2VvZiBhcikgJiYgZS5pbnB1dCBpbnN0YW5jZW9mIHhlICYmIFwiem9vbVwiID09PSBlLmlucHV0Lm5hbWUgJiYgKHIgPSBlKTtcbiAgICAgICAgcmV0dXJuIHIgaW5zdGFuY2VvZiBGdCB8fCBlLmVhY2hDaGlsZChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIHZhciBuID0gdChlKTtcbiAgICAgICAgICBuIGluc3RhbmNlb2YgRnQgPyByID0gbiA6ICFyICYmIG4gPyByID0gbmV3IEZ0KFwiXCIsICdcInpvb21cIiBleHByZXNzaW9uIG1heSBvbmx5IGJlIHVzZWQgYXMgaW5wdXQgdG8gYSB0b3AtbGV2ZWwgXCJzdGVwXCIgb3IgXCJpbnRlcnBvbGF0ZVwiIGV4cHJlc3Npb24uJykgOiByICYmIG4gJiYgciAhPT0gbiAmJiAociA9IG5ldyBGdChcIlwiLCAnT25seSBvbmUgem9vbS1iYXNlZCBcInN0ZXBcIiBvciBcImludGVycG9sYXRlXCIgc3ViZXhwcmVzc2lvbiBtYXkgYmUgdXNlZCBpbiBhbiBleHByZXNzaW9uLicpKTtcbiAgICAgICAgfSksIHI7XG4gICAgICB9KHIpO1xuXG4gICAgICByZXR1cm4gYSB8fCBpID8gYSBpbnN0YW5jZW9mIEZ0ID8gQnIoW2FdKSA6IGEgaW5zdGFuY2VvZiBhciAmJiAhRnIoZSkgPyBCcihbbmV3IEZ0KFwiXCIsICdcImludGVycG9sYXRlXCIgZXhwcmVzc2lvbnMgY2Fubm90IGJlIHVzZWQgd2l0aCB0aGlzIHByb3BlcnR5JyldKSA6IE1yKGEgPyBuZXcgSnIobiA/IFwiY2FtZXJhXCIgOiBcImNvbXBvc2l0ZVwiLCB0LnZhbHVlLCBhLmxhYmVscywgYSBpbnN0YW5jZW9mIGFyID8gYS5pbnRlcnBvbGF0aW9uIDogdm9pZCAwKSA6IG5ldyBYcihuID8gXCJjb25zdGFudFwiIDogXCJzb3VyY2VcIiwgdC52YWx1ZSkpIDogQnIoW25ldyBGdChcIlwiLCAnXCJ6b29tXCIgZXhwcmVzc2lvbiBtYXkgb25seSBiZSB1c2VkIGFzIGlucHV0IHRvIGEgdG9wLWxldmVsIFwic3RlcFwiIG9yIFwiaW50ZXJwb2xhdGVcIiBleHByZXNzaW9uLicpXSk7XG4gICAgfVxuXG4gICAgSnIucHJvdG90eXBlLmV2YWx1YXRlV2l0aG91dEVycm9ySGFuZGxpbmcgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSwgYSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3N0eWxlRXhwcmVzc2lvbi5ldmFsdWF0ZVdpdGhvdXRFcnJvckhhbmRsaW5nKHQsIGUsIHIsIG4sIGksIGEpO1xuICAgIH0sIEpyLnByb3RvdHlwZS5ldmFsdWF0ZSA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpLCBhKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc3R5bGVFeHByZXNzaW9uLmV2YWx1YXRlKHQsIGUsIHIsIG4sIGksIGEpO1xuICAgIH0sIEpyLnByb3RvdHlwZS5pbnRlcnBvbGF0aW9uRmFjdG9yID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgIHJldHVybiB0aGlzLmludGVycG9sYXRpb25UeXBlID8gYXIuaW50ZXJwb2xhdGlvbkZhY3Rvcih0aGlzLmludGVycG9sYXRpb25UeXBlLCB0LCBlLCByKSA6IDA7XG4gICAgfTtcblxuICAgIHZhciBZciA9IGZ1bmN0aW9uIFlyKHQsIGUpIHtcbiAgICAgIHRoaXMuX3BhcmFtZXRlcnMgPSB0LCB0aGlzLl9zcGVjaWZpY2F0aW9uID0gZSwgQnQodGhpcywgZnVuY3Rpb24gdChlLCByKSB7XG4gICAgICAgIHZhciBuLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIGEsXG4gICAgICAgICAgICBvID0gXCJjb2xvclwiID09PSByLnR5cGUsXG4gICAgICAgICAgICBzID0gZS5zdG9wcyAmJiBcIm9iamVjdFwiID09IHR5cGVvZiBlLnN0b3BzWzBdWzBdLFxuICAgICAgICAgICAgdSA9IHMgfHwgIShzIHx8IHZvaWQgMCAhPT0gZS5wcm9wZXJ0eSksXG4gICAgICAgICAgICBsID0gZS50eXBlIHx8IChGcihyKSA/IFwiZXhwb25lbnRpYWxcIiA6IFwiaW50ZXJ2YWxcIik7XG4gICAgICAgIGlmIChvICYmICgoZSA9IEJ0KHt9LCBlKSkuc3RvcHMgJiYgKGUuc3RvcHMgPSBlLnN0b3BzLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHJldHVybiBbdFswXSwgdGUucGFyc2UodFsxXSldO1xuICAgICAgICB9KSksIGUuZGVmYXVsdCA9IHRlLnBhcnNlKGUuZGVmYXVsdCA/IGUuZGVmYXVsdCA6IHIuZGVmYXVsdCkpLCBlLmNvbG9yU3BhY2UgJiYgXCJyZ2JcIiAhPT0gZS5jb2xvclNwYWNlICYmICFpcltlLmNvbG9yU3BhY2VdKSB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGNvbG9yIHNwYWNlOiBcIiArIGUuY29sb3JTcGFjZSk7XG4gICAgICAgIGlmIChcImV4cG9uZW50aWFsXCIgPT09IGwpIG4gPSBxcjtlbHNlIGlmIChcImludGVydmFsXCIgPT09IGwpIG4gPSBqcjtlbHNlIGlmIChcImNhdGVnb3JpY2FsXCIgPT09IGwpIHtcbiAgICAgICAgICBuID0gVXIsIGkgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgICAgICAgZm9yICh2YXIgcCA9IDAsIGMgPSBlLnN0b3BzOyBwIDwgYy5sZW5ndGg7IHAgKz0gMSkge1xuICAgICAgICAgICAgdmFyIGggPSBjW3BdO1xuICAgICAgICAgICAgaVtoWzBdXSA9IGhbMV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYSA9IHR5cGVvZiBlLnN0b3BzWzBdWzBdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChcImlkZW50aXR5XCIgIT09IGwpIHRocm93IG5ldyBFcnJvcignVW5rbm93biBmdW5jdGlvbiB0eXBlIFwiJyArIGwgKyAnXCInKTtcbiAgICAgICAgICBuID0gTnI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocykge1xuICAgICAgICAgIGZvciAodmFyIGYgPSB7fSwgeSA9IFtdLCBkID0gMDsgZCA8IGUuc3RvcHMubGVuZ3RoOyBkKyspIHtcbiAgICAgICAgICAgIHZhciBtID0gZS5zdG9wc1tkXSxcbiAgICAgICAgICAgICAgICB2ID0gbVswXS56b29tO1xuICAgICAgICAgICAgdm9pZCAwID09PSBmW3ZdICYmIChmW3ZdID0ge1xuICAgICAgICAgICAgICB6b29tOiB2LFxuICAgICAgICAgICAgICB0eXBlOiBlLnR5cGUsXG4gICAgICAgICAgICAgIHByb3BlcnR5OiBlLnByb3BlcnR5LFxuICAgICAgICAgICAgICBkZWZhdWx0OiBlLmRlZmF1bHQsXG4gICAgICAgICAgICAgIHN0b3BzOiBbXVxuICAgICAgICAgICAgfSwgeS5wdXNoKHYpKSwgZlt2XS5zdG9wcy5wdXNoKFttWzBdLnZhbHVlLCBtWzFdXSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yICh2YXIgZyA9IFtdLCB4ID0gMCwgYiA9IHk7IHggPCBiLmxlbmd0aDsgeCArPSAxKSB7XG4gICAgICAgICAgICB2YXIgdyA9IGJbeF07XG4gICAgICAgICAgICBnLnB1c2goW2Zbd10uem9vbSwgdChmW3ddLCByKV0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBfID0ge1xuICAgICAgICAgICAgbmFtZTogXCJsaW5lYXJcIlxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGtpbmQ6IFwiY29tcG9zaXRlXCIsXG4gICAgICAgICAgICBpbnRlcnBvbGF0aW9uVHlwZTogXyxcbiAgICAgICAgICAgIGludGVycG9sYXRpb25GYWN0b3I6IGFyLmludGVycG9sYXRpb25GYWN0b3IuYmluZCh2b2lkIDAsIF8pLFxuICAgICAgICAgICAgem9vbVN0b3BzOiBnLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICByZXR1cm4gdFswXTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgZXZhbHVhdGU6IGZ1bmN0aW9uIGV2YWx1YXRlKHQsIG4pIHtcbiAgICAgICAgICAgICAgdmFyIGkgPSB0Lnpvb207XG4gICAgICAgICAgICAgIHJldHVybiBxcih7XG4gICAgICAgICAgICAgICAgc3RvcHM6IGcsXG4gICAgICAgICAgICAgICAgYmFzZTogZS5iYXNlXG4gICAgICAgICAgICAgIH0sIHIsIGkpLmV2YWx1YXRlKGksIG4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodSkge1xuICAgICAgICAgIHZhciBBID0gXCJleHBvbmVudGlhbFwiID09PSBsID8ge1xuICAgICAgICAgICAgbmFtZTogXCJleHBvbmVudGlhbFwiLFxuICAgICAgICAgICAgYmFzZTogdm9pZCAwICE9PSBlLmJhc2UgPyBlLmJhc2UgOiAxXG4gICAgICAgICAgfSA6IG51bGw7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGtpbmQ6IFwiY2FtZXJhXCIsXG4gICAgICAgICAgICBpbnRlcnBvbGF0aW9uVHlwZTogQSxcbiAgICAgICAgICAgIGludGVycG9sYXRpb25GYWN0b3I6IGFyLmludGVycG9sYXRpb25GYWN0b3IuYmluZCh2b2lkIDAsIEEpLFxuICAgICAgICAgICAgem9vbVN0b3BzOiBlLnN0b3BzLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICByZXR1cm4gdFswXTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgZXZhbHVhdGU6IGZ1bmN0aW9uIGV2YWx1YXRlKHQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG4oZSwgciwgdC56b29tLCBpLCBhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBraW5kOiBcInNvdXJjZVwiLFxuICAgICAgICAgIGV2YWx1YXRlOiBmdW5jdGlvbiBldmFsdWF0ZSh0LCBvKSB7XG4gICAgICAgICAgICB2YXIgcyA9IG8gJiYgby5wcm9wZXJ0aWVzID8gby5wcm9wZXJ0aWVzW2UucHJvcGVydHldIDogdm9pZCAwO1xuICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gcyA/IFJyKGUuZGVmYXVsdCwgci5kZWZhdWx0KSA6IG4oZSwgciwgcywgaSwgYSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSh0aGlzLl9wYXJhbWV0ZXJzLCB0aGlzLl9zcGVjaWZpY2F0aW9uKSk7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uICRyKHQpIHtcbiAgICAgIHZhciBlID0gdC5rZXksXG4gICAgICAgICAgciA9IHQudmFsdWUsXG4gICAgICAgICAgbiA9IHQudmFsdWVTcGVjIHx8IHt9LFxuICAgICAgICAgIGkgPSB0Lm9iamVjdEVsZW1lbnRWYWxpZGF0b3JzIHx8IHt9LFxuICAgICAgICAgIGEgPSB0LnN0eWxlLFxuICAgICAgICAgIG8gPSB0LnN0eWxlU3BlYyxcbiAgICAgICAgICBzID0gW10sXG4gICAgICAgICAgdSA9IERyKHIpO1xuICAgICAgaWYgKFwib2JqZWN0XCIgIT09IHUpIHJldHVybiBbbmV3IFB0KGUsIHIsIFwib2JqZWN0IGV4cGVjdGVkLCBcIiArIHUgKyBcIiBmb3VuZFwiKV07XG5cbiAgICAgIGZvciAodmFyIGwgaW4gcikge1xuICAgICAgICB2YXIgcCA9IGwuc3BsaXQoXCIuXCIpWzBdLFxuICAgICAgICAgICAgYyA9IG5bcF0gfHwgbltcIipcIl0sXG4gICAgICAgICAgICBoID0gdm9pZCAwO1xuICAgICAgICBpZiAoaVtwXSkgaCA9IGlbcF07ZWxzZSBpZiAobltwXSkgaCA9IEFuO2Vsc2UgaWYgKGlbXCIqXCJdKSBoID0gaVtcIipcIl07ZWxzZSB7XG4gICAgICAgICAgaWYgKCFuW1wiKlwiXSkge1xuICAgICAgICAgICAgcy5wdXNoKG5ldyBQdChlLCByW2xdLCAndW5rbm93biBwcm9wZXJ0eSBcIicgKyBsICsgJ1wiJykpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaCA9IEFuO1xuICAgICAgICB9XG4gICAgICAgIHMgPSBzLmNvbmNhdChoKHtcbiAgICAgICAgICBrZXk6IChlID8gZSArIFwiLlwiIDogZSkgKyBsLFxuICAgICAgICAgIHZhbHVlOiByW2xdLFxuICAgICAgICAgIHZhbHVlU3BlYzogYyxcbiAgICAgICAgICBzdHlsZTogYSxcbiAgICAgICAgICBzdHlsZVNwZWM6IG8sXG4gICAgICAgICAgb2JqZWN0OiByLFxuICAgICAgICAgIG9iamVjdEtleTogbFxuICAgICAgICB9LCByKSk7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGYgaW4gbikge1xuICAgICAgICBpW2ZdIHx8IG5bZl0ucmVxdWlyZWQgJiYgdm9pZCAwID09PSBuW2ZdLmRlZmF1bHQgJiYgdm9pZCAwID09PSByW2ZdICYmIHMucHVzaChuZXcgUHQoZSwgciwgJ21pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgXCInICsgZiArICdcIicpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gV3IodCkge1xuICAgICAgdmFyIGUgPSB0LnZhbHVlLFxuICAgICAgICAgIHIgPSB0LnZhbHVlU3BlYyxcbiAgICAgICAgICBuID0gdC5zdHlsZSxcbiAgICAgICAgICBpID0gdC5zdHlsZVNwZWMsXG4gICAgICAgICAgYSA9IHQua2V5LFxuICAgICAgICAgIG8gPSB0LmFycmF5RWxlbWVudFZhbGlkYXRvciB8fCBBbjtcbiAgICAgIGlmIChcImFycmF5XCIgIT09IERyKGUpKSByZXR1cm4gW25ldyBQdChhLCBlLCBcImFycmF5IGV4cGVjdGVkLCBcIiArIERyKGUpICsgXCIgZm91bmRcIildO1xuICAgICAgaWYgKHIubGVuZ3RoICYmIGUubGVuZ3RoICE9PSByLmxlbmd0aCkgcmV0dXJuIFtuZXcgUHQoYSwgZSwgXCJhcnJheSBsZW5ndGggXCIgKyByLmxlbmd0aCArIFwiIGV4cGVjdGVkLCBsZW5ndGggXCIgKyBlLmxlbmd0aCArIFwiIGZvdW5kXCIpXTtcbiAgICAgIGlmIChyW1wibWluLWxlbmd0aFwiXSAmJiBlLmxlbmd0aCA8IHJbXCJtaW4tbGVuZ3RoXCJdKSByZXR1cm4gW25ldyBQdChhLCBlLCBcImFycmF5IGxlbmd0aCBhdCBsZWFzdCBcIiArIHJbXCJtaW4tbGVuZ3RoXCJdICsgXCIgZXhwZWN0ZWQsIGxlbmd0aCBcIiArIGUubGVuZ3RoICsgXCIgZm91bmRcIildO1xuICAgICAgdmFyIHMgPSB7XG4gICAgICAgIHR5cGU6IHIudmFsdWUsXG4gICAgICAgIHZhbHVlczogci52YWx1ZXNcbiAgICAgIH07XG4gICAgICBpLiR2ZXJzaW9uIDwgNyAmJiAocy5mdW5jdGlvbiA9IHIuZnVuY3Rpb24pLCBcIm9iamVjdFwiID09PSBEcihyLnZhbHVlKSAmJiAocyA9IHIudmFsdWUpO1xuXG4gICAgICBmb3IgKHZhciB1ID0gW10sIGwgPSAwOyBsIDwgZS5sZW5ndGg7IGwrKykge1xuICAgICAgICB1ID0gdS5jb25jYXQobyh7XG4gICAgICAgICAgYXJyYXk6IGUsXG4gICAgICAgICAgYXJyYXlJbmRleDogbCxcbiAgICAgICAgICB2YWx1ZTogZVtsXSxcbiAgICAgICAgICB2YWx1ZVNwZWM6IHMsXG4gICAgICAgICAgc3R5bGU6IG4sXG4gICAgICAgICAgc3R5bGVTcGVjOiBpLFxuICAgICAgICAgIGtleTogYSArIFwiW1wiICsgbCArIFwiXVwiXG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gUXIodCkge1xuICAgICAgdmFyIGUgPSB0LmtleSxcbiAgICAgICAgICByID0gdC52YWx1ZSxcbiAgICAgICAgICBuID0gdC52YWx1ZVNwZWMsXG4gICAgICAgICAgaSA9IERyKHIpO1xuICAgICAgcmV0dXJuIFwibnVtYmVyXCIgPT09IGkgJiYgciAhPSByICYmIChpID0gXCJOYU5cIiksIFwibnVtYmVyXCIgIT09IGkgPyBbbmV3IFB0KGUsIHIsIFwibnVtYmVyIGV4cGVjdGVkLCBcIiArIGkgKyBcIiBmb3VuZFwiKV0gOiBcIm1pbmltdW1cIiBpbiBuICYmIHIgPCBuLm1pbmltdW0gPyBbbmV3IFB0KGUsIHIsIHIgKyBcIiBpcyBsZXNzIHRoYW4gdGhlIG1pbmltdW0gdmFsdWUgXCIgKyBuLm1pbmltdW0pXSA6IFwibWF4aW11bVwiIGluIG4gJiYgciA+IG4ubWF4aW11bSA/IFtuZXcgUHQoZSwgciwgciArIFwiIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bSB2YWx1ZSBcIiArIG4ubWF4aW11bSldIDogW107XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG4odCkge1xuICAgICAgdmFyIGUsXG4gICAgICAgICAgcixcbiAgICAgICAgICBuLFxuICAgICAgICAgIGkgPSB0LnZhbHVlU3BlYyxcbiAgICAgICAgICBhID0gVHQodC52YWx1ZS50eXBlKSxcbiAgICAgICAgICBvID0ge30sXG4gICAgICAgICAgcyA9IFwiY2F0ZWdvcmljYWxcIiAhPT0gYSAmJiB2b2lkIDAgPT09IHQudmFsdWUucHJvcGVydHksXG4gICAgICAgICAgdSA9ICFzLFxuICAgICAgICAgIGwgPSBcImFycmF5XCIgPT09IERyKHQudmFsdWUuc3RvcHMpICYmIFwiYXJyYXlcIiA9PT0gRHIodC52YWx1ZS5zdG9wc1swXSkgJiYgXCJvYmplY3RcIiA9PT0gRHIodC52YWx1ZS5zdG9wc1swXVswXSksXG4gICAgICAgICAgcCA9ICRyKHtcbiAgICAgICAga2V5OiB0LmtleSxcbiAgICAgICAgdmFsdWU6IHQudmFsdWUsXG4gICAgICAgIHZhbHVlU3BlYzogdC5zdHlsZVNwZWMuZnVuY3Rpb24sXG4gICAgICAgIHN0eWxlOiB0LnN0eWxlLFxuICAgICAgICBzdHlsZVNwZWM6IHQuc3R5bGVTcGVjLFxuICAgICAgICBvYmplY3RFbGVtZW50VmFsaWRhdG9yczoge1xuICAgICAgICAgIHN0b3BzOiBmdW5jdGlvbiBzdG9wcyh0KSB7XG4gICAgICAgICAgICBpZiAoXCJpZGVudGl0eVwiID09PSBhKSByZXR1cm4gW25ldyBQdCh0LmtleSwgdC52YWx1ZSwgJ2lkZW50aXR5IGZ1bmN0aW9uIG1heSBub3QgaGF2ZSBhIFwic3RvcHNcIiBwcm9wZXJ0eScpXTtcbiAgICAgICAgICAgIHZhciBlID0gW10sXG4gICAgICAgICAgICAgICAgciA9IHQudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gZSA9IGUuY29uY2F0KFdyKHtcbiAgICAgICAgICAgICAga2V5OiB0LmtleSxcbiAgICAgICAgICAgICAgdmFsdWU6IHIsXG4gICAgICAgICAgICAgIHZhbHVlU3BlYzogdC52YWx1ZVNwZWMsXG4gICAgICAgICAgICAgIHN0eWxlOiB0LnN0eWxlLFxuICAgICAgICAgICAgICBzdHlsZVNwZWM6IHQuc3R5bGVTcGVjLFxuICAgICAgICAgICAgICBhcnJheUVsZW1lbnRWYWxpZGF0b3I6IGNcbiAgICAgICAgICAgIH0pKSwgXCJhcnJheVwiID09PSBEcihyKSAmJiAwID09PSByLmxlbmd0aCAmJiBlLnB1c2gobmV3IFB0KHQua2V5LCByLCBcImFycmF5IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgc3RvcFwiKSksIGU7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBkZWZhdWx0OiBmdW5jdGlvbiBfZGVmYXVsdCh0KSB7XG4gICAgICAgICAgICByZXR1cm4gQW4oe1xuICAgICAgICAgICAgICBrZXk6IHQua2V5LFxuICAgICAgICAgICAgICB2YWx1ZTogdC52YWx1ZSxcbiAgICAgICAgICAgICAgdmFsdWVTcGVjOiBpLFxuICAgICAgICAgICAgICBzdHlsZTogdC5zdHlsZSxcbiAgICAgICAgICAgICAgc3R5bGVTcGVjOiB0LnN0eWxlU3BlY1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBcImlkZW50aXR5XCIgPT09IGEgJiYgcyAmJiBwLnB1c2gobmV3IFB0KHQua2V5LCB0LnZhbHVlLCAnbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eSBcInByb3BlcnR5XCInKSksIFwiaWRlbnRpdHlcIiA9PT0gYSB8fCB0LnZhbHVlLnN0b3BzIHx8IHAucHVzaChuZXcgUHQodC5rZXksIHQudmFsdWUsICdtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IFwic3RvcHNcIicpKSwgXCJleHBvbmVudGlhbFwiID09PSBhICYmIHQudmFsdWVTcGVjLmV4cHJlc3Npb24gJiYgIUZyKHQudmFsdWVTcGVjKSAmJiBwLnB1c2gobmV3IFB0KHQua2V5LCB0LnZhbHVlLCBcImV4cG9uZW50aWFsIGZ1bmN0aW9ucyBub3Qgc3VwcG9ydGVkXCIpKSwgdC5zdHlsZVNwZWMuJHZlcnNpb24gPj0gOCAmJiAodSAmJiAhVHIodC52YWx1ZVNwZWMpID8gcC5wdXNoKG5ldyBQdCh0LmtleSwgdC52YWx1ZSwgXCJwcm9wZXJ0eSBmdW5jdGlvbnMgbm90IHN1cHBvcnRlZFwiKSkgOiBzICYmICFWcih0LnZhbHVlU3BlYykgJiYgcC5wdXNoKG5ldyBQdCh0LmtleSwgdC52YWx1ZSwgXCJ6b29tIGZ1bmN0aW9ucyBub3Qgc3VwcG9ydGVkXCIpKSksIFwiY2F0ZWdvcmljYWxcIiAhPT0gYSAmJiAhbCB8fCB2b2lkIDAgIT09IHQudmFsdWUucHJvcGVydHkgfHwgcC5wdXNoKG5ldyBQdCh0LmtleSwgdC52YWx1ZSwgJ1wicHJvcGVydHlcIiBwcm9wZXJ0eSBpcyByZXF1aXJlZCcpKSwgcDtcblxuICAgICAgZnVuY3Rpb24gYyh0KSB7XG4gICAgICAgIHZhciBlID0gW10sXG4gICAgICAgICAgICBhID0gdC52YWx1ZSxcbiAgICAgICAgICAgIHMgPSB0LmtleTtcbiAgICAgICAgaWYgKFwiYXJyYXlcIiAhPT0gRHIoYSkpIHJldHVybiBbbmV3IFB0KHMsIGEsIFwiYXJyYXkgZXhwZWN0ZWQsIFwiICsgRHIoYSkgKyBcIiBmb3VuZFwiKV07XG4gICAgICAgIGlmICgyICE9PSBhLmxlbmd0aCkgcmV0dXJuIFtuZXcgUHQocywgYSwgXCJhcnJheSBsZW5ndGggMiBleHBlY3RlZCwgbGVuZ3RoIFwiICsgYS5sZW5ndGggKyBcIiBmb3VuZFwiKV07XG5cbiAgICAgICAgaWYgKGwpIHtcbiAgICAgICAgICBpZiAoXCJvYmplY3RcIiAhPT0gRHIoYVswXSkpIHJldHVybiBbbmV3IFB0KHMsIGEsIFwib2JqZWN0IGV4cGVjdGVkLCBcIiArIERyKGFbMF0pICsgXCIgZm91bmRcIildO1xuICAgICAgICAgIGlmICh2b2lkIDAgPT09IGFbMF0uem9vbSkgcmV0dXJuIFtuZXcgUHQocywgYSwgXCJvYmplY3Qgc3RvcCBrZXkgbXVzdCBoYXZlIHpvb21cIildO1xuICAgICAgICAgIGlmICh2b2lkIDAgPT09IGFbMF0udmFsdWUpIHJldHVybiBbbmV3IFB0KHMsIGEsIFwib2JqZWN0IHN0b3Aga2V5IG11c3QgaGF2ZSB2YWx1ZVwiKV07XG4gICAgICAgICAgaWYgKG4gJiYgbiA+IFR0KGFbMF0uem9vbSkpIHJldHVybiBbbmV3IFB0KHMsIGFbMF0uem9vbSwgXCJzdG9wIHpvb20gdmFsdWVzIG11c3QgYXBwZWFyIGluIGFzY2VuZGluZyBvcmRlclwiKV07XG4gICAgICAgICAgVHQoYVswXS56b29tKSAhPT0gbiAmJiAobiA9IFR0KGFbMF0uem9vbSksIHIgPSB2b2lkIDAsIG8gPSB7fSksIGUgPSBlLmNvbmNhdCgkcih7XG4gICAgICAgICAgICBrZXk6IHMgKyBcIlswXVwiLFxuICAgICAgICAgICAgdmFsdWU6IGFbMF0sXG4gICAgICAgICAgICB2YWx1ZVNwZWM6IHtcbiAgICAgICAgICAgICAgem9vbToge31cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdHlsZTogdC5zdHlsZSxcbiAgICAgICAgICAgIHN0eWxlU3BlYzogdC5zdHlsZVNwZWMsXG4gICAgICAgICAgICBvYmplY3RFbGVtZW50VmFsaWRhdG9yczoge1xuICAgICAgICAgICAgICB6b29tOiBRcixcbiAgICAgICAgICAgICAgdmFsdWU6IGhcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBlID0gZS5jb25jYXQoaCh7XG4gICAgICAgICAga2V5OiBzICsgXCJbMF1cIixcbiAgICAgICAgICB2YWx1ZTogYVswXSxcbiAgICAgICAgICB2YWx1ZVNwZWM6IHt9LFxuICAgICAgICAgIHN0eWxlOiB0LnN0eWxlLFxuICAgICAgICAgIHN0eWxlU3BlYzogdC5zdHlsZVNwZWNcbiAgICAgICAgfSwgYSkpO1xuXG4gICAgICAgIHJldHVybiBHcihWdChhWzFdKSkgPyBlLmNvbmNhdChbbmV3IFB0KHMgKyBcIlsxXVwiLCBhWzFdLCBcImV4cHJlc3Npb25zIGFyZSBub3QgYWxsb3dlZCBpbiBmdW5jdGlvbiBzdG9wcy5cIildKSA6IGUuY29uY2F0KEFuKHtcbiAgICAgICAgICBrZXk6IHMgKyBcIlsxXVwiLFxuICAgICAgICAgIHZhbHVlOiBhWzFdLFxuICAgICAgICAgIHZhbHVlU3BlYzogaSxcbiAgICAgICAgICBzdHlsZTogdC5zdHlsZSxcbiAgICAgICAgICBzdHlsZVNwZWM6IHQuc3R5bGVTcGVjXG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gaCh0LCBuKSB7XG4gICAgICAgIHZhciBzID0gRHIodC52YWx1ZSksXG4gICAgICAgICAgICB1ID0gVHQodC52YWx1ZSksXG4gICAgICAgICAgICBsID0gbnVsbCAhPT0gdC52YWx1ZSA/IHQudmFsdWUgOiBuO1xuXG4gICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgaWYgKHMgIT09IGUpIHJldHVybiBbbmV3IFB0KHQua2V5LCBsLCBzICsgXCIgc3RvcCBkb21haW4gdHlwZSBtdXN0IG1hdGNoIHByZXZpb3VzIHN0b3AgZG9tYWluIHR5cGUgXCIgKyBlKV07XG4gICAgICAgIH0gZWxzZSBlID0gcztcblxuICAgICAgICBpZiAoXCJudW1iZXJcIiAhPT0gcyAmJiBcInN0cmluZ1wiICE9PSBzICYmIFwiYm9vbGVhblwiICE9PSBzKSByZXR1cm4gW25ldyBQdCh0LmtleSwgbCwgXCJzdG9wIGRvbWFpbiB2YWx1ZSBtdXN0IGJlIGEgbnVtYmVyLCBzdHJpbmcsIG9yIGJvb2xlYW5cIildO1xuXG4gICAgICAgIGlmIChcIm51bWJlclwiICE9PSBzICYmIFwiY2F0ZWdvcmljYWxcIiAhPT0gYSkge1xuICAgICAgICAgIHZhciBwID0gXCJudW1iZXIgZXhwZWN0ZWQsIFwiICsgcyArIFwiIGZvdW5kXCI7XG4gICAgICAgICAgcmV0dXJuIFRyKGkpICYmIHZvaWQgMCA9PT0gYSAmJiAocCArPSAnXFxuSWYgeW91IGludGVuZGVkIHRvIHVzZSBhIGNhdGVnb3JpY2FsIGZ1bmN0aW9uLCBzcGVjaWZ5IGBcInR5cGVcIjogXCJjYXRlZ29yaWNhbFwiYC4nKSwgW25ldyBQdCh0LmtleSwgbCwgcCldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFwiY2F0ZWdvcmljYWxcIiAhPT0gYSB8fCBcIm51bWJlclwiICE9PSBzIHx8IGlzRmluaXRlKHUpICYmIE1hdGguZmxvb3IodSkgPT09IHUgPyBcImNhdGVnb3JpY2FsXCIgIT09IGEgJiYgXCJudW1iZXJcIiA9PT0gcyAmJiB2b2lkIDAgIT09IHIgJiYgdSA8IHIgPyBbbmV3IFB0KHQua2V5LCBsLCBcInN0b3AgZG9tYWluIHZhbHVlcyBtdXN0IGFwcGVhciBpbiBhc2NlbmRpbmcgb3JkZXJcIildIDogKHIgPSB1LCBcImNhdGVnb3JpY2FsXCIgPT09IGEgJiYgdSBpbiBvID8gW25ldyBQdCh0LmtleSwgbCwgXCJzdG9wIGRvbWFpbiB2YWx1ZXMgbXVzdCBiZSB1bmlxdWVcIildIDogKG9bdV0gPSAhMCwgW10pKSA6IFtuZXcgUHQodC5rZXksIGwsIFwiaW50ZWdlciBleHBlY3RlZCwgZm91bmQgXCIgKyB1KV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZW4odCkge1xuICAgICAgdmFyIGUgPSAoXCJwcm9wZXJ0eVwiID09PSB0LmV4cHJlc3Npb25Db250ZXh0ID8gSHIgOiBacikoVnQodC52YWx1ZSksIHQudmFsdWVTcGVjKTtcbiAgICAgIGlmIChcImVycm9yXCIgPT09IGUucmVzdWx0KSByZXR1cm4gZS52YWx1ZS5tYXAoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQdChcIlwiICsgdC5rZXkgKyBlLmtleSwgdC52YWx1ZSwgZS5tZXNzYWdlKTtcbiAgICAgIH0pO1xuICAgICAgdmFyIHIgPSBlLnZhbHVlLmV4cHJlc3Npb24gfHwgZS52YWx1ZS5fc3R5bGVFeHByZXNzaW9uLmV4cHJlc3Npb247XG4gICAgICBpZiAoXCJwcm9wZXJ0eVwiID09PSB0LmV4cHJlc3Npb25Db250ZXh0ICYmIFwidGV4dC1mb250XCIgPT09IHQucHJvcGVydHlLZXkgJiYgIXIub3V0cHV0RGVmaW5lZCgpKSByZXR1cm4gW25ldyBQdCh0LmtleSwgdC52YWx1ZSwgJ0ludmFsaWQgZGF0YSBleHByZXNzaW9uIGZvciBcIicgKyB0LnByb3BlcnR5S2V5ICsgJ1wiLiBPdXRwdXQgdmFsdWVzIG11c3QgYmUgY29udGFpbmVkIGFzIGxpdGVyYWxzIHdpdGhpbiB0aGUgZXhwcmVzc2lvbi4nKV07XG4gICAgICBpZiAoXCJwcm9wZXJ0eVwiID09PSB0LmV4cHJlc3Npb25Db250ZXh0ICYmIFwibGF5b3V0XCIgPT09IHQucHJvcGVydHlUeXBlICYmICFPZShyKSkgcmV0dXJuIFtuZXcgUHQodC5rZXksIHQudmFsdWUsICdcImZlYXR1cmUtc3RhdGVcIiBkYXRhIGV4cHJlc3Npb25zIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggbGF5b3V0IHByb3BlcnRpZXMuJyldO1xuICAgICAgaWYgKFwiZmlsdGVyXCIgPT09IHQuZXhwcmVzc2lvbkNvbnRleHQgJiYgIU9lKHIpKSByZXR1cm4gW25ldyBQdCh0LmtleSwgdC52YWx1ZSwgJ1wiZmVhdHVyZS1zdGF0ZVwiIGRhdGEgZXhwcmVzc2lvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgd2l0aCBmaWx0ZXJzLicpXTtcblxuICAgICAgaWYgKHQuZXhwcmVzc2lvbkNvbnRleHQgJiYgMCA9PT0gdC5leHByZXNzaW9uQ29udGV4dC5pbmRleE9mKFwiY2x1c3RlclwiKSkge1xuICAgICAgICBpZiAoIVJlKHIsIFtcInpvb21cIiwgXCJmZWF0dXJlLXN0YXRlXCJdKSkgcmV0dXJuIFtuZXcgUHQodC5rZXksIHQudmFsdWUsICdcInpvb21cIiBhbmQgXCJmZWF0dXJlLXN0YXRlXCIgZXhwcmVzc2lvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgd2l0aCBjbHVzdGVyIHByb3BlcnRpZXMuJyldO1xuICAgICAgICBpZiAoXCJjbHVzdGVyLWluaXRpYWxcIiA9PT0gdC5leHByZXNzaW9uQ29udGV4dCAmJiAhTGUocikpIHJldHVybiBbbmV3IFB0KHQua2V5LCB0LnZhbHVlLCBcIkZlYXR1cmUgZGF0YSBleHByZXNzaW9ucyBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIGluaXRpYWwgZXhwcmVzc2lvbiBwYXJ0IG9mIGNsdXN0ZXIgcHJvcGVydGllcy5cIildO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcm4odCkge1xuICAgICAgdmFyIGUgPSB0LmtleSxcbiAgICAgICAgICByID0gdC52YWx1ZSxcbiAgICAgICAgICBuID0gdC52YWx1ZVNwZWMsXG4gICAgICAgICAgaSA9IFtdO1xuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkobi52YWx1ZXMpID8gLTEgPT09IG4udmFsdWVzLmluZGV4T2YoVHQocikpICYmIGkucHVzaChuZXcgUHQoZSwgciwgXCJleHBlY3RlZCBvbmUgb2YgW1wiICsgbi52YWx1ZXMuam9pbihcIiwgXCIpICsgXCJdLCBcIiArIEpTT04uc3RyaW5naWZ5KHIpICsgXCIgZm91bmRcIikpIDogLTEgPT09IE9iamVjdC5rZXlzKG4udmFsdWVzKS5pbmRleE9mKFR0KHIpKSAmJiBpLnB1c2gobmV3IFB0KGUsIHIsIFwiZXhwZWN0ZWQgb25lIG9mIFtcIiArIE9iamVjdC5rZXlzKG4udmFsdWVzKS5qb2luKFwiLCBcIikgKyBcIl0sIFwiICsgSlNPTi5zdHJpbmdpZnkocikgKyBcIiBmb3VuZFwiKSksIGk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbm4odCkge1xuICAgICAgaWYgKCEwID09PSB0IHx8ICExID09PSB0KSByZXR1cm4gITA7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodCkgfHwgMCA9PT0gdC5sZW5ndGgpIHJldHVybiAhMTtcblxuICAgICAgc3dpdGNoICh0WzBdKSB7XG4gICAgICAgIGNhc2UgXCJoYXNcIjpcbiAgICAgICAgICByZXR1cm4gdC5sZW5ndGggPj0gMiAmJiBcIiRpZFwiICE9PSB0WzFdICYmIFwiJHR5cGVcIiAhPT0gdFsxXTtcblxuICAgICAgICBjYXNlIFwiaW5cIjpcbiAgICAgICAgICByZXR1cm4gdC5sZW5ndGggPj0gMyAmJiAoXCJzdHJpbmdcIiAhPSB0eXBlb2YgdFsxXSB8fCBBcnJheS5pc0FycmF5KHRbMl0pKTtcblxuICAgICAgICBjYXNlIFwiIWluXCI6XG4gICAgICAgIGNhc2UgXCIhaGFzXCI6XG4gICAgICAgIGNhc2UgXCJub25lXCI6XG4gICAgICAgICAgcmV0dXJuICExO1xuXG4gICAgICAgIGNhc2UgXCI9PVwiOlxuICAgICAgICBjYXNlIFwiIT1cIjpcbiAgICAgICAgY2FzZSBcIj5cIjpcbiAgICAgICAgY2FzZSBcIj49XCI6XG4gICAgICAgIGNhc2UgXCI8XCI6XG4gICAgICAgIGNhc2UgXCI8PVwiOlxuICAgICAgICAgIHJldHVybiAzICE9PSB0Lmxlbmd0aCB8fCBBcnJheS5pc0FycmF5KHRbMV0pIHx8IEFycmF5LmlzQXJyYXkodFsyXSk7XG5cbiAgICAgICAgY2FzZSBcImFueVwiOlxuICAgICAgICBjYXNlIFwiYWxsXCI6XG4gICAgICAgICAgZm9yICh2YXIgZSA9IDAsIHIgPSB0LnNsaWNlKDEpOyBlIDwgci5sZW5ndGg7IGUgKz0gMSkge1xuICAgICAgICAgICAgdmFyIG4gPSByW2VdO1xuICAgICAgICAgICAgaWYgKCFubihuKSAmJiBcImJvb2xlYW5cIiAhPSB0eXBlb2YgbikgcmV0dXJuICExO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiAhMDtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBZci5kZXNlcmlhbGl6ZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gbmV3IFlyKHQuX3BhcmFtZXRlcnMsIHQuX3NwZWNpZmljYXRpb24pO1xuICAgIH0sIFlyLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfcGFyYW1ldGVyczogdC5fcGFyYW1ldGVycyxcbiAgICAgICAgX3NwZWNpZmljYXRpb246IHQuX3NwZWNpZmljYXRpb25cbiAgICAgIH07XG4gICAgfTtcbiAgICB2YXIgYW4gPSB7XG4gICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgIGRlZmF1bHQ6ICExLFxuICAgICAgdHJhbnNpdGlvbjogITEsXG4gICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWRyaXZlblwiLFxuICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICBpbnRlcnBvbGF0ZWQ6ICExLFxuICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCIsIFwiZmVhdHVyZVwiXVxuICAgICAgfVxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBvbih0KSB7XG4gICAgICBpZiAobnVsbCA9PSB0KSByZXR1cm4ge1xuICAgICAgICBmaWx0ZXI6IGZ1bmN0aW9uIGZpbHRlcigpIHtcbiAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgIH0sXG4gICAgICAgIG5lZWRHZW9tZXRyeTogITFcbiAgICAgIH07XG4gICAgICBubih0KSB8fCAodCA9IHVuKHQpKTtcbiAgICAgIHZhciBlID0gWnIodCwgYW4pO1xuICAgICAgaWYgKFwiZXJyb3JcIiA9PT0gZS5yZXN1bHQpIHRocm93IG5ldyBFcnJvcihlLnZhbHVlLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdC5rZXkgKyBcIjogXCIgKyB0Lm1lc3NhZ2U7XG4gICAgICB9KS5qb2luKFwiLCBcIikpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZmlsdGVyOiBmdW5jdGlvbiBmaWx0ZXIodCwgciwgbikge1xuICAgICAgICAgIHJldHVybiBlLnZhbHVlLmV2YWx1YXRlKHQsIHIsIHt9LCBuKTtcbiAgICAgICAgfSxcbiAgICAgICAgbmVlZEdlb21ldHJ5OiBmdW5jdGlvbiB0KGUpIHtcbiAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZSkpIHJldHVybiAhMTtcbiAgICAgICAgICBpZiAoXCJ3aXRoaW5cIiA9PT0gZVswXSkgcmV0dXJuICEwO1xuXG4gICAgICAgICAgZm9yICh2YXIgciA9IDE7IHIgPCBlLmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICBpZiAodChlW3JdKSkgcmV0dXJuICEwO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgfSh0KVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzbih0LCBlKSB7XG4gICAgICByZXR1cm4gdCA8IGUgPyAtMSA6IHQgPiBlID8gMSA6IDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdW4odCkge1xuICAgICAgaWYgKCF0KSByZXR1cm4gITA7XG4gICAgICB2YXIgZSxcbiAgICAgICAgICByID0gdFswXTtcbiAgICAgIHJldHVybiB0Lmxlbmd0aCA8PSAxID8gXCJhbnlcIiAhPT0gciA6IFwiPT1cIiA9PT0gciA/IGxuKHRbMV0sIHRbMl0sIFwiPT1cIikgOiBcIiE9XCIgPT09IHIgPyBobihsbih0WzFdLCB0WzJdLCBcIj09XCIpKSA6IFwiPFwiID09PSByIHx8IFwiPlwiID09PSByIHx8IFwiPD1cIiA9PT0gciB8fCBcIj49XCIgPT09IHIgPyBsbih0WzFdLCB0WzJdLCByKSA6IFwiYW55XCIgPT09IHIgPyAoZSA9IHQuc2xpY2UoMSksIFtcImFueVwiXS5jb25jYXQoZS5tYXAodW4pKSkgOiBcImFsbFwiID09PSByID8gW1wiYWxsXCJdLmNvbmNhdCh0LnNsaWNlKDEpLm1hcCh1bikpIDogXCJub25lXCIgPT09IHIgPyBbXCJhbGxcIl0uY29uY2F0KHQuc2xpY2UoMSkubWFwKHVuKS5tYXAoaG4pKSA6IFwiaW5cIiA9PT0gciA/IHBuKHRbMV0sIHQuc2xpY2UoMikpIDogXCIhaW5cIiA9PT0gciA/IGhuKHBuKHRbMV0sIHQuc2xpY2UoMikpKSA6IFwiaGFzXCIgPT09IHIgPyBjbih0WzFdKSA6IFwiIWhhc1wiID09PSByID8gaG4oY24odFsxXSkpIDogXCJ3aXRoaW5cIiAhPT0gciB8fCB0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxuKHQsIGUsIHIpIHtcbiAgICAgIHN3aXRjaCAodCkge1xuICAgICAgICBjYXNlIFwiJHR5cGVcIjpcbiAgICAgICAgICByZXR1cm4gW1wiZmlsdGVyLXR5cGUtXCIgKyByLCBlXTtcblxuICAgICAgICBjYXNlIFwiJGlkXCI6XG4gICAgICAgICAgcmV0dXJuIFtcImZpbHRlci1pZC1cIiArIHIsIGVdO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIFtcImZpbHRlci1cIiArIHIsIHQsIGVdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBuKHQsIGUpIHtcbiAgICAgIGlmICgwID09PSBlLmxlbmd0aCkgcmV0dXJuICExO1xuXG4gICAgICBzd2l0Y2ggKHQpIHtcbiAgICAgICAgY2FzZSBcIiR0eXBlXCI6XG4gICAgICAgICAgcmV0dXJuIFtcImZpbHRlci10eXBlLWluXCIsIFtcImxpdGVyYWxcIiwgZV1dO1xuXG4gICAgICAgIGNhc2UgXCIkaWRcIjpcbiAgICAgICAgICByZXR1cm4gW1wiZmlsdGVyLWlkLWluXCIsIFtcImxpdGVyYWxcIiwgZV1dO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIGUubGVuZ3RoID4gMjAwICYmICFlLnNvbWUoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgdCAhPSB0eXBlb2YgZVswXTtcbiAgICAgICAgICB9KSA/IFtcImZpbHRlci1pbi1sYXJnZVwiLCB0LCBbXCJsaXRlcmFsXCIsIGUuc29ydChzbildXSA6IFtcImZpbHRlci1pbi1zbWFsbFwiLCB0LCBbXCJsaXRlcmFsXCIsIGVdXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbih0KSB7XG4gICAgICBzd2l0Y2ggKHQpIHtcbiAgICAgICAgY2FzZSBcIiR0eXBlXCI6XG4gICAgICAgICAgcmV0dXJuICEwO1xuXG4gICAgICAgIGNhc2UgXCIkaWRcIjpcbiAgICAgICAgICByZXR1cm4gW1wiZmlsdGVyLWhhcy1pZFwiXTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBbXCJmaWx0ZXItaGFzXCIsIHRdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhuKHQpIHtcbiAgICAgIHJldHVybiBbXCIhXCIsIHRdO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZuKHQpIHtcbiAgICAgIHJldHVybiBubihWdCh0LnZhbHVlKSkgPyBlbihCdCh7fSwgdCwge1xuICAgICAgICBleHByZXNzaW9uQ29udGV4dDogXCJmaWx0ZXJcIixcbiAgICAgICAgdmFsdWVTcGVjOiB7XG4gICAgICAgICAgdmFsdWU6IFwiYm9vbGVhblwiXG4gICAgICAgIH1cbiAgICAgIH0pKSA6IGZ1bmN0aW9uIHQoZSkge1xuICAgICAgICB2YXIgciA9IGUudmFsdWUsXG4gICAgICAgICAgICBuID0gZS5rZXk7XG4gICAgICAgIGlmIChcImFycmF5XCIgIT09IERyKHIpKSByZXR1cm4gW25ldyBQdChuLCByLCBcImFycmF5IGV4cGVjdGVkLCBcIiArIERyKHIpICsgXCIgZm91bmRcIildO1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIGEgPSBlLnN0eWxlU3BlYyxcbiAgICAgICAgICAgIG8gPSBbXTtcbiAgICAgICAgaWYgKHIubGVuZ3RoIDwgMSkgcmV0dXJuIFtuZXcgUHQobiwgciwgXCJmaWx0ZXIgYXJyYXkgbXVzdCBoYXZlIGF0IGxlYXN0IDEgZWxlbWVudFwiKV07XG5cbiAgICAgICAgc3dpdGNoIChvID0gby5jb25jYXQocm4oe1xuICAgICAgICAgIGtleTogbiArIFwiWzBdXCIsXG4gICAgICAgICAgdmFsdWU6IHJbMF0sXG4gICAgICAgICAgdmFsdWVTcGVjOiBhLmZpbHRlcl9vcGVyYXRvcixcbiAgICAgICAgICBzdHlsZTogZS5zdHlsZSxcbiAgICAgICAgICBzdHlsZVNwZWM6IGUuc3R5bGVTcGVjXG4gICAgICAgIH0pKSwgVHQoclswXSkpIHtcbiAgICAgICAgICBjYXNlIFwiPFwiOlxuICAgICAgICAgIGNhc2UgXCI8PVwiOlxuICAgICAgICAgIGNhc2UgXCI+XCI6XG4gICAgICAgICAgY2FzZSBcIj49XCI6XG4gICAgICAgICAgICByLmxlbmd0aCA+PSAyICYmIFwiJHR5cGVcIiA9PT0gVHQoclsxXSkgJiYgby5wdXNoKG5ldyBQdChuLCByLCAnXCIkdHlwZVwiIGNhbm5vdCBiZSB1c2Ugd2l0aCBvcGVyYXRvciBcIicgKyByWzBdICsgJ1wiJykpO1xuXG4gICAgICAgICAgY2FzZSBcIj09XCI6XG4gICAgICAgICAgY2FzZSBcIiE9XCI6XG4gICAgICAgICAgICAzICE9PSByLmxlbmd0aCAmJiBvLnB1c2gobmV3IFB0KG4sIHIsICdmaWx0ZXIgYXJyYXkgZm9yIG9wZXJhdG9yIFwiJyArIHJbMF0gKyAnXCIgbXVzdCBoYXZlIDMgZWxlbWVudHMnKSk7XG5cbiAgICAgICAgICBjYXNlIFwiaW5cIjpcbiAgICAgICAgICBjYXNlIFwiIWluXCI6XG4gICAgICAgICAgICByLmxlbmd0aCA+PSAyICYmIFwic3RyaW5nXCIgIT09IChpID0gRHIoclsxXSkpICYmIG8ucHVzaChuZXcgUHQobiArIFwiWzFdXCIsIHJbMV0sIFwic3RyaW5nIGV4cGVjdGVkLCBcIiArIGkgKyBcIiBmb3VuZFwiKSk7XG5cbiAgICAgICAgICAgIGZvciAodmFyIHMgPSAyOyBzIDwgci5sZW5ndGg7IHMrKykge1xuICAgICAgICAgICAgICBpID0gRHIocltzXSksIFwiJHR5cGVcIiA9PT0gVHQoclsxXSkgPyBvID0gby5jb25jYXQocm4oe1xuICAgICAgICAgICAgICAgIGtleTogbiArIFwiW1wiICsgcyArIFwiXVwiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiByW3NdLFxuICAgICAgICAgICAgICAgIHZhbHVlU3BlYzogYS5nZW9tZXRyeV90eXBlLFxuICAgICAgICAgICAgICAgIHN0eWxlOiBlLnN0eWxlLFxuICAgICAgICAgICAgICAgIHN0eWxlU3BlYzogZS5zdHlsZVNwZWNcbiAgICAgICAgICAgICAgfSkpIDogXCJzdHJpbmdcIiAhPT0gaSAmJiBcIm51bWJlclwiICE9PSBpICYmIFwiYm9vbGVhblwiICE9PSBpICYmIG8ucHVzaChuZXcgUHQobiArIFwiW1wiICsgcyArIFwiXVwiLCByW3NdLCBcInN0cmluZywgbnVtYmVyLCBvciBib29sZWFuIGV4cGVjdGVkLCBcIiArIGkgKyBcIiBmb3VuZFwiKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcImFueVwiOlxuICAgICAgICAgIGNhc2UgXCJhbGxcIjpcbiAgICAgICAgICBjYXNlIFwibm9uZVwiOlxuICAgICAgICAgICAgZm9yICh2YXIgdSA9IDE7IHUgPCByLmxlbmd0aDsgdSsrKSB7XG4gICAgICAgICAgICAgIG8gPSBvLmNvbmNhdCh0KHtcbiAgICAgICAgICAgICAgICBrZXk6IG4gKyBcIltcIiArIHUgKyBcIl1cIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogclt1XSxcbiAgICAgICAgICAgICAgICBzdHlsZTogZS5zdHlsZSxcbiAgICAgICAgICAgICAgICBzdHlsZVNwZWM6IGUuc3R5bGVTcGVjXG4gICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwiaGFzXCI6XG4gICAgICAgICAgY2FzZSBcIiFoYXNcIjpcbiAgICAgICAgICAgIGkgPSBEcihyWzFdKSwgMiAhPT0gci5sZW5ndGggPyBvLnB1c2gobmV3IFB0KG4sIHIsICdmaWx0ZXIgYXJyYXkgZm9yIFwiJyArIHJbMF0gKyAnXCIgb3BlcmF0b3IgbXVzdCBoYXZlIDIgZWxlbWVudHMnKSkgOiBcInN0cmluZ1wiICE9PSBpICYmIG8ucHVzaChuZXcgUHQobiArIFwiWzFdXCIsIHJbMV0sIFwic3RyaW5nIGV4cGVjdGVkLCBcIiArIGkgKyBcIiBmb3VuZFwiKSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJ3aXRoaW5cIjpcbiAgICAgICAgICAgIGkgPSBEcihyWzFdKSwgMiAhPT0gci5sZW5ndGggPyBvLnB1c2gobmV3IFB0KG4sIHIsICdmaWx0ZXIgYXJyYXkgZm9yIFwiJyArIHJbMF0gKyAnXCIgb3BlcmF0b3IgbXVzdCBoYXZlIDIgZWxlbWVudHMnKSkgOiBcIm9iamVjdFwiICE9PSBpICYmIG8ucHVzaChuZXcgUHQobiArIFwiWzFdXCIsIHJbMV0sIFwib2JqZWN0IGV4cGVjdGVkLCBcIiArIGkgKyBcIiBmb3VuZFwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbztcbiAgICAgIH0odCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24geW4odCwgZSkge1xuICAgICAgdmFyIHIgPSB0LmtleSxcbiAgICAgICAgICBuID0gdC5zdHlsZSxcbiAgICAgICAgICBpID0gdC5zdHlsZVNwZWMsXG4gICAgICAgICAgYSA9IHQudmFsdWUsXG4gICAgICAgICAgbyA9IHQub2JqZWN0S2V5LFxuICAgICAgICAgIHMgPSBpW2UgKyBcIl9cIiArIHQubGF5ZXJUeXBlXTtcbiAgICAgIGlmICghcykgcmV0dXJuIFtdO1xuICAgICAgdmFyIHUgPSBvLm1hdGNoKC9eKC4qKS10cmFuc2l0aW9uJC8pO1xuICAgICAgaWYgKFwicGFpbnRcIiA9PT0gZSAmJiB1ICYmIHNbdVsxXV0gJiYgc1t1WzFdXS50cmFuc2l0aW9uKSByZXR1cm4gQW4oe1xuICAgICAgICBrZXk6IHIsXG4gICAgICAgIHZhbHVlOiBhLFxuICAgICAgICB2YWx1ZVNwZWM6IGkudHJhbnNpdGlvbixcbiAgICAgICAgc3R5bGU6IG4sXG4gICAgICAgIHN0eWxlU3BlYzogaVxuICAgICAgfSk7XG4gICAgICB2YXIgbCxcbiAgICAgICAgICBwID0gdC52YWx1ZVNwZWMgfHwgc1tvXTtcbiAgICAgIGlmICghcCkgcmV0dXJuIFtuZXcgUHQociwgYSwgJ3Vua25vd24gcHJvcGVydHkgXCInICsgbyArICdcIicpXTtcbiAgICAgIGlmIChcInN0cmluZ1wiID09PSBEcihhKSAmJiBUcihwKSAmJiAhcC50b2tlbnMgJiYgKGwgPSAvXnsoW159XSspfSQvLmV4ZWMoYSkpKSByZXR1cm4gW25ldyBQdChyLCBhLCAnXCInICsgbyArICdcIiBkb2VzIG5vdCBzdXBwb3J0IGludGVycG9sYXRpb24gc3ludGF4XFxuVXNlIGFuIGlkZW50aXR5IHByb3BlcnR5IGZ1bmN0aW9uIGluc3RlYWQ6IGB7IFwidHlwZVwiOiBcImlkZW50aXR5XCIsIFwicHJvcGVydHlcIjogJyArIEpTT04uc3RyaW5naWZ5KGxbMV0pICsgXCIgfWAuXCIpXTtcbiAgICAgIHZhciBjID0gW107XG4gICAgICByZXR1cm4gXCJzeW1ib2xcIiA9PT0gdC5sYXllclR5cGUgJiYgKFwidGV4dC1maWVsZFwiID09PSBvICYmIG4gJiYgIW4uZ2x5cGhzICYmIGMucHVzaChuZXcgUHQociwgYSwgJ3VzZSBvZiBcInRleHQtZmllbGRcIiByZXF1aXJlcyBhIHN0eWxlIFwiZ2x5cGhzXCIgcHJvcGVydHknKSksIFwidGV4dC1mb250XCIgPT09IG8gJiYgTHIoVnQoYSkpICYmIFwiaWRlbnRpdHlcIiA9PT0gVHQoYS50eXBlKSAmJiBjLnB1c2gobmV3IFB0KHIsIGEsICdcInRleHQtZm9udFwiIGRvZXMgbm90IHN1cHBvcnQgaWRlbnRpdHkgZnVuY3Rpb25zJykpKSwgYy5jb25jYXQoQW4oe1xuICAgICAgICBrZXk6IHQua2V5LFxuICAgICAgICB2YWx1ZTogYSxcbiAgICAgICAgdmFsdWVTcGVjOiBwLFxuICAgICAgICBzdHlsZTogbixcbiAgICAgICAgc3R5bGVTcGVjOiBpLFxuICAgICAgICBleHByZXNzaW9uQ29udGV4dDogXCJwcm9wZXJ0eVwiLFxuICAgICAgICBwcm9wZXJ0eVR5cGU6IGUsXG4gICAgICAgIHByb3BlcnR5S2V5OiBvXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZG4odCkge1xuICAgICAgcmV0dXJuIHluKHQsIFwicGFpbnRcIik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW4odCkge1xuICAgICAgcmV0dXJuIHluKHQsIFwibGF5b3V0XCIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZuKHQpIHtcbiAgICAgIHZhciBlID0gW10sXG4gICAgICAgICAgciA9IHQudmFsdWUsXG4gICAgICAgICAgbiA9IHQua2V5LFxuICAgICAgICAgIGkgPSB0LnN0eWxlLFxuICAgICAgICAgIGEgPSB0LnN0eWxlU3BlYztcbiAgICAgIHIudHlwZSB8fCByLnJlZiB8fCBlLnB1c2gobmV3IFB0KG4sIHIsICdlaXRoZXIgXCJ0eXBlXCIgb3IgXCJyZWZcIiBpcyByZXF1aXJlZCcpKTtcbiAgICAgIHZhciBvLFxuICAgICAgICAgIHMgPSBUdChyLnR5cGUpLFxuICAgICAgICAgIHUgPSBUdChyLnJlZik7XG4gICAgICBpZiAoci5pZCkgZm9yICh2YXIgbCA9IFR0KHIuaWQpLCBwID0gMDsgcCA8IHQuYXJyYXlJbmRleDsgcCsrKSB7XG4gICAgICAgIHZhciBjID0gaS5sYXllcnNbcF07XG4gICAgICAgIFR0KGMuaWQpID09PSBsICYmIGUucHVzaChuZXcgUHQobiwgci5pZCwgJ2R1cGxpY2F0ZSBsYXllciBpZCBcIicgKyByLmlkICsgJ1wiLCBwcmV2aW91c2x5IHVzZWQgYXQgbGluZSAnICsgYy5pZC5fX2xpbmVfXykpO1xuICAgICAgfVxuICAgICAgaWYgKFwicmVmXCIgaW4gcikgW1widHlwZVwiLCBcInNvdXJjZVwiLCBcInNvdXJjZS1sYXllclwiLCBcImZpbHRlclwiLCBcImxheW91dFwiXS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHQgaW4gciAmJiBlLnB1c2gobmV3IFB0KG4sIHJbdF0sICdcIicgKyB0ICsgJ1wiIGlzIHByb2hpYml0ZWQgZm9yIHJlZiBsYXllcnMnKSk7XG4gICAgICB9KSwgaS5sYXllcnMuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICBUdCh0LmlkKSA9PT0gdSAmJiAobyA9IHQpO1xuICAgICAgfSksIG8gPyBvLnJlZiA/IGUucHVzaChuZXcgUHQobiwgci5yZWYsIFwicmVmIGNhbm5vdCByZWZlcmVuY2UgYW5vdGhlciByZWYgbGF5ZXJcIikpIDogcyA9IFR0KG8udHlwZSkgOiBlLnB1c2gobmV3IFB0KG4sIHIucmVmLCAncmVmIGxheWVyIFwiJyArIHUgKyAnXCIgbm90IGZvdW5kJykpO2Vsc2UgaWYgKFwiYmFja2dyb3VuZFwiICE9PSBzKSBpZiAoci5zb3VyY2UpIHtcbiAgICAgICAgdmFyIGggPSBpLnNvdXJjZXMgJiYgaS5zb3VyY2VzW3Iuc291cmNlXSxcbiAgICAgICAgICAgIGYgPSBoICYmIFR0KGgudHlwZSk7XG4gICAgICAgIGggPyBcInZlY3RvclwiID09PSBmICYmIFwicmFzdGVyXCIgPT09IHMgPyBlLnB1c2gobmV3IFB0KG4sIHIuc291cmNlLCAnbGF5ZXIgXCInICsgci5pZCArICdcIiByZXF1aXJlcyBhIHJhc3RlciBzb3VyY2UnKSkgOiBcInJhc3RlclwiID09PSBmICYmIFwicmFzdGVyXCIgIT09IHMgPyBlLnB1c2gobmV3IFB0KG4sIHIuc291cmNlLCAnbGF5ZXIgXCInICsgci5pZCArICdcIiByZXF1aXJlcyBhIHZlY3RvciBzb3VyY2UnKSkgOiBcInZlY3RvclwiICE9PSBmIHx8IHJbXCJzb3VyY2UtbGF5ZXJcIl0gPyBcInJhc3Rlci1kZW1cIiA9PT0gZiAmJiBcImhpbGxzaGFkZVwiICE9PSBzID8gZS5wdXNoKG5ldyBQdChuLCByLnNvdXJjZSwgXCJyYXN0ZXItZGVtIHNvdXJjZSBjYW4gb25seSBiZSB1c2VkIHdpdGggbGF5ZXIgdHlwZSAnaGlsbHNoYWRlJy5cIikpIDogXCJsaW5lXCIgIT09IHMgfHwgIXIucGFpbnQgfHwgIXIucGFpbnRbXCJsaW5lLWdyYWRpZW50XCJdIHx8IFwiZ2VvanNvblwiID09PSBmICYmIGgubGluZU1ldHJpY3MgfHwgZS5wdXNoKG5ldyBQdChuLCByLCAnbGF5ZXIgXCInICsgci5pZCArICdcIiBzcGVjaWZpZXMgYSBsaW5lLWdyYWRpZW50LCB3aGljaCByZXF1aXJlcyBhIEdlb0pTT04gc291cmNlIHdpdGggYGxpbmVNZXRyaWNzYCBlbmFibGVkLicpKSA6IGUucHVzaChuZXcgUHQobiwgciwgJ2xheWVyIFwiJyArIHIuaWQgKyAnXCIgbXVzdCBzcGVjaWZ5IGEgXCJzb3VyY2UtbGF5ZXJcIicpKSA6IGUucHVzaChuZXcgUHQobiwgci5zb3VyY2UsICdzb3VyY2UgXCInICsgci5zb3VyY2UgKyAnXCIgbm90IGZvdW5kJykpO1xuICAgICAgfSBlbHNlIGUucHVzaChuZXcgUHQobiwgciwgJ21pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgXCJzb3VyY2VcIicpKTtcbiAgICAgIHJldHVybiBlID0gZS5jb25jYXQoJHIoe1xuICAgICAgICBrZXk6IG4sXG4gICAgICAgIHZhbHVlOiByLFxuICAgICAgICB2YWx1ZVNwZWM6IGEubGF5ZXIsXG4gICAgICAgIHN0eWxlOiB0LnN0eWxlLFxuICAgICAgICBzdHlsZVNwZWM6IHQuc3R5bGVTcGVjLFxuICAgICAgICBvYmplY3RFbGVtZW50VmFsaWRhdG9yczoge1xuICAgICAgICAgIFwiKlwiOiBmdW5jdGlvbiBfKCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdHlwZTogZnVuY3Rpb24gdHlwZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBBbih7XG4gICAgICAgICAgICAgIGtleTogbiArIFwiLnR5cGVcIixcbiAgICAgICAgICAgICAgdmFsdWU6IHIudHlwZSxcbiAgICAgICAgICAgICAgdmFsdWVTcGVjOiBhLmxheWVyLnR5cGUsXG4gICAgICAgICAgICAgIHN0eWxlOiB0LnN0eWxlLFxuICAgICAgICAgICAgICBzdHlsZVNwZWM6IHQuc3R5bGVTcGVjLFxuICAgICAgICAgICAgICBvYmplY3Q6IHIsXG4gICAgICAgICAgICAgIG9iamVjdEtleTogXCJ0eXBlXCJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZmlsdGVyOiBmbixcbiAgICAgICAgICBsYXlvdXQ6IGZ1bmN0aW9uIGxheW91dCh0KSB7XG4gICAgICAgICAgICByZXR1cm4gJHIoe1xuICAgICAgICAgICAgICBsYXllcjogcixcbiAgICAgICAgICAgICAga2V5OiB0LmtleSxcbiAgICAgICAgICAgICAgdmFsdWU6IHQudmFsdWUsXG4gICAgICAgICAgICAgIHN0eWxlOiB0LnN0eWxlLFxuICAgICAgICAgICAgICBzdHlsZVNwZWM6IHQuc3R5bGVTcGVjLFxuICAgICAgICAgICAgICBvYmplY3RFbGVtZW50VmFsaWRhdG9yczoge1xuICAgICAgICAgICAgICAgIFwiKlwiOiBmdW5jdGlvbiBfKHQpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBtbihCdCh7XG4gICAgICAgICAgICAgICAgICAgIGxheWVyVHlwZTogc1xuICAgICAgICAgICAgICAgICAgfSwgdCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBwYWludDogZnVuY3Rpb24gcGFpbnQodCkge1xuICAgICAgICAgICAgcmV0dXJuICRyKHtcbiAgICAgICAgICAgICAgbGF5ZXI6IHIsXG4gICAgICAgICAgICAgIGtleTogdC5rZXksXG4gICAgICAgICAgICAgIHZhbHVlOiB0LnZhbHVlLFxuICAgICAgICAgICAgICBzdHlsZTogdC5zdHlsZSxcbiAgICAgICAgICAgICAgc3R5bGVTcGVjOiB0LnN0eWxlU3BlYyxcbiAgICAgICAgICAgICAgb2JqZWN0RWxlbWVudFZhbGlkYXRvcnM6IHtcbiAgICAgICAgICAgICAgICBcIipcIjogZnVuY3Rpb24gXyh0KSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZG4oQnQoe1xuICAgICAgICAgICAgICAgICAgICBsYXllclR5cGU6IHNcbiAgICAgICAgICAgICAgICAgIH0sIHQpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGduKHQpIHtcbiAgICAgIHZhciBlID0gdC52YWx1ZSxcbiAgICAgICAgICByID0gdC5rZXksXG4gICAgICAgICAgbiA9IERyKGUpO1xuICAgICAgcmV0dXJuIFwic3RyaW5nXCIgIT09IG4gPyBbbmV3IFB0KHIsIGUsIFwic3RyaW5nIGV4cGVjdGVkLCBcIiArIG4gKyBcIiBmb3VuZFwiKV0gOiBbXTtcbiAgICB9XG5cbiAgICB2YXIgeG4gPSB7XG4gICAgICBwcm9tb3RlSWQ6IGZ1bmN0aW9uIHByb21vdGVJZCh0KSB7XG4gICAgICAgIHZhciBlID0gdC5rZXksXG4gICAgICAgICAgICByID0gdC52YWx1ZTtcbiAgICAgICAgaWYgKFwic3RyaW5nXCIgPT09IERyKHIpKSByZXR1cm4gZ24oe1xuICAgICAgICAgIGtleTogZSxcbiAgICAgICAgICB2YWx1ZTogclxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIG4gPSBbXTtcblxuICAgICAgICBmb3IgKHZhciBpIGluIHIpIHtcbiAgICAgICAgICBuLnB1c2guYXBwbHkobiwgZ24oe1xuICAgICAgICAgICAga2V5OiBlICsgXCIuXCIgKyBpLFxuICAgICAgICAgICAgdmFsdWU6IHJbaV1cbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbjtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gYm4odCkge1xuICAgICAgdmFyIGUgPSB0LnZhbHVlLFxuICAgICAgICAgIHIgPSB0LmtleSxcbiAgICAgICAgICBuID0gdC5zdHlsZVNwZWMsXG4gICAgICAgICAgaSA9IHQuc3R5bGU7XG4gICAgICBpZiAoIWUudHlwZSkgcmV0dXJuIFtuZXcgUHQociwgZSwgJ1widHlwZVwiIGlzIHJlcXVpcmVkJyldO1xuICAgICAgdmFyIGEsXG4gICAgICAgICAgbyA9IFR0KGUudHlwZSk7XG5cbiAgICAgIHN3aXRjaCAobykge1xuICAgICAgICBjYXNlIFwidmVjdG9yXCI6XG4gICAgICAgIGNhc2UgXCJyYXN0ZXJcIjpcbiAgICAgICAgY2FzZSBcInJhc3Rlci1kZW1cIjpcbiAgICAgICAgICByZXR1cm4gJHIoe1xuICAgICAgICAgICAga2V5OiByLFxuICAgICAgICAgICAgdmFsdWU6IGUsXG4gICAgICAgICAgICB2YWx1ZVNwZWM6IG5bXCJzb3VyY2VfXCIgKyBvLnJlcGxhY2UoXCItXCIsIFwiX1wiKV0sXG4gICAgICAgICAgICBzdHlsZTogdC5zdHlsZSxcbiAgICAgICAgICAgIHN0eWxlU3BlYzogbixcbiAgICAgICAgICAgIG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzOiB4blxuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGNhc2UgXCJnZW9qc29uXCI6XG4gICAgICAgICAgaWYgKGEgPSAkcih7XG4gICAgICAgICAgICBrZXk6IHIsXG4gICAgICAgICAgICB2YWx1ZTogZSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzogbi5zb3VyY2VfZ2VvanNvbixcbiAgICAgICAgICAgIHN0eWxlOiBpLFxuICAgICAgICAgICAgc3R5bGVTcGVjOiBuLFxuICAgICAgICAgICAgb2JqZWN0RWxlbWVudFZhbGlkYXRvcnM6IHhuXG4gICAgICAgICAgfSksIGUuY2x1c3RlcikgZm9yICh2YXIgcyBpbiBlLmNsdXN0ZXJQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICB2YXIgdSA9IGUuY2x1c3RlclByb3BlcnRpZXNbc10sXG4gICAgICAgICAgICAgICAgbCA9IHVbMF0sXG4gICAgICAgICAgICAgICAgcCA9IFwic3RyaW5nXCIgPT0gdHlwZW9mIGwgPyBbbCwgW1wiYWNjdW11bGF0ZWRcIl0sIFtcImdldFwiLCBzXV0gOiBsO1xuICAgICAgICAgICAgYS5wdXNoLmFwcGx5KGEsIGVuKHtcbiAgICAgICAgICAgICAga2V5OiByICsgXCIuXCIgKyBzICsgXCIubWFwXCIsXG4gICAgICAgICAgICAgIHZhbHVlOiB1WzFdLFxuICAgICAgICAgICAgICBleHByZXNzaW9uQ29udGV4dDogXCJjbHVzdGVyLW1hcFwiXG4gICAgICAgICAgICB9KSksIGEucHVzaC5hcHBseShhLCBlbih7XG4gICAgICAgICAgICAgIGtleTogciArIFwiLlwiICsgcyArIFwiLnJlZHVjZVwiLFxuICAgICAgICAgICAgICB2YWx1ZTogcCxcbiAgICAgICAgICAgICAgZXhwcmVzc2lvbkNvbnRleHQ6IFwiY2x1c3Rlci1yZWR1Y2VcIlxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYTtcblxuICAgICAgICBjYXNlIFwidmlkZW9cIjpcbiAgICAgICAgICByZXR1cm4gJHIoe1xuICAgICAgICAgICAga2V5OiByLFxuICAgICAgICAgICAgdmFsdWU6IGUsXG4gICAgICAgICAgICB2YWx1ZVNwZWM6IG4uc291cmNlX3ZpZGVvLFxuICAgICAgICAgICAgc3R5bGU6IGksXG4gICAgICAgICAgICBzdHlsZVNwZWM6IG5cbiAgICAgICAgICB9KTtcblxuICAgICAgICBjYXNlIFwiaW1hZ2VcIjpcbiAgICAgICAgICByZXR1cm4gJHIoe1xuICAgICAgICAgICAga2V5OiByLFxuICAgICAgICAgICAgdmFsdWU6IGUsXG4gICAgICAgICAgICB2YWx1ZVNwZWM6IG4uc291cmNlX2ltYWdlLFxuICAgICAgICAgICAgc3R5bGU6IGksXG4gICAgICAgICAgICBzdHlsZVNwZWM6IG5cbiAgICAgICAgICB9KTtcblxuICAgICAgICBjYXNlIFwiY2FudmFzXCI6XG4gICAgICAgICAgcmV0dXJuIFtuZXcgUHQociwgbnVsbCwgXCJQbGVhc2UgdXNlIHJ1bnRpbWUgQVBJcyB0byBhZGQgY2FudmFzIHNvdXJjZXMsIHJhdGhlciB0aGFuIGluY2x1ZGluZyB0aGVtIGluIHN0eWxlc2hlZXRzLlwiLCBcInNvdXJjZS5jYW52YXNcIildO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHJuKHtcbiAgICAgICAgICAgIGtleTogciArIFwiLnR5cGVcIixcbiAgICAgICAgICAgIHZhbHVlOiBlLnR5cGUsXG4gICAgICAgICAgICB2YWx1ZVNwZWM6IHtcbiAgICAgICAgICAgICAgdmFsdWVzOiBbXCJ2ZWN0b3JcIiwgXCJyYXN0ZXJcIiwgXCJyYXN0ZXItZGVtXCIsIFwiZ2VvanNvblwiLCBcInZpZGVvXCIsIFwiaW1hZ2VcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdHlsZTogaSxcbiAgICAgICAgICAgIHN0eWxlU3BlYzogblxuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHduKHQpIHtcbiAgICAgIHZhciBlID0gdC52YWx1ZSxcbiAgICAgICAgICByID0gdC5zdHlsZVNwZWMsXG4gICAgICAgICAgbiA9IHIubGlnaHQsXG4gICAgICAgICAgaSA9IHQuc3R5bGUsXG4gICAgICAgICAgYSA9IFtdLFxuICAgICAgICAgIG8gPSBEcihlKTtcbiAgICAgIGlmICh2b2lkIDAgPT09IGUpIHJldHVybiBhO1xuICAgICAgaWYgKFwib2JqZWN0XCIgIT09IG8pIHJldHVybiBhLmNvbmNhdChbbmV3IFB0KFwibGlnaHRcIiwgZSwgXCJvYmplY3QgZXhwZWN0ZWQsIFwiICsgbyArIFwiIGZvdW5kXCIpXSk7XG5cbiAgICAgIGZvciAodmFyIHMgaW4gZSkge1xuICAgICAgICB2YXIgdSA9IHMubWF0Y2goL14oLiopLXRyYW5zaXRpb24kLyk7XG4gICAgICAgIGEgPSBhLmNvbmNhdCh1ICYmIG5bdVsxXV0gJiYgblt1WzFdXS50cmFuc2l0aW9uID8gQW4oe1xuICAgICAgICAgIGtleTogcyxcbiAgICAgICAgICB2YWx1ZTogZVtzXSxcbiAgICAgICAgICB2YWx1ZVNwZWM6IHIudHJhbnNpdGlvbixcbiAgICAgICAgICBzdHlsZTogaSxcbiAgICAgICAgICBzdHlsZVNwZWM6IHJcbiAgICAgICAgfSkgOiBuW3NdID8gQW4oe1xuICAgICAgICAgIGtleTogcyxcbiAgICAgICAgICB2YWx1ZTogZVtzXSxcbiAgICAgICAgICB2YWx1ZVNwZWM6IG5bc10sXG4gICAgICAgICAgc3R5bGU6IGksXG4gICAgICAgICAgc3R5bGVTcGVjOiByXG4gICAgICAgIH0pIDogW25ldyBQdChzLCBlW3NdLCAndW5rbm93biBwcm9wZXJ0eSBcIicgKyBzICsgJ1wiJyldKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGE7XG4gICAgfVxuXG4gICAgdmFyIF9uID0ge1xuICAgICAgXCIqXCI6IGZ1bmN0aW9uIF8oKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH0sXG4gICAgICBhcnJheTogV3IsXG4gICAgICBib29sZWFuOiBmdW5jdGlvbiBib29sZWFuKHQpIHtcbiAgICAgICAgdmFyIGUgPSB0LnZhbHVlLFxuICAgICAgICAgICAgciA9IHQua2V5LFxuICAgICAgICAgICAgbiA9IERyKGUpO1xuICAgICAgICByZXR1cm4gXCJib29sZWFuXCIgIT09IG4gPyBbbmV3IFB0KHIsIGUsIFwiYm9vbGVhbiBleHBlY3RlZCwgXCIgKyBuICsgXCIgZm91bmRcIildIDogW107XG4gICAgICB9LFxuICAgICAgbnVtYmVyOiBRcixcbiAgICAgIGNvbG9yOiBmdW5jdGlvbiBjb2xvcih0KSB7XG4gICAgICAgIHZhciBlID0gdC5rZXksXG4gICAgICAgICAgICByID0gdC52YWx1ZSxcbiAgICAgICAgICAgIG4gPSBEcihyKTtcbiAgICAgICAgcmV0dXJuIFwic3RyaW5nXCIgIT09IG4gPyBbbmV3IFB0KGUsIHIsIFwiY29sb3IgZXhwZWN0ZWQsIFwiICsgbiArIFwiIGZvdW5kXCIpXSA6IG51bGwgPT09IFF0KHIpID8gW25ldyBQdChlLCByLCAnY29sb3IgZXhwZWN0ZWQsIFwiJyArIHIgKyAnXCIgZm91bmQnKV0gOiBbXTtcbiAgICAgIH0sXG4gICAgICBjb25zdGFudHM6IE10LFxuICAgICAgZW51bTogcm4sXG4gICAgICBmaWx0ZXI6IGZuLFxuICAgICAgZnVuY3Rpb246IHRuLFxuICAgICAgbGF5ZXI6IHZuLFxuICAgICAgb2JqZWN0OiAkcixcbiAgICAgIHNvdXJjZTogYm4sXG4gICAgICBsaWdodDogd24sXG4gICAgICBzdHJpbmc6IGduLFxuICAgICAgZm9ybWF0dGVkOiBmdW5jdGlvbiBmb3JtYXR0ZWQodCkge1xuICAgICAgICByZXR1cm4gMCA9PT0gZ24odCkubGVuZ3RoID8gW10gOiBlbih0KTtcbiAgICAgIH0sXG4gICAgICByZXNvbHZlZEltYWdlOiBmdW5jdGlvbiByZXNvbHZlZEltYWdlKHQpIHtcbiAgICAgICAgcmV0dXJuIDAgPT09IGduKHQpLmxlbmd0aCA/IFtdIDogZW4odCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIEFuKHQpIHtcbiAgICAgIHZhciBlID0gdC52YWx1ZSxcbiAgICAgICAgICByID0gdC52YWx1ZVNwZWMsXG4gICAgICAgICAgbiA9IHQuc3R5bGVTcGVjO1xuICAgICAgcmV0dXJuIHIuZXhwcmVzc2lvbiAmJiBMcihUdChlKSkgPyB0bih0KSA6IHIuZXhwcmVzc2lvbiAmJiBHcihWdChlKSkgPyBlbih0KSA6IHIudHlwZSAmJiBfbltyLnR5cGVdID8gX25bci50eXBlXSh0KSA6ICRyKEJ0KHt9LCB0LCB7XG4gICAgICAgIHZhbHVlU3BlYzogci50eXBlID8gbltyLnR5cGVdIDogclxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFNuKHQpIHtcbiAgICAgIHZhciBlID0gdC52YWx1ZSxcbiAgICAgICAgICByID0gdC5rZXksXG4gICAgICAgICAgbiA9IGduKHQpO1xuICAgICAgcmV0dXJuIG4ubGVuZ3RoIHx8ICgtMSA9PT0gZS5pbmRleE9mKFwie2ZvbnRzdGFja31cIikgJiYgbi5wdXNoKG5ldyBQdChyLCBlLCAnXCJnbHlwaHNcIiB1cmwgbXVzdCBpbmNsdWRlIGEgXCJ7Zm9udHN0YWNrfVwiIHRva2VuJykpLCAtMSA9PT0gZS5pbmRleE9mKFwie3JhbmdlfVwiKSAmJiBuLnB1c2gobmV3IFB0KHIsIGUsICdcImdseXBoc1wiIHVybCBtdXN0IGluY2x1ZGUgYSBcIntyYW5nZX1cIiB0b2tlbicpKSksIG47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24ga24odCwgZSkge1xuICAgICAgdm9pZCAwID09PSBlICYmIChlID0gRXQpO1xuICAgICAgdmFyIHIgPSBbXTtcbiAgICAgIHJldHVybiByID0gci5jb25jYXQoQW4oe1xuICAgICAgICBrZXk6IFwiXCIsXG4gICAgICAgIHZhbHVlOiB0LFxuICAgICAgICB2YWx1ZVNwZWM6IGUuJHJvb3QsXG4gICAgICAgIHN0eWxlU3BlYzogZSxcbiAgICAgICAgc3R5bGU6IHQsXG4gICAgICAgIG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzOiB7XG4gICAgICAgICAgZ2x5cGhzOiBTbixcbiAgICAgICAgICBcIipcIjogZnVuY3Rpb24gXygpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pKSwgdC5jb25zdGFudHMgJiYgKHIgPSByLmNvbmNhdChNdCh7XG4gICAgICAgIGtleTogXCJjb25zdGFudHNcIixcbiAgICAgICAgdmFsdWU6IHQuY29uc3RhbnRzLFxuICAgICAgICBzdHlsZTogdCxcbiAgICAgICAgc3R5bGVTcGVjOiBlXG4gICAgICB9KSkpLCBJbihyKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBJbih0KSB7XG4gICAgICByZXR1cm4gW10uY29uY2F0KHQpLnNvcnQoZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHQubGluZSAtIGUubGluZTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHpuKHQpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvciAodmFyIGUgPSBbXSwgciA9IGFyZ3VtZW50cy5sZW5ndGg7IHItLTspIHtcbiAgICAgICAgICBlW3JdID0gYXJndW1lbnRzW3JdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIEluKHQuYXBwbHkodGhpcywgZSkpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBrbi5zb3VyY2UgPSB6bihibiksIGtuLmxpZ2h0ID0gem4od24pLCBrbi5sYXllciA9IHpuKHZuKSwga24uZmlsdGVyID0gem4oZm4pLCBrbi5wYWludFByb3BlcnR5ID0gem4oZG4pLCBrbi5sYXlvdXRQcm9wZXJ0eSA9IHpuKG1uKTtcbiAgICB2YXIgQ24gPSBrbixcbiAgICAgICAgRW4gPSBDbi5saWdodCxcbiAgICAgICAgUG4gPSBDbi5wYWludFByb3BlcnR5LFxuICAgICAgICBNbiA9IENuLmxheW91dFByb3BlcnR5O1xuXG4gICAgZnVuY3Rpb24gQm4odCwgZSkge1xuICAgICAgdmFyIHIgPSAhMTtcbiAgICAgIGlmIChlICYmIGUubGVuZ3RoKSBmb3IgKHZhciBuID0gMCwgaSA9IGU7IG4gPCBpLmxlbmd0aDsgbiArPSAxKSB7XG4gICAgICAgIHQuZmlyZShuZXcgenQobmV3IEVycm9yKGlbbl0ubWVzc2FnZSkpKSwgciA9ICEwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHI7XG4gICAgfVxuXG4gICAgdmFyIFRuID0gVm47XG5cbiAgICBmdW5jdGlvbiBWbih0LCBlLCByKSB7XG4gICAgICB2YXIgbiA9IHRoaXMuY2VsbHMgPSBbXTtcblxuICAgICAgaWYgKHQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICB0aGlzLmFycmF5QnVmZmVyID0gdDtcbiAgICAgICAgdmFyIGkgPSBuZXcgSW50MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdCA9IGlbMF0sIHRoaXMuZCA9IChlID0gaVsxXSkgKyAyICogKHIgPSBpWzJdKTtcblxuICAgICAgICBmb3IgKHZhciBhID0gMDsgYSA8IHRoaXMuZCAqIHRoaXMuZDsgYSsrKSB7XG4gICAgICAgICAgdmFyIG8gPSBpWzMgKyBhXSxcbiAgICAgICAgICAgICAgcyA9IGlbMyArIGEgKyAxXTtcbiAgICAgICAgICBuLnB1c2gobyA9PT0gcyA/IG51bGwgOiBpLnN1YmFycmF5KG8sIHMpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB1ID0gaVszICsgbi5sZW5ndGggKyAxXTtcbiAgICAgICAgdGhpcy5rZXlzID0gaS5zdWJhcnJheShpWzMgKyBuLmxlbmd0aF0sIHUpLCB0aGlzLmJib3hlcyA9IGkuc3ViYXJyYXkodSksIHRoaXMuaW5zZXJ0ID0gdGhpcy5faW5zZXJ0UmVhZG9ubHk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmQgPSBlICsgMiAqIHI7XG5cbiAgICAgICAgZm9yICh2YXIgbCA9IDA7IGwgPCB0aGlzLmQgKiB0aGlzLmQ7IGwrKykge1xuICAgICAgICAgIG4ucHVzaChbXSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmtleXMgPSBbXSwgdGhpcy5iYm94ZXMgPSBbXTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5uID0gZSwgdGhpcy5leHRlbnQgPSB0LCB0aGlzLnBhZGRpbmcgPSByLCB0aGlzLnNjYWxlID0gZSAvIHQsIHRoaXMudWlkID0gMDtcbiAgICAgIHZhciBwID0gciAvIGUgKiB0O1xuICAgICAgdGhpcy5taW4gPSAtcCwgdGhpcy5tYXggPSB0ICsgcDtcbiAgICB9XG5cbiAgICBWbi5wcm90b3R5cGUuaW5zZXJ0ID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGkpIHtcbiAgICAgIHRoaXMuX2ZvckVhY2hDZWxsKGUsIHIsIG4sIGksIHRoaXMuX2luc2VydENlbGwsIHRoaXMudWlkKyspLCB0aGlzLmtleXMucHVzaCh0KSwgdGhpcy5iYm94ZXMucHVzaChlKSwgdGhpcy5iYm94ZXMucHVzaChyKSwgdGhpcy5iYm94ZXMucHVzaChuKSwgdGhpcy5iYm94ZXMucHVzaChpKTtcbiAgICB9LCBWbi5wcm90b3R5cGUuX2luc2VydFJlYWRvbmx5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhyb3cgXCJDYW5ub3QgaW5zZXJ0IGludG8gYSBHcmlkSW5kZXggY3JlYXRlZCBmcm9tIGFuIEFycmF5QnVmZmVyLlwiO1xuICAgIH0sIFZuLnByb3RvdHlwZS5faW5zZXJ0Q2VsbCA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpLCBhKSB7XG4gICAgICB0aGlzLmNlbGxzW2ldLnB1c2goYSk7XG4gICAgfSwgVm4ucHJvdG90eXBlLnF1ZXJ5ID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGkpIHtcbiAgICAgIHZhciBhID0gdGhpcy5taW4sXG4gICAgICAgICAgbyA9IHRoaXMubWF4O1xuICAgICAgaWYgKHQgPD0gYSAmJiBlIDw9IGEgJiYgbyA8PSByICYmIG8gPD0gbiAmJiAhaSkgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMua2V5cyk7XG4gICAgICB2YXIgcyA9IFtdO1xuICAgICAgcmV0dXJuIHRoaXMuX2ZvckVhY2hDZWxsKHQsIGUsIHIsIG4sIHRoaXMuX3F1ZXJ5Q2VsbCwgcywge30sIGkpLCBzO1xuICAgIH0sIFZuLnByb3RvdHlwZS5fcXVlcnlDZWxsID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGksIGEsIG8sIHMpIHtcbiAgICAgIHZhciB1ID0gdGhpcy5jZWxsc1tpXTtcbiAgICAgIGlmIChudWxsICE9PSB1KSBmb3IgKHZhciBsID0gdGhpcy5rZXlzLCBwID0gdGhpcy5iYm94ZXMsIGMgPSAwOyBjIDwgdS5sZW5ndGg7IGMrKykge1xuICAgICAgICB2YXIgaCA9IHVbY107XG5cbiAgICAgICAgaWYgKHZvaWQgMCA9PT0gb1toXSkge1xuICAgICAgICAgIHZhciBmID0gNCAqIGg7XG4gICAgICAgICAgKHMgPyBzKHBbZiArIDBdLCBwW2YgKyAxXSwgcFtmICsgMl0sIHBbZiArIDNdKSA6IHQgPD0gcFtmICsgMl0gJiYgZSA8PSBwW2YgKyAzXSAmJiByID49IHBbZiArIDBdICYmIG4gPj0gcFtmICsgMV0pID8gKG9baF0gPSAhMCwgYS5wdXNoKGxbaF0pKSA6IG9baF0gPSAhMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIFZuLnByb3RvdHlwZS5fZm9yRWFjaENlbGwgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSwgYSwgbywgcykge1xuICAgICAgZm9yICh2YXIgdSA9IHRoaXMuX2NvbnZlcnRUb0NlbGxDb29yZCh0KSwgbCA9IHRoaXMuX2NvbnZlcnRUb0NlbGxDb29yZChlKSwgcCA9IHRoaXMuX2NvbnZlcnRUb0NlbGxDb29yZChyKSwgYyA9IHRoaXMuX2NvbnZlcnRUb0NlbGxDb29yZChuKSwgaCA9IHU7IGggPD0gcDsgaCsrKSB7XG4gICAgICAgIGZvciAodmFyIGYgPSBsOyBmIDw9IGM7IGYrKykge1xuICAgICAgICAgIHZhciB5ID0gdGhpcy5kICogZiArIGg7XG4gICAgICAgICAgaWYgKCghcyB8fCBzKHRoaXMuX2NvbnZlcnRGcm9tQ2VsbENvb3JkKGgpLCB0aGlzLl9jb252ZXJ0RnJvbUNlbGxDb29yZChmKSwgdGhpcy5fY29udmVydEZyb21DZWxsQ29vcmQoaCArIDEpLCB0aGlzLl9jb252ZXJ0RnJvbUNlbGxDb29yZChmICsgMSkpKSAmJiBpLmNhbGwodGhpcywgdCwgZSwgciwgbiwgeSwgYSwgbywgcykpIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIFZuLnByb3RvdHlwZS5fY29udmVydEZyb21DZWxsQ29vcmQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuICh0IC0gdGhpcy5wYWRkaW5nKSAvIHRoaXMuc2NhbGU7XG4gICAgfSwgVm4ucHJvdG90eXBlLl9jb252ZXJ0VG9DZWxsQ29vcmQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKHRoaXMuZCAtIDEsIE1hdGguZmxvb3IodCAqIHRoaXMuc2NhbGUpICsgdGhpcy5wYWRkaW5nKSk7XG4gICAgfSwgVm4ucHJvdG90eXBlLnRvQXJyYXlCdWZmZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAodGhpcy5hcnJheUJ1ZmZlcikgcmV0dXJuIHRoaXMuYXJyYXlCdWZmZXI7XG5cbiAgICAgIGZvciAodmFyIHQgPSB0aGlzLmNlbGxzLCBlID0gMyArIHRoaXMuY2VsbHMubGVuZ3RoICsgMSArIDEsIHIgPSAwLCBuID0gMDsgbiA8IHRoaXMuY2VsbHMubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgciArPSB0aGlzLmNlbGxzW25dLmxlbmd0aDtcbiAgICAgIH1cblxuICAgICAgdmFyIGkgPSBuZXcgSW50MzJBcnJheShlICsgciArIHRoaXMua2V5cy5sZW5ndGggKyB0aGlzLmJib3hlcy5sZW5ndGgpO1xuICAgICAgaVswXSA9IHRoaXMuZXh0ZW50LCBpWzFdID0gdGhpcy5uLCBpWzJdID0gdGhpcy5wYWRkaW5nO1xuXG4gICAgICBmb3IgKHZhciBhID0gZSwgbyA9IDA7IG8gPCB0Lmxlbmd0aDsgbysrKSB7XG4gICAgICAgIHZhciBzID0gdFtvXTtcbiAgICAgICAgaVszICsgb10gPSBhLCBpLnNldChzLCBhKSwgYSArPSBzLmxlbmd0aDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGlbMyArIHQubGVuZ3RoXSA9IGEsIGkuc2V0KHRoaXMua2V5cywgYSksIGlbMyArIHQubGVuZ3RoICsgMV0gPSBhICs9IHRoaXMua2V5cy5sZW5ndGgsIGkuc2V0KHRoaXMuYmJveGVzLCBhKSwgYSArPSB0aGlzLmJib3hlcy5sZW5ndGgsIGkuYnVmZmVyO1xuICAgIH07XG4gICAgdmFyIEZuID0gby5JbWFnZURhdGEsXG4gICAgICAgIERuID0gby5JbWFnZUJpdG1hcCxcbiAgICAgICAgTG4gPSB7fTtcblxuICAgIGZ1bmN0aW9uIE9uKHQsIGUsIHIpIHtcbiAgICAgIHZvaWQgMCA9PT0gciAmJiAociA9IHt9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX2NsYXNzUmVnaXN0cnlLZXlcIiwge1xuICAgICAgICB2YWx1ZTogdCxcbiAgICAgICAgd3JpdGVhYmxlOiAhMVxuICAgICAgfSksIExuW3RdID0ge1xuICAgICAgICBrbGFzczogZSxcbiAgICAgICAgb21pdDogci5vbWl0IHx8IFtdLFxuICAgICAgICBzaGFsbG93OiByLnNoYWxsb3cgfHwgW11cbiAgICAgIH07XG4gICAgfVxuXG4gICAgZm9yICh2YXIgUm4gaW4gT24oXCJPYmplY3RcIiwgT2JqZWN0KSwgVG4uc2VyaWFsaXplID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHZhciByID0gdC50b0FycmF5QnVmZmVyKCk7XG4gICAgICByZXR1cm4gZSAmJiBlLnB1c2gociksIHtcbiAgICAgICAgYnVmZmVyOiByXG4gICAgICB9O1xuICAgIH0sIFRuLmRlc2VyaWFsaXplID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiBuZXcgVG4odC5idWZmZXIpO1xuICAgIH0sIE9uKFwiR3JpZFwiLCBUbiksIE9uKFwiQ29sb3JcIiwgdGUpLCBPbihcIkVycm9yXCIsIEVycm9yKSwgT24oXCJSZXNvbHZlZEltYWdlXCIsIGllKSwgT24oXCJTdHlsZVByb3BlcnR5RnVuY3Rpb25cIiwgWXIpLCBPbihcIlN0eWxlRXhwcmVzc2lvblwiLCBLciwge1xuICAgICAgb21pdDogW1wiX2V2YWx1YXRvclwiXVxuICAgIH0pLCBPbihcIlpvb21EZXBlbmRlbnRFeHByZXNzaW9uXCIsIEpyKSwgT24oXCJab29tQ29uc3RhbnRFeHByZXNzaW9uXCIsIFhyKSwgT24oXCJDb21wb3VuZEV4cHJlc3Npb25cIiwgeGUsIHtcbiAgICAgIG9taXQ6IFtcIl9ldmFsdWF0ZVwiXVxuICAgIH0pLCBJcikge1xuICAgICAgSXJbUm5dLl9jbGFzc1JlZ2lzdHJ5S2V5IHx8IE9uKFwiRXhwcmVzc2lvbl9cIiArIFJuLCBJcltSbl0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFVuKHQpIHtcbiAgICAgIHJldHVybiB0ICYmIFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIEFycmF5QnVmZmVyICYmICh0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHwgdC5jb25zdHJ1Y3RvciAmJiBcIkFycmF5QnVmZmVyXCIgPT09IHQuY29uc3RydWN0b3IubmFtZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gam4odCkge1xuICAgICAgcmV0dXJuIERuICYmIHQgaW5zdGFuY2VvZiBEbjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBxbih0LCBlKSB7XG4gICAgICBpZiAobnVsbCA9PSB0IHx8IFwiYm9vbGVhblwiID09IHR5cGVvZiB0IHx8IFwibnVtYmVyXCIgPT0gdHlwZW9mIHQgfHwgXCJzdHJpbmdcIiA9PSB0eXBlb2YgdCB8fCB0IGluc3RhbmNlb2YgQm9vbGVhbiB8fCB0IGluc3RhbmNlb2YgTnVtYmVyIHx8IHQgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdCBpbnN0YW5jZW9mIERhdGUgfHwgdCBpbnN0YW5jZW9mIFJlZ0V4cCkgcmV0dXJuIHQ7XG4gICAgICBpZiAoVW4odCkgfHwgam4odCkpIHJldHVybiBlICYmIGUucHVzaCh0KSwgdDtcblxuICAgICAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyh0KSkge1xuICAgICAgICB2YXIgciA9IHQ7XG4gICAgICAgIHJldHVybiBlICYmIGUucHVzaChyLmJ1ZmZlciksIHI7XG4gICAgICB9XG5cbiAgICAgIGlmICh0IGluc3RhbmNlb2YgRm4pIHJldHVybiBlICYmIGUucHVzaCh0LmRhdGEuYnVmZmVyKSwgdDtcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodCkpIHtcbiAgICAgICAgZm9yICh2YXIgbiA9IFtdLCBpID0gMCwgYSA9IHQ7IGkgPCBhLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgbi5wdXNoKHFuKGFbaV0sIGUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuO1xuICAgICAgfVxuXG4gICAgICBpZiAoXCJvYmplY3RcIiA9PSB0eXBlb2YgdCkge1xuICAgICAgICB2YXIgbyA9IHQuY29uc3RydWN0b3IsXG4gICAgICAgICAgICBzID0gby5fY2xhc3NSZWdpc3RyeUtleTtcbiAgICAgICAgaWYgKCFzKSB0aHJvdyBuZXcgRXJyb3IoXCJjYW4ndCBzZXJpYWxpemUgb2JqZWN0IG9mIHVucmVnaXN0ZXJlZCBjbGFzc1wiKTtcbiAgICAgICAgdmFyIHUgPSBvLnNlcmlhbGl6ZSA/IG8uc2VyaWFsaXplKHQsIGUpIDoge307XG5cbiAgICAgICAgaWYgKCFvLnNlcmlhbGl6ZSkge1xuICAgICAgICAgIGZvciAodmFyIGwgaW4gdCkge1xuICAgICAgICAgICAgaWYgKHQuaGFzT3duUHJvcGVydHkobCkgJiYgIShMbltzXS5vbWl0LmluZGV4T2YobCkgPj0gMCkpIHtcbiAgICAgICAgICAgICAgdmFyIHAgPSB0W2xdO1xuICAgICAgICAgICAgICB1W2xdID0gTG5bc10uc2hhbGxvdy5pbmRleE9mKGwpID49IDAgPyBwIDogcW4ocCwgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdCBpbnN0YW5jZW9mIEVycm9yICYmICh1Lm1lc3NhZ2UgPSB0Lm1lc3NhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHUuJG5hbWUpIHRocm93IG5ldyBFcnJvcihcIiRuYW1lIHByb3BlcnR5IGlzIHJlc2VydmVkIGZvciB3b3JrZXIgc2VyaWFsaXphdGlvbiBsb2dpYy5cIik7XG4gICAgICAgIHJldHVybiBcIk9iamVjdFwiICE9PSBzICYmICh1LiRuYW1lID0gcyksIHU7XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcImNhbid0IHNlcmlhbGl6ZSBvYmplY3Qgb2YgdHlwZSBcIiArIHR5cGVvZiB0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBObih0KSB7XG4gICAgICBpZiAobnVsbCA9PSB0IHx8IFwiYm9vbGVhblwiID09IHR5cGVvZiB0IHx8IFwibnVtYmVyXCIgPT0gdHlwZW9mIHQgfHwgXCJzdHJpbmdcIiA9PSB0eXBlb2YgdCB8fCB0IGluc3RhbmNlb2YgQm9vbGVhbiB8fCB0IGluc3RhbmNlb2YgTnVtYmVyIHx8IHQgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdCBpbnN0YW5jZW9mIERhdGUgfHwgdCBpbnN0YW5jZW9mIFJlZ0V4cCB8fCBVbih0KSB8fCBqbih0KSB8fCBBcnJheUJ1ZmZlci5pc1ZpZXcodCkgfHwgdCBpbnN0YW5jZW9mIEZuKSByZXR1cm4gdDtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHQpKSByZXR1cm4gdC5tYXAoTm4pO1xuXG4gICAgICBpZiAoXCJvYmplY3RcIiA9PSB0eXBlb2YgdCkge1xuICAgICAgICB2YXIgZSA9IHQuJG5hbWUgfHwgXCJPYmplY3RcIixcbiAgICAgICAgICAgIHIgPSBMbltlXS5rbGFzcztcbiAgICAgICAgaWYgKCFyKSB0aHJvdyBuZXcgRXJyb3IoXCJjYW4ndCBkZXNlcmlhbGl6ZSB1bnJlZ2lzdGVyZWQgY2xhc3MgXCIgKyBlKTtcbiAgICAgICAgaWYgKHIuZGVzZXJpYWxpemUpIHJldHVybiByLmRlc2VyaWFsaXplKHQpO1xuXG4gICAgICAgIGZvciAodmFyIG4gPSBPYmplY3QuY3JlYXRlKHIucHJvdG90eXBlKSwgaSA9IDAsIGEgPSBPYmplY3Qua2V5cyh0KTsgaSA8IGEubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICB2YXIgbyA9IGFbaV07XG5cbiAgICAgICAgICBpZiAoXCIkbmFtZVwiICE9PSBvKSB7XG4gICAgICAgICAgICB2YXIgcyA9IHRbb107XG4gICAgICAgICAgICBuW29dID0gTG5bZV0uc2hhbGxvdy5pbmRleE9mKG8pID49IDAgPyBzIDogTm4ocyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG47XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcImNhbid0IGRlc2VyaWFsaXplIG9iamVjdCBvZiB0eXBlIFwiICsgdHlwZW9mIHQpO1xuICAgIH1cblxuICAgIHZhciBLbiA9IGZ1bmN0aW9uIEtuKCkge1xuICAgICAgdGhpcy5maXJzdCA9ICEwO1xuICAgIH07XG5cbiAgICBLbi5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHZhciByID0gTWF0aC5mbG9vcih0KTtcbiAgICAgIHJldHVybiB0aGlzLmZpcnN0ID8gKHRoaXMuZmlyc3QgPSAhMSwgdGhpcy5sYXN0SW50ZWdlclpvb20gPSByLCB0aGlzLmxhc3RJbnRlZ2VyWm9vbVRpbWUgPSAwLCB0aGlzLmxhc3Rab29tID0gdCwgdGhpcy5sYXN0Rmxvb3Jab29tID0gciwgITApIDogKHRoaXMubGFzdEZsb29yWm9vbSA+IHIgPyAodGhpcy5sYXN0SW50ZWdlclpvb20gPSByICsgMSwgdGhpcy5sYXN0SW50ZWdlclpvb21UaW1lID0gZSkgOiB0aGlzLmxhc3RGbG9vclpvb20gPCByICYmICh0aGlzLmxhc3RJbnRlZ2VyWm9vbSA9IHIsIHRoaXMubGFzdEludGVnZXJab29tVGltZSA9IGUpLCB0ICE9PSB0aGlzLmxhc3Rab29tICYmICh0aGlzLmxhc3Rab29tID0gdCwgdGhpcy5sYXN0Rmxvb3Jab29tID0gciwgITApKTtcbiAgICB9O1xuXG4gICAgdmFyIEduID0ge1xuICAgICAgXCJMYXRpbi0xIFN1cHBsZW1lbnRcIjogZnVuY3Rpb24gTGF0aW4xU3VwcGxlbWVudCh0KSB7XG4gICAgICAgIHJldHVybiB0ID49IDEyOCAmJiB0IDw9IDI1NTtcbiAgICAgIH0sXG4gICAgICBBcmFiaWM6IGZ1bmN0aW9uIEFyYWJpYyh0KSB7XG4gICAgICAgIHJldHVybiB0ID49IDE1MzYgJiYgdCA8PSAxNzkxO1xuICAgICAgfSxcbiAgICAgIFwiQXJhYmljIFN1cHBsZW1lbnRcIjogZnVuY3Rpb24gQXJhYmljU3VwcGxlbWVudCh0KSB7XG4gICAgICAgIHJldHVybiB0ID49IDE4NzIgJiYgdCA8PSAxOTE5O1xuICAgICAgfSxcbiAgICAgIFwiQXJhYmljIEV4dGVuZGVkLUFcIjogZnVuY3Rpb24gQXJhYmljRXh0ZW5kZWRBKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPj0gMjIwOCAmJiB0IDw9IDIzMDM7XG4gICAgICB9LFxuICAgICAgXCJIYW5ndWwgSmFtb1wiOiBmdW5jdGlvbiBIYW5ndWxKYW1vKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPj0gNDM1MiAmJiB0IDw9IDQ2MDc7XG4gICAgICB9LFxuICAgICAgXCJVbmlmaWVkIENhbmFkaWFuIEFib3JpZ2luYWwgU3lsbGFiaWNzXCI6IGZ1bmN0aW9uIFVuaWZpZWRDYW5hZGlhbkFib3JpZ2luYWxTeWxsYWJpY3ModCkge1xuICAgICAgICByZXR1cm4gdCA+PSA1MTIwICYmIHQgPD0gNTc1OTtcbiAgICAgIH0sXG4gICAgICBLaG1lcjogZnVuY3Rpb24gS2htZXIodCkge1xuICAgICAgICByZXR1cm4gdCA+PSA2MDE2ICYmIHQgPD0gNjE0MztcbiAgICAgIH0sXG4gICAgICBcIlVuaWZpZWQgQ2FuYWRpYW4gQWJvcmlnaW5hbCBTeWxsYWJpY3MgRXh0ZW5kZWRcIjogZnVuY3Rpb24gVW5pZmllZENhbmFkaWFuQWJvcmlnaW5hbFN5bGxhYmljc0V4dGVuZGVkKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPj0gNjMyMCAmJiB0IDw9IDYzOTk7XG4gICAgICB9LFxuICAgICAgXCJHZW5lcmFsIFB1bmN0dWF0aW9uXCI6IGZ1bmN0aW9uIEdlbmVyYWxQdW5jdHVhdGlvbih0KSB7XG4gICAgICAgIHJldHVybiB0ID49IDgxOTIgJiYgdCA8PSA4MzAzO1xuICAgICAgfSxcbiAgICAgIFwiTGV0dGVybGlrZSBTeW1ib2xzXCI6IGZ1bmN0aW9uIExldHRlcmxpa2VTeW1ib2xzKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPj0gODQ0OCAmJiB0IDw9IDg1Mjc7XG4gICAgICB9LFxuICAgICAgXCJOdW1iZXIgRm9ybXNcIjogZnVuY3Rpb24gTnVtYmVyRm9ybXModCkge1xuICAgICAgICByZXR1cm4gdCA+PSA4NTI4ICYmIHQgPD0gODU5MTtcbiAgICAgIH0sXG4gICAgICBcIk1pc2NlbGxhbmVvdXMgVGVjaG5pY2FsXCI6IGZ1bmN0aW9uIE1pc2NlbGxhbmVvdXNUZWNobmljYWwodCkge1xuICAgICAgICByZXR1cm4gdCA+PSA4OTYwICYmIHQgPD0gOTIxNTtcbiAgICAgIH0sXG4gICAgICBcIkNvbnRyb2wgUGljdHVyZXNcIjogZnVuY3Rpb24gQ29udHJvbFBpY3R1cmVzKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPj0gOTIxNiAmJiB0IDw9IDkyNzk7XG4gICAgICB9LFxuICAgICAgXCJPcHRpY2FsIENoYXJhY3RlciBSZWNvZ25pdGlvblwiOiBmdW5jdGlvbiBPcHRpY2FsQ2hhcmFjdGVyUmVjb2duaXRpb24odCkge1xuICAgICAgICByZXR1cm4gdCA+PSA5MjgwICYmIHQgPD0gOTMxMTtcbiAgICAgIH0sXG4gICAgICBcIkVuY2xvc2VkIEFscGhhbnVtZXJpY3NcIjogZnVuY3Rpb24gRW5jbG9zZWRBbHBoYW51bWVyaWNzKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPj0gOTMxMiAmJiB0IDw9IDk0NzE7XG4gICAgICB9LFxuICAgICAgXCJHZW9tZXRyaWMgU2hhcGVzXCI6IGZ1bmN0aW9uIEdlb21ldHJpY1NoYXBlcyh0KSB7XG4gICAgICAgIHJldHVybiB0ID49IDk2MzIgJiYgdCA8PSA5NzI3O1xuICAgICAgfSxcbiAgICAgIFwiTWlzY2VsbGFuZW91cyBTeW1ib2xzXCI6IGZ1bmN0aW9uIE1pc2NlbGxhbmVvdXNTeW1ib2xzKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPj0gOTcyOCAmJiB0IDw9IDk5ODM7XG4gICAgICB9LFxuICAgICAgXCJNaXNjZWxsYW5lb3VzIFN5bWJvbHMgYW5kIEFycm93c1wiOiBmdW5jdGlvbiBNaXNjZWxsYW5lb3VzU3ltYm9sc0FuZEFycm93cyh0KSB7XG4gICAgICAgIHJldHVybiB0ID49IDExMDA4ICYmIHQgPD0gMTEyNjM7XG4gICAgICB9LFxuICAgICAgXCJDSksgUmFkaWNhbHMgU3VwcGxlbWVudFwiOiBmdW5jdGlvbiBDSktSYWRpY2Fsc1N1cHBsZW1lbnQodCkge1xuICAgICAgICByZXR1cm4gdCA+PSAxMTkwNCAmJiB0IDw9IDEyMDMxO1xuICAgICAgfSxcbiAgICAgIFwiS2FuZ3hpIFJhZGljYWxzXCI6IGZ1bmN0aW9uIEthbmd4aVJhZGljYWxzKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPj0gMTIwMzIgJiYgdCA8PSAxMjI1NTtcbiAgICAgIH0sXG4gICAgICBcIklkZW9ncmFwaGljIERlc2NyaXB0aW9uIENoYXJhY3RlcnNcIjogZnVuY3Rpb24gSWRlb2dyYXBoaWNEZXNjcmlwdGlvbkNoYXJhY3RlcnModCkge1xuICAgICAgICByZXR1cm4gdCA+PSAxMjI3MiAmJiB0IDw9IDEyMjg3O1xuICAgICAgfSxcbiAgICAgIFwiQ0pLIFN5bWJvbHMgYW5kIFB1bmN0dWF0aW9uXCI6IGZ1bmN0aW9uIENKS1N5bWJvbHNBbmRQdW5jdHVhdGlvbih0KSB7XG4gICAgICAgIHJldHVybiB0ID49IDEyMjg4ICYmIHQgPD0gMTIzNTE7XG4gICAgICB9LFxuICAgICAgSGlyYWdhbmE6IGZ1bmN0aW9uIEhpcmFnYW5hKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPj0gMTIzNTIgJiYgdCA8PSAxMjQ0NztcbiAgICAgIH0sXG4gICAgICBLYXRha2FuYTogZnVuY3Rpb24gS2F0YWthbmEodCkge1xuICAgICAgICByZXR1cm4gdCA+PSAxMjQ0OCAmJiB0IDw9IDEyNTQzO1xuICAgICAgfSxcbiAgICAgIEJvcG9tb2ZvOiBmdW5jdGlvbiBCb3BvbW9mbyh0KSB7XG4gICAgICAgIHJldHVybiB0ID49IDEyNTQ0ICYmIHQgPD0gMTI1OTE7XG4gICAgICB9LFxuICAgICAgXCJIYW5ndWwgQ29tcGF0aWJpbGl0eSBKYW1vXCI6IGZ1bmN0aW9uIEhhbmd1bENvbXBhdGliaWxpdHlKYW1vKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPj0gMTI1OTIgJiYgdCA8PSAxMjY4NztcbiAgICAgIH0sXG4gICAgICBLYW5idW46IGZ1bmN0aW9uIEthbmJ1bih0KSB7XG4gICAgICAgIHJldHVybiB0ID49IDEyNjg4ICYmIHQgPD0gMTI3MDM7XG4gICAgICB9LFxuICAgICAgXCJCb3BvbW9mbyBFeHRlbmRlZFwiOiBmdW5jdGlvbiBCb3BvbW9mb0V4dGVuZGVkKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPj0gMTI3MDQgJiYgdCA8PSAxMjczNTtcbiAgICAgIH0sXG4gICAgICBcIkNKSyBTdHJva2VzXCI6IGZ1bmN0aW9uIENKS1N0cm9rZXModCkge1xuICAgICAgICByZXR1cm4gdCA+PSAxMjczNiAmJiB0IDw9IDEyNzgzO1xuICAgICAgfSxcbiAgICAgIFwiS2F0YWthbmEgUGhvbmV0aWMgRXh0ZW5zaW9uc1wiOiBmdW5jdGlvbiBLYXRha2FuYVBob25ldGljRXh0ZW5zaW9ucyh0KSB7XG4gICAgICAgIHJldHVybiB0ID49IDEyNzg0ICYmIHQgPD0gMTI3OTk7XG4gICAgICB9LFxuICAgICAgXCJFbmNsb3NlZCBDSksgTGV0dGVycyBhbmQgTW9udGhzXCI6IGZ1bmN0aW9uIEVuY2xvc2VkQ0pLTGV0dGVyc0FuZE1vbnRocyh0KSB7XG4gICAgICAgIHJldHVybiB0ID49IDEyODAwICYmIHQgPD0gMTMwNTU7XG4gICAgICB9LFxuICAgICAgXCJDSksgQ29tcGF0aWJpbGl0eVwiOiBmdW5jdGlvbiBDSktDb21wYXRpYmlsaXR5KHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPj0gMTMwNTYgJiYgdCA8PSAxMzMxMTtcbiAgICAgIH0sXG4gICAgICBcIkNKSyBVbmlmaWVkIElkZW9ncmFwaHMgRXh0ZW5zaW9uIEFcIjogZnVuY3Rpb24gQ0pLVW5pZmllZElkZW9ncmFwaHNFeHRlbnNpb25BKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPj0gMTMzMTIgJiYgdCA8PSAxOTkwMztcbiAgICAgIH0sXG4gICAgICBcIllpamluZyBIZXhhZ3JhbSBTeW1ib2xzXCI6IGZ1bmN0aW9uIFlpamluZ0hleGFncmFtU3ltYm9scyh0KSB7XG4gICAgICAgIHJldHVybiB0ID49IDE5OTA0ICYmIHQgPD0gMTk5Njc7XG4gICAgICB9LFxuICAgICAgXCJDSksgVW5pZmllZCBJZGVvZ3JhcGhzXCI6IGZ1bmN0aW9uIENKS1VuaWZpZWRJZGVvZ3JhcGhzKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPj0gMTk5NjggJiYgdCA8PSA0MDk1OTtcbiAgICAgIH0sXG4gICAgICBcIllpIFN5bGxhYmxlc1wiOiBmdW5jdGlvbiBZaVN5bGxhYmxlcyh0KSB7XG4gICAgICAgIHJldHVybiB0ID49IDQwOTYwICYmIHQgPD0gNDIxMjc7XG4gICAgICB9LFxuICAgICAgXCJZaSBSYWRpY2Fsc1wiOiBmdW5jdGlvbiBZaVJhZGljYWxzKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPj0gNDIxMjggJiYgdCA8PSA0MjE5MTtcbiAgICAgIH0sXG4gICAgICBcIkhhbmd1bCBKYW1vIEV4dGVuZGVkLUFcIjogZnVuY3Rpb24gSGFuZ3VsSmFtb0V4dGVuZGVkQSh0KSB7XG4gICAgICAgIHJldHVybiB0ID49IDQzMzYwICYmIHQgPD0gNDMzOTE7XG4gICAgICB9LFxuICAgICAgXCJIYW5ndWwgU3lsbGFibGVzXCI6IGZ1bmN0aW9uIEhhbmd1bFN5bGxhYmxlcyh0KSB7XG4gICAgICAgIHJldHVybiB0ID49IDQ0MDMyICYmIHQgPD0gNTUyMTU7XG4gICAgICB9LFxuICAgICAgXCJIYW5ndWwgSmFtbyBFeHRlbmRlZC1CXCI6IGZ1bmN0aW9uIEhhbmd1bEphbW9FeHRlbmRlZEIodCkge1xuICAgICAgICByZXR1cm4gdCA+PSA1NTIxNiAmJiB0IDw9IDU1Mjk1O1xuICAgICAgfSxcbiAgICAgIFwiUHJpdmF0ZSBVc2UgQXJlYVwiOiBmdW5jdGlvbiBQcml2YXRlVXNlQXJlYSh0KSB7XG4gICAgICAgIHJldHVybiB0ID49IDU3MzQ0ICYmIHQgPD0gNjM3NDM7XG4gICAgICB9LFxuICAgICAgXCJDSksgQ29tcGF0aWJpbGl0eSBJZGVvZ3JhcGhzXCI6IGZ1bmN0aW9uIENKS0NvbXBhdGliaWxpdHlJZGVvZ3JhcGhzKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPj0gNjM3NDQgJiYgdCA8PSA2NDI1NTtcbiAgICAgIH0sXG4gICAgICBcIkFyYWJpYyBQcmVzZW50YXRpb24gRm9ybXMtQVwiOiBmdW5jdGlvbiBBcmFiaWNQcmVzZW50YXRpb25Gb3Jtc0EodCkge1xuICAgICAgICByZXR1cm4gdCA+PSA2NDMzNiAmJiB0IDw9IDY1MDIzO1xuICAgICAgfSxcbiAgICAgIFwiVmVydGljYWwgRm9ybXNcIjogZnVuY3Rpb24gVmVydGljYWxGb3Jtcyh0KSB7XG4gICAgICAgIHJldHVybiB0ID49IDY1MDQwICYmIHQgPD0gNjUwNTU7XG4gICAgICB9LFxuICAgICAgXCJDSksgQ29tcGF0aWJpbGl0eSBGb3Jtc1wiOiBmdW5jdGlvbiBDSktDb21wYXRpYmlsaXR5Rm9ybXModCkge1xuICAgICAgICByZXR1cm4gdCA+PSA2NTA3MiAmJiB0IDw9IDY1MTAzO1xuICAgICAgfSxcbiAgICAgIFwiU21hbGwgRm9ybSBWYXJpYW50c1wiOiBmdW5jdGlvbiBTbWFsbEZvcm1WYXJpYW50cyh0KSB7XG4gICAgICAgIHJldHVybiB0ID49IDY1MTA0ICYmIHQgPD0gNjUxMzU7XG4gICAgICB9LFxuICAgICAgXCJBcmFiaWMgUHJlc2VudGF0aW9uIEZvcm1zLUJcIjogZnVuY3Rpb24gQXJhYmljUHJlc2VudGF0aW9uRm9ybXNCKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPj0gNjUxMzYgJiYgdCA8PSA2NTI3OTtcbiAgICAgIH0sXG4gICAgICBcIkhhbGZ3aWR0aCBhbmQgRnVsbHdpZHRoIEZvcm1zXCI6IGZ1bmN0aW9uIEhhbGZ3aWR0aEFuZEZ1bGx3aWR0aEZvcm1zKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPj0gNjUyODAgJiYgdCA8PSA2NTUxOTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gWm4odCkge1xuICAgICAgZm9yICh2YXIgZSA9IDAsIHIgPSB0OyBlIDwgci5sZW5ndGg7IGUgKz0gMSkge1xuICAgICAgICBpZiAoWG4ocltlXS5jaGFyQ29kZUF0KDApKSkgcmV0dXJuICEwO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gITE7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gWG4odCkge1xuICAgICAgcmV0dXJuICEoNzQ2ICE9PSB0ICYmIDc0NyAhPT0gdCAmJiAodCA8IDQzNTIgfHwgIShHbltcIkJvcG9tb2ZvIEV4dGVuZGVkXCJdKHQpIHx8IEduLkJvcG9tb2ZvKHQpIHx8IEduW1wiQ0pLIENvbXBhdGliaWxpdHkgRm9ybXNcIl0odCkgJiYgISh0ID49IDY1MDk3ICYmIHQgPD0gNjUxMDMpIHx8IEduW1wiQ0pLIENvbXBhdGliaWxpdHkgSWRlb2dyYXBoc1wiXSh0KSB8fCBHbltcIkNKSyBDb21wYXRpYmlsaXR5XCJdKHQpIHx8IEduW1wiQ0pLIFJhZGljYWxzIFN1cHBsZW1lbnRcIl0odCkgfHwgR25bXCJDSksgU3Ryb2tlc1wiXSh0KSB8fCAhKCFHbltcIkNKSyBTeW1ib2xzIGFuZCBQdW5jdHVhdGlvblwiXSh0KSB8fCB0ID49IDEyMjk2ICYmIHQgPD0gMTIzMDUgfHwgdCA+PSAxMjMwOCAmJiB0IDw9IDEyMzE5IHx8IDEyMzM2ID09PSB0KSB8fCBHbltcIkNKSyBVbmlmaWVkIElkZW9ncmFwaHMgRXh0ZW5zaW9uIEFcIl0odCkgfHwgR25bXCJDSksgVW5pZmllZCBJZGVvZ3JhcGhzXCJdKHQpIHx8IEduW1wiRW5jbG9zZWQgQ0pLIExldHRlcnMgYW5kIE1vbnRoc1wiXSh0KSB8fCBHbltcIkhhbmd1bCBDb21wYXRpYmlsaXR5IEphbW9cIl0odCkgfHwgR25bXCJIYW5ndWwgSmFtbyBFeHRlbmRlZC1BXCJdKHQpIHx8IEduW1wiSGFuZ3VsIEphbW8gRXh0ZW5kZWQtQlwiXSh0KSB8fCBHbltcIkhhbmd1bCBKYW1vXCJdKHQpIHx8IEduW1wiSGFuZ3VsIFN5bGxhYmxlc1wiXSh0KSB8fCBHbi5IaXJhZ2FuYSh0KSB8fCBHbltcIklkZW9ncmFwaGljIERlc2NyaXB0aW9uIENoYXJhY3RlcnNcIl0odCkgfHwgR24uS2FuYnVuKHQpIHx8IEduW1wiS2FuZ3hpIFJhZGljYWxzXCJdKHQpIHx8IEduW1wiS2F0YWthbmEgUGhvbmV0aWMgRXh0ZW5zaW9uc1wiXSh0KSB8fCBHbi5LYXRha2FuYSh0KSAmJiAxMjU0MCAhPT0gdCB8fCAhKCFHbltcIkhhbGZ3aWR0aCBhbmQgRnVsbHdpZHRoIEZvcm1zXCJdKHQpIHx8IDY1Mjg4ID09PSB0IHx8IDY1Mjg5ID09PSB0IHx8IDY1MjkzID09PSB0IHx8IHQgPj0gNjUzMDYgJiYgdCA8PSA2NTMxMCB8fCA2NTMzOSA9PT0gdCB8fCA2NTM0MSA9PT0gdCB8fCA2NTM0MyA9PT0gdCB8fCB0ID49IDY1MzcxICYmIHQgPD0gNjU1MDMgfHwgNjU1MDcgPT09IHQgfHwgdCA+PSA2NTUxMiAmJiB0IDw9IDY1NTE5KSB8fCAhKCFHbltcIlNtYWxsIEZvcm0gVmFyaWFudHNcIl0odCkgfHwgdCA+PSA2NTExMiAmJiB0IDw9IDY1MTE4IHx8IHQgPj0gNjUxMjMgJiYgdCA8PSA2NTEyNikgfHwgR25bXCJVbmlmaWVkIENhbmFkaWFuIEFib3JpZ2luYWwgU3lsbGFiaWNzXCJdKHQpIHx8IEduW1wiVW5pZmllZCBDYW5hZGlhbiBBYm9yaWdpbmFsIFN5bGxhYmljcyBFeHRlbmRlZFwiXSh0KSB8fCBHbltcIlZlcnRpY2FsIEZvcm1zXCJdKHQpIHx8IEduW1wiWWlqaW5nIEhleGFncmFtIFN5bWJvbHNcIl0odCkgfHwgR25bXCJZaSBTeWxsYWJsZXNcIl0odCkgfHwgR25bXCJZaSBSYWRpY2Fsc1wiXSh0KSkpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBKbih0KSB7XG4gICAgICByZXR1cm4gIShYbih0KSB8fCBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gISEoR25bXCJMYXRpbi0xIFN1cHBsZW1lbnRcIl0odCkgJiYgKDE2NyA9PT0gdCB8fCAxNjkgPT09IHQgfHwgMTc0ID09PSB0IHx8IDE3NyA9PT0gdCB8fCAxODggPT09IHQgfHwgMTg5ID09PSB0IHx8IDE5MCA9PT0gdCB8fCAyMTUgPT09IHQgfHwgMjQ3ID09PSB0KSB8fCBHbltcIkdlbmVyYWwgUHVuY3R1YXRpb25cIl0odCkgJiYgKDgyMTQgPT09IHQgfHwgODIyNCA9PT0gdCB8fCA4MjI1ID09PSB0IHx8IDgyNDAgPT09IHQgfHwgODI0MSA9PT0gdCB8fCA4MjUxID09PSB0IHx8IDgyNTIgPT09IHQgfHwgODI1OCA9PT0gdCB8fCA4MjYzID09PSB0IHx8IDgyNjQgPT09IHQgfHwgODI2NSA9PT0gdCB8fCA4MjczID09PSB0KSB8fCBHbltcIkxldHRlcmxpa2UgU3ltYm9sc1wiXSh0KSB8fCBHbltcIk51bWJlciBGb3Jtc1wiXSh0KSB8fCBHbltcIk1pc2NlbGxhbmVvdXMgVGVjaG5pY2FsXCJdKHQpICYmICh0ID49IDg5NjAgJiYgdCA8PSA4OTY3IHx8IHQgPj0gODk3MiAmJiB0IDw9IDg5OTEgfHwgdCA+PSA4OTk2ICYmIHQgPD0gOWUzIHx8IDkwMDMgPT09IHQgfHwgdCA+PSA5MDg1ICYmIHQgPD0gOTExNCB8fCB0ID49IDkxNTAgJiYgdCA8PSA5MTY1IHx8IDkxNjcgPT09IHQgfHwgdCA+PSA5MTY5ICYmIHQgPD0gOTE3OSB8fCB0ID49IDkxODYgJiYgdCA8PSA5MjE1KSB8fCBHbltcIkNvbnRyb2wgUGljdHVyZXNcIl0odCkgJiYgOTI1MSAhPT0gdCB8fCBHbltcIk9wdGljYWwgQ2hhcmFjdGVyIFJlY29nbml0aW9uXCJdKHQpIHx8IEduW1wiRW5jbG9zZWQgQWxwaGFudW1lcmljc1wiXSh0KSB8fCBHbltcIkdlb21ldHJpYyBTaGFwZXNcIl0odCkgfHwgR25bXCJNaXNjZWxsYW5lb3VzIFN5bWJvbHNcIl0odCkgJiYgISh0ID49IDk3NTQgJiYgdCA8PSA5NzU5KSB8fCBHbltcIk1pc2NlbGxhbmVvdXMgU3ltYm9scyBhbmQgQXJyb3dzXCJdKHQpICYmICh0ID49IDExMDI2ICYmIHQgPD0gMTEwNTUgfHwgdCA+PSAxMTA4OCAmJiB0IDw9IDExMDk3IHx8IHQgPj0gMTExOTIgJiYgdCA8PSAxMTI0MykgfHwgR25bXCJDSksgU3ltYm9scyBhbmQgUHVuY3R1YXRpb25cIl0odCkgfHwgR24uS2F0YWthbmEodCkgfHwgR25bXCJQcml2YXRlIFVzZSBBcmVhXCJdKHQpIHx8IEduW1wiQ0pLIENvbXBhdGliaWxpdHkgRm9ybXNcIl0odCkgfHwgR25bXCJTbWFsbCBGb3JtIFZhcmlhbnRzXCJdKHQpIHx8IEduW1wiSGFsZndpZHRoIGFuZCBGdWxsd2lkdGggRm9ybXNcIl0odCkgfHwgODczNCA9PT0gdCB8fCA4NzU2ID09PSB0IHx8IDg3NTcgPT09IHQgfHwgdCA+PSA5OTg0ICYmIHQgPD0gMTAwODcgfHwgdCA+PSAxMDEwMiAmJiB0IDw9IDEwMTMxIHx8IDY1NTMyID09PSB0IHx8IDY1NTMzID09PSB0KTtcbiAgICAgIH0odCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIEhuKHQpIHtcbiAgICAgIHJldHVybiB0ID49IDE0MjQgJiYgdCA8PSAyMzAzIHx8IEduW1wiQXJhYmljIFByZXNlbnRhdGlvbiBGb3Jtcy1BXCJdKHQpIHx8IEduW1wiQXJhYmljIFByZXNlbnRhdGlvbiBGb3Jtcy1CXCJdKHQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFluKHQsIGUpIHtcbiAgICAgIHJldHVybiAhKCFlICYmIEhuKHQpIHx8IHQgPj0gMjMwNCAmJiB0IDw9IDM1ODMgfHwgdCA+PSAzODQwICYmIHQgPD0gNDI1NSB8fCBHbi5LaG1lcih0KSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gJG4odCkge1xuICAgICAgZm9yICh2YXIgZSA9IDAsIHIgPSB0OyBlIDwgci5sZW5ndGg7IGUgKz0gMSkge1xuICAgICAgICBpZiAoSG4ocltlXS5jaGFyQ29kZUF0KDApKSkgcmV0dXJuICEwO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gITE7XG4gICAgfVxuXG4gICAgdmFyIFduID0gbnVsbCxcbiAgICAgICAgUW4gPSBcInVuYXZhaWxhYmxlXCIsXG4gICAgICAgIHRpID0gbnVsbCxcbiAgICAgICAgZWkgPSBmdW5jdGlvbiBlaSh0KSB7XG4gICAgICB0ICYmIFwic3RyaW5nXCIgPT0gdHlwZW9mIHQgJiYgdC5pbmRleE9mKFwiTmV0d29ya0Vycm9yXCIpID4gLTEgJiYgKFFuID0gXCJlcnJvclwiKSwgV24gJiYgV24odCk7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHJpKCkge1xuICAgICAgbmkuZmlyZShuZXcgSXQoXCJwbHVnaW5TdGF0ZUNoYW5nZVwiLCB7XG4gICAgICAgIHBsdWdpblN0YXR1czogUW4sXG4gICAgICAgIHBsdWdpblVSTDogdGlcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICB2YXIgbmkgPSBuZXcgQ3QoKSxcbiAgICAgICAgaWkgPSBmdW5jdGlvbiBpaSgpIHtcbiAgICAgIHJldHVybiBRbjtcbiAgICB9LFxuICAgICAgICBhaSA9IGZ1bmN0aW9uIGFpKCkge1xuICAgICAgaWYgKFwiZGVmZXJyZWRcIiAhPT0gUW4gfHwgIXRpKSB0aHJvdyBuZXcgRXJyb3IoXCJydGwtdGV4dC1wbHVnaW4gY2Fubm90IGJlIGRvd25sb2FkZWQgdW5sZXNzIGEgcGx1Z2luVVJMIGlzIHNwZWNpZmllZFwiKTtcbiAgICAgIFFuID0gXCJsb2FkaW5nXCIsIHJpKCksIHRpICYmIGJ0KHtcbiAgICAgICAgdXJsOiB0aVxuICAgICAgfSwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdCA/IGVpKHQpIDogKFFuID0gXCJsb2FkZWRcIiwgcmkoKSk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgICAgICBvaSA9IHtcbiAgICAgIGFwcGx5QXJhYmljU2hhcGluZzogbnVsbCxcbiAgICAgIHByb2Nlc3NCaWRpcmVjdGlvbmFsVGV4dDogbnVsbCxcbiAgICAgIHByb2Nlc3NTdHlsZWRCaWRpcmVjdGlvbmFsVGV4dDogbnVsbCxcbiAgICAgIGlzTG9hZGVkOiBmdW5jdGlvbiBpc0xvYWRlZCgpIHtcbiAgICAgICAgcmV0dXJuIFwibG9hZGVkXCIgPT09IFFuIHx8IG51bGwgIT0gb2kuYXBwbHlBcmFiaWNTaGFwaW5nO1xuICAgICAgfSxcbiAgICAgIGlzTG9hZGluZzogZnVuY3Rpb24gaXNMb2FkaW5nKCkge1xuICAgICAgICByZXR1cm4gXCJsb2FkaW5nXCIgPT09IFFuO1xuICAgICAgfSxcbiAgICAgIHNldFN0YXRlOiBmdW5jdGlvbiBzZXRTdGF0ZSh0KSB7XG4gICAgICAgIFFuID0gdC5wbHVnaW5TdGF0dXMsIHRpID0gdC5wbHVnaW5VUkw7XG4gICAgICB9LFxuICAgICAgaXNQYXJzZWQ6IGZ1bmN0aW9uIGlzUGFyc2VkKCkge1xuICAgICAgICByZXR1cm4gbnVsbCAhPSBvaS5hcHBseUFyYWJpY1NoYXBpbmcgJiYgbnVsbCAhPSBvaS5wcm9jZXNzQmlkaXJlY3Rpb25hbFRleHQgJiYgbnVsbCAhPSBvaS5wcm9jZXNzU3R5bGVkQmlkaXJlY3Rpb25hbFRleHQ7XG4gICAgICB9LFxuICAgICAgZ2V0UGx1Z2luVVJMOiBmdW5jdGlvbiBnZXRQbHVnaW5VUkwoKSB7XG4gICAgICAgIHJldHVybiB0aTtcbiAgICAgIH1cbiAgICB9LFxuICAgICAgICBzaSA9IGZ1bmN0aW9uIHNpKHQsIGUpIHtcbiAgICAgIHRoaXMuem9vbSA9IHQsIGUgPyAodGhpcy5ub3cgPSBlLm5vdywgdGhpcy5mYWRlRHVyYXRpb24gPSBlLmZhZGVEdXJhdGlvbiwgdGhpcy56b29tSGlzdG9yeSA9IGUuem9vbUhpc3RvcnksIHRoaXMudHJhbnNpdGlvbiA9IGUudHJhbnNpdGlvbikgOiAodGhpcy5ub3cgPSAwLCB0aGlzLmZhZGVEdXJhdGlvbiA9IDAsIHRoaXMuem9vbUhpc3RvcnkgPSBuZXcgS24oKSwgdGhpcy50cmFuc2l0aW9uID0ge30pO1xuICAgIH07XG5cbiAgICBzaS5wcm90b3R5cGUuaXNTdXBwb3J0ZWRTY3JpcHQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIGZvciAodmFyIHIgPSAwLCBuID0gdDsgciA8IG4ubGVuZ3RoOyByICs9IDEpIHtcbiAgICAgICAgICBpZiAoIVluKG5bcl0uY2hhckNvZGVBdCgwKSwgZSkpIHJldHVybiAhMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhMDtcbiAgICAgIH0odCwgb2kuaXNMb2FkZWQoKSk7XG4gICAgfSwgc2kucHJvdG90eXBlLmNyb3NzRmFkaW5nRmFjdG9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIDAgPT09IHRoaXMuZmFkZUR1cmF0aW9uID8gMSA6IE1hdGgubWluKCh0aGlzLm5vdyAtIHRoaXMuem9vbUhpc3RvcnkubGFzdEludGVnZXJab29tVGltZSkgLyB0aGlzLmZhZGVEdXJhdGlvbiwgMSk7XG4gICAgfSwgc2kucHJvdG90eXBlLmdldENyb3NzZmFkZVBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdCA9IHRoaXMuem9vbSxcbiAgICAgICAgICBlID0gdCAtIE1hdGguZmxvb3IodCksXG4gICAgICAgICAgciA9IHRoaXMuY3Jvc3NGYWRpbmdGYWN0b3IoKTtcbiAgICAgIHJldHVybiB0ID4gdGhpcy56b29tSGlzdG9yeS5sYXN0SW50ZWdlclpvb20gPyB7XG4gICAgICAgIGZyb21TY2FsZTogMixcbiAgICAgICAgdG9TY2FsZTogMSxcbiAgICAgICAgdDogZSArICgxIC0gZSkgKiByXG4gICAgICB9IDoge1xuICAgICAgICBmcm9tU2NhbGU6IC41LFxuICAgICAgICB0b1NjYWxlOiAxLFxuICAgICAgICB0OiAxIC0gKDEgLSByKSAqIGVcbiAgICAgIH07XG4gICAgfTtcblxuICAgIHZhciB1aSA9IGZ1bmN0aW9uIHVpKHQsIGUpIHtcbiAgICAgIHRoaXMucHJvcGVydHkgPSB0LCB0aGlzLnZhbHVlID0gZSwgdGhpcy5leHByZXNzaW9uID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgaWYgKExyKHQpKSByZXR1cm4gbmV3IFlyKHQsIGUpO1xuXG4gICAgICAgIGlmIChHcih0KSkge1xuICAgICAgICAgIHZhciByID0gSHIodCwgZSk7XG4gICAgICAgICAgaWYgKFwiZXJyb3JcIiA9PT0gci5yZXN1bHQpIHRocm93IG5ldyBFcnJvcihyLnZhbHVlLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgcmV0dXJuIHQua2V5ICsgXCI6IFwiICsgdC5tZXNzYWdlO1xuICAgICAgICAgIH0pLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgcmV0dXJuIHIudmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbiA9IHQ7XG4gICAgICAgIHJldHVybiBcInN0cmluZ1wiID09IHR5cGVvZiB0ICYmIFwiY29sb3JcIiA9PT0gZS50eXBlICYmIChuID0gdGUucGFyc2UodCkpLCB7XG4gICAgICAgICAga2luZDogXCJjb25zdGFudFwiLFxuICAgICAgICAgIGV2YWx1YXRlOiBmdW5jdGlvbiBldmFsdWF0ZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0odm9pZCAwID09PSBlID8gdC5zcGVjaWZpY2F0aW9uLmRlZmF1bHQgOiBlLCB0LnNwZWNpZmljYXRpb24pO1xuICAgIH07XG5cbiAgICB1aS5wcm90b3R5cGUuaXNEYXRhRHJpdmVuID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIFwic291cmNlXCIgPT09IHRoaXMuZXhwcmVzc2lvbi5raW5kIHx8IFwiY29tcG9zaXRlXCIgPT09IHRoaXMuZXhwcmVzc2lvbi5raW5kO1xuICAgIH0sIHVpLnByb3RvdHlwZS5wb3NzaWJseUV2YWx1YXRlID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BlcnR5LnBvc3NpYmx5RXZhbHVhdGUodGhpcywgdCwgZSwgcik7XG4gICAgfTtcblxuICAgIHZhciBsaSA9IGZ1bmN0aW9uIGxpKHQpIHtcbiAgICAgIHRoaXMucHJvcGVydHkgPSB0LCB0aGlzLnZhbHVlID0gbmV3IHVpKHQsIHZvaWQgMCk7XG4gICAgfTtcblxuICAgIGxpLnByb3RvdHlwZS50cmFuc2l0aW9uZWQgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgcmV0dXJuIG5ldyBjaSh0aGlzLnByb3BlcnR5LCB0aGlzLnZhbHVlLCBlLCBoKHt9LCB0LnRyYW5zaXRpb24sIHRoaXMudHJhbnNpdGlvbiksIHQubm93KTtcbiAgICB9LCBsaS5wcm90b3R5cGUudW50cmFuc2l0aW9uZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbmV3IGNpKHRoaXMucHJvcGVydHksIHRoaXMudmFsdWUsIG51bGwsIHt9LCAwKTtcbiAgICB9O1xuXG4gICAgdmFyIHBpID0gZnVuY3Rpb24gcGkodCkge1xuICAgICAgdGhpcy5fcHJvcGVydGllcyA9IHQsIHRoaXMuX3ZhbHVlcyA9IE9iamVjdC5jcmVhdGUodC5kZWZhdWx0VHJhbnNpdGlvbmFibGVQcm9wZXJ0eVZhbHVlcyk7XG4gICAgfTtcblxuICAgIHBpLnByb3RvdHlwZS5nZXRWYWx1ZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gdyh0aGlzLl92YWx1ZXNbdF0udmFsdWUudmFsdWUpO1xuICAgIH0sIHBpLnByb3RvdHlwZS5zZXRWYWx1ZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB0aGlzLl92YWx1ZXMuaGFzT3duUHJvcGVydHkodCkgfHwgKHRoaXMuX3ZhbHVlc1t0XSA9IG5ldyBsaSh0aGlzLl92YWx1ZXNbdF0ucHJvcGVydHkpKSwgdGhpcy5fdmFsdWVzW3RdLnZhbHVlID0gbmV3IHVpKHRoaXMuX3ZhbHVlc1t0XS5wcm9wZXJ0eSwgbnVsbCA9PT0gZSA/IHZvaWQgMCA6IHcoZSkpO1xuICAgIH0sIHBpLnByb3RvdHlwZS5nZXRUcmFuc2l0aW9uID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB3KHRoaXMuX3ZhbHVlc1t0XS50cmFuc2l0aW9uKTtcbiAgICB9LCBwaS5wcm90b3R5cGUuc2V0VHJhbnNpdGlvbiA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB0aGlzLl92YWx1ZXMuaGFzT3duUHJvcGVydHkodCkgfHwgKHRoaXMuX3ZhbHVlc1t0XSA9IG5ldyBsaSh0aGlzLl92YWx1ZXNbdF0ucHJvcGVydHkpKSwgdGhpcy5fdmFsdWVzW3RdLnRyYW5zaXRpb24gPSB3KGUpIHx8IHZvaWQgMDtcbiAgICB9LCBwaS5wcm90b3R5cGUuc2VyaWFsaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgZm9yICh2YXIgdCA9IHt9LCBlID0gMCwgciA9IE9iamVjdC5rZXlzKHRoaXMuX3ZhbHVlcyk7IGUgPCByLmxlbmd0aDsgZSArPSAxKSB7XG4gICAgICAgIHZhciBuID0gcltlXSxcbiAgICAgICAgICAgIGkgPSB0aGlzLmdldFZhbHVlKG4pO1xuICAgICAgICB2b2lkIDAgIT09IGkgJiYgKHRbbl0gPSBpKTtcbiAgICAgICAgdmFyIGEgPSB0aGlzLmdldFRyYW5zaXRpb24obik7XG4gICAgICAgIHZvaWQgMCAhPT0gYSAmJiAodFtuICsgXCItdHJhbnNpdGlvblwiXSA9IGEpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdDtcbiAgICB9LCBwaS5wcm90b3R5cGUudHJhbnNpdGlvbmVkID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIGZvciAodmFyIHIgPSBuZXcgaGkodGhpcy5fcHJvcGVydGllcyksIG4gPSAwLCBpID0gT2JqZWN0LmtleXModGhpcy5fdmFsdWVzKTsgbiA8IGkubGVuZ3RoOyBuICs9IDEpIHtcbiAgICAgICAgdmFyIGEgPSBpW25dO1xuICAgICAgICByLl92YWx1ZXNbYV0gPSB0aGlzLl92YWx1ZXNbYV0udHJhbnNpdGlvbmVkKHQsIGUuX3ZhbHVlc1thXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sIHBpLnByb3RvdHlwZS51bnRyYW5zaXRpb25lZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIHQgPSBuZXcgaGkodGhpcy5fcHJvcGVydGllcyksIGUgPSAwLCByID0gT2JqZWN0LmtleXModGhpcy5fdmFsdWVzKTsgZSA8IHIubGVuZ3RoOyBlICs9IDEpIHtcbiAgICAgICAgdmFyIG4gPSByW2VdO1xuICAgICAgICB0Ll92YWx1ZXNbbl0gPSB0aGlzLl92YWx1ZXNbbl0udW50cmFuc2l0aW9uZWQoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcblxuICAgIHZhciBjaSA9IGZ1bmN0aW9uIGNpKHQsIGUsIHIsIG4sIGkpIHtcbiAgICAgIHRoaXMucHJvcGVydHkgPSB0LCB0aGlzLnZhbHVlID0gZSwgdGhpcy5iZWdpbiA9IGkgKyBuLmRlbGF5IHx8IDAsIHRoaXMuZW5kID0gdGhpcy5iZWdpbiArIG4uZHVyYXRpb24gfHwgMCwgdC5zcGVjaWZpY2F0aW9uLnRyYW5zaXRpb24gJiYgKG4uZGVsYXkgfHwgbi5kdXJhdGlvbikgJiYgKHRoaXMucHJpb3IgPSByKTtcbiAgICB9O1xuXG4gICAgY2kucHJvdG90eXBlLnBvc3NpYmx5RXZhbHVhdGUgPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgdmFyIG4gPSB0Lm5vdyB8fCAwLFxuICAgICAgICAgIGkgPSB0aGlzLnZhbHVlLnBvc3NpYmx5RXZhbHVhdGUodCwgZSwgciksXG4gICAgICAgICAgYSA9IHRoaXMucHJpb3I7XG5cbiAgICAgIGlmIChhKSB7XG4gICAgICAgIGlmIChuID4gdGhpcy5lbmQpIHJldHVybiB0aGlzLnByaW9yID0gbnVsbCwgaTtcbiAgICAgICAgaWYgKHRoaXMudmFsdWUuaXNEYXRhRHJpdmVuKCkpIHJldHVybiB0aGlzLnByaW9yID0gbnVsbCwgaTtcbiAgICAgICAgaWYgKG4gPCB0aGlzLmJlZ2luKSByZXR1cm4gYS5wb3NzaWJseUV2YWx1YXRlKHQsIGUsIHIpO1xuICAgICAgICB2YXIgbyA9IChuIC0gdGhpcy5iZWdpbikgLyAodGhpcy5lbmQgLSB0aGlzLmJlZ2luKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydHkuaW50ZXJwb2xhdGUoYS5wb3NzaWJseUV2YWx1YXRlKHQsIGUsIHIpLCBpLCBmdW5jdGlvbiAodCkge1xuICAgICAgICAgIGlmICh0IDw9IDApIHJldHVybiAwO1xuICAgICAgICAgIGlmICh0ID49IDEpIHJldHVybiAxO1xuICAgICAgICAgIHZhciBlID0gdCAqIHQsXG4gICAgICAgICAgICAgIHIgPSBlICogdDtcbiAgICAgICAgICByZXR1cm4gNCAqICh0IDwgLjUgPyByIDogMyAqICh0IC0gZSkgKyByIC0gLjc1KTtcbiAgICAgICAgfShvKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpO1xuICAgIH07XG5cbiAgICB2YXIgaGkgPSBmdW5jdGlvbiBoaSh0KSB7XG4gICAgICB0aGlzLl9wcm9wZXJ0aWVzID0gdCwgdGhpcy5fdmFsdWVzID0gT2JqZWN0LmNyZWF0ZSh0LmRlZmF1bHRUcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZXMpO1xuICAgIH07XG5cbiAgICBoaS5wcm90b3R5cGUucG9zc2libHlFdmFsdWF0ZSA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICBmb3IgKHZhciBuID0gbmV3IGRpKHRoaXMuX3Byb3BlcnRpZXMpLCBpID0gMCwgYSA9IE9iamVjdC5rZXlzKHRoaXMuX3ZhbHVlcyk7IGkgPCBhLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBvID0gYVtpXTtcbiAgICAgICAgbi5fdmFsdWVzW29dID0gdGhpcy5fdmFsdWVzW29dLnBvc3NpYmx5RXZhbHVhdGUodCwgZSwgcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuO1xuICAgIH0sIGhpLnByb3RvdHlwZS5oYXNUcmFuc2l0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgZm9yICh2YXIgdCA9IDAsIGUgPSBPYmplY3Qua2V5cyh0aGlzLl92YWx1ZXMpOyB0IDwgZS5sZW5ndGg7IHQgKz0gMSkge1xuICAgICAgICBpZiAodGhpcy5fdmFsdWVzW2VbdF1dLnByaW9yKSByZXR1cm4gITA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAhMTtcbiAgICB9O1xuXG4gICAgdmFyIGZpID0gZnVuY3Rpb24gZmkodCkge1xuICAgICAgdGhpcy5fcHJvcGVydGllcyA9IHQsIHRoaXMuX3ZhbHVlcyA9IE9iamVjdC5jcmVhdGUodC5kZWZhdWx0UHJvcGVydHlWYWx1ZXMpO1xuICAgIH07XG5cbiAgICBmaS5wcm90b3R5cGUuZ2V0VmFsdWUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHcodGhpcy5fdmFsdWVzW3RdLnZhbHVlKTtcbiAgICB9LCBmaS5wcm90b3R5cGUuc2V0VmFsdWUgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgdGhpcy5fdmFsdWVzW3RdID0gbmV3IHVpKHRoaXMuX3ZhbHVlc1t0XS5wcm9wZXJ0eSwgbnVsbCA9PT0gZSA/IHZvaWQgMCA6IHcoZSkpO1xuICAgIH0sIGZpLnByb3RvdHlwZS5zZXJpYWxpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKHZhciB0ID0ge30sIGUgPSAwLCByID0gT2JqZWN0LmtleXModGhpcy5fdmFsdWVzKTsgZSA8IHIubGVuZ3RoOyBlICs9IDEpIHtcbiAgICAgICAgdmFyIG4gPSByW2VdLFxuICAgICAgICAgICAgaSA9IHRoaXMuZ2V0VmFsdWUobik7XG4gICAgICAgIHZvaWQgMCAhPT0gaSAmJiAodFtuXSA9IGkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdDtcbiAgICB9LCBmaS5wcm90b3R5cGUucG9zc2libHlFdmFsdWF0ZSA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICBmb3IgKHZhciBuID0gbmV3IGRpKHRoaXMuX3Byb3BlcnRpZXMpLCBpID0gMCwgYSA9IE9iamVjdC5rZXlzKHRoaXMuX3ZhbHVlcyk7IGkgPCBhLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBvID0gYVtpXTtcbiAgICAgICAgbi5fdmFsdWVzW29dID0gdGhpcy5fdmFsdWVzW29dLnBvc3NpYmx5RXZhbHVhdGUodCwgZSwgcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuO1xuICAgIH07XG5cbiAgICB2YXIgeWkgPSBmdW5jdGlvbiB5aSh0LCBlLCByKSB7XG4gICAgICB0aGlzLnByb3BlcnR5ID0gdCwgdGhpcy52YWx1ZSA9IGUsIHRoaXMucGFyYW1ldGVycyA9IHI7XG4gICAgfTtcblxuICAgIHlpLnByb3RvdHlwZS5pc0NvbnN0YW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIFwiY29uc3RhbnRcIiA9PT0gdGhpcy52YWx1ZS5raW5kO1xuICAgIH0sIHlpLnByb3RvdHlwZS5jb25zdGFudE9yID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiBcImNvbnN0YW50XCIgPT09IHRoaXMudmFsdWUua2luZCA/IHRoaXMudmFsdWUudmFsdWUgOiB0O1xuICAgIH0sIHlpLnByb3RvdHlwZS5ldmFsdWF0ZSA9IGZ1bmN0aW9uICh0LCBlLCByLCBuKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eS5ldmFsdWF0ZSh0aGlzLnZhbHVlLCB0aGlzLnBhcmFtZXRlcnMsIHQsIGUsIHIsIG4pO1xuICAgIH07XG5cbiAgICB2YXIgZGkgPSBmdW5jdGlvbiBkaSh0KSB7XG4gICAgICB0aGlzLl9wcm9wZXJ0aWVzID0gdCwgdGhpcy5fdmFsdWVzID0gT2JqZWN0LmNyZWF0ZSh0LmRlZmF1bHRQb3NzaWJseUV2YWx1YXRlZFZhbHVlcyk7XG4gICAgfTtcblxuICAgIGRpLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlc1t0XTtcbiAgICB9O1xuXG4gICAgdmFyIG1pID0gZnVuY3Rpb24gbWkodCkge1xuICAgICAgdGhpcy5zcGVjaWZpY2F0aW9uID0gdDtcbiAgICB9O1xuXG4gICAgbWkucHJvdG90eXBlLnBvc3NpYmx5RXZhbHVhdGUgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgcmV0dXJuIHQuZXhwcmVzc2lvbi5ldmFsdWF0ZShlKTtcbiAgICB9LCBtaS5wcm90b3R5cGUuaW50ZXJwb2xhdGUgPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgdmFyIG4gPSBHZVt0aGlzLnNwZWNpZmljYXRpb24udHlwZV07XG4gICAgICByZXR1cm4gbiA/IG4odCwgZSwgcikgOiB0O1xuICAgIH07XG5cbiAgICB2YXIgdmkgPSBmdW5jdGlvbiB2aSh0LCBlKSB7XG4gICAgICB0aGlzLnNwZWNpZmljYXRpb24gPSB0LCB0aGlzLm92ZXJyaWRlcyA9IGU7XG4gICAgfTtcblxuICAgIHZpLnByb3RvdHlwZS5wb3NzaWJseUV2YWx1YXRlID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4pIHtcbiAgICAgIHJldHVybiBuZXcgeWkodGhpcywgXCJjb25zdGFudFwiID09PSB0LmV4cHJlc3Npb24ua2luZCB8fCBcImNhbWVyYVwiID09PSB0LmV4cHJlc3Npb24ua2luZCA/IHtcbiAgICAgICAga2luZDogXCJjb25zdGFudFwiLFxuICAgICAgICB2YWx1ZTogdC5leHByZXNzaW9uLmV2YWx1YXRlKGUsIG51bGwsIHt9LCByLCBuKVxuICAgICAgfSA6IHQuZXhwcmVzc2lvbiwgZSk7XG4gICAgfSwgdmkucHJvdG90eXBlLmludGVycG9sYXRlID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgIGlmIChcImNvbnN0YW50XCIgIT09IHQudmFsdWUua2luZCB8fCBcImNvbnN0YW50XCIgIT09IGUudmFsdWUua2luZCkgcmV0dXJuIHQ7XG4gICAgICBpZiAodm9pZCAwID09PSB0LnZhbHVlLnZhbHVlIHx8IHZvaWQgMCA9PT0gZS52YWx1ZS52YWx1ZSkgcmV0dXJuIG5ldyB5aSh0aGlzLCB7XG4gICAgICAgIGtpbmQ6IFwiY29uc3RhbnRcIixcbiAgICAgICAgdmFsdWU6IHZvaWQgMFxuICAgICAgfSwgdC5wYXJhbWV0ZXJzKTtcbiAgICAgIHZhciBuID0gR2VbdGhpcy5zcGVjaWZpY2F0aW9uLnR5cGVdO1xuICAgICAgcmV0dXJuIG4gPyBuZXcgeWkodGhpcywge1xuICAgICAgICBraW5kOiBcImNvbnN0YW50XCIsXG4gICAgICAgIHZhbHVlOiBuKHQudmFsdWUudmFsdWUsIGUudmFsdWUudmFsdWUsIHIpXG4gICAgICB9LCB0LnBhcmFtZXRlcnMpIDogdDtcbiAgICB9LCB2aS5wcm90b3R5cGUuZXZhbHVhdGUgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSwgYSkge1xuICAgICAgcmV0dXJuIFwiY29uc3RhbnRcIiA9PT0gdC5raW5kID8gdC52YWx1ZSA6IHQuZXZhbHVhdGUoZSwgciwgbiwgaSwgYSk7XG4gICAgfTtcblxuICAgIHZhciBnaSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLnBvc3NpYmx5RXZhbHVhdGUgPSBmdW5jdGlvbiAodCwgZSwgciwgbikge1xuICAgICAgICBpZiAodm9pZCAwID09PSB0LnZhbHVlKSByZXR1cm4gbmV3IHlpKHRoaXMsIHtcbiAgICAgICAgICBraW5kOiBcImNvbnN0YW50XCIsXG4gICAgICAgICAgdmFsdWU6IHZvaWQgMFxuICAgICAgICB9LCBlKTtcblxuICAgICAgICBpZiAoXCJjb25zdGFudFwiID09PSB0LmV4cHJlc3Npb24ua2luZCkge1xuICAgICAgICAgIHZhciBpID0gdC5leHByZXNzaW9uLmV2YWx1YXRlKGUsIG51bGwsIHt9LCByLCBuKSxcbiAgICAgICAgICAgICAgYSA9IFwicmVzb2x2ZWRJbWFnZVwiID09PSB0LnByb3BlcnR5LnNwZWNpZmljYXRpb24udHlwZSAmJiBcInN0cmluZ1wiICE9IHR5cGVvZiBpID8gaS5uYW1lIDogaSxcbiAgICAgICAgICAgICAgbyA9IHRoaXMuX2NhbGN1bGF0ZShhLCBhLCBhLCBlKTtcblxuICAgICAgICAgIHJldHVybiBuZXcgeWkodGhpcywge1xuICAgICAgICAgICAga2luZDogXCJjb25zdGFudFwiLFxuICAgICAgICAgICAgdmFsdWU6IG9cbiAgICAgICAgICB9LCBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcImNhbWVyYVwiID09PSB0LmV4cHJlc3Npb24ua2luZCkge1xuICAgICAgICAgIHZhciBzID0gdGhpcy5fY2FsY3VsYXRlKHQuZXhwcmVzc2lvbi5ldmFsdWF0ZSh7XG4gICAgICAgICAgICB6b29tOiBlLnpvb20gLSAxXG4gICAgICAgICAgfSksIHQuZXhwcmVzc2lvbi5ldmFsdWF0ZSh7XG4gICAgICAgICAgICB6b29tOiBlLnpvb21cbiAgICAgICAgICB9KSwgdC5leHByZXNzaW9uLmV2YWx1YXRlKHtcbiAgICAgICAgICAgIHpvb206IGUuem9vbSArIDFcbiAgICAgICAgICB9KSwgZSk7XG5cbiAgICAgICAgICByZXR1cm4gbmV3IHlpKHRoaXMsIHtcbiAgICAgICAgICAgIGtpbmQ6IFwiY29uc3RhbnRcIixcbiAgICAgICAgICAgIHZhbHVlOiBzXG4gICAgICAgICAgfSwgZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IHlpKHRoaXMsIHQuZXhwcmVzc2lvbiwgZSk7XG4gICAgICB9LCBlLnByb3RvdHlwZS5ldmFsdWF0ZSA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpLCBhKSB7XG4gICAgICAgIGlmIChcInNvdXJjZVwiID09PSB0LmtpbmQpIHtcbiAgICAgICAgICB2YXIgbyA9IHQuZXZhbHVhdGUoZSwgciwgbiwgaSwgYSk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGN1bGF0ZShvLCBvLCBvLCBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBcImNvbXBvc2l0ZVwiID09PSB0LmtpbmQgPyB0aGlzLl9jYWxjdWxhdGUodC5ldmFsdWF0ZSh7XG4gICAgICAgICAgem9vbTogTWF0aC5mbG9vcihlLnpvb20pIC0gMVxuICAgICAgICB9LCByLCBuKSwgdC5ldmFsdWF0ZSh7XG4gICAgICAgICAgem9vbTogTWF0aC5mbG9vcihlLnpvb20pXG4gICAgICAgIH0sIHIsIG4pLCB0LmV2YWx1YXRlKHtcbiAgICAgICAgICB6b29tOiBNYXRoLmZsb29yKGUuem9vbSkgKyAxXG4gICAgICAgIH0sIHIsIG4pLCBlKSA6IHQudmFsdWU7XG4gICAgICB9LCBlLnByb3RvdHlwZS5fY2FsY3VsYXRlID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4pIHtcbiAgICAgICAgcmV0dXJuIG4uem9vbSA+IG4uem9vbUhpc3RvcnkubGFzdEludGVnZXJab29tID8ge1xuICAgICAgICAgIGZyb206IHQsXG4gICAgICAgICAgdG86IGVcbiAgICAgICAgfSA6IHtcbiAgICAgICAgICBmcm9tOiByLFxuICAgICAgICAgIHRvOiBlXG4gICAgICAgIH07XG4gICAgICB9LCBlLnByb3RvdHlwZS5pbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0O1xuICAgICAgfSwgZTtcbiAgICB9KHZpKSxcbiAgICAgICAgeGkgPSBmdW5jdGlvbiB4aSh0KSB7XG4gICAgICB0aGlzLnNwZWNpZmljYXRpb24gPSB0O1xuICAgIH07XG5cbiAgICB4aS5wcm90b3R5cGUucG9zc2libHlFdmFsdWF0ZSA9IGZ1bmN0aW9uICh0LCBlLCByLCBuKSB7XG4gICAgICBpZiAodm9pZCAwICE9PSB0LnZhbHVlKSB7XG4gICAgICAgIGlmIChcImNvbnN0YW50XCIgPT09IHQuZXhwcmVzc2lvbi5raW5kKSB7XG4gICAgICAgICAgdmFyIGkgPSB0LmV4cHJlc3Npb24uZXZhbHVhdGUoZSwgbnVsbCwge30sIHIsIG4pO1xuICAgICAgICAgIHJldHVybiB0aGlzLl9jYWxjdWxhdGUoaSwgaSwgaSwgZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fY2FsY3VsYXRlKHQuZXhwcmVzc2lvbi5ldmFsdWF0ZShuZXcgc2koTWF0aC5mbG9vcihlLnpvb20gLSAxKSwgZSkpLCB0LmV4cHJlc3Npb24uZXZhbHVhdGUobmV3IHNpKE1hdGguZmxvb3IoZS56b29tKSwgZSkpLCB0LmV4cHJlc3Npb24uZXZhbHVhdGUobmV3IHNpKE1hdGguZmxvb3IoZS56b29tICsgMSksIGUpKSwgZSk7XG4gICAgICB9XG4gICAgfSwgeGkucHJvdG90eXBlLl9jYWxjdWxhdGUgPSBmdW5jdGlvbiAodCwgZSwgciwgbikge1xuICAgICAgcmV0dXJuIG4uem9vbSA+IG4uem9vbUhpc3RvcnkubGFzdEludGVnZXJab29tID8ge1xuICAgICAgICBmcm9tOiB0LFxuICAgICAgICB0bzogZVxuICAgICAgfSA6IHtcbiAgICAgICAgZnJvbTogcixcbiAgICAgICAgdG86IGVcbiAgICAgIH07XG4gICAgfSwgeGkucHJvdG90eXBlLmludGVycG9sYXRlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0O1xuICAgIH07XG5cbiAgICB2YXIgYmkgPSBmdW5jdGlvbiBiaSh0KSB7XG4gICAgICB0aGlzLnNwZWNpZmljYXRpb24gPSB0O1xuICAgIH07XG5cbiAgICBiaS5wcm90b3R5cGUucG9zc2libHlFdmFsdWF0ZSA9IGZ1bmN0aW9uICh0LCBlLCByLCBuKSB7XG4gICAgICByZXR1cm4gISF0LmV4cHJlc3Npb24uZXZhbHVhdGUoZSwgbnVsbCwge30sIHIsIG4pO1xuICAgIH0sIGJpLnByb3RvdHlwZS5pbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhMTtcbiAgICB9O1xuXG4gICAgdmFyIHdpID0gZnVuY3Rpb24gd2kodCkge1xuICAgICAgZm9yICh2YXIgZSBpbiB0aGlzLnByb3BlcnRpZXMgPSB0LCB0aGlzLmRlZmF1bHRQcm9wZXJ0eVZhbHVlcyA9IHt9LCB0aGlzLmRlZmF1bHRUcmFuc2l0aW9uYWJsZVByb3BlcnR5VmFsdWVzID0ge30sIHRoaXMuZGVmYXVsdFRyYW5zaXRpb25pbmdQcm9wZXJ0eVZhbHVlcyA9IHt9LCB0aGlzLmRlZmF1bHRQb3NzaWJseUV2YWx1YXRlZFZhbHVlcyA9IHt9LCB0aGlzLm92ZXJyaWRhYmxlUHJvcGVydGllcyA9IFtdLCB0KSB7XG4gICAgICAgIHZhciByID0gdFtlXTtcbiAgICAgICAgci5zcGVjaWZpY2F0aW9uLm92ZXJyaWRhYmxlICYmIHRoaXMub3ZlcnJpZGFibGVQcm9wZXJ0aWVzLnB1c2goZSk7XG4gICAgICAgIHZhciBuID0gdGhpcy5kZWZhdWx0UHJvcGVydHlWYWx1ZXNbZV0gPSBuZXcgdWkociwgdm9pZCAwKSxcbiAgICAgICAgICAgIGkgPSB0aGlzLmRlZmF1bHRUcmFuc2l0aW9uYWJsZVByb3BlcnR5VmFsdWVzW2VdID0gbmV3IGxpKHIpO1xuICAgICAgICB0aGlzLmRlZmF1bHRUcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZXNbZV0gPSBpLnVudHJhbnNpdGlvbmVkKCksIHRoaXMuZGVmYXVsdFBvc3NpYmx5RXZhbHVhdGVkVmFsdWVzW2VdID0gbi5wb3NzaWJseUV2YWx1YXRlKHt9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgT24oXCJEYXRhRHJpdmVuUHJvcGVydHlcIiwgdmkpLCBPbihcIkRhdGFDb25zdGFudFByb3BlcnR5XCIsIG1pKSwgT24oXCJDcm9zc0ZhZGVkRGF0YURyaXZlblByb3BlcnR5XCIsIGdpKSwgT24oXCJDcm9zc0ZhZGVkUHJvcGVydHlcIiwgeGkpLCBPbihcIkNvbG9yUmFtcFByb3BlcnR5XCIsIGJpKTtcblxuICAgIHZhciBfaSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKGUsIHIpIHtcbiAgICAgICAgaWYgKHQuY2FsbCh0aGlzKSwgdGhpcy5pZCA9IGUuaWQsIHRoaXMudHlwZSA9IGUudHlwZSwgdGhpcy5fZmVhdHVyZUZpbHRlciA9IHtcbiAgICAgICAgICBmaWx0ZXI6IGZ1bmN0aW9uIGZpbHRlcigpIHtcbiAgICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG5lZWRHZW9tZXRyeTogITFcbiAgICAgICAgfSwgXCJjdXN0b21cIiAhPT0gZS50eXBlICYmICh0aGlzLm1ldGFkYXRhID0gKGUgPSBlKS5tZXRhZGF0YSwgdGhpcy5taW56b29tID0gZS5taW56b29tLCB0aGlzLm1heHpvb20gPSBlLm1heHpvb20sIFwiYmFja2dyb3VuZFwiICE9PSBlLnR5cGUgJiYgKHRoaXMuc291cmNlID0gZS5zb3VyY2UsIHRoaXMuc291cmNlTGF5ZXIgPSBlW1wic291cmNlLWxheWVyXCJdLCB0aGlzLmZpbHRlciA9IGUuZmlsdGVyKSwgci5sYXlvdXQgJiYgKHRoaXMuX3VuZXZhbHVhdGVkTGF5b3V0ID0gbmV3IGZpKHIubGF5b3V0KSksIHIucGFpbnQpKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50ID0gbmV3IHBpKHIucGFpbnQpLCBlLnBhaW50KSB7XG4gICAgICAgICAgICB0aGlzLnNldFBhaW50UHJvcGVydHkobiwgZS5wYWludFtuXSwge1xuICAgICAgICAgICAgICB2YWxpZGF0ZTogITFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAodmFyIGkgaW4gZS5sYXlvdXQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0TGF5b3V0UHJvcGVydHkoaSwgZS5sYXlvdXRbaV0sIHtcbiAgICAgICAgICAgICAgdmFsaWRhdGU6ICExXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLl90cmFuc2l0aW9uaW5nUGFpbnQgPSB0aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50LnVudHJhbnNpdGlvbmVkKCksIHRoaXMucGFpbnQgPSBuZXcgZGkoci5wYWludCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuZ2V0Q3Jvc3NmYWRlUGFyYW1ldGVycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Nyb3NzZmFkZVBhcmFtZXRlcnM7XG4gICAgICB9LCBlLnByb3RvdHlwZS5nZXRMYXlvdXRQcm9wZXJ0eSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiBcInZpc2liaWxpdHlcIiA9PT0gdCA/IHRoaXMudmlzaWJpbGl0eSA6IHRoaXMuX3VuZXZhbHVhdGVkTGF5b3V0LmdldFZhbHVlKHQpO1xuICAgICAgfSwgZS5wcm90b3R5cGUuc2V0TGF5b3V0UHJvcGVydHkgPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgICB2b2lkIDAgPT09IHIgJiYgKHIgPSB7fSksIG51bGwgIT0gZSAmJiB0aGlzLl92YWxpZGF0ZShNbiwgXCJsYXllcnMuXCIgKyB0aGlzLmlkICsgXCIubGF5b3V0LlwiICsgdCwgdCwgZSwgcikgfHwgKFwidmlzaWJpbGl0eVwiICE9PSB0ID8gdGhpcy5fdW5ldmFsdWF0ZWRMYXlvdXQuc2V0VmFsdWUodCwgZSkgOiB0aGlzLnZpc2liaWxpdHkgPSBlKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmdldFBhaW50UHJvcGVydHkgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gZyh0LCBcIi10cmFuc2l0aW9uXCIpID8gdGhpcy5fdHJhbnNpdGlvbmFibGVQYWludC5nZXRUcmFuc2l0aW9uKHQuc2xpY2UoMCwgLVwiLXRyYW5zaXRpb25cIi5sZW5ndGgpKSA6IHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQuZ2V0VmFsdWUodCk7XG4gICAgICB9LCBlLnByb3RvdHlwZS5zZXRQYWludFByb3BlcnR5ID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgICAgaWYgKHZvaWQgMCA9PT0gciAmJiAociA9IHt9KSwgbnVsbCAhPSBlICYmIHRoaXMuX3ZhbGlkYXRlKFBuLCBcImxheWVycy5cIiArIHRoaXMuaWQgKyBcIi5wYWludC5cIiArIHQsIHQsIGUsIHIpKSByZXR1cm4gITE7XG4gICAgICAgIGlmIChnKHQsIFwiLXRyYW5zaXRpb25cIikpIHJldHVybiB0aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50LnNldFRyYW5zaXRpb24odC5zbGljZSgwLCAtXCItdHJhbnNpdGlvblwiLmxlbmd0aCksIGUgfHwgdm9pZCAwKSwgITE7XG4gICAgICAgIHZhciBuID0gdGhpcy5fdHJhbnNpdGlvbmFibGVQYWludC5fdmFsdWVzW3RdLFxuICAgICAgICAgICAgaSA9IFwiY3Jvc3MtZmFkZWQtZGF0YS1kcml2ZW5cIiA9PT0gbi5wcm9wZXJ0eS5zcGVjaWZpY2F0aW9uW1wicHJvcGVydHktdHlwZVwiXSxcbiAgICAgICAgICAgIGEgPSBuLnZhbHVlLmlzRGF0YURyaXZlbigpLFxuICAgICAgICAgICAgbyA9IG4udmFsdWU7XG4gICAgICAgIHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQuc2V0VmFsdWUodCwgZSksIHRoaXMuX2hhbmRsZVNwZWNpYWxQYWludFByb3BlcnR5VXBkYXRlKHQpO1xuICAgICAgICB2YXIgcyA9IHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQuX3ZhbHVlc1t0XS52YWx1ZTtcbiAgICAgICAgcmV0dXJuIHMuaXNEYXRhRHJpdmVuKCkgfHwgYSB8fCBpIHx8IHRoaXMuX2hhbmRsZU92ZXJyaWRhYmxlUGFpbnRQcm9wZXJ0eVVwZGF0ZSh0LCBvLCBzKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLl9oYW5kbGVTcGVjaWFsUGFpbnRQcm9wZXJ0eVVwZGF0ZSA9IGZ1bmN0aW9uICh0KSB7fSwgZS5wcm90b3R5cGUuX2hhbmRsZU92ZXJyaWRhYmxlUGFpbnRQcm9wZXJ0eVVwZGF0ZSA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICAgIHJldHVybiAhMTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmlzSGlkZGVuID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuICEhKHRoaXMubWluem9vbSAmJiB0IDwgdGhpcy5taW56b29tKSB8fCAhISh0aGlzLm1heHpvb20gJiYgdCA+PSB0aGlzLm1heHpvb20pIHx8IFwibm9uZVwiID09PSB0aGlzLnZpc2liaWxpdHk7XG4gICAgICB9LCBlLnByb3RvdHlwZS51cGRhdGVUcmFuc2l0aW9ucyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHRoaXMuX3RyYW5zaXRpb25pbmdQYWludCA9IHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQudHJhbnNpdGlvbmVkKHQsIHRoaXMuX3RyYW5zaXRpb25pbmdQYWludCk7XG4gICAgICB9LCBlLnByb3RvdHlwZS5oYXNUcmFuc2l0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNpdGlvbmluZ1BhaW50Lmhhc1RyYW5zaXRpb24oKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLnJlY2FsY3VsYXRlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgdC5nZXRDcm9zc2ZhZGVQYXJhbWV0ZXJzICYmICh0aGlzLl9jcm9zc2ZhZGVQYXJhbWV0ZXJzID0gdC5nZXRDcm9zc2ZhZGVQYXJhbWV0ZXJzKCkpLCB0aGlzLl91bmV2YWx1YXRlZExheW91dCAmJiAodGhpcy5sYXlvdXQgPSB0aGlzLl91bmV2YWx1YXRlZExheW91dC5wb3NzaWJseUV2YWx1YXRlKHQsIHZvaWQgMCwgZSkpLCB0aGlzLnBhaW50ID0gdGhpcy5fdHJhbnNpdGlvbmluZ1BhaW50LnBvc3NpYmx5RXZhbHVhdGUodCwgdm9pZCAwLCBlKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHQgPSB7XG4gICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICAgICAgXCJzb3VyY2UtbGF5ZXJcIjogdGhpcy5zb3VyY2VMYXllcixcbiAgICAgICAgICBtZXRhZGF0YTogdGhpcy5tZXRhZGF0YSxcbiAgICAgICAgICBtaW56b29tOiB0aGlzLm1pbnpvb20sXG4gICAgICAgICAgbWF4em9vbTogdGhpcy5tYXh6b29tLFxuICAgICAgICAgIGZpbHRlcjogdGhpcy5maWx0ZXIsXG4gICAgICAgICAgbGF5b3V0OiB0aGlzLl91bmV2YWx1YXRlZExheW91dCAmJiB0aGlzLl91bmV2YWx1YXRlZExheW91dC5zZXJpYWxpemUoKSxcbiAgICAgICAgICBwYWludDogdGhpcy5fdHJhbnNpdGlvbmFibGVQYWludCAmJiB0aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50LnNlcmlhbGl6ZSgpXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2liaWxpdHkgJiYgKHQubGF5b3V0ID0gdC5sYXlvdXQgfHwge30sIHQubGF5b3V0LnZpc2liaWxpdHkgPSB0aGlzLnZpc2liaWxpdHkpLCBiKHQsIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgcmV0dXJuICEodm9pZCAwID09PSB0IHx8IFwibGF5b3V0XCIgPT09IGUgJiYgIU9iamVjdC5rZXlzKHQpLmxlbmd0aCB8fCBcInBhaW50XCIgPT09IGUgJiYgIU9iamVjdC5rZXlzKHQpLmxlbmd0aCk7XG4gICAgICAgIH0pO1xuICAgICAgfSwgZS5wcm90b3R5cGUuX3ZhbGlkYXRlID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGkpIHtcbiAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gaSAmJiAoaSA9IHt9KSwgKCFpIHx8ICExICE9PSBpLnZhbGlkYXRlKSAmJiBCbih0aGlzLCB0LmNhbGwoQ24sIHtcbiAgICAgICAgICBrZXk6IGUsXG4gICAgICAgICAgbGF5ZXJUeXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgb2JqZWN0S2V5OiByLFxuICAgICAgICAgIHZhbHVlOiBuLFxuICAgICAgICAgIHN0eWxlU3BlYzogRXQsXG4gICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIGdseXBoczogITAsXG4gICAgICAgICAgICBzcHJpdGU6ICEwXG4gICAgICAgICAgfVxuICAgICAgICB9KSk7XG4gICAgICB9LCBlLnByb3RvdHlwZS5pczNEID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gITE7XG4gICAgICB9LCBlLnByb3RvdHlwZS5pc1RpbGVDbGlwcGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gITE7XG4gICAgICB9LCBlLnByb3RvdHlwZS5oYXNPZmZzY3JlZW5QYXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gITE7XG4gICAgICB9LCBlLnByb3RvdHlwZS5yZXNpemUgPSBmdW5jdGlvbiAoKSB7fSwgZS5wcm90b3R5cGUuaXNTdGF0ZURlcGVuZGVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm9yICh2YXIgdCBpbiB0aGlzLnBhaW50Ll92YWx1ZXMpIHtcbiAgICAgICAgICB2YXIgZSA9IHRoaXMucGFpbnQuZ2V0KHQpO1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgeWkgJiYgVHIoZS5wcm9wZXJ0eS5zcGVjaWZpY2F0aW9uKSAmJiAoXCJzb3VyY2VcIiA9PT0gZS52YWx1ZS5raW5kIHx8IFwiY29tcG9zaXRlXCIgPT09IGUudmFsdWUua2luZCkgJiYgZS52YWx1ZS5pc1N0YXRlRGVwZW5kZW50KSByZXR1cm4gITA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gITE7XG4gICAgICB9LCBlO1xuICAgIH0oQ3QpLFxuICAgICAgICBBaSA9IHtcbiAgICAgIEludDg6IEludDhBcnJheSxcbiAgICAgIFVpbnQ4OiBVaW50OEFycmF5LFxuICAgICAgSW50MTY6IEludDE2QXJyYXksXG4gICAgICBVaW50MTY6IFVpbnQxNkFycmF5LFxuICAgICAgSW50MzI6IEludDMyQXJyYXksXG4gICAgICBVaW50MzI6IFVpbnQzMkFycmF5LFxuICAgICAgRmxvYXQzMjogRmxvYXQzMkFycmF5XG4gICAgfSxcbiAgICAgICAgU2kgPSBmdW5jdGlvbiBTaSh0LCBlKSB7XG4gICAgICB0aGlzLl9zdHJ1Y3RBcnJheSA9IHQsIHRoaXMuX3BvczEgPSBlICogdGhpcy5zaXplLCB0aGlzLl9wb3MyID0gdGhpcy5fcG9zMSAvIDIsIHRoaXMuX3BvczQgPSB0aGlzLl9wb3MxIC8gNCwgdGhpcy5fcG9zOCA9IHRoaXMuX3BvczEgLyA4O1xuICAgIH0sXG4gICAgICAgIGtpID0gZnVuY3Rpb24ga2koKSB7XG4gICAgICB0aGlzLmlzVHJhbnNmZXJyZWQgPSAhMSwgdGhpcy5jYXBhY2l0eSA9IC0xLCB0aGlzLnJlc2l6ZSgwKTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gSWkodCwgZSkge1xuICAgICAgdm9pZCAwID09PSBlICYmIChlID0gMSk7XG4gICAgICB2YXIgciA9IDAsXG4gICAgICAgICAgbiA9IDA7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtZW1iZXJzOiB0Lm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHZhciBpID0gQWlbdC50eXBlXS5CWVRFU19QRVJfRUxFTUVOVCxcbiAgICAgICAgICAgICAgYSA9IHIgPSB6aShyLCBNYXRoLm1heChlLCBpKSksXG4gICAgICAgICAgICAgIG8gPSB0LmNvbXBvbmVudHMgfHwgMTtcbiAgICAgICAgICByZXR1cm4gbiA9IE1hdGgubWF4KG4sIGkpLCByICs9IGkgKiBvLCB7XG4gICAgICAgICAgICBuYW1lOiB0Lm5hbWUsXG4gICAgICAgICAgICB0eXBlOiB0LnR5cGUsXG4gICAgICAgICAgICBjb21wb25lbnRzOiBvLFxuICAgICAgICAgICAgb2Zmc2V0OiBhXG4gICAgICAgICAgfTtcbiAgICAgICAgfSksXG4gICAgICAgIHNpemU6IHppKHIsIE1hdGgubWF4KG4sIGUpKSxcbiAgICAgICAgYWxpZ25tZW50OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHppKHQsIGUpIHtcbiAgICAgIHJldHVybiBNYXRoLmNlaWwodCAvIGUpICogZTtcbiAgICB9XG5cbiAgICBraS5zZXJpYWxpemUgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgcmV0dXJuIHQuX3RyaW0oKSwgZSAmJiAodC5pc1RyYW5zZmVycmVkID0gITAsIGUucHVzaCh0LmFycmF5QnVmZmVyKSksIHtcbiAgICAgICAgbGVuZ3RoOiB0Lmxlbmd0aCxcbiAgICAgICAgYXJyYXlCdWZmZXI6IHQuYXJyYXlCdWZmZXJcbiAgICAgIH07XG4gICAgfSwga2kuZGVzZXJpYWxpemUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGUgPSBPYmplY3QuY3JlYXRlKHRoaXMucHJvdG90eXBlKTtcbiAgICAgIHJldHVybiBlLmFycmF5QnVmZmVyID0gdC5hcnJheUJ1ZmZlciwgZS5sZW5ndGggPSB0Lmxlbmd0aCwgZS5jYXBhY2l0eSA9IHQuYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCAvIGUuYnl0ZXNQZXJFbGVtZW50LCBlLl9yZWZyZXNoVmlld3MoKSwgZTtcbiAgICB9LCBraS5wcm90b3R5cGUuX3RyaW0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLmxlbmd0aCAhPT0gdGhpcy5jYXBhY2l0eSAmJiAodGhpcy5jYXBhY2l0eSA9IHRoaXMubGVuZ3RoLCB0aGlzLmFycmF5QnVmZmVyID0gdGhpcy5hcnJheUJ1ZmZlci5zbGljZSgwLCB0aGlzLmxlbmd0aCAqIHRoaXMuYnl0ZXNQZXJFbGVtZW50KSwgdGhpcy5fcmVmcmVzaFZpZXdzKCkpO1xuICAgIH0sIGtpLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgICB9LCBraS5wcm90b3R5cGUucmVzaXplID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHRoaXMucmVzZXJ2ZSh0KSwgdGhpcy5sZW5ndGggPSB0O1xuICAgIH0sIGtpLnByb3RvdHlwZS5yZXNlcnZlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGlmICh0ID4gdGhpcy5jYXBhY2l0eSkge1xuICAgICAgICB0aGlzLmNhcGFjaXR5ID0gTWF0aC5tYXgodCwgTWF0aC5mbG9vcig1ICogdGhpcy5jYXBhY2l0eSksIDEyOCksIHRoaXMuYXJyYXlCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIodGhpcy5jYXBhY2l0eSAqIHRoaXMuYnl0ZXNQZXJFbGVtZW50KTtcbiAgICAgICAgdmFyIGUgPSB0aGlzLnVpbnQ4O1xuICAgICAgICB0aGlzLl9yZWZyZXNoVmlld3MoKSwgZSAmJiB0aGlzLnVpbnQ4LnNldChlKTtcbiAgICAgIH1cbiAgICB9LCBraS5wcm90b3R5cGUuX3JlZnJlc2hWaWV3cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIl9yZWZyZXNoVmlld3MoKSBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGVhY2ggY29uY3JldGUgU3RydWN0QXJyYXkgbGF5b3V0XCIpO1xuICAgIH07XG5cbiAgICB2YXIgQ2kgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5fcmVmcmVzaFZpZXdzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlciksIHRoaXMuaW50MTYgPSBuZXcgSW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmVtcGxhY2VCYWNrID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgdmFyIHIgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzaXplKHIgKyAxKSwgdGhpcy5lbXBsYWNlKHIsIHQsIGUpO1xuICAgICAgfSwgZS5wcm90b3R5cGUuZW1wbGFjZSA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICAgIHZhciBuID0gMiAqIHQ7XG4gICAgICAgIHJldHVybiB0aGlzLmludDE2W24gKyAwXSA9IGUsIHRoaXMuaW50MTZbbiArIDFdID0gciwgdDtcbiAgICAgIH0sIGU7XG4gICAgfShraSk7XG5cbiAgICBDaS5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gNCwgT24oXCJTdHJ1Y3RBcnJheUxheW91dDJpNFwiLCBDaSk7XG5cbiAgICB2YXIgRWkgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5fcmVmcmVzaFZpZXdzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlciksIHRoaXMuaW50MTYgPSBuZXcgSW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmVtcGxhY2VCYWNrID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4pIHtcbiAgICAgICAgdmFyIGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzaXplKGkgKyAxKSwgdGhpcy5lbXBsYWNlKGksIHQsIGUsIHIsIG4pO1xuICAgICAgfSwgZS5wcm90b3R5cGUuZW1wbGFjZSA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpKSB7XG4gICAgICAgIHZhciBhID0gNCAqIHQ7XG4gICAgICAgIHJldHVybiB0aGlzLmludDE2W2EgKyAwXSA9IGUsIHRoaXMuaW50MTZbYSArIDFdID0gciwgdGhpcy5pbnQxNlthICsgMl0gPSBuLCB0aGlzLmludDE2W2EgKyAzXSA9IGksIHQ7XG4gICAgICB9LCBlO1xuICAgIH0oa2kpO1xuXG4gICAgRWkucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDgsIE9uKFwiU3RydWN0QXJyYXlMYXlvdXQ0aThcIiwgRWkpO1xuXG4gICAgdmFyIFBpID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuX3JlZnJlc2hWaWV3cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLCB0aGlzLmludDE2ID0gbmV3IEludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICB9LCBlLnByb3RvdHlwZS5lbXBsYWNlQmFjayA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpLCBhKSB7XG4gICAgICAgIHZhciBvID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc2l6ZShvICsgMSksIHRoaXMuZW1wbGFjZShvLCB0LCBlLCByLCBuLCBpLCBhKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmVtcGxhY2UgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSwgYSwgbykge1xuICAgICAgICB2YXIgcyA9IDYgKiB0O1xuICAgICAgICByZXR1cm4gdGhpcy5pbnQxNltzICsgMF0gPSBlLCB0aGlzLmludDE2W3MgKyAxXSA9IHIsIHRoaXMuaW50MTZbcyArIDJdID0gbiwgdGhpcy5pbnQxNltzICsgM10gPSBpLCB0aGlzLmludDE2W3MgKyA0XSA9IGEsIHRoaXMuaW50MTZbcyArIDVdID0gbywgdDtcbiAgICAgIH0sIGU7XG4gICAgfShraSk7XG5cbiAgICBQaS5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gMTIsIE9uKFwiU3RydWN0QXJyYXlMYXlvdXQyaTRpMTJcIiwgUGkpO1xuXG4gICAgdmFyIE1pID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuX3JlZnJlc2hWaWV3cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLCB0aGlzLmludDE2ID0gbmV3IEludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICB9LCBlLnByb3RvdHlwZS5lbXBsYWNlQmFjayA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpLCBhKSB7XG4gICAgICAgIHZhciBvID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc2l6ZShvICsgMSksIHRoaXMuZW1wbGFjZShvLCB0LCBlLCByLCBuLCBpLCBhKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmVtcGxhY2UgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSwgYSwgbykge1xuICAgICAgICB2YXIgcyA9IDQgKiB0LFxuICAgICAgICAgICAgdSA9IDggKiB0O1xuICAgICAgICByZXR1cm4gdGhpcy5pbnQxNltzICsgMF0gPSBlLCB0aGlzLmludDE2W3MgKyAxXSA9IHIsIHRoaXMudWludDhbdSArIDRdID0gbiwgdGhpcy51aW50OFt1ICsgNV0gPSBpLCB0aGlzLnVpbnQ4W3UgKyA2XSA9IGEsIHRoaXMudWludDhbdSArIDddID0gbywgdDtcbiAgICAgIH0sIGU7XG4gICAgfShraSk7XG5cbiAgICBNaS5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gOCwgT24oXCJTdHJ1Y3RBcnJheUxheW91dDJpNHViOFwiLCBNaSk7XG5cbiAgICB2YXIgQmkgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5fcmVmcmVzaFZpZXdzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlciksIHRoaXMuZmxvYXQzMiA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICB9LCBlLnByb3RvdHlwZS5lbXBsYWNlQmFjayA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHZhciByID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc2l6ZShyICsgMSksIHRoaXMuZW1wbGFjZShyLCB0LCBlKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmVtcGxhY2UgPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgICB2YXIgbiA9IDIgKiB0O1xuICAgICAgICByZXR1cm4gdGhpcy5mbG9hdDMyW24gKyAwXSA9IGUsIHRoaXMuZmxvYXQzMltuICsgMV0gPSByLCB0O1xuICAgICAgfSwgZTtcbiAgICB9KGtpKTtcblxuICAgIEJpLnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSA4LCBPbihcIlN0cnVjdEFycmF5TGF5b3V0MmY4XCIsIEJpKTtcblxuICAgIHZhciBUaSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLl9yZWZyZXNoVmlld3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKSwgdGhpcy51aW50MTYgPSBuZXcgVWludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICB9LCBlLnByb3RvdHlwZS5lbXBsYWNlQmFjayA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpLCBhLCBvLCBzLCB1LCBsKSB7XG4gICAgICAgIHZhciBwID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc2l6ZShwICsgMSksIHRoaXMuZW1wbGFjZShwLCB0LCBlLCByLCBuLCBpLCBhLCBvLCBzLCB1LCBsKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmVtcGxhY2UgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSwgYSwgbywgcywgdSwgbCwgcCkge1xuICAgICAgICB2YXIgYyA9IDEwICogdDtcbiAgICAgICAgcmV0dXJuIHRoaXMudWludDE2W2MgKyAwXSA9IGUsIHRoaXMudWludDE2W2MgKyAxXSA9IHIsIHRoaXMudWludDE2W2MgKyAyXSA9IG4sIHRoaXMudWludDE2W2MgKyAzXSA9IGksIHRoaXMudWludDE2W2MgKyA0XSA9IGEsIHRoaXMudWludDE2W2MgKyA1XSA9IG8sIHRoaXMudWludDE2W2MgKyA2XSA9IHMsIHRoaXMudWludDE2W2MgKyA3XSA9IHUsIHRoaXMudWludDE2W2MgKyA4XSA9IGwsIHRoaXMudWludDE2W2MgKyA5XSA9IHAsIHQ7XG4gICAgICB9LCBlO1xuICAgIH0oa2kpO1xuXG4gICAgVGkucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDIwLCBPbihcIlN0cnVjdEFycmF5TGF5b3V0MTB1aTIwXCIsIFRpKTtcblxuICAgIHZhciBWaSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLl9yZWZyZXNoVmlld3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKSwgdGhpcy5pbnQxNiA9IG5ldyBJbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLCB0aGlzLnVpbnQxNiA9IG5ldyBVaW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmVtcGxhY2VCYWNrID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGksIGEsIG8sIHMsIHUsIGwsIHAsIGMpIHtcbiAgICAgICAgdmFyIGggPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzaXplKGggKyAxKSwgdGhpcy5lbXBsYWNlKGgsIHQsIGUsIHIsIG4sIGksIGEsIG8sIHMsIHUsIGwsIHAsIGMpO1xuICAgICAgfSwgZS5wcm90b3R5cGUuZW1wbGFjZSA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpLCBhLCBvLCBzLCB1LCBsLCBwLCBjLCBoKSB7XG4gICAgICAgIHZhciBmID0gMTIgKiB0O1xuICAgICAgICByZXR1cm4gdGhpcy5pbnQxNltmICsgMF0gPSBlLCB0aGlzLmludDE2W2YgKyAxXSA9IHIsIHRoaXMuaW50MTZbZiArIDJdID0gbiwgdGhpcy5pbnQxNltmICsgM10gPSBpLCB0aGlzLnVpbnQxNltmICsgNF0gPSBhLCB0aGlzLnVpbnQxNltmICsgNV0gPSBvLCB0aGlzLnVpbnQxNltmICsgNl0gPSBzLCB0aGlzLnVpbnQxNltmICsgN10gPSB1LCB0aGlzLmludDE2W2YgKyA4XSA9IGwsIHRoaXMuaW50MTZbZiArIDldID0gcCwgdGhpcy5pbnQxNltmICsgMTBdID0gYywgdGhpcy5pbnQxNltmICsgMTFdID0gaCwgdDtcbiAgICAgIH0sIGU7XG4gICAgfShraSk7XG5cbiAgICBWaS5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gMjQsIE9uKFwiU3RydWN0QXJyYXlMYXlvdXQ0aTR1aTRpMjRcIiwgVmkpO1xuXG4gICAgdmFyIEZpID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuX3JlZnJlc2hWaWV3cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLCB0aGlzLmZsb2F0MzIgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgfSwgZS5wcm90b3R5cGUuZW1wbGFjZUJhY2sgPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgICB2YXIgbiA9IHRoaXMubGVuZ3RoO1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNpemUobiArIDEpLCB0aGlzLmVtcGxhY2UobiwgdCwgZSwgcik7XG4gICAgICB9LCBlLnByb3RvdHlwZS5lbXBsYWNlID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4pIHtcbiAgICAgICAgdmFyIGkgPSAzICogdDtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmxvYXQzMltpICsgMF0gPSBlLCB0aGlzLmZsb2F0MzJbaSArIDFdID0gciwgdGhpcy5mbG9hdDMyW2kgKyAyXSA9IG4sIHQ7XG4gICAgICB9LCBlO1xuICAgIH0oa2kpO1xuXG4gICAgRmkucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDEyLCBPbihcIlN0cnVjdEFycmF5TGF5b3V0M2YxMlwiLCBGaSk7XG5cbiAgICB2YXIgRGkgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5fcmVmcmVzaFZpZXdzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlciksIHRoaXMudWludDMyID0gbmV3IFVpbnQzMkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgfSwgZS5wcm90b3R5cGUuZW1wbGFjZUJhY2sgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgZSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNpemUoZSArIDEpLCB0aGlzLmVtcGxhY2UoZSwgdCk7XG4gICAgICB9LCBlLnByb3RvdHlwZS5lbXBsYWNlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudWludDMyWzEgKiB0ICsgMF0gPSBlLCB0O1xuICAgICAgfSwgZTtcbiAgICB9KGtpKTtcblxuICAgIERpLnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSA0LCBPbihcIlN0cnVjdEFycmF5TGF5b3V0MXVsNFwiLCBEaSk7XG5cbiAgICB2YXIgTGkgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5fcmVmcmVzaFZpZXdzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlciksIHRoaXMuaW50MTYgPSBuZXcgSW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKSwgdGhpcy51aW50MzIgPSBuZXcgVWludDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlciksIHRoaXMudWludDE2ID0gbmV3IFVpbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgfSwgZS5wcm90b3R5cGUuZW1wbGFjZUJhY2sgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSwgYSwgbywgcywgdSkge1xuICAgICAgICB2YXIgbCA9IHRoaXMubGVuZ3RoO1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNpemUobCArIDEpLCB0aGlzLmVtcGxhY2UobCwgdCwgZSwgciwgbiwgaSwgYSwgbywgcywgdSk7XG4gICAgICB9LCBlLnByb3RvdHlwZS5lbXBsYWNlID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGksIGEsIG8sIHMsIHUsIGwpIHtcbiAgICAgICAgdmFyIHAgPSAxMCAqIHQsXG4gICAgICAgICAgICBjID0gNSAqIHQ7XG4gICAgICAgIHJldHVybiB0aGlzLmludDE2W3AgKyAwXSA9IGUsIHRoaXMuaW50MTZbcCArIDFdID0gciwgdGhpcy5pbnQxNltwICsgMl0gPSBuLCB0aGlzLmludDE2W3AgKyAzXSA9IGksIHRoaXMuaW50MTZbcCArIDRdID0gYSwgdGhpcy5pbnQxNltwICsgNV0gPSBvLCB0aGlzLnVpbnQzMltjICsgM10gPSBzLCB0aGlzLnVpbnQxNltwICsgOF0gPSB1LCB0aGlzLnVpbnQxNltwICsgOV0gPSBsLCB0O1xuICAgICAgfSwgZTtcbiAgICB9KGtpKTtcblxuICAgIExpLnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSAyMCwgT24oXCJTdHJ1Y3RBcnJheUxheW91dDZpMXVsMnVpMjBcIiwgTGkpO1xuXG4gICAgdmFyIE9pID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuX3JlZnJlc2hWaWV3cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLCB0aGlzLmludDE2ID0gbmV3IEludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICB9LCBlLnByb3RvdHlwZS5lbXBsYWNlQmFjayA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpLCBhKSB7XG4gICAgICAgIHZhciBvID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc2l6ZShvICsgMSksIHRoaXMuZW1wbGFjZShvLCB0LCBlLCByLCBuLCBpLCBhKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmVtcGxhY2UgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSwgYSwgbykge1xuICAgICAgICB2YXIgcyA9IDYgKiB0O1xuICAgICAgICByZXR1cm4gdGhpcy5pbnQxNltzICsgMF0gPSBlLCB0aGlzLmludDE2W3MgKyAxXSA9IHIsIHRoaXMuaW50MTZbcyArIDJdID0gbiwgdGhpcy5pbnQxNltzICsgM10gPSBpLCB0aGlzLmludDE2W3MgKyA0XSA9IGEsIHRoaXMuaW50MTZbcyArIDVdID0gbywgdDtcbiAgICAgIH0sIGU7XG4gICAgfShraSk7XG5cbiAgICBPaS5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gMTIsIE9uKFwiU3RydWN0QXJyYXlMYXlvdXQyaTJpMmkxMlwiLCBPaSk7XG5cbiAgICB2YXIgUmkgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5fcmVmcmVzaFZpZXdzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlciksIHRoaXMuZmxvYXQzMiA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlciksIHRoaXMuaW50MTYgPSBuZXcgSW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmVtcGxhY2VCYWNrID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGkpIHtcbiAgICAgICAgdmFyIGEgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzaXplKGEgKyAxKSwgdGhpcy5lbXBsYWNlKGEsIHQsIGUsIHIsIG4sIGkpO1xuICAgICAgfSwgZS5wcm90b3R5cGUuZW1wbGFjZSA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpLCBhKSB7XG4gICAgICAgIHZhciBvID0gNCAqIHQsXG4gICAgICAgICAgICBzID0gOCAqIHQ7XG4gICAgICAgIHJldHVybiB0aGlzLmZsb2F0MzJbbyArIDBdID0gZSwgdGhpcy5mbG9hdDMyW28gKyAxXSA9IHIsIHRoaXMuZmxvYXQzMltvICsgMl0gPSBuLCB0aGlzLmludDE2W3MgKyA2XSA9IGksIHRoaXMuaW50MTZbcyArIDddID0gYSwgdDtcbiAgICAgIH0sIGU7XG4gICAgfShraSk7XG5cbiAgICBSaS5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gMTYsIE9uKFwiU3RydWN0QXJyYXlMYXlvdXQyZjFmMmkxNlwiLCBSaSk7XG5cbiAgICB2YXIgVWkgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5fcmVmcmVzaFZpZXdzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlciksIHRoaXMuZmxvYXQzMiA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICB9LCBlLnByb3RvdHlwZS5lbXBsYWNlQmFjayA9IGZ1bmN0aW9uICh0LCBlLCByLCBuKSB7XG4gICAgICAgIHZhciBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc2l6ZShpICsgMSksIHRoaXMuZW1wbGFjZShpLCB0LCBlLCByLCBuKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmVtcGxhY2UgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSkge1xuICAgICAgICB2YXIgYSA9IDEyICogdCxcbiAgICAgICAgICAgIG8gPSAzICogdDtcbiAgICAgICAgcmV0dXJuIHRoaXMudWludDhbYSArIDBdID0gZSwgdGhpcy51aW50OFthICsgMV0gPSByLCB0aGlzLmZsb2F0MzJbbyArIDFdID0gbiwgdGhpcy5mbG9hdDMyW28gKyAyXSA9IGksIHQ7XG4gICAgICB9LCBlO1xuICAgIH0oa2kpO1xuXG4gICAgVWkucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDEyLCBPbihcIlN0cnVjdEFycmF5TGF5b3V0MnViMmYxMlwiLCBVaSk7XG5cbiAgICB2YXIgamkgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5fcmVmcmVzaFZpZXdzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlciksIHRoaXMudWludDE2ID0gbmV3IFVpbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgfSwgZS5wcm90b3R5cGUuZW1wbGFjZUJhY2sgPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgICB2YXIgbiA9IHRoaXMubGVuZ3RoO1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNpemUobiArIDEpLCB0aGlzLmVtcGxhY2UobiwgdCwgZSwgcik7XG4gICAgICB9LCBlLnByb3RvdHlwZS5lbXBsYWNlID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4pIHtcbiAgICAgICAgdmFyIGkgPSAzICogdDtcbiAgICAgICAgcmV0dXJuIHRoaXMudWludDE2W2kgKyAwXSA9IGUsIHRoaXMudWludDE2W2kgKyAxXSA9IHIsIHRoaXMudWludDE2W2kgKyAyXSA9IG4sIHQ7XG4gICAgICB9LCBlO1xuICAgIH0oa2kpO1xuXG4gICAgamkucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDYsIE9uKFwiU3RydWN0QXJyYXlMYXlvdXQzdWk2XCIsIGppKTtcblxuICAgIHZhciBxaSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLl9yZWZyZXNoVmlld3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKSwgdGhpcy5pbnQxNiA9IG5ldyBJbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLCB0aGlzLnVpbnQxNiA9IG5ldyBVaW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKSwgdGhpcy51aW50MzIgPSBuZXcgVWludDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlciksIHRoaXMuZmxvYXQzMiA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICB9LCBlLnByb3RvdHlwZS5lbXBsYWNlQmFjayA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpLCBhLCBvLCBzLCB1LCBsLCBwLCBjLCBoLCBmLCB5LCBkLCBtKSB7XG4gICAgICAgIHZhciB2ID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc2l6ZSh2ICsgMSksIHRoaXMuZW1wbGFjZSh2LCB0LCBlLCByLCBuLCBpLCBhLCBvLCBzLCB1LCBsLCBwLCBjLCBoLCBmLCB5LCBkLCBtKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmVtcGxhY2UgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSwgYSwgbywgcywgdSwgbCwgcCwgYywgaCwgZiwgeSwgZCwgbSwgdikge1xuICAgICAgICB2YXIgZyA9IDI0ICogdCxcbiAgICAgICAgICAgIHggPSAxMiAqIHQsXG4gICAgICAgICAgICBiID0gNDggKiB0O1xuICAgICAgICByZXR1cm4gdGhpcy5pbnQxNltnICsgMF0gPSBlLCB0aGlzLmludDE2W2cgKyAxXSA9IHIsIHRoaXMudWludDE2W2cgKyAyXSA9IG4sIHRoaXMudWludDE2W2cgKyAzXSA9IGksIHRoaXMudWludDMyW3ggKyAyXSA9IGEsIHRoaXMudWludDMyW3ggKyAzXSA9IG8sIHRoaXMudWludDMyW3ggKyA0XSA9IHMsIHRoaXMudWludDE2W2cgKyAxMF0gPSB1LCB0aGlzLnVpbnQxNltnICsgMTFdID0gbCwgdGhpcy51aW50MTZbZyArIDEyXSA9IHAsIHRoaXMuZmxvYXQzMlt4ICsgN10gPSBjLCB0aGlzLmZsb2F0MzJbeCArIDhdID0gaCwgdGhpcy51aW50OFtiICsgMzZdID0gZiwgdGhpcy51aW50OFtiICsgMzddID0geSwgdGhpcy51aW50OFtiICsgMzhdID0gZCwgdGhpcy51aW50MzJbeCArIDEwXSA9IG0sIHRoaXMuaW50MTZbZyArIDIyXSA9IHYsIHQ7XG4gICAgICB9LCBlO1xuICAgIH0oa2kpO1xuXG4gICAgcWkucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDQ4LCBPbihcIlN0cnVjdEFycmF5TGF5b3V0MmkydWkzdWwzdWkyZjN1YjF1bDFpNDhcIiwgcWkpO1xuXG4gICAgdmFyIE5pID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuX3JlZnJlc2hWaWV3cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLCB0aGlzLmludDE2ID0gbmV3IEludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlciksIHRoaXMudWludDE2ID0gbmV3IFVpbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLCB0aGlzLnVpbnQzMiA9IG5ldyBVaW50MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKSwgdGhpcy5mbG9hdDMyID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmVtcGxhY2VCYWNrID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGksIGEsIG8sIHMsIHUsIGwsIHAsIGMsIGgsIGYsIHksIGQsIG0sIHYsIGcsIHgsIGIsIHcsIF8sIEEsIFMsIGssIEksIHopIHtcbiAgICAgICAgdmFyIEMgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzaXplKEMgKyAxKSwgdGhpcy5lbXBsYWNlKEMsIHQsIGUsIHIsIG4sIGksIGEsIG8sIHMsIHUsIGwsIHAsIGMsIGgsIGYsIHksIGQsIG0sIHYsIGcsIHgsIGIsIHcsIF8sIEEsIFMsIGssIEksIHopO1xuICAgICAgfSwgZS5wcm90b3R5cGUuZW1wbGFjZSA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpLCBhLCBvLCBzLCB1LCBsLCBwLCBjLCBoLCBmLCB5LCBkLCBtLCB2LCBnLCB4LCBiLCB3LCBfLCBBLCBTLCBrLCBJLCB6LCBDKSB7XG4gICAgICAgIHZhciBFID0gMzQgKiB0LFxuICAgICAgICAgICAgUCA9IDE3ICogdDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50MTZbRSArIDBdID0gZSwgdGhpcy5pbnQxNltFICsgMV0gPSByLCB0aGlzLmludDE2W0UgKyAyXSA9IG4sIHRoaXMuaW50MTZbRSArIDNdID0gaSwgdGhpcy5pbnQxNltFICsgNF0gPSBhLCB0aGlzLmludDE2W0UgKyA1XSA9IG8sIHRoaXMuaW50MTZbRSArIDZdID0gcywgdGhpcy5pbnQxNltFICsgN10gPSB1LCB0aGlzLnVpbnQxNltFICsgOF0gPSBsLCB0aGlzLnVpbnQxNltFICsgOV0gPSBwLCB0aGlzLnVpbnQxNltFICsgMTBdID0gYywgdGhpcy51aW50MTZbRSArIDExXSA9IGgsIHRoaXMudWludDE2W0UgKyAxMl0gPSBmLCB0aGlzLnVpbnQxNltFICsgMTNdID0geSwgdGhpcy51aW50MTZbRSArIDE0XSA9IGQsIHRoaXMudWludDE2W0UgKyAxNV0gPSBtLCB0aGlzLnVpbnQxNltFICsgMTZdID0gdiwgdGhpcy51aW50MTZbRSArIDE3XSA9IGcsIHRoaXMudWludDE2W0UgKyAxOF0gPSB4LCB0aGlzLnVpbnQxNltFICsgMTldID0gYiwgdGhpcy51aW50MTZbRSArIDIwXSA9IHcsIHRoaXMudWludDE2W0UgKyAyMV0gPSBfLCB0aGlzLnVpbnQxNltFICsgMjJdID0gQSwgdGhpcy51aW50MzJbUCArIDEyXSA9IFMsIHRoaXMuZmxvYXQzMltQICsgMTNdID0gaywgdGhpcy5mbG9hdDMyW1AgKyAxNF0gPSBJLCB0aGlzLmZsb2F0MzJbUCArIDE1XSA9IHosIHRoaXMuZmxvYXQzMltQICsgMTZdID0gQywgdDtcbiAgICAgIH0sIGU7XG4gICAgfShraSk7XG5cbiAgICBOaS5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gNjgsIE9uKFwiU3RydWN0QXJyYXlMYXlvdXQ4aTE1dWkxdWw0ZjY4XCIsIE5pKTtcblxuICAgIHZhciBLaSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLl9yZWZyZXNoVmlld3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKSwgdGhpcy5mbG9hdDMyID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmVtcGxhY2VCYWNrID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdmFyIGUgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzaXplKGUgKyAxKSwgdGhpcy5lbXBsYWNlKGUsIHQpO1xuICAgICAgfSwgZS5wcm90b3R5cGUuZW1wbGFjZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZsb2F0MzJbMSAqIHQgKyAwXSA9IGUsIHQ7XG4gICAgICB9LCBlO1xuICAgIH0oa2kpO1xuXG4gICAgS2kucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDQsIE9uKFwiU3RydWN0QXJyYXlMYXlvdXQxZjRcIiwgS2kpO1xuXG4gICAgdmFyIEdpID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuX3JlZnJlc2hWaWV3cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLCB0aGlzLmludDE2ID0gbmV3IEludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICB9LCBlLnByb3RvdHlwZS5lbXBsYWNlQmFjayA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICAgIHZhciBuID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc2l6ZShuICsgMSksIHRoaXMuZW1wbGFjZShuLCB0LCBlLCByKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmVtcGxhY2UgPSBmdW5jdGlvbiAodCwgZSwgciwgbikge1xuICAgICAgICB2YXIgaSA9IDMgKiB0O1xuICAgICAgICByZXR1cm4gdGhpcy5pbnQxNltpICsgMF0gPSBlLCB0aGlzLmludDE2W2kgKyAxXSA9IHIsIHRoaXMuaW50MTZbaSArIDJdID0gbiwgdDtcbiAgICAgIH0sIGU7XG4gICAgfShraSk7XG5cbiAgICBHaS5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gNiwgT24oXCJTdHJ1Y3RBcnJheUxheW91dDNpNlwiLCBHaSk7XG5cbiAgICB2YXIgWmkgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5fcmVmcmVzaFZpZXdzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlciksIHRoaXMudWludDMyID0gbmV3IFVpbnQzMkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLCB0aGlzLnVpbnQxNiA9IG5ldyBVaW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmVtcGxhY2VCYWNrID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgICAgdmFyIG4gPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzaXplKG4gKyAxKSwgdGhpcy5lbXBsYWNlKG4sIHQsIGUsIHIpO1xuICAgICAgfSwgZS5wcm90b3R5cGUuZW1wbGFjZSA9IGZ1bmN0aW9uICh0LCBlLCByLCBuKSB7XG4gICAgICAgIHZhciBpID0gNCAqIHQ7XG4gICAgICAgIHJldHVybiB0aGlzLnVpbnQzMlsyICogdCArIDBdID0gZSwgdGhpcy51aW50MTZbaSArIDJdID0gciwgdGhpcy51aW50MTZbaSArIDNdID0gbiwgdDtcbiAgICAgIH0sIGU7XG4gICAgfShraSk7XG5cbiAgICBaaS5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gOCwgT24oXCJTdHJ1Y3RBcnJheUxheW91dDF1bDJ1aThcIiwgWmkpO1xuXG4gICAgdmFyIFhpID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuX3JlZnJlc2hWaWV3cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLCB0aGlzLnVpbnQxNiA9IG5ldyBVaW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmVtcGxhY2VCYWNrID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgdmFyIHIgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzaXplKHIgKyAxKSwgdGhpcy5lbXBsYWNlKHIsIHQsIGUpO1xuICAgICAgfSwgZS5wcm90b3R5cGUuZW1wbGFjZSA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICAgIHZhciBuID0gMiAqIHQ7XG4gICAgICAgIHJldHVybiB0aGlzLnVpbnQxNltuICsgMF0gPSBlLCB0aGlzLnVpbnQxNltuICsgMV0gPSByLCB0O1xuICAgICAgfSwgZTtcbiAgICB9KGtpKTtcblxuICAgIFhpLnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSA0LCBPbihcIlN0cnVjdEFycmF5TGF5b3V0MnVpNFwiLCBYaSk7XG5cbiAgICB2YXIgSmkgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5fcmVmcmVzaFZpZXdzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlciksIHRoaXMudWludDE2ID0gbmV3IFVpbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgfSwgZS5wcm90b3R5cGUuZW1wbGFjZUJhY2sgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgZSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNpemUoZSArIDEpLCB0aGlzLmVtcGxhY2UoZSwgdCk7XG4gICAgICB9LCBlLnByb3RvdHlwZS5lbXBsYWNlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudWludDE2WzEgKiB0ICsgMF0gPSBlLCB0O1xuICAgICAgfSwgZTtcbiAgICB9KGtpKTtcblxuICAgIEppLnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSAyLCBPbihcIlN0cnVjdEFycmF5TGF5b3V0MXVpMlwiLCBKaSk7XG5cbiAgICB2YXIgSGkgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5fcmVmcmVzaFZpZXdzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlciksIHRoaXMuZmxvYXQzMiA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICB9LCBlLnByb3RvdHlwZS5lbXBsYWNlQmFjayA9IGZ1bmN0aW9uICh0LCBlLCByLCBuKSB7XG4gICAgICAgIHZhciBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc2l6ZShpICsgMSksIHRoaXMuZW1wbGFjZShpLCB0LCBlLCByLCBuKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmVtcGxhY2UgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSkge1xuICAgICAgICB2YXIgYSA9IDQgKiB0O1xuICAgICAgICByZXR1cm4gdGhpcy5mbG9hdDMyW2EgKyAwXSA9IGUsIHRoaXMuZmxvYXQzMlthICsgMV0gPSByLCB0aGlzLmZsb2F0MzJbYSArIDJdID0gbiwgdGhpcy5mbG9hdDMyW2EgKyAzXSA9IGksIHQ7XG4gICAgICB9LCBlO1xuICAgIH0oa2kpO1xuXG4gICAgSGkucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDE2LCBPbihcIlN0cnVjdEFycmF5TGF5b3V0NGYxNlwiLCBIaSk7XG5cbiAgICB2YXIgWWkgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGU7XG4gICAgICB2YXIgciA9IHtcbiAgICAgICAgYW5jaG9yUG9pbnRYOiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9LFxuICAgICAgICBhbmNob3JQb2ludFk6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH0sXG4gICAgICAgIHgxOiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9LFxuICAgICAgICB5MToge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgeDI6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH0sXG4gICAgICAgIHkyOiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9LFxuICAgICAgICBmZWF0dXJlSW5kZXg6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH0sXG4gICAgICAgIHNvdXJjZUxheWVySW5kZXg6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH0sXG4gICAgICAgIGJ1Y2tldEluZGV4OiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9LFxuICAgICAgICBhbmNob3JQb2ludDoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJldHVybiByLmFuY2hvclBvaW50WC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMF07XG4gICAgICB9LCByLmFuY2hvclBvaW50WS5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMV07XG4gICAgICB9LCByLngxLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAyXTtcbiAgICAgIH0sIHIueTEuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDNdO1xuICAgICAgfSwgci54Mi5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgNF07XG4gICAgICB9LCByLnkyLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyA1XTtcbiAgICAgIH0sIHIuZmVhdHVyZUluZGV4LmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQzMlt0aGlzLl9wb3M0ICsgM107XG4gICAgICB9LCByLnNvdXJjZUxheWVySW5kZXguZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyA4XTtcbiAgICAgIH0sIHIuYnVja2V0SW5kZXguZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyA5XTtcbiAgICAgIH0sIHIuYW5jaG9yUG9pbnQuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IGkodGhpcy5hbmNob3JQb2ludFgsIHRoaXMuYW5jaG9yUG9pbnRZKTtcbiAgICAgIH0sIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUucHJvdG90eXBlLCByKSwgZTtcbiAgICB9KFNpKTtcblxuICAgIFlpLnByb3RvdHlwZS5zaXplID0gMjA7XG5cbiAgICB2YXIgJGkgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gbmV3IFlpKHRoaXMsIHQpO1xuICAgICAgfSwgZTtcbiAgICB9KExpKTtcblxuICAgIE9uKFwiQ29sbGlzaW9uQm94QXJyYXlcIiwgJGkpO1xuXG4gICAgdmFyIFdpID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlO1xuICAgICAgdmFyIHIgPSB7XG4gICAgICAgIGFuY2hvclg6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH0sXG4gICAgICAgIGFuY2hvclk6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH0sXG4gICAgICAgIGdseXBoU3RhcnRJbmRleDoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgbnVtR2x5cGhzOiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9LFxuICAgICAgICB2ZXJ0ZXhTdGFydEluZGV4OiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9LFxuICAgICAgICBsaW5lU3RhcnRJbmRleDoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgbGluZUxlbmd0aDoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgc2VnbWVudDoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgbG93ZXJTaXplOiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9LFxuICAgICAgICB1cHBlclNpemU6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH0sXG4gICAgICAgIGxpbmVPZmZzZXRYOiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9LFxuICAgICAgICBsaW5lT2Zmc2V0WToge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgd3JpdGluZ01vZGU6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH0sXG4gICAgICAgIHBsYWNlZE9yaWVudGF0aW9uOiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9LFxuICAgICAgICBoaWRkZW46IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH0sXG4gICAgICAgIGNyb3NzVGlsZUlEOiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9LFxuICAgICAgICBhc3NvY2lhdGVkSWNvbkluZGV4OiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcmV0dXJuIHIuYW5jaG9yWC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMF07XG4gICAgICB9LCByLmFuY2hvclkuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDFdO1xuICAgICAgfSwgci5nbHlwaFN0YXJ0SW5kZXguZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAyXTtcbiAgICAgIH0sIHIubnVtR2x5cGhzLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgM107XG4gICAgICB9LCByLnZlcnRleFN0YXJ0SW5kZXguZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDMyW3RoaXMuX3BvczQgKyAyXTtcbiAgICAgIH0sIHIubGluZVN0YXJ0SW5kZXguZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDMyW3RoaXMuX3BvczQgKyAzXTtcbiAgICAgIH0sIHIubGluZUxlbmd0aC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MzJbdGhpcy5fcG9zNCArIDRdO1xuICAgICAgfSwgci5zZWdtZW50LmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMTBdO1xuICAgICAgfSwgci5sb3dlclNpemUuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAxMV07XG4gICAgICB9LCByLnVwcGVyU2l6ZS5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDEyXTtcbiAgICAgIH0sIHIubGluZU9mZnNldFguZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuZmxvYXQzMlt0aGlzLl9wb3M0ICsgN107XG4gICAgICB9LCByLmxpbmVPZmZzZXRZLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmZsb2F0MzJbdGhpcy5fcG9zNCArIDhdO1xuICAgICAgfSwgci53cml0aW5nTW9kZS5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50OFt0aGlzLl9wb3MxICsgMzZdO1xuICAgICAgfSwgci5wbGFjZWRPcmllbnRhdGlvbi5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50OFt0aGlzLl9wb3MxICsgMzddO1xuICAgICAgfSwgci5wbGFjZWRPcmllbnRhdGlvbi5zZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB0aGlzLl9zdHJ1Y3RBcnJheS51aW50OFt0aGlzLl9wb3MxICsgMzddID0gdDtcbiAgICAgIH0sIHIuaGlkZGVuLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQ4W3RoaXMuX3BvczEgKyAzOF07XG4gICAgICB9LCByLmhpZGRlbi5zZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB0aGlzLl9zdHJ1Y3RBcnJheS51aW50OFt0aGlzLl9wb3MxICsgMzhdID0gdDtcbiAgICAgIH0sIHIuY3Jvc3NUaWxlSUQuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDMyW3RoaXMuX3BvczQgKyAxMF07XG4gICAgICB9LCByLmNyb3NzVGlsZUlELnNldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQzMlt0aGlzLl9wb3M0ICsgMTBdID0gdDtcbiAgICAgIH0sIHIuYXNzb2NpYXRlZEljb25JbmRleC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMjJdO1xuICAgICAgfSwgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZS5wcm90b3R5cGUsIHIpLCBlO1xuICAgIH0oU2kpO1xuXG4gICAgV2kucHJvdG90eXBlLnNpemUgPSA0ODtcblxuICAgIHZhciBRaSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgV2kodGhpcywgdCk7XG4gICAgICB9LCBlO1xuICAgIH0ocWkpO1xuXG4gICAgT24oXCJQbGFjZWRTeW1ib2xBcnJheVwiLCBRaSk7XG5cbiAgICB2YXIgdGEgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGU7XG4gICAgICB2YXIgciA9IHtcbiAgICAgICAgYW5jaG9yWDoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgYW5jaG9yWToge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgcmlnaHRKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXg6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH0sXG4gICAgICAgIGNlbnRlckp1c3RpZmllZFRleHRTeW1ib2xJbmRleDoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgbGVmdEp1c3RpZmllZFRleHRTeW1ib2xJbmRleDoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgdmVydGljYWxQbGFjZWRUZXh0U3ltYm9sSW5kZXg6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH0sXG4gICAgICAgIHBsYWNlZEljb25TeW1ib2xJbmRleDoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgdmVydGljYWxQbGFjZWRJY29uU3ltYm9sSW5kZXg6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH0sXG4gICAgICAgIGtleToge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgdGV4dEJveFN0YXJ0SW5kZXg6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH0sXG4gICAgICAgIHRleHRCb3hFbmRJbmRleDoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgdmVydGljYWxUZXh0Qm94U3RhcnRJbmRleDoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgdmVydGljYWxUZXh0Qm94RW5kSW5kZXg6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH0sXG4gICAgICAgIGljb25Cb3hTdGFydEluZGV4OiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9LFxuICAgICAgICBpY29uQm94RW5kSW5kZXg6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH0sXG4gICAgICAgIHZlcnRpY2FsSWNvbkJveFN0YXJ0SW5kZXg6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH0sXG4gICAgICAgIHZlcnRpY2FsSWNvbkJveEVuZEluZGV4OiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9LFxuICAgICAgICBmZWF0dXJlSW5kZXg6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH0sXG4gICAgICAgIG51bUhvcml6b250YWxHbHlwaFZlcnRpY2VzOiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9LFxuICAgICAgICBudW1WZXJ0aWNhbEdseXBoVmVydGljZXM6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH0sXG4gICAgICAgIG51bUljb25WZXJ0aWNlczoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgbnVtVmVydGljYWxJY29uVmVydGljZXM6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH0sXG4gICAgICAgIHVzZVJ1bnRpbWVDb2xsaXNpb25DaXJjbGVzOiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9LFxuICAgICAgICBjcm9zc1RpbGVJRDoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgdGV4dEJveFNjYWxlOiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9LFxuICAgICAgICB0ZXh0T2Zmc2V0MDoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgdGV4dE9mZnNldDE6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH0sXG4gICAgICAgIGNvbGxpc2lvbkNpcmNsZURpYW1ldGVyOiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcmV0dXJuIHIuYW5jaG9yWC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMF07XG4gICAgICB9LCByLmFuY2hvclkuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDFdO1xuICAgICAgfSwgci5yaWdodEp1c3RpZmllZFRleHRTeW1ib2xJbmRleC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMl07XG4gICAgICB9LCByLmNlbnRlckp1c3RpZmllZFRleHRTeW1ib2xJbmRleC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgM107XG4gICAgICB9LCByLmxlZnRKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXguZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDRdO1xuICAgICAgfSwgci52ZXJ0aWNhbFBsYWNlZFRleHRTeW1ib2xJbmRleC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgNV07XG4gICAgICB9LCByLnBsYWNlZEljb25TeW1ib2xJbmRleC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgNl07XG4gICAgICB9LCByLnZlcnRpY2FsUGxhY2VkSWNvblN5bWJvbEluZGV4LmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyA3XTtcbiAgICAgIH0sIHIua2V5LmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgOF07XG4gICAgICB9LCByLnRleHRCb3hTdGFydEluZGV4LmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgOV07XG4gICAgICB9LCByLnRleHRCb3hFbmRJbmRleC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDEwXTtcbiAgICAgIH0sIHIudmVydGljYWxUZXh0Qm94U3RhcnRJbmRleC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDExXTtcbiAgICAgIH0sIHIudmVydGljYWxUZXh0Qm94RW5kSW5kZXguZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAxMl07XG4gICAgICB9LCByLmljb25Cb3hTdGFydEluZGV4LmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMTNdO1xuICAgICAgfSwgci5pY29uQm94RW5kSW5kZXguZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAxNF07XG4gICAgICB9LCByLnZlcnRpY2FsSWNvbkJveFN0YXJ0SW5kZXguZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAxNV07XG4gICAgICB9LCByLnZlcnRpY2FsSWNvbkJveEVuZEluZGV4LmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMTZdO1xuICAgICAgfSwgci5mZWF0dXJlSW5kZXguZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAxN107XG4gICAgICB9LCByLm51bUhvcml6b250YWxHbHlwaFZlcnRpY2VzLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMThdO1xuICAgICAgfSwgci5udW1WZXJ0aWNhbEdseXBoVmVydGljZXMuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAxOV07XG4gICAgICB9LCByLm51bUljb25WZXJ0aWNlcy5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDIwXTtcbiAgICAgIH0sIHIubnVtVmVydGljYWxJY29uVmVydGljZXMuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAyMV07XG4gICAgICB9LCByLnVzZVJ1bnRpbWVDb2xsaXNpb25DaXJjbGVzLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMjJdO1xuICAgICAgfSwgci5jcm9zc1RpbGVJRC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MzJbdGhpcy5fcG9zNCArIDEyXTtcbiAgICAgIH0sIHIuY3Jvc3NUaWxlSUQuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdGhpcy5fc3RydWN0QXJyYXkudWludDMyW3RoaXMuX3BvczQgKyAxMl0gPSB0O1xuICAgICAgfSwgci50ZXh0Qm94U2NhbGUuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuZmxvYXQzMlt0aGlzLl9wb3M0ICsgMTNdO1xuICAgICAgfSwgci50ZXh0T2Zmc2V0MC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5mbG9hdDMyW3RoaXMuX3BvczQgKyAxNF07XG4gICAgICB9LCByLnRleHRPZmZzZXQxLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmZsb2F0MzJbdGhpcy5fcG9zNCArIDE1XTtcbiAgICAgIH0sIHIuY29sbGlzaW9uQ2lyY2xlRGlhbWV0ZXIuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuZmxvYXQzMlt0aGlzLl9wb3M0ICsgMTZdO1xuICAgICAgfSwgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZS5wcm90b3R5cGUsIHIpLCBlO1xuICAgIH0oU2kpO1xuXG4gICAgdGEucHJvdG90eXBlLnNpemUgPSA2ODtcblxuICAgIHZhciBlYSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgdGEodGhpcywgdCk7XG4gICAgICB9LCBlO1xuICAgIH0oTmkpO1xuXG4gICAgT24oXCJTeW1ib2xJbnN0YW5jZUFycmF5XCIsIGVhKTtcblxuICAgIHZhciByYSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLmdldG9mZnNldFggPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mbG9hdDMyWzEgKiB0ICsgMF07XG4gICAgICB9LCBlO1xuICAgIH0oS2kpO1xuXG4gICAgT24oXCJHbHlwaE9mZnNldEFycmF5XCIsIHJhKTtcblxuICAgIHZhciBuYSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLmdldHggPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnQxNlszICogdCArIDBdO1xuICAgICAgfSwgZS5wcm90b3R5cGUuZ2V0eSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmludDE2WzMgKiB0ICsgMV07XG4gICAgICB9LCBlLnByb3RvdHlwZS5nZXR0aWxlVW5pdERpc3RhbmNlRnJvbUFuY2hvciA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmludDE2WzMgKiB0ICsgMl07XG4gICAgICB9LCBlO1xuICAgIH0oR2kpO1xuXG4gICAgT24oXCJTeW1ib2xMaW5lVmVydGV4QXJyYXlcIiwgbmEpO1xuXG4gICAgdmFyIGlhID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlO1xuICAgICAgdmFyIHIgPSB7XG4gICAgICAgIGZlYXR1cmVJbmRleDoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgc291cmNlTGF5ZXJJbmRleDoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgYnVja2V0SW5kZXg6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZXR1cm4gci5mZWF0dXJlSW5kZXguZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDMyW3RoaXMuX3BvczQgKyAwXTtcbiAgICAgIH0sIHIuc291cmNlTGF5ZXJJbmRleC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDJdO1xuICAgICAgfSwgci5idWNrZXRJbmRleC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDNdO1xuICAgICAgfSwgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZS5wcm90b3R5cGUsIHIpLCBlO1xuICAgIH0oU2kpO1xuXG4gICAgaWEucHJvdG90eXBlLnNpemUgPSA4O1xuXG4gICAgdmFyIGFhID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBpYSh0aGlzLCB0KTtcbiAgICAgIH0sIGU7XG4gICAgfShaaSk7XG5cbiAgICBPbihcIkZlYXR1cmVJbmRleEFycmF5XCIsIGFhKTtcblxuICAgIHZhciBvYSA9IElpKFt7XG4gICAgICBuYW1lOiBcImFfcG9zXCIsXG4gICAgICBjb21wb25lbnRzOiAyLFxuICAgICAgdHlwZTogXCJJbnQxNlwiXG4gICAgfV0sIDQpLm1lbWJlcnMsXG4gICAgICAgIHNhID0gZnVuY3Rpb24gc2EodCkge1xuICAgICAgdm9pZCAwID09PSB0ICYmICh0ID0gW10pLCB0aGlzLnNlZ21lbnRzID0gdDtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gdWEodCwgZSkge1xuICAgICAgcmV0dXJuIDI1NiAqICh0ID0gcChNYXRoLmZsb29yKHQpLCAwLCAyNTUpKSArIHAoTWF0aC5mbG9vcihlKSwgMCwgMjU1KTtcbiAgICB9XG5cbiAgICBzYS5wcm90b3R5cGUucHJlcGFyZVNlZ21lbnQgPSBmdW5jdGlvbiAodCwgZSwgciwgbikge1xuICAgICAgdmFyIGkgPSB0aGlzLnNlZ21lbnRzW3RoaXMuc2VnbWVudHMubGVuZ3RoIC0gMV07XG4gICAgICByZXR1cm4gdCA+IHNhLk1BWF9WRVJURVhfQVJSQVlfTEVOR1RIICYmIEEoXCJNYXggdmVydGljZXMgcGVyIHNlZ21lbnQgaXMgXCIgKyBzYS5NQVhfVkVSVEVYX0FSUkFZX0xFTkdUSCArIFwiOiBidWNrZXQgcmVxdWVzdGVkIFwiICsgdCksICghaSB8fCBpLnZlcnRleExlbmd0aCArIHQgPiBzYS5NQVhfVkVSVEVYX0FSUkFZX0xFTkdUSCB8fCBpLnNvcnRLZXkgIT09IG4pICYmIChpID0ge1xuICAgICAgICB2ZXJ0ZXhPZmZzZXQ6IGUubGVuZ3RoLFxuICAgICAgICBwcmltaXRpdmVPZmZzZXQ6IHIubGVuZ3RoLFxuICAgICAgICB2ZXJ0ZXhMZW5ndGg6IDAsXG4gICAgICAgIHByaW1pdGl2ZUxlbmd0aDogMFxuICAgICAgfSwgdm9pZCAwICE9PSBuICYmIChpLnNvcnRLZXkgPSBuKSwgdGhpcy5zZWdtZW50cy5wdXNoKGkpKSwgaTtcbiAgICB9LCBzYS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2VnbWVudHM7XG4gICAgfSwgc2EucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKHZhciB0ID0gMCwgZSA9IHRoaXMuc2VnbWVudHM7IHQgPCBlLmxlbmd0aDsgdCArPSAxKSB7XG4gICAgICAgIHZhciByID0gZVt0XTtcblxuICAgICAgICBmb3IgKHZhciBuIGluIHIudmFvcykge1xuICAgICAgICAgIHIudmFvc1tuXS5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBzYS5zaW1wbGVTZWdtZW50ID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4pIHtcbiAgICAgIHJldHVybiBuZXcgc2EoW3tcbiAgICAgICAgdmVydGV4T2Zmc2V0OiB0LFxuICAgICAgICBwcmltaXRpdmVPZmZzZXQ6IGUsXG4gICAgICAgIHZlcnRleExlbmd0aDogcixcbiAgICAgICAgcHJpbWl0aXZlTGVuZ3RoOiBuLFxuICAgICAgICB2YW9zOiB7fSxcbiAgICAgICAgc29ydEtleTogMFxuICAgICAgfV0pO1xuICAgIH0sIHNhLk1BWF9WRVJURVhfQVJSQVlfTEVOR1RIID0gTWF0aC5wb3coMiwgMTYpIC0gMSwgT24oXCJTZWdtZW50VmVjdG9yXCIsIHNhKTtcbiAgICB2YXIgbGEgPSBJaShbe1xuICAgICAgbmFtZTogXCJhX3BhdHRlcm5fZnJvbVwiLFxuICAgICAgY29tcG9uZW50czogNCxcbiAgICAgIHR5cGU6IFwiVWludDE2XCJcbiAgICB9LCB7XG4gICAgICBuYW1lOiBcImFfcGF0dGVybl90b1wiLFxuICAgICAgY29tcG9uZW50czogNCxcbiAgICAgIHR5cGU6IFwiVWludDE2XCJcbiAgICB9LCB7XG4gICAgICBuYW1lOiBcImFfcGl4ZWxfcmF0aW9fZnJvbVwiLFxuICAgICAgY29tcG9uZW50czogMSxcbiAgICAgIHR5cGU6IFwiVWludDE2XCJcbiAgICB9LCB7XG4gICAgICBuYW1lOiBcImFfcGl4ZWxfcmF0aW9fdG9cIixcbiAgICAgIGNvbXBvbmVudHM6IDEsXG4gICAgICB0eXBlOiBcIlVpbnQxNlwiXG4gICAgfV0pLFxuICAgICAgICBwYSA9IGUoZnVuY3Rpb24gKHQpIHtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHZhciByLCBuLCBpLCBhLCBvLCBzLCB1LCBsO1xuXG4gICAgICAgIGZvciAobiA9IHQubGVuZ3RoIC0gKHIgPSAzICYgdC5sZW5ndGgpLCBpID0gZSwgbyA9IDM0MzI5MTgzNTMsIHMgPSA0NjE4NDU5MDcsIGwgPSAwOyBsIDwgbjspIHtcbiAgICAgICAgICB1ID0gMjU1ICYgdC5jaGFyQ29kZUF0KGwpIHwgKDI1NSAmIHQuY2hhckNvZGVBdCgrK2wpKSA8PCA4IHwgKDI1NSAmIHQuY2hhckNvZGVBdCgrK2wpKSA8PCAxNiB8ICgyNTUgJiB0LmNoYXJDb2RlQXQoKytsKSkgPDwgMjQsICsrbCwgaSA9IDI3NDkyICsgKDY1NTM1ICYgKGEgPSA1ICogKDY1NTM1ICYgKGkgPSAoaSBePSB1ID0gKDY1NTM1ICYgKHUgPSAodSA9ICg2NTUzNSAmIHUpICogbyArICgoKHUgPj4+IDE2KSAqIG8gJiA2NTUzNSkgPDwgMTYpICYgNDI5NDk2NzI5NSkgPDwgMTUgfCB1ID4+PiAxNykpICogcyArICgoKHUgPj4+IDE2KSAqIHMgJiA2NTUzNSkgPDwgMTYpICYgNDI5NDk2NzI5NSkgPDwgMTMgfCBpID4+PiAxOSkpICsgKCg1ICogKGkgPj4+IDE2KSAmIDY1NTM1KSA8PCAxNikgJiA0Mjk0OTY3Mjk1KSkgKyAoKDU4OTY0ICsgKGEgPj4+IDE2KSAmIDY1NTM1KSA8PCAxNik7XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKHUgPSAwLCByKSB7XG4gICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgdSBePSAoMjU1ICYgdC5jaGFyQ29kZUF0KGwgKyAyKSkgPDwgMTY7XG5cbiAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICB1IF49ICgyNTUgJiB0LmNoYXJDb2RlQXQobCArIDEpKSA8PCA4O1xuXG4gICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgaSBePSB1ID0gKDY1NTM1ICYgKHUgPSAodSA9ICg2NTUzNSAmICh1IF49IDI1NSAmIHQuY2hhckNvZGVBdChsKSkpICogbyArICgoKHUgPj4+IDE2KSAqIG8gJiA2NTUzNSkgPDwgMTYpICYgNDI5NDk2NzI5NSkgPDwgMTUgfCB1ID4+PiAxNykpICogcyArICgoKHUgPj4+IDE2KSAqIHMgJiA2NTUzNSkgPDwgMTYpICYgNDI5NDk2NzI5NTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpIF49IHQubGVuZ3RoLCBpID0gMjI0NjgyMjUwNyAqICg2NTUzNSAmIChpIF49IGkgPj4+IDE2KSkgKyAoKDIyNDY4MjI1MDcgKiAoaSA+Pj4gMTYpICYgNjU1MzUpIDw8IDE2KSAmIDQyOTQ5NjcyOTUsIGkgPSAzMjY2NDg5OTA5ICogKDY1NTM1ICYgKGkgXj0gaSA+Pj4gMTMpKSArICgoMzI2NjQ4OTkwOSAqIChpID4+PiAxNikgJiA2NTUzNSkgPDwgMTYpICYgNDI5NDk2NzI5NSwgKGkgXj0gaSA+Pj4gMTYpID4+PiAwO1xuICAgICAgfTtcbiAgICB9KSxcbiAgICAgICAgY2EgPSBlKGZ1bmN0aW9uICh0KSB7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICBmb3IgKHZhciByLCBuID0gdC5sZW5ndGgsIGkgPSBlIF4gbiwgYSA9IDA7IG4gPj0gNDspIHtcbiAgICAgICAgICByID0gMTU0MDQ4MzQ3NyAqICg2NTUzNSAmIChyID0gMjU1ICYgdC5jaGFyQ29kZUF0KGEpIHwgKDI1NSAmIHQuY2hhckNvZGVBdCgrK2EpKSA8PCA4IHwgKDI1NSAmIHQuY2hhckNvZGVBdCgrK2EpKSA8PCAxNiB8ICgyNTUgJiB0LmNoYXJDb2RlQXQoKythKSkgPDwgMjQpKSArICgoMTU0MDQ4MzQ3NyAqIChyID4+PiAxNikgJiA2NTUzNSkgPDwgMTYpLCBpID0gMTU0MDQ4MzQ3NyAqICg2NTUzNSAmIGkpICsgKCgxNTQwNDgzNDc3ICogKGkgPj4+IDE2KSAmIDY1NTM1KSA8PCAxNikgXiAociA9IDE1NDA0ODM0NzcgKiAoNjU1MzUgJiAociBePSByID4+PiAyNCkpICsgKCgxNTQwNDgzNDc3ICogKHIgPj4+IDE2KSAmIDY1NTM1KSA8PCAxNikpLCBuIC09IDQsICsrYTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAobikge1xuICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIGkgXj0gKDI1NSAmIHQuY2hhckNvZGVBdChhICsgMikpIDw8IDE2O1xuXG4gICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgaSBePSAoMjU1ICYgdC5jaGFyQ29kZUF0KGEgKyAxKSkgPDwgODtcblxuICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIGkgPSAxNTQwNDgzNDc3ICogKDY1NTM1ICYgKGkgXj0gMjU1ICYgdC5jaGFyQ29kZUF0KGEpKSkgKyAoKDE1NDA0ODM0NzcgKiAoaSA+Pj4gMTYpICYgNjU1MzUpIDw8IDE2KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpID0gMTU0MDQ4MzQ3NyAqICg2NTUzNSAmIChpIF49IGkgPj4+IDEzKSkgKyAoKDE1NDA0ODM0NzcgKiAoaSA+Pj4gMTYpICYgNjU1MzUpIDw8IDE2KSwgKGkgXj0gaSA+Pj4gMTUpID4+PiAwO1xuICAgICAgfTtcbiAgICB9KSxcbiAgICAgICAgaGEgPSBwYSxcbiAgICAgICAgZmEgPSBjYTtcbiAgICBoYS5tdXJtdXIzID0gcGEsIGhhLm11cm11cjIgPSBmYTtcblxuICAgIHZhciB5YSA9IGZ1bmN0aW9uIHlhKCkge1xuICAgICAgdGhpcy5pZHMgPSBbXSwgdGhpcy5wb3NpdGlvbnMgPSBbXSwgdGhpcy5pbmRleGVkID0gITE7XG4gICAgfTtcblxuICAgIHlhLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAodCwgZSwgciwgbikge1xuICAgICAgdGhpcy5pZHMucHVzaChtYSh0KSksIHRoaXMucG9zaXRpb25zLnB1c2goZSwgciwgbik7XG4gICAgfSwgeWEucHJvdG90eXBlLmdldFBvc2l0aW9ucyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmb3IgKHZhciBlID0gbWEodCksIHIgPSAwLCBuID0gdGhpcy5pZHMubGVuZ3RoIC0gMTsgciA8IG47KSB7XG4gICAgICAgIHZhciBpID0gciArIG4gPj4gMTtcbiAgICAgICAgdGhpcy5pZHNbaV0gPj0gZSA/IG4gPSBpIDogciA9IGkgKyAxO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBhID0gW107IHRoaXMuaWRzW3JdID09PSBlOykge1xuICAgICAgICBhLnB1c2goe1xuICAgICAgICAgIGluZGV4OiB0aGlzLnBvc2l0aW9uc1szICogcl0sXG4gICAgICAgICAgc3RhcnQ6IHRoaXMucG9zaXRpb25zWzMgKiByICsgMV0sXG4gICAgICAgICAgZW5kOiB0aGlzLnBvc2l0aW9uc1szICogciArIDJdXG4gICAgICAgIH0pLCByKys7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhO1xuICAgIH0sIHlhLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB2YXIgciA9IG5ldyBGbG9hdDY0QXJyYXkodC5pZHMpLFxuICAgICAgICAgIG4gPSBuZXcgVWludDMyQXJyYXkodC5wb3NpdGlvbnMpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIHQoZSwgciwgbiwgaSkge1xuICAgICAgICBmb3IgKDsgbiA8IGk7KSB7XG4gICAgICAgICAgZm9yICh2YXIgYSA9IGVbbiArIGkgPj4gMV0sIG8gPSBuIC0gMSwgcyA9IGkgKyAxOzspIHtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgbysrO1xuICAgICAgICAgICAgfSB3aGlsZSAoZVtvXSA8IGEpO1xuXG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgIHMtLTtcbiAgICAgICAgICAgIH0gd2hpbGUgKGVbc10gPiBhKTtcblxuICAgICAgICAgICAgaWYgKG8gPj0gcykgYnJlYWs7XG4gICAgICAgICAgICB2YShlLCBvLCBzKSwgdmEociwgMyAqIG8sIDMgKiBzKSwgdmEociwgMyAqIG8gKyAxLCAzICogcyArIDEpLCB2YShyLCAzICogbyArIDIsIDMgKiBzICsgMik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcyAtIG4gPCBpIC0gcyA/ICh0KGUsIHIsIG4sIHMpLCBuID0gcyArIDEpIDogKHQoZSwgciwgcyArIDEsIGkpLCBpID0gcyk7XG4gICAgICAgIH1cbiAgICAgIH0ociwgbiwgMCwgci5sZW5ndGggLSAxKSwgZSAmJiBlLnB1c2goci5idWZmZXIsIG4uYnVmZmVyKSwge1xuICAgICAgICBpZHM6IHIsXG4gICAgICAgIHBvc2l0aW9uczogblxuICAgICAgfTtcbiAgICB9LCB5YS5kZXNlcmlhbGl6ZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2YXIgZSA9IG5ldyB5YSgpO1xuICAgICAgcmV0dXJuIGUuaWRzID0gdC5pZHMsIGUucG9zaXRpb25zID0gdC5wb3NpdGlvbnMsIGUuaW5kZXhlZCA9ICEwLCBlO1xuICAgIH07XG4gICAgdmFyIGRhID0gTWF0aC5wb3coMiwgNTMpIC0gMTtcblxuICAgIGZ1bmN0aW9uIG1hKHQpIHtcbiAgICAgIHZhciBlID0gK3Q7XG4gICAgICByZXR1cm4gIWlzTmFOKGUpICYmIGUgPD0gZGEgPyBlIDogaGEoU3RyaW5nKHQpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YSh0LCBlLCByKSB7XG4gICAgICB2YXIgbiA9IHRbZV07XG4gICAgICB0W2VdID0gdFtyXSwgdFtyXSA9IG47XG4gICAgfVxuXG4gICAgT24oXCJGZWF0dXJlUG9zaXRpb25NYXBcIiwgeWEpO1xuXG4gICAgdmFyIGdhID0gZnVuY3Rpb24gZ2EodCwgZSkge1xuICAgICAgdGhpcy5nbCA9IHQuZ2wsIHRoaXMubG9jYXRpb24gPSBlO1xuICAgIH0sXG4gICAgICAgIHhhID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoZSwgcikge1xuICAgICAgICB0LmNhbGwodGhpcywgZSwgciksIHRoaXMuY3VycmVudCA9IDA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHRoaXMuY3VycmVudCAhPT0gdCAmJiAodGhpcy5jdXJyZW50ID0gdCwgdGhpcy5nbC51bmlmb3JtMWkodGhpcy5sb2NhdGlvbiwgdCkpO1xuICAgICAgfSwgZTtcbiAgICB9KGdhKSxcbiAgICAgICAgYmEgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZShlLCByKSB7XG4gICAgICAgIHQuY2FsbCh0aGlzLCBlLCByKSwgdGhpcy5jdXJyZW50ID0gMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50ICE9PSB0ICYmICh0aGlzLmN1cnJlbnQgPSB0LCB0aGlzLmdsLnVuaWZvcm0xZih0aGlzLmxvY2F0aW9uLCB0KSk7XG4gICAgICB9LCBlO1xuICAgIH0oZ2EpLFxuICAgICAgICB3YSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKGUsIHIpIHtcbiAgICAgICAgdC5jYWxsKHRoaXMsIGUsIHIpLCB0aGlzLmN1cnJlbnQgPSBbMCwgMF07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHRbMF0gPT09IHRoaXMuY3VycmVudFswXSAmJiB0WzFdID09PSB0aGlzLmN1cnJlbnRbMV0gfHwgKHRoaXMuY3VycmVudCA9IHQsIHRoaXMuZ2wudW5pZm9ybTJmKHRoaXMubG9jYXRpb24sIHRbMF0sIHRbMV0pKTtcbiAgICAgIH0sIGU7XG4gICAgfShnYSksXG4gICAgICAgIF9hID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoZSwgcikge1xuICAgICAgICB0LmNhbGwodGhpcywgZSwgciksIHRoaXMuY3VycmVudCA9IFswLCAwLCAwXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdFswXSA9PT0gdGhpcy5jdXJyZW50WzBdICYmIHRbMV0gPT09IHRoaXMuY3VycmVudFsxXSAmJiB0WzJdID09PSB0aGlzLmN1cnJlbnRbMl0gfHwgKHRoaXMuY3VycmVudCA9IHQsIHRoaXMuZ2wudW5pZm9ybTNmKHRoaXMubG9jYXRpb24sIHRbMF0sIHRbMV0sIHRbMl0pKTtcbiAgICAgIH0sIGU7XG4gICAgfShnYSksXG4gICAgICAgIEFhID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoZSwgcikge1xuICAgICAgICB0LmNhbGwodGhpcywgZSwgciksIHRoaXMuY3VycmVudCA9IFswLCAwLCAwLCAwXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdFswXSA9PT0gdGhpcy5jdXJyZW50WzBdICYmIHRbMV0gPT09IHRoaXMuY3VycmVudFsxXSAmJiB0WzJdID09PSB0aGlzLmN1cnJlbnRbMl0gJiYgdFszXSA9PT0gdGhpcy5jdXJyZW50WzNdIHx8ICh0aGlzLmN1cnJlbnQgPSB0LCB0aGlzLmdsLnVuaWZvcm00Zih0aGlzLmxvY2F0aW9uLCB0WzBdLCB0WzFdLCB0WzJdLCB0WzNdKSk7XG4gICAgICB9LCBlO1xuICAgIH0oZ2EpLFxuICAgICAgICBTYSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKGUsIHIpIHtcbiAgICAgICAgdC5jYWxsKHRoaXMsIGUsIHIpLCB0aGlzLmN1cnJlbnQgPSB0ZS50cmFuc3BhcmVudDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdC5yID09PSB0aGlzLmN1cnJlbnQuciAmJiB0LmcgPT09IHRoaXMuY3VycmVudC5nICYmIHQuYiA9PT0gdGhpcy5jdXJyZW50LmIgJiYgdC5hID09PSB0aGlzLmN1cnJlbnQuYSB8fCAodGhpcy5jdXJyZW50ID0gdCwgdGhpcy5nbC51bmlmb3JtNGYodGhpcy5sb2NhdGlvbiwgdC5yLCB0LmcsIHQuYiwgdC5hKSk7XG4gICAgICB9LCBlO1xuICAgIH0oZ2EpLFxuICAgICAgICBrYSA9IG5ldyBGbG9hdDMyQXJyYXkoMTYpLFxuICAgICAgICBJYSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKGUsIHIpIHtcbiAgICAgICAgdC5jYWxsKHRoaXMsIGUsIHIpLCB0aGlzLmN1cnJlbnQgPSBrYTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgaWYgKHRbMTJdICE9PSB0aGlzLmN1cnJlbnRbMTJdIHx8IHRbMF0gIT09IHRoaXMuY3VycmVudFswXSkgcmV0dXJuIHRoaXMuY3VycmVudCA9IHQsIHZvaWQgdGhpcy5nbC51bmlmb3JtTWF0cml4NGZ2KHRoaXMubG9jYXRpb24sICExLCB0KTtcblxuICAgICAgICBmb3IgKHZhciBlID0gMTsgZSA8IDE2OyBlKyspIHtcbiAgICAgICAgICBpZiAodFtlXSAhPT0gdGhpcy5jdXJyZW50W2VdKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB0LCB0aGlzLmdsLnVuaWZvcm1NYXRyaXg0ZnYodGhpcy5sb2NhdGlvbiwgITEsIHQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCBlO1xuICAgIH0oZ2EpO1xuXG4gICAgZnVuY3Rpb24gemEodCkge1xuICAgICAgcmV0dXJuIFt1YSgyNTUgKiB0LnIsIDI1NSAqIHQuZyksIHVhKDI1NSAqIHQuYiwgMjU1ICogdC5hKV07XG4gICAgfVxuXG4gICAgdmFyIENhID0gZnVuY3Rpb24gQ2EodCwgZSwgcikge1xuICAgICAgdGhpcy52YWx1ZSA9IHQsIHRoaXMudW5pZm9ybU5hbWVzID0gZS5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIFwidV9cIiArIHQ7XG4gICAgICB9KSwgdGhpcy50eXBlID0gcjtcbiAgICB9O1xuXG4gICAgQ2EucHJvdG90eXBlLnNldFVuaWZvcm0gPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgdC5zZXQoci5jb25zdGFudE9yKHRoaXMudmFsdWUpKTtcbiAgICB9LCBDYS5wcm90b3R5cGUuZ2V0QmluZGluZyA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICByZXR1cm4gXCJjb2xvclwiID09PSB0aGlzLnR5cGUgPyBuZXcgU2EodCwgZSkgOiBuZXcgYmEodCwgZSk7XG4gICAgfTtcblxuICAgIHZhciBFYSA9IGZ1bmN0aW9uIEVhKHQsIGUpIHtcbiAgICAgIHRoaXMudW5pZm9ybU5hbWVzID0gZS5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIFwidV9cIiArIHQ7XG4gICAgICB9KSwgdGhpcy5wYXR0ZXJuRnJvbSA9IG51bGwsIHRoaXMucGF0dGVyblRvID0gbnVsbCwgdGhpcy5waXhlbFJhdGlvRnJvbSA9IDEsIHRoaXMucGl4ZWxSYXRpb1RvID0gMTtcbiAgICB9O1xuXG4gICAgRWEucHJvdG90eXBlLnNldENvbnN0YW50UGF0dGVyblBvc2l0aW9ucyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB0aGlzLnBpeGVsUmF0aW9Gcm9tID0gZS5waXhlbFJhdGlvLCB0aGlzLnBpeGVsUmF0aW9UbyA9IHQucGl4ZWxSYXRpbywgdGhpcy5wYXR0ZXJuRnJvbSA9IGUudGxiciwgdGhpcy5wYXR0ZXJuVG8gPSB0LnRsYnI7XG4gICAgfSwgRWEucHJvdG90eXBlLnNldFVuaWZvcm0gPSBmdW5jdGlvbiAodCwgZSwgciwgbikge1xuICAgICAgdmFyIGkgPSBcInVfcGF0dGVybl90b1wiID09PSBuID8gdGhpcy5wYXR0ZXJuVG8gOiBcInVfcGF0dGVybl9mcm9tXCIgPT09IG4gPyB0aGlzLnBhdHRlcm5Gcm9tIDogXCJ1X3BpeGVsX3JhdGlvX3RvXCIgPT09IG4gPyB0aGlzLnBpeGVsUmF0aW9UbyA6IFwidV9waXhlbF9yYXRpb19mcm9tXCIgPT09IG4gPyB0aGlzLnBpeGVsUmF0aW9Gcm9tIDogbnVsbDtcbiAgICAgIGkgJiYgdC5zZXQoaSk7XG4gICAgfSwgRWEucHJvdG90eXBlLmdldEJpbmRpbmcgPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgcmV0dXJuIFwidV9wYXR0ZXJuXCIgPT09IHIuc3Vic3RyKDAsIDkpID8gbmV3IEFhKHQsIGUpIDogbmV3IGJhKHQsIGUpO1xuICAgIH07XG5cbiAgICB2YXIgUGEgPSBmdW5jdGlvbiBQYSh0LCBlLCByLCBuKSB7XG4gICAgICB0aGlzLmV4cHJlc3Npb24gPSB0LCB0aGlzLnR5cGUgPSByLCB0aGlzLm1heFZhbHVlID0gMCwgdGhpcy5wYWludFZlcnRleEF0dHJpYnV0ZXMgPSBlLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWU6IFwiYV9cIiArIHQsXG4gICAgICAgICAgdHlwZTogXCJGbG9hdDMyXCIsXG4gICAgICAgICAgY29tcG9uZW50czogXCJjb2xvclwiID09PSByID8gMiA6IDEsXG4gICAgICAgICAgb2Zmc2V0OiAwXG4gICAgICAgIH07XG4gICAgICB9KSwgdGhpcy5wYWludFZlcnRleEFycmF5ID0gbmV3IG4oKTtcbiAgICB9O1xuXG4gICAgUGEucHJvdG90eXBlLnBvcHVsYXRlUGFpbnRBcnJheSA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpKSB7XG4gICAgICB2YXIgYSA9IHRoaXMucGFpbnRWZXJ0ZXhBcnJheS5sZW5ndGgsXG4gICAgICAgICAgbyA9IHRoaXMuZXhwcmVzc2lvbi5ldmFsdWF0ZShuZXcgc2koMCksIGUsIHt9LCBuLCBbXSwgaSk7XG4gICAgICB0aGlzLnBhaW50VmVydGV4QXJyYXkucmVzaXplKHQpLCB0aGlzLl9zZXRQYWludFZhbHVlKGEsIHQsIG8pO1xuICAgIH0sIFBhLnByb3RvdHlwZS51cGRhdGVQYWludEFycmF5ID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4pIHtcbiAgICAgIHZhciBpID0gdGhpcy5leHByZXNzaW9uLmV2YWx1YXRlKHtcbiAgICAgICAgem9vbTogMFxuICAgICAgfSwgciwgbik7XG5cbiAgICAgIHRoaXMuX3NldFBhaW50VmFsdWUodCwgZSwgaSk7XG4gICAgfSwgUGEucHJvdG90eXBlLl9zZXRQYWludFZhbHVlID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgIGlmIChcImNvbG9yXCIgPT09IHRoaXMudHlwZSkgZm9yICh2YXIgbiA9IHphKHIpLCBpID0gdDsgaSA8IGU7IGkrKykge1xuICAgICAgICB0aGlzLnBhaW50VmVydGV4QXJyYXkuZW1wbGFjZShpLCBuWzBdLCBuWzFdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAodmFyIGEgPSB0OyBhIDwgZTsgYSsrKSB7XG4gICAgICAgICAgdGhpcy5wYWludFZlcnRleEFycmF5LmVtcGxhY2UoYSwgcik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1heFZhbHVlID0gTWF0aC5tYXgodGhpcy5tYXhWYWx1ZSwgTWF0aC5hYnMocikpO1xuICAgICAgfVxuICAgIH0sIFBhLnByb3RvdHlwZS51cGxvYWQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdGhpcy5wYWludFZlcnRleEFycmF5ICYmIHRoaXMucGFpbnRWZXJ0ZXhBcnJheS5hcnJheUJ1ZmZlciAmJiAodGhpcy5wYWludFZlcnRleEJ1ZmZlciAmJiB0aGlzLnBhaW50VmVydGV4QnVmZmVyLmJ1ZmZlciA/IHRoaXMucGFpbnRWZXJ0ZXhCdWZmZXIudXBkYXRlRGF0YSh0aGlzLnBhaW50VmVydGV4QXJyYXkpIDogdGhpcy5wYWludFZlcnRleEJ1ZmZlciA9IHQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMucGFpbnRWZXJ0ZXhBcnJheSwgdGhpcy5wYWludFZlcnRleEF0dHJpYnV0ZXMsIHRoaXMuZXhwcmVzc2lvbi5pc1N0YXRlRGVwZW5kZW50KSk7XG4gICAgfSwgUGEucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLnBhaW50VmVydGV4QnVmZmVyICYmIHRoaXMucGFpbnRWZXJ0ZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgIH07XG5cbiAgICB2YXIgTWEgPSBmdW5jdGlvbiBNYSh0LCBlLCByLCBuLCBpLCBhKSB7XG4gICAgICB0aGlzLmV4cHJlc3Npb24gPSB0LCB0aGlzLnVuaWZvcm1OYW1lcyA9IGUubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiBcInVfXCIgKyB0ICsgXCJfdFwiO1xuICAgICAgfSksIHRoaXMudHlwZSA9IHIsIHRoaXMudXNlSW50ZWdlclpvb20gPSBuLCB0aGlzLnpvb20gPSBpLCB0aGlzLm1heFZhbHVlID0gMCwgdGhpcy5wYWludFZlcnRleEF0dHJpYnV0ZXMgPSBlLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWU6IFwiYV9cIiArIHQsXG4gICAgICAgICAgdHlwZTogXCJGbG9hdDMyXCIsXG4gICAgICAgICAgY29tcG9uZW50czogXCJjb2xvclwiID09PSByID8gNCA6IDIsXG4gICAgICAgICAgb2Zmc2V0OiAwXG4gICAgICAgIH07XG4gICAgICB9KSwgdGhpcy5wYWludFZlcnRleEFycmF5ID0gbmV3IGEoKTtcbiAgICB9O1xuXG4gICAgTWEucHJvdG90eXBlLnBvcHVsYXRlUGFpbnRBcnJheSA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpKSB7XG4gICAgICB2YXIgYSA9IHRoaXMuZXhwcmVzc2lvbi5ldmFsdWF0ZShuZXcgc2kodGhpcy56b29tKSwgZSwge30sIG4sIFtdLCBpKSxcbiAgICAgICAgICBvID0gdGhpcy5leHByZXNzaW9uLmV2YWx1YXRlKG5ldyBzaSh0aGlzLnpvb20gKyAxKSwgZSwge30sIG4sIFtdLCBpKSxcbiAgICAgICAgICBzID0gdGhpcy5wYWludFZlcnRleEFycmF5Lmxlbmd0aDtcbiAgICAgIHRoaXMucGFpbnRWZXJ0ZXhBcnJheS5yZXNpemUodCksIHRoaXMuX3NldFBhaW50VmFsdWUocywgdCwgYSwgbyk7XG4gICAgfSwgTWEucHJvdG90eXBlLnVwZGF0ZVBhaW50QXJyYXkgPSBmdW5jdGlvbiAodCwgZSwgciwgbikge1xuICAgICAgdmFyIGkgPSB0aGlzLmV4cHJlc3Npb24uZXZhbHVhdGUoe1xuICAgICAgICB6b29tOiB0aGlzLnpvb21cbiAgICAgIH0sIHIsIG4pLFxuICAgICAgICAgIGEgPSB0aGlzLmV4cHJlc3Npb24uZXZhbHVhdGUoe1xuICAgICAgICB6b29tOiB0aGlzLnpvb20gKyAxXG4gICAgICB9LCByLCBuKTtcblxuICAgICAgdGhpcy5fc2V0UGFpbnRWYWx1ZSh0LCBlLCBpLCBhKTtcbiAgICB9LCBNYS5wcm90b3R5cGUuX3NldFBhaW50VmFsdWUgPSBmdW5jdGlvbiAodCwgZSwgciwgbikge1xuICAgICAgaWYgKFwiY29sb3JcIiA9PT0gdGhpcy50eXBlKSBmb3IgKHZhciBpID0gemEociksIGEgPSB6YShuKSwgbyA9IHQ7IG8gPCBlOyBvKyspIHtcbiAgICAgICAgdGhpcy5wYWludFZlcnRleEFycmF5LmVtcGxhY2UobywgaVswXSwgaVsxXSwgYVswXSwgYVsxXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKHZhciBzID0gdDsgcyA8IGU7IHMrKykge1xuICAgICAgICAgIHRoaXMucGFpbnRWZXJ0ZXhBcnJheS5lbXBsYWNlKHMsIHIsIG4pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tYXhWYWx1ZSA9IE1hdGgubWF4KHRoaXMubWF4VmFsdWUsIE1hdGguYWJzKHIpLCBNYXRoLmFicyhuKSk7XG4gICAgICB9XG4gICAgfSwgTWEucHJvdG90eXBlLnVwbG9hZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0aGlzLnBhaW50VmVydGV4QXJyYXkgJiYgdGhpcy5wYWludFZlcnRleEFycmF5LmFycmF5QnVmZmVyICYmICh0aGlzLnBhaW50VmVydGV4QnVmZmVyICYmIHRoaXMucGFpbnRWZXJ0ZXhCdWZmZXIuYnVmZmVyID8gdGhpcy5wYWludFZlcnRleEJ1ZmZlci51cGRhdGVEYXRhKHRoaXMucGFpbnRWZXJ0ZXhBcnJheSkgOiB0aGlzLnBhaW50VmVydGV4QnVmZmVyID0gdC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5wYWludFZlcnRleEFycmF5LCB0aGlzLnBhaW50VmVydGV4QXR0cmlidXRlcywgdGhpcy5leHByZXNzaW9uLmlzU3RhdGVEZXBlbmRlbnQpKTtcbiAgICB9LCBNYS5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMucGFpbnRWZXJ0ZXhCdWZmZXIgJiYgdGhpcy5wYWludFZlcnRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgfSwgTWEucHJvdG90eXBlLnNldFVuaWZvcm0gPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgdmFyIHIgPSB0aGlzLnVzZUludGVnZXJab29tID8gTWF0aC5mbG9vcihlLnpvb20pIDogZS56b29tLFxuICAgICAgICAgIG4gPSBwKHRoaXMuZXhwcmVzc2lvbi5pbnRlcnBvbGF0aW9uRmFjdG9yKHIsIHRoaXMuem9vbSwgdGhpcy56b29tICsgMSksIDAsIDEpO1xuICAgICAgdC5zZXQobik7XG4gICAgfSwgTWEucHJvdG90eXBlLmdldEJpbmRpbmcgPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgcmV0dXJuIG5ldyBiYSh0LCBlKTtcbiAgICB9O1xuXG4gICAgdmFyIEJhID0gZnVuY3Rpb24gQmEodCwgZSwgciwgbiwgaSwgYSkge1xuICAgICAgdGhpcy5leHByZXNzaW9uID0gdCwgdGhpcy50eXBlID0gZSwgdGhpcy51c2VJbnRlZ2VyWm9vbSA9IHIsIHRoaXMuem9vbSA9IG4sIHRoaXMubGF5ZXJJZCA9IGEsIHRoaXMuem9vbUluUGFpbnRWZXJ0ZXhBcnJheSA9IG5ldyBpKCksIHRoaXMuem9vbU91dFBhaW50VmVydGV4QXJyYXkgPSBuZXcgaSgpO1xuICAgIH07XG5cbiAgICBCYS5wcm90b3R5cGUucG9wdWxhdGVQYWludEFycmF5ID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgIHZhciBuID0gdGhpcy56b29tSW5QYWludFZlcnRleEFycmF5Lmxlbmd0aDtcbiAgICAgIHRoaXMuem9vbUluUGFpbnRWZXJ0ZXhBcnJheS5yZXNpemUodCksIHRoaXMuem9vbU91dFBhaW50VmVydGV4QXJyYXkucmVzaXplKHQpLCB0aGlzLl9zZXRQYWludFZhbHVlcyhuLCB0LCBlLnBhdHRlcm5zICYmIGUucGF0dGVybnNbdGhpcy5sYXllcklkXSwgcik7XG4gICAgfSwgQmEucHJvdG90eXBlLnVwZGF0ZVBhaW50QXJyYXkgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSkge1xuICAgICAgdGhpcy5fc2V0UGFpbnRWYWx1ZXModCwgZSwgci5wYXR0ZXJucyAmJiByLnBhdHRlcm5zW3RoaXMubGF5ZXJJZF0sIGkpO1xuICAgIH0sIEJhLnByb3RvdHlwZS5fc2V0UGFpbnRWYWx1ZXMgPSBmdW5jdGlvbiAodCwgZSwgciwgbikge1xuICAgICAgaWYgKG4gJiYgcikge1xuICAgICAgICB2YXIgaSA9IG5bci5taW5dLFxuICAgICAgICAgICAgYSA9IG5bci5taWRdLFxuICAgICAgICAgICAgbyA9IG5bci5tYXhdO1xuICAgICAgICBpZiAoaSAmJiBhICYmIG8pIGZvciAodmFyIHMgPSB0OyBzIDwgZTsgcysrKSB7XG4gICAgICAgICAgdGhpcy56b29tSW5QYWludFZlcnRleEFycmF5LmVtcGxhY2UocywgYS50bFswXSwgYS50bFsxXSwgYS5iclswXSwgYS5iclsxXSwgaS50bFswXSwgaS50bFsxXSwgaS5iclswXSwgaS5iclsxXSwgYS5waXhlbFJhdGlvLCBpLnBpeGVsUmF0aW8pLCB0aGlzLnpvb21PdXRQYWludFZlcnRleEFycmF5LmVtcGxhY2UocywgYS50bFswXSwgYS50bFsxXSwgYS5iclswXSwgYS5iclsxXSwgby50bFswXSwgby50bFsxXSwgby5iclswXSwgby5iclsxXSwgYS5waXhlbFJhdGlvLCBvLnBpeGVsUmF0aW8pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgQmEucHJvdG90eXBlLnVwbG9hZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0aGlzLnpvb21JblBhaW50VmVydGV4QXJyYXkgJiYgdGhpcy56b29tSW5QYWludFZlcnRleEFycmF5LmFycmF5QnVmZmVyICYmIHRoaXMuem9vbU91dFBhaW50VmVydGV4QXJyYXkgJiYgdGhpcy56b29tT3V0UGFpbnRWZXJ0ZXhBcnJheS5hcnJheUJ1ZmZlciAmJiAodGhpcy56b29tSW5QYWludFZlcnRleEJ1ZmZlciA9IHQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMuem9vbUluUGFpbnRWZXJ0ZXhBcnJheSwgbGEubWVtYmVycywgdGhpcy5leHByZXNzaW9uLmlzU3RhdGVEZXBlbmRlbnQpLCB0aGlzLnpvb21PdXRQYWludFZlcnRleEJ1ZmZlciA9IHQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMuem9vbU91dFBhaW50VmVydGV4QXJyYXksIGxhLm1lbWJlcnMsIHRoaXMuZXhwcmVzc2lvbi5pc1N0YXRlRGVwZW5kZW50KSk7XG4gICAgfSwgQmEucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLnpvb21PdXRQYWludFZlcnRleEJ1ZmZlciAmJiB0aGlzLnpvb21PdXRQYWludFZlcnRleEJ1ZmZlci5kZXN0cm95KCksIHRoaXMuem9vbUluUGFpbnRWZXJ0ZXhCdWZmZXIgJiYgdGhpcy56b29tSW5QYWludFZlcnRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgfTtcblxuICAgIHZhciBUYSA9IGZ1bmN0aW9uIFRhKHQsIGUsIHIpIHtcbiAgICAgIHRoaXMuYmluZGVycyA9IHt9LCB0aGlzLl9idWZmZXJzID0gW107XG4gICAgICB2YXIgbiA9IFtdO1xuXG4gICAgICBmb3IgKHZhciBpIGluIHQucGFpbnQuX3ZhbHVlcykge1xuICAgICAgICBpZiAocihpKSkge1xuICAgICAgICAgIHZhciBhID0gdC5wYWludC5nZXQoaSk7XG5cbiAgICAgICAgICBpZiAoYSBpbnN0YW5jZW9mIHlpICYmIFRyKGEucHJvcGVydHkuc3BlY2lmaWNhdGlvbikpIHtcbiAgICAgICAgICAgIHZhciBvID0gRmEoaSwgdC50eXBlKSxcbiAgICAgICAgICAgICAgICBzID0gYS52YWx1ZSxcbiAgICAgICAgICAgICAgICB1ID0gYS5wcm9wZXJ0eS5zcGVjaWZpY2F0aW9uLnR5cGUsXG4gICAgICAgICAgICAgICAgbCA9IGEucHJvcGVydHkudXNlSW50ZWdlclpvb20sXG4gICAgICAgICAgICAgICAgcCA9IGEucHJvcGVydHkuc3BlY2lmaWNhdGlvbltcInByb3BlcnR5LXR5cGVcIl0sXG4gICAgICAgICAgICAgICAgYyA9IFwiY3Jvc3MtZmFkZWRcIiA9PT0gcCB8fCBcImNyb3NzLWZhZGVkLWRhdGEtZHJpdmVuXCIgPT09IHA7XG4gICAgICAgICAgICBpZiAoXCJjb25zdGFudFwiID09PSBzLmtpbmQpIHRoaXMuYmluZGVyc1tpXSA9IGMgPyBuZXcgRWEocy52YWx1ZSwgbykgOiBuZXcgQ2Eocy52YWx1ZSwgbywgdSksIG4ucHVzaChcIi91X1wiICsgaSk7ZWxzZSBpZiAoXCJzb3VyY2VcIiA9PT0gcy5raW5kIHx8IGMpIHtcbiAgICAgICAgICAgICAgdmFyIGggPSBEYShpLCB1LCBcInNvdXJjZVwiKTtcbiAgICAgICAgICAgICAgdGhpcy5iaW5kZXJzW2ldID0gYyA/IG5ldyBCYShzLCB1LCBsLCBlLCBoLCB0LmlkKSA6IG5ldyBQYShzLCBvLCB1LCBoKSwgbi5wdXNoKFwiL2FfXCIgKyBpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhciBmID0gRGEoaSwgdSwgXCJjb21wb3NpdGVcIik7XG4gICAgICAgICAgICAgIHRoaXMuYmluZGVyc1tpXSA9IG5ldyBNYShzLCBvLCB1LCBsLCBlLCBmKSwgbi5wdXNoKFwiL3pfXCIgKyBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5jYWNoZUtleSA9IG4uc29ydCgpLmpvaW4oXCJcIik7XG4gICAgfTtcblxuICAgIFRhLnByb3RvdHlwZS5nZXRNYXhWYWx1ZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2YXIgZSA9IHRoaXMuYmluZGVyc1t0XTtcbiAgICAgIHJldHVybiBlIGluc3RhbmNlb2YgUGEgfHwgZSBpbnN0YW5jZW9mIE1hID8gZS5tYXhWYWx1ZSA6IDA7XG4gICAgfSwgVGEucHJvdG90eXBlLnBvcHVsYXRlUGFpbnRBcnJheXMgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSkge1xuICAgICAgZm9yICh2YXIgYSBpbiB0aGlzLmJpbmRlcnMpIHtcbiAgICAgICAgdmFyIG8gPSB0aGlzLmJpbmRlcnNbYV07XG4gICAgICAgIChvIGluc3RhbmNlb2YgUGEgfHwgbyBpbnN0YW5jZW9mIE1hIHx8IG8gaW5zdGFuY2VvZiBCYSkgJiYgby5wb3B1bGF0ZVBhaW50QXJyYXkodCwgZSwgciwgbiwgaSk7XG4gICAgICB9XG4gICAgfSwgVGEucHJvdG90eXBlLnNldENvbnN0YW50UGF0dGVyblBvc2l0aW9ucyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICBmb3IgKHZhciByIGluIHRoaXMuYmluZGVycykge1xuICAgICAgICB2YXIgbiA9IHRoaXMuYmluZGVyc1tyXTtcbiAgICAgICAgbiBpbnN0YW5jZW9mIEVhICYmIG4uc2V0Q29uc3RhbnRQYXR0ZXJuUG9zaXRpb25zKHQsIGUpO1xuICAgICAgfVxuICAgIH0sIFRhLnByb3RvdHlwZS51cGRhdGVQYWludEFycmF5cyA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpKSB7XG4gICAgICB2YXIgYSA9ICExO1xuXG4gICAgICBmb3IgKHZhciBvIGluIHQpIHtcbiAgICAgICAgZm9yICh2YXIgcyA9IDAsIHUgPSBlLmdldFBvc2l0aW9ucyhvKTsgcyA8IHUubGVuZ3RoOyBzICs9IDEpIHtcbiAgICAgICAgICB2YXIgbCA9IHVbc10sXG4gICAgICAgICAgICAgIHAgPSByLmZlYXR1cmUobC5pbmRleCk7XG5cbiAgICAgICAgICBmb3IgKHZhciBjIGluIHRoaXMuYmluZGVycykge1xuICAgICAgICAgICAgdmFyIGggPSB0aGlzLmJpbmRlcnNbY107XG5cbiAgICAgICAgICAgIGlmICgoaCBpbnN0YW5jZW9mIFBhIHx8IGggaW5zdGFuY2VvZiBNYSB8fCBoIGluc3RhbmNlb2YgQmEpICYmICEwID09PSBoLmV4cHJlc3Npb24uaXNTdGF0ZURlcGVuZGVudCkge1xuICAgICAgICAgICAgICB2YXIgZiA9IG4ucGFpbnQuZ2V0KGMpO1xuICAgICAgICAgICAgICBoLmV4cHJlc3Npb24gPSBmLnZhbHVlLCBoLnVwZGF0ZVBhaW50QXJyYXkobC5zdGFydCwgbC5lbmQsIHAsIHRbb10sIGkpLCBhID0gITA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhO1xuICAgIH0sIFRhLnByb3RvdHlwZS5kZWZpbmVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHQgPSBbXTtcblxuICAgICAgZm9yICh2YXIgZSBpbiB0aGlzLmJpbmRlcnMpIHtcbiAgICAgICAgdmFyIHIgPSB0aGlzLmJpbmRlcnNbZV07XG4gICAgICAgIChyIGluc3RhbmNlb2YgQ2EgfHwgciBpbnN0YW5jZW9mIEVhKSAmJiB0LnB1c2guYXBwbHkodCwgci51bmlmb3JtTmFtZXMubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgcmV0dXJuIFwiI2RlZmluZSBIQVNfVU5JRk9STV9cIiArIHQ7XG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQ7XG4gICAgfSwgVGEucHJvdG90eXBlLmdldEJpbmRlckF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdCA9IFtdO1xuXG4gICAgICBmb3IgKHZhciBlIGluIHRoaXMuYmluZGVycykge1xuICAgICAgICB2YXIgciA9IHRoaXMuYmluZGVyc1tlXTtcbiAgICAgICAgaWYgKHIgaW5zdGFuY2VvZiBQYSB8fCByIGluc3RhbmNlb2YgTWEpIGZvciAodmFyIG4gPSAwOyBuIDwgci5wYWludFZlcnRleEF0dHJpYnV0ZXMubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LnB1c2goci5wYWludFZlcnRleEF0dHJpYnV0ZXNbbl0ubmFtZSk7XG4gICAgICAgIH0gZWxzZSBpZiAociBpbnN0YW5jZW9mIEJhKSBmb3IgKHZhciBpID0gMDsgaSA8IGxhLm1lbWJlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB0LnB1c2gobGEubWVtYmVyc1tpXS5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdDtcbiAgICB9LCBUYS5wcm90b3R5cGUuZ2V0QmluZGVyVW5pZm9ybXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdCA9IFtdO1xuXG4gICAgICBmb3IgKHZhciBlIGluIHRoaXMuYmluZGVycykge1xuICAgICAgICB2YXIgciA9IHRoaXMuYmluZGVyc1tlXTtcbiAgICAgICAgaWYgKHIgaW5zdGFuY2VvZiBDYSB8fCByIGluc3RhbmNlb2YgRWEgfHwgciBpbnN0YW5jZW9mIE1hKSBmb3IgKHZhciBuID0gMCwgaSA9IHIudW5pZm9ybU5hbWVzOyBuIDwgaS5sZW5ndGg7IG4gKz0gMSkge1xuICAgICAgICAgIHQucHVzaChpW25dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdDtcbiAgICB9LCBUYS5wcm90b3R5cGUuZ2V0UGFpbnRWZXJ0ZXhCdWZmZXJzID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2J1ZmZlcnM7XG4gICAgfSwgVGEucHJvdG90eXBlLmdldFVuaWZvcm1zID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHZhciByID0gW107XG5cbiAgICAgIGZvciAodmFyIG4gaW4gdGhpcy5iaW5kZXJzKSB7XG4gICAgICAgIHZhciBpID0gdGhpcy5iaW5kZXJzW25dO1xuICAgICAgICBpZiAoaSBpbnN0YW5jZW9mIENhIHx8IGkgaW5zdGFuY2VvZiBFYSB8fCBpIGluc3RhbmNlb2YgTWEpIGZvciAodmFyIGEgPSAwLCBvID0gaS51bmlmb3JtTmFtZXM7IGEgPCBvLmxlbmd0aDsgYSArPSAxKSB7XG4gICAgICAgICAgdmFyIHMgPSBvW2FdO1xuXG4gICAgICAgICAgaWYgKGVbc10pIHtcbiAgICAgICAgICAgIHZhciB1ID0gaS5nZXRCaW5kaW5nKHQsIGVbc10sIHMpO1xuICAgICAgICAgICAgci5wdXNoKHtcbiAgICAgICAgICAgICAgbmFtZTogcyxcbiAgICAgICAgICAgICAgcHJvcGVydHk6IG4sXG4gICAgICAgICAgICAgIGJpbmRpbmc6IHVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9LCBUYS5wcm90b3R5cGUuc2V0VW5pZm9ybXMgPSBmdW5jdGlvbiAodCwgZSwgciwgbikge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGEgPSBlOyBpIDwgYS5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB2YXIgbyA9IGFbaV0sXG4gICAgICAgICAgICBzID0gby5uYW1lLFxuICAgICAgICAgICAgdSA9IG8ucHJvcGVydHk7XG4gICAgICAgIHRoaXMuYmluZGVyc1t1XS5zZXRVbmlmb3JtKG8uYmluZGluZywgbiwgci5nZXQodSksIHMpO1xuICAgICAgfVxuICAgIH0sIFRhLnByb3RvdHlwZS51cGRhdGVQYWludEJ1ZmZlcnMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZm9yICh2YXIgZSBpbiB0aGlzLl9idWZmZXJzID0gW10sIHRoaXMuYmluZGVycykge1xuICAgICAgICB2YXIgciA9IHRoaXMuYmluZGVyc1tlXTtcblxuICAgICAgICBpZiAodCAmJiByIGluc3RhbmNlb2YgQmEpIHtcbiAgICAgICAgICB2YXIgbiA9IDIgPT09IHQuZnJvbVNjYWxlID8gci56b29tSW5QYWludFZlcnRleEJ1ZmZlciA6IHIuem9vbU91dFBhaW50VmVydGV4QnVmZmVyO1xuICAgICAgICAgIG4gJiYgdGhpcy5fYnVmZmVycy5wdXNoKG4pO1xuICAgICAgICB9IGVsc2UgKHIgaW5zdGFuY2VvZiBQYSB8fCByIGluc3RhbmNlb2YgTWEpICYmIHIucGFpbnRWZXJ0ZXhCdWZmZXIgJiYgdGhpcy5fYnVmZmVycy5wdXNoKHIucGFpbnRWZXJ0ZXhCdWZmZXIpO1xuICAgICAgfVxuICAgIH0sIFRhLnByb3RvdHlwZS51cGxvYWQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZm9yICh2YXIgZSBpbiB0aGlzLmJpbmRlcnMpIHtcbiAgICAgICAgdmFyIHIgPSB0aGlzLmJpbmRlcnNbZV07XG4gICAgICAgIChyIGluc3RhbmNlb2YgUGEgfHwgciBpbnN0YW5jZW9mIE1hIHx8IHIgaW5zdGFuY2VvZiBCYSkgJiYgci51cGxvYWQodCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudXBkYXRlUGFpbnRCdWZmZXJzKCk7XG4gICAgfSwgVGEucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKHZhciB0IGluIHRoaXMuYmluZGVycykge1xuICAgICAgICB2YXIgZSA9IHRoaXMuYmluZGVyc1t0XTtcbiAgICAgICAgKGUgaW5zdGFuY2VvZiBQYSB8fCBlIGluc3RhbmNlb2YgTWEgfHwgZSBpbnN0YW5jZW9mIEJhKSAmJiBlLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIFZhID0gZnVuY3Rpb24gVmEodCwgZSwgcikge1xuICAgICAgdm9pZCAwID09PSByICYmIChyID0gZnVuY3Rpb24gcigpIHtcbiAgICAgICAgcmV0dXJuICEwO1xuICAgICAgfSksIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zID0ge307XG5cbiAgICAgIGZvciAodmFyIG4gPSAwLCBpID0gdDsgbiA8IGkubGVuZ3RoOyBuICs9IDEpIHtcbiAgICAgICAgdmFyIGEgPSBpW25dO1xuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9uc1thLmlkXSA9IG5ldyBUYShhLCBlLCByKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5uZWVkc1VwbG9hZCA9ICExLCB0aGlzLl9mZWF0dXJlTWFwID0gbmV3IHlhKCksIHRoaXMuX2J1ZmZlck9mZnNldCA9IDA7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIEZhKHQsIGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIFwidGV4dC1vcGFjaXR5XCI6IFtcIm9wYWNpdHlcIl0sXG4gICAgICAgIFwiaWNvbi1vcGFjaXR5XCI6IFtcIm9wYWNpdHlcIl0sXG4gICAgICAgIFwidGV4dC1jb2xvclwiOiBbXCJmaWxsX2NvbG9yXCJdLFxuICAgICAgICBcImljb24tY29sb3JcIjogW1wiZmlsbF9jb2xvclwiXSxcbiAgICAgICAgXCJ0ZXh0LWhhbG8tY29sb3JcIjogW1wiaGFsb19jb2xvclwiXSxcbiAgICAgICAgXCJpY29uLWhhbG8tY29sb3JcIjogW1wiaGFsb19jb2xvclwiXSxcbiAgICAgICAgXCJ0ZXh0LWhhbG8tYmx1clwiOiBbXCJoYWxvX2JsdXJcIl0sXG4gICAgICAgIFwiaWNvbi1oYWxvLWJsdXJcIjogW1wiaGFsb19ibHVyXCJdLFxuICAgICAgICBcInRleHQtaGFsby13aWR0aFwiOiBbXCJoYWxvX3dpZHRoXCJdLFxuICAgICAgICBcImljb24taGFsby13aWR0aFwiOiBbXCJoYWxvX3dpZHRoXCJdLFxuICAgICAgICBcImxpbmUtZ2FwLXdpZHRoXCI6IFtcImdhcHdpZHRoXCJdLFxuICAgICAgICBcImxpbmUtcGF0dGVyblwiOiBbXCJwYXR0ZXJuX3RvXCIsIFwicGF0dGVybl9mcm9tXCIsIFwicGl4ZWxfcmF0aW9fdG9cIiwgXCJwaXhlbF9yYXRpb19mcm9tXCJdLFxuICAgICAgICBcImZpbGwtcGF0dGVyblwiOiBbXCJwYXR0ZXJuX3RvXCIsIFwicGF0dGVybl9mcm9tXCIsIFwicGl4ZWxfcmF0aW9fdG9cIiwgXCJwaXhlbF9yYXRpb19mcm9tXCJdLFxuICAgICAgICBcImZpbGwtZXh0cnVzaW9uLXBhdHRlcm5cIjogW1wicGF0dGVybl90b1wiLCBcInBhdHRlcm5fZnJvbVwiLCBcInBpeGVsX3JhdGlvX3RvXCIsIFwicGl4ZWxfcmF0aW9fZnJvbVwiXVxuICAgICAgfVt0XSB8fCBbdC5yZXBsYWNlKGUgKyBcIi1cIiwgXCJcIikucmVwbGFjZSgvLS9nLCBcIl9cIildO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIERhKHQsIGUsIHIpIHtcbiAgICAgIHZhciBuID0ge1xuICAgICAgICBjb2xvcjoge1xuICAgICAgICAgIHNvdXJjZTogQmksXG4gICAgICAgICAgY29tcG9zaXRlOiBIaVxuICAgICAgICB9LFxuICAgICAgICBudW1iZXI6IHtcbiAgICAgICAgICBzb3VyY2U6IEtpLFxuICAgICAgICAgIGNvbXBvc2l0ZTogQmlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICAgICBpID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBcImxpbmUtcGF0dGVyblwiOiB7XG4gICAgICAgICAgICBzb3VyY2U6IFRpLFxuICAgICAgICAgICAgY29tcG9zaXRlOiBUaVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJmaWxsLXBhdHRlcm5cIjoge1xuICAgICAgICAgICAgc291cmNlOiBUaSxcbiAgICAgICAgICAgIGNvbXBvc2l0ZTogVGlcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZmlsbC1leHRydXNpb24tcGF0dGVyblwiOiB7XG4gICAgICAgICAgICBzb3VyY2U6IFRpLFxuICAgICAgICAgICAgY29tcG9zaXRlOiBUaVxuICAgICAgICAgIH1cbiAgICAgICAgfVt0XTtcbiAgICAgIH0odCk7XG5cbiAgICAgIHJldHVybiBpICYmIGlbcl0gfHwgbltlXVtyXTtcbiAgICB9XG5cbiAgICBWYS5wcm90b3R5cGUucG9wdWxhdGVQYWludEFycmF5cyA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpLCBhKSB7XG4gICAgICBmb3IgKHZhciBvIGluIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zKSB7XG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zW29dLnBvcHVsYXRlUGFpbnRBcnJheXModCwgZSwgbiwgaSwgYSk7XG4gICAgICB9XG5cbiAgICAgIHZvaWQgMCAhPT0gZS5pZCAmJiB0aGlzLl9mZWF0dXJlTWFwLmFkZChlLmlkLCByLCB0aGlzLl9idWZmZXJPZmZzZXQsIHQpLCB0aGlzLl9idWZmZXJPZmZzZXQgPSB0LCB0aGlzLm5lZWRzVXBsb2FkID0gITA7XG4gICAgfSwgVmEucHJvdG90eXBlLnVwZGF0ZVBhaW50QXJyYXlzID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4pIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBhID0gcjsgaSA8IGEubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIG8gPSBhW2ldO1xuICAgICAgICB0aGlzLm5lZWRzVXBsb2FkID0gdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnNbby5pZF0udXBkYXRlUGFpbnRBcnJheXModCwgdGhpcy5fZmVhdHVyZU1hcCwgZSwgbywgbikgfHwgdGhpcy5uZWVkc1VwbG9hZDtcbiAgICAgIH1cbiAgICB9LCBWYS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9uc1t0XTtcbiAgICB9LCBWYS5wcm90b3R5cGUudXBsb2FkID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGlmICh0aGlzLm5lZWRzVXBsb2FkKSB7XG4gICAgICAgIGZvciAodmFyIGUgaW4gdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMpIHtcbiAgICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9uc1tlXS51cGxvYWQodCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm5lZWRzVXBsb2FkID0gITE7XG4gICAgICB9XG4gICAgfSwgVmEucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKHZhciB0IGluIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zKSB7XG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zW3RdLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9LCBPbihcIkNvbnN0YW50QmluZGVyXCIsIENhKSwgT24oXCJDcm9zc0ZhZGVkQ29uc3RhbnRCaW5kZXJcIiwgRWEpLCBPbihcIlNvdXJjZUV4cHJlc3Npb25CaW5kZXJcIiwgUGEpLCBPbihcIkNyb3NzRmFkZWRDb21wb3NpdGVCaW5kZXJcIiwgQmEpLCBPbihcIkNvbXBvc2l0ZUV4cHJlc3Npb25CaW5kZXJcIiwgTWEpLCBPbihcIlByb2dyYW1Db25maWd1cmF0aW9uXCIsIFRhLCB7XG4gICAgICBvbWl0OiBbXCJfYnVmZmVyc1wiXVxuICAgIH0pLCBPbihcIlByb2dyYW1Db25maWd1cmF0aW9uU2V0XCIsIFZhKTtcbiAgICB2YXIgTGEgPSBNYXRoLnBvdygyLCAxNCkgLSAxLFxuICAgICAgICBPYSA9IC1MYSAtIDE7XG5cbiAgICBmdW5jdGlvbiBSYSh0KSB7XG4gICAgICBmb3IgKHZhciBlID0gODE5MiAvIHQuZXh0ZW50LCByID0gdC5sb2FkR2VvbWV0cnkoKSwgbiA9IDA7IG4gPCByLmxlbmd0aDsgbisrKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSByW25dLCBhID0gMDsgYSA8IGkubGVuZ3RoOyBhKyspIHtcbiAgICAgICAgICB2YXIgbyA9IGlbYV0sXG4gICAgICAgICAgICAgIHMgPSBNYXRoLnJvdW5kKG8ueCAqIGUpLFxuICAgICAgICAgICAgICB1ID0gTWF0aC5yb3VuZChvLnkgKiBlKTtcbiAgICAgICAgICBvLnggPSBwKHMsIE9hLCBMYSksIG8ueSA9IHAodSwgT2EsIExhKSwgKHMgPCBvLnggfHwgcyA+IG8ueCArIDEgfHwgdSA8IG8ueSB8fCB1ID4gby55ICsgMSkgJiYgQShcIkdlb21ldHJ5IGV4Y2VlZHMgYWxsb3dlZCBleHRlbnQsIHJlZHVjZSB5b3VyIHZlY3RvciB0aWxlIGJ1ZmZlciBzaXplXCIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFVhKHQsIGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IHQudHlwZSxcbiAgICAgICAgaWQ6IHQuaWQsXG4gICAgICAgIHByb3BlcnRpZXM6IHQucHJvcGVydGllcyxcbiAgICAgICAgZ2VvbWV0cnk6IGUgPyBSYSh0KSA6IFtdXG4gICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGphKHQsIGUsIHIsIG4sIGkpIHtcbiAgICAgIHQuZW1wbGFjZUJhY2soMiAqIGUgKyAobiArIDEpIC8gMiwgMiAqIHIgKyAoaSArIDEpIC8gMik7XG4gICAgfVxuXG4gICAgdmFyIHFhID0gZnVuY3Rpb24gcWEodCkge1xuICAgICAgdGhpcy56b29tID0gdC56b29tLCB0aGlzLm92ZXJzY2FsaW5nID0gdC5vdmVyc2NhbGluZywgdGhpcy5sYXllcnMgPSB0LmxheWVycywgdGhpcy5sYXllcklkcyA9IHRoaXMubGF5ZXJzLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdC5pZDtcbiAgICAgIH0pLCB0aGlzLmluZGV4ID0gdC5pbmRleCwgdGhpcy5oYXNQYXR0ZXJuID0gITEsIHRoaXMubGF5b3V0VmVydGV4QXJyYXkgPSBuZXcgQ2koKSwgdGhpcy5pbmRleEFycmF5ID0gbmV3IGppKCksIHRoaXMuc2VnbWVudHMgPSBuZXcgc2EoKSwgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMgPSBuZXcgVmEodC5sYXllcnMsIHQuem9vbSksIHRoaXMuc3RhdGVEZXBlbmRlbnRMYXllcklkcyA9IHRoaXMubGF5ZXJzLmZpbHRlcihmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdC5pc1N0YXRlRGVwZW5kZW50KCk7XG4gICAgICB9KS5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQuaWQ7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gTmEodCwgZSkge1xuICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCB0Lmxlbmd0aDsgcisrKSB7XG4gICAgICAgIGlmIChXYShlLCB0W3JdKSkgcmV0dXJuICEwO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBuID0gMDsgbiA8IGUubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgaWYgKFdhKHQsIGVbbl0pKSByZXR1cm4gITA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAhIVhhKHQsIGUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIEthKHQsIGUsIHIpIHtcbiAgICAgIHJldHVybiAhIVdhKHQsIGUpIHx8ICEhSGEoZSwgdCwgcik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gR2EodCwgZSkge1xuICAgICAgaWYgKDEgPT09IHQubGVuZ3RoKSByZXR1cm4gJGEoZSwgdFswXSk7XG5cbiAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgZS5sZW5ndGg7IHIrKykge1xuICAgICAgICBmb3IgKHZhciBuID0gZVtyXSwgaSA9IDA7IGkgPCBuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKFdhKHQsIG5baV0pKSByZXR1cm4gITA7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgYSA9IDA7IGEgPCB0Lmxlbmd0aDsgYSsrKSB7XG4gICAgICAgIGlmICgkYShlLCB0W2FdKSkgcmV0dXJuICEwO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBvID0gMDsgbyA8IGUubGVuZ3RoOyBvKyspIHtcbiAgICAgICAgaWYgKFhhKHQsIGVbb10pKSByZXR1cm4gITA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAhMTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBaYSh0LCBlLCByKSB7XG4gICAgICBpZiAodC5sZW5ndGggPiAxKSB7XG4gICAgICAgIGlmIChYYSh0LCBlKSkgcmV0dXJuICEwO1xuXG4gICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgZS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIGlmIChIYShlW25dLCB0LCByKSkgcmV0dXJuICEwO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoSGEodFtpXSwgZSwgcikpIHJldHVybiAhMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICExO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFhhKHQsIGUpIHtcbiAgICAgIGlmICgwID09PSB0Lmxlbmd0aCB8fCAwID09PSBlLmxlbmd0aCkgcmV0dXJuICExO1xuXG4gICAgICBmb3IgKHZhciByID0gMDsgciA8IHQubGVuZ3RoIC0gMTsgcisrKSB7XG4gICAgICAgIGZvciAodmFyIG4gPSB0W3JdLCBpID0gdFtyICsgMV0sIGEgPSAwOyBhIDwgZS5sZW5ndGggLSAxOyBhKyspIHtcbiAgICAgICAgICBpZiAoSmEobiwgaSwgZVthXSwgZVthICsgMV0pKSByZXR1cm4gITA7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuICExO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIEphKHQsIGUsIHIsIG4pIHtcbiAgICAgIHJldHVybiBTKHQsIHIsIG4pICE9PSBTKGUsIHIsIG4pICYmIFModCwgZSwgcikgIT09IFModCwgZSwgbik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gSGEodCwgZSwgcikge1xuICAgICAgdmFyIG4gPSByICogcjtcbiAgICAgIGlmICgxID09PSBlLmxlbmd0aCkgcmV0dXJuIHQuZGlzdFNxcihlWzBdKSA8IG47XG5cbiAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoWWEodCwgZVtpIC0gMV0sIGVbaV0pIDwgbikgcmV0dXJuICEwO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gITE7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gWWEodCwgZSwgcikge1xuICAgICAgdmFyIG4gPSBlLmRpc3RTcXIocik7XG4gICAgICBpZiAoMCA9PT0gbikgcmV0dXJuIHQuZGlzdFNxcihlKTtcbiAgICAgIHZhciBpID0gKCh0LnggLSBlLngpICogKHIueCAtIGUueCkgKyAodC55IC0gZS55KSAqIChyLnkgLSBlLnkpKSAvIG47XG4gICAgICByZXR1cm4gdC5kaXN0U3FyKGkgPCAwID8gZSA6IGkgPiAxID8gciA6IHIuc3ViKGUpLl9tdWx0KGkpLl9hZGQoZSkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uICRhKHQsIGUpIHtcbiAgICAgIGZvciAodmFyIHIsIG4sIGksIGEgPSAhMSwgbyA9IDA7IG8gPCB0Lmxlbmd0aDsgbysrKSB7XG4gICAgICAgIGZvciAodmFyIHMgPSAwLCB1ID0gKHIgPSB0W29dKS5sZW5ndGggLSAxOyBzIDwgci5sZW5ndGg7IHUgPSBzKyspIHtcbiAgICAgICAgICAobiA9IHJbc10pLnkgPiBlLnkgIT0gKGkgPSByW3VdKS55ID4gZS55ICYmIGUueCA8IChpLnggLSBuLngpICogKGUueSAtIG4ueSkgLyAoaS55IC0gbi55KSArIG4ueCAmJiAoYSA9ICFhKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBXYSh0LCBlKSB7XG4gICAgICBmb3IgKHZhciByID0gITEsIG4gPSAwLCBpID0gdC5sZW5ndGggLSAxOyBuIDwgdC5sZW5ndGg7IGkgPSBuKyspIHtcbiAgICAgICAgdmFyIGEgPSB0W25dLFxuICAgICAgICAgICAgbyA9IHRbaV07XG4gICAgICAgIGEueSA+IGUueSAhPSBvLnkgPiBlLnkgJiYgZS54IDwgKG8ueCAtIGEueCkgKiAoZS55IC0gYS55KSAvIChvLnkgLSBhLnkpICsgYS54ICYmIChyID0gIXIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBRYSh0LCBlLCByKSB7XG4gICAgICB2YXIgbiA9IHJbMF0sXG4gICAgICAgICAgaSA9IHJbMl07XG4gICAgICBpZiAodC54IDwgbi54ICYmIGUueCA8IG4ueCB8fCB0LnggPiBpLnggJiYgZS54ID4gaS54IHx8IHQueSA8IG4ueSAmJiBlLnkgPCBuLnkgfHwgdC55ID4gaS55ICYmIGUueSA+IGkueSkgcmV0dXJuICExO1xuICAgICAgdmFyIGEgPSBTKHQsIGUsIHJbMF0pO1xuICAgICAgcmV0dXJuIGEgIT09IFModCwgZSwgclsxXSkgfHwgYSAhPT0gUyh0LCBlLCByWzJdKSB8fCBhICE9PSBTKHQsIGUsIHJbM10pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvKHQsIGUsIHIpIHtcbiAgICAgIHZhciBuID0gZS5wYWludC5nZXQodCkudmFsdWU7XG4gICAgICByZXR1cm4gXCJjb25zdGFudFwiID09PSBuLmtpbmQgPyBuLnZhbHVlIDogci5wcm9ncmFtQ29uZmlndXJhdGlvbnMuZ2V0KGUuaWQpLmdldE1heFZhbHVlKHQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVvKHQpIHtcbiAgICAgIHJldHVybiBNYXRoLnNxcnQodFswXSAqIHRbMF0gKyB0WzFdICogdFsxXSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcm8odCwgZSwgciwgbiwgYSkge1xuICAgICAgaWYgKCFlWzBdICYmICFlWzFdKSByZXR1cm4gdDtcblxuICAgICAgdmFyIG8gPSBpLmNvbnZlcnQoZSkuX211bHQoYSk7XG5cbiAgICAgIFwidmlld3BvcnRcIiA9PT0gciAmJiBvLl9yb3RhdGUoLW4pO1xuXG4gICAgICBmb3IgKHZhciBzID0gW10sIHUgPSAwOyB1IDwgdC5sZW5ndGg7IHUrKykge1xuICAgICAgICBzLnB1c2godFt1XS5zdWIobykpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcztcbiAgICB9XG5cbiAgICBxYS5wcm90b3R5cGUucG9wdWxhdGUgPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgdmFyIG4gPSB0aGlzLmxheWVyc1swXSxcbiAgICAgICAgICBpID0gW10sXG4gICAgICAgICAgYSA9IG51bGw7XG4gICAgICBcImNpcmNsZVwiID09PSBuLnR5cGUgJiYgKGEgPSBuLmxheW91dC5nZXQoXCJjaXJjbGUtc29ydC1rZXlcIikpO1xuXG4gICAgICBmb3IgKHZhciBvID0gMCwgcyA9IHQ7IG8gPCBzLmxlbmd0aDsgbyArPSAxKSB7XG4gICAgICAgIHZhciB1ID0gc1tvXSxcbiAgICAgICAgICAgIGwgPSB1LmZlYXR1cmUsXG4gICAgICAgICAgICBwID0gdS5pZCxcbiAgICAgICAgICAgIGMgPSB1LmluZGV4LFxuICAgICAgICAgICAgaCA9IHUuc291cmNlTGF5ZXJJbmRleCxcbiAgICAgICAgICAgIGYgPSB0aGlzLmxheWVyc1swXS5fZmVhdHVyZUZpbHRlci5uZWVkR2VvbWV0cnksXG4gICAgICAgICAgICB5ID0gVWEobCwgZik7XG5cbiAgICAgICAgaWYgKHRoaXMubGF5ZXJzWzBdLl9mZWF0dXJlRmlsdGVyLmZpbHRlcihuZXcgc2kodGhpcy56b29tKSwgeSwgcikpIHtcbiAgICAgICAgICB2YXIgZCA9IGEgPyBhLmV2YWx1YXRlKHksIHt9LCByKSA6IHZvaWQgMCxcbiAgICAgICAgICAgICAgbSA9IHtcbiAgICAgICAgICAgIGlkOiBwLFxuICAgICAgICAgICAgcHJvcGVydGllczogbC5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgdHlwZTogbC50eXBlLFxuICAgICAgICAgICAgc291cmNlTGF5ZXJJbmRleDogaCxcbiAgICAgICAgICAgIGluZGV4OiBjLFxuICAgICAgICAgICAgZ2VvbWV0cnk6IGYgPyB5Lmdlb21ldHJ5IDogUmEobCksXG4gICAgICAgICAgICBwYXR0ZXJuczoge30sXG4gICAgICAgICAgICBzb3J0S2V5OiBkXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpLnB1c2gobSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYSAmJiBpLnNvcnQoZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHQuc29ydEtleSAtIGUuc29ydEtleTtcbiAgICAgIH0pO1xuXG4gICAgICBmb3IgKHZhciB2ID0gMCwgZyA9IGk7IHYgPCBnLmxlbmd0aDsgdiArPSAxKSB7XG4gICAgICAgIHZhciB4ID0gZ1t2XSxcbiAgICAgICAgICAgIGIgPSB4Lmdlb21ldHJ5LFxuICAgICAgICAgICAgdyA9IHguaW5kZXgsXG4gICAgICAgICAgICBfID0geC5zb3VyY2VMYXllckluZGV4LFxuICAgICAgICAgICAgQSA9IHRbd10uZmVhdHVyZTtcbiAgICAgICAgdGhpcy5hZGRGZWF0dXJlKHgsIGIsIHcsIHIpLCBlLmZlYXR1cmVJbmRleC5pbnNlcnQoQSwgYiwgdywgXywgdGhpcy5pbmRleCk7XG4gICAgICB9XG4gICAgfSwgcWEucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICB0aGlzLnN0YXRlRGVwZW5kZW50TGF5ZXJzLmxlbmd0aCAmJiB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy51cGRhdGVQYWludEFycmF5cyh0LCBlLCB0aGlzLnN0YXRlRGVwZW5kZW50TGF5ZXJzLCByKTtcbiAgICB9LCBxYS5wcm90b3R5cGUuaXNFbXB0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAwID09PSB0aGlzLmxheW91dFZlcnRleEFycmF5Lmxlbmd0aDtcbiAgICB9LCBxYS5wcm90b3R5cGUudXBsb2FkUGVuZGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhdGhpcy51cGxvYWRlZCB8fCB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5uZWVkc1VwbG9hZDtcbiAgICB9LCBxYS5wcm90b3R5cGUudXBsb2FkID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHRoaXMudXBsb2FkZWQgfHwgKHRoaXMubGF5b3V0VmVydGV4QnVmZmVyID0gdC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgb2EpLCB0aGlzLmluZGV4QnVmZmVyID0gdC5jcmVhdGVJbmRleEJ1ZmZlcih0aGlzLmluZGV4QXJyYXkpKSwgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMudXBsb2FkKHQpLCB0aGlzLnVwbG9hZGVkID0gITA7XG4gICAgfSwgcWEucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLmxheW91dFZlcnRleEJ1ZmZlciAmJiAodGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIuZGVzdHJveSgpLCB0aGlzLmluZGV4QnVmZmVyLmRlc3Ryb3koKSwgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMuZGVzdHJveSgpLCB0aGlzLnNlZ21lbnRzLmRlc3Ryb3koKSk7XG4gICAgfSwgcWEucHJvdG90eXBlLmFkZEZlYXR1cmUgPSBmdW5jdGlvbiAodCwgZSwgciwgbikge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGEgPSBlOyBpIDwgYS5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBmb3IgKHZhciBvID0gMCwgcyA9IGFbaV07IG8gPCBzLmxlbmd0aDsgbyArPSAxKSB7XG4gICAgICAgICAgdmFyIHUgPSBzW29dLFxuICAgICAgICAgICAgICBsID0gdS54LFxuICAgICAgICAgICAgICBwID0gdS55O1xuXG4gICAgICAgICAgaWYgKCEobCA8IDAgfHwgbCA+PSA4MTkyIHx8IHAgPCAwIHx8IHAgPj0gODE5MikpIHtcbiAgICAgICAgICAgIHZhciBjID0gdGhpcy5zZWdtZW50cy5wcmVwYXJlU2VnbWVudCg0LCB0aGlzLmxheW91dFZlcnRleEFycmF5LCB0aGlzLmluZGV4QXJyYXksIHQuc29ydEtleSksXG4gICAgICAgICAgICAgICAgaCA9IGMudmVydGV4TGVuZ3RoO1xuICAgICAgICAgICAgamEodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgbCwgcCwgLTEsIC0xKSwgamEodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgbCwgcCwgMSwgLTEpLCBqYSh0aGlzLmxheW91dFZlcnRleEFycmF5LCBsLCBwLCAxLCAxKSwgamEodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgbCwgcCwgLTEsIDEpLCB0aGlzLmluZGV4QXJyYXkuZW1wbGFjZUJhY2soaCwgaCArIDEsIGggKyAyKSwgdGhpcy5pbmRleEFycmF5LmVtcGxhY2VCYWNrKGgsIGggKyAzLCBoICsgMiksIGMudmVydGV4TGVuZ3RoICs9IDQsIGMucHJpbWl0aXZlTGVuZ3RoICs9IDI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnBvcHVsYXRlUGFpbnRBcnJheXModGhpcy5sYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGgsIHQsIHIsIHt9LCBuKTtcbiAgICB9LCBPbihcIkNpcmNsZUJ1Y2tldFwiLCBxYSwge1xuICAgICAgb21pdDogW1wibGF5ZXJzXCJdXG4gICAgfSk7XG4gICAgdmFyIG5vID0gbmV3IHdpKHtcbiAgICAgIFwiY2lyY2xlLXNvcnQta2V5XCI6IG5ldyB2aShFdC5sYXlvdXRfY2lyY2xlW1wiY2lyY2xlLXNvcnQta2V5XCJdKVxuICAgIH0pLFxuICAgICAgICBpbyA9IHtcbiAgICAgIHBhaW50OiBuZXcgd2koe1xuICAgICAgICBcImNpcmNsZS1yYWRpdXNcIjogbmV3IHZpKEV0LnBhaW50X2NpcmNsZVtcImNpcmNsZS1yYWRpdXNcIl0pLFxuICAgICAgICBcImNpcmNsZS1jb2xvclwiOiBuZXcgdmkoRXQucGFpbnRfY2lyY2xlW1wiY2lyY2xlLWNvbG9yXCJdKSxcbiAgICAgICAgXCJjaXJjbGUtYmx1clwiOiBuZXcgdmkoRXQucGFpbnRfY2lyY2xlW1wiY2lyY2xlLWJsdXJcIl0pLFxuICAgICAgICBcImNpcmNsZS1vcGFjaXR5XCI6IG5ldyB2aShFdC5wYWludF9jaXJjbGVbXCJjaXJjbGUtb3BhY2l0eVwiXSksXG4gICAgICAgIFwiY2lyY2xlLXRyYW5zbGF0ZVwiOiBuZXcgbWkoRXQucGFpbnRfY2lyY2xlW1wiY2lyY2xlLXRyYW5zbGF0ZVwiXSksXG4gICAgICAgIFwiY2lyY2xlLXRyYW5zbGF0ZS1hbmNob3JcIjogbmV3IG1pKEV0LnBhaW50X2NpcmNsZVtcImNpcmNsZS10cmFuc2xhdGUtYW5jaG9yXCJdKSxcbiAgICAgICAgXCJjaXJjbGUtcGl0Y2gtc2NhbGVcIjogbmV3IG1pKEV0LnBhaW50X2NpcmNsZVtcImNpcmNsZS1waXRjaC1zY2FsZVwiXSksXG4gICAgICAgIFwiY2lyY2xlLXBpdGNoLWFsaWdubWVudFwiOiBuZXcgbWkoRXQucGFpbnRfY2lyY2xlW1wiY2lyY2xlLXBpdGNoLWFsaWdubWVudFwiXSksXG4gICAgICAgIFwiY2lyY2xlLXN0cm9rZS13aWR0aFwiOiBuZXcgdmkoRXQucGFpbnRfY2lyY2xlW1wiY2lyY2xlLXN0cm9rZS13aWR0aFwiXSksXG4gICAgICAgIFwiY2lyY2xlLXN0cm9rZS1jb2xvclwiOiBuZXcgdmkoRXQucGFpbnRfY2lyY2xlW1wiY2lyY2xlLXN0cm9rZS1jb2xvclwiXSksXG4gICAgICAgIFwiY2lyY2xlLXN0cm9rZS1vcGFjaXR5XCI6IG5ldyB2aShFdC5wYWludF9jaXJjbGVbXCJjaXJjbGUtc3Ryb2tlLW9wYWNpdHlcIl0pXG4gICAgICB9KSxcbiAgICAgIGxheW91dDogbm9cbiAgICB9LFxuICAgICAgICBhbyA9IFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIEZsb2F0MzJBcnJheSA/IEZsb2F0MzJBcnJheSA6IEFycmF5O1xuXG4gICAgZnVuY3Rpb24gb28odCkge1xuICAgICAgcmV0dXJuIHRbMF0gPSAxLCB0WzFdID0gMCwgdFsyXSA9IDAsIHRbM10gPSAwLCB0WzRdID0gMCwgdFs1XSA9IDEsIHRbNl0gPSAwLCB0WzddID0gMCwgdFs4XSA9IDAsIHRbOV0gPSAwLCB0WzEwXSA9IDEsIHRbMTFdID0gMCwgdFsxMl0gPSAwLCB0WzEzXSA9IDAsIHRbMTRdID0gMCwgdFsxNV0gPSAxLCB0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNvKHQsIGUsIHIpIHtcbiAgICAgIHZhciBuID0gZVswXSxcbiAgICAgICAgICBpID0gZVsxXSxcbiAgICAgICAgICBhID0gZVsyXSxcbiAgICAgICAgICBvID0gZVszXSxcbiAgICAgICAgICBzID0gZVs0XSxcbiAgICAgICAgICB1ID0gZVs1XSxcbiAgICAgICAgICBsID0gZVs2XSxcbiAgICAgICAgICBwID0gZVs3XSxcbiAgICAgICAgICBjID0gZVs4XSxcbiAgICAgICAgICBoID0gZVs5XSxcbiAgICAgICAgICBmID0gZVsxMF0sXG4gICAgICAgICAgeSA9IGVbMTFdLFxuICAgICAgICAgIGQgPSBlWzEyXSxcbiAgICAgICAgICBtID0gZVsxM10sXG4gICAgICAgICAgdiA9IGVbMTRdLFxuICAgICAgICAgIGcgPSBlWzE1XSxcbiAgICAgICAgICB4ID0gclswXSxcbiAgICAgICAgICBiID0gclsxXSxcbiAgICAgICAgICB3ID0gclsyXSxcbiAgICAgICAgICBfID0gclszXTtcbiAgICAgIHJldHVybiB0WzBdID0geCAqIG4gKyBiICogcyArIHcgKiBjICsgXyAqIGQsIHRbMV0gPSB4ICogaSArIGIgKiB1ICsgdyAqIGggKyBfICogbSwgdFsyXSA9IHggKiBhICsgYiAqIGwgKyB3ICogZiArIF8gKiB2LCB0WzNdID0geCAqIG8gKyBiICogcCArIHcgKiB5ICsgXyAqIGcsIHRbNF0gPSAoeCA9IHJbNF0pICogbiArIChiID0gcls1XSkgKiBzICsgKHcgPSByWzZdKSAqIGMgKyAoXyA9IHJbN10pICogZCwgdFs1XSA9IHggKiBpICsgYiAqIHUgKyB3ICogaCArIF8gKiBtLCB0WzZdID0geCAqIGEgKyBiICogbCArIHcgKiBmICsgXyAqIHYsIHRbN10gPSB4ICogbyArIGIgKiBwICsgdyAqIHkgKyBfICogZywgdFs4XSA9ICh4ID0gcls4XSkgKiBuICsgKGIgPSByWzldKSAqIHMgKyAodyA9IHJbMTBdKSAqIGMgKyAoXyA9IHJbMTFdKSAqIGQsIHRbOV0gPSB4ICogaSArIGIgKiB1ICsgdyAqIGggKyBfICogbSwgdFsxMF0gPSB4ICogYSArIGIgKiBsICsgdyAqIGYgKyBfICogdiwgdFsxMV0gPSB4ICogbyArIGIgKiBwICsgdyAqIHkgKyBfICogZywgdFsxMl0gPSAoeCA9IHJbMTJdKSAqIG4gKyAoYiA9IHJbMTNdKSAqIHMgKyAodyA9IHJbMTRdKSAqIGMgKyAoXyA9IHJbMTVdKSAqIGQsIHRbMTNdID0geCAqIGkgKyBiICogdSArIHcgKiBoICsgXyAqIG0sIHRbMTRdID0geCAqIGEgKyBiICogbCArIHcgKiBmICsgXyAqIHYsIHRbMTVdID0geCAqIG8gKyBiICogcCArIHcgKiB5ICsgXyAqIGcsIHQ7XG4gICAgfVxuXG4gICAgTWF0aC5oeXBvdCB8fCAoTWF0aC5oeXBvdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIHQgPSBhcmd1bWVudHMsIGUgPSAwLCByID0gYXJndW1lbnRzLmxlbmd0aDsgci0tOykge1xuICAgICAgICBlICs9IHRbcl0gKiB0W3JdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gTWF0aC5zcXJ0KGUpO1xuICAgIH0pO1xuICAgIHZhciB1byxcbiAgICAgICAgbG8gPSBzbztcblxuICAgIGZ1bmN0aW9uIHBvKHQsIGUsIHIpIHtcbiAgICAgIHZhciBuID0gZVswXSxcbiAgICAgICAgICBpID0gZVsxXSxcbiAgICAgICAgICBhID0gZVsyXSxcbiAgICAgICAgICBvID0gZVszXTtcbiAgICAgIHJldHVybiB0WzBdID0gclswXSAqIG4gKyByWzRdICogaSArIHJbOF0gKiBhICsgclsxMl0gKiBvLCB0WzFdID0gclsxXSAqIG4gKyByWzVdICogaSArIHJbOV0gKiBhICsgclsxM10gKiBvLCB0WzJdID0gclsyXSAqIG4gKyByWzZdICogaSArIHJbMTBdICogYSArIHJbMTRdICogbywgdFszXSA9IHJbM10gKiBuICsgcls3XSAqIGkgKyByWzExXSAqIGEgKyByWzE1XSAqIG8sIHQ7XG4gICAgfVxuXG4gICAgdW8gPSBuZXcgYW8oMyksIGFvICE9IEZsb2F0MzJBcnJheSAmJiAodW9bMF0gPSAwLCB1b1sxXSA9IDAsIHVvWzJdID0gMCksIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0ID0gbmV3IGFvKDQpO1xuICAgICAgYW8gIT0gRmxvYXQzMkFycmF5ICYmICh0WzBdID0gMCwgdFsxXSA9IDAsIHRbMl0gPSAwLCB0WzNdID0gMCk7XG4gICAgfSgpO1xuICAgIHZhciBjbyA9IChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdCA9IG5ldyBhbygyKTtcbiAgICAgIGFvICE9IEZsb2F0MzJBcnJheSAmJiAodFswXSA9IDAsIHRbMV0gPSAwKTtcbiAgICB9KCksIGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKGUpIHtcbiAgICAgICAgdC5jYWxsKHRoaXMsIGUsIGlvKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuY3JlYXRlQnVja2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBxYSh0KTtcbiAgICAgIH0sIGUucHJvdG90eXBlLnF1ZXJ5UmFkaXVzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdmFyIGUgPSB0O1xuICAgICAgICByZXR1cm4gdG8oXCJjaXJjbGUtcmFkaXVzXCIsIHRoaXMsIGUpICsgdG8oXCJjaXJjbGUtc3Ryb2tlLXdpZHRoXCIsIHRoaXMsIGUpICsgZW8odGhpcy5wYWludC5nZXQoXCJjaXJjbGUtdHJhbnNsYXRlXCIpKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLnF1ZXJ5SW50ZXJzZWN0c0ZlYXR1cmUgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSwgYSwgbywgcykge1xuICAgICAgICBmb3IgKHZhciB1ID0gcm8odCwgdGhpcy5wYWludC5nZXQoXCJjaXJjbGUtdHJhbnNsYXRlXCIpLCB0aGlzLnBhaW50LmdldChcImNpcmNsZS10cmFuc2xhdGUtYW5jaG9yXCIpLCBhLmFuZ2xlLCBvKSwgbCA9IHRoaXMucGFpbnQuZ2V0KFwiY2lyY2xlLXJhZGl1c1wiKS5ldmFsdWF0ZShlLCByKSArIHRoaXMucGFpbnQuZ2V0KFwiY2lyY2xlLXN0cm9rZS13aWR0aFwiKS5ldmFsdWF0ZShlLCByKSwgcCA9IFwibWFwXCIgPT09IHRoaXMucGFpbnQuZ2V0KFwiY2lyY2xlLXBpdGNoLWFsaWdubWVudFwiKSwgYyA9IHAgPyB1IDogZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICByZXR1cm4gdC5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgIHJldHVybiBobyh0LCBlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSh1LCBzKSwgaCA9IHAgPyBsICogbyA6IGwsIGYgPSAwLCB5ID0gbjsgZiA8IHkubGVuZ3RoOyBmICs9IDEpIHtcbiAgICAgICAgICBmb3IgKHZhciBkID0gMCwgbSA9IHlbZl07IGQgPCBtLmxlbmd0aDsgZCArPSAxKSB7XG4gICAgICAgICAgICB2YXIgdiA9IG1bZF0sXG4gICAgICAgICAgICAgICAgZyA9IHAgPyB2IDogaG8odiwgcyksXG4gICAgICAgICAgICAgICAgeCA9IGgsXG4gICAgICAgICAgICAgICAgYiA9IHBvKFtdLCBbdi54LCB2LnksIDAsIDFdLCBzKTtcbiAgICAgICAgICAgIGlmIChcInZpZXdwb3J0XCIgPT09IHRoaXMucGFpbnQuZ2V0KFwiY2lyY2xlLXBpdGNoLXNjYWxlXCIpICYmIFwibWFwXCIgPT09IHRoaXMucGFpbnQuZ2V0KFwiY2lyY2xlLXBpdGNoLWFsaWdubWVudFwiKSA/IHggKj0gYlszXSAvIGEuY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSA6IFwibWFwXCIgPT09IHRoaXMucGFpbnQuZ2V0KFwiY2lyY2xlLXBpdGNoLXNjYWxlXCIpICYmIFwidmlld3BvcnRcIiA9PT0gdGhpcy5wYWludC5nZXQoXCJjaXJjbGUtcGl0Y2gtYWxpZ25tZW50XCIpICYmICh4ICo9IGEuY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSAvIGJbM10pLCBLYShjLCBnLCB4KSkgcmV0dXJuICEwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhMTtcbiAgICAgIH0sIGU7XG4gICAgfShfaSkpO1xuXG4gICAgZnVuY3Rpb24gaG8odCwgZSkge1xuICAgICAgdmFyIHIgPSBwbyhbXSwgW3QueCwgdC55LCAwLCAxXSwgZSk7XG4gICAgICByZXR1cm4gbmV3IGkoclswXSAvIHJbM10sIHJbMV0gLyByWzNdKTtcbiAgICB9XG5cbiAgICB2YXIgZm8gPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlO1xuICAgIH0ocWEpO1xuXG4gICAgZnVuY3Rpb24geW8odCwgZSwgciwgbikge1xuICAgICAgdmFyIGkgPSBlLndpZHRoLFxuICAgICAgICAgIGEgPSBlLmhlaWdodDtcblxuICAgICAgaWYgKG4pIHtcbiAgICAgICAgaWYgKG4gaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSkgbiA9IG5ldyBVaW50OEFycmF5KG4uYnVmZmVyKTtlbHNlIGlmIChuLmxlbmd0aCAhPT0gaSAqIGEgKiByKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIm1pc21hdGNoZWQgaW1hZ2Ugc2l6ZVwiKTtcbiAgICAgIH0gZWxzZSBuID0gbmV3IFVpbnQ4QXJyYXkoaSAqIGEgKiByKTtcblxuICAgICAgcmV0dXJuIHQud2lkdGggPSBpLCB0LmhlaWdodCA9IGEsIHQuZGF0YSA9IG4sIHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW8odCwgZSwgcikge1xuICAgICAgdmFyIG4gPSBlLndpZHRoLFxuICAgICAgICAgIGkgPSBlLmhlaWdodDtcblxuICAgICAgaWYgKG4gIT09IHQud2lkdGggfHwgaSAhPT0gdC5oZWlnaHQpIHtcbiAgICAgICAgdmFyIGEgPSB5byh7fSwge1xuICAgICAgICAgIHdpZHRoOiBuLFxuICAgICAgICAgIGhlaWdodDogaVxuICAgICAgICB9LCByKTtcbiAgICAgICAgdm8odCwgYSwge1xuICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgeTogMFxuICAgICAgICB9LCB7XG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICB5OiAwXG4gICAgICAgIH0sIHtcbiAgICAgICAgICB3aWR0aDogTWF0aC5taW4odC53aWR0aCwgbiksXG4gICAgICAgICAgaGVpZ2h0OiBNYXRoLm1pbih0LmhlaWdodCwgaSlcbiAgICAgICAgfSwgciksIHQud2lkdGggPSBuLCB0LmhlaWdodCA9IGksIHQuZGF0YSA9IGEuZGF0YTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2byh0LCBlLCByLCBuLCBpLCBhKSB7XG4gICAgICBpZiAoMCA9PT0gaS53aWR0aCB8fCAwID09PSBpLmhlaWdodCkgcmV0dXJuIGU7XG4gICAgICBpZiAoaS53aWR0aCA+IHQud2lkdGggfHwgaS5oZWlnaHQgPiB0LmhlaWdodCB8fCByLnggPiB0LndpZHRoIC0gaS53aWR0aCB8fCByLnkgPiB0LmhlaWdodCAtIGkuaGVpZ2h0KSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIm91dCBvZiByYW5nZSBzb3VyY2UgY29vcmRpbmF0ZXMgZm9yIGltYWdlIGNvcHlcIik7XG4gICAgICBpZiAoaS53aWR0aCA+IGUud2lkdGggfHwgaS5oZWlnaHQgPiBlLmhlaWdodCB8fCBuLnggPiBlLndpZHRoIC0gaS53aWR0aCB8fCBuLnkgPiBlLmhlaWdodCAtIGkuaGVpZ2h0KSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIm91dCBvZiByYW5nZSBkZXN0aW5hdGlvbiBjb29yZGluYXRlcyBmb3IgaW1hZ2UgY29weVwiKTtcblxuICAgICAgZm9yICh2YXIgbyA9IHQuZGF0YSwgcyA9IGUuZGF0YSwgdSA9IDA7IHUgPCBpLmhlaWdodDsgdSsrKSB7XG4gICAgICAgIGZvciAodmFyIGwgPSAoKHIueSArIHUpICogdC53aWR0aCArIHIueCkgKiBhLCBwID0gKChuLnkgKyB1KSAqIGUud2lkdGggKyBuLngpICogYSwgYyA9IDA7IGMgPCBpLndpZHRoICogYTsgYysrKSB7XG4gICAgICAgICAgc1twICsgY10gPSBvW2wgKyBjXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZTtcbiAgICB9XG5cbiAgICBPbihcIkhlYXRtYXBCdWNrZXRcIiwgZm8sIHtcbiAgICAgIG9taXQ6IFtcImxheWVyc1wiXVxuICAgIH0pO1xuXG4gICAgdmFyIGdvID0gZnVuY3Rpb24gZ28odCwgZSkge1xuICAgICAgeW8odGhpcywgdCwgMSwgZSk7XG4gICAgfTtcblxuICAgIGdvLnByb3RvdHlwZS5yZXNpemUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgbW8odGhpcywgdCwgMSk7XG4gICAgfSwgZ28ucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG5ldyBnbyh7XG4gICAgICAgIHdpZHRoOiB0aGlzLndpZHRoLFxuICAgICAgICBoZWlnaHQ6IHRoaXMuaGVpZ2h0XG4gICAgICB9LCBuZXcgVWludDhBcnJheSh0aGlzLmRhdGEpKTtcbiAgICB9LCBnby5jb3B5ID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGkpIHtcbiAgICAgIHZvKHQsIGUsIHIsIG4sIGksIDEpO1xuICAgIH07XG5cbiAgICB2YXIgeG8gPSBmdW5jdGlvbiB4byh0LCBlKSB7XG4gICAgICB5byh0aGlzLCB0LCA0LCBlKTtcbiAgICB9O1xuXG4gICAgeG8ucHJvdG90eXBlLnJlc2l6ZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBtbyh0aGlzLCB0LCA0KTtcbiAgICB9LCB4by5wcm90b3R5cGUucmVwbGFjZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICBlID8gdGhpcy5kYXRhLnNldCh0KSA6IHRoaXMuZGF0YSA9IHQgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSA/IG5ldyBVaW50OEFycmF5KHQuYnVmZmVyKSA6IHQ7XG4gICAgfSwgeG8ucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG5ldyB4byh7XG4gICAgICAgIHdpZHRoOiB0aGlzLndpZHRoLFxuICAgICAgICBoZWlnaHQ6IHRoaXMuaGVpZ2h0XG4gICAgICB9LCBuZXcgVWludDhBcnJheSh0aGlzLmRhdGEpKTtcbiAgICB9LCB4by5jb3B5ID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGkpIHtcbiAgICAgIHZvKHQsIGUsIHIsIG4sIGksIDQpO1xuICAgIH0sIE9uKFwiQWxwaGFJbWFnZVwiLCBnbyksIE9uKFwiUkdCQUltYWdlXCIsIHhvKTtcbiAgICB2YXIgYm8gPSB7XG4gICAgICBwYWludDogbmV3IHdpKHtcbiAgICAgICAgXCJoZWF0bWFwLXJhZGl1c1wiOiBuZXcgdmkoRXQucGFpbnRfaGVhdG1hcFtcImhlYXRtYXAtcmFkaXVzXCJdKSxcbiAgICAgICAgXCJoZWF0bWFwLXdlaWdodFwiOiBuZXcgdmkoRXQucGFpbnRfaGVhdG1hcFtcImhlYXRtYXAtd2VpZ2h0XCJdKSxcbiAgICAgICAgXCJoZWF0bWFwLWludGVuc2l0eVwiOiBuZXcgbWkoRXQucGFpbnRfaGVhdG1hcFtcImhlYXRtYXAtaW50ZW5zaXR5XCJdKSxcbiAgICAgICAgXCJoZWF0bWFwLWNvbG9yXCI6IG5ldyBiaShFdC5wYWludF9oZWF0bWFwW1wiaGVhdG1hcC1jb2xvclwiXSksXG4gICAgICAgIFwiaGVhdG1hcC1vcGFjaXR5XCI6IG5ldyBtaShFdC5wYWludF9oZWF0bWFwW1wiaGVhdG1hcC1vcGFjaXR5XCJdKVxuICAgICAgfSlcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gd28odCkge1xuICAgICAgdmFyIGUgPSB7fSxcbiAgICAgICAgICByID0gdC5yZXNvbHV0aW9uIHx8IDI1NixcbiAgICAgICAgICBuID0gdC5jbGlwcyA/IHQuY2xpcHMubGVuZ3RoIDogMSxcbiAgICAgICAgICBpID0gdC5pbWFnZSB8fCBuZXcgeG8oe1xuICAgICAgICB3aWR0aDogcixcbiAgICAgICAgaGVpZ2h0OiBuXG4gICAgICB9KSxcbiAgICAgICAgICBhID0gZnVuY3Rpb24gYShyLCBuLCBfYTIpIHtcbiAgICAgICAgZVt0LmV2YWx1YXRpb25LZXldID0gX2EyO1xuICAgICAgICB2YXIgbyA9IHQuZXhwcmVzc2lvbi5ldmFsdWF0ZShlKTtcbiAgICAgICAgaS5kYXRhW3IgKyBuICsgMF0gPSBNYXRoLmZsb29yKDI1NSAqIG8uciAvIG8uYSksIGkuZGF0YVtyICsgbiArIDFdID0gTWF0aC5mbG9vcigyNTUgKiBvLmcgLyBvLmEpLCBpLmRhdGFbciArIG4gKyAyXSA9IE1hdGguZmxvb3IoMjU1ICogby5iIC8gby5hKSwgaS5kYXRhW3IgKyBuICsgM10gPSBNYXRoLmZsb29yKDI1NSAqIG8uYSk7XG4gICAgICB9O1xuXG4gICAgICBpZiAodC5jbGlwcykgZm9yICh2YXIgbyA9IDAsIHMgPSAwOyBvIDwgbjsgKytvLCBzICs9IDQgKiByKSB7XG4gICAgICAgIGZvciAodmFyIHUgPSAwLCBsID0gMDsgdSA8IHI7IHUrKywgbCArPSA0KSB7XG4gICAgICAgICAgdmFyIHAgPSB1IC8gKHIgLSAxKSxcbiAgICAgICAgICAgICAgYyA9IHQuY2xpcHNbb107XG4gICAgICAgICAgYShzLCBsLCBjLnN0YXJ0ICogKDEgLSBwKSArIGMuZW5kICogcCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBmb3IgKHZhciBoID0gMCwgZiA9IDA7IGggPCByOyBoKyssIGYgKz0gNCkge1xuICAgICAgICBhKDAsIGYsIGggLyAociAtIDEpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpO1xuICAgIH1cblxuICAgIHZhciBfbyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKGUpIHtcbiAgICAgICAgdC5jYWxsKHRoaXMsIGUsIGJvKSwgdGhpcy5fdXBkYXRlQ29sb3JSYW1wKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLmNyZWF0ZUJ1Y2tldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgZm8odCk7XG4gICAgICB9LCBlLnByb3RvdHlwZS5faGFuZGxlU3BlY2lhbFBhaW50UHJvcGVydHlVcGRhdGUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICBcImhlYXRtYXAtY29sb3JcIiA9PT0gdCAmJiB0aGlzLl91cGRhdGVDb2xvclJhbXAoKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLl91cGRhdGVDb2xvclJhbXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuY29sb3JSYW1wID0gd28oe1xuICAgICAgICAgIGV4cHJlc3Npb246IHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQuX3ZhbHVlc1tcImhlYXRtYXAtY29sb3JcIl0udmFsdWUuZXhwcmVzc2lvbixcbiAgICAgICAgICBldmFsdWF0aW9uS2V5OiBcImhlYXRtYXBEZW5zaXR5XCIsXG4gICAgICAgICAgaW1hZ2U6IHRoaXMuY29sb3JSYW1wXG4gICAgICAgIH0pLCB0aGlzLmNvbG9yUmFtcFRleHR1cmUgPSBudWxsO1xuICAgICAgfSwgZS5wcm90b3R5cGUucmVzaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmhlYXRtYXBGYm8gJiYgKHRoaXMuaGVhdG1hcEZiby5kZXN0cm95KCksIHRoaXMuaGVhdG1hcEZibyA9IG51bGwpO1xuICAgICAgfSwgZS5wcm90b3R5cGUucXVlcnlSYWRpdXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfSwgZS5wcm90b3R5cGUucXVlcnlJbnRlcnNlY3RzRmVhdHVyZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICExO1xuICAgICAgfSwgZS5wcm90b3R5cGUuaGFzT2Zmc2NyZWVuUGFzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIDAgIT09IHRoaXMucGFpbnQuZ2V0KFwiaGVhdG1hcC1vcGFjaXR5XCIpICYmIFwibm9uZVwiICE9PSB0aGlzLnZpc2liaWxpdHk7XG4gICAgICB9LCBlO1xuICAgIH0oX2kpLFxuICAgICAgICBBbyA9IHtcbiAgICAgIHBhaW50OiBuZXcgd2koe1xuICAgICAgICBcImhpbGxzaGFkZS1pbGx1bWluYXRpb24tZGlyZWN0aW9uXCI6IG5ldyBtaShFdC5wYWludF9oaWxsc2hhZGVbXCJoaWxsc2hhZGUtaWxsdW1pbmF0aW9uLWRpcmVjdGlvblwiXSksXG4gICAgICAgIFwiaGlsbHNoYWRlLWlsbHVtaW5hdGlvbi1hbmNob3JcIjogbmV3IG1pKEV0LnBhaW50X2hpbGxzaGFkZVtcImhpbGxzaGFkZS1pbGx1bWluYXRpb24tYW5jaG9yXCJdKSxcbiAgICAgICAgXCJoaWxsc2hhZGUtZXhhZ2dlcmF0aW9uXCI6IG5ldyBtaShFdC5wYWludF9oaWxsc2hhZGVbXCJoaWxsc2hhZGUtZXhhZ2dlcmF0aW9uXCJdKSxcbiAgICAgICAgXCJoaWxsc2hhZGUtc2hhZG93LWNvbG9yXCI6IG5ldyBtaShFdC5wYWludF9oaWxsc2hhZGVbXCJoaWxsc2hhZGUtc2hhZG93LWNvbG9yXCJdKSxcbiAgICAgICAgXCJoaWxsc2hhZGUtaGlnaGxpZ2h0LWNvbG9yXCI6IG5ldyBtaShFdC5wYWludF9oaWxsc2hhZGVbXCJoaWxsc2hhZGUtaGlnaGxpZ2h0LWNvbG9yXCJdKSxcbiAgICAgICAgXCJoaWxsc2hhZGUtYWNjZW50LWNvbG9yXCI6IG5ldyBtaShFdC5wYWludF9oaWxsc2hhZGVbXCJoaWxsc2hhZGUtYWNjZW50LWNvbG9yXCJdKVxuICAgICAgfSlcbiAgICB9LFxuICAgICAgICBTbyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKGUpIHtcbiAgICAgICAgdC5jYWxsKHRoaXMsIGUsIEFvKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuaGFzT2Zmc2NyZWVuUGFzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIDAgIT09IHRoaXMucGFpbnQuZ2V0KFwiaGlsbHNoYWRlLWV4YWdnZXJhdGlvblwiKSAmJiBcIm5vbmVcIiAhPT0gdGhpcy52aXNpYmlsaXR5O1xuICAgICAgfSwgZTtcbiAgICB9KF9pKSxcbiAgICAgICAga28gPSBJaShbe1xuICAgICAgbmFtZTogXCJhX3Bvc1wiLFxuICAgICAgY29tcG9uZW50czogMixcbiAgICAgIHR5cGU6IFwiSW50MTZcIlxuICAgIH1dLCA0KS5tZW1iZXJzLFxuICAgICAgICBJbyA9IENvLFxuICAgICAgICB6byA9IENvO1xuXG4gICAgZnVuY3Rpb24gQ28odCwgZSwgcikge1xuICAgICAgciA9IHIgfHwgMjtcbiAgICAgIHZhciBuLFxuICAgICAgICAgIGksXG4gICAgICAgICAgYSxcbiAgICAgICAgICBvLFxuICAgICAgICAgIHMsXG4gICAgICAgICAgdSxcbiAgICAgICAgICBsLFxuICAgICAgICAgIHAgPSBlICYmIGUubGVuZ3RoLFxuICAgICAgICAgIGMgPSBwID8gZVswXSAqIHIgOiB0Lmxlbmd0aCxcbiAgICAgICAgICBoID0gRW8odCwgMCwgYywgciwgITApLFxuICAgICAgICAgIGYgPSBbXTtcbiAgICAgIGlmICghaCB8fCBoLm5leHQgPT09IGgucHJldikgcmV0dXJuIGY7XG5cbiAgICAgIGlmIChwICYmIChoID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4pIHtcbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBhLFxuICAgICAgICAgICAgbyxcbiAgICAgICAgICAgIHMgPSBbXTtcblxuICAgICAgICBmb3IgKGkgPSAwLCBhID0gZS5sZW5ndGg7IGkgPCBhOyBpKyspIHtcbiAgICAgICAgICAobyA9IEVvKHQsIGVbaV0gKiBuLCBpIDwgYSAtIDEgPyBlW2kgKyAxXSAqIG4gOiB0Lmxlbmd0aCwgbiwgITEpKSA9PT0gby5uZXh0ICYmIChvLnN0ZWluZXIgPSAhMCksIHMucHVzaChVbyhvKSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHMuc29ydChEbyksIGkgPSAwOyBpIDwgcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIExvKHNbaV0sIHIpLCByID0gUG8ociwgci5uZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByO1xuICAgICAgfSh0LCBlLCBoLCByKSksIHQubGVuZ3RoID4gODAgKiByKSB7XG4gICAgICAgIG4gPSBhID0gdFswXSwgaSA9IG8gPSB0WzFdO1xuXG4gICAgICAgIGZvciAodmFyIHkgPSByOyB5IDwgYzsgeSArPSByKSB7XG4gICAgICAgICAgKHMgPSB0W3ldKSA8IG4gJiYgKG4gPSBzKSwgKHUgPSB0W3kgKyAxXSkgPCBpICYmIChpID0gdSksIHMgPiBhICYmIChhID0gcyksIHUgPiBvICYmIChvID0gdSk7XG4gICAgICAgIH1cblxuICAgICAgICBsID0gMCAhPT0gKGwgPSBNYXRoLm1heChhIC0gbiwgbyAtIGkpKSA/IDEgLyBsIDogMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIE1vKGgsIGYsIHIsIG4sIGksIGwpLCBmO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIEVvKHQsIGUsIHIsIG4sIGkpIHtcbiAgICAgIHZhciBhLCBvO1xuICAgICAgaWYgKGkgPT09IFFvKHQsIGUsIHIsIG4pID4gMCkgZm9yIChhID0gZTsgYSA8IHI7IGEgKz0gbikge1xuICAgICAgICBvID0gWW8oYSwgdFthXSwgdFthICsgMV0sIG8pO1xuICAgICAgfSBlbHNlIGZvciAoYSA9IHIgLSBuOyBhID49IGU7IGEgLT0gbikge1xuICAgICAgICBvID0gWW8oYSwgdFthXSwgdFthICsgMV0sIG8pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG8gJiYgS28obywgby5uZXh0KSAmJiAoJG8obyksIG8gPSBvLm5leHQpLCBvO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFBvKHQsIGUpIHtcbiAgICAgIGlmICghdCkgcmV0dXJuIHQ7XG4gICAgICBlIHx8IChlID0gdCk7XG4gICAgICB2YXIgcixcbiAgICAgICAgICBuID0gdDtcblxuICAgICAgZG8ge1xuICAgICAgICBpZiAociA9ICExLCBuLnN0ZWluZXIgfHwgIUtvKG4sIG4ubmV4dCkgJiYgMCAhPT0gTm8obi5wcmV2LCBuLCBuLm5leHQpKSBuID0gbi5uZXh0O2Vsc2Uge1xuICAgICAgICAgIGlmICgkbyhuKSwgKG4gPSBlID0gbi5wcmV2KSA9PT0gbi5uZXh0KSBicmVhaztcbiAgICAgICAgICByID0gITA7XG4gICAgICAgIH1cbiAgICAgIH0gd2hpbGUgKHIgfHwgbiAhPT0gZSk7XG5cbiAgICAgIHJldHVybiBlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIE1vKHQsIGUsIHIsIG4sIGksIGEsIG8pIHtcbiAgICAgIGlmICh0KSB7XG4gICAgICAgICFvICYmIGEgJiYgZnVuY3Rpb24gKHQsIGUsIHIsIG4pIHtcbiAgICAgICAgICB2YXIgaSA9IHQ7XG5cbiAgICAgICAgICBkbyB7XG4gICAgICAgICAgICBudWxsID09PSBpLnogJiYgKGkueiA9IFJvKGkueCwgaS55LCBlLCByLCBuKSksIGkucHJldlogPSBpLnByZXYsIGkubmV4dFogPSBpLm5leHQsIGkgPSBpLm5leHQ7XG4gICAgICAgICAgfSB3aGlsZSAoaSAhPT0gdCk7XG5cbiAgICAgICAgICBpLnByZXZaLm5leHRaID0gbnVsbCwgaS5wcmV2WiA9IG51bGwsIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICB2YXIgZSxcbiAgICAgICAgICAgICAgICByLFxuICAgICAgICAgICAgICAgIG4sXG4gICAgICAgICAgICAgICAgaSxcbiAgICAgICAgICAgICAgICBhLFxuICAgICAgICAgICAgICAgIG8sXG4gICAgICAgICAgICAgICAgcyxcbiAgICAgICAgICAgICAgICB1LFxuICAgICAgICAgICAgICAgIGwgPSAxO1xuXG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgIGZvciAociA9IHQsIHQgPSBudWxsLCBhID0gbnVsbCwgbyA9IDA7IHI7KSB7XG4gICAgICAgICAgICAgICAgZm9yIChvKyssIG4gPSByLCBzID0gMCwgZSA9IDA7IGUgPCBsICYmIChzKyssIG4gPSBuLm5leHRaKTsgZSsrKSB7XG4gICAgICAgICAgICAgICAgICA7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9yICh1ID0gbDsgcyA+IDAgfHwgdSA+IDAgJiYgbjspIHtcbiAgICAgICAgICAgICAgICAgIDAgIT09IHMgJiYgKDAgPT09IHUgfHwgIW4gfHwgci56IDw9IG4ueikgPyAoaSA9IHIsIHIgPSByLm5leHRaLCBzLS0pIDogKGkgPSBuLCBuID0gbi5uZXh0WiwgdS0tKSwgYSA/IGEubmV4dFogPSBpIDogdCA9IGksIGkucHJldlogPSBhLCBhID0gaTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByID0gbjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGEubmV4dFogPSBudWxsLCBsICo9IDI7XG4gICAgICAgICAgICB9IHdoaWxlIChvID4gMSk7XG4gICAgICAgICAgfShpKTtcbiAgICAgICAgfSh0LCBuLCBpLCBhKTtcblxuICAgICAgICBmb3IgKHZhciBzLCB1LCBsID0gdDsgdC5wcmV2ICE9PSB0Lm5leHQ7KSB7XG4gICAgICAgICAgaWYgKHMgPSB0LnByZXYsIHUgPSB0Lm5leHQsIGEgPyBUbyh0LCBuLCBpLCBhKSA6IEJvKHQpKSBlLnB1c2gocy5pIC8gciksIGUucHVzaCh0LmkgLyByKSwgZS5wdXNoKHUuaSAvIHIpLCAkbyh0KSwgdCA9IHUubmV4dCwgbCA9IHUubmV4dDtlbHNlIGlmICgodCA9IHUpID09PSBsKSB7XG4gICAgICAgICAgICBvID8gMSA9PT0gbyA/IE1vKHQgPSBWbyhQbyh0KSwgZSwgciksIGUsIHIsIG4sIGksIGEsIDIpIDogMiA9PT0gbyAmJiBGbyh0LCBlLCByLCBuLCBpLCBhKSA6IE1vKFBvKHQpLCBlLCByLCBuLCBpLCBhLCAxKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIEJvKHQpIHtcbiAgICAgIHZhciBlID0gdC5wcmV2LFxuICAgICAgICAgIHIgPSB0LFxuICAgICAgICAgIG4gPSB0Lm5leHQ7XG4gICAgICBpZiAoTm8oZSwgciwgbikgPj0gMCkgcmV0dXJuICExO1xuXG4gICAgICBmb3IgKHZhciBpID0gdC5uZXh0Lm5leHQ7IGkgIT09IHQucHJldjspIHtcbiAgICAgICAgaWYgKGpvKGUueCwgZS55LCByLngsIHIueSwgbi54LCBuLnksIGkueCwgaS55KSAmJiBObyhpLnByZXYsIGksIGkubmV4dCkgPj0gMCkgcmV0dXJuICExO1xuICAgICAgICBpID0gaS5uZXh0O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gITA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gVG8odCwgZSwgciwgbikge1xuICAgICAgdmFyIGkgPSB0LnByZXYsXG4gICAgICAgICAgYSA9IHQsXG4gICAgICAgICAgbyA9IHQubmV4dDtcbiAgICAgIGlmIChObyhpLCBhLCBvKSA+PSAwKSByZXR1cm4gITE7XG5cbiAgICAgIGZvciAodmFyIHMgPSBpLnggPiBhLnggPyBpLnggPiBvLnggPyBpLnggOiBvLnggOiBhLnggPiBvLnggPyBhLnggOiBvLngsIHUgPSBpLnkgPiBhLnkgPyBpLnkgPiBvLnkgPyBpLnkgOiBvLnkgOiBhLnkgPiBvLnkgPyBhLnkgOiBvLnksIGwgPSBSbyhpLnggPCBhLnggPyBpLnggPCBvLnggPyBpLnggOiBvLnggOiBhLnggPCBvLnggPyBhLnggOiBvLngsIGkueSA8IGEueSA/IGkueSA8IG8ueSA/IGkueSA6IG8ueSA6IGEueSA8IG8ueSA/IGEueSA6IG8ueSwgZSwgciwgbiksIHAgPSBSbyhzLCB1LCBlLCByLCBuKSwgYyA9IHQucHJldlosIGggPSB0Lm5leHRaOyBjICYmIGMueiA+PSBsICYmIGggJiYgaC56IDw9IHA7KSB7XG4gICAgICAgIGlmIChjICE9PSB0LnByZXYgJiYgYyAhPT0gdC5uZXh0ICYmIGpvKGkueCwgaS55LCBhLngsIGEueSwgby54LCBvLnksIGMueCwgYy55KSAmJiBObyhjLnByZXYsIGMsIGMubmV4dCkgPj0gMCkgcmV0dXJuICExO1xuICAgICAgICBpZiAoYyA9IGMucHJldlosIGggIT09IHQucHJldiAmJiBoICE9PSB0Lm5leHQgJiYgam8oaS54LCBpLnksIGEueCwgYS55LCBvLngsIG8ueSwgaC54LCBoLnkpICYmIE5vKGgucHJldiwgaCwgaC5uZXh0KSA+PSAwKSByZXR1cm4gITE7XG4gICAgICAgIGggPSBoLm5leHRaO1xuICAgICAgfVxuXG4gICAgICBmb3IgKDsgYyAmJiBjLnogPj0gbDspIHtcbiAgICAgICAgaWYgKGMgIT09IHQucHJldiAmJiBjICE9PSB0Lm5leHQgJiYgam8oaS54LCBpLnksIGEueCwgYS55LCBvLngsIG8ueSwgYy54LCBjLnkpICYmIE5vKGMucHJldiwgYywgYy5uZXh0KSA+PSAwKSByZXR1cm4gITE7XG4gICAgICAgIGMgPSBjLnByZXZaO1xuICAgICAgfVxuXG4gICAgICBmb3IgKDsgaCAmJiBoLnogPD0gcDspIHtcbiAgICAgICAgaWYgKGggIT09IHQucHJldiAmJiBoICE9PSB0Lm5leHQgJiYgam8oaS54LCBpLnksIGEueCwgYS55LCBvLngsIG8ueSwgaC54LCBoLnkpICYmIE5vKGgucHJldiwgaCwgaC5uZXh0KSA+PSAwKSByZXR1cm4gITE7XG4gICAgICAgIGggPSBoLm5leHRaO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gITA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gVm8odCwgZSwgcikge1xuICAgICAgdmFyIG4gPSB0O1xuXG4gICAgICBkbyB7XG4gICAgICAgIHZhciBpID0gbi5wcmV2LFxuICAgICAgICAgICAgYSA9IG4ubmV4dC5uZXh0O1xuICAgICAgICAhS28oaSwgYSkgJiYgR28oaSwgbiwgbi5uZXh0LCBhKSAmJiBKbyhpLCBhKSAmJiBKbyhhLCBpKSAmJiAoZS5wdXNoKGkuaSAvIHIpLCBlLnB1c2gobi5pIC8gciksIGUucHVzaChhLmkgLyByKSwgJG8obiksICRvKG4ubmV4dCksIG4gPSB0ID0gYSksIG4gPSBuLm5leHQ7XG4gICAgICB9IHdoaWxlIChuICE9PSB0KTtcblxuICAgICAgcmV0dXJuIFBvKG4pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIEZvKHQsIGUsIHIsIG4sIGksIGEpIHtcbiAgICAgIHZhciBvID0gdDtcblxuICAgICAgZG8ge1xuICAgICAgICBmb3IgKHZhciBzID0gby5uZXh0Lm5leHQ7IHMgIT09IG8ucHJldjspIHtcbiAgICAgICAgICBpZiAoby5pICE9PSBzLmkgJiYgcW8obywgcykpIHtcbiAgICAgICAgICAgIHZhciB1ID0gSG8obywgcyk7XG4gICAgICAgICAgICByZXR1cm4gbyA9IFBvKG8sIG8ubmV4dCksIHUgPSBQbyh1LCB1Lm5leHQpLCBNbyhvLCBlLCByLCBuLCBpLCBhKSwgdm9pZCBNbyh1LCBlLCByLCBuLCBpLCBhKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzID0gcy5uZXh0O1xuICAgICAgICB9XG5cbiAgICAgICAgbyA9IG8ubmV4dDtcbiAgICAgIH0gd2hpbGUgKG8gIT09IHQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIERvKHQsIGUpIHtcbiAgICAgIHJldHVybiB0LnggLSBlLng7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gTG8odCwgZSkge1xuICAgICAgaWYgKGUgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICB2YXIgcixcbiAgICAgICAgICAgIG4gPSBlLFxuICAgICAgICAgICAgaSA9IHQueCxcbiAgICAgICAgICAgIGEgPSB0LnksXG4gICAgICAgICAgICBvID0gLTEgLyAwO1xuXG4gICAgICAgIGRvIHtcbiAgICAgICAgICBpZiAoYSA8PSBuLnkgJiYgYSA+PSBuLm5leHQueSAmJiBuLm5leHQueSAhPT0gbi55KSB7XG4gICAgICAgICAgICB2YXIgcyA9IG4ueCArIChhIC0gbi55KSAqIChuLm5leHQueCAtIG4ueCkgLyAobi5uZXh0LnkgLSBuLnkpO1xuXG4gICAgICAgICAgICBpZiAocyA8PSBpICYmIHMgPiBvKSB7XG4gICAgICAgICAgICAgIGlmIChvID0gcywgcyA9PT0gaSkge1xuICAgICAgICAgICAgICAgIGlmIChhID09PSBuLnkpIHJldHVybiBuO1xuICAgICAgICAgICAgICAgIGlmIChhID09PSBuLm5leHQueSkgcmV0dXJuIG4ubmV4dDtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHIgPSBuLnggPCBuLm5leHQueCA/IG4gOiBuLm5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbiA9IG4ubmV4dDtcbiAgICAgICAgfSB3aGlsZSAobiAhPT0gZSk7XG5cbiAgICAgICAgaWYgKCFyKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKGkgPT09IG8pIHJldHVybiByO1xuICAgICAgICB2YXIgdSxcbiAgICAgICAgICAgIGwgPSByLFxuICAgICAgICAgICAgcCA9IHIueCxcbiAgICAgICAgICAgIGMgPSByLnksXG4gICAgICAgICAgICBoID0gMSAvIDA7XG4gICAgICAgIG4gPSByO1xuXG4gICAgICAgIGRvIHtcbiAgICAgICAgICBpID49IG4ueCAmJiBuLnggPj0gcCAmJiBpICE9PSBuLnggJiYgam8oYSA8IGMgPyBpIDogbywgYSwgcCwgYywgYSA8IGMgPyBvIDogaSwgYSwgbi54LCBuLnkpICYmICh1ID0gTWF0aC5hYnMoYSAtIG4ueSkgLyAoaSAtIG4ueCksIEpvKG4sIHQpICYmICh1IDwgaCB8fCB1ID09PSBoICYmIChuLnggPiByLnggfHwgbi54ID09PSByLnggJiYgT28ociwgbikpKSAmJiAociA9IG4sIGggPSB1KSksIG4gPSBuLm5leHQ7XG4gICAgICAgIH0gd2hpbGUgKG4gIT09IGwpO1xuXG4gICAgICAgIHJldHVybiByO1xuICAgICAgfSh0LCBlKSkge1xuICAgICAgICB2YXIgciA9IEhvKGUsIHQpO1xuICAgICAgICBQbyhlLCBlLm5leHQpLCBQbyhyLCByLm5leHQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIE9vKHQsIGUpIHtcbiAgICAgIHJldHVybiBObyh0LnByZXYsIHQsIGUucHJldikgPCAwICYmIE5vKGUubmV4dCwgdCwgdC5uZXh0KSA8IDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gUm8odCwgZSwgciwgbiwgaSkge1xuICAgICAgcmV0dXJuICh0ID0gMTQzMTY1NTc2NSAmICgodCA9IDg1ODk5MzQ1OSAmICgodCA9IDI1MjY0NTEzNSAmICgodCA9IDE2NzExOTM1ICYgKCh0ID0gMzI3NjcgKiAodCAtIHIpICogaSkgfCB0IDw8IDgpKSB8IHQgPDwgNCkpIHwgdCA8PCAyKSkgfCB0IDw8IDEpKSB8IChlID0gMTQzMTY1NTc2NSAmICgoZSA9IDg1ODk5MzQ1OSAmICgoZSA9IDI1MjY0NTEzNSAmICgoZSA9IDE2NzExOTM1ICYgKChlID0gMzI3NjcgKiAoZSAtIG4pICogaSkgfCBlIDw8IDgpKSB8IGUgPDwgNCkpIHwgZSA8PCAyKSkgfCBlIDw8IDEpKSA8PCAxO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFVvKHQpIHtcbiAgICAgIHZhciBlID0gdCxcbiAgICAgICAgICByID0gdDtcblxuICAgICAgZG8ge1xuICAgICAgICAoZS54IDwgci54IHx8IGUueCA9PT0gci54ICYmIGUueSA8IHIueSkgJiYgKHIgPSBlKSwgZSA9IGUubmV4dDtcbiAgICAgIH0gd2hpbGUgKGUgIT09IHQpO1xuXG4gICAgICByZXR1cm4gcjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBqbyh0LCBlLCByLCBuLCBpLCBhLCBvLCBzKSB7XG4gICAgICByZXR1cm4gKGkgLSBvKSAqIChlIC0gcykgLSAodCAtIG8pICogKGEgLSBzKSA+PSAwICYmICh0IC0gbykgKiAobiAtIHMpIC0gKHIgLSBvKSAqIChlIC0gcykgPj0gMCAmJiAociAtIG8pICogKGEgLSBzKSAtIChpIC0gbykgKiAobiAtIHMpID49IDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcW8odCwgZSkge1xuICAgICAgcmV0dXJuIHQubmV4dC5pICE9PSBlLmkgJiYgdC5wcmV2LmkgIT09IGUuaSAmJiAhZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgdmFyIHIgPSB0O1xuXG4gICAgICAgIGRvIHtcbiAgICAgICAgICBpZiAoci5pICE9PSB0LmkgJiYgci5uZXh0LmkgIT09IHQuaSAmJiByLmkgIT09IGUuaSAmJiByLm5leHQuaSAhPT0gZS5pICYmIEdvKHIsIHIubmV4dCwgdCwgZSkpIHJldHVybiAhMDtcbiAgICAgICAgICByID0gci5uZXh0O1xuICAgICAgICB9IHdoaWxlIChyICE9PSB0KTtcblxuICAgICAgICByZXR1cm4gITE7XG4gICAgICB9KHQsIGUpICYmIChKbyh0LCBlKSAmJiBKbyhlLCB0KSAmJiBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICB2YXIgciA9IHQsXG4gICAgICAgICAgICBuID0gITEsXG4gICAgICAgICAgICBpID0gKHQueCArIGUueCkgLyAyLFxuICAgICAgICAgICAgYSA9ICh0LnkgKyBlLnkpIC8gMjtcblxuICAgICAgICBkbyB7XG4gICAgICAgICAgci55ID4gYSAhPSByLm5leHQueSA+IGEgJiYgci5uZXh0LnkgIT09IHIueSAmJiBpIDwgKHIubmV4dC54IC0gci54KSAqIChhIC0gci55KSAvIChyLm5leHQueSAtIHIueSkgKyByLnggJiYgKG4gPSAhbiksIHIgPSByLm5leHQ7XG4gICAgICAgIH0gd2hpbGUgKHIgIT09IHQpO1xuXG4gICAgICAgIHJldHVybiBuO1xuICAgICAgfSh0LCBlKSAmJiAoTm8odC5wcmV2LCB0LCBlLnByZXYpIHx8IE5vKHQsIGUucHJldiwgZSkpIHx8IEtvKHQsIGUpICYmIE5vKHQucHJldiwgdCwgdC5uZXh0KSA+IDAgJiYgTm8oZS5wcmV2LCBlLCBlLm5leHQpID4gMCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gTm8odCwgZSwgcikge1xuICAgICAgcmV0dXJuIChlLnkgLSB0LnkpICogKHIueCAtIGUueCkgLSAoZS54IC0gdC54KSAqIChyLnkgLSBlLnkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIEtvKHQsIGUpIHtcbiAgICAgIHJldHVybiB0LnggPT09IGUueCAmJiB0LnkgPT09IGUueTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBHbyh0LCBlLCByLCBuKSB7XG4gICAgICB2YXIgaSA9IFhvKE5vKHQsIGUsIHIpKSxcbiAgICAgICAgICBhID0gWG8oTm8odCwgZSwgbikpLFxuICAgICAgICAgIG8gPSBYbyhObyhyLCBuLCB0KSksXG4gICAgICAgICAgcyA9IFhvKE5vKHIsIG4sIGUpKTtcbiAgICAgIHJldHVybiBpICE9PSBhICYmIG8gIT09IHMgfHwgISgwICE9PSBpIHx8ICFabyh0LCByLCBlKSkgfHwgISgwICE9PSBhIHx8ICFabyh0LCBuLCBlKSkgfHwgISgwICE9PSBvIHx8ICFabyhyLCB0LCBuKSkgfHwgISgwICE9PSBzIHx8ICFabyhyLCBlLCBuKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gWm8odCwgZSwgcikge1xuICAgICAgcmV0dXJuIGUueCA8PSBNYXRoLm1heCh0LngsIHIueCkgJiYgZS54ID49IE1hdGgubWluKHQueCwgci54KSAmJiBlLnkgPD0gTWF0aC5tYXgodC55LCByLnkpICYmIGUueSA+PSBNYXRoLm1pbih0LnksIHIueSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gWG8odCkge1xuICAgICAgcmV0dXJuIHQgPiAwID8gMSA6IHQgPCAwID8gLTEgOiAwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIEpvKHQsIGUpIHtcbiAgICAgIHJldHVybiBObyh0LnByZXYsIHQsIHQubmV4dCkgPCAwID8gTm8odCwgZSwgdC5uZXh0KSA+PSAwICYmIE5vKHQsIHQucHJldiwgZSkgPj0gMCA6IE5vKHQsIGUsIHQucHJldikgPCAwIHx8IE5vKHQsIHQubmV4dCwgZSkgPCAwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIEhvKHQsIGUpIHtcbiAgICAgIHZhciByID0gbmV3IFdvKHQuaSwgdC54LCB0LnkpLFxuICAgICAgICAgIG4gPSBuZXcgV28oZS5pLCBlLngsIGUueSksXG4gICAgICAgICAgaSA9IHQubmV4dCxcbiAgICAgICAgICBhID0gZS5wcmV2O1xuICAgICAgcmV0dXJuIHQubmV4dCA9IGUsIGUucHJldiA9IHQsIHIubmV4dCA9IGksIGkucHJldiA9IHIsIG4ubmV4dCA9IHIsIHIucHJldiA9IG4sIGEubmV4dCA9IG4sIG4ucHJldiA9IGEsIG47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gWW8odCwgZSwgciwgbikge1xuICAgICAgdmFyIGkgPSBuZXcgV28odCwgZSwgcik7XG4gICAgICByZXR1cm4gbiA/IChpLm5leHQgPSBuLm5leHQsIGkucHJldiA9IG4sIG4ubmV4dC5wcmV2ID0gaSwgbi5uZXh0ID0gaSkgOiAoaS5wcmV2ID0gaSwgaS5uZXh0ID0gaSksIGk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gJG8odCkge1xuICAgICAgdC5uZXh0LnByZXYgPSB0LnByZXYsIHQucHJldi5uZXh0ID0gdC5uZXh0LCB0LnByZXZaICYmICh0LnByZXZaLm5leHRaID0gdC5uZXh0WiksIHQubmV4dFogJiYgKHQubmV4dFoucHJldlogPSB0LnByZXZaKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBXbyh0LCBlLCByKSB7XG4gICAgICB0aGlzLmkgPSB0LCB0aGlzLnggPSBlLCB0aGlzLnkgPSByLCB0aGlzLnByZXYgPSBudWxsLCB0aGlzLm5leHQgPSBudWxsLCB0aGlzLnogPSBudWxsLCB0aGlzLnByZXZaID0gbnVsbCwgdGhpcy5uZXh0WiA9IG51bGwsIHRoaXMuc3RlaW5lciA9ICExO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFFvKHQsIGUsIHIsIG4pIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBhID0gZSwgbyA9IHIgLSBuOyBhIDwgcjsgYSArPSBuKSB7XG4gICAgICAgIGkgKz0gKHRbb10gLSB0W2FdKSAqICh0W2EgKyAxXSArIHRbbyArIDFdKSwgbyA9IGE7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRzKHQsIGUsIHIsIG4sIGkpIHtcbiAgICAgICFmdW5jdGlvbiB0KGUsIHIsIG4sIGksIGEpIHtcbiAgICAgICAgZm9yICg7IGkgPiBuOykge1xuICAgICAgICAgIGlmIChpIC0gbiA+IDYwMCkge1xuICAgICAgICAgICAgdmFyIG8gPSBpIC0gbiArIDEsXG4gICAgICAgICAgICAgICAgcyA9IHIgLSBuICsgMSxcbiAgICAgICAgICAgICAgICB1ID0gTWF0aC5sb2cobyksXG4gICAgICAgICAgICAgICAgbCA9IC41ICogTWF0aC5leHAoMiAqIHUgLyAzKSxcbiAgICAgICAgICAgICAgICBwID0gLjUgKiBNYXRoLnNxcnQodSAqIGwgKiAobyAtIGwpIC8gbykgKiAocyAtIG8gLyAyIDwgMCA/IC0xIDogMSk7XG4gICAgICAgICAgICB0KGUsIHIsIE1hdGgubWF4KG4sIE1hdGguZmxvb3IociAtIHMgKiBsIC8gbyArIHApKSwgTWF0aC5taW4oaSwgTWF0aC5mbG9vcihyICsgKG8gLSBzKSAqIGwgLyBvICsgcCkpLCBhKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgYyA9IGVbcl0sXG4gICAgICAgICAgICAgIGggPSBuLFxuICAgICAgICAgICAgICBmID0gaTtcblxuICAgICAgICAgIGZvciAoZXMoZSwgbiwgciksIGEoZVtpXSwgYykgPiAwICYmIGVzKGUsIG4sIGkpOyBoIDwgZjspIHtcbiAgICAgICAgICAgIGZvciAoZXMoZSwgaCwgZiksIGgrKywgZi0tOyBhKGVbaF0sIGMpIDwgMDspIHtcbiAgICAgICAgICAgICAgaCsrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKDsgYShlW2ZdLCBjKSA+IDA7KSB7XG4gICAgICAgICAgICAgIGYtLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAwID09PSBhKGVbbl0sIGMpID8gZXMoZSwgbiwgZikgOiBlcyhlLCArK2YsIGkpLCBmIDw9IHIgJiYgKG4gPSBmICsgMSksIHIgPD0gZiAmJiAoaSA9IGYgLSAxKTtcbiAgICAgICAgfVxuICAgICAgfSh0LCBlLCByIHx8IDAsIG4gfHwgdC5sZW5ndGggLSAxLCBpIHx8IHJzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlcyh0LCBlLCByKSB7XG4gICAgICB2YXIgbiA9IHRbZV07XG4gICAgICB0W2VdID0gdFtyXSwgdFtyXSA9IG47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcnModCwgZSkge1xuICAgICAgcmV0dXJuIHQgPCBlID8gLTEgOiB0ID4gZSA/IDEgOiAwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG5zKHQsIGUpIHtcbiAgICAgIHZhciByID0gdC5sZW5ndGg7XG4gICAgICBpZiAociA8PSAxKSByZXR1cm4gW3RdO1xuXG4gICAgICBmb3IgKHZhciBuLCBpLCBhID0gW10sIG8gPSAwOyBvIDwgcjsgbysrKSB7XG4gICAgICAgIHZhciBzID0gayh0W29dKTtcbiAgICAgICAgMCAhPT0gcyAmJiAodFtvXS5hcmVhID0gTWF0aC5hYnMocyksIHZvaWQgMCA9PT0gaSAmJiAoaSA9IHMgPCAwKSwgaSA9PT0gcyA8IDAgPyAobiAmJiBhLnB1c2gobiksIG4gPSBbdFtvXV0pIDogbi5wdXNoKHRbb10pKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG4gJiYgYS5wdXNoKG4pLCBlID4gMSkgZm9yICh2YXIgdSA9IDA7IHUgPCBhLmxlbmd0aDsgdSsrKSB7XG4gICAgICAgIGFbdV0ubGVuZ3RoIDw9IGUgfHwgKHRzKGFbdV0sIGUsIDEsIGFbdV0ubGVuZ3RoIC0gMSwgaXMpLCBhW3VdID0gYVt1XS5zbGljZSgwLCBlKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpcyh0LCBlKSB7XG4gICAgICByZXR1cm4gZS5hcmVhIC0gdC5hcmVhO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFzKHQsIGUsIHIpIHtcbiAgICAgIGZvciAodmFyIG4gPSByLnBhdHRlcm5EZXBlbmRlbmNpZXMsIGkgPSAhMSwgYSA9IDAsIG8gPSBlOyBhIDwgby5sZW5ndGg7IGEgKz0gMSkge1xuICAgICAgICB2YXIgcyA9IG9bYV0ucGFpbnQuZ2V0KHQgKyBcIi1wYXR0ZXJuXCIpO1xuICAgICAgICBzLmlzQ29uc3RhbnQoKSB8fCAoaSA9ICEwKTtcbiAgICAgICAgdmFyIHUgPSBzLmNvbnN0YW50T3IobnVsbCk7XG4gICAgICAgIHUgJiYgKGkgPSAhMCwgblt1LnRvXSA9ICEwLCBuW3UuZnJvbV0gPSAhMCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9zKHQsIGUsIHIsIG4sIGkpIHtcbiAgICAgIGZvciAodmFyIGEgPSBpLnBhdHRlcm5EZXBlbmRlbmNpZXMsIG8gPSAwLCBzID0gZTsgbyA8IHMubGVuZ3RoOyBvICs9IDEpIHtcbiAgICAgICAgdmFyIHUgPSBzW29dLFxuICAgICAgICAgICAgbCA9IHUucGFpbnQuZ2V0KHQgKyBcIi1wYXR0ZXJuXCIpLnZhbHVlO1xuXG4gICAgICAgIGlmIChcImNvbnN0YW50XCIgIT09IGwua2luZCkge1xuICAgICAgICAgIHZhciBwID0gbC5ldmFsdWF0ZSh7XG4gICAgICAgICAgICB6b29tOiBuIC0gMVxuICAgICAgICAgIH0sIHIsIHt9LCBpLmF2YWlsYWJsZUltYWdlcyksXG4gICAgICAgICAgICAgIGMgPSBsLmV2YWx1YXRlKHtcbiAgICAgICAgICAgIHpvb206IG5cbiAgICAgICAgICB9LCByLCB7fSwgaS5hdmFpbGFibGVJbWFnZXMpLFxuICAgICAgICAgICAgICBoID0gbC5ldmFsdWF0ZSh7XG4gICAgICAgICAgICB6b29tOiBuICsgMVxuICAgICAgICAgIH0sIHIsIHt9LCBpLmF2YWlsYWJsZUltYWdlcyk7XG4gICAgICAgICAgYyA9IGMgJiYgYy5uYW1lID8gYy5uYW1lIDogYywgaCA9IGggJiYgaC5uYW1lID8gaC5uYW1lIDogaCwgYVtwID0gcCAmJiBwLm5hbWUgPyBwLm5hbWUgOiBwXSA9ICEwLCBhW2NdID0gITAsIGFbaF0gPSAhMCwgci5wYXR0ZXJuc1t1LmlkXSA9IHtcbiAgICAgICAgICAgIG1pbjogcCxcbiAgICAgICAgICAgIG1pZDogYyxcbiAgICAgICAgICAgIG1heDogaFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfVxuXG4gICAgQ28uZGV2aWF0aW9uID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4pIHtcbiAgICAgIHZhciBpID0gZSAmJiBlLmxlbmd0aCxcbiAgICAgICAgICBhID0gTWF0aC5hYnMoUW8odCwgMCwgaSA/IGVbMF0gKiByIDogdC5sZW5ndGgsIHIpKTtcbiAgICAgIGlmIChpKSBmb3IgKHZhciBvID0gMCwgcyA9IGUubGVuZ3RoOyBvIDwgczsgbysrKSB7XG4gICAgICAgIGEgLT0gTWF0aC5hYnMoUW8odCwgZVtvXSAqIHIsIG8gPCBzIC0gMSA/IGVbbyArIDFdICogciA6IHQubGVuZ3RoLCByKSk7XG4gICAgICB9XG4gICAgICB2YXIgdSA9IDA7XG5cbiAgICAgIGZvciAobyA9IDA7IG8gPCBuLmxlbmd0aDsgbyArPSAzKSB7XG4gICAgICAgIHZhciBsID0gbltvXSAqIHIsXG4gICAgICAgICAgICBwID0gbltvICsgMV0gKiByLFxuICAgICAgICAgICAgYyA9IG5bbyArIDJdICogcjtcbiAgICAgICAgdSArPSBNYXRoLmFicygodFtsXSAtIHRbY10pICogKHRbcCArIDFdIC0gdFtsICsgMV0pIC0gKHRbbF0gLSB0W3BdKSAqICh0W2MgKyAxXSAtIHRbbCArIDFdKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAwID09PSBhICYmIDAgPT09IHUgPyAwIDogTWF0aC5hYnMoKHUgLSBhKSAvIGEpO1xuICAgIH0sIENvLmZsYXR0ZW4gPSBmdW5jdGlvbiAodCkge1xuICAgICAgZm9yICh2YXIgZSA9IHRbMF1bMF0ubGVuZ3RoLCByID0ge1xuICAgICAgICB2ZXJ0aWNlczogW10sXG4gICAgICAgIGhvbGVzOiBbXSxcbiAgICAgICAgZGltZW5zaW9uczogZVxuICAgICAgfSwgbiA9IDAsIGkgPSAwOyBpIDwgdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBmb3IgKHZhciBhID0gMDsgYSA8IHRbaV0ubGVuZ3RoOyBhKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBvID0gMDsgbyA8IGU7IG8rKykge1xuICAgICAgICAgICAgci52ZXJ0aWNlcy5wdXNoKHRbaV1bYV1bb10pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGkgPiAwICYmIHIuaG9sZXMucHVzaChuICs9IHRbaSAtIDFdLmxlbmd0aCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sIElvLmRlZmF1bHQgPSB6bztcblxuICAgIHZhciBzcyA9IGZ1bmN0aW9uIHNzKHQpIHtcbiAgICAgIHRoaXMuem9vbSA9IHQuem9vbSwgdGhpcy5vdmVyc2NhbGluZyA9IHQub3ZlcnNjYWxpbmcsIHRoaXMubGF5ZXJzID0gdC5sYXllcnMsIHRoaXMubGF5ZXJJZHMgPSB0aGlzLmxheWVycy5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQuaWQ7XG4gICAgICB9KSwgdGhpcy5pbmRleCA9IHQuaW5kZXgsIHRoaXMuaGFzUGF0dGVybiA9ICExLCB0aGlzLnBhdHRlcm5GZWF0dXJlcyA9IFtdLCB0aGlzLmxheW91dFZlcnRleEFycmF5ID0gbmV3IENpKCksIHRoaXMuaW5kZXhBcnJheSA9IG5ldyBqaSgpLCB0aGlzLmluZGV4QXJyYXkyID0gbmV3IFhpKCksIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zID0gbmV3IFZhKHQubGF5ZXJzLCB0Lnpvb20pLCB0aGlzLnNlZ21lbnRzID0gbmV3IHNhKCksIHRoaXMuc2VnbWVudHMyID0gbmV3IHNhKCksIHRoaXMuc3RhdGVEZXBlbmRlbnRMYXllcklkcyA9IHRoaXMubGF5ZXJzLmZpbHRlcihmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdC5pc1N0YXRlRGVwZW5kZW50KCk7XG4gICAgICB9KS5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQuaWQ7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgc3MucHJvdG90eXBlLnBvcHVsYXRlID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgIHRoaXMuaGFzUGF0dGVybiA9IGFzKFwiZmlsbFwiLCB0aGlzLmxheWVycywgZSk7XG5cbiAgICAgIGZvciAodmFyIG4gPSB0aGlzLmxheWVyc1swXS5sYXlvdXQuZ2V0KFwiZmlsbC1zb3J0LWtleVwiKSwgaSA9IFtdLCBhID0gMCwgbyA9IHQ7IGEgPCBvLmxlbmd0aDsgYSArPSAxKSB7XG4gICAgICAgIHZhciBzID0gb1thXSxcbiAgICAgICAgICAgIHUgPSBzLmZlYXR1cmUsXG4gICAgICAgICAgICBsID0gcy5pZCxcbiAgICAgICAgICAgIHAgPSBzLmluZGV4LFxuICAgICAgICAgICAgYyA9IHMuc291cmNlTGF5ZXJJbmRleCxcbiAgICAgICAgICAgIGggPSB0aGlzLmxheWVyc1swXS5fZmVhdHVyZUZpbHRlci5uZWVkR2VvbWV0cnksXG4gICAgICAgICAgICBmID0gVWEodSwgaCk7XG5cbiAgICAgICAgaWYgKHRoaXMubGF5ZXJzWzBdLl9mZWF0dXJlRmlsdGVyLmZpbHRlcihuZXcgc2kodGhpcy56b29tKSwgZiwgcikpIHtcbiAgICAgICAgICB2YXIgeSA9IG4gPyBuLmV2YWx1YXRlKGYsIHt9LCByLCBlLmF2YWlsYWJsZUltYWdlcykgOiB2b2lkIDAsXG4gICAgICAgICAgICAgIGQgPSB7XG4gICAgICAgICAgICBpZDogbCxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHUucHJvcGVydGllcyxcbiAgICAgICAgICAgIHR5cGU6IHUudHlwZSxcbiAgICAgICAgICAgIHNvdXJjZUxheWVySW5kZXg6IGMsXG4gICAgICAgICAgICBpbmRleDogcCxcbiAgICAgICAgICAgIGdlb21ldHJ5OiBoID8gZi5nZW9tZXRyeSA6IFJhKHUpLFxuICAgICAgICAgICAgcGF0dGVybnM6IHt9LFxuICAgICAgICAgICAgc29ydEtleTogeVxuICAgICAgICAgIH07XG4gICAgICAgICAgaS5wdXNoKGQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG4gJiYgaS5zb3J0KGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0LnNvcnRLZXkgLSBlLnNvcnRLZXk7XG4gICAgICB9KTtcblxuICAgICAgZm9yICh2YXIgbSA9IDAsIHYgPSBpOyBtIDwgdi5sZW5ndGg7IG0gKz0gMSkge1xuICAgICAgICB2YXIgZyA9IHZbbV0sXG4gICAgICAgICAgICB4ID0gZy5nZW9tZXRyeSxcbiAgICAgICAgICAgIGIgPSBnLmluZGV4LFxuICAgICAgICAgICAgdyA9IGcuc291cmNlTGF5ZXJJbmRleDtcblxuICAgICAgICBpZiAodGhpcy5oYXNQYXR0ZXJuKSB7XG4gICAgICAgICAgdmFyIF8gPSBvcyhcImZpbGxcIiwgdGhpcy5sYXllcnMsIGcsIHRoaXMuem9vbSwgZSk7XG5cbiAgICAgICAgICB0aGlzLnBhdHRlcm5GZWF0dXJlcy5wdXNoKF8pO1xuICAgICAgICB9IGVsc2UgdGhpcy5hZGRGZWF0dXJlKGcsIHgsIGIsIHIsIHt9KTtcblxuICAgICAgICBlLmZlYXR1cmVJbmRleC5pbnNlcnQodFtiXS5mZWF0dXJlLCB4LCBiLCB3LCB0aGlzLmluZGV4KTtcbiAgICAgIH1cbiAgICB9LCBzcy5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgIHRoaXMuc3RhdGVEZXBlbmRlbnRMYXllcnMubGVuZ3RoICYmIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnVwZGF0ZVBhaW50QXJyYXlzKHQsIGUsIHRoaXMuc3RhdGVEZXBlbmRlbnRMYXllcnMsIHIpO1xuICAgIH0sIHNzLnByb3RvdHlwZS5hZGRGZWF0dXJlcyA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICBmb3IgKHZhciBuID0gMCwgaSA9IHRoaXMucGF0dGVybkZlYXR1cmVzOyBuIDwgaS5sZW5ndGg7IG4gKz0gMSkge1xuICAgICAgICB2YXIgYSA9IGlbbl07XG4gICAgICAgIHRoaXMuYWRkRmVhdHVyZShhLCBhLmdlb21ldHJ5LCBhLmluZGV4LCBlLCByKTtcbiAgICAgIH1cbiAgICB9LCBzcy5wcm90b3R5cGUuaXNFbXB0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAwID09PSB0aGlzLmxheW91dFZlcnRleEFycmF5Lmxlbmd0aDtcbiAgICB9LCBzcy5wcm90b3R5cGUudXBsb2FkUGVuZGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhdGhpcy51cGxvYWRlZCB8fCB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5uZWVkc1VwbG9hZDtcbiAgICB9LCBzcy5wcm90b3R5cGUudXBsb2FkID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHRoaXMudXBsb2FkZWQgfHwgKHRoaXMubGF5b3V0VmVydGV4QnVmZmVyID0gdC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwga28pLCB0aGlzLmluZGV4QnVmZmVyID0gdC5jcmVhdGVJbmRleEJ1ZmZlcih0aGlzLmluZGV4QXJyYXkpLCB0aGlzLmluZGV4QnVmZmVyMiA9IHQuY3JlYXRlSW5kZXhCdWZmZXIodGhpcy5pbmRleEFycmF5MikpLCB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy51cGxvYWQodCksIHRoaXMudXBsb2FkZWQgPSAhMDtcbiAgICB9LCBzcy5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMubGF5b3V0VmVydGV4QnVmZmVyICYmICh0aGlzLmxheW91dFZlcnRleEJ1ZmZlci5kZXN0cm95KCksIHRoaXMuaW5kZXhCdWZmZXIuZGVzdHJveSgpLCB0aGlzLmluZGV4QnVmZmVyMi5kZXN0cm95KCksIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLmRlc3Ryb3koKSwgdGhpcy5zZWdtZW50cy5kZXN0cm95KCksIHRoaXMuc2VnbWVudHMyLmRlc3Ryb3koKSk7XG4gICAgfSwgc3MucHJvdG90eXBlLmFkZEZlYXR1cmUgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSkge1xuICAgICAgZm9yICh2YXIgYSA9IDAsIG8gPSBucyhlLCA1MDApOyBhIDwgby5sZW5ndGg7IGEgKz0gMSkge1xuICAgICAgICBmb3IgKHZhciBzID0gb1thXSwgdSA9IDAsIGwgPSAwLCBwID0gczsgbCA8IHAubGVuZ3RoOyBsICs9IDEpIHtcbiAgICAgICAgICB1ICs9IHBbbF0ubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgYyA9IHRoaXMuc2VnbWVudHMucHJlcGFyZVNlZ21lbnQodSwgdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgdGhpcy5pbmRleEFycmF5KSwgaCA9IGMudmVydGV4TGVuZ3RoLCBmID0gW10sIHkgPSBbXSwgZCA9IDAsIG0gPSBzOyBkIDwgbS5sZW5ndGg7IGQgKz0gMSkge1xuICAgICAgICAgIHZhciB2ID0gbVtkXTtcblxuICAgICAgICAgIGlmICgwICE9PSB2Lmxlbmd0aCkge1xuICAgICAgICAgICAgdiAhPT0gc1swXSAmJiB5LnB1c2goZi5sZW5ndGggLyAyKTtcbiAgICAgICAgICAgIHZhciBnID0gdGhpcy5zZWdtZW50czIucHJlcGFyZVNlZ21lbnQodi5sZW5ndGgsIHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHRoaXMuaW5kZXhBcnJheTIpLFxuICAgICAgICAgICAgICAgIHggPSBnLnZlcnRleExlbmd0aDtcbiAgICAgICAgICAgIHRoaXMubGF5b3V0VmVydGV4QXJyYXkuZW1wbGFjZUJhY2sodlswXS54LCB2WzBdLnkpLCB0aGlzLmluZGV4QXJyYXkyLmVtcGxhY2VCYWNrKHggKyB2Lmxlbmd0aCAtIDEsIHgpLCBmLnB1c2godlswXS54KSwgZi5wdXNoKHZbMF0ueSk7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGIgPSAxOyBiIDwgdi5sZW5ndGg7IGIrKykge1xuICAgICAgICAgICAgICB0aGlzLmxheW91dFZlcnRleEFycmF5LmVtcGxhY2VCYWNrKHZbYl0ueCwgdltiXS55KSwgdGhpcy5pbmRleEFycmF5Mi5lbXBsYWNlQmFjayh4ICsgYiAtIDEsIHggKyBiKSwgZi5wdXNoKHZbYl0ueCksIGYucHVzaCh2W2JdLnkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBnLnZlcnRleExlbmd0aCArPSB2Lmxlbmd0aCwgZy5wcmltaXRpdmVMZW5ndGggKz0gdi5sZW5ndGg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgdyA9IElvKGYsIHkpLCBfID0gMDsgXyA8IHcubGVuZ3RoOyBfICs9IDMpIHtcbiAgICAgICAgICB0aGlzLmluZGV4QXJyYXkuZW1wbGFjZUJhY2soaCArIHdbX10sIGggKyB3W18gKyAxXSwgaCArIHdbXyArIDJdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGMudmVydGV4TGVuZ3RoICs9IHUsIGMucHJpbWl0aXZlTGVuZ3RoICs9IHcubGVuZ3RoIC8gMztcbiAgICAgIH1cblxuICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMucG9wdWxhdGVQYWludEFycmF5cyh0aGlzLmxheW91dFZlcnRleEFycmF5Lmxlbmd0aCwgdCwgciwgaSwgbik7XG4gICAgfSwgT24oXCJGaWxsQnVja2V0XCIsIHNzLCB7XG4gICAgICBvbWl0OiBbXCJsYXllcnNcIiwgXCJwYXR0ZXJuRmVhdHVyZXNcIl1cbiAgICB9KTtcblxuICAgIHZhciB1cyA9IG5ldyB3aSh7XG4gICAgICBcImZpbGwtc29ydC1rZXlcIjogbmV3IHZpKEV0LmxheW91dF9maWxsW1wiZmlsbC1zb3J0LWtleVwiXSlcbiAgICB9KSxcbiAgICAgICAgbHMgPSB7XG4gICAgICBwYWludDogbmV3IHdpKHtcbiAgICAgICAgXCJmaWxsLWFudGlhbGlhc1wiOiBuZXcgbWkoRXQucGFpbnRfZmlsbFtcImZpbGwtYW50aWFsaWFzXCJdKSxcbiAgICAgICAgXCJmaWxsLW9wYWNpdHlcIjogbmV3IHZpKEV0LnBhaW50X2ZpbGxbXCJmaWxsLW9wYWNpdHlcIl0pLFxuICAgICAgICBcImZpbGwtY29sb3JcIjogbmV3IHZpKEV0LnBhaW50X2ZpbGxbXCJmaWxsLWNvbG9yXCJdKSxcbiAgICAgICAgXCJmaWxsLW91dGxpbmUtY29sb3JcIjogbmV3IHZpKEV0LnBhaW50X2ZpbGxbXCJmaWxsLW91dGxpbmUtY29sb3JcIl0pLFxuICAgICAgICBcImZpbGwtdHJhbnNsYXRlXCI6IG5ldyBtaShFdC5wYWludF9maWxsW1wiZmlsbC10cmFuc2xhdGVcIl0pLFxuICAgICAgICBcImZpbGwtdHJhbnNsYXRlLWFuY2hvclwiOiBuZXcgbWkoRXQucGFpbnRfZmlsbFtcImZpbGwtdHJhbnNsYXRlLWFuY2hvclwiXSksXG4gICAgICAgIFwiZmlsbC1wYXR0ZXJuXCI6IG5ldyBnaShFdC5wYWludF9maWxsW1wiZmlsbC1wYXR0ZXJuXCJdKVxuICAgICAgfSksXG4gICAgICBsYXlvdXQ6IHVzXG4gICAgfSxcbiAgICAgICAgcHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZShlKSB7XG4gICAgICAgIHQuY2FsbCh0aGlzLCBlLCBscyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLnJlY2FsY3VsYXRlID0gZnVuY3Rpb24gKGUsIHIpIHtcbiAgICAgICAgdC5wcm90b3R5cGUucmVjYWxjdWxhdGUuY2FsbCh0aGlzLCBlLCByKTtcbiAgICAgICAgdmFyIG4gPSB0aGlzLnBhaW50Ll92YWx1ZXNbXCJmaWxsLW91dGxpbmUtY29sb3JcIl07XG4gICAgICAgIFwiY29uc3RhbnRcIiA9PT0gbi52YWx1ZS5raW5kICYmIHZvaWQgMCA9PT0gbi52YWx1ZS52YWx1ZSAmJiAodGhpcy5wYWludC5fdmFsdWVzW1wiZmlsbC1vdXRsaW5lLWNvbG9yXCJdID0gdGhpcy5wYWludC5fdmFsdWVzW1wiZmlsbC1jb2xvclwiXSk7XG4gICAgICB9LCBlLnByb3RvdHlwZS5jcmVhdGVCdWNrZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gbmV3IHNzKHQpO1xuICAgICAgfSwgZS5wcm90b3R5cGUucXVlcnlSYWRpdXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBlbyh0aGlzLnBhaW50LmdldChcImZpbGwtdHJhbnNsYXRlXCIpKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLnF1ZXJ5SW50ZXJzZWN0c0ZlYXR1cmUgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSwgYSwgbykge1xuICAgICAgICByZXR1cm4gR2Eocm8odCwgdGhpcy5wYWludC5nZXQoXCJmaWxsLXRyYW5zbGF0ZVwiKSwgdGhpcy5wYWludC5nZXQoXCJmaWxsLXRyYW5zbGF0ZS1hbmNob3JcIiksIGEuYW5nbGUsIG8pLCBuKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmlzVGlsZUNsaXBwZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAhMDtcbiAgICAgIH0sIGU7XG4gICAgfShfaSksXG4gICAgICAgIGNzID0gSWkoW3tcbiAgICAgIG5hbWU6IFwiYV9wb3NcIixcbiAgICAgIGNvbXBvbmVudHM6IDIsXG4gICAgICB0eXBlOiBcIkludDE2XCJcbiAgICB9LCB7XG4gICAgICBuYW1lOiBcImFfbm9ybWFsX2VkXCIsXG4gICAgICBjb21wb25lbnRzOiA0LFxuICAgICAgdHlwZTogXCJJbnQxNlwiXG4gICAgfV0sIDQpLm1lbWJlcnMsXG4gICAgICAgIGhzID0gZnM7XG5cbiAgICBmdW5jdGlvbiBmcyh0LCBlLCByLCBuLCBpKSB7XG4gICAgICB0aGlzLnByb3BlcnRpZXMgPSB7fSwgdGhpcy5leHRlbnQgPSByLCB0aGlzLnR5cGUgPSAwLCB0aGlzLl9wYmYgPSB0LCB0aGlzLl9nZW9tZXRyeSA9IC0xLCB0aGlzLl9rZXlzID0gbiwgdGhpcy5fdmFsdWVzID0gaSwgdC5yZWFkRmllbGRzKHlzLCB0aGlzLCBlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB5cyh0LCBlLCByKSB7XG4gICAgICAxID09IHQgPyBlLmlkID0gci5yZWFkVmFyaW50KCkgOiAyID09IHQgPyBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICBmb3IgKHZhciByID0gdC5yZWFkVmFyaW50KCkgKyB0LnBvczsgdC5wb3MgPCByOykge1xuICAgICAgICAgIHZhciBuID0gZS5fa2V5c1t0LnJlYWRWYXJpbnQoKV0sXG4gICAgICAgICAgICAgIGkgPSBlLl92YWx1ZXNbdC5yZWFkVmFyaW50KCldO1xuXG4gICAgICAgICAgZS5wcm9wZXJ0aWVzW25dID0gaTtcbiAgICAgICAgfVxuICAgICAgfShyLCBlKSA6IDMgPT0gdCA/IGUudHlwZSA9IHIucmVhZFZhcmludCgpIDogNCA9PSB0ICYmIChlLl9nZW9tZXRyeSA9IHIucG9zKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkcyh0KSB7XG4gICAgICBmb3IgKHZhciBlLCByLCBuID0gMCwgaSA9IDAsIGEgPSB0Lmxlbmd0aCwgbyA9IGEgLSAxOyBpIDwgYTsgbyA9IGkrKykge1xuICAgICAgICBuICs9ICgociA9IHRbb10pLnggLSAoZSA9IHRbaV0pLngpICogKGUueSArIHIueSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuO1xuICAgIH1cblxuICAgIGZzLnR5cGVzID0gW1wiVW5rbm93blwiLCBcIlBvaW50XCIsIFwiTGluZVN0cmluZ1wiLCBcIlBvbHlnb25cIl0sIGZzLnByb3RvdHlwZS5sb2FkR2VvbWV0cnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdCA9IHRoaXMuX3BiZjtcbiAgICAgIHQucG9zID0gdGhpcy5fZ2VvbWV0cnk7XG5cbiAgICAgIGZvciAodmFyIGUsIHIgPSB0LnJlYWRWYXJpbnQoKSArIHQucG9zLCBuID0gMSwgYSA9IDAsIG8gPSAwLCBzID0gMCwgdSA9IFtdOyB0LnBvcyA8IHI7KSB7XG4gICAgICAgIGlmIChhIDw9IDApIHtcbiAgICAgICAgICB2YXIgbCA9IHQucmVhZFZhcmludCgpO1xuICAgICAgICAgIG4gPSA3ICYgbCwgYSA9IGwgPj4gMztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhLS0sIDEgPT09IG4gfHwgMiA9PT0gbikgbyArPSB0LnJlYWRTVmFyaW50KCksIHMgKz0gdC5yZWFkU1ZhcmludCgpLCAxID09PSBuICYmIChlICYmIHUucHVzaChlKSwgZSA9IFtdKSwgZS5wdXNoKG5ldyBpKG8sIHMpKTtlbHNlIHtcbiAgICAgICAgICBpZiAoNyAhPT0gbikgdGhyb3cgbmV3IEVycm9yKFwidW5rbm93biBjb21tYW5kIFwiICsgbik7XG4gICAgICAgICAgZSAmJiBlLnB1c2goZVswXS5jbG9uZSgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZSAmJiB1LnB1c2goZSksIHU7XG4gICAgfSwgZnMucHJvdG90eXBlLmJib3ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdCA9IHRoaXMuX3BiZjtcbiAgICAgIHQucG9zID0gdGhpcy5fZ2VvbWV0cnk7XG5cbiAgICAgIGZvciAodmFyIGUgPSB0LnJlYWRWYXJpbnQoKSArIHQucG9zLCByID0gMSwgbiA9IDAsIGkgPSAwLCBhID0gMCwgbyA9IDEgLyAwLCBzID0gLTEgLyAwLCB1ID0gMSAvIDAsIGwgPSAtMSAvIDA7IHQucG9zIDwgZTspIHtcbiAgICAgICAgaWYgKG4gPD0gMCkge1xuICAgICAgICAgIHZhciBwID0gdC5yZWFkVmFyaW50KCk7XG4gICAgICAgICAgciA9IDcgJiBwLCBuID0gcCA+PiAzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG4tLSwgMSA9PT0gciB8fCAyID09PSByKSAoaSArPSB0LnJlYWRTVmFyaW50KCkpIDwgbyAmJiAobyA9IGkpLCBpID4gcyAmJiAocyA9IGkpLCAoYSArPSB0LnJlYWRTVmFyaW50KCkpIDwgdSAmJiAodSA9IGEpLCBhID4gbCAmJiAobCA9IGEpO2Vsc2UgaWYgKDcgIT09IHIpIHRocm93IG5ldyBFcnJvcihcInVua25vd24gY29tbWFuZCBcIiArIHIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gW28sIHUsIHMsIGxdO1xuICAgIH0sIGZzLnByb3RvdHlwZS50b0dlb0pTT04gPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgdmFyIG4sXG4gICAgICAgICAgaSxcbiAgICAgICAgICBhID0gdGhpcy5leHRlbnQgKiBNYXRoLnBvdygyLCByKSxcbiAgICAgICAgICBvID0gdGhpcy5leHRlbnQgKiB0LFxuICAgICAgICAgIHMgPSB0aGlzLmV4dGVudCAqIGUsXG4gICAgICAgICAgdSA9IHRoaXMubG9hZEdlb21ldHJ5KCksXG4gICAgICAgICAgbCA9IGZzLnR5cGVzW3RoaXMudHlwZV07XG5cbiAgICAgIGZ1bmN0aW9uIHAodCkge1xuICAgICAgICBmb3IgKHZhciBlID0gMDsgZSA8IHQubGVuZ3RoOyBlKyspIHtcbiAgICAgICAgICB2YXIgciA9IHRbZV07XG4gICAgICAgICAgdFtlXSA9IFszNjAgKiAoci54ICsgbykgLyBhIC0gMTgwLCAzNjAgLyBNYXRoLlBJICogTWF0aC5hdGFuKE1hdGguZXhwKCgxODAgLSAzNjAgKiAoci55ICsgcykgLyBhKSAqIE1hdGguUEkgLyAxODApKSAtIDkwXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgdmFyIGMgPSBbXTtcblxuICAgICAgICAgIGZvciAobiA9IDA7IG4gPCB1Lmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgICBjW25dID0gdVtuXVswXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwKHUgPSBjKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgZm9yIChuID0gMDsgbiA8IHUubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICAgIHAodVtuXSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIGZvciAodSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICB2YXIgZSA9IHQubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGUgPD0gMSkgcmV0dXJuIFt0XTtcblxuICAgICAgICAgICAgZm9yICh2YXIgciwgbiwgaSA9IFtdLCBhID0gMDsgYSA8IGU7IGErKykge1xuICAgICAgICAgICAgICB2YXIgbyA9IGRzKHRbYV0pO1xuICAgICAgICAgICAgICAwICE9PSBvICYmICh2b2lkIDAgPT09IG4gJiYgKG4gPSBvIDwgMCksIG4gPT09IG8gPCAwID8gKHIgJiYgaS5wdXNoKHIpLCByID0gW3RbYV1dKSA6IHIucHVzaCh0W2FdKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByICYmIGkucHVzaChyKSwgaTtcbiAgICAgICAgICB9KHUpLCBuID0gMDsgbiA8IHUubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB1W25dLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIHAodVtuXVtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICB9XG5cbiAgICAgIDEgPT09IHUubGVuZ3RoID8gdSA9IHVbMF0gOiBsID0gXCJNdWx0aVwiICsgbDtcbiAgICAgIHZhciBoID0ge1xuICAgICAgICB0eXBlOiBcIkZlYXR1cmVcIixcbiAgICAgICAgZ2VvbWV0cnk6IHtcbiAgICAgICAgICB0eXBlOiBsLFxuICAgICAgICAgIGNvb3JkaW5hdGVzOiB1XG4gICAgICAgIH0sXG4gICAgICAgIHByb3BlcnRpZXM6IHRoaXMucHJvcGVydGllc1xuICAgICAgfTtcbiAgICAgIHJldHVybiBcImlkXCIgaW4gdGhpcyAmJiAoaC5pZCA9IHRoaXMuaWQpLCBoO1xuICAgIH07XG4gICAgdmFyIG1zID0gdnM7XG5cbiAgICBmdW5jdGlvbiB2cyh0LCBlKSB7XG4gICAgICB0aGlzLnZlcnNpb24gPSAxLCB0aGlzLm5hbWUgPSBudWxsLCB0aGlzLmV4dGVudCA9IDQwOTYsIHRoaXMubGVuZ3RoID0gMCwgdGhpcy5fcGJmID0gdCwgdGhpcy5fa2V5cyA9IFtdLCB0aGlzLl92YWx1ZXMgPSBbXSwgdGhpcy5fZmVhdHVyZXMgPSBbXSwgdC5yZWFkRmllbGRzKGdzLCB0aGlzLCBlKSwgdGhpcy5sZW5ndGggPSB0aGlzLl9mZWF0dXJlcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ3ModCwgZSwgcikge1xuICAgICAgMTUgPT09IHQgPyBlLnZlcnNpb24gPSByLnJlYWRWYXJpbnQoKSA6IDEgPT09IHQgPyBlLm5hbWUgPSByLnJlYWRTdHJpbmcoKSA6IDUgPT09IHQgPyBlLmV4dGVudCA9IHIucmVhZFZhcmludCgpIDogMiA9PT0gdCA/IGUuX2ZlYXR1cmVzLnB1c2goci5wb3MpIDogMyA9PT0gdCA/IGUuX2tleXMucHVzaChyLnJlYWRTdHJpbmcoKSkgOiA0ID09PSB0ICYmIGUuX3ZhbHVlcy5wdXNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGZvciAodmFyIGUgPSBudWxsLCByID0gdC5yZWFkVmFyaW50KCkgKyB0LnBvczsgdC5wb3MgPCByOykge1xuICAgICAgICAgIHZhciBuID0gdC5yZWFkVmFyaW50KCkgPj4gMztcbiAgICAgICAgICBlID0gMSA9PT0gbiA/IHQucmVhZFN0cmluZygpIDogMiA9PT0gbiA/IHQucmVhZEZsb2F0KCkgOiAzID09PSBuID8gdC5yZWFkRG91YmxlKCkgOiA0ID09PSBuID8gdC5yZWFkVmFyaW50NjQoKSA6IDUgPT09IG4gPyB0LnJlYWRWYXJpbnQoKSA6IDYgPT09IG4gPyB0LnJlYWRTVmFyaW50KCkgOiA3ID09PSBuID8gdC5yZWFkQm9vbGVhbigpIDogbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfShyKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24geHModCwgZSwgcikge1xuICAgICAgaWYgKDMgPT09IHQpIHtcbiAgICAgICAgdmFyIG4gPSBuZXcgbXMociwgci5yZWFkVmFyaW50KCkgKyByLnBvcyk7XG4gICAgICAgIG4ubGVuZ3RoICYmIChlW24ubmFtZV0gPSBuKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2cy5wcm90b3R5cGUuZmVhdHVyZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBpZiAodCA8IDAgfHwgdCA+PSB0aGlzLl9mZWF0dXJlcy5sZW5ndGgpIHRocm93IG5ldyBFcnJvcihcImZlYXR1cmUgaW5kZXggb3V0IG9mIGJvdW5kc1wiKTtcbiAgICAgIHRoaXMuX3BiZi5wb3MgPSB0aGlzLl9mZWF0dXJlc1t0XTtcblxuICAgICAgdmFyIGUgPSB0aGlzLl9wYmYucmVhZFZhcmludCgpICsgdGhpcy5fcGJmLnBvcztcblxuICAgICAgcmV0dXJuIG5ldyBocyh0aGlzLl9wYmYsIGUsIHRoaXMuZXh0ZW50LCB0aGlzLl9rZXlzLCB0aGlzLl92YWx1ZXMpO1xuICAgIH07XG5cbiAgICB2YXIgYnMgPSB7XG4gICAgICBWZWN0b3JUaWxlOiBmdW5jdGlvbiBWZWN0b3JUaWxlKHQsIGUpIHtcbiAgICAgICAgdGhpcy5sYXllcnMgPSB0LnJlYWRGaWVsZHMoeHMsIHt9LCBlKTtcbiAgICAgIH0sXG4gICAgICBWZWN0b3JUaWxlRmVhdHVyZTogaHMsXG4gICAgICBWZWN0b3JUaWxlTGF5ZXI6IG1zXG4gICAgfSxcbiAgICAgICAgd3MgPSBicy5WZWN0b3JUaWxlRmVhdHVyZS50eXBlcyxcbiAgICAgICAgX3MgPSBNYXRoLnBvdygyLCAxMyk7XG5cbiAgICBmdW5jdGlvbiBBcyh0LCBlLCByLCBuLCBpLCBhLCBvLCBzKSB7XG4gICAgICB0LmVtcGxhY2VCYWNrKGUsIHIsIDIgKiBNYXRoLmZsb29yKG4gKiBfcykgKyBvLCBpICogX3MgKiAyLCBhICogX3MgKiAyLCBNYXRoLnJvdW5kKHMpKTtcbiAgICB9XG5cbiAgICB2YXIgU3MgPSBmdW5jdGlvbiBTcyh0KSB7XG4gICAgICB0aGlzLnpvb20gPSB0Lnpvb20sIHRoaXMub3ZlcnNjYWxpbmcgPSB0Lm92ZXJzY2FsaW5nLCB0aGlzLmxheWVycyA9IHQubGF5ZXJzLCB0aGlzLmxheWVySWRzID0gdGhpcy5sYXllcnMubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0LmlkO1xuICAgICAgfSksIHRoaXMuaW5kZXggPSB0LmluZGV4LCB0aGlzLmhhc1BhdHRlcm4gPSAhMSwgdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSA9IG5ldyBQaSgpLCB0aGlzLmluZGV4QXJyYXkgPSBuZXcgamkoKSwgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMgPSBuZXcgVmEodC5sYXllcnMsIHQuem9vbSksIHRoaXMuc2VnbWVudHMgPSBuZXcgc2EoKSwgdGhpcy5zdGF0ZURlcGVuZGVudExheWVySWRzID0gdGhpcy5sYXllcnMuZmlsdGVyKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0LmlzU3RhdGVEZXBlbmRlbnQoKTtcbiAgICAgIH0pLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdC5pZDtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBrcyh0LCBlKSB7XG4gICAgICByZXR1cm4gdC54ID09PSBlLnggJiYgKHQueCA8IDAgfHwgdC54ID4gODE5MikgfHwgdC55ID09PSBlLnkgJiYgKHQueSA8IDAgfHwgdC55ID4gODE5Mik7XG4gICAgfVxuXG4gICAgU3MucHJvdG90eXBlLnBvcHVsYXRlID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgIHRoaXMuZmVhdHVyZXMgPSBbXSwgdGhpcy5oYXNQYXR0ZXJuID0gYXMoXCJmaWxsLWV4dHJ1c2lvblwiLCB0aGlzLmxheWVycywgZSk7XG5cbiAgICAgIGZvciAodmFyIG4gPSAwLCBpID0gdDsgbiA8IGkubGVuZ3RoOyBuICs9IDEpIHtcbiAgICAgICAgdmFyIGEgPSBpW25dLFxuICAgICAgICAgICAgbyA9IGEuZmVhdHVyZSxcbiAgICAgICAgICAgIHMgPSBhLmlkLFxuICAgICAgICAgICAgdSA9IGEuaW5kZXgsXG4gICAgICAgICAgICBsID0gYS5zb3VyY2VMYXllckluZGV4LFxuICAgICAgICAgICAgcCA9IHRoaXMubGF5ZXJzWzBdLl9mZWF0dXJlRmlsdGVyLm5lZWRHZW9tZXRyeSxcbiAgICAgICAgICAgIGMgPSBVYShvLCBwKTtcblxuICAgICAgICBpZiAodGhpcy5sYXllcnNbMF0uX2ZlYXR1cmVGaWx0ZXIuZmlsdGVyKG5ldyBzaSh0aGlzLnpvb20pLCBjLCByKSkge1xuICAgICAgICAgIHZhciBoID0ge1xuICAgICAgICAgICAgaWQ6IHMsXG4gICAgICAgICAgICBzb3VyY2VMYXllckluZGV4OiBsLFxuICAgICAgICAgICAgaW5kZXg6IHUsXG4gICAgICAgICAgICBnZW9tZXRyeTogcCA/IGMuZ2VvbWV0cnkgOiBSYShvKSxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IG8ucHJvcGVydGllcyxcbiAgICAgICAgICAgIHR5cGU6IG8udHlwZSxcbiAgICAgICAgICAgIHBhdHRlcm5zOiB7fVxuICAgICAgICAgIH07XG4gICAgICAgICAgdGhpcy5oYXNQYXR0ZXJuID8gdGhpcy5mZWF0dXJlcy5wdXNoKG9zKFwiZmlsbC1leHRydXNpb25cIiwgdGhpcy5sYXllcnMsIGgsIHRoaXMuem9vbSwgZSkpIDogdGhpcy5hZGRGZWF0dXJlKGgsIGguZ2VvbWV0cnksIHUsIHIsIHt9KSwgZS5mZWF0dXJlSW5kZXguaW5zZXJ0KG8sIGguZ2VvbWV0cnksIHUsIGwsIHRoaXMuaW5kZXgsICEwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIFNzLnByb3RvdHlwZS5hZGRGZWF0dXJlcyA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICBmb3IgKHZhciBuID0gMCwgaSA9IHRoaXMuZmVhdHVyZXM7IG4gPCBpLmxlbmd0aDsgbiArPSAxKSB7XG4gICAgICAgIHZhciBhID0gaVtuXTtcbiAgICAgICAgdGhpcy5hZGRGZWF0dXJlKGEsIGEuZ2VvbWV0cnksIGEuaW5kZXgsIGUsIHIpO1xuICAgICAgfVxuICAgIH0sIFNzLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgdGhpcy5zdGF0ZURlcGVuZGVudExheWVycy5sZW5ndGggJiYgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMudXBkYXRlUGFpbnRBcnJheXModCwgZSwgdGhpcy5zdGF0ZURlcGVuZGVudExheWVycywgcik7XG4gICAgfSwgU3MucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gMCA9PT0gdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGg7XG4gICAgfSwgU3MucHJvdG90eXBlLnVwbG9hZFBlbmRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gIXRoaXMudXBsb2FkZWQgfHwgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMubmVlZHNVcGxvYWQ7XG4gICAgfSwgU3MucHJvdG90eXBlLnVwbG9hZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0aGlzLnVwbG9hZGVkIHx8ICh0aGlzLmxheW91dFZlcnRleEJ1ZmZlciA9IHQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMubGF5b3V0VmVydGV4QXJyYXksIGNzKSwgdGhpcy5pbmRleEJ1ZmZlciA9IHQuY3JlYXRlSW5kZXhCdWZmZXIodGhpcy5pbmRleEFycmF5KSksIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnVwbG9hZCh0KSwgdGhpcy51cGxvYWRlZCA9ICEwO1xuICAgIH0sIFNzLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIgJiYgKHRoaXMubGF5b3V0VmVydGV4QnVmZmVyLmRlc3Ryb3koKSwgdGhpcy5pbmRleEJ1ZmZlci5kZXN0cm95KCksIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLmRlc3Ryb3koKSwgdGhpcy5zZWdtZW50cy5kZXN0cm95KCkpO1xuICAgIH0sIFNzLnByb3RvdHlwZS5hZGRGZWF0dXJlID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGkpIHtcbiAgICAgIGZvciAodmFyIGEgPSAwLCBvID0gbnMoZSwgNTAwKTsgYSA8IG8ubGVuZ3RoOyBhICs9IDEpIHtcbiAgICAgICAgZm9yICh2YXIgcyA9IG9bYV0sIHUgPSAwLCBsID0gMCwgcCA9IHM7IGwgPCBwLmxlbmd0aDsgbCArPSAxKSB7XG4gICAgICAgICAgdSArPSBwW2xdLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGMgPSB0aGlzLnNlZ21lbnRzLnByZXBhcmVTZWdtZW50KDQsIHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHRoaXMuaW5kZXhBcnJheSksIGggPSAwLCBmID0gczsgaCA8IGYubGVuZ3RoOyBoICs9IDEpIHtcbiAgICAgICAgICB2YXIgeSA9IGZbaF07XG4gICAgICAgICAgaWYgKDAgIT09IHkubGVuZ3RoICYmICEoKEIgPSB5KS5ldmVyeShmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgcmV0dXJuIHQueCA8IDA7XG4gICAgICAgICAgfSkgfHwgQi5ldmVyeShmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgcmV0dXJuIHQueCA+IDgxOTI7XG4gICAgICAgICAgfSkgfHwgQi5ldmVyeShmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgcmV0dXJuIHQueSA8IDA7XG4gICAgICAgICAgfSkgfHwgQi5ldmVyeShmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgcmV0dXJuIHQueSA+IDgxOTI7XG4gICAgICAgICAgfSkpKSBmb3IgKHZhciBkID0gMCwgbSA9IDA7IG0gPCB5Lmxlbmd0aDsgbSsrKSB7XG4gICAgICAgICAgICB2YXIgdiA9IHlbbV07XG5cbiAgICAgICAgICAgIGlmIChtID49IDEpIHtcbiAgICAgICAgICAgICAgdmFyIGcgPSB5W20gLSAxXTtcblxuICAgICAgICAgICAgICBpZiAoIWtzKHYsIGcpKSB7XG4gICAgICAgICAgICAgICAgYy52ZXJ0ZXhMZW5ndGggKyA0ID4gc2EuTUFYX1ZFUlRFWF9BUlJBWV9MRU5HVEggJiYgKGMgPSB0aGlzLnNlZ21lbnRzLnByZXBhcmVTZWdtZW50KDQsIHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHRoaXMuaW5kZXhBcnJheSkpO1xuXG4gICAgICAgICAgICAgICAgdmFyIHggPSB2LnN1YihnKS5fcGVycCgpLl91bml0KCksXG4gICAgICAgICAgICAgICAgICAgIGIgPSBnLmRpc3Qodik7XG5cbiAgICAgICAgICAgICAgICBkICsgYiA+IDMyNzY4ICYmIChkID0gMCksIEFzKHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHYueCwgdi55LCB4LngsIHgueSwgMCwgMCwgZCksIEFzKHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHYueCwgdi55LCB4LngsIHgueSwgMCwgMSwgZCksIEFzKHRoaXMubGF5b3V0VmVydGV4QXJyYXksIGcueCwgZy55LCB4LngsIHgueSwgMCwgMCwgZCArPSBiKSwgQXModGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgZy54LCBnLnksIHgueCwgeC55LCAwLCAxLCBkKTtcbiAgICAgICAgICAgICAgICB2YXIgdyA9IGMudmVydGV4TGVuZ3RoO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5kZXhBcnJheS5lbXBsYWNlQmFjayh3LCB3ICsgMiwgdyArIDEpLCB0aGlzLmluZGV4QXJyYXkuZW1wbGFjZUJhY2sodyArIDEsIHcgKyAyLCB3ICsgMyksIGMudmVydGV4TGVuZ3RoICs9IDQsIGMucHJpbWl0aXZlTGVuZ3RoICs9IDI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYy52ZXJ0ZXhMZW5ndGggKyB1ID4gc2EuTUFYX1ZFUlRFWF9BUlJBWV9MRU5HVEggJiYgKGMgPSB0aGlzLnNlZ21lbnRzLnByZXBhcmVTZWdtZW50KHUsIHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHRoaXMuaW5kZXhBcnJheSkpLCBcIlBvbHlnb25cIiA9PT0gd3NbdC50eXBlXSkge1xuICAgICAgICAgIGZvciAodmFyIF8gPSBbXSwgQSA9IFtdLCBTID0gYy52ZXJ0ZXhMZW5ndGgsIGsgPSAwLCBJID0gczsgayA8IEkubGVuZ3RoOyBrICs9IDEpIHtcbiAgICAgICAgICAgIHZhciB6ID0gSVtrXTtcblxuICAgICAgICAgICAgaWYgKDAgIT09IHoubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHogIT09IHNbMF0gJiYgQS5wdXNoKF8ubGVuZ3RoIC8gMik7XG5cbiAgICAgICAgICAgICAgZm9yICh2YXIgQyA9IDA7IEMgPCB6Lmxlbmd0aDsgQysrKSB7XG4gICAgICAgICAgICAgICAgdmFyIEUgPSB6W0NdO1xuICAgICAgICAgICAgICAgIEFzKHRoaXMubGF5b3V0VmVydGV4QXJyYXksIEUueCwgRS55LCAwLCAwLCAxLCAxLCAwKSwgXy5wdXNoKEUueCksIF8ucHVzaChFLnkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yICh2YXIgUCA9IElvKF8sIEEpLCBNID0gMDsgTSA8IFAubGVuZ3RoOyBNICs9IDMpIHtcbiAgICAgICAgICAgIHRoaXMuaW5kZXhBcnJheS5lbXBsYWNlQmFjayhTICsgUFtNXSwgUyArIFBbTSArIDJdLCBTICsgUFtNICsgMV0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGMucHJpbWl0aXZlTGVuZ3RoICs9IFAubGVuZ3RoIC8gMywgYy52ZXJ0ZXhMZW5ndGggKz0gdTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgQjtcbiAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnBvcHVsYXRlUGFpbnRBcnJheXModGhpcy5sYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGgsIHQsIHIsIGksIG4pO1xuICAgIH0sIE9uKFwiRmlsbEV4dHJ1c2lvbkJ1Y2tldFwiLCBTcywge1xuICAgICAgb21pdDogW1wibGF5ZXJzXCIsIFwiZmVhdHVyZXNcIl1cbiAgICB9KTtcblxuICAgIHZhciBJcyA9IHtcbiAgICAgIHBhaW50OiBuZXcgd2koe1xuICAgICAgICBcImZpbGwtZXh0cnVzaW9uLW9wYWNpdHlcIjogbmV3IG1pKEV0W1wicGFpbnRfZmlsbC1leHRydXNpb25cIl1bXCJmaWxsLWV4dHJ1c2lvbi1vcGFjaXR5XCJdKSxcbiAgICAgICAgXCJmaWxsLWV4dHJ1c2lvbi1jb2xvclwiOiBuZXcgdmkoRXRbXCJwYWludF9maWxsLWV4dHJ1c2lvblwiXVtcImZpbGwtZXh0cnVzaW9uLWNvbG9yXCJdKSxcbiAgICAgICAgXCJmaWxsLWV4dHJ1c2lvbi10cmFuc2xhdGVcIjogbmV3IG1pKEV0W1wicGFpbnRfZmlsbC1leHRydXNpb25cIl1bXCJmaWxsLWV4dHJ1c2lvbi10cmFuc2xhdGVcIl0pLFxuICAgICAgICBcImZpbGwtZXh0cnVzaW9uLXRyYW5zbGF0ZS1hbmNob3JcIjogbmV3IG1pKEV0W1wicGFpbnRfZmlsbC1leHRydXNpb25cIl1bXCJmaWxsLWV4dHJ1c2lvbi10cmFuc2xhdGUtYW5jaG9yXCJdKSxcbiAgICAgICAgXCJmaWxsLWV4dHJ1c2lvbi1wYXR0ZXJuXCI6IG5ldyBnaShFdFtcInBhaW50X2ZpbGwtZXh0cnVzaW9uXCJdW1wiZmlsbC1leHRydXNpb24tcGF0dGVyblwiXSksXG4gICAgICAgIFwiZmlsbC1leHRydXNpb24taGVpZ2h0XCI6IG5ldyB2aShFdFtcInBhaW50X2ZpbGwtZXh0cnVzaW9uXCJdW1wiZmlsbC1leHRydXNpb24taGVpZ2h0XCJdKSxcbiAgICAgICAgXCJmaWxsLWV4dHJ1c2lvbi1iYXNlXCI6IG5ldyB2aShFdFtcInBhaW50X2ZpbGwtZXh0cnVzaW9uXCJdW1wiZmlsbC1leHRydXNpb24tYmFzZVwiXSksXG4gICAgICAgIFwiZmlsbC1leHRydXNpb24tdmVydGljYWwtZ3JhZGllbnRcIjogbmV3IG1pKEV0W1wicGFpbnRfZmlsbC1leHRydXNpb25cIl1bXCJmaWxsLWV4dHJ1c2lvbi12ZXJ0aWNhbC1ncmFkaWVudFwiXSlcbiAgICAgIH0pXG4gICAgfSxcbiAgICAgICAgenMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZShlKSB7XG4gICAgICAgIHQuY2FsbCh0aGlzLCBlLCBJcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLmNyZWF0ZUJ1Y2tldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgU3ModCk7XG4gICAgICB9LCBlLnByb3RvdHlwZS5xdWVyeVJhZGl1cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGVvKHRoaXMucGFpbnQuZ2V0KFwiZmlsbC1leHRydXNpb24tdHJhbnNsYXRlXCIpKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmlzM0QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAhMDtcbiAgICAgIH0sIGUucHJvdG90eXBlLnF1ZXJ5SW50ZXJzZWN0c0ZlYXR1cmUgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgYSwgbywgcywgdSkge1xuICAgICAgICB2YXIgbCA9IHJvKHQsIHRoaXMucGFpbnQuZ2V0KFwiZmlsbC1leHRydXNpb24tdHJhbnNsYXRlXCIpLCB0aGlzLnBhaW50LmdldChcImZpbGwtZXh0cnVzaW9uLXRyYW5zbGF0ZS1hbmNob3JcIiksIG8uYW5nbGUsIHMpLFxuICAgICAgICAgICAgcCA9IHRoaXMucGFpbnQuZ2V0KFwiZmlsbC1leHRydXNpb24taGVpZ2h0XCIpLmV2YWx1YXRlKGUsIHIpLFxuICAgICAgICAgICAgYyA9IHRoaXMucGFpbnQuZ2V0KFwiZmlsbC1leHRydXNpb24tYmFzZVwiKS5ldmFsdWF0ZShlLCByKSxcbiAgICAgICAgICAgIGggPSBmdW5jdGlvbiAodCwgZSwgciwgbikge1xuICAgICAgICAgIGZvciAodmFyIGEgPSBbXSwgbyA9IDAsIHMgPSB0OyBvIDwgcy5sZW5ndGg7IG8gKz0gMSkge1xuICAgICAgICAgICAgdmFyIHUgPSBzW29dLFxuICAgICAgICAgICAgICAgIGwgPSBbdS54LCB1LnksIDAsIDFdO1xuICAgICAgICAgICAgcG8obCwgbCwgZSksIGEucHVzaChuZXcgaShsWzBdIC8gbFszXSwgbFsxXSAvIGxbM10pKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gYTtcbiAgICAgICAgfShsLCB1KSxcbiAgICAgICAgICAgIGYgPSBmdW5jdGlvbiAodCwgZSwgciwgbikge1xuICAgICAgICAgIGZvciAodmFyIGEgPSBbXSwgbyA9IFtdLCBzID0gbls4XSAqIGUsIHUgPSBuWzldICogZSwgbCA9IG5bMTBdICogZSwgcCA9IG5bMTFdICogZSwgYyA9IG5bOF0gKiByLCBoID0gbls5XSAqIHIsIGYgPSBuWzEwXSAqIHIsIHkgPSBuWzExXSAqIHIsIGQgPSAwLCBtID0gdDsgZCA8IG0ubGVuZ3RoOyBkICs9IDEpIHtcbiAgICAgICAgICAgIGZvciAodmFyIHYgPSBbXSwgZyA9IFtdLCB4ID0gMCwgYiA9IG1bZF07IHggPCBiLmxlbmd0aDsgeCArPSAxKSB7XG4gICAgICAgICAgICAgIHZhciB3ID0gYlt4XSxcbiAgICAgICAgICAgICAgICAgIF8gPSB3LngsXG4gICAgICAgICAgICAgICAgICBBID0gdy55LFxuICAgICAgICAgICAgICAgICAgUyA9IG5bMF0gKiBfICsgbls0XSAqIEEgKyBuWzEyXSxcbiAgICAgICAgICAgICAgICAgIGsgPSBuWzFdICogXyArIG5bNV0gKiBBICsgblsxM10sXG4gICAgICAgICAgICAgICAgICBJID0gblsyXSAqIF8gKyBuWzZdICogQSArIG5bMTRdLFxuICAgICAgICAgICAgICAgICAgeiA9IG5bM10gKiBfICsgbls3XSAqIEEgKyBuWzE1XSxcbiAgICAgICAgICAgICAgICAgIEMgPSBJICsgbCxcbiAgICAgICAgICAgICAgICAgIEUgPSB6ICsgcCxcbiAgICAgICAgICAgICAgICAgIFAgPSBTICsgYyxcbiAgICAgICAgICAgICAgICAgIE0gPSBrICsgaCxcbiAgICAgICAgICAgICAgICAgIEIgPSBJICsgZixcbiAgICAgICAgICAgICAgICAgIFQgPSB6ICsgeSxcbiAgICAgICAgICAgICAgICAgIFYgPSBuZXcgaSgoUyArIHMpIC8gRSwgKGsgKyB1KSAvIEUpO1xuICAgICAgICAgICAgICBWLnogPSBDIC8gRSwgdi5wdXNoKFYpO1xuICAgICAgICAgICAgICB2YXIgRiA9IG5ldyBpKFAgLyBULCBNIC8gVCk7XG4gICAgICAgICAgICAgIEYueiA9IEIgLyBULCBnLnB1c2goRik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGEucHVzaCh2KSwgby5wdXNoKGcpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBbYSwgb107XG4gICAgICAgIH0obiwgYywgcCwgdSk7XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICAgICAgdmFyIG4gPSAxIC8gMDtcbiAgICAgICAgICBHYShyLCBlKSAmJiAobiA9IEVzKHIsIGVbMF0pKTtcblxuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZm9yICh2YXIgYSA9IGVbaV0sIG8gPSB0W2ldLCBzID0gMDsgcyA8IGEubGVuZ3RoIC0gMTsgcysrKSB7XG4gICAgICAgICAgICAgIHZhciB1ID0gYVtzXSxcbiAgICAgICAgICAgICAgICAgIGwgPSBbdSwgYVtzICsgMV0sIG9bcyArIDFdLCBvW3NdLCB1XTtcbiAgICAgICAgICAgICAgTmEociwgbCkgJiYgKG4gPSBNYXRoLm1pbihuLCBFcyhyLCBsKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBuICE9PSAxIC8gMCAmJiBuO1xuICAgICAgICB9KGZbMF0sIGZbMV0sIGgpO1xuICAgICAgfSwgZTtcbiAgICB9KF9pKTtcblxuICAgIGZ1bmN0aW9uIENzKHQsIGUpIHtcbiAgICAgIHJldHVybiB0LnggKiBlLnggKyB0LnkgKiBlLnk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gRXModCwgZSkge1xuICAgICAgaWYgKDEgPT09IHQubGVuZ3RoKSB7XG4gICAgICAgIGZvciAodmFyIHIsIG4gPSAwLCBpID0gZVtuKytdOyAhciB8fCBpLmVxdWFscyhyKTspIHtcbiAgICAgICAgICBpZiAoIShyID0gZVtuKytdKSkgcmV0dXJuIDEgLyAwO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICg7IG4gPCBlLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdmFyIGEgPSBlW25dLFxuICAgICAgICAgICAgICBvID0gdFswXSxcbiAgICAgICAgICAgICAgcyA9IHIuc3ViKGkpLFxuICAgICAgICAgICAgICB1ID0gYS5zdWIoaSksXG4gICAgICAgICAgICAgIGwgPSBvLnN1YihpKSxcbiAgICAgICAgICAgICAgcCA9IENzKHMsIHMpLFxuICAgICAgICAgICAgICBjID0gQ3MocywgdSksXG4gICAgICAgICAgICAgIGggPSBDcyh1LCB1KSxcbiAgICAgICAgICAgICAgZiA9IENzKGwsIHMpLFxuICAgICAgICAgICAgICB5ID0gQ3MobCwgdSksXG4gICAgICAgICAgICAgIGQgPSBwICogaCAtIGMgKiBjLFxuICAgICAgICAgICAgICBtID0gKGggKiBmIC0gYyAqIHkpIC8gZCxcbiAgICAgICAgICAgICAgdiA9IChwICogeSAtIGMgKiBmKSAvIGQsXG4gICAgICAgICAgICAgIGcgPSBpLnogKiAoMSAtIG0gLSB2KSArIHIueiAqIG0gKyBhLnogKiB2O1xuICAgICAgICAgIGlmIChpc0Zpbml0ZShnKSkgcmV0dXJuIGc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gMSAvIDA7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIHggPSAxIC8gMCwgYiA9IDAsIHcgPSBlOyBiIDwgdy5sZW5ndGg7IGIgKz0gMSkge1xuICAgICAgICB4ID0gTWF0aC5taW4oeCwgd1tiXS56KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHg7XG4gICAgfVxuXG4gICAgdmFyIFBzID0gSWkoW3tcbiAgICAgIG5hbWU6IFwiYV9wb3Nfbm9ybWFsXCIsXG4gICAgICBjb21wb25lbnRzOiAyLFxuICAgICAgdHlwZTogXCJJbnQxNlwiXG4gICAgfSwge1xuICAgICAgbmFtZTogXCJhX2RhdGFcIixcbiAgICAgIGNvbXBvbmVudHM6IDQsXG4gICAgICB0eXBlOiBcIlVpbnQ4XCJcbiAgICB9XSwgNCkubWVtYmVycyxcbiAgICAgICAgTXMgPSBJaShbe1xuICAgICAgbmFtZTogXCJhX3V2X3hcIixcbiAgICAgIGNvbXBvbmVudHM6IDEsXG4gICAgICB0eXBlOiBcIkZsb2F0MzJcIlxuICAgIH0sIHtcbiAgICAgIG5hbWU6IFwiYV9zcGxpdF9pbmRleFwiLFxuICAgICAgY29tcG9uZW50czogMSxcbiAgICAgIHR5cGU6IFwiRmxvYXQzMlwiXG4gICAgfV0pLm1lbWJlcnMsXG4gICAgICAgIEJzID0gYnMuVmVjdG9yVGlsZUZlYXR1cmUudHlwZXMsXG4gICAgICAgIFRzID0gTWF0aC5jb3MoTWF0aC5QSSAvIDE4MCAqIDM3LjUpLFxuICAgICAgICBWcyA9IE1hdGgucG93KDIsIDE0KSAvIC41LFxuICAgICAgICBGcyA9IGZ1bmN0aW9uIEZzKHQpIHtcbiAgICAgIHZhciBlID0gdGhpcztcbiAgICAgIHRoaXMuem9vbSA9IHQuem9vbSwgdGhpcy5vdmVyc2NhbGluZyA9IHQub3ZlcnNjYWxpbmcsIHRoaXMubGF5ZXJzID0gdC5sYXllcnMsIHRoaXMubGF5ZXJJZHMgPSB0aGlzLmxheWVycy5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQuaWQ7XG4gICAgICB9KSwgdGhpcy5pbmRleCA9IHQuaW5kZXgsIHRoaXMuaGFzUGF0dGVybiA9ICExLCB0aGlzLnBhdHRlcm5GZWF0dXJlcyA9IFtdLCB0aGlzLmxpbmVDbGlwc0FycmF5ID0gW10sIHRoaXMuZ3JhZGllbnRzID0ge30sIHRoaXMubGF5ZXJzLmZvckVhY2goZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgZS5ncmFkaWVudHNbdC5pZF0gPSB7fTtcbiAgICAgIH0pLCB0aGlzLmxheW91dFZlcnRleEFycmF5ID0gbmV3IE1pKCksIHRoaXMubGF5b3V0VmVydGV4QXJyYXkyID0gbmV3IEJpKCksIHRoaXMuaW5kZXhBcnJheSA9IG5ldyBqaSgpLCB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucyA9IG5ldyBWYSh0LmxheWVycywgdC56b29tKSwgdGhpcy5zZWdtZW50cyA9IG5ldyBzYSgpLCB0aGlzLm1heExpbmVMZW5ndGggPSAwLCB0aGlzLnN0YXRlRGVwZW5kZW50TGF5ZXJJZHMgPSB0aGlzLmxheWVycy5maWx0ZXIoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQuaXNTdGF0ZURlcGVuZGVudCgpO1xuICAgICAgfSkubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0LmlkO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIEZzLnByb3RvdHlwZS5wb3B1bGF0ZSA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICB0aGlzLmhhc1BhdHRlcm4gPSBhcyhcImxpbmVcIiwgdGhpcy5sYXllcnMsIGUpO1xuXG4gICAgICBmb3IgKHZhciBuID0gdGhpcy5sYXllcnNbMF0ubGF5b3V0LmdldChcImxpbmUtc29ydC1rZXlcIiksIGkgPSBbXSwgYSA9IDAsIG8gPSB0OyBhIDwgby5sZW5ndGg7IGEgKz0gMSkge1xuICAgICAgICB2YXIgcyA9IG9bYV0sXG4gICAgICAgICAgICB1ID0gcy5mZWF0dXJlLFxuICAgICAgICAgICAgbCA9IHMuaWQsXG4gICAgICAgICAgICBwID0gcy5pbmRleCxcbiAgICAgICAgICAgIGMgPSBzLnNvdXJjZUxheWVySW5kZXgsXG4gICAgICAgICAgICBoID0gdGhpcy5sYXllcnNbMF0uX2ZlYXR1cmVGaWx0ZXIubmVlZEdlb21ldHJ5LFxuICAgICAgICAgICAgZiA9IFVhKHUsIGgpO1xuXG4gICAgICAgIGlmICh0aGlzLmxheWVyc1swXS5fZmVhdHVyZUZpbHRlci5maWx0ZXIobmV3IHNpKHRoaXMuem9vbSksIGYsIHIpKSB7XG4gICAgICAgICAgdmFyIHkgPSBuID8gbi5ldmFsdWF0ZShmLCB7fSwgcikgOiB2b2lkIDAsXG4gICAgICAgICAgICAgIGQgPSB7XG4gICAgICAgICAgICBpZDogbCxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHUucHJvcGVydGllcyxcbiAgICAgICAgICAgIHR5cGU6IHUudHlwZSxcbiAgICAgICAgICAgIHNvdXJjZUxheWVySW5kZXg6IGMsXG4gICAgICAgICAgICBpbmRleDogcCxcbiAgICAgICAgICAgIGdlb21ldHJ5OiBoID8gZi5nZW9tZXRyeSA6IFJhKHUpLFxuICAgICAgICAgICAgcGF0dGVybnM6IHt9LFxuICAgICAgICAgICAgc29ydEtleTogeVxuICAgICAgICAgIH07XG4gICAgICAgICAgaS5wdXNoKGQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG4gJiYgaS5zb3J0KGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0LnNvcnRLZXkgLSBlLnNvcnRLZXk7XG4gICAgICB9KTtcblxuICAgICAgZm9yICh2YXIgbSA9IDAsIHYgPSBpOyBtIDwgdi5sZW5ndGg7IG0gKz0gMSkge1xuICAgICAgICB2YXIgZyA9IHZbbV0sXG4gICAgICAgICAgICB4ID0gZy5nZW9tZXRyeSxcbiAgICAgICAgICAgIGIgPSBnLmluZGV4LFxuICAgICAgICAgICAgdyA9IGcuc291cmNlTGF5ZXJJbmRleDtcblxuICAgICAgICBpZiAodGhpcy5oYXNQYXR0ZXJuKSB7XG4gICAgICAgICAgdmFyIF8gPSBvcyhcImxpbmVcIiwgdGhpcy5sYXllcnMsIGcsIHRoaXMuem9vbSwgZSk7XG5cbiAgICAgICAgICB0aGlzLnBhdHRlcm5GZWF0dXJlcy5wdXNoKF8pO1xuICAgICAgICB9IGVsc2UgdGhpcy5hZGRGZWF0dXJlKGcsIHgsIGIsIHIsIHt9KTtcblxuICAgICAgICBlLmZlYXR1cmVJbmRleC5pbnNlcnQodFtiXS5mZWF0dXJlLCB4LCBiLCB3LCB0aGlzLmluZGV4KTtcbiAgICAgIH1cbiAgICB9LCBGcy5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgIHRoaXMuc3RhdGVEZXBlbmRlbnRMYXllcnMubGVuZ3RoICYmIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnVwZGF0ZVBhaW50QXJyYXlzKHQsIGUsIHRoaXMuc3RhdGVEZXBlbmRlbnRMYXllcnMsIHIpO1xuICAgIH0sIEZzLnByb3RvdHlwZS5hZGRGZWF0dXJlcyA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICBmb3IgKHZhciBuID0gMCwgaSA9IHRoaXMucGF0dGVybkZlYXR1cmVzOyBuIDwgaS5sZW5ndGg7IG4gKz0gMSkge1xuICAgICAgICB2YXIgYSA9IGlbbl07XG4gICAgICAgIHRoaXMuYWRkRmVhdHVyZShhLCBhLmdlb21ldHJ5LCBhLmluZGV4LCBlLCByKTtcbiAgICAgIH1cbiAgICB9LCBGcy5wcm90b3R5cGUuaXNFbXB0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAwID09PSB0aGlzLmxheW91dFZlcnRleEFycmF5Lmxlbmd0aDtcbiAgICB9LCBGcy5wcm90b3R5cGUudXBsb2FkUGVuZGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhdGhpcy51cGxvYWRlZCB8fCB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5uZWVkc1VwbG9hZDtcbiAgICB9LCBGcy5wcm90b3R5cGUudXBsb2FkID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHRoaXMudXBsb2FkZWQgfHwgKDAgIT09IHRoaXMubGF5b3V0VmVydGV4QXJyYXkyLmxlbmd0aCAmJiAodGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIyID0gdC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheTIsIE1zKSksIHRoaXMubGF5b3V0VmVydGV4QnVmZmVyID0gdC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgUHMpLCB0aGlzLmluZGV4QnVmZmVyID0gdC5jcmVhdGVJbmRleEJ1ZmZlcih0aGlzLmluZGV4QXJyYXkpKSwgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMudXBsb2FkKHQpLCB0aGlzLnVwbG9hZGVkID0gITA7XG4gICAgfSwgRnMucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLmxheW91dFZlcnRleEJ1ZmZlciAmJiAodGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIuZGVzdHJveSgpLCB0aGlzLmluZGV4QnVmZmVyLmRlc3Ryb3koKSwgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMuZGVzdHJveSgpLCB0aGlzLnNlZ21lbnRzLmRlc3Ryb3koKSk7XG4gICAgfSwgRnMucHJvdG90eXBlLmxpbmVGZWF0dXJlQ2xpcHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgaWYgKHQucHJvcGVydGllcyAmJiB0LnByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoXCJtYXBib3hfY2xpcF9zdGFydFwiKSAmJiB0LnByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoXCJtYXBib3hfY2xpcF9lbmRcIikpIHJldHVybiB7XG4gICAgICAgIHN0YXJ0OiArdC5wcm9wZXJ0aWVzLm1hcGJveF9jbGlwX3N0YXJ0LFxuICAgICAgICBlbmQ6ICt0LnByb3BlcnRpZXMubWFwYm94X2NsaXBfZW5kXG4gICAgICB9O1xuICAgIH0sIEZzLnByb3RvdHlwZS5hZGRGZWF0dXJlID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGkpIHtcbiAgICAgIHZhciBhID0gdGhpcy5sYXllcnNbMF0ubGF5b3V0LFxuICAgICAgICAgIG8gPSBhLmdldChcImxpbmUtam9pblwiKS5ldmFsdWF0ZSh0LCB7fSksXG4gICAgICAgICAgcyA9IGEuZ2V0KFwibGluZS1jYXBcIiksXG4gICAgICAgICAgdSA9IGEuZ2V0KFwibGluZS1taXRlci1saW1pdFwiKSxcbiAgICAgICAgICBsID0gYS5nZXQoXCJsaW5lLXJvdW5kLWxpbWl0XCIpO1xuICAgICAgdGhpcy5saW5lQ2xpcHMgPSB0aGlzLmxpbmVGZWF0dXJlQ2xpcHModCk7XG5cbiAgICAgIGZvciAodmFyIHAgPSAwLCBjID0gZTsgcCA8IGMubGVuZ3RoOyBwICs9IDEpIHtcbiAgICAgICAgdGhpcy5hZGRMaW5lKGNbcF0sIHQsIG8sIHMsIHUsIGwpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5wb3B1bGF0ZVBhaW50QXJyYXlzKHRoaXMubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoLCB0LCByLCBpLCBuKTtcbiAgICB9LCBGcy5wcm90b3R5cGUuYWRkTGluZSA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpLCBhKSB7XG4gICAgICBpZiAodGhpcy5kaXN0YW5jZSA9IDAsIHRoaXMuc2NhbGVkRGlzdGFuY2UgPSAwLCB0aGlzLnRvdGFsRGlzdGFuY2UgPSAwLCB0aGlzLmxpbmVDbGlwcykge1xuICAgICAgICB0aGlzLmxpbmVDbGlwc0FycmF5LnB1c2godGhpcy5saW5lQ2xpcHMpO1xuXG4gICAgICAgIGZvciAodmFyIG8gPSAwOyBvIDwgdC5sZW5ndGggLSAxOyBvKyspIHtcbiAgICAgICAgICB0aGlzLnRvdGFsRGlzdGFuY2UgKz0gdFtvXS5kaXN0KHRbbyArIDFdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlU2NhbGVkRGlzdGFuY2UoKSwgdGhpcy5tYXhMaW5lTGVuZ3RoID0gTWF0aC5tYXgodGhpcy5tYXhMaW5lTGVuZ3RoLCB0aGlzLnRvdGFsRGlzdGFuY2UpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBzID0gXCJQb2x5Z29uXCIgPT09IEJzW2UudHlwZV0sIHUgPSB0Lmxlbmd0aDsgdSA+PSAyICYmIHRbdSAtIDFdLmVxdWFscyh0W3UgLSAyXSk7KSB7XG4gICAgICAgIHUtLTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgbCA9IDA7IGwgPCB1IC0gMSAmJiB0W2xdLmVxdWFscyh0W2wgKyAxXSk7KSB7XG4gICAgICAgIGwrKztcbiAgICAgIH1cblxuICAgICAgaWYgKCEodSA8IChzID8gMyA6IDIpKSkge1xuICAgICAgICBcImJldmVsXCIgPT09IHIgJiYgKGkgPSAxLjA1KTtcbiAgICAgICAgdmFyIHAsXG4gICAgICAgICAgICBjID0gdGhpcy5vdmVyc2NhbGluZyA8PSAxNiA/IDEyMjg4MCAvICg1MTIgKiB0aGlzLm92ZXJzY2FsaW5nKSA6IDAsXG4gICAgICAgICAgICBoID0gdGhpcy5zZWdtZW50cy5wcmVwYXJlU2VnbWVudCgxMCAqIHUsIHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHRoaXMuaW5kZXhBcnJheSksXG4gICAgICAgICAgICBmID0gdm9pZCAwLFxuICAgICAgICAgICAgeSA9IHZvaWQgMCxcbiAgICAgICAgICAgIGQgPSB2b2lkIDAsXG4gICAgICAgICAgICBtID0gdm9pZCAwO1xuICAgICAgICB0aGlzLmUxID0gdGhpcy5lMiA9IC0xLCBzICYmIChtID0gdFtsXS5zdWIocCA9IHRbdSAtIDJdKS5fdW5pdCgpLl9wZXJwKCkpO1xuXG4gICAgICAgIGZvciAodmFyIHYgPSBsOyB2IDwgdTsgdisrKSB7XG4gICAgICAgICAgaWYgKCEoeSA9IHYgPT09IHUgLSAxID8gcyA/IHRbbCArIDFdIDogdm9pZCAwIDogdFt2ICsgMV0pIHx8ICF0W3ZdLmVxdWFscyh5KSkge1xuICAgICAgICAgICAgbSAmJiAoZCA9IG0pLCBwICYmIChmID0gcCksIHAgPSB0W3ZdLCBtID0geSA/IHkuc3ViKHApLl91bml0KCkuX3BlcnAoKSA6IGQ7XG4gICAgICAgICAgICB2YXIgZyA9IChkID0gZCB8fCBtKS5hZGQobSk7XG4gICAgICAgICAgICAwID09PSBnLnggJiYgMCA9PT0gZy55IHx8IGcuX3VuaXQoKTtcblxuICAgICAgICAgICAgdmFyIHggPSBkLnggKiBtLnggKyBkLnkgKiBtLnksXG4gICAgICAgICAgICAgICAgYiA9IGcueCAqIG0ueCArIGcueSAqIG0ueSxcbiAgICAgICAgICAgICAgICB3ID0gMCAhPT0gYiA/IDEgLyBiIDogMSAvIDAsXG4gICAgICAgICAgICAgICAgXyA9IDIgKiBNYXRoLnNxcnQoMiAtIDIgKiBiKSxcbiAgICAgICAgICAgICAgICBBID0gYiA8IFRzICYmIGYgJiYgeSxcbiAgICAgICAgICAgICAgICBTID0gZC54ICogbS55IC0gZC55ICogbS54ID4gMDtcblxuICAgICAgICAgICAgaWYgKEEgJiYgdiA+IGwpIHtcbiAgICAgICAgICAgICAgdmFyIGsgPSBwLmRpc3QoZik7XG5cbiAgICAgICAgICAgICAgaWYgKGsgPiAyICogYykge1xuICAgICAgICAgICAgICAgIHZhciBJID0gcC5zdWIocC5zdWIoZikuX211bHQoYyAvIGspLl9yb3VuZCgpKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZURpc3RhbmNlKGYsIEkpLCB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoSSwgZCwgMCwgMCwgaCksIGYgPSBJO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciB6ID0gZiAmJiB5LFxuICAgICAgICAgICAgICAgIEMgPSB6ID8gciA6IHMgPyBcImJ1dHRcIiA6IG47XG4gICAgICAgICAgICBpZiAoeiAmJiBcInJvdW5kXCIgPT09IEMgJiYgKHcgPCBhID8gQyA9IFwibWl0ZXJcIiA6IHcgPD0gMiAmJiAoQyA9IFwiZmFrZXJvdW5kXCIpKSwgXCJtaXRlclwiID09PSBDICYmIHcgPiBpICYmIChDID0gXCJiZXZlbFwiKSwgXCJiZXZlbFwiID09PSBDICYmICh3ID4gMiAmJiAoQyA9IFwiZmxpcGJldmVsXCIpLCB3IDwgaSAmJiAoQyA9IFwibWl0ZXJcIikpLCBmICYmIHRoaXMudXBkYXRlRGlzdGFuY2UoZiwgcCksIFwibWl0ZXJcIiA9PT0gQykgZy5fbXVsdCh3KSwgdGhpcy5hZGRDdXJyZW50VmVydGV4KHAsIGcsIDAsIDAsIGgpO2Vsc2UgaWYgKFwiZmxpcGJldmVsXCIgPT09IEMpIHtcbiAgICAgICAgICAgICAgaWYgKHcgPiAxMDApIGcgPSBtLm11bHQoLTEpO2Vsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBFID0gdyAqIGQuYWRkKG0pLm1hZygpIC8gZC5zdWIobSkubWFnKCk7XG5cbiAgICAgICAgICAgICAgICBnLl9wZXJwKCkuX211bHQoRSAqIChTID8gLTEgOiAxKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KHAsIGcsIDAsIDAsIGgpLCB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgocCwgZy5tdWx0KC0xKSwgMCwgMCwgaCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFwiYmV2ZWxcIiA9PT0gQyB8fCBcImZha2Vyb3VuZFwiID09PSBDKSB7XG4gICAgICAgICAgICAgIHZhciBQID0gLU1hdGguc3FydCh3ICogdyAtIDEpLFxuICAgICAgICAgICAgICAgICAgTSA9IFMgPyBQIDogMCxcbiAgICAgICAgICAgICAgICAgIEIgPSBTID8gMCA6IFA7XG4gICAgICAgICAgICAgIGlmIChmICYmIHRoaXMuYWRkQ3VycmVudFZlcnRleChwLCBkLCBNLCBCLCBoKSwgXCJmYWtlcm91bmRcIiA9PT0gQykgZm9yICh2YXIgVCA9IE1hdGgucm91bmQoMTgwICogXyAvIE1hdGguUEkgLyAyMCksIFYgPSAxOyBWIDwgVDsgVisrKSB7XG4gICAgICAgICAgICAgICAgdmFyIEYgPSBWIC8gVDtcblxuICAgICAgICAgICAgICAgIGlmICguNSAhPT0gRikge1xuICAgICAgICAgICAgICAgICAgdmFyIEQgPSBGIC0gLjU7XG4gICAgICAgICAgICAgICAgICBGICs9IEYgKiBEICogKEYgLSAxKSAqICgoMS4wOTA0ICsgeCAqICh4ICogKDMuNTU2NDUgLSAxLjQzNTE5ICogeCkgLSAzLjI0NTIpKSAqIEQgKiBEICsgKC44NDgwMTMgKyB4ICogKC4yMTU2MzggKiB4IC0gMS4wNjAyMSkpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgTCA9IG0uc3ViKGQpLl9tdWx0KEYpLl9hZGQoZCkuX3VuaXQoKS5fbXVsdChTID8gLTEgOiAxKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuYWRkSGFsZlZlcnRleChwLCBMLngsIEwueSwgITEsIFMsIDAsIGgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHkgJiYgdGhpcy5hZGRDdXJyZW50VmVydGV4KHAsIG0sIC1NLCAtQiwgaCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFwiYnV0dFwiID09PSBDKSB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgocCwgZywgMCwgMCwgaCk7ZWxzZSBpZiAoXCJzcXVhcmVcIiA9PT0gQykge1xuICAgICAgICAgICAgICB2YXIgTyA9IGYgPyAxIDogLTE7XG4gICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChwLCBnLCBPLCBPLCBoKTtcbiAgICAgICAgICAgIH0gZWxzZSBcInJvdW5kXCIgPT09IEMgJiYgKGYgJiYgKHRoaXMuYWRkQ3VycmVudFZlcnRleChwLCBkLCAwLCAwLCBoKSwgdGhpcy5hZGRDdXJyZW50VmVydGV4KHAsIGQsIDEsIDEsIGgsICEwKSksIHkgJiYgKHRoaXMuYWRkQ3VycmVudFZlcnRleChwLCBtLCAtMSwgLTEsIGgsICEwKSwgdGhpcy5hZGRDdXJyZW50VmVydGV4KHAsIG0sIDAsIDAsIGgpKSk7XG5cbiAgICAgICAgICAgIGlmIChBICYmIHYgPCB1IC0gMSkge1xuICAgICAgICAgICAgICB2YXIgUiA9IHAuZGlzdCh5KTtcblxuICAgICAgICAgICAgICBpZiAoUiA+IDIgKiBjKSB7XG4gICAgICAgICAgICAgICAgdmFyIFUgPSBwLmFkZCh5LnN1YihwKS5fbXVsdChjIC8gUikuX3JvdW5kKCkpO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRGlzdGFuY2UocCwgVSksIHRoaXMuYWRkQ3VycmVudFZlcnRleChVLCBtLCAwLCAwLCBoKSwgcCA9IFU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBGcy5wcm90b3R5cGUuYWRkQ3VycmVudFZlcnRleCA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpLCBhKSB7XG4gICAgICB2b2lkIDAgPT09IGEgJiYgKGEgPSAhMSk7XG4gICAgICB2YXIgbyA9IGUueSAqIG4gLSBlLngsXG4gICAgICAgICAgcyA9IC1lLnkgLSBlLnggKiBuO1xuICAgICAgdGhpcy5hZGRIYWxmVmVydGV4KHQsIGUueCArIGUueSAqIHIsIGUueSAtIGUueCAqIHIsIGEsICExLCByLCBpKSwgdGhpcy5hZGRIYWxmVmVydGV4KHQsIG8sIHMsIGEsICEwLCAtbiwgaSksIHRoaXMuZGlzdGFuY2UgPiBWcyAvIDIgJiYgMCA9PT0gdGhpcy50b3RhbERpc3RhbmNlICYmICh0aGlzLmRpc3RhbmNlID0gMCwgdGhpcy5hZGRDdXJyZW50VmVydGV4KHQsIGUsIHIsIG4sIGksIGEpKTtcbiAgICB9LCBGcy5wcm90b3R5cGUuYWRkSGFsZlZlcnRleCA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpLCBhLCBvKSB7XG4gICAgICB2YXIgcyA9IC41ICogKHRoaXMubGluZUNsaXBzID8gdGhpcy5zY2FsZWREaXN0YW5jZSAqIChWcyAtIDEpIDogdGhpcy5zY2FsZWREaXN0YW5jZSk7XG4gICAgICB0aGlzLmxheW91dFZlcnRleEFycmF5LmVtcGxhY2VCYWNrKCh0LnggPDwgMSkgKyAobiA/IDEgOiAwKSwgKHQueSA8PCAxKSArIChpID8gMSA6IDApLCBNYXRoLnJvdW5kKDYzICogZSkgKyAxMjgsIE1hdGgucm91bmQoNjMgKiByKSArIDEyOCwgMSArICgwID09PSBhID8gMCA6IGEgPCAwID8gLTEgOiAxKSB8ICg2MyAmIHMpIDw8IDIsIHMgPj4gNiksIHRoaXMubGluZUNsaXBzICYmIHRoaXMubGF5b3V0VmVydGV4QXJyYXkyLmVtcGxhY2VCYWNrKCh0aGlzLnNjYWxlZERpc3RhbmNlIC0gdGhpcy5saW5lQ2xpcHMuc3RhcnQpIC8gKHRoaXMubGluZUNsaXBzLmVuZCAtIHRoaXMubGluZUNsaXBzLnN0YXJ0KSwgdGhpcy5saW5lQ2xpcHNBcnJheS5sZW5ndGgpO1xuICAgICAgdmFyIHUgPSBvLnZlcnRleExlbmd0aCsrO1xuICAgICAgdGhpcy5lMSA+PSAwICYmIHRoaXMuZTIgPj0gMCAmJiAodGhpcy5pbmRleEFycmF5LmVtcGxhY2VCYWNrKHRoaXMuZTEsIHRoaXMuZTIsIHUpLCBvLnByaW1pdGl2ZUxlbmd0aCsrKSwgaSA/IHRoaXMuZTIgPSB1IDogdGhpcy5lMSA9IHU7XG4gICAgfSwgRnMucHJvdG90eXBlLnVwZGF0ZVNjYWxlZERpc3RhbmNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5zY2FsZWREaXN0YW5jZSA9IHRoaXMubGluZUNsaXBzID8gdGhpcy5saW5lQ2xpcHMuc3RhcnQgKyAodGhpcy5saW5lQ2xpcHMuZW5kIC0gdGhpcy5saW5lQ2xpcHMuc3RhcnQpICogdGhpcy5kaXN0YW5jZSAvIHRoaXMudG90YWxEaXN0YW5jZSA6IHRoaXMuZGlzdGFuY2U7XG4gICAgfSwgRnMucHJvdG90eXBlLnVwZGF0ZURpc3RhbmNlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHRoaXMuZGlzdGFuY2UgKz0gdC5kaXN0KGUpLCB0aGlzLnVwZGF0ZVNjYWxlZERpc3RhbmNlKCk7XG4gICAgfSwgT24oXCJMaW5lQnVja2V0XCIsIEZzLCB7XG4gICAgICBvbWl0OiBbXCJsYXllcnNcIiwgXCJwYXR0ZXJuRmVhdHVyZXNcIl1cbiAgICB9KTtcbiAgICB2YXIgRHMgPSBuZXcgd2koe1xuICAgICAgXCJsaW5lLWNhcFwiOiBuZXcgbWkoRXQubGF5b3V0X2xpbmVbXCJsaW5lLWNhcFwiXSksXG4gICAgICBcImxpbmUtam9pblwiOiBuZXcgdmkoRXQubGF5b3V0X2xpbmVbXCJsaW5lLWpvaW5cIl0pLFxuICAgICAgXCJsaW5lLW1pdGVyLWxpbWl0XCI6IG5ldyBtaShFdC5sYXlvdXRfbGluZVtcImxpbmUtbWl0ZXItbGltaXRcIl0pLFxuICAgICAgXCJsaW5lLXJvdW5kLWxpbWl0XCI6IG5ldyBtaShFdC5sYXlvdXRfbGluZVtcImxpbmUtcm91bmQtbGltaXRcIl0pLFxuICAgICAgXCJsaW5lLXNvcnQta2V5XCI6IG5ldyB2aShFdC5sYXlvdXRfbGluZVtcImxpbmUtc29ydC1rZXlcIl0pXG4gICAgfSksXG4gICAgICAgIExzID0ge1xuICAgICAgcGFpbnQ6IG5ldyB3aSh7XG4gICAgICAgIFwibGluZS1vcGFjaXR5XCI6IG5ldyB2aShFdC5wYWludF9saW5lW1wibGluZS1vcGFjaXR5XCJdKSxcbiAgICAgICAgXCJsaW5lLWNvbG9yXCI6IG5ldyB2aShFdC5wYWludF9saW5lW1wibGluZS1jb2xvclwiXSksXG4gICAgICAgIFwibGluZS10cmFuc2xhdGVcIjogbmV3IG1pKEV0LnBhaW50X2xpbmVbXCJsaW5lLXRyYW5zbGF0ZVwiXSksXG4gICAgICAgIFwibGluZS10cmFuc2xhdGUtYW5jaG9yXCI6IG5ldyBtaShFdC5wYWludF9saW5lW1wibGluZS10cmFuc2xhdGUtYW5jaG9yXCJdKSxcbiAgICAgICAgXCJsaW5lLXdpZHRoXCI6IG5ldyB2aShFdC5wYWludF9saW5lW1wibGluZS13aWR0aFwiXSksXG4gICAgICAgIFwibGluZS1nYXAtd2lkdGhcIjogbmV3IHZpKEV0LnBhaW50X2xpbmVbXCJsaW5lLWdhcC13aWR0aFwiXSksXG4gICAgICAgIFwibGluZS1vZmZzZXRcIjogbmV3IHZpKEV0LnBhaW50X2xpbmVbXCJsaW5lLW9mZnNldFwiXSksXG4gICAgICAgIFwibGluZS1ibHVyXCI6IG5ldyB2aShFdC5wYWludF9saW5lW1wibGluZS1ibHVyXCJdKSxcbiAgICAgICAgXCJsaW5lLWRhc2hhcnJheVwiOiBuZXcgeGkoRXQucGFpbnRfbGluZVtcImxpbmUtZGFzaGFycmF5XCJdKSxcbiAgICAgICAgXCJsaW5lLXBhdHRlcm5cIjogbmV3IGdpKEV0LnBhaW50X2xpbmVbXCJsaW5lLXBhdHRlcm5cIl0pLFxuICAgICAgICBcImxpbmUtZ3JhZGllbnRcIjogbmV3IGJpKEV0LnBhaW50X2xpbmVbXCJsaW5lLWdyYWRpZW50XCJdKVxuICAgICAgfSksXG4gICAgICBsYXlvdXQ6IERzXG4gICAgfSxcbiAgICAgICAgT3MgPSBuZXcgKGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLnBvc3NpYmx5RXZhbHVhdGUgPSBmdW5jdGlvbiAoZSwgcikge1xuICAgICAgICByZXR1cm4gciA9IG5ldyBzaShNYXRoLmZsb29yKHIuem9vbSksIHtcbiAgICAgICAgICBub3c6IHIubm93LFxuICAgICAgICAgIGZhZGVEdXJhdGlvbjogci5mYWRlRHVyYXRpb24sXG4gICAgICAgICAgem9vbUhpc3Rvcnk6IHIuem9vbUhpc3RvcnksXG4gICAgICAgICAgdHJhbnNpdGlvbjogci50cmFuc2l0aW9uXG4gICAgICAgIH0pLCB0LnByb3RvdHlwZS5wb3NzaWJseUV2YWx1YXRlLmNhbGwodGhpcywgZSwgcik7XG4gICAgICB9LCBlLnByb3RvdHlwZS5ldmFsdWF0ZSA9IGZ1bmN0aW9uIChlLCByLCBuLCBpKSB7XG4gICAgICAgIHJldHVybiByID0gaCh7fSwgciwge1xuICAgICAgICAgIHpvb206IE1hdGguZmxvb3Ioci56b29tKVxuICAgICAgICB9KSwgdC5wcm90b3R5cGUuZXZhbHVhdGUuY2FsbCh0aGlzLCBlLCByLCBuLCBpKTtcbiAgICAgIH0sIGU7XG4gICAgfSh2aSkpKExzLnBhaW50LnByb3BlcnRpZXNbXCJsaW5lLXdpZHRoXCJdLnNwZWNpZmljYXRpb24pO1xuICAgIE9zLnVzZUludGVnZXJab29tID0gITA7XG5cbiAgICB2YXIgUnMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZShlKSB7XG4gICAgICAgIHQuY2FsbCh0aGlzLCBlLCBMcyksIHRoaXMuZ3JhZGllbnRWZXJzaW9uID0gMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuX2hhbmRsZVNwZWNpYWxQYWludFByb3BlcnR5VXBkYXRlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgXCJsaW5lLWdyYWRpZW50XCIgPT09IHQgJiYgKHRoaXMuc3RlcEludGVycG9sYW50ID0gdGhpcy5fdHJhbnNpdGlvbmFibGVQYWludC5fdmFsdWVzW1wibGluZS1ncmFkaWVudFwiXS52YWx1ZS5leHByZXNzaW9uLl9zdHlsZUV4cHJlc3Npb24uZXhwcmVzc2lvbiBpbnN0YW5jZW9mIE5lLCB0aGlzLmdyYWRpZW50VmVyc2lvbiA9ICh0aGlzLmdyYWRpZW50VmVyc2lvbiArIDEpICUgcyk7XG4gICAgICB9LCBlLnByb3RvdHlwZS5ncmFkaWVudEV4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50Ll92YWx1ZXNbXCJsaW5lLWdyYWRpZW50XCJdLnZhbHVlLmV4cHJlc3Npb247XG4gICAgICB9LCBlLnByb3RvdHlwZS5yZWNhbGN1bGF0ZSA9IGZ1bmN0aW9uIChlLCByKSB7XG4gICAgICAgIHQucHJvdG90eXBlLnJlY2FsY3VsYXRlLmNhbGwodGhpcywgZSwgciksIHRoaXMucGFpbnQuX3ZhbHVlc1tcImxpbmUtZmxvb3J3aWR0aFwiXSA9IE9zLnBvc3NpYmx5RXZhbHVhdGUodGhpcy5fdHJhbnNpdGlvbmluZ1BhaW50Ll92YWx1ZXNbXCJsaW5lLXdpZHRoXCJdLnZhbHVlLCBlKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmNyZWF0ZUJ1Y2tldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgRnModCk7XG4gICAgICB9LCBlLnByb3RvdHlwZS5xdWVyeVJhZGl1cyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHZhciBlID0gdCxcbiAgICAgICAgICAgIHIgPSBVcyh0byhcImxpbmUtd2lkdGhcIiwgdGhpcywgZSksIHRvKFwibGluZS1nYXAtd2lkdGhcIiwgdGhpcywgZSkpLFxuICAgICAgICAgICAgbiA9IHRvKFwibGluZS1vZmZzZXRcIiwgdGhpcywgZSk7XG4gICAgICAgIHJldHVybiByIC8gMiArIE1hdGguYWJzKG4pICsgZW8odGhpcy5wYWludC5nZXQoXCJsaW5lLXRyYW5zbGF0ZVwiKSk7XG4gICAgICB9LCBlLnByb3RvdHlwZS5xdWVyeUludGVyc2VjdHNGZWF0dXJlID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGEsIG8sIHMpIHtcbiAgICAgICAgdmFyIHUgPSBybyh0LCB0aGlzLnBhaW50LmdldChcImxpbmUtdHJhbnNsYXRlXCIpLCB0aGlzLnBhaW50LmdldChcImxpbmUtdHJhbnNsYXRlLWFuY2hvclwiKSwgby5hbmdsZSwgcyksXG4gICAgICAgICAgICBsID0gcyAvIDIgKiBVcyh0aGlzLnBhaW50LmdldChcImxpbmUtd2lkdGhcIikuZXZhbHVhdGUoZSwgciksIHRoaXMucGFpbnQuZ2V0KFwibGluZS1nYXAtd2lkdGhcIikuZXZhbHVhdGUoZSwgcikpLFxuICAgICAgICAgICAgcCA9IHRoaXMucGFpbnQuZ2V0KFwibGluZS1vZmZzZXRcIikuZXZhbHVhdGUoZSwgcik7XG4gICAgICAgIHJldHVybiBwICYmIChuID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICBmb3IgKHZhciByID0gW10sIG4gPSBuZXcgaSgwLCAwKSwgYSA9IDA7IGEgPCB0Lmxlbmd0aDsgYSsrKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBvID0gdFthXSwgcyA9IFtdLCB1ID0gMDsgdSA8IG8ubGVuZ3RoOyB1KyspIHtcbiAgICAgICAgICAgICAgdmFyIGwgPSBvW3VdLFxuICAgICAgICAgICAgICAgICAgcCA9IG9bdSArIDFdLFxuICAgICAgICAgICAgICAgICAgYyA9IDAgPT09IHUgPyBuIDogbC5zdWIob1t1IC0gMV0pLl91bml0KCkuX3BlcnAoKSxcbiAgICAgICAgICAgICAgICAgIGggPSB1ID09PSBvLmxlbmd0aCAtIDEgPyBuIDogcC5zdWIobCkuX3VuaXQoKS5fcGVycCgpLFxuICAgICAgICAgICAgICAgICAgZiA9IGMuX2FkZChoKS5fdW5pdCgpO1xuXG4gICAgICAgICAgICAgIGYuX211bHQoMSAvIChmLnggKiBoLnggKyBmLnkgKiBoLnkpKSwgcy5wdXNoKGYuX211bHQoZSkuX2FkZChsKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHIucHVzaChzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgfShuLCBwICogcykpLCBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgZS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgICAgdmFyIGkgPSBlW25dO1xuICAgICAgICAgICAgaWYgKHQubGVuZ3RoID49IDMpIGZvciAodmFyIGEgPSAwOyBhIDwgaS5sZW5ndGg7IGErKykge1xuICAgICAgICAgICAgICBpZiAoV2EodCwgaVthXSkpIHJldHVybiAhMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChaYSh0LCBpLCByKSkgcmV0dXJuICEwO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgfSh1LCBuLCBsKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmlzVGlsZUNsaXBwZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAhMDtcbiAgICAgIH0sIGU7XG4gICAgfShfaSk7XG5cbiAgICBmdW5jdGlvbiBVcyh0LCBlKSB7XG4gICAgICByZXR1cm4gZSA+IDAgPyBlICsgMiAqIHQgOiB0O1xuICAgIH1cblxuICAgIHZhciBqcyA9IElpKFt7XG4gICAgICBuYW1lOiBcImFfcG9zX29mZnNldFwiLFxuICAgICAgY29tcG9uZW50czogNCxcbiAgICAgIHR5cGU6IFwiSW50MTZcIlxuICAgIH0sIHtcbiAgICAgIG5hbWU6IFwiYV9kYXRhXCIsXG4gICAgICBjb21wb25lbnRzOiA0LFxuICAgICAgdHlwZTogXCJVaW50MTZcIlxuICAgIH0sIHtcbiAgICAgIG5hbWU6IFwiYV9waXhlbG9mZnNldFwiLFxuICAgICAgY29tcG9uZW50czogNCxcbiAgICAgIHR5cGU6IFwiSW50MTZcIlxuICAgIH1dLCA0KSxcbiAgICAgICAgcXMgPSBJaShbe1xuICAgICAgbmFtZTogXCJhX3Byb2plY3RlZF9wb3NcIixcbiAgICAgIGNvbXBvbmVudHM6IDMsXG4gICAgICB0eXBlOiBcIkZsb2F0MzJcIlxuICAgIH1dLCA0KSxcbiAgICAgICAgTnMgPSAoSWkoW3tcbiAgICAgIG5hbWU6IFwiYV9mYWRlX29wYWNpdHlcIixcbiAgICAgIGNvbXBvbmVudHM6IDEsXG4gICAgICB0eXBlOiBcIlVpbnQzMlwiXG4gICAgfV0sIDQpLCBJaShbe1xuICAgICAgbmFtZTogXCJhX3BsYWNlZFwiLFxuICAgICAgY29tcG9uZW50czogMixcbiAgICAgIHR5cGU6IFwiVWludDhcIlxuICAgIH0sIHtcbiAgICAgIG5hbWU6IFwiYV9zaGlmdFwiLFxuICAgICAgY29tcG9uZW50czogMixcbiAgICAgIHR5cGU6IFwiRmxvYXQzMlwiXG4gICAgfV0pKSxcbiAgICAgICAgS3MgPSAoSWkoW3tcbiAgICAgIHR5cGU6IFwiSW50MTZcIixcbiAgICAgIG5hbWU6IFwiYW5jaG9yUG9pbnRYXCJcbiAgICB9LCB7XG4gICAgICB0eXBlOiBcIkludDE2XCIsXG4gICAgICBuYW1lOiBcImFuY2hvclBvaW50WVwiXG4gICAgfSwge1xuICAgICAgdHlwZTogXCJJbnQxNlwiLFxuICAgICAgbmFtZTogXCJ4MVwiXG4gICAgfSwge1xuICAgICAgdHlwZTogXCJJbnQxNlwiLFxuICAgICAgbmFtZTogXCJ5MVwiXG4gICAgfSwge1xuICAgICAgdHlwZTogXCJJbnQxNlwiLFxuICAgICAgbmFtZTogXCJ4MlwiXG4gICAgfSwge1xuICAgICAgdHlwZTogXCJJbnQxNlwiLFxuICAgICAgbmFtZTogXCJ5MlwiXG4gICAgfSwge1xuICAgICAgdHlwZTogXCJVaW50MzJcIixcbiAgICAgIG5hbWU6IFwiZmVhdHVyZUluZGV4XCJcbiAgICB9LCB7XG4gICAgICB0eXBlOiBcIlVpbnQxNlwiLFxuICAgICAgbmFtZTogXCJzb3VyY2VMYXllckluZGV4XCJcbiAgICB9LCB7XG4gICAgICB0eXBlOiBcIlVpbnQxNlwiLFxuICAgICAgbmFtZTogXCJidWNrZXRJbmRleFwiXG4gICAgfV0pLCBJaShbe1xuICAgICAgbmFtZTogXCJhX3Bvc1wiLFxuICAgICAgY29tcG9uZW50czogMixcbiAgICAgIHR5cGU6IFwiSW50MTZcIlxuICAgIH0sIHtcbiAgICAgIG5hbWU6IFwiYV9hbmNob3JfcG9zXCIsXG4gICAgICBjb21wb25lbnRzOiAyLFxuICAgICAgdHlwZTogXCJJbnQxNlwiXG4gICAgfSwge1xuICAgICAgbmFtZTogXCJhX2V4dHJ1ZGVcIixcbiAgICAgIGNvbXBvbmVudHM6IDIsXG4gICAgICB0eXBlOiBcIkludDE2XCJcbiAgICB9XSwgNCkpLFxuICAgICAgICBHcyA9IElpKFt7XG4gICAgICBuYW1lOiBcImFfcG9zXCIsXG4gICAgICBjb21wb25lbnRzOiAyLFxuICAgICAgdHlwZTogXCJGbG9hdDMyXCJcbiAgICB9LCB7XG4gICAgICBuYW1lOiBcImFfcmFkaXVzXCIsXG4gICAgICBjb21wb25lbnRzOiAxLFxuICAgICAgdHlwZTogXCJGbG9hdDMyXCJcbiAgICB9LCB7XG4gICAgICBuYW1lOiBcImFfZmxhZ3NcIixcbiAgICAgIGNvbXBvbmVudHM6IDIsXG4gICAgICB0eXBlOiBcIkludDE2XCJcbiAgICB9XSwgNCk7XG5cbiAgICBmdW5jdGlvbiBacyh0LCBlLCByKSB7XG4gICAgICByZXR1cm4gdC5zZWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHQudGV4dCA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICAgICAgdmFyIG4gPSBlLmxheW91dC5nZXQoXCJ0ZXh0LXRyYW5zZm9ybVwiKS5ldmFsdWF0ZShyLCB7fSk7XG4gICAgICAgICAgcmV0dXJuIFwidXBwZXJjYXNlXCIgPT09IG4gPyB0ID0gdC50b0xvY2FsZVVwcGVyQ2FzZSgpIDogXCJsb3dlcmNhc2VcIiA9PT0gbiAmJiAodCA9IHQudG9Mb2NhbGVMb3dlckNhc2UoKSksIG9pLmFwcGx5QXJhYmljU2hhcGluZyAmJiAodCA9IG9pLmFwcGx5QXJhYmljU2hhcGluZyh0KSksIHQ7XG4gICAgICAgIH0odC50ZXh0LCBlLCByKTtcbiAgICAgIH0pLCB0O1xuICAgIH1cblxuICAgIElpKFt7XG4gICAgICBuYW1lOiBcInRyaWFuZ2xlXCIsXG4gICAgICBjb21wb25lbnRzOiAzLFxuICAgICAgdHlwZTogXCJVaW50MTZcIlxuICAgIH1dKSwgSWkoW3tcbiAgICAgIHR5cGU6IFwiSW50MTZcIixcbiAgICAgIG5hbWU6IFwiYW5jaG9yWFwiXG4gICAgfSwge1xuICAgICAgdHlwZTogXCJJbnQxNlwiLFxuICAgICAgbmFtZTogXCJhbmNob3JZXCJcbiAgICB9LCB7XG4gICAgICB0eXBlOiBcIlVpbnQxNlwiLFxuICAgICAgbmFtZTogXCJnbHlwaFN0YXJ0SW5kZXhcIlxuICAgIH0sIHtcbiAgICAgIHR5cGU6IFwiVWludDE2XCIsXG4gICAgICBuYW1lOiBcIm51bUdseXBoc1wiXG4gICAgfSwge1xuICAgICAgdHlwZTogXCJVaW50MzJcIixcbiAgICAgIG5hbWU6IFwidmVydGV4U3RhcnRJbmRleFwiXG4gICAgfSwge1xuICAgICAgdHlwZTogXCJVaW50MzJcIixcbiAgICAgIG5hbWU6IFwibGluZVN0YXJ0SW5kZXhcIlxuICAgIH0sIHtcbiAgICAgIHR5cGU6IFwiVWludDMyXCIsXG4gICAgICBuYW1lOiBcImxpbmVMZW5ndGhcIlxuICAgIH0sIHtcbiAgICAgIHR5cGU6IFwiVWludDE2XCIsXG4gICAgICBuYW1lOiBcInNlZ21lbnRcIlxuICAgIH0sIHtcbiAgICAgIHR5cGU6IFwiVWludDE2XCIsXG4gICAgICBuYW1lOiBcImxvd2VyU2l6ZVwiXG4gICAgfSwge1xuICAgICAgdHlwZTogXCJVaW50MTZcIixcbiAgICAgIG5hbWU6IFwidXBwZXJTaXplXCJcbiAgICB9LCB7XG4gICAgICB0eXBlOiBcIkZsb2F0MzJcIixcbiAgICAgIG5hbWU6IFwibGluZU9mZnNldFhcIlxuICAgIH0sIHtcbiAgICAgIHR5cGU6IFwiRmxvYXQzMlwiLFxuICAgICAgbmFtZTogXCJsaW5lT2Zmc2V0WVwiXG4gICAgfSwge1xuICAgICAgdHlwZTogXCJVaW50OFwiLFxuICAgICAgbmFtZTogXCJ3cml0aW5nTW9kZVwiXG4gICAgfSwge1xuICAgICAgdHlwZTogXCJVaW50OFwiLFxuICAgICAgbmFtZTogXCJwbGFjZWRPcmllbnRhdGlvblwiXG4gICAgfSwge1xuICAgICAgdHlwZTogXCJVaW50OFwiLFxuICAgICAgbmFtZTogXCJoaWRkZW5cIlxuICAgIH0sIHtcbiAgICAgIHR5cGU6IFwiVWludDMyXCIsXG4gICAgICBuYW1lOiBcImNyb3NzVGlsZUlEXCJcbiAgICB9LCB7XG4gICAgICB0eXBlOiBcIkludDE2XCIsXG4gICAgICBuYW1lOiBcImFzc29jaWF0ZWRJY29uSW5kZXhcIlxuICAgIH1dKSwgSWkoW3tcbiAgICAgIHR5cGU6IFwiSW50MTZcIixcbiAgICAgIG5hbWU6IFwiYW5jaG9yWFwiXG4gICAgfSwge1xuICAgICAgdHlwZTogXCJJbnQxNlwiLFxuICAgICAgbmFtZTogXCJhbmNob3JZXCJcbiAgICB9LCB7XG4gICAgICB0eXBlOiBcIkludDE2XCIsXG4gICAgICBuYW1lOiBcInJpZ2h0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4XCJcbiAgICB9LCB7XG4gICAgICB0eXBlOiBcIkludDE2XCIsXG4gICAgICBuYW1lOiBcImNlbnRlckp1c3RpZmllZFRleHRTeW1ib2xJbmRleFwiXG4gICAgfSwge1xuICAgICAgdHlwZTogXCJJbnQxNlwiLFxuICAgICAgbmFtZTogXCJsZWZ0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4XCJcbiAgICB9LCB7XG4gICAgICB0eXBlOiBcIkludDE2XCIsXG4gICAgICBuYW1lOiBcInZlcnRpY2FsUGxhY2VkVGV4dFN5bWJvbEluZGV4XCJcbiAgICB9LCB7XG4gICAgICB0eXBlOiBcIkludDE2XCIsXG4gICAgICBuYW1lOiBcInBsYWNlZEljb25TeW1ib2xJbmRleFwiXG4gICAgfSwge1xuICAgICAgdHlwZTogXCJJbnQxNlwiLFxuICAgICAgbmFtZTogXCJ2ZXJ0aWNhbFBsYWNlZEljb25TeW1ib2xJbmRleFwiXG4gICAgfSwge1xuICAgICAgdHlwZTogXCJVaW50MTZcIixcbiAgICAgIG5hbWU6IFwia2V5XCJcbiAgICB9LCB7XG4gICAgICB0eXBlOiBcIlVpbnQxNlwiLFxuICAgICAgbmFtZTogXCJ0ZXh0Qm94U3RhcnRJbmRleFwiXG4gICAgfSwge1xuICAgICAgdHlwZTogXCJVaW50MTZcIixcbiAgICAgIG5hbWU6IFwidGV4dEJveEVuZEluZGV4XCJcbiAgICB9LCB7XG4gICAgICB0eXBlOiBcIlVpbnQxNlwiLFxuICAgICAgbmFtZTogXCJ2ZXJ0aWNhbFRleHRCb3hTdGFydEluZGV4XCJcbiAgICB9LCB7XG4gICAgICB0eXBlOiBcIlVpbnQxNlwiLFxuICAgICAgbmFtZTogXCJ2ZXJ0aWNhbFRleHRCb3hFbmRJbmRleFwiXG4gICAgfSwge1xuICAgICAgdHlwZTogXCJVaW50MTZcIixcbiAgICAgIG5hbWU6IFwiaWNvbkJveFN0YXJ0SW5kZXhcIlxuICAgIH0sIHtcbiAgICAgIHR5cGU6IFwiVWludDE2XCIsXG4gICAgICBuYW1lOiBcImljb25Cb3hFbmRJbmRleFwiXG4gICAgfSwge1xuICAgICAgdHlwZTogXCJVaW50MTZcIixcbiAgICAgIG5hbWU6IFwidmVydGljYWxJY29uQm94U3RhcnRJbmRleFwiXG4gICAgfSwge1xuICAgICAgdHlwZTogXCJVaW50MTZcIixcbiAgICAgIG5hbWU6IFwidmVydGljYWxJY29uQm94RW5kSW5kZXhcIlxuICAgIH0sIHtcbiAgICAgIHR5cGU6IFwiVWludDE2XCIsXG4gICAgICBuYW1lOiBcImZlYXR1cmVJbmRleFwiXG4gICAgfSwge1xuICAgICAgdHlwZTogXCJVaW50MTZcIixcbiAgICAgIG5hbWU6IFwibnVtSG9yaXpvbnRhbEdseXBoVmVydGljZXNcIlxuICAgIH0sIHtcbiAgICAgIHR5cGU6IFwiVWludDE2XCIsXG4gICAgICBuYW1lOiBcIm51bVZlcnRpY2FsR2x5cGhWZXJ0aWNlc1wiXG4gICAgfSwge1xuICAgICAgdHlwZTogXCJVaW50MTZcIixcbiAgICAgIG5hbWU6IFwibnVtSWNvblZlcnRpY2VzXCJcbiAgICB9LCB7XG4gICAgICB0eXBlOiBcIlVpbnQxNlwiLFxuICAgICAgbmFtZTogXCJudW1WZXJ0aWNhbEljb25WZXJ0aWNlc1wiXG4gICAgfSwge1xuICAgICAgdHlwZTogXCJVaW50MTZcIixcbiAgICAgIG5hbWU6IFwidXNlUnVudGltZUNvbGxpc2lvbkNpcmNsZXNcIlxuICAgIH0sIHtcbiAgICAgIHR5cGU6IFwiVWludDMyXCIsXG4gICAgICBuYW1lOiBcImNyb3NzVGlsZUlEXCJcbiAgICB9LCB7XG4gICAgICB0eXBlOiBcIkZsb2F0MzJcIixcbiAgICAgIG5hbWU6IFwidGV4dEJveFNjYWxlXCJcbiAgICB9LCB7XG4gICAgICB0eXBlOiBcIkZsb2F0MzJcIixcbiAgICAgIGNvbXBvbmVudHM6IDIsXG4gICAgICBuYW1lOiBcInRleHRPZmZzZXRcIlxuICAgIH0sIHtcbiAgICAgIHR5cGU6IFwiRmxvYXQzMlwiLFxuICAgICAgbmFtZTogXCJjb2xsaXNpb25DaXJjbGVEaWFtZXRlclwiXG4gICAgfV0pLCBJaShbe1xuICAgICAgdHlwZTogXCJGbG9hdDMyXCIsXG4gICAgICBuYW1lOiBcIm9mZnNldFhcIlxuICAgIH1dKSwgSWkoW3tcbiAgICAgIHR5cGU6IFwiSW50MTZcIixcbiAgICAgIG5hbWU6IFwieFwiXG4gICAgfSwge1xuICAgICAgdHlwZTogXCJJbnQxNlwiLFxuICAgICAgbmFtZTogXCJ5XCJcbiAgICB9LCB7XG4gICAgICB0eXBlOiBcIkludDE2XCIsXG4gICAgICBuYW1lOiBcInRpbGVVbml0RGlzdGFuY2VGcm9tQW5jaG9yXCJcbiAgICB9XSk7XG5cbiAgICB2YXIgWHMgPSB7XG4gICAgICBcIiFcIjogXCLvuJVcIixcbiAgICAgIFwiI1wiOiBcIu+8g1wiLFxuICAgICAgJDogXCLvvIRcIixcbiAgICAgIFwiJVwiOiBcIu+8hVwiLFxuICAgICAgXCImXCI6IFwi77yGXCIsXG4gICAgICBcIihcIjogXCLvuLVcIixcbiAgICAgIFwiKVwiOiBcIu+4tlwiLFxuICAgICAgXCIqXCI6IFwi77yKXCIsXG4gICAgICBcIitcIjogXCLvvItcIixcbiAgICAgIFwiLFwiOiBcIu+4kFwiLFxuICAgICAgXCItXCI6IFwi77iyXCIsXG4gICAgICBcIi5cIjogXCLjg7tcIixcbiAgICAgIFwiL1wiOiBcIu+8j1wiLFxuICAgICAgXCI6XCI6IFwi77iTXCIsXG4gICAgICBcIjtcIjogXCLvuJRcIixcbiAgICAgIFwiPFwiOiBcIu+4v1wiLFxuICAgICAgXCI9XCI6IFwi77ydXCIsXG4gICAgICBcIj5cIjogXCLvuYBcIixcbiAgICAgIFwiP1wiOiBcIu+4llwiLFxuICAgICAgXCJAXCI6IFwi77ygXCIsXG4gICAgICBcIltcIjogXCLvuYdcIixcbiAgICAgIFwiXFxcXFwiOiBcIu+8vFwiLFxuICAgICAgXCJdXCI6IFwi77mIXCIsXG4gICAgICBcIl5cIjogXCLvvL5cIixcbiAgICAgIF86IFwi77izXCIsXG4gICAgICBcImBcIjogXCLvvYBcIixcbiAgICAgIFwie1wiOiBcIu+4t1wiLFxuICAgICAgXCJ8XCI6IFwi4oCVXCIsXG4gICAgICBcIn1cIjogXCLvuLhcIixcbiAgICAgIFwiflwiOiBcIu+9nlwiLFxuICAgICAgXCLColwiOiBcIu+/oFwiLFxuICAgICAgXCLCo1wiOiBcIu+/oVwiLFxuICAgICAgXCLCpVwiOiBcIu+/pVwiLFxuICAgICAgXCLCplwiOiBcIu+/pFwiLFxuICAgICAgXCLCrFwiOiBcIu+/olwiLFxuICAgICAgXCLCr1wiOiBcIu+/o1wiLFxuICAgICAgXCLigJNcIjogXCLvuLJcIixcbiAgICAgIFwi4oCUXCI6IFwi77ixXCIsXG4gICAgICBcIuKAmFwiOiBcIu+5g1wiLFxuICAgICAgXCLigJlcIjogXCLvuYRcIixcbiAgICAgIFwi4oCcXCI6IFwi77mBXCIsXG4gICAgICBcIuKAnVwiOiBcIu+5glwiLFxuICAgICAgXCLigKZcIjogXCLvuJlcIixcbiAgICAgIFwi4oCnXCI6IFwi44O7XCIsXG4gICAgICBcIuKCqVwiOiBcIu+/plwiLFxuICAgICAgXCLjgIFcIjogXCLvuJFcIixcbiAgICAgIFwi44CCXCI6IFwi77iSXCIsXG4gICAgICBcIuOAiFwiOiBcIu+4v1wiLFxuICAgICAgXCLjgIlcIjogXCLvuYBcIixcbiAgICAgIFwi44CKXCI6IFwi77i9XCIsXG4gICAgICBcIuOAi1wiOiBcIu+4vlwiLFxuICAgICAgXCLjgIxcIjogXCLvuYFcIixcbiAgICAgIFwi44CNXCI6IFwi77mCXCIsXG4gICAgICBcIuOAjlwiOiBcIu+5g1wiLFxuICAgICAgXCLjgI9cIjogXCLvuYRcIixcbiAgICAgIFwi44CQXCI6IFwi77i7XCIsXG4gICAgICBcIuOAkVwiOiBcIu+4vFwiLFxuICAgICAgXCLjgJRcIjogXCLvuLlcIixcbiAgICAgIFwi44CVXCI6IFwi77i6XCIsXG4gICAgICBcIuOAllwiOiBcIu+4l1wiLFxuICAgICAgXCLjgJdcIjogXCLvuJhcIixcbiAgICAgIFwi77yBXCI6IFwi77iVXCIsXG4gICAgICBcIu+8iFwiOiBcIu+4tVwiLFxuICAgICAgXCLvvIlcIjogXCLvuLZcIixcbiAgICAgIFwi77yMXCI6IFwi77iQXCIsXG4gICAgICBcIu+8jVwiOiBcIu+4slwiLFxuICAgICAgXCLvvI5cIjogXCLjg7tcIixcbiAgICAgIFwi77yaXCI6IFwi77iTXCIsXG4gICAgICBcIu+8m1wiOiBcIu+4lFwiLFxuICAgICAgXCLvvJxcIjogXCLvuL9cIixcbiAgICAgIFwi77yeXCI6IFwi77mAXCIsXG4gICAgICBcIu+8n1wiOiBcIu+4llwiLFxuICAgICAgXCLvvLtcIjogXCLvuYdcIixcbiAgICAgIFwi77y9XCI6IFwi77mIXCIsXG4gICAgICBcIu+8v1wiOiBcIu+4s1wiLFxuICAgICAgXCLvvZtcIjogXCLvuLdcIixcbiAgICAgIFwi772cXCI6IFwi4oCVXCIsXG4gICAgICBcIu+9nVwiOiBcIu+4uFwiLFxuICAgICAgXCLvvZ9cIjogXCLvuLVcIixcbiAgICAgIFwi772gXCI6IFwi77i2XCIsXG4gICAgICBcIu+9oVwiOiBcIu+4klwiLFxuICAgICAgXCLvvaJcIjogXCLvuYFcIixcbiAgICAgIFwi772jXCI6IFwi77mCXCJcbiAgICB9LFxuICAgICAgICBKcyA9IGZ1bmN0aW9uIEpzKHQsIGUsIHIsIG4sIGkpIHtcbiAgICAgIHZhciBhLFxuICAgICAgICAgIG8sXG4gICAgICAgICAgcyA9IDggKiBpIC0gbiAtIDEsXG4gICAgICAgICAgdSA9ICgxIDw8IHMpIC0gMSxcbiAgICAgICAgICBsID0gdSA+PiAxLFxuICAgICAgICAgIHAgPSAtNyxcbiAgICAgICAgICBjID0gciA/IGkgLSAxIDogMCxcbiAgICAgICAgICBoID0gciA/IC0xIDogMSxcbiAgICAgICAgICBmID0gdFtlICsgY107XG5cbiAgICAgIGZvciAoYyArPSBoLCBhID0gZiAmICgxIDw8IC1wKSAtIDEsIGYgPj49IC1wLCBwICs9IHM7IHAgPiAwOyBhID0gMjU2ICogYSArIHRbZSArIGNdLCBjICs9IGgsIHAgLT0gOCkge1xuICAgICAgICA7XG4gICAgICB9XG5cbiAgICAgIGZvciAobyA9IGEgJiAoMSA8PCAtcCkgLSAxLCBhID4+PSAtcCwgcCArPSBuOyBwID4gMDsgbyA9IDI1NiAqIG8gKyB0W2UgKyBjXSwgYyArPSBoLCBwIC09IDgpIHtcbiAgICAgICAgO1xuICAgICAgfVxuXG4gICAgICBpZiAoMCA9PT0gYSkgYSA9IDEgLSBsO2Vsc2Uge1xuICAgICAgICBpZiAoYSA9PT0gdSkgcmV0dXJuIG8gPyBOYU4gOiAxIC8gMCAqIChmID8gLTEgOiAxKTtcbiAgICAgICAgbyArPSBNYXRoLnBvdygyLCBuKSwgYSAtPSBsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChmID8gLTEgOiAxKSAqIG8gKiBNYXRoLnBvdygyLCBhIC0gbik7XG4gICAgfSxcbiAgICAgICAgSHMgPSBmdW5jdGlvbiBIcyh0LCBlLCByLCBuLCBpLCBhKSB7XG4gICAgICB2YXIgbyxcbiAgICAgICAgICBzLFxuICAgICAgICAgIHUsXG4gICAgICAgICAgbCA9IDggKiBhIC0gaSAtIDEsXG4gICAgICAgICAgcCA9ICgxIDw8IGwpIC0gMSxcbiAgICAgICAgICBjID0gcCA+PiAxLFxuICAgICAgICAgIGggPSAyMyA9PT0gaSA/IE1hdGgucG93KDIsIC0yNCkgLSBNYXRoLnBvdygyLCAtNzcpIDogMCxcbiAgICAgICAgICBmID0gbiA/IDAgOiBhIC0gMSxcbiAgICAgICAgICB5ID0gbiA/IDEgOiAtMSxcbiAgICAgICAgICBkID0gZSA8IDAgfHwgMCA9PT0gZSAmJiAxIC8gZSA8IDAgPyAxIDogMDtcblxuICAgICAgZm9yIChlID0gTWF0aC5hYnMoZSksIGlzTmFOKGUpIHx8IGUgPT09IDEgLyAwID8gKHMgPSBpc05hTihlKSA/IDEgOiAwLCBvID0gcCkgOiAobyA9IE1hdGguZmxvb3IoTWF0aC5sb2coZSkgLyBNYXRoLkxOMiksIGUgKiAodSA9IE1hdGgucG93KDIsIC1vKSkgPCAxICYmIChvLS0sIHUgKj0gMiksIChlICs9IG8gKyBjID49IDEgPyBoIC8gdSA6IGggKiBNYXRoLnBvdygyLCAxIC0gYykpICogdSA+PSAyICYmIChvKyssIHUgLz0gMiksIG8gKyBjID49IHAgPyAocyA9IDAsIG8gPSBwKSA6IG8gKyBjID49IDEgPyAocyA9IChlICogdSAtIDEpICogTWF0aC5wb3coMiwgaSksIG8gKz0gYykgOiAocyA9IGUgKiBNYXRoLnBvdygyLCBjIC0gMSkgKiBNYXRoLnBvdygyLCBpKSwgbyA9IDApKTsgaSA+PSA4OyB0W3IgKyBmXSA9IDI1NSAmIHMsIGYgKz0geSwgcyAvPSAyNTYsIGkgLT0gOCkge1xuICAgICAgICA7XG4gICAgICB9XG5cbiAgICAgIGZvciAobyA9IG8gPDwgaSB8IHMsIGwgKz0gaTsgbCA+IDA7IHRbciArIGZdID0gMjU1ICYgbywgZiArPSB5LCBvIC89IDI1NiwgbCAtPSA4KSB7XG4gICAgICAgIDtcbiAgICAgIH1cblxuICAgICAgdFtyICsgZiAtIHldIHw9IDEyOCAqIGQ7XG4gICAgfSxcbiAgICAgICAgWXMgPSAkcztcblxuICAgIGZ1bmN0aW9uICRzKHQpIHtcbiAgICAgIHRoaXMuYnVmID0gQXJyYXlCdWZmZXIuaXNWaWV3ICYmIEFycmF5QnVmZmVyLmlzVmlldyh0KSA/IHQgOiBuZXcgVWludDhBcnJheSh0IHx8IDApLCB0aGlzLnBvcyA9IDAsIHRoaXMudHlwZSA9IDAsIHRoaXMubGVuZ3RoID0gdGhpcy5idWYubGVuZ3RoO1xuICAgIH1cblxuICAgICRzLlZhcmludCA9IDAsICRzLkZpeGVkNjQgPSAxLCAkcy5CeXRlcyA9IDIsICRzLkZpeGVkMzIgPSA1O1xuICAgIHZhciBXcyA9IFwidW5kZWZpbmVkXCIgPT0gdHlwZW9mIFRleHREZWNvZGVyID8gbnVsbCA6IG5ldyBUZXh0RGVjb2RlcihcInV0ZjhcIik7XG5cbiAgICBmdW5jdGlvbiBRcyh0KSB7XG4gICAgICByZXR1cm4gdC50eXBlID09PSAkcy5CeXRlcyA/IHQucmVhZFZhcmludCgpICsgdC5wb3MgOiB0LnBvcyArIDE7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdHUodCwgZSwgcikge1xuICAgICAgcmV0dXJuIHIgPyA0Mjk0OTY3Mjk2ICogZSArICh0ID4+PiAwKSA6IDQyOTQ5NjcyOTYgKiAoZSA+Pj4gMCkgKyAodCA+Pj4gMCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXUodCwgZSwgcikge1xuICAgICAgdmFyIG4gPSBlIDw9IDE2MzgzID8gMSA6IGUgPD0gMjA5NzE1MSA/IDIgOiBlIDw9IDI2ODQzNTQ1NSA/IDMgOiBNYXRoLmZsb29yKE1hdGgubG9nKGUpIC8gKDcgKiBNYXRoLkxOMikpO1xuICAgICAgci5yZWFsbG9jKG4pO1xuXG4gICAgICBmb3IgKHZhciBpID0gci5wb3MgLSAxOyBpID49IHQ7IGktLSkge1xuICAgICAgICByLmJ1ZltpICsgbl0gPSByLmJ1ZltpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBydSh0LCBlKSB7XG4gICAgICBmb3IgKHZhciByID0gMDsgciA8IHQubGVuZ3RoOyByKyspIHtcbiAgICAgICAgZS53cml0ZVZhcmludCh0W3JdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBudSh0LCBlKSB7XG4gICAgICBmb3IgKHZhciByID0gMDsgciA8IHQubGVuZ3RoOyByKyspIHtcbiAgICAgICAgZS53cml0ZVNWYXJpbnQodFtyXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXUodCwgZSkge1xuICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCB0Lmxlbmd0aDsgcisrKSB7XG4gICAgICAgIGUud3JpdGVGbG9hdCh0W3JdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhdSh0LCBlKSB7XG4gICAgICBmb3IgKHZhciByID0gMDsgciA8IHQubGVuZ3RoOyByKyspIHtcbiAgICAgICAgZS53cml0ZURvdWJsZSh0W3JdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvdSh0LCBlKSB7XG4gICAgICBmb3IgKHZhciByID0gMDsgciA8IHQubGVuZ3RoOyByKyspIHtcbiAgICAgICAgZS53cml0ZUJvb2xlYW4odFtyXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3UodCwgZSkge1xuICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCB0Lmxlbmd0aDsgcisrKSB7XG4gICAgICAgIGUud3JpdGVGaXhlZDMyKHRbcl0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHV1KHQsIGUpIHtcbiAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgdC5sZW5ndGg7IHIrKykge1xuICAgICAgICBlLndyaXRlU0ZpeGVkMzIodFtyXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbHUodCwgZSkge1xuICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCB0Lmxlbmd0aDsgcisrKSB7XG4gICAgICAgIGUud3JpdGVGaXhlZDY0KHRbcl0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHB1KHQsIGUpIHtcbiAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgdC5sZW5ndGg7IHIrKykge1xuICAgICAgICBlLndyaXRlU0ZpeGVkNjQodFtyXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3UodCwgZSkge1xuICAgICAgcmV0dXJuICh0W2VdIHwgdFtlICsgMV0gPDwgOCB8IHRbZSArIDJdIDw8IDE2KSArIDE2Nzc3MjE2ICogdFtlICsgM107XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaHUodCwgZSwgcikge1xuICAgICAgdFtyXSA9IGUsIHRbciArIDFdID0gZSA+Pj4gOCwgdFtyICsgMl0gPSBlID4+PiAxNiwgdFtyICsgM10gPSBlID4+PiAyNDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmdSh0LCBlKSB7XG4gICAgICByZXR1cm4gKHRbZV0gfCB0W2UgKyAxXSA8PCA4IHwgdFtlICsgMl0gPDwgMTYpICsgKHRbZSArIDNdIDw8IDI0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB5dSh0LCBlLCByKSB7XG4gICAgICAxID09PSB0ICYmIHIucmVhZE1lc3NhZ2UoZHUsIGUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGR1KHQsIGUsIHIpIHtcbiAgICAgIGlmICgzID09PSB0KSB7XG4gICAgICAgIHZhciBuID0gci5yZWFkTWVzc2FnZShtdSwge30pLFxuICAgICAgICAgICAgaSA9IG4ud2lkdGgsXG4gICAgICAgICAgICBhID0gbi5oZWlnaHQsXG4gICAgICAgICAgICBvID0gbi5sZWZ0LFxuICAgICAgICAgICAgcyA9IG4udG9wLFxuICAgICAgICAgICAgdSA9IG4uYWR2YW5jZTtcbiAgICAgICAgZS5wdXNoKHtcbiAgICAgICAgICBpZDogbi5pZCxcbiAgICAgICAgICBiaXRtYXA6IG5ldyBnbyh7XG4gICAgICAgICAgICB3aWR0aDogaSArIDYsXG4gICAgICAgICAgICBoZWlnaHQ6IGEgKyA2XG4gICAgICAgICAgfSwgbi5iaXRtYXApLFxuICAgICAgICAgIG1ldHJpY3M6IHtcbiAgICAgICAgICAgIHdpZHRoOiBpLFxuICAgICAgICAgICAgaGVpZ2h0OiBhLFxuICAgICAgICAgICAgbGVmdDogbyxcbiAgICAgICAgICAgIHRvcDogcyxcbiAgICAgICAgICAgIGFkdmFuY2U6IHVcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG11KHQsIGUsIHIpIHtcbiAgICAgIDEgPT09IHQgPyBlLmlkID0gci5yZWFkVmFyaW50KCkgOiAyID09PSB0ID8gZS5iaXRtYXAgPSByLnJlYWRCeXRlcygpIDogMyA9PT0gdCA/IGUud2lkdGggPSByLnJlYWRWYXJpbnQoKSA6IDQgPT09IHQgPyBlLmhlaWdodCA9IHIucmVhZFZhcmludCgpIDogNSA9PT0gdCA/IGUubGVmdCA9IHIucmVhZFNWYXJpbnQoKSA6IDYgPT09IHQgPyBlLnRvcCA9IHIucmVhZFNWYXJpbnQoKSA6IDcgPT09IHQgJiYgKGUuYWR2YW5jZSA9IHIucmVhZFZhcmludCgpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2dSh0KSB7XG4gICAgICBmb3IgKHZhciBlID0gMCwgciA9IDAsIG4gPSAwLCBpID0gdDsgbiA8IGkubGVuZ3RoOyBuICs9IDEpIHtcbiAgICAgICAgdmFyIGEgPSBpW25dO1xuICAgICAgICBlICs9IGEudyAqIGEuaCwgciA9IE1hdGgubWF4KHIsIGEudyk7XG4gICAgICB9XG5cbiAgICAgIHQuc29ydChmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gZS5oIC0gdC5oO1xuICAgICAgfSk7XG5cbiAgICAgIGZvciAodmFyIG8gPSBbe1xuICAgICAgICB4OiAwLFxuICAgICAgICB5OiAwLFxuICAgICAgICB3OiBNYXRoLm1heChNYXRoLmNlaWwoTWF0aC5zcXJ0KGUgLyAuOTUpKSwgciksXG4gICAgICAgIGg6IDEgLyAwXG4gICAgICB9XSwgcyA9IDAsIHUgPSAwLCBsID0gMCwgcCA9IHQ7IGwgPCBwLmxlbmd0aDsgbCArPSAxKSB7XG4gICAgICAgIGZvciAodmFyIGMgPSBwW2xdLCBoID0gby5sZW5ndGggLSAxOyBoID49IDA7IGgtLSkge1xuICAgICAgICAgIHZhciBmID0gb1toXTtcblxuICAgICAgICAgIGlmICghKGMudyA+IGYudyB8fCBjLmggPiBmLmgpKSB7XG4gICAgICAgICAgICBpZiAoYy54ID0gZi54LCBjLnkgPSBmLnksIHUgPSBNYXRoLm1heCh1LCBjLnkgKyBjLmgpLCBzID0gTWF0aC5tYXgocywgYy54ICsgYy53KSwgYy53ID09PSBmLncgJiYgYy5oID09PSBmLmgpIHtcbiAgICAgICAgICAgICAgdmFyIHkgPSBvLnBvcCgpO1xuICAgICAgICAgICAgICBoIDwgby5sZW5ndGggJiYgKG9baF0gPSB5KTtcbiAgICAgICAgICAgIH0gZWxzZSBjLmggPT09IGYuaCA/IChmLnggKz0gYy53LCBmLncgLT0gYy53KSA6IGMudyA9PT0gZi53ID8gKGYueSArPSBjLmgsIGYuaCAtPSBjLmgpIDogKG8ucHVzaCh7XG4gICAgICAgICAgICAgIHg6IGYueCArIGMudyxcbiAgICAgICAgICAgICAgeTogZi55LFxuICAgICAgICAgICAgICB3OiBmLncgLSBjLncsXG4gICAgICAgICAgICAgIGg6IGMuaFxuICAgICAgICAgICAgfSksIGYueSArPSBjLmgsIGYuaCAtPSBjLmgpO1xuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdzogcyxcbiAgICAgICAgaDogdSxcbiAgICAgICAgZmlsbDogZSAvIChzICogdSkgfHwgMFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAkcy5wcm90b3R5cGUgPSB7XG4gICAgICBkZXN0cm95OiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLmJ1ZiA9IG51bGw7XG4gICAgICB9LFxuICAgICAgcmVhZEZpZWxkczogZnVuY3Rpb24gcmVhZEZpZWxkcyh0LCBlLCByKSB7XG4gICAgICAgIGZvciAociA9IHIgfHwgdGhpcy5sZW5ndGg7IHRoaXMucG9zIDwgcjspIHtcbiAgICAgICAgICB2YXIgbiA9IHRoaXMucmVhZFZhcmludCgpLFxuICAgICAgICAgICAgICBpID0gbiA+PiAzLFxuICAgICAgICAgICAgICBhID0gdGhpcy5wb3M7XG4gICAgICAgICAgdGhpcy50eXBlID0gNyAmIG4sIHQoaSwgZSwgdGhpcyksIHRoaXMucG9zID09PSBhICYmIHRoaXMuc2tpcChuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSxcbiAgICAgIHJlYWRNZXNzYWdlOiBmdW5jdGlvbiByZWFkTWVzc2FnZSh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRGaWVsZHModCwgZSwgdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcyk7XG4gICAgICB9LFxuICAgICAgcmVhZEZpeGVkMzI6IGZ1bmN0aW9uIHJlYWRGaXhlZDMyKCkge1xuICAgICAgICB2YXIgdCA9IGN1KHRoaXMuYnVmLCB0aGlzLnBvcyk7XG4gICAgICAgIHJldHVybiB0aGlzLnBvcyArPSA0LCB0O1xuICAgICAgfSxcbiAgICAgIHJlYWRTRml4ZWQzMjogZnVuY3Rpb24gcmVhZFNGaXhlZDMyKCkge1xuICAgICAgICB2YXIgdCA9IGZ1KHRoaXMuYnVmLCB0aGlzLnBvcyk7XG4gICAgICAgIHJldHVybiB0aGlzLnBvcyArPSA0LCB0O1xuICAgICAgfSxcbiAgICAgIHJlYWRGaXhlZDY0OiBmdW5jdGlvbiByZWFkRml4ZWQ2NCgpIHtcbiAgICAgICAgdmFyIHQgPSBjdSh0aGlzLmJ1ZiwgdGhpcy5wb3MpICsgNDI5NDk2NzI5NiAqIGN1KHRoaXMuYnVmLCB0aGlzLnBvcyArIDQpO1xuICAgICAgICByZXR1cm4gdGhpcy5wb3MgKz0gOCwgdDtcbiAgICAgIH0sXG4gICAgICByZWFkU0ZpeGVkNjQ6IGZ1bmN0aW9uIHJlYWRTRml4ZWQ2NCgpIHtcbiAgICAgICAgdmFyIHQgPSBjdSh0aGlzLmJ1ZiwgdGhpcy5wb3MpICsgNDI5NDk2NzI5NiAqIGZ1KHRoaXMuYnVmLCB0aGlzLnBvcyArIDQpO1xuICAgICAgICByZXR1cm4gdGhpcy5wb3MgKz0gOCwgdDtcbiAgICAgIH0sXG4gICAgICByZWFkRmxvYXQ6IGZ1bmN0aW9uIHJlYWRGbG9hdCgpIHtcbiAgICAgICAgdmFyIHQgPSBKcyh0aGlzLmJ1ZiwgdGhpcy5wb3MsICEwLCAyMywgNCk7XG4gICAgICAgIHJldHVybiB0aGlzLnBvcyArPSA0LCB0O1xuICAgICAgfSxcbiAgICAgIHJlYWREb3VibGU6IGZ1bmN0aW9uIHJlYWREb3VibGUoKSB7XG4gICAgICAgIHZhciB0ID0gSnModGhpcy5idWYsIHRoaXMucG9zLCAhMCwgNTIsIDgpO1xuICAgICAgICByZXR1cm4gdGhpcy5wb3MgKz0gOCwgdDtcbiAgICAgIH0sXG4gICAgICByZWFkVmFyaW50OiBmdW5jdGlvbiByZWFkVmFyaW50KHQpIHtcbiAgICAgICAgdmFyIGUsXG4gICAgICAgICAgICByLFxuICAgICAgICAgICAgbiA9IHRoaXMuYnVmO1xuICAgICAgICByZXR1cm4gZSA9IDEyNyAmIChyID0gblt0aGlzLnBvcysrXSksIHIgPCAxMjggPyBlIDogKGUgfD0gKDEyNyAmIChyID0gblt0aGlzLnBvcysrXSkpIDw8IDcsIHIgPCAxMjggPyBlIDogKGUgfD0gKDEyNyAmIChyID0gblt0aGlzLnBvcysrXSkpIDw8IDE0LCByIDwgMTI4ID8gZSA6IChlIHw9ICgxMjcgJiAociA9IG5bdGhpcy5wb3MrK10pKSA8PCAyMSwgciA8IDEyOCA/IGUgOiBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgICAgIHZhciBuLFxuICAgICAgICAgICAgICBpLFxuICAgICAgICAgICAgICBhID0gci5idWY7XG4gICAgICAgICAgaWYgKG4gPSAoMTEyICYgKGkgPSBhW3IucG9zKytdKSkgPj4gNCwgaSA8IDEyOCkgcmV0dXJuIHR1KHQsIG4sIGUpO1xuICAgICAgICAgIGlmIChuIHw9ICgxMjcgJiAoaSA9IGFbci5wb3MrK10pKSA8PCAzLCBpIDwgMTI4KSByZXR1cm4gdHUodCwgbiwgZSk7XG4gICAgICAgICAgaWYgKG4gfD0gKDEyNyAmIChpID0gYVtyLnBvcysrXSkpIDw8IDEwLCBpIDwgMTI4KSByZXR1cm4gdHUodCwgbiwgZSk7XG4gICAgICAgICAgaWYgKG4gfD0gKDEyNyAmIChpID0gYVtyLnBvcysrXSkpIDw8IDE3LCBpIDwgMTI4KSByZXR1cm4gdHUodCwgbiwgZSk7XG4gICAgICAgICAgaWYgKG4gfD0gKDEyNyAmIChpID0gYVtyLnBvcysrXSkpIDw8IDI0LCBpIDwgMTI4KSByZXR1cm4gdHUodCwgbiwgZSk7XG4gICAgICAgICAgaWYgKG4gfD0gKDEgJiAoaSA9IGFbci5wb3MrK10pKSA8PCAzMSwgaSA8IDEyOCkgcmV0dXJuIHR1KHQsIG4sIGUpO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIHZhcmludCBub3QgbW9yZSB0aGFuIDEwIGJ5dGVzXCIpO1xuICAgICAgICB9KGUgfD0gKDE1ICYgKHIgPSBuW3RoaXMucG9zXSkpIDw8IDI4LCB0LCB0aGlzKSkpKTtcbiAgICAgIH0sXG4gICAgICByZWFkVmFyaW50NjQ6IGZ1bmN0aW9uIHJlYWRWYXJpbnQ2NCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZFZhcmludCghMCk7XG4gICAgICB9LFxuICAgICAgcmVhZFNWYXJpbnQ6IGZ1bmN0aW9uIHJlYWRTVmFyaW50KCkge1xuICAgICAgICB2YXIgdCA9IHRoaXMucmVhZFZhcmludCgpO1xuICAgICAgICByZXR1cm4gdCAlIDIgPT0gMSA/ICh0ICsgMSkgLyAtMiA6IHQgLyAyO1xuICAgICAgfSxcbiAgICAgIHJlYWRCb29sZWFuOiBmdW5jdGlvbiByZWFkQm9vbGVhbigpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5yZWFkVmFyaW50KCkpO1xuICAgICAgfSxcbiAgICAgIHJlYWRTdHJpbmc6IGZ1bmN0aW9uIHJlYWRTdHJpbmcoKSB7XG4gICAgICAgIHZhciB0ID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcyxcbiAgICAgICAgICAgIGUgPSB0aGlzLnBvcztcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zID0gdCwgdCAtIGUgPj0gMTIgJiYgV3MgPyBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgICAgIHJldHVybiBXcy5kZWNvZGUodC5zdWJhcnJheShlLCByKSk7XG4gICAgICAgIH0odGhpcy5idWYsIGUsIHQpIDogZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgICAgICBmb3IgKHZhciBuID0gXCJcIiwgaSA9IGU7IGkgPCByOykge1xuICAgICAgICAgICAgdmFyIGEsXG4gICAgICAgICAgICAgICAgbyxcbiAgICAgICAgICAgICAgICBzLFxuICAgICAgICAgICAgICAgIHUgPSB0W2ldLFxuICAgICAgICAgICAgICAgIGwgPSBudWxsLFxuICAgICAgICAgICAgICAgIHAgPSB1ID4gMjM5ID8gNCA6IHUgPiAyMjMgPyAzIDogdSA+IDE5MSA/IDIgOiAxO1xuICAgICAgICAgICAgaWYgKGkgKyBwID4gcikgYnJlYWs7XG4gICAgICAgICAgICAxID09PSBwID8gdSA8IDEyOCAmJiAobCA9IHUpIDogMiA9PT0gcCA/IDEyOCA9PSAoMTkyICYgKGEgPSB0W2kgKyAxXSkpICYmIChsID0gKDMxICYgdSkgPDwgNiB8IDYzICYgYSkgPD0gMTI3ICYmIChsID0gbnVsbCkgOiAzID09PSBwID8gKG8gPSB0W2kgKyAyXSwgMTI4ID09ICgxOTIgJiAoYSA9IHRbaSArIDFdKSkgJiYgMTI4ID09ICgxOTIgJiBvKSAmJiAoKGwgPSAoMTUgJiB1KSA8PCAxMiB8ICg2MyAmIGEpIDw8IDYgfCA2MyAmIG8pIDw9IDIwNDcgfHwgbCA+PSA1NTI5NiAmJiBsIDw9IDU3MzQzKSAmJiAobCA9IG51bGwpKSA6IDQgPT09IHAgJiYgKG8gPSB0W2kgKyAyXSwgcyA9IHRbaSArIDNdLCAxMjggPT0gKDE5MiAmIChhID0gdFtpICsgMV0pKSAmJiAxMjggPT0gKDE5MiAmIG8pICYmIDEyOCA9PSAoMTkyICYgcykgJiYgKChsID0gKDE1ICYgdSkgPDwgMTggfCAoNjMgJiBhKSA8PCAxMiB8ICg2MyAmIG8pIDw8IDYgfCA2MyAmIHMpIDw9IDY1NTM1IHx8IGwgPj0gMTExNDExMikgJiYgKGwgPSBudWxsKSksIG51bGwgPT09IGwgPyAobCA9IDY1NTMzLCBwID0gMSkgOiBsID4gNjU1MzUgJiYgKGwgLT0gNjU1MzYsIG4gKz0gU3RyaW5nLmZyb21DaGFyQ29kZShsID4+PiAxMCAmIDEwMjMgfCA1NTI5NiksIGwgPSA1NjMyMCB8IDEwMjMgJiBsKSwgbiArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGwpLCBpICs9IHA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIH0odGhpcy5idWYsIGUsIHQpO1xuICAgICAgfSxcbiAgICAgIHJlYWRCeXRlczogZnVuY3Rpb24gcmVhZEJ5dGVzKCkge1xuICAgICAgICB2YXIgdCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsXG4gICAgICAgICAgICBlID0gdGhpcy5idWYuc3ViYXJyYXkodGhpcy5wb3MsIHQpO1xuICAgICAgICByZXR1cm4gdGhpcy5wb3MgPSB0LCBlO1xuICAgICAgfSxcbiAgICAgIHJlYWRQYWNrZWRWYXJpbnQ6IGZ1bmN0aW9uIHJlYWRQYWNrZWRWYXJpbnQodCwgZSkge1xuICAgICAgICBpZiAodGhpcy50eXBlICE9PSAkcy5CeXRlcykgcmV0dXJuIHQucHVzaCh0aGlzLnJlYWRWYXJpbnQoZSkpO1xuICAgICAgICB2YXIgciA9IFFzKHRoaXMpO1xuXG4gICAgICAgIGZvciAodCA9IHQgfHwgW107IHRoaXMucG9zIDwgcjspIHtcbiAgICAgICAgICB0LnB1c2godGhpcy5yZWFkVmFyaW50KGUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0O1xuICAgICAgfSxcbiAgICAgIHJlYWRQYWNrZWRTVmFyaW50OiBmdW5jdGlvbiByZWFkUGFja2VkU1ZhcmludCh0KSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09ICRzLkJ5dGVzKSByZXR1cm4gdC5wdXNoKHRoaXMucmVhZFNWYXJpbnQoKSk7XG4gICAgICAgIHZhciBlID0gUXModGhpcyk7XG5cbiAgICAgICAgZm9yICh0ID0gdCB8fCBbXTsgdGhpcy5wb3MgPCBlOykge1xuICAgICAgICAgIHQucHVzaCh0aGlzLnJlYWRTVmFyaW50KCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgICB9LFxuICAgICAgcmVhZFBhY2tlZEJvb2xlYW46IGZ1bmN0aW9uIHJlYWRQYWNrZWRCb29sZWFuKHQpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSAhPT0gJHMuQnl0ZXMpIHJldHVybiB0LnB1c2godGhpcy5yZWFkQm9vbGVhbigpKTtcbiAgICAgICAgdmFyIGUgPSBRcyh0aGlzKTtcblxuICAgICAgICBmb3IgKHQgPSB0IHx8IFtdOyB0aGlzLnBvcyA8IGU7KSB7XG4gICAgICAgICAgdC5wdXNoKHRoaXMucmVhZEJvb2xlYW4oKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdDtcbiAgICAgIH0sXG4gICAgICByZWFkUGFja2VkRmxvYXQ6IGZ1bmN0aW9uIHJlYWRQYWNrZWRGbG9hdCh0KSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09ICRzLkJ5dGVzKSByZXR1cm4gdC5wdXNoKHRoaXMucmVhZEZsb2F0KCkpO1xuICAgICAgICB2YXIgZSA9IFFzKHRoaXMpO1xuXG4gICAgICAgIGZvciAodCA9IHQgfHwgW107IHRoaXMucG9zIDwgZTspIHtcbiAgICAgICAgICB0LnB1c2godGhpcy5yZWFkRmxvYXQoKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdDtcbiAgICAgIH0sXG4gICAgICByZWFkUGFja2VkRG91YmxlOiBmdW5jdGlvbiByZWFkUGFja2VkRG91YmxlKHQpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSAhPT0gJHMuQnl0ZXMpIHJldHVybiB0LnB1c2godGhpcy5yZWFkRG91YmxlKCkpO1xuICAgICAgICB2YXIgZSA9IFFzKHRoaXMpO1xuXG4gICAgICAgIGZvciAodCA9IHQgfHwgW107IHRoaXMucG9zIDwgZTspIHtcbiAgICAgICAgICB0LnB1c2godGhpcy5yZWFkRG91YmxlKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgICB9LFxuICAgICAgcmVhZFBhY2tlZEZpeGVkMzI6IGZ1bmN0aW9uIHJlYWRQYWNrZWRGaXhlZDMyKHQpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSAhPT0gJHMuQnl0ZXMpIHJldHVybiB0LnB1c2godGhpcy5yZWFkRml4ZWQzMigpKTtcbiAgICAgICAgdmFyIGUgPSBRcyh0aGlzKTtcblxuICAgICAgICBmb3IgKHQgPSB0IHx8IFtdOyB0aGlzLnBvcyA8IGU7KSB7XG4gICAgICAgICAgdC5wdXNoKHRoaXMucmVhZEZpeGVkMzIoKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdDtcbiAgICAgIH0sXG4gICAgICByZWFkUGFja2VkU0ZpeGVkMzI6IGZ1bmN0aW9uIHJlYWRQYWNrZWRTRml4ZWQzMih0KSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09ICRzLkJ5dGVzKSByZXR1cm4gdC5wdXNoKHRoaXMucmVhZFNGaXhlZDMyKCkpO1xuICAgICAgICB2YXIgZSA9IFFzKHRoaXMpO1xuXG4gICAgICAgIGZvciAodCA9IHQgfHwgW107IHRoaXMucG9zIDwgZTspIHtcbiAgICAgICAgICB0LnB1c2godGhpcy5yZWFkU0ZpeGVkMzIoKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdDtcbiAgICAgIH0sXG4gICAgICByZWFkUGFja2VkRml4ZWQ2NDogZnVuY3Rpb24gcmVhZFBhY2tlZEZpeGVkNjQodCkge1xuICAgICAgICBpZiAodGhpcy50eXBlICE9PSAkcy5CeXRlcykgcmV0dXJuIHQucHVzaCh0aGlzLnJlYWRGaXhlZDY0KCkpO1xuICAgICAgICB2YXIgZSA9IFFzKHRoaXMpO1xuXG4gICAgICAgIGZvciAodCA9IHQgfHwgW107IHRoaXMucG9zIDwgZTspIHtcbiAgICAgICAgICB0LnB1c2godGhpcy5yZWFkRml4ZWQ2NCgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0O1xuICAgICAgfSxcbiAgICAgIHJlYWRQYWNrZWRTRml4ZWQ2NDogZnVuY3Rpb24gcmVhZFBhY2tlZFNGaXhlZDY0KHQpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSAhPT0gJHMuQnl0ZXMpIHJldHVybiB0LnB1c2godGhpcy5yZWFkU0ZpeGVkNjQoKSk7XG4gICAgICAgIHZhciBlID0gUXModGhpcyk7XG5cbiAgICAgICAgZm9yICh0ID0gdCB8fCBbXTsgdGhpcy5wb3MgPCBlOykge1xuICAgICAgICAgIHQucHVzaCh0aGlzLnJlYWRTRml4ZWQ2NCgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0O1xuICAgICAgfSxcbiAgICAgIHNraXA6IGZ1bmN0aW9uIHNraXAodCkge1xuICAgICAgICB2YXIgZSA9IDcgJiB0O1xuICAgICAgICBpZiAoZSA9PT0gJHMuVmFyaW50KSBmb3IgKDsgdGhpcy5idWZbdGhpcy5wb3MrK10gPiAxMjc7KSB7XG4gICAgICAgICAgO1xuICAgICAgICB9IGVsc2UgaWYgKGUgPT09ICRzLkJ5dGVzKSB0aGlzLnBvcyA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3M7ZWxzZSBpZiAoZSA9PT0gJHMuRml4ZWQzMikgdGhpcy5wb3MgKz0gNDtlbHNlIHtcbiAgICAgICAgICBpZiAoZSAhPT0gJHMuRml4ZWQ2NCkgdGhyb3cgbmV3IEVycm9yKFwiVW5pbXBsZW1lbnRlZCB0eXBlOiBcIiArIGUpO1xuICAgICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB3cml0ZVRhZzogZnVuY3Rpb24gd3JpdGVUYWcodCwgZSkge1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KHQgPDwgMyB8IGUpO1xuICAgICAgfSxcbiAgICAgIHJlYWxsb2M6IGZ1bmN0aW9uIHJlYWxsb2ModCkge1xuICAgICAgICBmb3IgKHZhciBlID0gdGhpcy5sZW5ndGggfHwgMTY7IGUgPCB0aGlzLnBvcyArIHQ7KSB7XG4gICAgICAgICAgZSAqPSAyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGUgIT09IHRoaXMubGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIHIgPSBuZXcgVWludDhBcnJheShlKTtcbiAgICAgICAgICByLnNldCh0aGlzLmJ1ZiksIHRoaXMuYnVmID0gciwgdGhpcy5sZW5ndGggPSBlO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZmluaXNoOiBmdW5jdGlvbiBmaW5pc2goKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA9IHRoaXMucG9zLCB0aGlzLnBvcyA9IDAsIHRoaXMuYnVmLnN1YmFycmF5KDAsIHRoaXMubGVuZ3RoKTtcbiAgICAgIH0sXG4gICAgICB3cml0ZUZpeGVkMzI6IGZ1bmN0aW9uIHdyaXRlRml4ZWQzMih0KSB7XG4gICAgICAgIHRoaXMucmVhbGxvYyg0KSwgaHUodGhpcy5idWYsIHQsIHRoaXMucG9zKSwgdGhpcy5wb3MgKz0gNDtcbiAgICAgIH0sXG4gICAgICB3cml0ZVNGaXhlZDMyOiBmdW5jdGlvbiB3cml0ZVNGaXhlZDMyKHQpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDQpLCBodSh0aGlzLmJ1ZiwgdCwgdGhpcy5wb3MpLCB0aGlzLnBvcyArPSA0O1xuICAgICAgfSxcbiAgICAgIHdyaXRlRml4ZWQ2NDogZnVuY3Rpb24gd3JpdGVGaXhlZDY0KHQpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDgpLCBodSh0aGlzLmJ1ZiwgLTEgJiB0LCB0aGlzLnBvcyksIGh1KHRoaXMuYnVmLCBNYXRoLmZsb29yKHQgKiAoMSAvIDQyOTQ5NjcyOTYpKSwgdGhpcy5wb3MgKyA0KSwgdGhpcy5wb3MgKz0gODtcbiAgICAgIH0sXG4gICAgICB3cml0ZVNGaXhlZDY0OiBmdW5jdGlvbiB3cml0ZVNGaXhlZDY0KHQpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDgpLCBodSh0aGlzLmJ1ZiwgLTEgJiB0LCB0aGlzLnBvcyksIGh1KHRoaXMuYnVmLCBNYXRoLmZsb29yKHQgKiAoMSAvIDQyOTQ5NjcyOTYpKSwgdGhpcy5wb3MgKyA0KSwgdGhpcy5wb3MgKz0gODtcbiAgICAgIH0sXG4gICAgICB3cml0ZVZhcmludDogZnVuY3Rpb24gd3JpdGVWYXJpbnQodCkge1xuICAgICAgICAodCA9ICt0IHx8IDApID4gMjY4NDM1NDU1IHx8IHQgPCAwID8gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICB2YXIgciwgbjtcbiAgICAgICAgICBpZiAodCA+PSAwID8gKHIgPSB0ICUgNDI5NDk2NzI5NiB8IDAsIG4gPSB0IC8gNDI5NDk2NzI5NiB8IDApIDogKG4gPSB+KC10IC8gNDI5NDk2NzI5NiksIDQyOTQ5NjcyOTUgXiAociA9IH4oLXQgJSA0Mjk0OTY3Mjk2KSkgPyByID0gciArIDEgfCAwIDogKHIgPSAwLCBuID0gbiArIDEgfCAwKSksIHQgPj0gMHgxMDAwMDAwMDAwMDAwMDAwMCB8fCB0IDwgLTB4MTAwMDAwMDAwMDAwMDAwMDApIHRocm93IG5ldyBFcnJvcihcIkdpdmVuIHZhcmludCBkb2Vzbid0IGZpdCBpbnRvIDEwIGJ5dGVzXCIpO1xuICAgICAgICAgIGUucmVhbGxvYygxMCksIGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICAgICAgICByLmJ1ZltyLnBvcysrXSA9IDEyNyAmIHQgfCAxMjgsIHQgPj4+PSA3LCByLmJ1ZltyLnBvcysrXSA9IDEyNyAmIHQgfCAxMjgsIHQgPj4+PSA3LCByLmJ1ZltyLnBvcysrXSA9IDEyNyAmIHQgfCAxMjgsIHQgPj4+PSA3LCByLmJ1ZltyLnBvcysrXSA9IDEyNyAmIHQgfCAxMjgsIHIuYnVmW3IucG9zXSA9IDEyNyAmICh0ID4+Pj0gNyk7XG4gICAgICAgICAgfShyLCAwLCBlKSwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICAgIHZhciByID0gKDcgJiB0KSA8PCA0O1xuICAgICAgICAgICAgZS5idWZbZS5wb3MrK10gfD0gciB8ICgodCA+Pj49IDMpID8gMTI4IDogMCksIHQgJiYgKGUuYnVmW2UucG9zKytdID0gMTI3ICYgdCB8ICgodCA+Pj49IDcpID8gMTI4IDogMCksIHQgJiYgKGUuYnVmW2UucG9zKytdID0gMTI3ICYgdCB8ICgodCA+Pj49IDcpID8gMTI4IDogMCksIHQgJiYgKGUuYnVmW2UucG9zKytdID0gMTI3ICYgdCB8ICgodCA+Pj49IDcpID8gMTI4IDogMCksIHQgJiYgKGUuYnVmW2UucG9zKytdID0gMTI3ICYgdCB8ICgodCA+Pj49IDcpID8gMTI4IDogMCksIHQgJiYgKGUuYnVmW2UucG9zKytdID0gMTI3ICYgdCkpKSkpO1xuICAgICAgICAgIH0obiwgZSk7XG4gICAgICAgIH0odCwgdGhpcykgOiAodGhpcy5yZWFsbG9jKDQpLCB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9IDEyNyAmIHQgfCAodCA+IDEyNyA/IDEyOCA6IDApLCB0IDw9IDEyNyB8fCAodGhpcy5idWZbdGhpcy5wb3MrK10gPSAxMjcgJiAodCA+Pj49IDcpIHwgKHQgPiAxMjcgPyAxMjggOiAwKSwgdCA8PSAxMjcgfHwgKHRoaXMuYnVmW3RoaXMucG9zKytdID0gMTI3ICYgKHQgPj4+PSA3KSB8ICh0ID4gMTI3ID8gMTI4IDogMCksIHQgPD0gMTI3IHx8ICh0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9IHQgPj4+IDcgJiAxMjcpKSkpO1xuICAgICAgfSxcbiAgICAgIHdyaXRlU1ZhcmludDogZnVuY3Rpb24gd3JpdGVTVmFyaW50KHQpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludCh0IDwgMCA/IDIgKiAtdCAtIDEgOiAyICogdCk7XG4gICAgICB9LFxuICAgICAgd3JpdGVCb29sZWFuOiBmdW5jdGlvbiB3cml0ZUJvb2xlYW4odCkge1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KEJvb2xlYW4odCkpO1xuICAgICAgfSxcbiAgICAgIHdyaXRlU3RyaW5nOiBmdW5jdGlvbiB3cml0ZVN0cmluZyh0KSB7XG4gICAgICAgIHQgPSBTdHJpbmcodCksIHRoaXMucmVhbGxvYyg0ICogdC5sZW5ndGgpLCB0aGlzLnBvcysrO1xuICAgICAgICB2YXIgZSA9IHRoaXMucG9zO1xuXG4gICAgICAgIHRoaXMucG9zID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgICAgICBmb3IgKHZhciBuLCBpLCBhID0gMDsgYSA8IGUubGVuZ3RoOyBhKyspIHtcbiAgICAgICAgICAgIGlmICgobiA9IGUuY2hhckNvZGVBdChhKSkgPiA1NTI5NSAmJiBuIDwgNTczNDQpIHtcbiAgICAgICAgICAgICAgaWYgKCFpKSB7XG4gICAgICAgICAgICAgICAgbiA+IDU2MzE5IHx8IGEgKyAxID09PSBlLmxlbmd0aCA/ICh0W3IrK10gPSAyMzksIHRbcisrXSA9IDE5MSwgdFtyKytdID0gMTg5KSA6IGkgPSBuO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKG4gPCA1NjMyMCkge1xuICAgICAgICAgICAgICAgIHRbcisrXSA9IDIzOSwgdFtyKytdID0gMTkxLCB0W3IrK10gPSAxODksIGkgPSBuO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgbiA9IGkgLSA1NTI5NiA8PCAxMCB8IG4gLSA1NjMyMCB8IDY1NTM2LCBpID0gbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSBpICYmICh0W3IrK10gPSAyMzksIHRbcisrXSA9IDE5MSwgdFtyKytdID0gMTg5LCBpID0gbnVsbCk7XG5cbiAgICAgICAgICAgIG4gPCAxMjggPyB0W3IrK10gPSBuIDogKG4gPCAyMDQ4ID8gdFtyKytdID0gbiA+PiA2IHwgMTkyIDogKG4gPCA2NTUzNiA/IHRbcisrXSA9IG4gPj4gMTIgfCAyMjQgOiAodFtyKytdID0gbiA+PiAxOCB8IDI0MCwgdFtyKytdID0gbiA+PiAxMiAmIDYzIHwgMTI4KSwgdFtyKytdID0gbiA+PiA2ICYgNjMgfCAxMjgpLCB0W3IrK10gPSA2MyAmIG4gfCAxMjgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiByO1xuICAgICAgICB9KHRoaXMuYnVmLCB0LCB0aGlzLnBvcyk7XG5cbiAgICAgICAgdmFyIHIgPSB0aGlzLnBvcyAtIGU7XG4gICAgICAgIHIgPj0gMTI4ICYmIGV1KGUsIHIsIHRoaXMpLCB0aGlzLnBvcyA9IGUgLSAxLCB0aGlzLndyaXRlVmFyaW50KHIpLCB0aGlzLnBvcyArPSByO1xuICAgICAgfSxcbiAgICAgIHdyaXRlRmxvYXQ6IGZ1bmN0aW9uIHdyaXRlRmxvYXQodCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoNCksIEhzKHRoaXMuYnVmLCB0LCB0aGlzLnBvcywgITAsIDIzLCA0KSwgdGhpcy5wb3MgKz0gNDtcbiAgICAgIH0sXG4gICAgICB3cml0ZURvdWJsZTogZnVuY3Rpb24gd3JpdGVEb3VibGUodCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoOCksIEhzKHRoaXMuYnVmLCB0LCB0aGlzLnBvcywgITAsIDUyLCA4KSwgdGhpcy5wb3MgKz0gODtcbiAgICAgIH0sXG4gICAgICB3cml0ZUJ5dGVzOiBmdW5jdGlvbiB3cml0ZUJ5dGVzKHQpIHtcbiAgICAgICAgdmFyIGUgPSB0Lmxlbmd0aDtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludChlKSwgdGhpcy5yZWFsbG9jKGUpO1xuXG4gICAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgZTsgcisrKSB7XG4gICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSB0W3JdO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgd3JpdGVSYXdNZXNzYWdlOiBmdW5jdGlvbiB3cml0ZVJhd01lc3NhZ2UodCwgZSkge1xuICAgICAgICB0aGlzLnBvcysrO1xuICAgICAgICB2YXIgciA9IHRoaXMucG9zO1xuICAgICAgICB0KGUsIHRoaXMpO1xuICAgICAgICB2YXIgbiA9IHRoaXMucG9zIC0gcjtcbiAgICAgICAgbiA+PSAxMjggJiYgZXUociwgbiwgdGhpcyksIHRoaXMucG9zID0gciAtIDEsIHRoaXMud3JpdGVWYXJpbnQobiksIHRoaXMucG9zICs9IG47XG4gICAgICB9LFxuICAgICAgd3JpdGVNZXNzYWdlOiBmdW5jdGlvbiB3cml0ZU1lc3NhZ2UodCwgZSwgcikge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHQsICRzLkJ5dGVzKSwgdGhpcy53cml0ZVJhd01lc3NhZ2UoZSwgcik7XG4gICAgICB9LFxuICAgICAgd3JpdGVQYWNrZWRWYXJpbnQ6IGZ1bmN0aW9uIHdyaXRlUGFja2VkVmFyaW50KHQsIGUpIHtcbiAgICAgICAgZS5sZW5ndGggJiYgdGhpcy53cml0ZU1lc3NhZ2UodCwgcnUsIGUpO1xuICAgICAgfSxcbiAgICAgIHdyaXRlUGFja2VkU1ZhcmludDogZnVuY3Rpb24gd3JpdGVQYWNrZWRTVmFyaW50KHQsIGUpIHtcbiAgICAgICAgZS5sZW5ndGggJiYgdGhpcy53cml0ZU1lc3NhZ2UodCwgbnUsIGUpO1xuICAgICAgfSxcbiAgICAgIHdyaXRlUGFja2VkQm9vbGVhbjogZnVuY3Rpb24gd3JpdGVQYWNrZWRCb29sZWFuKHQsIGUpIHtcbiAgICAgICAgZS5sZW5ndGggJiYgdGhpcy53cml0ZU1lc3NhZ2UodCwgb3UsIGUpO1xuICAgICAgfSxcbiAgICAgIHdyaXRlUGFja2VkRmxvYXQ6IGZ1bmN0aW9uIHdyaXRlUGFja2VkRmxvYXQodCwgZSkge1xuICAgICAgICBlLmxlbmd0aCAmJiB0aGlzLndyaXRlTWVzc2FnZSh0LCBpdSwgZSk7XG4gICAgICB9LFxuICAgICAgd3JpdGVQYWNrZWREb3VibGU6IGZ1bmN0aW9uIHdyaXRlUGFja2VkRG91YmxlKHQsIGUpIHtcbiAgICAgICAgZS5sZW5ndGggJiYgdGhpcy53cml0ZU1lc3NhZ2UodCwgYXUsIGUpO1xuICAgICAgfSxcbiAgICAgIHdyaXRlUGFja2VkRml4ZWQzMjogZnVuY3Rpb24gd3JpdGVQYWNrZWRGaXhlZDMyKHQsIGUpIHtcbiAgICAgICAgZS5sZW5ndGggJiYgdGhpcy53cml0ZU1lc3NhZ2UodCwgc3UsIGUpO1xuICAgICAgfSxcbiAgICAgIHdyaXRlUGFja2VkU0ZpeGVkMzI6IGZ1bmN0aW9uIHdyaXRlUGFja2VkU0ZpeGVkMzIodCwgZSkge1xuICAgICAgICBlLmxlbmd0aCAmJiB0aGlzLndyaXRlTWVzc2FnZSh0LCB1dSwgZSk7XG4gICAgICB9LFxuICAgICAgd3JpdGVQYWNrZWRGaXhlZDY0OiBmdW5jdGlvbiB3cml0ZVBhY2tlZEZpeGVkNjQodCwgZSkge1xuICAgICAgICBlLmxlbmd0aCAmJiB0aGlzLndyaXRlTWVzc2FnZSh0LCBsdSwgZSk7XG4gICAgICB9LFxuICAgICAgd3JpdGVQYWNrZWRTRml4ZWQ2NDogZnVuY3Rpb24gd3JpdGVQYWNrZWRTRml4ZWQ2NCh0LCBlKSB7XG4gICAgICAgIGUubGVuZ3RoICYmIHRoaXMud3JpdGVNZXNzYWdlKHQsIHB1LCBlKTtcbiAgICAgIH0sXG4gICAgICB3cml0ZUJ5dGVzRmllbGQ6IGZ1bmN0aW9uIHdyaXRlQnl0ZXNGaWVsZCh0LCBlKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodCwgJHMuQnl0ZXMpLCB0aGlzLndyaXRlQnl0ZXMoZSk7XG4gICAgICB9LFxuICAgICAgd3JpdGVGaXhlZDMyRmllbGQ6IGZ1bmN0aW9uIHdyaXRlRml4ZWQzMkZpZWxkKHQsIGUpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0LCAkcy5GaXhlZDMyKSwgdGhpcy53cml0ZUZpeGVkMzIoZSk7XG4gICAgICB9LFxuICAgICAgd3JpdGVTRml4ZWQzMkZpZWxkOiBmdW5jdGlvbiB3cml0ZVNGaXhlZDMyRmllbGQodCwgZSkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHQsICRzLkZpeGVkMzIpLCB0aGlzLndyaXRlU0ZpeGVkMzIoZSk7XG4gICAgICB9LFxuICAgICAgd3JpdGVGaXhlZDY0RmllbGQ6IGZ1bmN0aW9uIHdyaXRlRml4ZWQ2NEZpZWxkKHQsIGUpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0LCAkcy5GaXhlZDY0KSwgdGhpcy53cml0ZUZpeGVkNjQoZSk7XG4gICAgICB9LFxuICAgICAgd3JpdGVTRml4ZWQ2NEZpZWxkOiBmdW5jdGlvbiB3cml0ZVNGaXhlZDY0RmllbGQodCwgZSkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHQsICRzLkZpeGVkNjQpLCB0aGlzLndyaXRlU0ZpeGVkNjQoZSk7XG4gICAgICB9LFxuICAgICAgd3JpdGVWYXJpbnRGaWVsZDogZnVuY3Rpb24gd3JpdGVWYXJpbnRGaWVsZCh0LCBlKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodCwgJHMuVmFyaW50KSwgdGhpcy53cml0ZVZhcmludChlKTtcbiAgICAgIH0sXG4gICAgICB3cml0ZVNWYXJpbnRGaWVsZDogZnVuY3Rpb24gd3JpdGVTVmFyaW50RmllbGQodCwgZSkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHQsICRzLlZhcmludCksIHRoaXMud3JpdGVTVmFyaW50KGUpO1xuICAgICAgfSxcbiAgICAgIHdyaXRlU3RyaW5nRmllbGQ6IGZ1bmN0aW9uIHdyaXRlU3RyaW5nRmllbGQodCwgZSkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHQsICRzLkJ5dGVzKSwgdGhpcy53cml0ZVN0cmluZyhlKTtcbiAgICAgIH0sXG4gICAgICB3cml0ZUZsb2F0RmllbGQ6IGZ1bmN0aW9uIHdyaXRlRmxvYXRGaWVsZCh0LCBlKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodCwgJHMuRml4ZWQzMiksIHRoaXMud3JpdGVGbG9hdChlKTtcbiAgICAgIH0sXG4gICAgICB3cml0ZURvdWJsZUZpZWxkOiBmdW5jdGlvbiB3cml0ZURvdWJsZUZpZWxkKHQsIGUpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0LCAkcy5GaXhlZDY0KSwgdGhpcy53cml0ZURvdWJsZShlKTtcbiAgICAgIH0sXG4gICAgICB3cml0ZUJvb2xlYW5GaWVsZDogZnVuY3Rpb24gd3JpdGVCb29sZWFuRmllbGQodCwgZSkge1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50RmllbGQodCwgQm9vbGVhbihlKSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciBndSA9IGZ1bmN0aW9uIGd1KHQsIGUpIHtcbiAgICAgIHZhciByID0gZS5waXhlbFJhdGlvLFxuICAgICAgICAgIG4gPSBlLnZlcnNpb24sXG4gICAgICAgICAgaSA9IGUuc3RyZXRjaFgsXG4gICAgICAgICAgYSA9IGUuc3RyZXRjaFksXG4gICAgICAgICAgbyA9IGUuY29udGVudDtcbiAgICAgIHRoaXMucGFkZGVkUmVjdCA9IHQsIHRoaXMucGl4ZWxSYXRpbyA9IHIsIHRoaXMuc3RyZXRjaFggPSBpLCB0aGlzLnN0cmV0Y2hZID0gYSwgdGhpcy5jb250ZW50ID0gbywgdGhpcy52ZXJzaW9uID0gbjtcbiAgICB9LFxuICAgICAgICB4dSA9IHtcbiAgICAgIHRsOiB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgIH0sXG4gICAgICBicjoge1xuICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICB9LFxuICAgICAgdGxicjoge1xuICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICB9LFxuICAgICAgZGlzcGxheVNpemU6IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgfVxuICAgIH07XG5cbiAgICB4dS50bC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gW3RoaXMucGFkZGVkUmVjdC54ICsgMSwgdGhpcy5wYWRkZWRSZWN0LnkgKyAxXTtcbiAgICB9LCB4dS5ici5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gW3RoaXMucGFkZGVkUmVjdC54ICsgdGhpcy5wYWRkZWRSZWN0LncgLSAxLCB0aGlzLnBhZGRlZFJlY3QueSArIHRoaXMucGFkZGVkUmVjdC5oIC0gMV07XG4gICAgfSwgeHUudGxici5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy50bC5jb25jYXQodGhpcy5icik7XG4gICAgfSwgeHUuZGlzcGxheVNpemUuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIFsodGhpcy5wYWRkZWRSZWN0LncgLSAyKSAvIHRoaXMucGl4ZWxSYXRpbywgKHRoaXMucGFkZGVkUmVjdC5oIC0gMikgLyB0aGlzLnBpeGVsUmF0aW9dO1xuICAgIH0sIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGd1LnByb3RvdHlwZSwgeHUpO1xuXG4gICAgdmFyIGJ1ID0gZnVuY3Rpb24gYnUodCwgZSkge1xuICAgICAgdmFyIHIgPSB7fSxcbiAgICAgICAgICBuID0ge307XG4gICAgICB0aGlzLmhhdmVSZW5kZXJDYWxsYmFja3MgPSBbXTtcbiAgICAgIHZhciBpID0gW107XG4gICAgICB0aGlzLmFkZEltYWdlcyh0LCByLCBpKSwgdGhpcy5hZGRJbWFnZXMoZSwgbiwgaSk7XG4gICAgICB2YXIgYSA9IHZ1KGkpLFxuICAgICAgICAgIG8gPSBuZXcgeG8oe1xuICAgICAgICB3aWR0aDogYS53IHx8IDEsXG4gICAgICAgIGhlaWdodDogYS5oIHx8IDFcbiAgICAgIH0pO1xuXG4gICAgICBmb3IgKHZhciBzIGluIHQpIHtcbiAgICAgICAgdmFyIHUgPSB0W3NdLFxuICAgICAgICAgICAgbCA9IHJbc10ucGFkZGVkUmVjdDtcbiAgICAgICAgeG8uY29weSh1LmRhdGEsIG8sIHtcbiAgICAgICAgICB4OiAwLFxuICAgICAgICAgIHk6IDBcbiAgICAgICAgfSwge1xuICAgICAgICAgIHg6IGwueCArIDEsXG4gICAgICAgICAgeTogbC55ICsgMVxuICAgICAgICB9LCB1LmRhdGEpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBwIGluIGUpIHtcbiAgICAgICAgdmFyIGMgPSBlW3BdLFxuICAgICAgICAgICAgaCA9IG5bcF0ucGFkZGVkUmVjdCxcbiAgICAgICAgICAgIGYgPSBoLnggKyAxLFxuICAgICAgICAgICAgeSA9IGgueSArIDEsXG4gICAgICAgICAgICBkID0gYy5kYXRhLndpZHRoLFxuICAgICAgICAgICAgbSA9IGMuZGF0YS5oZWlnaHQ7XG4gICAgICAgIHhvLmNvcHkoYy5kYXRhLCBvLCB7XG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICB5OiAwXG4gICAgICAgIH0sIHtcbiAgICAgICAgICB4OiBmLFxuICAgICAgICAgIHk6IHlcbiAgICAgICAgfSwgYy5kYXRhKSwgeG8uY29weShjLmRhdGEsIG8sIHtcbiAgICAgICAgICB4OiAwLFxuICAgICAgICAgIHk6IG0gLSAxXG4gICAgICAgIH0sIHtcbiAgICAgICAgICB4OiBmLFxuICAgICAgICAgIHk6IHkgLSAxXG4gICAgICAgIH0sIHtcbiAgICAgICAgICB3aWR0aDogZCxcbiAgICAgICAgICBoZWlnaHQ6IDFcbiAgICAgICAgfSksIHhvLmNvcHkoYy5kYXRhLCBvLCB7XG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICB5OiAwXG4gICAgICAgIH0sIHtcbiAgICAgICAgICB4OiBmLFxuICAgICAgICAgIHk6IHkgKyBtXG4gICAgICAgIH0sIHtcbiAgICAgICAgICB3aWR0aDogZCxcbiAgICAgICAgICBoZWlnaHQ6IDFcbiAgICAgICAgfSksIHhvLmNvcHkoYy5kYXRhLCBvLCB7XG4gICAgICAgICAgeDogZCAtIDEsXG4gICAgICAgICAgeTogMFxuICAgICAgICB9LCB7XG4gICAgICAgICAgeDogZiAtIDEsXG4gICAgICAgICAgeTogeVxuICAgICAgICB9LCB7XG4gICAgICAgICAgd2lkdGg6IDEsXG4gICAgICAgICAgaGVpZ2h0OiBtXG4gICAgICAgIH0pLCB4by5jb3B5KGMuZGF0YSwgbywge1xuICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgeTogMFxuICAgICAgICB9LCB7XG4gICAgICAgICAgeDogZiArIGQsXG4gICAgICAgICAgeTogeVxuICAgICAgICB9LCB7XG4gICAgICAgICAgd2lkdGg6IDEsXG4gICAgICAgICAgaGVpZ2h0OiBtXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmltYWdlID0gbywgdGhpcy5pY29uUG9zaXRpb25zID0gciwgdGhpcy5wYXR0ZXJuUG9zaXRpb25zID0gbjtcbiAgICB9O1xuXG4gICAgYnUucHJvdG90eXBlLmFkZEltYWdlcyA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICBmb3IgKHZhciBuIGluIHQpIHtcbiAgICAgICAgdmFyIGkgPSB0W25dLFxuICAgICAgICAgICAgYSA9IHtcbiAgICAgICAgICB4OiAwLFxuICAgICAgICAgIHk6IDAsXG4gICAgICAgICAgdzogaS5kYXRhLndpZHRoICsgMixcbiAgICAgICAgICBoOiBpLmRhdGEuaGVpZ2h0ICsgMlxuICAgICAgICB9O1xuICAgICAgICByLnB1c2goYSksIGVbbl0gPSBuZXcgZ3UoYSwgaSksIGkuaGFzUmVuZGVyQ2FsbGJhY2sgJiYgdGhpcy5oYXZlUmVuZGVyQ2FsbGJhY2tzLnB1c2gobik7XG4gICAgICB9XG4gICAgfSwgYnUucHJvdG90eXBlLnBhdGNoVXBkYXRlZEltYWdlcyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICBmb3IgKHZhciByIGluIHQuZGlzcGF0Y2hSZW5kZXJDYWxsYmFja3ModGhpcy5oYXZlUmVuZGVyQ2FsbGJhY2tzKSwgdC51cGRhdGVkSW1hZ2VzKSB7XG4gICAgICAgIHRoaXMucGF0Y2hVcGRhdGVkSW1hZ2UodGhpcy5pY29uUG9zaXRpb25zW3JdLCB0LmdldEltYWdlKHIpLCBlKSwgdGhpcy5wYXRjaFVwZGF0ZWRJbWFnZSh0aGlzLnBhdHRlcm5Qb3NpdGlvbnNbcl0sIHQuZ2V0SW1hZ2UociksIGUpO1xuICAgICAgfVxuICAgIH0sIGJ1LnByb3RvdHlwZS5wYXRjaFVwZGF0ZWRJbWFnZSA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICBpZiAodCAmJiBlICYmIHQudmVyc2lvbiAhPT0gZS52ZXJzaW9uKSB7XG4gICAgICAgIHQudmVyc2lvbiA9IGUudmVyc2lvbjtcbiAgICAgICAgdmFyIG4gPSB0LnRsO1xuICAgICAgICByLnVwZGF0ZShlLmRhdGEsIHZvaWQgMCwge1xuICAgICAgICAgIHg6IG5bMF0sXG4gICAgICAgICAgeTogblsxXVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LCBPbihcIkltYWdlUG9zaXRpb25cIiwgZ3UpLCBPbihcIkltYWdlQXRsYXNcIiwgYnUpO1xuXG4gICAgdmFyIHd1ID0ge1xuICAgICAgaG9yaXpvbnRhbDogMSxcbiAgICAgIHZlcnRpY2FsOiAyLFxuICAgICAgaG9yaXpvbnRhbE9ubHk6IDNcbiAgICB9LFxuICAgICAgICBfdSA9IGZ1bmN0aW9uIF91KCkge1xuICAgICAgdGhpcy5zY2FsZSA9IDEsIHRoaXMuZm9udFN0YWNrID0gXCJcIiwgdGhpcy5pbWFnZU5hbWUgPSBudWxsO1xuICAgIH07XG5cbiAgICBfdS5mb3JUZXh0ID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHZhciByID0gbmV3IF91KCk7XG4gICAgICByZXR1cm4gci5zY2FsZSA9IHQgfHwgMSwgci5mb250U3RhY2sgPSBlLCByO1xuICAgIH0sIF91LmZvckltYWdlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHZhciBlID0gbmV3IF91KCk7XG4gICAgICByZXR1cm4gZS5pbWFnZU5hbWUgPSB0LCBlO1xuICAgIH07XG5cbiAgICB2YXIgQXUgPSBmdW5jdGlvbiBBdSgpIHtcbiAgICAgIHRoaXMudGV4dCA9IFwiXCIsIHRoaXMuc2VjdGlvbkluZGV4ID0gW10sIHRoaXMuc2VjdGlvbnMgPSBbXSwgdGhpcy5pbWFnZVNlY3Rpb25JRCA9IG51bGw7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIFN1KHQsIGUsIHIsIG4sIGksIGEsIG8sIHMsIHUsIGwsIHAsIGMsIGgsIGYsIHksIGQpIHtcbiAgICAgIHZhciBtLFxuICAgICAgICAgIHYgPSBBdS5mcm9tRmVhdHVyZSh0LCBpKTtcbiAgICAgIGMgPT09IHd1LnZlcnRpY2FsICYmIHYudmVydGljYWxpemVQdW5jdHVhdGlvbigpO1xuICAgICAgdmFyIGcgPSBvaS5wcm9jZXNzQmlkaXJlY3Rpb25hbFRleHQsXG4gICAgICAgICAgeCA9IG9pLnByb2Nlc3NTdHlsZWRCaWRpcmVjdGlvbmFsVGV4dDtcblxuICAgICAgaWYgKGcgJiYgMSA9PT0gdi5zZWN0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgbSA9IFtdO1xuXG4gICAgICAgIGZvciAodmFyIGIgPSAwLCB3ID0gZyh2LnRvU3RyaW5nKCksIE11KHYsIGwsIGEsIGUsIG4sIGYsIHkpKTsgYiA8IHcubGVuZ3RoOyBiICs9IDEpIHtcbiAgICAgICAgICB2YXIgXyA9IHdbYl0sXG4gICAgICAgICAgICAgIEEgPSBuZXcgQXUoKTtcbiAgICAgICAgICBBLnRleHQgPSBfLCBBLnNlY3Rpb25zID0gdi5zZWN0aW9ucztcblxuICAgICAgICAgIGZvciAodmFyIFMgPSAwOyBTIDwgXy5sZW5ndGg7IFMrKykge1xuICAgICAgICAgICAgQS5zZWN0aW9uSW5kZXgucHVzaCgwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBtLnB1c2goQSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoeCkge1xuICAgICAgICBtID0gW107XG5cbiAgICAgICAgZm9yICh2YXIgayA9IDAsIEkgPSB4KHYudGV4dCwgdi5zZWN0aW9uSW5kZXgsIE11KHYsIGwsIGEsIGUsIG4sIGYsIHkpKTsgayA8IEkubGVuZ3RoOyBrICs9IDEpIHtcbiAgICAgICAgICB2YXIgeiA9IElba10sXG4gICAgICAgICAgICAgIEMgPSBuZXcgQXUoKTtcbiAgICAgICAgICBDLnRleHQgPSB6WzBdLCBDLnNlY3Rpb25JbmRleCA9IHpbMV0sIEMuc2VjdGlvbnMgPSB2LnNlY3Rpb25zLCBtLnB1c2goQyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBtID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgZm9yICh2YXIgciA9IFtdLCBuID0gdC50ZXh0LCBpID0gMCwgYSA9IDAsIG8gPSBlOyBhIDwgby5sZW5ndGg7IGEgKz0gMSkge1xuICAgICAgICAgIHZhciBzID0gb1thXTtcbiAgICAgICAgICByLnB1c2godC5zdWJzdHJpbmcoaSwgcykpLCBpID0gcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpIDwgbi5sZW5ndGggJiYgci5wdXNoKHQuc3Vic3RyaW5nKGksIG4ubGVuZ3RoKSksIHI7XG4gICAgICB9KHYsIE11KHYsIGwsIGEsIGUsIG4sIGYsIHkpKTtcblxuICAgICAgdmFyIEUgPSBbXSxcbiAgICAgICAgICBQID0ge1xuICAgICAgICBwb3NpdGlvbmVkTGluZXM6IEUsXG4gICAgICAgIHRleHQ6IHYudG9TdHJpbmcoKSxcbiAgICAgICAgdG9wOiBwWzFdLFxuICAgICAgICBib3R0b206IHBbMV0sXG4gICAgICAgIGxlZnQ6IHBbMF0sXG4gICAgICAgIHJpZ2h0OiBwWzBdLFxuICAgICAgICB3cml0aW5nTW9kZTogYyxcbiAgICAgICAgaWNvbnNJblRleHQ6ICExLFxuICAgICAgICB2ZXJ0aWNhbGl6YWJsZTogITFcbiAgICAgIH07XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGksIGEsIG8sIHMsIHUsIGwsIHAsIGMpIHtcbiAgICAgICAgZm9yICh2YXIgaCA9IDAsIGYgPSAtMTcsIHkgPSAwLCBkID0gMCwgbSA9IFwicmlnaHRcIiA9PT0gcyA/IDEgOiBcImxlZnRcIiA9PT0gcyA/IDAgOiAuNSwgdiA9IDAsIGcgPSAwLCB4ID0gaTsgZyA8IHgubGVuZ3RoOyBnICs9IDEpIHtcbiAgICAgICAgICB2YXIgYiA9IHhbZ107XG4gICAgICAgICAgYi50cmltKCk7XG5cbiAgICAgICAgICB2YXIgdyA9IGIuZ2V0TWF4U2NhbGUoKSxcbiAgICAgICAgICAgICAgXyA9IDI0ICogKHcgLSAxKSxcbiAgICAgICAgICAgICAgQSA9IHtcbiAgICAgICAgICAgIHBvc2l0aW9uZWRHbHlwaHM6IFtdLFxuICAgICAgICAgICAgbGluZU9mZnNldDogMFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICB0LnBvc2l0aW9uZWRMaW5lc1t2XSA9IEE7XG4gICAgICAgICAgdmFyIFMgPSBBLnBvc2l0aW9uZWRHbHlwaHMsXG4gICAgICAgICAgICAgIGsgPSAwO1xuXG4gICAgICAgICAgaWYgKGIubGVuZ3RoKCkpIHtcbiAgICAgICAgICAgIGZvciAodmFyIEkgPSAwOyBJIDwgYi5sZW5ndGgoKTsgSSsrKSB7XG4gICAgICAgICAgICAgIHZhciB6ID0gYi5nZXRTZWN0aW9uKEkpLFxuICAgICAgICAgICAgICAgICAgQyA9IGIuZ2V0U2VjdGlvbkluZGV4KEkpLFxuICAgICAgICAgICAgICAgICAgRSA9IGIuZ2V0Q2hhckNvZGUoSSksXG4gICAgICAgICAgICAgICAgICBQID0gMCxcbiAgICAgICAgICAgICAgICAgIE0gPSBudWxsLFxuICAgICAgICAgICAgICAgICAgQiA9IG51bGwsXG4gICAgICAgICAgICAgICAgICBUID0gbnVsbCxcbiAgICAgICAgICAgICAgICAgIFYgPSAyNCxcbiAgICAgICAgICAgICAgICAgIEYgPSAhKHUgPT09IHd1Lmhvcml6b250YWwgfHwgIXAgJiYgIVhuKEUpIHx8IHAgJiYgKGt1W0VdIHx8IChLID0gRSwgR24uQXJhYmljKEspIHx8IEduW1wiQXJhYmljIFN1cHBsZW1lbnRcIl0oSykgfHwgR25bXCJBcmFiaWMgRXh0ZW5kZWQtQVwiXShLKSB8fCBHbltcIkFyYWJpYyBQcmVzZW50YXRpb24gRm9ybXMtQVwiXShLKSB8fCBHbltcIkFyYWJpYyBQcmVzZW50YXRpb24gRm9ybXMtQlwiXShLKSkpKTtcblxuICAgICAgICAgICAgICBpZiAoei5pbWFnZU5hbWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgRCA9IG5bei5pbWFnZU5hbWVdO1xuICAgICAgICAgICAgICAgIGlmICghRCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgVCA9IHouaW1hZ2VOYW1lLCB0Lmljb25zSW5UZXh0ID0gdC5pY29uc0luVGV4dCB8fCAhMCwgQiA9IEQucGFkZGVkUmVjdDtcbiAgICAgICAgICAgICAgICB2YXIgTCA9IEQuZGlzcGxheVNpemU7XG4gICAgICAgICAgICAgICAgei5zY2FsZSA9IDI0ICogei5zY2FsZSAvIGMsIFAgPSBfICsgKDI0IC0gTFsxXSAqIHouc2NhbGUpLCBWID0gKE0gPSB7XG4gICAgICAgICAgICAgICAgICB3aWR0aDogTFswXSxcbiAgICAgICAgICAgICAgICAgIGhlaWdodDogTFsxXSxcbiAgICAgICAgICAgICAgICAgIGxlZnQ6IDEsXG4gICAgICAgICAgICAgICAgICB0b3A6IC0zLFxuICAgICAgICAgICAgICAgICAgYWR2YW5jZTogRiA/IExbMV0gOiBMWzBdXG4gICAgICAgICAgICAgICAgfSkuYWR2YW5jZTtcbiAgICAgICAgICAgICAgICB2YXIgTyA9IEYgPyBMWzBdICogei5zY2FsZSAtIDI0ICogdyA6IExbMV0gKiB6LnNjYWxlIC0gMjQgKiB3O1xuICAgICAgICAgICAgICAgIE8gPiAwICYmIE8gPiBrICYmIChrID0gTyk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIFIgPSByW3ouZm9udFN0YWNrXSxcbiAgICAgICAgICAgICAgICAgICAgVSA9IFIgJiYgUltFXTtcbiAgICAgICAgICAgICAgICBpZiAoVSAmJiBVLnJlY3QpIEIgPSBVLnJlY3QsIE0gPSBVLm1ldHJpY3M7ZWxzZSB7XG4gICAgICAgICAgICAgICAgICB2YXIgaiA9IGVbei5mb250U3RhY2tdLFxuICAgICAgICAgICAgICAgICAgICAgIHEgPSBqICYmIGpbRV07XG4gICAgICAgICAgICAgICAgICBpZiAoIXEpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgTSA9IHEubWV0cmljcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgUCA9IDI0ICogKHcgLSB6LnNjYWxlKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIEYgPyAodC52ZXJ0aWNhbGl6YWJsZSA9ICEwLCBTLnB1c2goe1xuICAgICAgICAgICAgICAgIGdseXBoOiBFLFxuICAgICAgICAgICAgICAgIGltYWdlTmFtZTogVCxcbiAgICAgICAgICAgICAgICB4OiBoLFxuICAgICAgICAgICAgICAgIHk6IGYgKyBQLFxuICAgICAgICAgICAgICAgIHZlcnRpY2FsOiBGLFxuICAgICAgICAgICAgICAgIHNjYWxlOiB6LnNjYWxlLFxuICAgICAgICAgICAgICAgIGZvbnRTdGFjazogei5mb250U3RhY2ssXG4gICAgICAgICAgICAgICAgc2VjdGlvbkluZGV4OiBDLFxuICAgICAgICAgICAgICAgIG1ldHJpY3M6IE0sXG4gICAgICAgICAgICAgICAgcmVjdDogQlxuICAgICAgICAgICAgICB9KSwgaCArPSBWICogei5zY2FsZSArIGwpIDogKFMucHVzaCh7XG4gICAgICAgICAgICAgICAgZ2x5cGg6IEUsXG4gICAgICAgICAgICAgICAgaW1hZ2VOYW1lOiBULFxuICAgICAgICAgICAgICAgIHg6IGgsXG4gICAgICAgICAgICAgICAgeTogZiArIFAsXG4gICAgICAgICAgICAgICAgdmVydGljYWw6IEYsXG4gICAgICAgICAgICAgICAgc2NhbGU6IHouc2NhbGUsXG4gICAgICAgICAgICAgICAgZm9udFN0YWNrOiB6LmZvbnRTdGFjayxcbiAgICAgICAgICAgICAgICBzZWN0aW9uSW5kZXg6IEMsXG4gICAgICAgICAgICAgICAgbWV0cmljczogTSxcbiAgICAgICAgICAgICAgICByZWN0OiBCXG4gICAgICAgICAgICAgIH0pLCBoICs9IE0uYWR2YW5jZSAqIHouc2NhbGUgKyBsKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgMCAhPT0gUy5sZW5ndGggJiYgKHkgPSBNYXRoLm1heChoIC0gbCwgeSksIFR1KFMsIDAsIFMubGVuZ3RoIC0gMSwgbSwgaykpLCBoID0gMDtcbiAgICAgICAgICAgIHZhciBOID0gYSAqIHcgKyBrO1xuICAgICAgICAgICAgQS5saW5lT2Zmc2V0ID0gTWF0aC5tYXgoaywgXyksIGYgKz0gTiwgZCA9IE1hdGgubWF4KE4sIGQpLCArK3Y7XG4gICAgICAgICAgfSBlbHNlIGYgKz0gYSwgKyt2O1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIEssXG4gICAgICAgICAgICBHID0gZiAtIC0xNyxcbiAgICAgICAgICAgIFogPSBCdShvKSxcbiAgICAgICAgICAgIFggPSBaLmhvcml6b250YWxBbGlnbixcbiAgICAgICAgICAgIEogPSBaLnZlcnRpY2FsQWxpZ247XG4gICAgICAgIChmdW5jdGlvbiAodCwgZSwgciwgbiwgaSwgYSwgbywgcywgdSkge1xuICAgICAgICAgIHZhciBsLFxuICAgICAgICAgICAgICBwID0gKGUgLSByKSAqIGk7XG4gICAgICAgICAgbCA9IGEgIT09IG8gPyAtcyAqIG4gLSAtMTcgOiAoLW4gKiB1ICsgLjUpICogbztcblxuICAgICAgICAgIGZvciAodmFyIGMgPSAwLCBoID0gdDsgYyA8IGgubGVuZ3RoOyBjICs9IDEpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGYgPSAwLCB5ID0gaFtjXS5wb3NpdGlvbmVkR2x5cGhzOyBmIDwgeS5sZW5ndGg7IGYgKz0gMSkge1xuICAgICAgICAgICAgICB2YXIgZCA9IHlbZl07XG4gICAgICAgICAgICAgIGQueCArPSBwLCBkLnkgKz0gbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pKHQucG9zaXRpb25lZExpbmVzLCBtLCBYLCBKLCB5LCBkLCBhLCBHLCBpLmxlbmd0aCksIHQudG9wICs9IC1KICogRywgdC5ib3R0b20gPSB0LnRvcCArIEcsIHQubGVmdCArPSAtWCAqIHksIHQucmlnaHQgPSB0LmxlZnQgKyB5O1xuICAgICAgfShQLCBlLCByLCBuLCBtLCBvLCBzLCB1LCBjLCBsLCBoLCBkKSwgIWZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGZvciAodmFyIGUgPSAwLCByID0gdDsgZSA8IHIubGVuZ3RoOyBlICs9IDEpIHtcbiAgICAgICAgICBpZiAoMCAhPT0gcltlXS5wb3NpdGlvbmVkR2x5cGhzLmxlbmd0aCkgcmV0dXJuICExO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICEwO1xuICAgICAgfShFKSAmJiBQO1xuICAgIH1cblxuICAgIEF1LmZyb21GZWF0dXJlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIGZvciAodmFyIHIgPSBuZXcgQXUoKSwgbiA9IDA7IG4gPCB0LnNlY3Rpb25zLmxlbmd0aDsgbisrKSB7XG4gICAgICAgIHZhciBpID0gdC5zZWN0aW9uc1tuXTtcbiAgICAgICAgaS5pbWFnZSA/IHIuYWRkSW1hZ2VTZWN0aW9uKGkpIDogci5hZGRUZXh0U2VjdGlvbihpLCBlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSwgQXUucHJvdG90eXBlLmxlbmd0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLnRleHQubGVuZ3RoO1xuICAgIH0sIEF1LnByb3RvdHlwZS5nZXRTZWN0aW9uID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0aGlzLnNlY3Rpb25zW3RoaXMuc2VjdGlvbkluZGV4W3RdXTtcbiAgICB9LCBBdS5wcm90b3R5cGUuZ2V0U2VjdGlvbkluZGV4ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0aGlzLnNlY3Rpb25JbmRleFt0XTtcbiAgICB9LCBBdS5wcm90b3R5cGUuZ2V0Q2hhckNvZGUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHRoaXMudGV4dC5jaGFyQ29kZUF0KHQpO1xuICAgIH0sIEF1LnByb3RvdHlwZS52ZXJ0aWNhbGl6ZVB1bmN0dWF0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy50ZXh0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgZm9yICh2YXIgZSA9IFwiXCIsIHIgPSAwOyByIDwgdC5sZW5ndGg7IHIrKykge1xuICAgICAgICAgIHZhciBuID0gdC5jaGFyQ29kZUF0KHIgKyAxKSB8fCBudWxsLFxuICAgICAgICAgICAgICBpID0gdC5jaGFyQ29kZUF0KHIgLSAxKSB8fCBudWxsO1xuICAgICAgICAgIGUgKz0gbiAmJiBKbihuKSAmJiAhWHNbdFtyICsgMV1dIHx8IGkgJiYgSm4oaSkgJiYgIVhzW3RbciAtIDFdXSB8fCAhWHNbdFtyXV0gPyB0W3JdIDogWHNbdFtyXV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0odGhpcy50ZXh0KTtcbiAgICB9LCBBdS5wcm90b3R5cGUudHJpbSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIHQgPSAwLCBlID0gMDsgZSA8IHRoaXMudGV4dC5sZW5ndGggJiYga3VbdGhpcy50ZXh0LmNoYXJDb2RlQXQoZSldOyBlKyspIHtcbiAgICAgICAgdCsrO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciByID0gdGhpcy50ZXh0Lmxlbmd0aCwgbiA9IHRoaXMudGV4dC5sZW5ndGggLSAxOyBuID49IDAgJiYgbiA+PSB0ICYmIGt1W3RoaXMudGV4dC5jaGFyQ29kZUF0KG4pXTsgbi0tKSB7XG4gICAgICAgIHItLTtcbiAgICAgIH1cblxuICAgICAgdGhpcy50ZXh0ID0gdGhpcy50ZXh0LnN1YnN0cmluZyh0LCByKSwgdGhpcy5zZWN0aW9uSW5kZXggPSB0aGlzLnNlY3Rpb25JbmRleC5zbGljZSh0LCByKTtcbiAgICB9LCBBdS5wcm90b3R5cGUuc3Vic3RyaW5nID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHZhciByID0gbmV3IEF1KCk7XG4gICAgICByZXR1cm4gci50ZXh0ID0gdGhpcy50ZXh0LnN1YnN0cmluZyh0LCBlKSwgci5zZWN0aW9uSW5kZXggPSB0aGlzLnNlY3Rpb25JbmRleC5zbGljZSh0LCBlKSwgci5zZWN0aW9ucyA9IHRoaXMuc2VjdGlvbnMsIHI7XG4gICAgfSwgQXUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMudGV4dDtcbiAgICB9LCBBdS5wcm90b3R5cGUuZ2V0TWF4U2NhbGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdCA9IHRoaXM7XG4gICAgICByZXR1cm4gdGhpcy5zZWN0aW9uSW5kZXgucmVkdWNlKGZ1bmN0aW9uIChlLCByKSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1heChlLCB0LnNlY3Rpb25zW3JdLnNjYWxlKTtcbiAgICAgIH0sIDApO1xuICAgIH0sIEF1LnByb3RvdHlwZS5hZGRUZXh0U2VjdGlvbiA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB0aGlzLnRleHQgKz0gdC50ZXh0LCB0aGlzLnNlY3Rpb25zLnB1c2goX3UuZm9yVGV4dCh0LnNjYWxlLCB0LmZvbnRTdGFjayB8fCBlKSk7XG5cbiAgICAgIGZvciAodmFyIHIgPSB0aGlzLnNlY3Rpb25zLmxlbmd0aCAtIDEsIG4gPSAwOyBuIDwgdC50ZXh0Lmxlbmd0aDsgKytuKSB7XG4gICAgICAgIHRoaXMuc2VjdGlvbkluZGV4LnB1c2gocik7XG4gICAgICB9XG4gICAgfSwgQXUucHJvdG90eXBlLmFkZEltYWdlU2VjdGlvbiA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2YXIgZSA9IHQuaW1hZ2UgPyB0LmltYWdlLm5hbWUgOiBcIlwiO1xuXG4gICAgICBpZiAoMCAhPT0gZS5sZW5ndGgpIHtcbiAgICAgICAgdmFyIHIgPSB0aGlzLmdldE5leHRJbWFnZVNlY3Rpb25DaGFyQ29kZSgpO1xuICAgICAgICByID8gKHRoaXMudGV4dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHIpLCB0aGlzLnNlY3Rpb25zLnB1c2goX3UuZm9ySW1hZ2UoZSkpLCB0aGlzLnNlY3Rpb25JbmRleC5wdXNoKHRoaXMuc2VjdGlvbnMubGVuZ3RoIC0gMSkpIDogQShcIlJlYWNoZWQgbWF4aW11bSBudW1iZXIgb2YgaW1hZ2VzIDY0MDFcIik7XG4gICAgICB9IGVsc2UgQShcIkNhbid0IGFkZCBGb3JtYXR0ZWRTZWN0aW9uIHdpdGggYW4gZW1wdHkgaW1hZ2UuXCIpO1xuICAgIH0sIEF1LnByb3RvdHlwZS5nZXROZXh0SW1hZ2VTZWN0aW9uQ2hhckNvZGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbWFnZVNlY3Rpb25JRCA/IHRoaXMuaW1hZ2VTZWN0aW9uSUQgPj0gNjM3NDMgPyBudWxsIDogKyt0aGlzLmltYWdlU2VjdGlvbklEIDogKHRoaXMuaW1hZ2VTZWN0aW9uSUQgPSA1NzM0NCwgdGhpcy5pbWFnZVNlY3Rpb25JRCk7XG4gICAgfTtcbiAgICB2YXIga3UgPSB7XG4gICAgICA5OiAhMCxcbiAgICAgIDEwOiAhMCxcbiAgICAgIDExOiAhMCxcbiAgICAgIDEyOiAhMCxcbiAgICAgIDEzOiAhMCxcbiAgICAgIDMyOiAhMFxuICAgIH0sXG4gICAgICAgIEl1ID0ge307XG5cbiAgICBmdW5jdGlvbiB6dSh0LCBlLCByLCBuLCBpLCBhKSB7XG4gICAgICBpZiAoZS5pbWFnZU5hbWUpIHtcbiAgICAgICAgdmFyIG8gPSBuW2UuaW1hZ2VOYW1lXTtcbiAgICAgICAgcmV0dXJuIG8gPyBvLmRpc3BsYXlTaXplWzBdICogZS5zY2FsZSAqIDI0IC8gYSArIGkgOiAwO1xuICAgICAgfVxuXG4gICAgICB2YXIgcyA9IHJbZS5mb250U3RhY2tdLFxuICAgICAgICAgIHUgPSBzICYmIHNbdF07XG4gICAgICByZXR1cm4gdSA/IHUubWV0cmljcy5hZHZhbmNlICogZS5zY2FsZSArIGkgOiAwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIEN1KHQsIGUsIHIsIG4pIHtcbiAgICAgIHZhciBpID0gTWF0aC5wb3codCAtIGUsIDIpO1xuICAgICAgcmV0dXJuIG4gPyB0IDwgZSA/IGkgLyAyIDogMiAqIGkgOiBpICsgTWF0aC5hYnMocikgKiByO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIEV1KHQsIGUsIHIpIHtcbiAgICAgIHZhciBuID0gMDtcbiAgICAgIHJldHVybiAxMCA9PT0gdCAmJiAobiAtPSAxZTQpLCByICYmIChuICs9IDE1MCksIDQwICE9PSB0ICYmIDY1Mjg4ICE9PSB0IHx8IChuICs9IDUwKSwgNDEgIT09IGUgJiYgNjUyODkgIT09IGUgfHwgKG4gKz0gNTApLCBuO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFB1KHQsIGUsIHIsIG4sIGksIGEpIHtcbiAgICAgIGZvciAodmFyIG8gPSBudWxsLCBzID0gQ3UoZSwgciwgaSwgYSksIHUgPSAwLCBsID0gbjsgdSA8IGwubGVuZ3RoOyB1ICs9IDEpIHtcbiAgICAgICAgdmFyIHAgPSBsW3VdLFxuICAgICAgICAgICAgYyA9IEN1KGUgLSBwLngsIHIsIGksIGEpICsgcC5iYWRuZXNzO1xuICAgICAgICBjIDw9IHMgJiYgKG8gPSBwLCBzID0gYyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGluZGV4OiB0LFxuICAgICAgICB4OiBlLFxuICAgICAgICBwcmlvckJyZWFrOiBvLFxuICAgICAgICBiYWRuZXNzOiBzXG4gICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIE11KHQsIGUsIHIsIG4sIGksIGEsIG8pIHtcbiAgICAgIGlmIChcInBvaW50XCIgIT09IGEpIHJldHVybiBbXTtcbiAgICAgIGlmICghdCkgcmV0dXJuIFtdO1xuXG4gICAgICBmb3IgKHZhciBzLCB1ID0gW10sIGwgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSwgYSkge1xuICAgICAgICBmb3IgKHZhciBvID0gMCwgcyA9IDA7IHMgPCB0Lmxlbmd0aCgpOyBzKyspIHtcbiAgICAgICAgICB2YXIgdSA9IHQuZ2V0U2VjdGlvbihzKTtcbiAgICAgICAgICBvICs9IHp1KHQuZ2V0Q2hhckNvZGUocyksIHUsIG4sIGksIGUsIGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG8gLyBNYXRoLm1heCgxLCBNYXRoLmNlaWwobyAvIHIpKTtcbiAgICAgIH0odCwgZSwgciwgbiwgaSwgbyksIHAgPSB0LnRleHQuaW5kZXhPZihcIuKAi1wiKSA+PSAwLCBjID0gMCwgaCA9IDA7IGggPCB0Lmxlbmd0aCgpOyBoKyspIHtcbiAgICAgICAgdmFyIGYgPSB0LmdldFNlY3Rpb24oaCksXG4gICAgICAgICAgICB5ID0gdC5nZXRDaGFyQ29kZShoKTtcblxuICAgICAgICBpZiAoa3VbeV0gfHwgKGMgKz0genUoeSwgZiwgbiwgaSwgZSwgbykpLCBoIDwgdC5sZW5ndGgoKSAtIDEpIHtcbiAgICAgICAgICB2YXIgZCA9ICEoKHMgPSB5KSA8IDExOTA0IHx8ICEoR25bXCJCb3BvbW9mbyBFeHRlbmRlZFwiXShzKSB8fCBHbi5Cb3BvbW9mbyhzKSB8fCBHbltcIkNKSyBDb21wYXRpYmlsaXR5IEZvcm1zXCJdKHMpIHx8IEduW1wiQ0pLIENvbXBhdGliaWxpdHkgSWRlb2dyYXBoc1wiXShzKSB8fCBHbltcIkNKSyBDb21wYXRpYmlsaXR5XCJdKHMpIHx8IEduW1wiQ0pLIFJhZGljYWxzIFN1cHBsZW1lbnRcIl0ocykgfHwgR25bXCJDSksgU3Ryb2tlc1wiXShzKSB8fCBHbltcIkNKSyBTeW1ib2xzIGFuZCBQdW5jdHVhdGlvblwiXShzKSB8fCBHbltcIkNKSyBVbmlmaWVkIElkZW9ncmFwaHMgRXh0ZW5zaW9uIEFcIl0ocykgfHwgR25bXCJDSksgVW5pZmllZCBJZGVvZ3JhcGhzXCJdKHMpIHx8IEduW1wiRW5jbG9zZWQgQ0pLIExldHRlcnMgYW5kIE1vbnRoc1wiXShzKSB8fCBHbltcIkhhbGZ3aWR0aCBhbmQgRnVsbHdpZHRoIEZvcm1zXCJdKHMpIHx8IEduLkhpcmFnYW5hKHMpIHx8IEduW1wiSWRlb2dyYXBoaWMgRGVzY3JpcHRpb24gQ2hhcmFjdGVyc1wiXShzKSB8fCBHbltcIkthbmd4aSBSYWRpY2Fsc1wiXShzKSB8fCBHbltcIkthdGFrYW5hIFBob25ldGljIEV4dGVuc2lvbnNcIl0ocykgfHwgR24uS2F0YWthbmEocykgfHwgR25bXCJWZXJ0aWNhbCBGb3Jtc1wiXShzKSB8fCBHbltcIllpIFJhZGljYWxzXCJdKHMpIHx8IEduW1wiWWkgU3lsbGFibGVzXCJdKHMpKSk7XG4gICAgICAgICAgKEl1W3ldIHx8IGQgfHwgZi5pbWFnZU5hbWUpICYmIHUucHVzaChQdShoICsgMSwgYywgbCwgdSwgRXUoeSwgdC5nZXRDaGFyQ29kZShoICsgMSksIGQgJiYgcCksICExKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIHQoZSkge1xuICAgICAgICByZXR1cm4gZSA/IHQoZS5wcmlvckJyZWFrKS5jb25jYXQoZS5pbmRleCkgOiBbXTtcbiAgICAgIH0oUHUodC5sZW5ndGgoKSwgYywgbCwgdSwgMCwgITApKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBCdSh0KSB7XG4gICAgICB2YXIgZSA9IC41LFxuICAgICAgICAgIHIgPSAuNTtcblxuICAgICAgc3dpdGNoICh0KSB7XG4gICAgICAgIGNhc2UgXCJyaWdodFwiOlxuICAgICAgICBjYXNlIFwidG9wLXJpZ2h0XCI6XG4gICAgICAgIGNhc2UgXCJib3R0b20tcmlnaHRcIjpcbiAgICAgICAgICBlID0gMTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFwibGVmdFwiOlxuICAgICAgICBjYXNlIFwidG9wLWxlZnRcIjpcbiAgICAgICAgY2FzZSBcImJvdHRvbS1sZWZ0XCI6XG4gICAgICAgICAgZSA9IDA7XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAodCkge1xuICAgICAgICBjYXNlIFwiYm90dG9tXCI6XG4gICAgICAgIGNhc2UgXCJib3R0b20tcmlnaHRcIjpcbiAgICAgICAgY2FzZSBcImJvdHRvbS1sZWZ0XCI6XG4gICAgICAgICAgciA9IDE7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBcInRvcFwiOlxuICAgICAgICBjYXNlIFwidG9wLXJpZ2h0XCI6XG4gICAgICAgIGNhc2UgXCJ0b3AtbGVmdFwiOlxuICAgICAgICAgIHIgPSAwO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBob3Jpem9udGFsQWxpZ246IGUsXG4gICAgICAgIHZlcnRpY2FsQWxpZ246IHJcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gVHUodCwgZSwgciwgbiwgaSkge1xuICAgICAgaWYgKG4gfHwgaSkgZm9yICh2YXIgYSA9IHRbcl0sIG8gPSAodFtyXS54ICsgYS5tZXRyaWNzLmFkdmFuY2UgKiBhLnNjYWxlKSAqIG4sIHMgPSBlOyBzIDw9IHI7IHMrKykge1xuICAgICAgICB0W3NdLnggLT0gbywgdFtzXS55ICs9IGk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gVnUodCwgZSwgciwgbiwgaSwgYSkge1xuICAgICAgdmFyIG8sXG4gICAgICAgICAgcyA9IHQuaW1hZ2U7XG5cbiAgICAgIGlmIChzLmNvbnRlbnQpIHtcbiAgICAgICAgdmFyIHUgPSBzLmNvbnRlbnQsXG4gICAgICAgICAgICBsID0gcy5waXhlbFJhdGlvIHx8IDE7XG4gICAgICAgIG8gPSBbdVswXSAvIGwsIHVbMV0gLyBsLCBzLmRpc3BsYXlTaXplWzBdIC0gdVsyXSAvIGwsIHMuZGlzcGxheVNpemVbMV0gLSB1WzNdIC8gbF07XG4gICAgICB9XG5cbiAgICAgIHZhciBwLFxuICAgICAgICAgIGMsXG4gICAgICAgICAgaCxcbiAgICAgICAgICBmLFxuICAgICAgICAgIHkgPSBlLmxlZnQgKiBhLFxuICAgICAgICAgIGQgPSBlLnJpZ2h0ICogYTtcbiAgICAgIFwid2lkdGhcIiA9PT0gciB8fCBcImJvdGhcIiA9PT0gciA/IChmID0gaVswXSArIHkgLSBuWzNdLCBjID0gaVswXSArIGQgKyBuWzFdKSA6IGMgPSAoZiA9IGlbMF0gKyAoeSArIGQgLSBzLmRpc3BsYXlTaXplWzBdKSAvIDIpICsgcy5kaXNwbGF5U2l6ZVswXTtcbiAgICAgIHZhciBtID0gZS50b3AgKiBhLFxuICAgICAgICAgIHYgPSBlLmJvdHRvbSAqIGE7XG4gICAgICByZXR1cm4gXCJoZWlnaHRcIiA9PT0gciB8fCBcImJvdGhcIiA9PT0gciA/IChwID0gaVsxXSArIG0gLSBuWzBdLCBoID0gaVsxXSArIHYgKyBuWzJdKSA6IGggPSAocCA9IGlbMV0gKyAobSArIHYgLSBzLmRpc3BsYXlTaXplWzFdKSAvIDIpICsgcy5kaXNwbGF5U2l6ZVsxXSwge1xuICAgICAgICBpbWFnZTogcyxcbiAgICAgICAgdG9wOiBwLFxuICAgICAgICByaWdodDogYyxcbiAgICAgICAgYm90dG9tOiBoLFxuICAgICAgICBsZWZ0OiBmLFxuICAgICAgICBjb2xsaXNpb25QYWRkaW5nOiBvXG4gICAgICB9O1xuICAgIH1cblxuICAgIEl1WzEwXSA9ICEwLCBJdVszMl0gPSAhMCwgSXVbMzhdID0gITAsIEl1WzQwXSA9ICEwLCBJdVs0MV0gPSAhMCwgSXVbNDNdID0gITAsIEl1WzQ1XSA9ICEwLCBJdVs0N10gPSAhMCwgSXVbMTczXSA9ICEwLCBJdVsxODNdID0gITAsIEl1WzgyMDNdID0gITAsIEl1WzgyMDhdID0gITAsIEl1WzgyMTFdID0gITAsIEl1WzgyMzFdID0gITA7XG5cbiAgICB2YXIgRnUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZShlLCByLCBuLCBpKSB7XG4gICAgICAgIHQuY2FsbCh0aGlzLCBlLCByKSwgdGhpcy5hbmdsZSA9IG4sIHZvaWQgMCAhPT0gaSAmJiAodGhpcy5zZWdtZW50ID0gaSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IGUodGhpcy54LCB0aGlzLnksIHRoaXMuYW5nbGUsIHRoaXMuc2VnbWVudCk7XG4gICAgICB9LCBlO1xuICAgIH0oaSk7XG5cbiAgICBmdW5jdGlvbiBEdSh0LCBlKSB7XG4gICAgICB2YXIgciA9IGUuZXhwcmVzc2lvbjtcbiAgICAgIGlmIChcImNvbnN0YW50XCIgPT09IHIua2luZCkgcmV0dXJuIHtcbiAgICAgICAga2luZDogXCJjb25zdGFudFwiLFxuICAgICAgICBsYXlvdXRTaXplOiByLmV2YWx1YXRlKG5ldyBzaSh0ICsgMSkpXG4gICAgICB9O1xuICAgICAgaWYgKFwic291cmNlXCIgPT09IHIua2luZCkgcmV0dXJuIHtcbiAgICAgICAga2luZDogXCJzb3VyY2VcIlxuICAgICAgfTtcblxuICAgICAgZm9yICh2YXIgbiA9IHIuem9vbVN0b3BzLCBpID0gci5pbnRlcnBvbGF0aW9uVHlwZSwgYSA9IDA7IGEgPCBuLmxlbmd0aCAmJiBuW2FdIDw9IHQ7KSB7XG4gICAgICAgIGErKztcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgbyA9IGEgPSBNYXRoLm1heCgwLCBhIC0gMSk7IG8gPCBuLmxlbmd0aCAmJiBuW29dIDwgdCArIDE7KSB7XG4gICAgICAgIG8rKztcbiAgICAgIH1cblxuICAgICAgbyA9IE1hdGgubWluKG4ubGVuZ3RoIC0gMSwgbyk7XG4gICAgICB2YXIgcyA9IG5bYV0sXG4gICAgICAgICAgdSA9IG5bb107XG4gICAgICByZXR1cm4gXCJjb21wb3NpdGVcIiA9PT0gci5raW5kID8ge1xuICAgICAgICBraW5kOiBcImNvbXBvc2l0ZVwiLFxuICAgICAgICBtaW5ab29tOiBzLFxuICAgICAgICBtYXhab29tOiB1LFxuICAgICAgICBpbnRlcnBvbGF0aW9uVHlwZTogaVxuICAgICAgfSA6IHtcbiAgICAgICAga2luZDogXCJjYW1lcmFcIixcbiAgICAgICAgbWluWm9vbTogcyxcbiAgICAgICAgbWF4Wm9vbTogdSxcbiAgICAgICAgbWluU2l6ZTogci5ldmFsdWF0ZShuZXcgc2kocykpLFxuICAgICAgICBtYXhTaXplOiByLmV2YWx1YXRlKG5ldyBzaSh1KSksXG4gICAgICAgIGludGVycG9sYXRpb25UeXBlOiBpXG4gICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIEx1KHQsIGUsIHIpIHtcbiAgICAgIHZhciBuID0gZS51U2l6ZSxcbiAgICAgICAgICBpID0gci5sb3dlclNpemU7XG4gICAgICByZXR1cm4gXCJzb3VyY2VcIiA9PT0gdC5raW5kID8gaSAvIDEyOCA6IFwiY29tcG9zaXRlXCIgPT09IHQua2luZCA/IEtlKGkgLyAxMjgsIHIudXBwZXJTaXplIC8gMTI4LCBlLnVTaXplVCkgOiBuO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIE91KHQsIGUpIHtcbiAgICAgIHZhciByID0gMCxcbiAgICAgICAgICBuID0gMDtcbiAgICAgIGlmIChcImNvbnN0YW50XCIgPT09IHQua2luZCkgbiA9IHQubGF5b3V0U2l6ZTtlbHNlIGlmIChcInNvdXJjZVwiICE9PSB0LmtpbmQpIHtcbiAgICAgICAgdmFyIGkgPSB0LmludGVycG9sYXRpb25UeXBlLFxuICAgICAgICAgICAgYSA9IGkgPyBwKGFyLmludGVycG9sYXRpb25GYWN0b3IoaSwgZSwgdC5taW5ab29tLCB0Lm1heFpvb20pLCAwLCAxKSA6IDA7XG4gICAgICAgIFwiY2FtZXJhXCIgPT09IHQua2luZCA/IG4gPSBLZSh0Lm1pblNpemUsIHQubWF4U2l6ZSwgYSkgOiByID0gYTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVTaXplVDogcixcbiAgICAgICAgdVNpemU6IG5cbiAgICAgIH07XG4gICAgfVxuXG4gICAgT24oXCJBbmNob3JcIiwgRnUpO1xuICAgIHZhciBSdSA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgX19wcm90b19fOiBudWxsLFxuICAgICAgZ2V0U2l6ZURhdGE6IER1LFxuICAgICAgZXZhbHVhdGVTaXplRm9yRmVhdHVyZTogTHUsXG4gICAgICBldmFsdWF0ZVNpemVGb3Jab29tOiBPdSxcbiAgICAgIFNJWkVfUEFDS19GQUNUT1I6IDEyOFxuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gVXUodCwgZSwgciwgbiwgaSkge1xuICAgICAgaWYgKHZvaWQgMCA9PT0gZS5zZWdtZW50KSByZXR1cm4gITA7XG5cbiAgICAgIGZvciAodmFyIGEgPSBlLCBvID0gZS5zZWdtZW50ICsgMSwgcyA9IDA7IHMgPiAtciAvIDI7KSB7XG4gICAgICAgIGlmICgtLW8gPCAwKSByZXR1cm4gITE7XG4gICAgICAgIHMgLT0gdFtvXS5kaXN0KGEpLCBhID0gdFtvXTtcbiAgICAgIH1cblxuICAgICAgcyArPSB0W29dLmRpc3QodFtvICsgMV0pLCBvKys7XG5cbiAgICAgIGZvciAodmFyIHUgPSBbXSwgbCA9IDA7IHMgPCByIC8gMjspIHtcbiAgICAgICAgdmFyIHAgPSB0W29dLFxuICAgICAgICAgICAgYyA9IHRbbyArIDFdO1xuICAgICAgICBpZiAoIWMpIHJldHVybiAhMTtcbiAgICAgICAgdmFyIGggPSB0W28gLSAxXS5hbmdsZVRvKHApIC0gcC5hbmdsZVRvKGMpO1xuXG4gICAgICAgIGZvciAoaCA9IE1hdGguYWJzKChoICsgMyAqIE1hdGguUEkpICUgKDIgKiBNYXRoLlBJKSAtIE1hdGguUEkpLCB1LnB1c2goe1xuICAgICAgICAgIGRpc3RhbmNlOiBzLFxuICAgICAgICAgIGFuZ2xlRGVsdGE6IGhcbiAgICAgICAgfSksIGwgKz0gaDsgcyAtIHVbMF0uZGlzdGFuY2UgPiBuOykge1xuICAgICAgICAgIGwgLT0gdS5zaGlmdCgpLmFuZ2xlRGVsdGE7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobCA+IGkpIHJldHVybiAhMTtcbiAgICAgICAgbysrLCBzICs9IHAuZGlzdChjKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICEwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGp1KHQpIHtcbiAgICAgIGZvciAodmFyIGUgPSAwLCByID0gMDsgciA8IHQubGVuZ3RoIC0gMTsgcisrKSB7XG4gICAgICAgIGUgKz0gdFtyXS5kaXN0KHRbciArIDFdKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcXUodCwgZSwgcikge1xuICAgICAgcmV0dXJuIHQgPyAuNiAqIGUgKiByIDogMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBOdSh0LCBlKSB7XG4gICAgICByZXR1cm4gTWF0aC5tYXgodCA/IHQucmlnaHQgLSB0LmxlZnQgOiAwLCBlID8gZS5yaWdodCAtIGUubGVmdCA6IDApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIEt1KHQsIGUsIHIsIG4sIGksIGEpIHtcbiAgICAgIGZvciAodmFyIG8gPSBxdShyLCBpLCBhKSwgcyA9IE51KHIsIG4pICogYSwgdSA9IDAsIGwgPSBqdSh0KSAvIDIsIHAgPSAwOyBwIDwgdC5sZW5ndGggLSAxOyBwKyspIHtcbiAgICAgICAgdmFyIGMgPSB0W3BdLFxuICAgICAgICAgICAgaCA9IHRbcCArIDFdLFxuICAgICAgICAgICAgZiA9IGMuZGlzdChoKTtcblxuICAgICAgICBpZiAodSArIGYgPiBsKSB7XG4gICAgICAgICAgdmFyIHkgPSAobCAtIHUpIC8gZixcbiAgICAgICAgICAgICAgZCA9IEtlKGMueCwgaC54LCB5KSxcbiAgICAgICAgICAgICAgbSA9IEtlKGMueSwgaC55LCB5KSxcbiAgICAgICAgICAgICAgdiA9IG5ldyBGdShkLCBtLCBoLmFuZ2xlVG8oYyksIHApO1xuICAgICAgICAgIHJldHVybiB2Ll9yb3VuZCgpLCAhbyB8fCBVdSh0LCB2LCBzLCBvLCBlKSA/IHYgOiB2b2lkIDA7XG4gICAgICAgIH1cblxuICAgICAgICB1ICs9IGY7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gR3UodCwgZSwgciwgbiwgaSwgYSwgbywgcywgdSkge1xuICAgICAgdmFyIGwgPSBxdShuLCBhLCBvKSxcbiAgICAgICAgICBwID0gTnUobiwgaSksXG4gICAgICAgICAgYyA9IHAgKiBvLFxuICAgICAgICAgIGggPSAwID09PSB0WzBdLnggfHwgdFswXS54ID09PSB1IHx8IDAgPT09IHRbMF0ueSB8fCB0WzBdLnkgPT09IHU7XG4gICAgICByZXR1cm4gZSAtIGMgPCBlIC8gNCAmJiAoZSA9IGMgKyBlIC8gNCksIGZ1bmN0aW9uIHQoZSwgciwgbiwgaSwgYSwgbywgcywgdSwgbCkge1xuICAgICAgICBmb3IgKHZhciBwID0gbyAvIDIsIGMgPSBqdShlKSwgaCA9IDAsIGYgPSByIC0gbiwgeSA9IFtdLCBkID0gMDsgZCA8IGUubGVuZ3RoIC0gMTsgZCsrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbSA9IGVbZF0sIHYgPSBlW2QgKyAxXSwgZyA9IG0uZGlzdCh2KSwgeCA9IHYuYW5nbGVUbyhtKTsgZiArIG4gPCBoICsgZzspIHtcbiAgICAgICAgICAgIHZhciBiID0gKChmICs9IG4pIC0gaCkgLyBnLFxuICAgICAgICAgICAgICAgIHcgPSBLZShtLngsIHYueCwgYiksXG4gICAgICAgICAgICAgICAgXyA9IEtlKG0ueSwgdi55LCBiKTtcblxuICAgICAgICAgICAgaWYgKHcgPj0gMCAmJiB3IDwgbCAmJiBfID49IDAgJiYgXyA8IGwgJiYgZiAtIHAgPj0gMCAmJiBmICsgcCA8PSBjKSB7XG4gICAgICAgICAgICAgIHZhciBBID0gbmV3IEZ1KHcsIF8sIHgsIGQpO1xuICAgICAgICAgICAgICBBLl9yb3VuZCgpLCBpICYmICFVdShlLCBBLCBvLCBpLCBhKSB8fCB5LnB1c2goQSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaCArPSBnO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHUgfHwgeS5sZW5ndGggfHwgcyB8fCAoeSA9IHQoZSwgaCAvIDIsIG4sIGksIGEsIG8sIHMsICEwLCBsKSksIHk7XG4gICAgICB9KHQsIGggPyBlIC8gMiAqIHMgJSBlIDogKHAgLyAyICsgMiAqIGEpICogbyAqIHMgJSBlLCBlLCBsLCByLCBjLCBoLCAhMSwgdSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gWnUodCwgZSwgciwgbiwgYSkge1xuICAgICAgZm9yICh2YXIgbyA9IFtdLCBzID0gMDsgcyA8IHQubGVuZ3RoOyBzKyspIHtcbiAgICAgICAgZm9yICh2YXIgdSA9IHRbc10sIGwgPSB2b2lkIDAsIHAgPSAwOyBwIDwgdS5sZW5ndGggLSAxOyBwKyspIHtcbiAgICAgICAgICB2YXIgYyA9IHVbcF0sXG4gICAgICAgICAgICAgIGggPSB1W3AgKyAxXTtcbiAgICAgICAgICBjLnggPCBlICYmIGgueCA8IGUgfHwgKGMueCA8IGUgPyBjID0gbmV3IGkoZSwgYy55ICsgKGUgLSBjLngpIC8gKGgueCAtIGMueCkgKiAoaC55IC0gYy55KSkuX3JvdW5kKCkgOiBoLnggPCBlICYmIChoID0gbmV3IGkoZSwgYy55ICsgKGUgLSBjLngpIC8gKGgueCAtIGMueCkgKiAoaC55IC0gYy55KSkuX3JvdW5kKCkpLCBjLnkgPCByICYmIGgueSA8IHIgfHwgKGMueSA8IHIgPyBjID0gbmV3IGkoYy54ICsgKHIgLSBjLnkpIC8gKGgueSAtIGMueSkgKiAoaC54IC0gYy54KSwgcikuX3JvdW5kKCkgOiBoLnkgPCByICYmIChoID0gbmV3IGkoYy54ICsgKHIgLSBjLnkpIC8gKGgueSAtIGMueSkgKiAoaC54IC0gYy54KSwgcikuX3JvdW5kKCkpLCBjLnggPj0gbiAmJiBoLnggPj0gbiB8fCAoYy54ID49IG4gPyBjID0gbmV3IGkobiwgYy55ICsgKG4gLSBjLngpIC8gKGgueCAtIGMueCkgKiAoaC55IC0gYy55KSkuX3JvdW5kKCkgOiBoLnggPj0gbiAmJiAoaCA9IG5ldyBpKG4sIGMueSArIChuIC0gYy54KSAvIChoLnggLSBjLngpICogKGgueSAtIGMueSkpLl9yb3VuZCgpKSwgYy55ID49IGEgJiYgaC55ID49IGEgfHwgKGMueSA+PSBhID8gYyA9IG5ldyBpKGMueCArIChhIC0gYy55KSAvIChoLnkgLSBjLnkpICogKGgueCAtIGMueCksIGEpLl9yb3VuZCgpIDogaC55ID49IGEgJiYgKGggPSBuZXcgaShjLnggKyAoYSAtIGMueSkgLyAoaC55IC0gYy55KSAqIChoLnggLSBjLngpLCBhKS5fcm91bmQoKSksIGwgJiYgYy5lcXVhbHMobFtsLmxlbmd0aCAtIDFdKSB8fCBvLnB1c2gobCA9IFtjXSksIGwucHVzaChoKSkpKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG87XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gWHUodCwgZSwgciwgbikge1xuICAgICAgdmFyIGEgPSBbXSxcbiAgICAgICAgICBvID0gdC5pbWFnZSxcbiAgICAgICAgICBzID0gby5waXhlbFJhdGlvLFxuICAgICAgICAgIHUgPSBvLnBhZGRlZFJlY3QudyAtIDIsXG4gICAgICAgICAgbCA9IG8ucGFkZGVkUmVjdC5oIC0gMixcbiAgICAgICAgICBwID0gdC5yaWdodCAtIHQubGVmdCxcbiAgICAgICAgICBjID0gdC5ib3R0b20gLSB0LnRvcCxcbiAgICAgICAgICBoID0gby5zdHJldGNoWCB8fCBbWzAsIHVdXSxcbiAgICAgICAgICBmID0gby5zdHJldGNoWSB8fCBbWzAsIGxdXSxcbiAgICAgICAgICB5ID0gZnVuY3Rpb24geSh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0ICsgZVsxXSAtIGVbMF07XG4gICAgICB9LFxuICAgICAgICAgIGQgPSBoLnJlZHVjZSh5LCAwKSxcbiAgICAgICAgICBtID0gZi5yZWR1Y2UoeSwgMCksXG4gICAgICAgICAgdiA9IHUgLSBkLFxuICAgICAgICAgIGcgPSBsIC0gbSxcbiAgICAgICAgICB4ID0gMCxcbiAgICAgICAgICBiID0gZCxcbiAgICAgICAgICB3ID0gMCxcbiAgICAgICAgICBfID0gbSxcbiAgICAgICAgICBBID0gMCxcbiAgICAgICAgICBTID0gdixcbiAgICAgICAgICBrID0gMCxcbiAgICAgICAgICBJID0gZztcblxuICAgICAgaWYgKG8uY29udGVudCAmJiBuKSB7XG4gICAgICAgIHZhciB6ID0gby5jb250ZW50O1xuICAgICAgICB4ID0gSnUoaCwgMCwgelswXSksIHcgPSBKdShmLCAwLCB6WzFdKSwgYiA9IEp1KGgsIHpbMF0sIHpbMl0pLCBfID0gSnUoZiwgelsxXSwgelszXSksIEEgPSB6WzBdIC0geCwgayA9IHpbMV0gLSB3LCBTID0gelsyXSAtIHpbMF0gLSBiLCBJID0gelszXSAtIHpbMV0gLSBfO1xuICAgICAgfVxuXG4gICAgICB2YXIgQyA9IGZ1bmN0aW9uIEMobiwgYSwgdSwgbCkge1xuICAgICAgICB2YXIgaCA9IFl1KG4uc3RyZXRjaCAtIHgsIGIsIHAsIHQubGVmdCksXG4gICAgICAgICAgICBmID0gJHUobi5maXhlZCAtIEEsIFMsIG4uc3RyZXRjaCwgZCksXG4gICAgICAgICAgICB5ID0gWXUoYS5zdHJldGNoIC0gdywgXywgYywgdC50b3ApLFxuICAgICAgICAgICAgdiA9ICR1KGEuZml4ZWQgLSBrLCBJLCBhLnN0cmV0Y2gsIG0pLFxuICAgICAgICAgICAgZyA9IFl1KHUuc3RyZXRjaCAtIHgsIGIsIHAsIHQubGVmdCksXG4gICAgICAgICAgICB6ID0gJHUodS5maXhlZCAtIEEsIFMsIHUuc3RyZXRjaCwgZCksXG4gICAgICAgICAgICBDID0gWXUobC5zdHJldGNoIC0gdywgXywgYywgdC50b3ApLFxuICAgICAgICAgICAgRSA9ICR1KGwuZml4ZWQgLSBrLCBJLCBsLnN0cmV0Y2gsIG0pLFxuICAgICAgICAgICAgUCA9IG5ldyBpKGgsIHkpLFxuICAgICAgICAgICAgTSA9IG5ldyBpKGcsIHkpLFxuICAgICAgICAgICAgQiA9IG5ldyBpKGcsIEMpLFxuICAgICAgICAgICAgVCA9IG5ldyBpKGgsIEMpLFxuICAgICAgICAgICAgViA9IG5ldyBpKGYgLyBzLCB2IC8gcyksXG4gICAgICAgICAgICBGID0gbmV3IGkoeiAvIHMsIEUgLyBzKSxcbiAgICAgICAgICAgIEQgPSBlICogTWF0aC5QSSAvIDE4MDtcblxuICAgICAgICBpZiAoRCkge1xuICAgICAgICAgIHZhciBMID0gTWF0aC5zaW4oRCksXG4gICAgICAgICAgICAgIE8gPSBNYXRoLmNvcyhEKSxcbiAgICAgICAgICAgICAgUiA9IFtPLCAtTCwgTCwgT107XG4gICAgICAgICAgUC5fbWF0TXVsdChSKSwgTS5fbWF0TXVsdChSKSwgVC5fbWF0TXVsdChSKSwgQi5fbWF0TXVsdChSKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBVID0gbi5zdHJldGNoICsgbi5maXhlZCxcbiAgICAgICAgICAgIGogPSBhLnN0cmV0Y2ggKyBhLmZpeGVkO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRsOiBQLFxuICAgICAgICAgIHRyOiBNLFxuICAgICAgICAgIGJsOiBULFxuICAgICAgICAgIGJyOiBCLFxuICAgICAgICAgIHRleDoge1xuICAgICAgICAgICAgeDogby5wYWRkZWRSZWN0LnggKyAxICsgVSxcbiAgICAgICAgICAgIHk6IG8ucGFkZGVkUmVjdC55ICsgMSArIGosXG4gICAgICAgICAgICB3OiB1LnN0cmV0Y2ggKyB1LmZpeGVkIC0gVSxcbiAgICAgICAgICAgIGg6IGwuc3RyZXRjaCArIGwuZml4ZWQgLSBqXG4gICAgICAgICAgfSxcbiAgICAgICAgICB3cml0aW5nTW9kZTogdm9pZCAwLFxuICAgICAgICAgIGdseXBoT2Zmc2V0OiBbMCwgMF0sXG4gICAgICAgICAgc2VjdGlvbkluZGV4OiAwLFxuICAgICAgICAgIHBpeGVsT2Zmc2V0VEw6IFYsXG4gICAgICAgICAgcGl4ZWxPZmZzZXRCUjogRixcbiAgICAgICAgICBtaW5Gb250U2NhbGVYOiBTIC8gcyAvIHAsXG4gICAgICAgICAgbWluRm9udFNjYWxlWTogSSAvIHMgLyBjLFxuICAgICAgICAgIGlzU0RGOiByXG4gICAgICAgIH07XG4gICAgICB9O1xuXG4gICAgICBpZiAobiAmJiAoby5zdHJldGNoWCB8fCBvLnN0cmV0Y2hZKSkgZm9yICh2YXIgRSA9IEh1KGgsIHYsIGQpLCBQID0gSHUoZiwgZywgbSksIE0gPSAwOyBNIDwgRS5sZW5ndGggLSAxOyBNKyspIHtcbiAgICAgICAgZm9yICh2YXIgQiA9IEVbTV0sIFQgPSBFW00gKyAxXSwgViA9IDA7IFYgPCBQLmxlbmd0aCAtIDE7IFYrKykge1xuICAgICAgICAgIGEucHVzaChDKEIsIFBbVl0sIFQsIFBbViArIDFdKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBhLnB1c2goQyh7XG4gICAgICAgIGZpeGVkOiAwLFxuICAgICAgICBzdHJldGNoOiAtMVxuICAgICAgfSwge1xuICAgICAgICBmaXhlZDogMCxcbiAgICAgICAgc3RyZXRjaDogLTFcbiAgICAgIH0sIHtcbiAgICAgICAgZml4ZWQ6IDAsXG4gICAgICAgIHN0cmV0Y2g6IHUgKyAxXG4gICAgICB9LCB7XG4gICAgICAgIGZpeGVkOiAwLFxuICAgICAgICBzdHJldGNoOiBsICsgMVxuICAgICAgfSkpO1xuICAgICAgcmV0dXJuIGE7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gSnUodCwgZSwgcikge1xuICAgICAgZm9yICh2YXIgbiA9IDAsIGkgPSAwLCBhID0gdDsgaSA8IGEubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIG8gPSBhW2ldO1xuICAgICAgICBuICs9IE1hdGgubWF4KGUsIE1hdGgubWluKHIsIG9bMV0pKSAtIE1hdGgubWF4KGUsIE1hdGgubWluKHIsIG9bMF0pKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gSHUodCwgZSwgcikge1xuICAgICAgZm9yICh2YXIgbiA9IFt7XG4gICAgICAgIGZpeGVkOiAtMSxcbiAgICAgICAgc3RyZXRjaDogMFxuICAgICAgfV0sIGkgPSAwLCBhID0gdDsgaSA8IGEubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIG8gPSBhW2ldLFxuICAgICAgICAgICAgcyA9IG9bMF0sXG4gICAgICAgICAgICB1ID0gb1sxXSxcbiAgICAgICAgICAgIGwgPSBuW24ubGVuZ3RoIC0gMV07XG4gICAgICAgIG4ucHVzaCh7XG4gICAgICAgICAgZml4ZWQ6IHMgLSBsLnN0cmV0Y2gsXG4gICAgICAgICAgc3RyZXRjaDogbC5zdHJldGNoXG4gICAgICAgIH0pLCBuLnB1c2goe1xuICAgICAgICAgIGZpeGVkOiBzIC0gbC5zdHJldGNoLFxuICAgICAgICAgIHN0cmV0Y2g6IGwuc3RyZXRjaCArICh1IC0gcylcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuLnB1c2goe1xuICAgICAgICBmaXhlZDogZSArIDEsXG4gICAgICAgIHN0cmV0Y2g6IHJcbiAgICAgIH0pLCBuO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFl1KHQsIGUsIHIsIG4pIHtcbiAgICAgIHJldHVybiB0IC8gZSAqIHIgKyBuO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uICR1KHQsIGUsIHIsIG4pIHtcbiAgICAgIHJldHVybiB0IC0gZSAqIHIgLyBuO1xuICAgIH1cblxuICAgIHZhciBXdSA9IGZ1bmN0aW9uIFd1KHQsIGUsIHIsIG4sIGEsIG8sIHMsIHUsIGwsIHApIHtcbiAgICAgIGlmICh0aGlzLmJveFN0YXJ0SW5kZXggPSB0Lmxlbmd0aCwgbCkge1xuICAgICAgICB2YXIgYyA9IG8udG9wLFxuICAgICAgICAgICAgaCA9IG8uYm90dG9tLFxuICAgICAgICAgICAgZiA9IG8uY29sbGlzaW9uUGFkZGluZztcbiAgICAgICAgZiAmJiAoYyAtPSBmWzFdLCBoICs9IGZbM10pO1xuICAgICAgICB2YXIgeSA9IGggLSBjO1xuICAgICAgICB5ID4gMCAmJiAoeSA9IE1hdGgubWF4KDEwLCB5KSwgdGhpcy5jaXJjbGVEaWFtZXRlciA9IHkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGQgPSBvLnRvcCAqIHMgLSB1LFxuICAgICAgICAgICAgbSA9IG8uYm90dG9tICogcyArIHUsXG4gICAgICAgICAgICB2ID0gby5sZWZ0ICogcyAtIHUsXG4gICAgICAgICAgICBnID0gby5yaWdodCAqIHMgKyB1LFxuICAgICAgICAgICAgeCA9IG8uY29sbGlzaW9uUGFkZGluZztcblxuICAgICAgICBpZiAoeCAmJiAodiAtPSB4WzBdICogcywgZCAtPSB4WzFdICogcywgZyArPSB4WzJdICogcywgbSArPSB4WzNdICogcyksIHApIHtcbiAgICAgICAgICB2YXIgYiA9IG5ldyBpKHYsIGQpLFxuICAgICAgICAgICAgICB3ID0gbmV3IGkoZywgZCksXG4gICAgICAgICAgICAgIF8gPSBuZXcgaSh2LCBtKSxcbiAgICAgICAgICAgICAgQSA9IG5ldyBpKGcsIG0pLFxuICAgICAgICAgICAgICBTID0gcCAqIE1hdGguUEkgLyAxODA7XG5cbiAgICAgICAgICBiLl9yb3RhdGUoUyksIHcuX3JvdGF0ZShTKSwgXy5fcm90YXRlKFMpLCBBLl9yb3RhdGUoUyksIHYgPSBNYXRoLm1pbihiLngsIHcueCwgXy54LCBBLngpLCBnID0gTWF0aC5tYXgoYi54LCB3LngsIF8ueCwgQS54KSwgZCA9IE1hdGgubWluKGIueSwgdy55LCBfLnksIEEueSksIG0gPSBNYXRoLm1heChiLnksIHcueSwgXy55LCBBLnkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdC5lbXBsYWNlQmFjayhlLngsIGUueSwgdiwgZCwgZywgbSwgciwgbiwgYSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYm94RW5kSW5kZXggPSB0Lmxlbmd0aDtcbiAgICB9LFxuICAgICAgICBRdSA9IGZ1bmN0aW9uIFF1KHQsIGUpIHtcbiAgICAgIGlmICh2b2lkIDAgPT09IHQgJiYgKHQgPSBbXSksIHZvaWQgMCA9PT0gZSAmJiAoZSA9IHRsKSwgdGhpcy5kYXRhID0gdCwgdGhpcy5sZW5ndGggPSB0aGlzLmRhdGEubGVuZ3RoLCB0aGlzLmNvbXBhcmUgPSBlLCB0aGlzLmxlbmd0aCA+IDApIGZvciAodmFyIHIgPSAodGhpcy5sZW5ndGggPj4gMSkgLSAxOyByID49IDA7IHItLSkge1xuICAgICAgICB0aGlzLl9kb3duKHIpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBmdW5jdGlvbiB0bCh0LCBlKSB7XG4gICAgICByZXR1cm4gdCA8IGUgPyAtMSA6IHQgPiBlID8gMSA6IDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZWwodCwgZSwgcikge1xuICAgICAgdm9pZCAwID09PSBlICYmIChlID0gMSksIHZvaWQgMCA9PT0gciAmJiAociA9ICExKTtcblxuICAgICAgZm9yICh2YXIgbiA9IDEgLyAwLCBhID0gMSAvIDAsIG8gPSAtMSAvIDAsIHMgPSAtMSAvIDAsIHUgPSB0WzBdLCBsID0gMDsgbCA8IHUubGVuZ3RoOyBsKyspIHtcbiAgICAgICAgdmFyIHAgPSB1W2xdO1xuICAgICAgICAoIWwgfHwgcC54IDwgbikgJiYgKG4gPSBwLngpLCAoIWwgfHwgcC55IDwgYSkgJiYgKGEgPSBwLnkpLCAoIWwgfHwgcC54ID4gbykgJiYgKG8gPSBwLngpLCAoIWwgfHwgcC55ID4gcykgJiYgKHMgPSBwLnkpO1xuICAgICAgfVxuXG4gICAgICB2YXIgYyA9IE1hdGgubWluKG8gLSBuLCBzIC0gYSksXG4gICAgICAgICAgaCA9IGMgLyAyLFxuICAgICAgICAgIGYgPSBuZXcgUXUoW10sIHJsKTtcbiAgICAgIGlmICgwID09PSBjKSByZXR1cm4gbmV3IGkobiwgYSk7XG5cbiAgICAgIGZvciAodmFyIHkgPSBuOyB5IDwgbzsgeSArPSBjKSB7XG4gICAgICAgIGZvciAodmFyIGQgPSBhOyBkIDwgczsgZCArPSBjKSB7XG4gICAgICAgICAgZi5wdXNoKG5ldyBubCh5ICsgaCwgZCArIGgsIGgsIHQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBtID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgZm9yICh2YXIgZSA9IDAsIHIgPSAwLCBuID0gMCwgaSA9IHRbMF0sIGEgPSAwLCBvID0gaS5sZW5ndGgsIHMgPSBvIC0gMTsgYSA8IG87IHMgPSBhKyspIHtcbiAgICAgICAgICB2YXIgdSA9IGlbYV0sXG4gICAgICAgICAgICAgIGwgPSBpW3NdLFxuICAgICAgICAgICAgICBwID0gdS54ICogbC55IC0gbC54ICogdS55O1xuICAgICAgICAgIHIgKz0gKHUueCArIGwueCkgKiBwLCBuICs9ICh1LnkgKyBsLnkpICogcCwgZSArPSAzICogcDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgbmwociAvIGUsIG4gLyBlLCAwLCB0KTtcbiAgICAgIH0odCksIHYgPSBmLmxlbmd0aDsgZi5sZW5ndGg7KSB7XG4gICAgICAgIHZhciBnID0gZi5wb3AoKTtcbiAgICAgICAgKGcuZCA+IG0uZCB8fCAhbS5kKSAmJiAobSA9IGcsIHIgJiYgY29uc29sZS5sb2coXCJmb3VuZCBiZXN0ICVkIGFmdGVyICVkIHByb2Jlc1wiLCBNYXRoLnJvdW5kKDFlNCAqIGcuZCkgLyAxZTQsIHYpKSwgZy5tYXggLSBtLmQgPD0gZSB8fCAoZi5wdXNoKG5ldyBubChnLnAueCAtIChoID0gZy5oIC8gMiksIGcucC55IC0gaCwgaCwgdCkpLCBmLnB1c2gobmV3IG5sKGcucC54ICsgaCwgZy5wLnkgLSBoLCBoLCB0KSksIGYucHVzaChuZXcgbmwoZy5wLnggLSBoLCBnLnAueSArIGgsIGgsIHQpKSwgZi5wdXNoKG5ldyBubChnLnAueCArIGgsIGcucC55ICsgaCwgaCwgdCkpLCB2ICs9IDQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gciAmJiAoY29uc29sZS5sb2coXCJudW0gcHJvYmVzOiBcIiArIHYpLCBjb25zb2xlLmxvZyhcImJlc3QgZGlzdGFuY2U6IFwiICsgbS5kKSksIG0ucDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBybCh0LCBlKSB7XG4gICAgICByZXR1cm4gZS5tYXggLSB0Lm1heDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBubCh0LCBlLCByLCBuKSB7XG4gICAgICB0aGlzLnAgPSBuZXcgaSh0LCBlKSwgdGhpcy5oID0gciwgdGhpcy5kID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgZm9yICh2YXIgciA9ICExLCBuID0gMSAvIDAsIGkgPSAwOyBpIDwgZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGZvciAodmFyIGEgPSBlW2ldLCBvID0gMCwgcyA9IGEubGVuZ3RoLCB1ID0gcyAtIDE7IG8gPCBzOyB1ID0gbysrKSB7XG4gICAgICAgICAgICB2YXIgbCA9IGFbb10sXG4gICAgICAgICAgICAgICAgcCA9IGFbdV07XG4gICAgICAgICAgICBsLnkgPiB0LnkgIT0gcC55ID4gdC55ICYmIHQueCA8IChwLnggLSBsLngpICogKHQueSAtIGwueSkgLyAocC55IC0gbC55KSArIGwueCAmJiAociA9ICFyKSwgbiA9IE1hdGgubWluKG4sIFlhKHQsIGwsIHApKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKHIgPyAxIDogLTEpICogTWF0aC5zcXJ0KG4pO1xuICAgICAgfSh0aGlzLnAsIG4pLCB0aGlzLm1heCA9IHRoaXMuZCArIHRoaXMuaCAqIE1hdGguU1FSVDI7XG4gICAgfVxuXG4gICAgUXUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAodCkge1xuICAgICAgdGhpcy5kYXRhLnB1c2godCksIHRoaXMubGVuZ3RoKyssIHRoaXMuX3VwKHRoaXMubGVuZ3RoIC0gMSk7XG4gICAgfSwgUXUucHJvdG90eXBlLnBvcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICgwICE9PSB0aGlzLmxlbmd0aCkge1xuICAgICAgICB2YXIgdCA9IHRoaXMuZGF0YVswXSxcbiAgICAgICAgICAgIGUgPSB0aGlzLmRhdGEucG9wKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmxlbmd0aC0tLCB0aGlzLmxlbmd0aCA+IDAgJiYgKHRoaXMuZGF0YVswXSA9IGUsIHRoaXMuX2Rvd24oMCkpLCB0O1xuICAgICAgfVxuICAgIH0sIFF1LnByb3RvdHlwZS5wZWVrID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YVswXTtcbiAgICB9LCBRdS5wcm90b3R5cGUuX3VwID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZvciAodmFyIGUgPSB0aGlzLmRhdGEsIHIgPSB0aGlzLmNvbXBhcmUsIG4gPSBlW3RdOyB0ID4gMDspIHtcbiAgICAgICAgdmFyIGkgPSB0IC0gMSA+PiAxLFxuICAgICAgICAgICAgYSA9IGVbaV07XG4gICAgICAgIGlmIChyKG4sIGEpID49IDApIGJyZWFrO1xuICAgICAgICBlW3RdID0gYSwgdCA9IGk7XG4gICAgICB9XG5cbiAgICAgIGVbdF0gPSBuO1xuICAgIH0sIFF1LnByb3RvdHlwZS5fZG93biA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmb3IgKHZhciBlID0gdGhpcy5kYXRhLCByID0gdGhpcy5jb21wYXJlLCBuID0gdGhpcy5sZW5ndGggPj4gMSwgaSA9IGVbdF07IHQgPCBuOykge1xuICAgICAgICB2YXIgYSA9IDEgKyAodCA8PCAxKSxcbiAgICAgICAgICAgIG8gPSBlW2FdLFxuICAgICAgICAgICAgcyA9IGEgKyAxO1xuICAgICAgICBpZiAocyA8IHRoaXMubGVuZ3RoICYmIHIoZVtzXSwgbykgPCAwICYmIChhID0gcywgbyA9IGVbc10pLCByKG8sIGkpID49IDApIGJyZWFrO1xuICAgICAgICBlW3RdID0gbywgdCA9IGE7XG4gICAgICB9XG5cbiAgICAgIGVbdF0gPSBpO1xuICAgIH07XG4gICAgdmFyIGlsID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuXG4gICAgZnVuY3Rpb24gYWwodCwgZSkge1xuICAgICAgcmV0dXJuIGVbMV0gIT09IGlsID8gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgICAgdmFyIG4gPSAwLFxuICAgICAgICAgICAgaSA9IDA7XG5cbiAgICAgICAgc3dpdGNoIChlID0gTWF0aC5hYnMoZSksIHIgPSBNYXRoLmFicyhyKSwgdCkge1xuICAgICAgICAgIGNhc2UgXCJ0b3AtcmlnaHRcIjpcbiAgICAgICAgICBjYXNlIFwidG9wLWxlZnRcIjpcbiAgICAgICAgICBjYXNlIFwidG9wXCI6XG4gICAgICAgICAgICBpID0gciAtIDc7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJib3R0b20tcmlnaHRcIjpcbiAgICAgICAgICBjYXNlIFwiYm90dG9tLWxlZnRcIjpcbiAgICAgICAgICBjYXNlIFwiYm90dG9tXCI6XG4gICAgICAgICAgICBpID0gNyAtIHI7XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKHQpIHtcbiAgICAgICAgICBjYXNlIFwidG9wLXJpZ2h0XCI6XG4gICAgICAgICAgY2FzZSBcImJvdHRvbS1yaWdodFwiOlxuICAgICAgICAgIGNhc2UgXCJyaWdodFwiOlxuICAgICAgICAgICAgbiA9IC1lO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwidG9wLWxlZnRcIjpcbiAgICAgICAgICBjYXNlIFwiYm90dG9tLWxlZnRcIjpcbiAgICAgICAgICBjYXNlIFwibGVmdFwiOlxuICAgICAgICAgICAgbiA9IGU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW24sIGldO1xuICAgICAgfSh0LCBlWzBdLCBlWzFdKSA6IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHZhciByID0gMCxcbiAgICAgICAgICAgIG4gPSAwO1xuICAgICAgICBlIDwgMCAmJiAoZSA9IDApO1xuICAgICAgICB2YXIgaSA9IGUgLyBNYXRoLnNxcnQoMik7XG5cbiAgICAgICAgc3dpdGNoICh0KSB7XG4gICAgICAgICAgY2FzZSBcInRvcC1yaWdodFwiOlxuICAgICAgICAgIGNhc2UgXCJ0b3AtbGVmdFwiOlxuICAgICAgICAgICAgbiA9IGkgLSA3O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwiYm90dG9tLXJpZ2h0XCI6XG4gICAgICAgICAgY2FzZSBcImJvdHRvbS1sZWZ0XCI6XG4gICAgICAgICAgICBuID0gNyAtIGk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJib3R0b21cIjpcbiAgICAgICAgICAgIG4gPSA3IC0gZTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcInRvcFwiOlxuICAgICAgICAgICAgbiA9IGUgLSA3O1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoICh0KSB7XG4gICAgICAgICAgY2FzZSBcInRvcC1yaWdodFwiOlxuICAgICAgICAgIGNhc2UgXCJib3R0b20tcmlnaHRcIjpcbiAgICAgICAgICAgIHIgPSAtaTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcInRvcC1sZWZ0XCI6XG4gICAgICAgICAgY2FzZSBcImJvdHRvbS1sZWZ0XCI6XG4gICAgICAgICAgICByID0gaTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcImxlZnRcIjpcbiAgICAgICAgICAgIHIgPSBlO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwicmlnaHRcIjpcbiAgICAgICAgICAgIHIgPSAtZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbciwgbl07XG4gICAgICB9KHQsIGVbMF0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9sKHQpIHtcbiAgICAgIHN3aXRjaCAodCkge1xuICAgICAgICBjYXNlIFwicmlnaHRcIjpcbiAgICAgICAgY2FzZSBcInRvcC1yaWdodFwiOlxuICAgICAgICBjYXNlIFwiYm90dG9tLXJpZ2h0XCI6XG4gICAgICAgICAgcmV0dXJuIFwicmlnaHRcIjtcblxuICAgICAgICBjYXNlIFwibGVmdFwiOlxuICAgICAgICBjYXNlIFwidG9wLWxlZnRcIjpcbiAgICAgICAgY2FzZSBcImJvdHRvbS1sZWZ0XCI6XG4gICAgICAgICAgcmV0dXJuIFwibGVmdFwiO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gXCJjZW50ZXJcIjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzbCh0LCBlLCByLCBuLCBhLCBvLCBzLCB1LCBsLCBwLCBjLCBoLCBmLCB5LCBkKSB7XG4gICAgICB2YXIgbSA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBhLCBvLCBzLCB1KSB7XG4gICAgICAgIGZvciAodmFyIGwgPSBuLmxheW91dC5nZXQoXCJ0ZXh0LXJvdGF0ZVwiKS5ldmFsdWF0ZShvLCB7fSkgKiBNYXRoLlBJIC8gMTgwLCBwID0gW10sIGMgPSAwLCBoID0gZS5wb3NpdGlvbmVkTGluZXM7IGMgPCBoLmxlbmd0aDsgYyArPSAxKSB7XG4gICAgICAgICAgZm9yICh2YXIgZiA9IGhbY10sIHkgPSAwLCBkID0gZi5wb3NpdGlvbmVkR2x5cGhzOyB5IDwgZC5sZW5ndGg7IHkgKz0gMSkge1xuICAgICAgICAgICAgdmFyIG0gPSBkW3ldO1xuXG4gICAgICAgICAgICBpZiAobS5yZWN0KSB7XG4gICAgICAgICAgICAgIHZhciB2ID0gbS5yZWN0IHx8IHt9LFxuICAgICAgICAgICAgICAgICAgZyA9IDQsXG4gICAgICAgICAgICAgICAgICB4ID0gITAsXG4gICAgICAgICAgICAgICAgICBiID0gMSxcbiAgICAgICAgICAgICAgICAgIHcgPSAwLFxuICAgICAgICAgICAgICAgICAgXyA9IChhIHx8IHUpICYmIG0udmVydGljYWwsXG4gICAgICAgICAgICAgICAgICBBID0gbS5tZXRyaWNzLmFkdmFuY2UgKiBtLnNjYWxlIC8gMjtcblxuICAgICAgICAgICAgICBpZiAodSAmJiBlLnZlcnRpY2FsaXphYmxlICYmICh3ID0gZi5saW5lT2Zmc2V0IC8gMiAtIChtLmltYWdlTmFtZSA/IC0oMjQgLSBtLm1ldHJpY3Mud2lkdGggKiBtLnNjYWxlKSAvIDIgOiAyNCAqIChtLnNjYWxlIC0gMSkpKSwgbS5pbWFnZU5hbWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgUyA9IHNbbS5pbWFnZU5hbWVdO1xuICAgICAgICAgICAgICAgIHggPSBTLnNkZiwgZyA9IDEgLyAoYiA9IFMucGl4ZWxSYXRpbyk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB2YXIgayA9IGEgPyBbbS54ICsgQSwgbS55XSA6IFswLCAwXSxcbiAgICAgICAgICAgICAgICAgIEkgPSBhID8gWzAsIDBdIDogW20ueCArIEEgKyByWzBdLCBtLnkgKyByWzFdIC0gd10sXG4gICAgICAgICAgICAgICAgICB6ID0gWzAsIDBdO1xuICAgICAgICAgICAgICBfICYmICh6ID0gSSwgSSA9IFswLCAwXSk7XG4gICAgICAgICAgICAgIHZhciBDID0gKG0ubWV0cmljcy5sZWZ0IC0gZykgKiBtLnNjYWxlIC0gQSArIElbMF0sXG4gICAgICAgICAgICAgICAgICBFID0gKC1tLm1ldHJpY3MudG9wIC0gZykgKiBtLnNjYWxlICsgSVsxXSxcbiAgICAgICAgICAgICAgICAgIFAgPSBDICsgdi53ICogbS5zY2FsZSAvIGIsXG4gICAgICAgICAgICAgICAgICBNID0gRSArIHYuaCAqIG0uc2NhbGUgLyBiLFxuICAgICAgICAgICAgICAgICAgQiA9IG5ldyBpKEMsIEUpLFxuICAgICAgICAgICAgICAgICAgVCA9IG5ldyBpKFAsIEUpLFxuICAgICAgICAgICAgICAgICAgViA9IG5ldyBpKEMsIE0pLFxuICAgICAgICAgICAgICAgICAgRiA9IG5ldyBpKFAsIE0pO1xuXG4gICAgICAgICAgICAgIGlmIChfKSB7XG4gICAgICAgICAgICAgICAgdmFyIEQgPSBuZXcgaSgtQSwgQSAtIC0xNyksXG4gICAgICAgICAgICAgICAgICAgIEwgPSAtTWF0aC5QSSAvIDIsXG4gICAgICAgICAgICAgICAgICAgIE8gPSAxMiAtIEEsXG4gICAgICAgICAgICAgICAgICAgIFIgPSBuZXcgaSgyMiAtIE8sIC0obS5pbWFnZU5hbWUgPyBPIDogMCkpLFxuICAgICAgICAgICAgICAgICAgICBVID0gbmV3IChGdW5jdGlvbi5wcm90b3R5cGUuYmluZC5hcHBseShpLCBbbnVsbF0uY29uY2F0KHopKSkoKTtcbiAgICAgICAgICAgICAgICBCLl9yb3RhdGVBcm91bmQoTCwgRCkuX2FkZChSKS5fYWRkKFUpLCBULl9yb3RhdGVBcm91bmQoTCwgRCkuX2FkZChSKS5fYWRkKFUpLCBWLl9yb3RhdGVBcm91bmQoTCwgRCkuX2FkZChSKS5fYWRkKFUpLCBGLl9yb3RhdGVBcm91bmQoTCwgRCkuX2FkZChSKS5fYWRkKFUpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGwpIHtcbiAgICAgICAgICAgICAgICB2YXIgaiA9IE1hdGguc2luKGwpLFxuICAgICAgICAgICAgICAgICAgICBxID0gTWF0aC5jb3MobCksXG4gICAgICAgICAgICAgICAgICAgIE4gPSBbcSwgLWosIGosIHFdO1xuICAgICAgICAgICAgICAgIEIuX21hdE11bHQoTiksIFQuX21hdE11bHQoTiksIFYuX21hdE11bHQoTiksIEYuX21hdE11bHQoTik7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB2YXIgSyA9IG5ldyBpKDAsIDApLFxuICAgICAgICAgICAgICAgICAgRyA9IG5ldyBpKDAsIDApO1xuICAgICAgICAgICAgICBwLnB1c2goe1xuICAgICAgICAgICAgICAgIHRsOiBCLFxuICAgICAgICAgICAgICAgIHRyOiBULFxuICAgICAgICAgICAgICAgIGJsOiBWLFxuICAgICAgICAgICAgICAgIGJyOiBGLFxuICAgICAgICAgICAgICAgIHRleDogdixcbiAgICAgICAgICAgICAgICB3cml0aW5nTW9kZTogZS53cml0aW5nTW9kZSxcbiAgICAgICAgICAgICAgICBnbHlwaE9mZnNldDogayxcbiAgICAgICAgICAgICAgICBzZWN0aW9uSW5kZXg6IG0uc2VjdGlvbkluZGV4LFxuICAgICAgICAgICAgICAgIGlzU0RGOiB4LFxuICAgICAgICAgICAgICAgIHBpeGVsT2Zmc2V0VEw6IEssXG4gICAgICAgICAgICAgICAgcGl4ZWxPZmZzZXRCUjogRyxcbiAgICAgICAgICAgICAgICBtaW5Gb250U2NhbGVYOiAwLFxuICAgICAgICAgICAgICAgIG1pbkZvbnRTY2FsZVk6IDBcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHA7XG4gICAgICB9KDAsIHIsIHUsIGEsIG8sIHMsIG4sIHQuYWxsb3dWZXJ0aWNhbFBsYWNlbWVudCksXG4gICAgICAgICAgdiA9IHQudGV4dFNpemVEYXRhLFxuICAgICAgICAgIGcgPSBudWxsO1xuXG4gICAgICBcInNvdXJjZVwiID09PSB2LmtpbmQgPyAoZyA9IFsxMjggKiBhLmxheW91dC5nZXQoXCJ0ZXh0LXNpemVcIikuZXZhbHVhdGUocywge30pXSlbMF0gPiAzMjY0MCAmJiBBKHQubGF5ZXJJZHNbMF0gKyAnOiBWYWx1ZSBmb3IgXCJ0ZXh0LXNpemVcIiBpcyA+PSAyNTUuIFJlZHVjZSB5b3VyIFwidGV4dC1zaXplXCIuJykgOiBcImNvbXBvc2l0ZVwiID09PSB2LmtpbmQgJiYgKChnID0gWzEyOCAqIHkuY29tcG9zaXRlVGV4dFNpemVzWzBdLmV2YWx1YXRlKHMsIHt9LCBkKSwgMTI4ICogeS5jb21wb3NpdGVUZXh0U2l6ZXNbMV0uZXZhbHVhdGUocywge30sIGQpXSlbMF0gPiAzMjY0MCB8fCBnWzFdID4gMzI2NDApICYmIEEodC5sYXllcklkc1swXSArICc6IFZhbHVlIGZvciBcInRleHQtc2l6ZVwiIGlzID49IDI1NS4gUmVkdWNlIHlvdXIgXCJ0ZXh0LXNpemVcIi4nKSwgdC5hZGRTeW1ib2xzKHQudGV4dCwgbSwgZywgdSwgbywgcywgcCwgZSwgbC5saW5lU3RhcnRJbmRleCwgbC5saW5lTGVuZ3RoLCBmLCBkKTtcblxuICAgICAgZm9yICh2YXIgeCA9IDAsIGIgPSBjOyB4IDwgYi5sZW5ndGg7IHggKz0gMSkge1xuICAgICAgICBoW2JbeF1dID0gdC50ZXh0LnBsYWNlZFN5bWJvbEFycmF5Lmxlbmd0aCAtIDE7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiA0ICogbS5sZW5ndGg7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdWwodCkge1xuICAgICAgZm9yICh2YXIgZSBpbiB0KSB7XG4gICAgICAgIHJldHVybiB0W2VdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsbCh0LCBlLCByLCBuKSB7XG4gICAgICB2YXIgaSA9IHQuY29tcGFyZVRleHQ7XG5cbiAgICAgIGlmIChlIGluIGkpIHtcbiAgICAgICAgZm9yICh2YXIgYSA9IGlbZV0sIG8gPSBhLmxlbmd0aCAtIDE7IG8gPj0gMDsgby0tKSB7XG4gICAgICAgICAgaWYgKG4uZGlzdChhW29dKSA8IHIpIHJldHVybiAhMDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlbZV0gPSBbXTtcblxuICAgICAgcmV0dXJuIGlbZV0ucHVzaChuKSwgITE7XG4gICAgfVxuXG4gICAgdmFyIHBsID0gYnMuVmVjdG9yVGlsZUZlYXR1cmUudHlwZXMsXG4gICAgICAgIGNsID0gW3tcbiAgICAgIG5hbWU6IFwiYV9mYWRlX29wYWNpdHlcIixcbiAgICAgIGNvbXBvbmVudHM6IDEsXG4gICAgICB0eXBlOiBcIlVpbnQ4XCIsXG4gICAgICBvZmZzZXQ6IDBcbiAgICB9XTtcblxuICAgIGZ1bmN0aW9uIGhsKHQsIGUsIHIsIG4sIGksIGEsIG8sIHMsIHUsIGwsIHAsIGMsIGgpIHtcbiAgICAgIHZhciBmID0gcyA/IE1hdGgubWluKDMyNjQwLCBNYXRoLnJvdW5kKHNbMF0pKSA6IDAsXG4gICAgICAgICAgeSA9IHMgPyBNYXRoLm1pbigzMjY0MCwgTWF0aC5yb3VuZChzWzFdKSkgOiAwO1xuICAgICAgdC5lbXBsYWNlQmFjayhlLCByLCBNYXRoLnJvdW5kKDMyICogbiksIE1hdGgucm91bmQoMzIgKiBpKSwgYSwgbywgKGYgPDwgMSkgKyAodSA/IDEgOiAwKSwgeSwgMTYgKiBsLCAxNiAqIHAsIDI1NiAqIGMsIDI1NiAqIGgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZsKHQsIGUsIHIpIHtcbiAgICAgIHQuZW1wbGFjZUJhY2soZS54LCBlLnksIHIpLCB0LmVtcGxhY2VCYWNrKGUueCwgZS55LCByKSwgdC5lbXBsYWNlQmFjayhlLngsIGUueSwgciksIHQuZW1wbGFjZUJhY2soZS54LCBlLnksIHIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHlsKHQpIHtcbiAgICAgIGZvciAodmFyIGUgPSAwLCByID0gdC5zZWN0aW9uczsgZSA8IHIubGVuZ3RoOyBlICs9IDEpIHtcbiAgICAgICAgaWYgKCRuKHJbZV0udGV4dCkpIHJldHVybiAhMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICExO1xuICAgIH1cblxuICAgIHZhciBkbCA9IGZ1bmN0aW9uIGRsKHQpIHtcbiAgICAgIHRoaXMubGF5b3V0VmVydGV4QXJyYXkgPSBuZXcgVmkoKSwgdGhpcy5pbmRleEFycmF5ID0gbmV3IGppKCksIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zID0gdCwgdGhpcy5zZWdtZW50cyA9IG5ldyBzYSgpLCB0aGlzLmR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheSA9IG5ldyBGaSgpLCB0aGlzLm9wYWNpdHlWZXJ0ZXhBcnJheSA9IG5ldyBEaSgpLCB0aGlzLnBsYWNlZFN5bWJvbEFycmF5ID0gbmV3IFFpKCk7XG4gICAgfTtcblxuICAgIGRsLnByb3RvdHlwZS5pc0VtcHR5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIDAgPT09IHRoaXMubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoICYmIDAgPT09IHRoaXMuaW5kZXhBcnJheS5sZW5ndGggJiYgMCA9PT0gdGhpcy5keW5hbWljTGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoICYmIDAgPT09IHRoaXMub3BhY2l0eVZlcnRleEFycmF5Lmxlbmd0aDtcbiAgICB9LCBkbC5wcm90b3R5cGUudXBsb2FkID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4pIHtcbiAgICAgIHRoaXMuaXNFbXB0eSgpIHx8IChyICYmICh0aGlzLmxheW91dFZlcnRleEJ1ZmZlciA9IHQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMubGF5b3V0VmVydGV4QXJyYXksIGpzLm1lbWJlcnMpLCB0aGlzLmluZGV4QnVmZmVyID0gdC5jcmVhdGVJbmRleEJ1ZmZlcih0aGlzLmluZGV4QXJyYXksIGUpLCB0aGlzLmR5bmFtaWNMYXlvdXRWZXJ0ZXhCdWZmZXIgPSB0LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLmR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheSwgcXMubWVtYmVycywgITApLCB0aGlzLm9wYWNpdHlWZXJ0ZXhCdWZmZXIgPSB0LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLm9wYWNpdHlWZXJ0ZXhBcnJheSwgY2wsICEwKSwgdGhpcy5vcGFjaXR5VmVydGV4QnVmZmVyLml0ZW1TaXplID0gMSksIChyIHx8IG4pICYmIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnVwbG9hZCh0KSk7XG4gICAgfSwgZGwucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLmxheW91dFZlcnRleEJ1ZmZlciAmJiAodGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIuZGVzdHJveSgpLCB0aGlzLmluZGV4QnVmZmVyLmRlc3Ryb3koKSwgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMuZGVzdHJveSgpLCB0aGlzLnNlZ21lbnRzLmRlc3Ryb3koKSwgdGhpcy5keW5hbWljTGF5b3V0VmVydGV4QnVmZmVyLmRlc3Ryb3koKSwgdGhpcy5vcGFjaXR5VmVydGV4QnVmZmVyLmRlc3Ryb3koKSk7XG4gICAgfSwgT24oXCJTeW1ib2xCdWZmZXJzXCIsIGRsKTtcblxuICAgIHZhciBtbCA9IGZ1bmN0aW9uIG1sKHQsIGUsIHIpIHtcbiAgICAgIHRoaXMubGF5b3V0VmVydGV4QXJyYXkgPSBuZXcgdCgpLCB0aGlzLmxheW91dEF0dHJpYnV0ZXMgPSBlLCB0aGlzLmluZGV4QXJyYXkgPSBuZXcgcigpLCB0aGlzLnNlZ21lbnRzID0gbmV3IHNhKCksIHRoaXMuY29sbGlzaW9uVmVydGV4QXJyYXkgPSBuZXcgVWkoKTtcbiAgICB9O1xuXG4gICAgbWwucHJvdG90eXBlLnVwbG9hZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0aGlzLmxheW91dFZlcnRleEJ1ZmZlciA9IHQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHRoaXMubGF5b3V0QXR0cmlidXRlcyksIHRoaXMuaW5kZXhCdWZmZXIgPSB0LmNyZWF0ZUluZGV4QnVmZmVyKHRoaXMuaW5kZXhBcnJheSksIHRoaXMuY29sbGlzaW9uVmVydGV4QnVmZmVyID0gdC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5jb2xsaXNpb25WZXJ0ZXhBcnJheSwgTnMubWVtYmVycywgITApO1xuICAgIH0sIG1sLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIgJiYgKHRoaXMubGF5b3V0VmVydGV4QnVmZmVyLmRlc3Ryb3koKSwgdGhpcy5pbmRleEJ1ZmZlci5kZXN0cm95KCksIHRoaXMuc2VnbWVudHMuZGVzdHJveSgpLCB0aGlzLmNvbGxpc2lvblZlcnRleEJ1ZmZlci5kZXN0cm95KCkpO1xuICAgIH0sIE9uKFwiQ29sbGlzaW9uQnVmZmVyc1wiLCBtbCk7XG5cbiAgICB2YXIgdmwgPSBmdW5jdGlvbiB2bCh0KSB7XG4gICAgICB0aGlzLmNvbGxpc2lvbkJveEFycmF5ID0gdC5jb2xsaXNpb25Cb3hBcnJheSwgdGhpcy56b29tID0gdC56b29tLCB0aGlzLm92ZXJzY2FsaW5nID0gdC5vdmVyc2NhbGluZywgdGhpcy5sYXllcnMgPSB0LmxheWVycywgdGhpcy5sYXllcklkcyA9IHRoaXMubGF5ZXJzLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdC5pZDtcbiAgICAgIH0pLCB0aGlzLmluZGV4ID0gdC5pbmRleCwgdGhpcy5waXhlbFJhdGlvID0gdC5waXhlbFJhdGlvLCB0aGlzLnNvdXJjZUxheWVySW5kZXggPSB0LnNvdXJjZUxheWVySW5kZXgsIHRoaXMuaGFzUGF0dGVybiA9ICExLCB0aGlzLmhhc1JUTFRleHQgPSAhMSwgdGhpcy5zb3J0S2V5UmFuZ2VzID0gW10sIHRoaXMuY29sbGlzaW9uQ2lyY2xlQXJyYXkgPSBbXSwgdGhpcy5wbGFjZW1lbnRJbnZQcm9qTWF0cml4ID0gb28oW10pLCB0aGlzLnBsYWNlbWVudFZpZXdwb3J0TWF0cml4ID0gb28oW10pO1xuICAgICAgdmFyIGUgPSB0aGlzLmxheWVyc1swXS5fdW5ldmFsdWF0ZWRMYXlvdXQuX3ZhbHVlcztcbiAgICAgIHRoaXMudGV4dFNpemVEYXRhID0gRHUodGhpcy56b29tLCBlW1widGV4dC1zaXplXCJdKSwgdGhpcy5pY29uU2l6ZURhdGEgPSBEdSh0aGlzLnpvb20sIGVbXCJpY29uLXNpemVcIl0pO1xuICAgICAgdmFyIHIgPSB0aGlzLmxheWVyc1swXS5sYXlvdXQsXG4gICAgICAgICAgbiA9IHIuZ2V0KFwic3ltYm9sLXNvcnQta2V5XCIpLFxuICAgICAgICAgIGkgPSByLmdldChcInN5bWJvbC16LW9yZGVyXCIpO1xuICAgICAgdGhpcy5jYW5PdmVybGFwID0gci5nZXQoXCJ0ZXh0LWFsbG93LW92ZXJsYXBcIikgfHwgci5nZXQoXCJpY29uLWFsbG93LW92ZXJsYXBcIikgfHwgci5nZXQoXCJ0ZXh0LWlnbm9yZS1wbGFjZW1lbnRcIikgfHwgci5nZXQoXCJpY29uLWlnbm9yZS1wbGFjZW1lbnRcIiksIHRoaXMuc29ydEZlYXR1cmVzQnlLZXkgPSBcInZpZXdwb3J0LXlcIiAhPT0gaSAmJiB2b2lkIDAgIT09IG4uY29uc3RhbnRPcigxKSwgdGhpcy5zb3J0RmVhdHVyZXNCeVkgPSAoXCJ2aWV3cG9ydC15XCIgPT09IGkgfHwgXCJhdXRvXCIgPT09IGkgJiYgIXRoaXMuc29ydEZlYXR1cmVzQnlLZXkpICYmIHRoaXMuY2FuT3ZlcmxhcCwgXCJwb2ludFwiID09PSByLmdldChcInN5bWJvbC1wbGFjZW1lbnRcIikgJiYgKHRoaXMud3JpdGluZ01vZGVzID0gci5nZXQoXCJ0ZXh0LXdyaXRpbmctbW9kZVwiKS5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHd1W3RdO1xuICAgICAgfSkpLCB0aGlzLnN0YXRlRGVwZW5kZW50TGF5ZXJJZHMgPSB0aGlzLmxheWVycy5maWx0ZXIoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQuaXNTdGF0ZURlcGVuZGVudCgpO1xuICAgICAgfSkubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0LmlkO1xuICAgICAgfSksIHRoaXMuc291cmNlSUQgPSB0LnNvdXJjZUlEO1xuICAgIH07XG5cbiAgICB2bC5wcm90b3R5cGUuY3JlYXRlQXJyYXlzID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy50ZXh0ID0gbmV3IGRsKG5ldyBWYSh0aGlzLmxheWVycywgdGhpcy56b29tLCBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gL150ZXh0Ly50ZXN0KHQpO1xuICAgICAgfSkpLCB0aGlzLmljb24gPSBuZXcgZGwobmV3IFZhKHRoaXMubGF5ZXJzLCB0aGlzLnpvb20sIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiAvXmljb24vLnRlc3QodCk7XG4gICAgICB9KSksIHRoaXMuZ2x5cGhPZmZzZXRBcnJheSA9IG5ldyByYSgpLCB0aGlzLmxpbmVWZXJ0ZXhBcnJheSA9IG5ldyBuYSgpLCB0aGlzLnN5bWJvbEluc3RhbmNlcyA9IG5ldyBlYSgpO1xuICAgIH0sIHZsLnByb3RvdHlwZS5jYWxjdWxhdGVHbHlwaERlcGVuZGVuY2llcyA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpKSB7XG4gICAgICBmb3IgKHZhciBhID0gMDsgYSA8IHQubGVuZ3RoOyBhKyspIHtcbiAgICAgICAgaWYgKGVbdC5jaGFyQ29kZUF0KGEpXSA9ICEwLCAociB8fCBuKSAmJiBpKSB7XG4gICAgICAgICAgdmFyIG8gPSBYc1t0LmNoYXJBdChhKV07XG4gICAgICAgICAgbyAmJiAoZVtvLmNoYXJDb2RlQXQoMCldID0gITApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgdmwucHJvdG90eXBlLnBvcHVsYXRlID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgIHZhciBuID0gdGhpcy5sYXllcnNbMF0sXG4gICAgICAgICAgaSA9IG4ubGF5b3V0LFxuICAgICAgICAgIGEgPSBpLmdldChcInRleHQtZm9udFwiKSxcbiAgICAgICAgICBvID0gaS5nZXQoXCJ0ZXh0LWZpZWxkXCIpLFxuICAgICAgICAgIHMgPSBpLmdldChcImljb24taW1hZ2VcIiksXG4gICAgICAgICAgdSA9IChcImNvbnN0YW50XCIgIT09IG8udmFsdWUua2luZCB8fCBvLnZhbHVlLnZhbHVlIGluc3RhbmNlb2YgbmUgJiYgIW8udmFsdWUudmFsdWUuaXNFbXB0eSgpIHx8IG8udmFsdWUudmFsdWUudG9TdHJpbmcoKS5sZW5ndGggPiAwKSAmJiAoXCJjb25zdGFudFwiICE9PSBhLnZhbHVlLmtpbmQgfHwgYS52YWx1ZS52YWx1ZS5sZW5ndGggPiAwKSxcbiAgICAgICAgICBsID0gXCJjb25zdGFudFwiICE9PSBzLnZhbHVlLmtpbmQgfHwgISFzLnZhbHVlLnZhbHVlIHx8IE9iamVjdC5rZXlzKHMucGFyYW1ldGVycykubGVuZ3RoID4gMCxcbiAgICAgICAgICBwID0gaS5nZXQoXCJzeW1ib2wtc29ydC1rZXlcIik7XG5cbiAgICAgIGlmICh0aGlzLmZlYXR1cmVzID0gW10sIHUgfHwgbCkge1xuICAgICAgICBmb3IgKHZhciBjID0gZS5pY29uRGVwZW5kZW5jaWVzLCBoID0gZS5nbHlwaERlcGVuZGVuY2llcywgZiA9IGUuYXZhaWxhYmxlSW1hZ2VzLCB5ID0gbmV3IHNpKHRoaXMuem9vbSksIGQgPSAwLCBtID0gdDsgZCA8IG0ubGVuZ3RoOyBkICs9IDEpIHtcbiAgICAgICAgICB2YXIgdiA9IG1bZF0sXG4gICAgICAgICAgICAgIGcgPSB2LmZlYXR1cmUsXG4gICAgICAgICAgICAgIHggPSB2LmlkLFxuICAgICAgICAgICAgICBiID0gdi5pbmRleCxcbiAgICAgICAgICAgICAgdyA9IHYuc291cmNlTGF5ZXJJbmRleCxcbiAgICAgICAgICAgICAgXyA9IG4uX2ZlYXR1cmVGaWx0ZXIubmVlZEdlb21ldHJ5LFxuICAgICAgICAgICAgICBBID0gVWEoZywgXyk7XG5cbiAgICAgICAgICBpZiAobi5fZmVhdHVyZUZpbHRlci5maWx0ZXIoeSwgQSwgcikpIHtcbiAgICAgICAgICAgIF8gfHwgKEEuZ2VvbWV0cnkgPSBSYShnKSk7XG4gICAgICAgICAgICB2YXIgUyA9IHZvaWQgMDtcblxuICAgICAgICAgICAgaWYgKHUpIHtcbiAgICAgICAgICAgICAgdmFyIGsgPSBuLmdldFZhbHVlQW5kUmVzb2x2ZVRva2VucyhcInRleHQtZmllbGRcIiwgQSwgciwgZiksXG4gICAgICAgICAgICAgICAgICBJID0gbmUuZmFjdG9yeShrKTtcbiAgICAgICAgICAgICAgeWwoSSkgJiYgKHRoaXMuaGFzUlRMVGV4dCA9ICEwKSwgKCF0aGlzLmhhc1JUTFRleHQgfHwgXCJ1bmF2YWlsYWJsZVwiID09PSBpaSgpIHx8IHRoaXMuaGFzUlRMVGV4dCAmJiBvaS5pc1BhcnNlZCgpKSAmJiAoUyA9IFpzKEksIG4sIEEpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHogPSB2b2lkIDA7XG5cbiAgICAgICAgICAgIGlmIChsKSB7XG4gICAgICAgICAgICAgIHZhciBDID0gbi5nZXRWYWx1ZUFuZFJlc29sdmVUb2tlbnMoXCJpY29uLWltYWdlXCIsIEEsIHIsIGYpO1xuICAgICAgICAgICAgICB6ID0gQyBpbnN0YW5jZW9mIGllID8gQyA6IGllLmZyb21TdHJpbmcoQyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChTIHx8IHopIHtcbiAgICAgICAgICAgICAgdmFyIEUgPSB0aGlzLnNvcnRGZWF0dXJlc0J5S2V5ID8gcC5ldmFsdWF0ZShBLCB7fSwgcikgOiB2b2lkIDA7XG5cbiAgICAgICAgICAgICAgaWYgKHRoaXMuZmVhdHVyZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgaWQ6IHgsXG4gICAgICAgICAgICAgICAgdGV4dDogUyxcbiAgICAgICAgICAgICAgICBpY29uOiB6LFxuICAgICAgICAgICAgICAgIGluZGV4OiBiLFxuICAgICAgICAgICAgICAgIHNvdXJjZUxheWVySW5kZXg6IHcsXG4gICAgICAgICAgICAgICAgZ2VvbWV0cnk6IEEuZ2VvbWV0cnksXG4gICAgICAgICAgICAgICAgcHJvcGVydGllczogZy5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgIHR5cGU6IHBsW2cudHlwZV0sXG4gICAgICAgICAgICAgICAgc29ydEtleTogRVxuICAgICAgICAgICAgICB9KSwgeiAmJiAoY1t6Lm5hbWVdID0gITApLCBTKSB7XG4gICAgICAgICAgICAgICAgdmFyIFAgPSBhLmV2YWx1YXRlKEEsIHt9LCByKS5qb2luKFwiLFwiKSxcbiAgICAgICAgICAgICAgICAgICAgTSA9IFwibWFwXCIgPT09IGkuZ2V0KFwidGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIikgJiYgXCJwb2ludFwiICE9PSBpLmdldChcInN5bWJvbC1wbGFjZW1lbnRcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5hbGxvd1ZlcnRpY2FsUGxhY2VtZW50ID0gdGhpcy53cml0aW5nTW9kZXMgJiYgdGhpcy53cml0aW5nTW9kZXMuaW5kZXhPZih3dS52ZXJ0aWNhbCkgPj0gMDtcblxuICAgICAgICAgICAgICAgIGZvciAodmFyIEIgPSAwLCBUID0gUy5zZWN0aW9uczsgQiA8IFQubGVuZ3RoOyBCICs9IDEpIHtcbiAgICAgICAgICAgICAgICAgIHZhciBWID0gVFtCXTtcbiAgICAgICAgICAgICAgICAgIGlmIChWLmltYWdlKSBjW1YuaW1hZ2UubmFtZV0gPSAhMDtlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIEYgPSBabihTLnRvU3RyaW5nKCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgRCA9IFYuZm9udFN0YWNrIHx8IFAsXG4gICAgICAgICAgICAgICAgICAgICAgICBMID0gaFtEXSA9IGhbRF0gfHwge307XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlR2x5cGhEZXBlbmRlbmNpZXMoVi50ZXh0LCBMLCBNLCB0aGlzLmFsbG93VmVydGljYWxQbGFjZW1lbnQsIEYpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIFwibGluZVwiID09PSBpLmdldChcInN5bWJvbC1wbGFjZW1lbnRcIikgJiYgKHRoaXMuZmVhdHVyZXMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHZhciBlID0ge30sXG4gICAgICAgICAgICAgIHIgPSB7fSxcbiAgICAgICAgICAgICAgbiA9IFtdLFxuICAgICAgICAgICAgICBpID0gMDtcblxuICAgICAgICAgIGZ1bmN0aW9uIGEoZSkge1xuICAgICAgICAgICAgbi5wdXNoKHRbZV0pLCBpKys7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZnVuY3Rpb24gbyh0LCBlLCBpKSB7XG4gICAgICAgICAgICB2YXIgYSA9IHJbdF07XG4gICAgICAgICAgICByZXR1cm4gZGVsZXRlIHJbdF0sIHJbZV0gPSBhLCBuW2FdLmdlb21ldHJ5WzBdLnBvcCgpLCBuW2FdLmdlb21ldHJ5WzBdID0gblthXS5nZW9tZXRyeVswXS5jb25jYXQoaVswXSksIGE7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZnVuY3Rpb24gcyh0LCByLCBpKSB7XG4gICAgICAgICAgICB2YXIgYSA9IGVbcl07XG4gICAgICAgICAgICByZXR1cm4gZGVsZXRlIGVbcl0sIGVbdF0gPSBhLCBuW2FdLmdlb21ldHJ5WzBdLnNoaWZ0KCksIG5bYV0uZ2VvbWV0cnlbMF0gPSBpWzBdLmNvbmNhdChuW2FdLmdlb21ldHJ5WzBdKSwgYTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmdW5jdGlvbiB1KHQsIGUsIHIpIHtcbiAgICAgICAgICAgIHZhciBuID0gciA/IGVbMF1bZVswXS5sZW5ndGggLSAxXSA6IGVbMF1bMF07XG4gICAgICAgICAgICByZXR1cm4gdCArIFwiOlwiICsgbi54ICsgXCI6XCIgKyBuLnk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yICh2YXIgbCA9IDA7IGwgPCB0Lmxlbmd0aDsgbCsrKSB7XG4gICAgICAgICAgICB2YXIgcCA9IHRbbF0sXG4gICAgICAgICAgICAgICAgYyA9IHAuZ2VvbWV0cnksXG4gICAgICAgICAgICAgICAgaCA9IHAudGV4dCA/IHAudGV4dC50b1N0cmluZygpIDogbnVsbDtcblxuICAgICAgICAgICAgaWYgKGgpIHtcbiAgICAgICAgICAgICAgdmFyIGYgPSB1KGgsIGMpLFxuICAgICAgICAgICAgICAgICAgeSA9IHUoaCwgYywgITApO1xuXG4gICAgICAgICAgICAgIGlmIChmIGluIHIgJiYgeSBpbiBlICYmIHJbZl0gIT09IGVbeV0pIHtcbiAgICAgICAgICAgICAgICB2YXIgZCA9IHMoZiwgeSwgYyksXG4gICAgICAgICAgICAgICAgICAgIG0gPSBvKGYsIHksIG5bZF0uZ2VvbWV0cnkpO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBlW2ZdLCBkZWxldGUgclt5XSwgclt1KGgsIG5bbV0uZ2VvbWV0cnksICEwKV0gPSBtLCBuW2RdLmdlb21ldHJ5ID0gbnVsbDtcbiAgICAgICAgICAgICAgfSBlbHNlIGYgaW4gciA/IG8oZiwgeSwgYykgOiB5IGluIGUgPyBzKGYsIHksIGMpIDogKGEobCksIGVbZl0gPSBpIC0gMSwgclt5XSA9IGkgLSAxKTtcbiAgICAgICAgICAgIH0gZWxzZSBhKGwpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBuLmZpbHRlcihmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgcmV0dXJuIHQuZ2VvbWV0cnk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0odGhpcy5mZWF0dXJlcykpLCB0aGlzLnNvcnRGZWF0dXJlc0J5S2V5ICYmIHRoaXMuZmVhdHVyZXMuc29ydChmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgIHJldHVybiB0LnNvcnRLZXkgLSBlLnNvcnRLZXk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sIHZsLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgdGhpcy5zdGF0ZURlcGVuZGVudExheWVycy5sZW5ndGggJiYgKHRoaXMudGV4dC5wcm9ncmFtQ29uZmlndXJhdGlvbnMudXBkYXRlUGFpbnRBcnJheXModCwgZSwgdGhpcy5sYXllcnMsIHIpLCB0aGlzLmljb24ucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnVwZGF0ZVBhaW50QXJyYXlzKHQsIGUsIHRoaXMubGF5ZXJzLCByKSk7XG4gICAgfSwgdmwucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gMCA9PT0gdGhpcy5zeW1ib2xJbnN0YW5jZXMubGVuZ3RoICYmICF0aGlzLmhhc1JUTFRleHQ7XG4gICAgfSwgdmwucHJvdG90eXBlLnVwbG9hZFBlbmRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gIXRoaXMudXBsb2FkZWQgfHwgdGhpcy50ZXh0LnByb2dyYW1Db25maWd1cmF0aW9ucy5uZWVkc1VwbG9hZCB8fCB0aGlzLmljb24ucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLm5lZWRzVXBsb2FkO1xuICAgIH0sIHZsLnByb3RvdHlwZS51cGxvYWQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgIXRoaXMudXBsb2FkZWQgJiYgdGhpcy5oYXNEZWJ1Z0RhdGEoKSAmJiAodGhpcy50ZXh0Q29sbGlzaW9uQm94LnVwbG9hZCh0KSwgdGhpcy5pY29uQ29sbGlzaW9uQm94LnVwbG9hZCh0KSksIHRoaXMudGV4dC51cGxvYWQodCwgdGhpcy5zb3J0RmVhdHVyZXNCeVksICF0aGlzLnVwbG9hZGVkLCB0aGlzLnRleHQucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLm5lZWRzVXBsb2FkKSwgdGhpcy5pY29uLnVwbG9hZCh0LCB0aGlzLnNvcnRGZWF0dXJlc0J5WSwgIXRoaXMudXBsb2FkZWQsIHRoaXMuaWNvbi5wcm9ncmFtQ29uZmlndXJhdGlvbnMubmVlZHNVcGxvYWQpLCB0aGlzLnVwbG9hZGVkID0gITA7XG4gICAgfSwgdmwucHJvdG90eXBlLmRlc3Ryb3lEZWJ1Z0RhdGEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLnRleHRDb2xsaXNpb25Cb3guZGVzdHJveSgpLCB0aGlzLmljb25Db2xsaXNpb25Cb3guZGVzdHJveSgpO1xuICAgIH0sIHZsLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy50ZXh0LmRlc3Ryb3koKSwgdGhpcy5pY29uLmRlc3Ryb3koKSwgdGhpcy5oYXNEZWJ1Z0RhdGEoKSAmJiB0aGlzLmRlc3Ryb3lEZWJ1Z0RhdGEoKTtcbiAgICB9LCB2bC5wcm90b3R5cGUuYWRkVG9MaW5lVmVydGV4QXJyYXkgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgdmFyIHIgPSB0aGlzLmxpbmVWZXJ0ZXhBcnJheS5sZW5ndGg7XG5cbiAgICAgIGlmICh2b2lkIDAgIT09IHQuc2VnbWVudCkge1xuICAgICAgICBmb3IgKHZhciBuID0gdC5kaXN0KGVbdC5zZWdtZW50ICsgMV0pLCBpID0gdC5kaXN0KGVbdC5zZWdtZW50XSksIGEgPSB7fSwgbyA9IHQuc2VnbWVudCArIDE7IG8gPCBlLmxlbmd0aDsgbysrKSB7XG4gICAgICAgICAgYVtvXSA9IHtcbiAgICAgICAgICAgIHg6IGVbb10ueCxcbiAgICAgICAgICAgIHk6IGVbb10ueSxcbiAgICAgICAgICAgIHRpbGVVbml0RGlzdGFuY2VGcm9tQW5jaG9yOiBuXG4gICAgICAgICAgfSwgbyA8IGUubGVuZ3RoIC0gMSAmJiAobiArPSBlW28gKyAxXS5kaXN0KGVbb10pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIHMgPSB0LnNlZ21lbnQgfHwgMDsgcyA+PSAwOyBzLS0pIHtcbiAgICAgICAgICBhW3NdID0ge1xuICAgICAgICAgICAgeDogZVtzXS54LFxuICAgICAgICAgICAgeTogZVtzXS55LFxuICAgICAgICAgICAgdGlsZVVuaXREaXN0YW5jZUZyb21BbmNob3I6IGlcbiAgICAgICAgICB9LCBzID4gMCAmJiAoaSArPSBlW3MgLSAxXS5kaXN0KGVbc10pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIHUgPSAwOyB1IDwgZS5sZW5ndGg7IHUrKykge1xuICAgICAgICAgIHZhciBsID0gYVt1XTtcbiAgICAgICAgICB0aGlzLmxpbmVWZXJ0ZXhBcnJheS5lbXBsYWNlQmFjayhsLngsIGwueSwgbC50aWxlVW5pdERpc3RhbmNlRnJvbUFuY2hvcik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGluZVN0YXJ0SW5kZXg6IHIsXG4gICAgICAgIGxpbmVMZW5ndGg6IHRoaXMubGluZVZlcnRleEFycmF5Lmxlbmd0aCAtIHJcbiAgICAgIH07XG4gICAgfSwgdmwucHJvdG90eXBlLmFkZFN5bWJvbHMgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSwgYSwgbywgcywgdSwgbCwgcCwgYykge1xuICAgICAgZm9yICh2YXIgaCA9IHQuaW5kZXhBcnJheSwgZiA9IHQubGF5b3V0VmVydGV4QXJyYXksIHkgPSB0LnNlZ21lbnRzLnByZXBhcmVTZWdtZW50KDQgKiBlLmxlbmd0aCwgZiwgaCwgdGhpcy5jYW5PdmVybGFwID8gYS5zb3J0S2V5IDogdm9pZCAwKSwgZCA9IHRoaXMuZ2x5cGhPZmZzZXRBcnJheS5sZW5ndGgsIG0gPSB5LnZlcnRleExlbmd0aCwgdiA9IHRoaXMuYWxsb3dWZXJ0aWNhbFBsYWNlbWVudCAmJiBvID09PSB3dS52ZXJ0aWNhbCA/IE1hdGguUEkgLyAyIDogMCwgZyA9IGEudGV4dCAmJiBhLnRleHQuc2VjdGlvbnMsIHggPSAwOyB4IDwgZS5sZW5ndGg7IHgrKykge1xuICAgICAgICB2YXIgYiA9IGVbeF0sXG4gICAgICAgICAgICB3ID0gYi50bCxcbiAgICAgICAgICAgIF8gPSBiLnRyLFxuICAgICAgICAgICAgQSA9IGIuYmwsXG4gICAgICAgICAgICBTID0gYi5icixcbiAgICAgICAgICAgIGsgPSBiLnRleCxcbiAgICAgICAgICAgIEkgPSBiLnBpeGVsT2Zmc2V0VEwsXG4gICAgICAgICAgICB6ID0gYi5waXhlbE9mZnNldEJSLFxuICAgICAgICAgICAgQyA9IGIubWluRm9udFNjYWxlWCxcbiAgICAgICAgICAgIEUgPSBiLm1pbkZvbnRTY2FsZVksXG4gICAgICAgICAgICBQID0gYi5nbHlwaE9mZnNldCxcbiAgICAgICAgICAgIE0gPSBiLmlzU0RGLFxuICAgICAgICAgICAgQiA9IGIuc2VjdGlvbkluZGV4LFxuICAgICAgICAgICAgVCA9IHkudmVydGV4TGVuZ3RoLFxuICAgICAgICAgICAgViA9IFBbMV07XG4gICAgICAgIGhsKGYsIHMueCwgcy55LCB3LngsIFYgKyB3LnksIGsueCwgay55LCByLCBNLCBJLngsIEkueSwgQywgRSksIGhsKGYsIHMueCwgcy55LCBfLngsIFYgKyBfLnksIGsueCArIGsudywgay55LCByLCBNLCB6LngsIEkueSwgQywgRSksIGhsKGYsIHMueCwgcy55LCBBLngsIFYgKyBBLnksIGsueCwgay55ICsgay5oLCByLCBNLCBJLngsIHoueSwgQywgRSksIGhsKGYsIHMueCwgcy55LCBTLngsIFYgKyBTLnksIGsueCArIGsudywgay55ICsgay5oLCByLCBNLCB6LngsIHoueSwgQywgRSksIGZsKHQuZHluYW1pY0xheW91dFZlcnRleEFycmF5LCBzLCB2KSwgaC5lbXBsYWNlQmFjayhULCBUICsgMSwgVCArIDIpLCBoLmVtcGxhY2VCYWNrKFQgKyAxLCBUICsgMiwgVCArIDMpLCB5LnZlcnRleExlbmd0aCArPSA0LCB5LnByaW1pdGl2ZUxlbmd0aCArPSAyLCB0aGlzLmdseXBoT2Zmc2V0QXJyYXkuZW1wbGFjZUJhY2soUFswXSksIHggIT09IGUubGVuZ3RoIC0gMSAmJiBCID09PSBlW3ggKyAxXS5zZWN0aW9uSW5kZXggfHwgdC5wcm9ncmFtQ29uZmlndXJhdGlvbnMucG9wdWxhdGVQYWludEFycmF5cyhmLmxlbmd0aCwgYSwgYS5pbmRleCwge30sIGMsIGcgJiYgZ1tCXSk7XG4gICAgICB9XG5cbiAgICAgIHQucGxhY2VkU3ltYm9sQXJyYXkuZW1wbGFjZUJhY2socy54LCBzLnksIGQsIHRoaXMuZ2x5cGhPZmZzZXRBcnJheS5sZW5ndGggLSBkLCBtLCB1LCBsLCBzLnNlZ21lbnQsIHIgPyByWzBdIDogMCwgciA/IHJbMV0gOiAwLCBuWzBdLCBuWzFdLCBvLCAwLCAhMSwgMCwgcCk7XG4gICAgfSwgdmwucHJvdG90eXBlLl9hZGRDb2xsaXNpb25EZWJ1Z1ZlcnRleCA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpLCBhKSB7XG4gICAgICByZXR1cm4gZS5lbXBsYWNlQmFjaygwLCAwKSwgdC5lbXBsYWNlQmFjayhyLngsIHIueSwgbiwgaSwgTWF0aC5yb3VuZChhLngpLCBNYXRoLnJvdW5kKGEueSkpO1xuICAgIH0sIHZsLnByb3RvdHlwZS5hZGRDb2xsaXNpb25EZWJ1Z1ZlcnRpY2VzID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGEsIG8sIHMpIHtcbiAgICAgIHZhciB1ID0gYS5zZWdtZW50cy5wcmVwYXJlU2VnbWVudCg0LCBhLmxheW91dFZlcnRleEFycmF5LCBhLmluZGV4QXJyYXkpLFxuICAgICAgICAgIGwgPSB1LnZlcnRleExlbmd0aCxcbiAgICAgICAgICBwID0gYS5sYXlvdXRWZXJ0ZXhBcnJheSxcbiAgICAgICAgICBjID0gYS5jb2xsaXNpb25WZXJ0ZXhBcnJheSxcbiAgICAgICAgICBoID0gcy5hbmNob3JYLFxuICAgICAgICAgIGYgPSBzLmFuY2hvclk7XG4gICAgICB0aGlzLl9hZGRDb2xsaXNpb25EZWJ1Z1ZlcnRleChwLCBjLCBvLCBoLCBmLCBuZXcgaSh0LCBlKSksIHRoaXMuX2FkZENvbGxpc2lvbkRlYnVnVmVydGV4KHAsIGMsIG8sIGgsIGYsIG5ldyBpKHIsIGUpKSwgdGhpcy5fYWRkQ29sbGlzaW9uRGVidWdWZXJ0ZXgocCwgYywgbywgaCwgZiwgbmV3IGkociwgbikpLCB0aGlzLl9hZGRDb2xsaXNpb25EZWJ1Z1ZlcnRleChwLCBjLCBvLCBoLCBmLCBuZXcgaSh0LCBuKSksIHUudmVydGV4TGVuZ3RoICs9IDQ7XG4gICAgICB2YXIgeSA9IGEuaW5kZXhBcnJheTtcbiAgICAgIHkuZW1wbGFjZUJhY2sobCwgbCArIDEpLCB5LmVtcGxhY2VCYWNrKGwgKyAxLCBsICsgMiksIHkuZW1wbGFjZUJhY2sobCArIDIsIGwgKyAzKSwgeS5lbXBsYWNlQmFjayhsICsgMywgbCksIHUucHJpbWl0aXZlTGVuZ3RoICs9IDQ7XG4gICAgfSwgdmwucHJvdG90eXBlLmFkZERlYnVnQ29sbGlzaW9uQm94ZXMgPSBmdW5jdGlvbiAodCwgZSwgciwgbikge1xuICAgICAgZm9yICh2YXIgaSA9IHQ7IGkgPCBlOyBpKyspIHtcbiAgICAgICAgdmFyIGEgPSB0aGlzLmNvbGxpc2lvbkJveEFycmF5LmdldChpKTtcbiAgICAgICAgdGhpcy5hZGRDb2xsaXNpb25EZWJ1Z1ZlcnRpY2VzKGEueDEsIGEueTEsIGEueDIsIGEueTIsIG4gPyB0aGlzLnRleHRDb2xsaXNpb25Cb3ggOiB0aGlzLmljb25Db2xsaXNpb25Cb3gsIGEuYW5jaG9yUG9pbnQsIHIpO1xuICAgICAgfVxuICAgIH0sIHZsLnByb3RvdHlwZS5nZW5lcmF0ZUNvbGxpc2lvbkRlYnVnQnVmZmVycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuaGFzRGVidWdEYXRhKCkgJiYgdGhpcy5kZXN0cm95RGVidWdEYXRhKCksIHRoaXMudGV4dENvbGxpc2lvbkJveCA9IG5ldyBtbChPaSwgS3MubWVtYmVycywgWGkpLCB0aGlzLmljb25Db2xsaXNpb25Cb3ggPSBuZXcgbWwoT2ksIEtzLm1lbWJlcnMsIFhpKTtcblxuICAgICAgZm9yICh2YXIgdCA9IDA7IHQgPCB0aGlzLnN5bWJvbEluc3RhbmNlcy5sZW5ndGg7IHQrKykge1xuICAgICAgICB2YXIgZSA9IHRoaXMuc3ltYm9sSW5zdGFuY2VzLmdldCh0KTtcbiAgICAgICAgdGhpcy5hZGREZWJ1Z0NvbGxpc2lvbkJveGVzKGUudGV4dEJveFN0YXJ0SW5kZXgsIGUudGV4dEJveEVuZEluZGV4LCBlLCAhMCksIHRoaXMuYWRkRGVidWdDb2xsaXNpb25Cb3hlcyhlLnZlcnRpY2FsVGV4dEJveFN0YXJ0SW5kZXgsIGUudmVydGljYWxUZXh0Qm94RW5kSW5kZXgsIGUsICEwKSwgdGhpcy5hZGREZWJ1Z0NvbGxpc2lvbkJveGVzKGUuaWNvbkJveFN0YXJ0SW5kZXgsIGUuaWNvbkJveEVuZEluZGV4LCBlLCAhMSksIHRoaXMuYWRkRGVidWdDb2xsaXNpb25Cb3hlcyhlLnZlcnRpY2FsSWNvbkJveFN0YXJ0SW5kZXgsIGUudmVydGljYWxJY29uQm94RW5kSW5kZXgsIGUsICExKTtcbiAgICAgIH1cbiAgICB9LCB2bC5wcm90b3R5cGUuX2Rlc2VyaWFsaXplQ29sbGlzaW9uQm94ZXNGb3JTeW1ib2wgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSwgYSwgbywgcywgdSkge1xuICAgICAgZm9yICh2YXIgbCA9IHt9LCBwID0gZTsgcCA8IHI7IHArKykge1xuICAgICAgICB2YXIgYyA9IHQuZ2V0KHApO1xuICAgICAgICBsLnRleHRCb3ggPSB7XG4gICAgICAgICAgeDE6IGMueDEsXG4gICAgICAgICAgeTE6IGMueTEsXG4gICAgICAgICAgeDI6IGMueDIsXG4gICAgICAgICAgeTI6IGMueTIsXG4gICAgICAgICAgYW5jaG9yUG9pbnRYOiBjLmFuY2hvclBvaW50WCxcbiAgICAgICAgICBhbmNob3JQb2ludFk6IGMuYW5jaG9yUG9pbnRZXG4gICAgICAgIH0sIGwudGV4dEZlYXR1cmVJbmRleCA9IGMuZmVhdHVyZUluZGV4O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaCA9IG47IGggPCBpOyBoKyspIHtcbiAgICAgICAgdmFyIGYgPSB0LmdldChoKTtcbiAgICAgICAgbC52ZXJ0aWNhbFRleHRCb3ggPSB7XG4gICAgICAgICAgeDE6IGYueDEsXG4gICAgICAgICAgeTE6IGYueTEsXG4gICAgICAgICAgeDI6IGYueDIsXG4gICAgICAgICAgeTI6IGYueTIsXG4gICAgICAgICAgYW5jaG9yUG9pbnRYOiBmLmFuY2hvclBvaW50WCxcbiAgICAgICAgICBhbmNob3JQb2ludFk6IGYuYW5jaG9yUG9pbnRZXG4gICAgICAgIH0sIGwudmVydGljYWxUZXh0RmVhdHVyZUluZGV4ID0gZi5mZWF0dXJlSW5kZXg7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciB5ID0gYTsgeSA8IG87IHkrKykge1xuICAgICAgICB2YXIgZCA9IHQuZ2V0KHkpO1xuICAgICAgICBsLmljb25Cb3ggPSB7XG4gICAgICAgICAgeDE6IGQueDEsXG4gICAgICAgICAgeTE6IGQueTEsXG4gICAgICAgICAgeDI6IGQueDIsXG4gICAgICAgICAgeTI6IGQueTIsXG4gICAgICAgICAgYW5jaG9yUG9pbnRYOiBkLmFuY2hvclBvaW50WCxcbiAgICAgICAgICBhbmNob3JQb2ludFk6IGQuYW5jaG9yUG9pbnRZXG4gICAgICAgIH0sIGwuaWNvbkZlYXR1cmVJbmRleCA9IGQuZmVhdHVyZUluZGV4O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgbSA9IHM7IG0gPCB1OyBtKyspIHtcbiAgICAgICAgdmFyIHYgPSB0LmdldChtKTtcbiAgICAgICAgbC52ZXJ0aWNhbEljb25Cb3ggPSB7XG4gICAgICAgICAgeDE6IHYueDEsXG4gICAgICAgICAgeTE6IHYueTEsXG4gICAgICAgICAgeDI6IHYueDIsXG4gICAgICAgICAgeTI6IHYueTIsXG4gICAgICAgICAgYW5jaG9yUG9pbnRYOiB2LmFuY2hvclBvaW50WCxcbiAgICAgICAgICBhbmNob3JQb2ludFk6IHYuYW5jaG9yUG9pbnRZXG4gICAgICAgIH0sIGwudmVydGljYWxJY29uRmVhdHVyZUluZGV4ID0gdi5mZWF0dXJlSW5kZXg7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbDtcbiAgICB9LCB2bC5wcm90b3R5cGUuZGVzZXJpYWxpemVDb2xsaXNpb25Cb3hlcyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0aGlzLmNvbGxpc2lvbkFycmF5cyA9IFtdO1xuXG4gICAgICBmb3IgKHZhciBlID0gMDsgZSA8IHRoaXMuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aDsgZSsrKSB7XG4gICAgICAgIHZhciByID0gdGhpcy5zeW1ib2xJbnN0YW5jZXMuZ2V0KGUpO1xuICAgICAgICB0aGlzLmNvbGxpc2lvbkFycmF5cy5wdXNoKHRoaXMuX2Rlc2VyaWFsaXplQ29sbGlzaW9uQm94ZXNGb3JTeW1ib2wodCwgci50ZXh0Qm94U3RhcnRJbmRleCwgci50ZXh0Qm94RW5kSW5kZXgsIHIudmVydGljYWxUZXh0Qm94U3RhcnRJbmRleCwgci52ZXJ0aWNhbFRleHRCb3hFbmRJbmRleCwgci5pY29uQm94U3RhcnRJbmRleCwgci5pY29uQm94RW5kSW5kZXgsIHIudmVydGljYWxJY29uQm94U3RhcnRJbmRleCwgci52ZXJ0aWNhbEljb25Cb3hFbmRJbmRleCkpO1xuICAgICAgfVxuICAgIH0sIHZsLnByb3RvdHlwZS5oYXNUZXh0RGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLnRleHQuc2VnbWVudHMuZ2V0KCkubGVuZ3RoID4gMDtcbiAgICB9LCB2bC5wcm90b3R5cGUuaGFzSWNvbkRhdGEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pY29uLnNlZ21lbnRzLmdldCgpLmxlbmd0aCA+IDA7XG4gICAgfSwgdmwucHJvdG90eXBlLmhhc0RlYnVnRGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLnRleHRDb2xsaXNpb25Cb3ggJiYgdGhpcy5pY29uQ29sbGlzaW9uQm94O1xuICAgIH0sIHZsLnByb3RvdHlwZS5oYXNUZXh0Q29sbGlzaW9uQm94RGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhc0RlYnVnRGF0YSgpICYmIHRoaXMudGV4dENvbGxpc2lvbkJveC5zZWdtZW50cy5nZXQoKS5sZW5ndGggPiAwO1xuICAgIH0sIHZsLnByb3RvdHlwZS5oYXNJY29uQ29sbGlzaW9uQm94RGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhc0RlYnVnRGF0YSgpICYmIHRoaXMuaWNvbkNvbGxpc2lvbkJveC5zZWdtZW50cy5nZXQoKS5sZW5ndGggPiAwO1xuICAgIH0sIHZsLnByb3RvdHlwZS5hZGRJbmRpY2VzRm9yUGxhY2VkU3ltYm9sID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIGZvciAodmFyIHIgPSB0LnBsYWNlZFN5bWJvbEFycmF5LmdldChlKSwgbiA9IHIudmVydGV4U3RhcnRJbmRleCArIDQgKiByLm51bUdseXBocywgaSA9IHIudmVydGV4U3RhcnRJbmRleDsgaSA8IG47IGkgKz0gNCkge1xuICAgICAgICB0LmluZGV4QXJyYXkuZW1wbGFjZUJhY2soaSwgaSArIDEsIGkgKyAyKSwgdC5pbmRleEFycmF5LmVtcGxhY2VCYWNrKGkgKyAxLCBpICsgMiwgaSArIDMpO1xuICAgICAgfVxuICAgIH0sIHZsLnByb3RvdHlwZS5nZXRTb3J0ZWRTeW1ib2xJbmRleGVzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGlmICh0aGlzLnNvcnRlZEFuZ2xlID09PSB0ICYmIHZvaWQgMCAhPT0gdGhpcy5zeW1ib2xJbnN0YW5jZUluZGV4ZXMpIHJldHVybiB0aGlzLnN5bWJvbEluc3RhbmNlSW5kZXhlcztcblxuICAgICAgZm9yICh2YXIgZSA9IE1hdGguc2luKHQpLCByID0gTWF0aC5jb3ModCksIG4gPSBbXSwgaSA9IFtdLCBhID0gW10sIG8gPSAwOyBvIDwgdGhpcy5zeW1ib2xJbnN0YW5jZXMubGVuZ3RoOyArK28pIHtcbiAgICAgICAgYS5wdXNoKG8pO1xuICAgICAgICB2YXIgcyA9IHRoaXMuc3ltYm9sSW5zdGFuY2VzLmdldChvKTtcbiAgICAgICAgbi5wdXNoKDAgfCBNYXRoLnJvdW5kKGUgKiBzLmFuY2hvclggKyByICogcy5hbmNob3JZKSksIGkucHVzaChzLmZlYXR1cmVJbmRleCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhLnNvcnQoZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIG5bdF0gLSBuW2VdIHx8IGlbZV0gLSBpW3RdO1xuICAgICAgfSksIGE7XG4gICAgfSwgdmwucHJvdG90eXBlLmFkZFRvU29ydEtleVJhbmdlcyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB2YXIgciA9IHRoaXMuc29ydEtleVJhbmdlc1t0aGlzLnNvcnRLZXlSYW5nZXMubGVuZ3RoIC0gMV07XG4gICAgICByICYmIHIuc29ydEtleSA9PT0gZSA/IHIuc3ltYm9sSW5zdGFuY2VFbmQgPSB0ICsgMSA6IHRoaXMuc29ydEtleVJhbmdlcy5wdXNoKHtcbiAgICAgICAgc29ydEtleTogZSxcbiAgICAgICAgc3ltYm9sSW5zdGFuY2VTdGFydDogdCxcbiAgICAgICAgc3ltYm9sSW5zdGFuY2VFbmQ6IHQgKyAxXG4gICAgICB9KTtcbiAgICB9LCB2bC5wcm90b3R5cGUuc29ydEZlYXR1cmVzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHZhciBlID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMuc29ydEZlYXR1cmVzQnlZICYmIHRoaXMuc29ydGVkQW5nbGUgIT09IHQgJiYgISh0aGlzLnRleHQuc2VnbWVudHMuZ2V0KCkubGVuZ3RoID4gMSB8fCB0aGlzLmljb24uc2VnbWVudHMuZ2V0KCkubGVuZ3RoID4gMSkpIHtcbiAgICAgICAgdGhpcy5zeW1ib2xJbnN0YW5jZUluZGV4ZXMgPSB0aGlzLmdldFNvcnRlZFN5bWJvbEluZGV4ZXModCksIHRoaXMuc29ydGVkQW5nbGUgPSB0LCB0aGlzLnRleHQuaW5kZXhBcnJheS5jbGVhcigpLCB0aGlzLmljb24uaW5kZXhBcnJheS5jbGVhcigpLCB0aGlzLmZlYXR1cmVTb3J0T3JkZXIgPSBbXTtcblxuICAgICAgICBmb3IgKHZhciByID0gMCwgbiA9IHRoaXMuc3ltYm9sSW5zdGFuY2VJbmRleGVzOyByIDwgbi5sZW5ndGg7IHIgKz0gMSkge1xuICAgICAgICAgIHZhciBpID0gdGhpcy5zeW1ib2xJbnN0YW5jZXMuZ2V0KG5bcl0pO1xuICAgICAgICAgIHRoaXMuZmVhdHVyZVNvcnRPcmRlci5wdXNoKGkuZmVhdHVyZUluZGV4KSwgW2kucmlnaHRKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXgsIGkuY2VudGVySnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4LCBpLmxlZnRKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXhdLmZvckVhY2goZnVuY3Rpb24gKHQsIHIsIG4pIHtcbiAgICAgICAgICAgIHQgPj0gMCAmJiBuLmluZGV4T2YodCkgPT09IHIgJiYgZS5hZGRJbmRpY2VzRm9yUGxhY2VkU3ltYm9sKGUudGV4dCwgdCk7XG4gICAgICAgICAgfSksIGkudmVydGljYWxQbGFjZWRUZXh0U3ltYm9sSW5kZXggPj0gMCAmJiB0aGlzLmFkZEluZGljZXNGb3JQbGFjZWRTeW1ib2wodGhpcy50ZXh0LCBpLnZlcnRpY2FsUGxhY2VkVGV4dFN5bWJvbEluZGV4KSwgaS5wbGFjZWRJY29uU3ltYm9sSW5kZXggPj0gMCAmJiB0aGlzLmFkZEluZGljZXNGb3JQbGFjZWRTeW1ib2wodGhpcy5pY29uLCBpLnBsYWNlZEljb25TeW1ib2xJbmRleCksIGkudmVydGljYWxQbGFjZWRJY29uU3ltYm9sSW5kZXggPj0gMCAmJiB0aGlzLmFkZEluZGljZXNGb3JQbGFjZWRTeW1ib2wodGhpcy5pY29uLCBpLnZlcnRpY2FsUGxhY2VkSWNvblN5bWJvbEluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGV4dC5pbmRleEJ1ZmZlciAmJiB0aGlzLnRleHQuaW5kZXhCdWZmZXIudXBkYXRlRGF0YSh0aGlzLnRleHQuaW5kZXhBcnJheSksIHRoaXMuaWNvbi5pbmRleEJ1ZmZlciAmJiB0aGlzLmljb24uaW5kZXhCdWZmZXIudXBkYXRlRGF0YSh0aGlzLmljb24uaW5kZXhBcnJheSk7XG4gICAgICB9XG4gICAgfSwgT24oXCJTeW1ib2xCdWNrZXRcIiwgdmwsIHtcbiAgICAgIG9taXQ6IFtcImxheWVyc1wiLCBcImNvbGxpc2lvbkJveEFycmF5XCIsIFwiZmVhdHVyZXNcIiwgXCJjb21wYXJlVGV4dFwiXVxuICAgIH0pLCB2bC5NQVhfR0xZUEhTID0gNjU1MzUsIHZsLmFkZER5bmFtaWNBdHRyaWJ1dGVzID0gZmw7XG5cbiAgICB2YXIgZ2wgPSBuZXcgd2koe1xuICAgICAgXCJzeW1ib2wtcGxhY2VtZW50XCI6IG5ldyBtaShFdC5sYXlvdXRfc3ltYm9sW1wic3ltYm9sLXBsYWNlbWVudFwiXSksXG4gICAgICBcInN5bWJvbC1zcGFjaW5nXCI6IG5ldyBtaShFdC5sYXlvdXRfc3ltYm9sW1wic3ltYm9sLXNwYWNpbmdcIl0pLFxuICAgICAgXCJzeW1ib2wtYXZvaWQtZWRnZXNcIjogbmV3IG1pKEV0LmxheW91dF9zeW1ib2xbXCJzeW1ib2wtYXZvaWQtZWRnZXNcIl0pLFxuICAgICAgXCJzeW1ib2wtc29ydC1rZXlcIjogbmV3IHZpKEV0LmxheW91dF9zeW1ib2xbXCJzeW1ib2wtc29ydC1rZXlcIl0pLFxuICAgICAgXCJzeW1ib2wtei1vcmRlclwiOiBuZXcgbWkoRXQubGF5b3V0X3N5bWJvbFtcInN5bWJvbC16LW9yZGVyXCJdKSxcbiAgICAgIFwiaWNvbi1hbGxvdy1vdmVybGFwXCI6IG5ldyBtaShFdC5sYXlvdXRfc3ltYm9sW1wiaWNvbi1hbGxvdy1vdmVybGFwXCJdKSxcbiAgICAgIFwiaWNvbi1pZ25vcmUtcGxhY2VtZW50XCI6IG5ldyBtaShFdC5sYXlvdXRfc3ltYm9sW1wiaWNvbi1pZ25vcmUtcGxhY2VtZW50XCJdKSxcbiAgICAgIFwiaWNvbi1vcHRpb25hbFwiOiBuZXcgbWkoRXQubGF5b3V0X3N5bWJvbFtcImljb24tb3B0aW9uYWxcIl0pLFxuICAgICAgXCJpY29uLXJvdGF0aW9uLWFsaWdubWVudFwiOiBuZXcgbWkoRXQubGF5b3V0X3N5bWJvbFtcImljb24tcm90YXRpb24tYWxpZ25tZW50XCJdKSxcbiAgICAgIFwiaWNvbi1zaXplXCI6IG5ldyB2aShFdC5sYXlvdXRfc3ltYm9sW1wiaWNvbi1zaXplXCJdKSxcbiAgICAgIFwiaWNvbi10ZXh0LWZpdFwiOiBuZXcgbWkoRXQubGF5b3V0X3N5bWJvbFtcImljb24tdGV4dC1maXRcIl0pLFxuICAgICAgXCJpY29uLXRleHQtZml0LXBhZGRpbmdcIjogbmV3IG1pKEV0LmxheW91dF9zeW1ib2xbXCJpY29uLXRleHQtZml0LXBhZGRpbmdcIl0pLFxuICAgICAgXCJpY29uLWltYWdlXCI6IG5ldyB2aShFdC5sYXlvdXRfc3ltYm9sW1wiaWNvbi1pbWFnZVwiXSksXG4gICAgICBcImljb24tcm90YXRlXCI6IG5ldyB2aShFdC5sYXlvdXRfc3ltYm9sW1wiaWNvbi1yb3RhdGVcIl0pLFxuICAgICAgXCJpY29uLXBhZGRpbmdcIjogbmV3IG1pKEV0LmxheW91dF9zeW1ib2xbXCJpY29uLXBhZGRpbmdcIl0pLFxuICAgICAgXCJpY29uLWtlZXAtdXByaWdodFwiOiBuZXcgbWkoRXQubGF5b3V0X3N5bWJvbFtcImljb24ta2VlcC11cHJpZ2h0XCJdKSxcbiAgICAgIFwiaWNvbi1vZmZzZXRcIjogbmV3IHZpKEV0LmxheW91dF9zeW1ib2xbXCJpY29uLW9mZnNldFwiXSksXG4gICAgICBcImljb24tYW5jaG9yXCI6IG5ldyB2aShFdC5sYXlvdXRfc3ltYm9sW1wiaWNvbi1hbmNob3JcIl0pLFxuICAgICAgXCJpY29uLXBpdGNoLWFsaWdubWVudFwiOiBuZXcgbWkoRXQubGF5b3V0X3N5bWJvbFtcImljb24tcGl0Y2gtYWxpZ25tZW50XCJdKSxcbiAgICAgIFwidGV4dC1waXRjaC1hbGlnbm1lbnRcIjogbmV3IG1pKEV0LmxheW91dF9zeW1ib2xbXCJ0ZXh0LXBpdGNoLWFsaWdubWVudFwiXSksXG4gICAgICBcInRleHQtcm90YXRpb24tYWxpZ25tZW50XCI6IG5ldyBtaShFdC5sYXlvdXRfc3ltYm9sW1widGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIl0pLFxuICAgICAgXCJ0ZXh0LWZpZWxkXCI6IG5ldyB2aShFdC5sYXlvdXRfc3ltYm9sW1widGV4dC1maWVsZFwiXSksXG4gICAgICBcInRleHQtZm9udFwiOiBuZXcgdmkoRXQubGF5b3V0X3N5bWJvbFtcInRleHQtZm9udFwiXSksXG4gICAgICBcInRleHQtc2l6ZVwiOiBuZXcgdmkoRXQubGF5b3V0X3N5bWJvbFtcInRleHQtc2l6ZVwiXSksXG4gICAgICBcInRleHQtbWF4LXdpZHRoXCI6IG5ldyB2aShFdC5sYXlvdXRfc3ltYm9sW1widGV4dC1tYXgtd2lkdGhcIl0pLFxuICAgICAgXCJ0ZXh0LWxpbmUtaGVpZ2h0XCI6IG5ldyBtaShFdC5sYXlvdXRfc3ltYm9sW1widGV4dC1saW5lLWhlaWdodFwiXSksXG4gICAgICBcInRleHQtbGV0dGVyLXNwYWNpbmdcIjogbmV3IHZpKEV0LmxheW91dF9zeW1ib2xbXCJ0ZXh0LWxldHRlci1zcGFjaW5nXCJdKSxcbiAgICAgIFwidGV4dC1qdXN0aWZ5XCI6IG5ldyB2aShFdC5sYXlvdXRfc3ltYm9sW1widGV4dC1qdXN0aWZ5XCJdKSxcbiAgICAgIFwidGV4dC1yYWRpYWwtb2Zmc2V0XCI6IG5ldyB2aShFdC5sYXlvdXRfc3ltYm9sW1widGV4dC1yYWRpYWwtb2Zmc2V0XCJdKSxcbiAgICAgIFwidGV4dC12YXJpYWJsZS1hbmNob3JcIjogbmV3IG1pKEV0LmxheW91dF9zeW1ib2xbXCJ0ZXh0LXZhcmlhYmxlLWFuY2hvclwiXSksXG4gICAgICBcInRleHQtYW5jaG9yXCI6IG5ldyB2aShFdC5sYXlvdXRfc3ltYm9sW1widGV4dC1hbmNob3JcIl0pLFxuICAgICAgXCJ0ZXh0LW1heC1hbmdsZVwiOiBuZXcgbWkoRXQubGF5b3V0X3N5bWJvbFtcInRleHQtbWF4LWFuZ2xlXCJdKSxcbiAgICAgIFwidGV4dC13cml0aW5nLW1vZGVcIjogbmV3IG1pKEV0LmxheW91dF9zeW1ib2xbXCJ0ZXh0LXdyaXRpbmctbW9kZVwiXSksXG4gICAgICBcInRleHQtcm90YXRlXCI6IG5ldyB2aShFdC5sYXlvdXRfc3ltYm9sW1widGV4dC1yb3RhdGVcIl0pLFxuICAgICAgXCJ0ZXh0LXBhZGRpbmdcIjogbmV3IG1pKEV0LmxheW91dF9zeW1ib2xbXCJ0ZXh0LXBhZGRpbmdcIl0pLFxuICAgICAgXCJ0ZXh0LWtlZXAtdXByaWdodFwiOiBuZXcgbWkoRXQubGF5b3V0X3N5bWJvbFtcInRleHQta2VlcC11cHJpZ2h0XCJdKSxcbiAgICAgIFwidGV4dC10cmFuc2Zvcm1cIjogbmV3IHZpKEV0LmxheW91dF9zeW1ib2xbXCJ0ZXh0LXRyYW5zZm9ybVwiXSksXG4gICAgICBcInRleHQtb2Zmc2V0XCI6IG5ldyB2aShFdC5sYXlvdXRfc3ltYm9sW1widGV4dC1vZmZzZXRcIl0pLFxuICAgICAgXCJ0ZXh0LWFsbG93LW92ZXJsYXBcIjogbmV3IG1pKEV0LmxheW91dF9zeW1ib2xbXCJ0ZXh0LWFsbG93LW92ZXJsYXBcIl0pLFxuICAgICAgXCJ0ZXh0LWlnbm9yZS1wbGFjZW1lbnRcIjogbmV3IG1pKEV0LmxheW91dF9zeW1ib2xbXCJ0ZXh0LWlnbm9yZS1wbGFjZW1lbnRcIl0pLFxuICAgICAgXCJ0ZXh0LW9wdGlvbmFsXCI6IG5ldyBtaShFdC5sYXlvdXRfc3ltYm9sW1widGV4dC1vcHRpb25hbFwiXSlcbiAgICB9KSxcbiAgICAgICAgeGwgPSB7XG4gICAgICBwYWludDogbmV3IHdpKHtcbiAgICAgICAgXCJpY29uLW9wYWNpdHlcIjogbmV3IHZpKEV0LnBhaW50X3N5bWJvbFtcImljb24tb3BhY2l0eVwiXSksXG4gICAgICAgIFwiaWNvbi1jb2xvclwiOiBuZXcgdmkoRXQucGFpbnRfc3ltYm9sW1wiaWNvbi1jb2xvclwiXSksXG4gICAgICAgIFwiaWNvbi1oYWxvLWNvbG9yXCI6IG5ldyB2aShFdC5wYWludF9zeW1ib2xbXCJpY29uLWhhbG8tY29sb3JcIl0pLFxuICAgICAgICBcImljb24taGFsby13aWR0aFwiOiBuZXcgdmkoRXQucGFpbnRfc3ltYm9sW1wiaWNvbi1oYWxvLXdpZHRoXCJdKSxcbiAgICAgICAgXCJpY29uLWhhbG8tYmx1clwiOiBuZXcgdmkoRXQucGFpbnRfc3ltYm9sW1wiaWNvbi1oYWxvLWJsdXJcIl0pLFxuICAgICAgICBcImljb24tdHJhbnNsYXRlXCI6IG5ldyBtaShFdC5wYWludF9zeW1ib2xbXCJpY29uLXRyYW5zbGF0ZVwiXSksXG4gICAgICAgIFwiaWNvbi10cmFuc2xhdGUtYW5jaG9yXCI6IG5ldyBtaShFdC5wYWludF9zeW1ib2xbXCJpY29uLXRyYW5zbGF0ZS1hbmNob3JcIl0pLFxuICAgICAgICBcInRleHQtb3BhY2l0eVwiOiBuZXcgdmkoRXQucGFpbnRfc3ltYm9sW1widGV4dC1vcGFjaXR5XCJdKSxcbiAgICAgICAgXCJ0ZXh0LWNvbG9yXCI6IG5ldyB2aShFdC5wYWludF9zeW1ib2xbXCJ0ZXh0LWNvbG9yXCJdLCB7XG4gICAgICAgICAgcnVudGltZVR5cGU6IGp0LFxuICAgICAgICAgIGdldE92ZXJyaWRlOiBmdW5jdGlvbiBnZXRPdmVycmlkZSh0KSB7XG4gICAgICAgICAgICByZXR1cm4gdC50ZXh0Q29sb3I7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBoYXNPdmVycmlkZTogZnVuY3Rpb24gaGFzT3ZlcnJpZGUodCkge1xuICAgICAgICAgICAgcmV0dXJuICEhdC50ZXh0Q29sb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgXCJ0ZXh0LWhhbG8tY29sb3JcIjogbmV3IHZpKEV0LnBhaW50X3N5bWJvbFtcInRleHQtaGFsby1jb2xvclwiXSksXG4gICAgICAgIFwidGV4dC1oYWxvLXdpZHRoXCI6IG5ldyB2aShFdC5wYWludF9zeW1ib2xbXCJ0ZXh0LWhhbG8td2lkdGhcIl0pLFxuICAgICAgICBcInRleHQtaGFsby1ibHVyXCI6IG5ldyB2aShFdC5wYWludF9zeW1ib2xbXCJ0ZXh0LWhhbG8tYmx1clwiXSksXG4gICAgICAgIFwidGV4dC10cmFuc2xhdGVcIjogbmV3IG1pKEV0LnBhaW50X3N5bWJvbFtcInRleHQtdHJhbnNsYXRlXCJdKSxcbiAgICAgICAgXCJ0ZXh0LXRyYW5zbGF0ZS1hbmNob3JcIjogbmV3IG1pKEV0LnBhaW50X3N5bWJvbFtcInRleHQtdHJhbnNsYXRlLWFuY2hvclwiXSlcbiAgICAgIH0pLFxuICAgICAgbGF5b3V0OiBnbFxuICAgIH0sXG4gICAgICAgIGJsID0gZnVuY3Rpb24gYmwodCkge1xuICAgICAgdGhpcy50eXBlID0gdC5wcm9wZXJ0eS5vdmVycmlkZXMgPyB0LnByb3BlcnR5Lm92ZXJyaWRlcy5ydW50aW1lVHlwZSA6IEx0LCB0aGlzLmRlZmF1bHRWYWx1ZSA9IHQ7XG4gICAgfTtcblxuICAgIGJsLnByb3RvdHlwZS5ldmFsdWF0ZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBpZiAodC5mb3JtYXR0ZWRTZWN0aW9uKSB7XG4gICAgICAgIHZhciBlID0gdGhpcy5kZWZhdWx0VmFsdWUucHJvcGVydHkub3ZlcnJpZGVzO1xuICAgICAgICBpZiAoZSAmJiBlLmhhc092ZXJyaWRlKHQuZm9ybWF0dGVkU2VjdGlvbikpIHJldHVybiBlLmdldE92ZXJyaWRlKHQuZm9ybWF0dGVkU2VjdGlvbik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0LmZlYXR1cmUgJiYgdC5mZWF0dXJlU3RhdGUgPyB0aGlzLmRlZmF1bHRWYWx1ZS5ldmFsdWF0ZSh0LmZlYXR1cmUsIHQuZmVhdHVyZVN0YXRlKSA6IHRoaXMuZGVmYXVsdFZhbHVlLnByb3BlcnR5LnNwZWNpZmljYXRpb24uZGVmYXVsdDtcbiAgICB9LCBibC5wcm90b3R5cGUuZWFjaENoaWxkID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHRoaXMuZGVmYXVsdFZhbHVlLmlzQ29uc3RhbnQoKSB8fCB0KHRoaXMuZGVmYXVsdFZhbHVlLnZhbHVlLl9zdHlsZUV4cHJlc3Npb24uZXhwcmVzc2lvbik7XG4gICAgfSwgYmwucHJvdG90eXBlLm91dHB1dERlZmluZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gITE7XG4gICAgfSwgYmwucHJvdG90eXBlLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0sIE9uKFwiRm9ybWF0U2VjdGlvbk92ZXJyaWRlXCIsIGJsLCB7XG4gICAgICBvbWl0OiBbXCJkZWZhdWx0VmFsdWVcIl1cbiAgICB9KTtcblxuICAgIHZhciB3bCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKGUpIHtcbiAgICAgICAgdC5jYWxsKHRoaXMsIGUsIHhsKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUucmVjYWxjdWxhdGUgPSBmdW5jdGlvbiAoZSwgcikge1xuICAgICAgICBpZiAodC5wcm90b3R5cGUucmVjYWxjdWxhdGUuY2FsbCh0aGlzLCBlLCByKSwgXCJhdXRvXCIgPT09IHRoaXMubGF5b3V0LmdldChcImljb24tcm90YXRpb24tYWxpZ25tZW50XCIpICYmICh0aGlzLmxheW91dC5fdmFsdWVzW1wiaWNvbi1yb3RhdGlvbi1hbGlnbm1lbnRcIl0gPSBcInBvaW50XCIgIT09IHRoaXMubGF5b3V0LmdldChcInN5bWJvbC1wbGFjZW1lbnRcIikgPyBcIm1hcFwiIDogXCJ2aWV3cG9ydFwiKSwgXCJhdXRvXCIgPT09IHRoaXMubGF5b3V0LmdldChcInRleHQtcm90YXRpb24tYWxpZ25tZW50XCIpICYmICh0aGlzLmxheW91dC5fdmFsdWVzW1widGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIl0gPSBcInBvaW50XCIgIT09IHRoaXMubGF5b3V0LmdldChcInN5bWJvbC1wbGFjZW1lbnRcIikgPyBcIm1hcFwiIDogXCJ2aWV3cG9ydFwiKSwgXCJhdXRvXCIgPT09IHRoaXMubGF5b3V0LmdldChcInRleHQtcGl0Y2gtYWxpZ25tZW50XCIpICYmICh0aGlzLmxheW91dC5fdmFsdWVzW1widGV4dC1waXRjaC1hbGlnbm1lbnRcIl0gPSB0aGlzLmxheW91dC5nZXQoXCJ0ZXh0LXJvdGF0aW9uLWFsaWdubWVudFwiKSksIFwiYXV0b1wiID09PSB0aGlzLmxheW91dC5nZXQoXCJpY29uLXBpdGNoLWFsaWdubWVudFwiKSAmJiAodGhpcy5sYXlvdXQuX3ZhbHVlc1tcImljb24tcGl0Y2gtYWxpZ25tZW50XCJdID0gdGhpcy5sYXlvdXQuZ2V0KFwiaWNvbi1yb3RhdGlvbi1hbGlnbm1lbnRcIikpLCBcInBvaW50XCIgPT09IHRoaXMubGF5b3V0LmdldChcInN5bWJvbC1wbGFjZW1lbnRcIikpIHtcbiAgICAgICAgICB2YXIgbiA9IHRoaXMubGF5b3V0LmdldChcInRleHQtd3JpdGluZy1tb2RlXCIpO1xuXG4gICAgICAgICAgaWYgKG4pIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBbXSwgYSA9IDAsIG8gPSBuOyBhIDwgby5sZW5ndGg7IGEgKz0gMSkge1xuICAgICAgICAgICAgICB2YXIgcyA9IG9bYV07XG4gICAgICAgICAgICAgIGkuaW5kZXhPZihzKSA8IDAgJiYgaS5wdXNoKHMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmxheW91dC5fdmFsdWVzW1widGV4dC13cml0aW5nLW1vZGVcIl0gPSBpO1xuICAgICAgICAgIH0gZWxzZSB0aGlzLmxheW91dC5fdmFsdWVzW1widGV4dC13cml0aW5nLW1vZGVcIl0gPSBbXCJob3Jpem9udGFsXCJdO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc2V0UGFpbnRPdmVycmlkZXMoKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmdldFZhbHVlQW5kUmVzb2x2ZVRva2VucyA9IGZ1bmN0aW9uICh0LCBlLCByLCBuKSB7XG4gICAgICAgIHZhciBpID0gdGhpcy5sYXlvdXQuZ2V0KHQpLmV2YWx1YXRlKGUsIHt9LCByLCBuKSxcbiAgICAgICAgICAgIGEgPSB0aGlzLl91bmV2YWx1YXRlZExheW91dC5fdmFsdWVzW3RdO1xuICAgICAgICByZXR1cm4gYS5pc0RhdGFEcml2ZW4oKSB8fCBHcihhLnZhbHVlKSB8fCAhaSA/IGkgOiBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgIHJldHVybiBlLnJlcGxhY2UoL3soW157fV0rKX0vZywgZnVuY3Rpb24gKGUsIHIpIHtcbiAgICAgICAgICAgIHJldHVybiByIGluIHQgPyBTdHJpbmcodFtyXSkgOiBcIlwiO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KGUucHJvcGVydGllcywgaSk7XG4gICAgICB9LCBlLnByb3RvdHlwZS5jcmVhdGVCdWNrZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gbmV3IHZsKHQpO1xuICAgICAgfSwgZS5wcm90b3R5cGUucXVlcnlSYWRpdXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfSwgZS5wcm90b3R5cGUucXVlcnlJbnRlcnNlY3RzRmVhdHVyZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICExO1xuICAgICAgfSwgZS5wcm90b3R5cGUuX3NldFBhaW50T3ZlcnJpZGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBmb3IgKHZhciB0ID0gMCwgciA9IHhsLnBhaW50Lm92ZXJyaWRhYmxlUHJvcGVydGllczsgdCA8IHIubGVuZ3RoOyB0ICs9IDEpIHtcbiAgICAgICAgICB2YXIgbiA9IHJbdF07XG5cbiAgICAgICAgICBpZiAoZS5oYXNQYWludE92ZXJyaWRlKHRoaXMubGF5b3V0LCBuKSkge1xuICAgICAgICAgICAgdmFyIGksXG4gICAgICAgICAgICAgICAgYSA9IHRoaXMucGFpbnQuZ2V0KG4pLFxuICAgICAgICAgICAgICAgIG8gPSBuZXcgYmwoYSksXG4gICAgICAgICAgICAgICAgcyA9IG5ldyBLcihvLCBhLnByb3BlcnR5LnNwZWNpZmljYXRpb24pO1xuICAgICAgICAgICAgaSA9IFwiY29uc3RhbnRcIiA9PT0gYS52YWx1ZS5raW5kIHx8IFwic291cmNlXCIgPT09IGEudmFsdWUua2luZCA/IG5ldyBYcihcInNvdXJjZVwiLCBzKSA6IG5ldyBKcihcImNvbXBvc2l0ZVwiLCBzLCBhLnZhbHVlLnpvb21TdG9wcywgYS52YWx1ZS5faW50ZXJwb2xhdGlvblR5cGUpLCB0aGlzLnBhaW50Ll92YWx1ZXNbbl0gPSBuZXcgeWkoYS5wcm9wZXJ0eSwgaSwgYS5wYXJhbWV0ZXJzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIGUucHJvdG90eXBlLl9oYW5kbGVPdmVycmlkYWJsZVBhaW50UHJvcGVydHlVcGRhdGUgPSBmdW5jdGlvbiAodCwgciwgbikge1xuICAgICAgICByZXR1cm4gISghdGhpcy5sYXlvdXQgfHwgci5pc0RhdGFEcml2ZW4oKSB8fCBuLmlzRGF0YURyaXZlbigpKSAmJiBlLmhhc1BhaW50T3ZlcnJpZGUodGhpcy5sYXlvdXQsIHQpO1xuICAgICAgfSwgZS5oYXNQYWludE92ZXJyaWRlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgdmFyIHIgPSB0LmdldChcInRleHQtZmllbGRcIiksXG4gICAgICAgICAgICBuID0geGwucGFpbnQucHJvcGVydGllc1tlXSxcbiAgICAgICAgICAgIGkgPSAhMSxcbiAgICAgICAgICAgIGEgPSBmdW5jdGlvbiBhKHQpIHtcbiAgICAgICAgICBmb3IgKHZhciBlID0gMCwgciA9IHQ7IGUgPCByLmxlbmd0aDsgZSArPSAxKSB7XG4gICAgICAgICAgICBpZiAobi5vdmVycmlkZXMgJiYgbi5vdmVycmlkZXMuaGFzT3ZlcnJpZGUocltlXSkpIHJldHVybiB2b2lkIChpID0gITApO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoXCJjb25zdGFudFwiID09PSByLnZhbHVlLmtpbmQgJiYgci52YWx1ZS52YWx1ZSBpbnN0YW5jZW9mIG5lKSBhKHIudmFsdWUudmFsdWUuc2VjdGlvbnMpO2Vsc2UgaWYgKFwic291cmNlXCIgPT09IHIudmFsdWUua2luZCkge1xuICAgICAgICAgIHZhciBvID0gZnVuY3Rpb24gbyh0KSB7XG4gICAgICAgICAgICBpIHx8ICh0IGluc3RhbmNlb2YgbGUgJiYgc2UodC52YWx1ZSkgPT09IEd0ID8gYSh0LnZhbHVlLnNlY3Rpb25zKSA6IHQgaW5zdGFuY2VvZiBmZSA/IGEodC5zZWN0aW9ucykgOiB0LmVhY2hDaGlsZChvKSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICAgICAgcyA9IHIudmFsdWU7XG5cbiAgICAgICAgICBzLl9zdHlsZUV4cHJlc3Npb24gJiYgbyhzLl9zdHlsZUV4cHJlc3Npb24uZXhwcmVzc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGk7XG4gICAgICB9LCBlO1xuICAgIH0oX2kpLFxuICAgICAgICBfbCA9IHtcbiAgICAgIHBhaW50OiBuZXcgd2koe1xuICAgICAgICBcImJhY2tncm91bmQtY29sb3JcIjogbmV3IG1pKEV0LnBhaW50X2JhY2tncm91bmRbXCJiYWNrZ3JvdW5kLWNvbG9yXCJdKSxcbiAgICAgICAgXCJiYWNrZ3JvdW5kLXBhdHRlcm5cIjogbmV3IHhpKEV0LnBhaW50X2JhY2tncm91bmRbXCJiYWNrZ3JvdW5kLXBhdHRlcm5cIl0pLFxuICAgICAgICBcImJhY2tncm91bmQtb3BhY2l0eVwiOiBuZXcgbWkoRXQucGFpbnRfYmFja2dyb3VuZFtcImJhY2tncm91bmQtb3BhY2l0eVwiXSlcbiAgICAgIH0pXG4gICAgfSxcbiAgICAgICAgQWwgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZShlKSB7XG4gICAgICAgIHQuY2FsbCh0aGlzLCBlLCBfbCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGU7XG4gICAgfShfaSksXG4gICAgICAgIFNsID0ge1xuICAgICAgcGFpbnQ6IG5ldyB3aSh7XG4gICAgICAgIFwicmFzdGVyLW9wYWNpdHlcIjogbmV3IG1pKEV0LnBhaW50X3Jhc3RlcltcInJhc3Rlci1vcGFjaXR5XCJdKSxcbiAgICAgICAgXCJyYXN0ZXItaHVlLXJvdGF0ZVwiOiBuZXcgbWkoRXQucGFpbnRfcmFzdGVyW1wicmFzdGVyLWh1ZS1yb3RhdGVcIl0pLFxuICAgICAgICBcInJhc3Rlci1icmlnaHRuZXNzLW1pblwiOiBuZXcgbWkoRXQucGFpbnRfcmFzdGVyW1wicmFzdGVyLWJyaWdodG5lc3MtbWluXCJdKSxcbiAgICAgICAgXCJyYXN0ZXItYnJpZ2h0bmVzcy1tYXhcIjogbmV3IG1pKEV0LnBhaW50X3Jhc3RlcltcInJhc3Rlci1icmlnaHRuZXNzLW1heFwiXSksXG4gICAgICAgIFwicmFzdGVyLXNhdHVyYXRpb25cIjogbmV3IG1pKEV0LnBhaW50X3Jhc3RlcltcInJhc3Rlci1zYXR1cmF0aW9uXCJdKSxcbiAgICAgICAgXCJyYXN0ZXItY29udHJhc3RcIjogbmV3IG1pKEV0LnBhaW50X3Jhc3RlcltcInJhc3Rlci1jb250cmFzdFwiXSksXG4gICAgICAgIFwicmFzdGVyLXJlc2FtcGxpbmdcIjogbmV3IG1pKEV0LnBhaW50X3Jhc3RlcltcInJhc3Rlci1yZXNhbXBsaW5nXCJdKSxcbiAgICAgICAgXCJyYXN0ZXItZmFkZS1kdXJhdGlvblwiOiBuZXcgbWkoRXQucGFpbnRfcmFzdGVyW1wicmFzdGVyLWZhZGUtZHVyYXRpb25cIl0pXG4gICAgICB9KVxuICAgIH0sXG4gICAgICAgIGtsID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoZSkge1xuICAgICAgICB0LmNhbGwodGhpcywgZSwgU2wpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlO1xuICAgIH0oX2kpLFxuICAgICAgICBJbCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKGUpIHtcbiAgICAgICAgdC5jYWxsKHRoaXMsIGUsIHt9KSwgdGhpcy5pbXBsZW1lbnRhdGlvbiA9IGU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLmlzM0QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBcIjNkXCIgPT09IHRoaXMuaW1wbGVtZW50YXRpb24ucmVuZGVyaW5nTW9kZTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmhhc09mZnNjcmVlblBhc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB2b2lkIDAgIT09IHRoaXMuaW1wbGVtZW50YXRpb24ucHJlcmVuZGVyO1xuICAgICAgfSwgZS5wcm90b3R5cGUucmVjYWxjdWxhdGUgPSBmdW5jdGlvbiAoKSB7fSwgZS5wcm90b3R5cGUudXBkYXRlVHJhbnNpdGlvbnMgPSBmdW5jdGlvbiAoKSB7fSwgZS5wcm90b3R5cGUuaGFzVHJhbnNpdGlvbiA9IGZ1bmN0aW9uICgpIHt9LCBlLnByb3RvdHlwZS5zZXJpYWxpemUgPSBmdW5jdGlvbiAoKSB7fSwgZS5wcm90b3R5cGUub25BZGQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB0aGlzLmltcGxlbWVudGF0aW9uLm9uQWRkICYmIHRoaXMuaW1wbGVtZW50YXRpb24ub25BZGQodCwgdC5wYWludGVyLmNvbnRleHQuZ2wpO1xuICAgICAgfSwgZS5wcm90b3R5cGUub25SZW1vdmUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB0aGlzLmltcGxlbWVudGF0aW9uLm9uUmVtb3ZlICYmIHRoaXMuaW1wbGVtZW50YXRpb24ub25SZW1vdmUodCwgdC5wYWludGVyLmNvbnRleHQuZ2wpO1xuICAgICAgfSwgZTtcbiAgICB9KF9pKSxcbiAgICAgICAgemwgPSB7XG4gICAgICBjaXJjbGU6IGNvLFxuICAgICAgaGVhdG1hcDogX28sXG4gICAgICBoaWxsc2hhZGU6IFNvLFxuICAgICAgZmlsbDogcHMsXG4gICAgICBcImZpbGwtZXh0cnVzaW9uXCI6IHpzLFxuICAgICAgbGluZTogUnMsXG4gICAgICBzeW1ib2w6IHdsLFxuICAgICAgYmFja2dyb3VuZDogQWwsXG4gICAgICByYXN0ZXI6IGtsXG4gICAgfSxcbiAgICAgICAgQ2wgPSBvLkhUTUxJbWFnZUVsZW1lbnQsXG4gICAgICAgIEVsID0gby5IVE1MQ2FudmFzRWxlbWVudCxcbiAgICAgICAgUGwgPSBvLkhUTUxWaWRlb0VsZW1lbnQsXG4gICAgICAgIE1sID0gby5JbWFnZURhdGEsXG4gICAgICAgIEJsID0gby5JbWFnZUJpdG1hcCxcbiAgICAgICAgVGwgPSBmdW5jdGlvbiBUbCh0LCBlLCByLCBuKSB7XG4gICAgICB0aGlzLmNvbnRleHQgPSB0LCB0aGlzLmZvcm1hdCA9IHIsIHRoaXMudGV4dHVyZSA9IHQuZ2wuY3JlYXRlVGV4dHVyZSgpLCB0aGlzLnVwZGF0ZShlLCBuKTtcbiAgICB9O1xuXG4gICAgVGwucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICB2YXIgbiA9IHQud2lkdGgsXG4gICAgICAgICAgaSA9IHQuaGVpZ2h0LFxuICAgICAgICAgIGEgPSAhKHRoaXMuc2l6ZSAmJiB0aGlzLnNpemVbMF0gPT09IG4gJiYgdGhpcy5zaXplWzFdID09PSBpIHx8IHIpLFxuICAgICAgICAgIG8gPSB0aGlzLmNvbnRleHQsXG4gICAgICAgICAgcyA9IG8uZ2w7XG4gICAgICBpZiAodGhpcy51c2VNaXBtYXAgPSBCb29sZWFuKGUgJiYgZS51c2VNaXBtYXApLCBzLmJpbmRUZXh0dXJlKHMuVEVYVFVSRV8yRCwgdGhpcy50ZXh0dXJlKSwgby5waXhlbFN0b3JlVW5wYWNrRmxpcFkuc2V0KCExKSwgby5waXhlbFN0b3JlVW5wYWNrLnNldCgxKSwgby5waXhlbFN0b3JlVW5wYWNrUHJlbXVsdGlwbHlBbHBoYS5zZXQodGhpcy5mb3JtYXQgPT09IHMuUkdCQSAmJiAoIWUgfHwgITEgIT09IGUucHJlbXVsdGlwbHkpKSwgYSkgdGhpcy5zaXplID0gW24sIGldLCB0IGluc3RhbmNlb2YgQ2wgfHwgdCBpbnN0YW5jZW9mIEVsIHx8IHQgaW5zdGFuY2VvZiBQbCB8fCB0IGluc3RhbmNlb2YgTWwgfHwgQmwgJiYgdCBpbnN0YW5jZW9mIEJsID8gcy50ZXhJbWFnZTJEKHMuVEVYVFVSRV8yRCwgMCwgdGhpcy5mb3JtYXQsIHRoaXMuZm9ybWF0LCBzLlVOU0lHTkVEX0JZVEUsIHQpIDogcy50ZXhJbWFnZTJEKHMuVEVYVFVSRV8yRCwgMCwgdGhpcy5mb3JtYXQsIG4sIGksIDAsIHRoaXMuZm9ybWF0LCBzLlVOU0lHTkVEX0JZVEUsIHQuZGF0YSk7ZWxzZSB7XG4gICAgICAgIHZhciB1ID0gciB8fCB7XG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICB5OiAwXG4gICAgICAgIH0sXG4gICAgICAgICAgICBsID0gdS54LFxuICAgICAgICAgICAgcCA9IHUueTtcbiAgICAgICAgdCBpbnN0YW5jZW9mIENsIHx8IHQgaW5zdGFuY2VvZiBFbCB8fCB0IGluc3RhbmNlb2YgUGwgfHwgdCBpbnN0YW5jZW9mIE1sIHx8IEJsICYmIHQgaW5zdGFuY2VvZiBCbCA/IHMudGV4U3ViSW1hZ2UyRChzLlRFWFRVUkVfMkQsIDAsIGwsIHAsIHMuUkdCQSwgcy5VTlNJR05FRF9CWVRFLCB0KSA6IHMudGV4U3ViSW1hZ2UyRChzLlRFWFRVUkVfMkQsIDAsIGwsIHAsIG4sIGksIHMuUkdCQSwgcy5VTlNJR05FRF9CWVRFLCB0LmRhdGEpO1xuICAgICAgfVxuICAgICAgdGhpcy51c2VNaXBtYXAgJiYgdGhpcy5pc1NpemVQb3dlck9mVHdvKCkgJiYgcy5nZW5lcmF0ZU1pcG1hcChzLlRFWFRVUkVfMkQpO1xuICAgIH0sIFRsLnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgIHZhciBuID0gdGhpcy5jb250ZXh0LmdsO1xuICAgICAgbi5iaW5kVGV4dHVyZShuLlRFWFRVUkVfMkQsIHRoaXMudGV4dHVyZSksIHIgIT09IG4uTElORUFSX01JUE1BUF9ORUFSRVNUIHx8IHRoaXMuaXNTaXplUG93ZXJPZlR3bygpIHx8IChyID0gbi5MSU5FQVIpLCB0ICE9PSB0aGlzLmZpbHRlciAmJiAobi50ZXhQYXJhbWV0ZXJpKG4uVEVYVFVSRV8yRCwgbi5URVhUVVJFX01BR19GSUxURVIsIHQpLCBuLnRleFBhcmFtZXRlcmkobi5URVhUVVJFXzJELCBuLlRFWFRVUkVfTUlOX0ZJTFRFUiwgciB8fCB0KSwgdGhpcy5maWx0ZXIgPSB0KSwgZSAhPT0gdGhpcy53cmFwICYmIChuLnRleFBhcmFtZXRlcmkobi5URVhUVVJFXzJELCBuLlRFWFRVUkVfV1JBUF9TLCBlKSwgbi50ZXhQYXJhbWV0ZXJpKG4uVEVYVFVSRV8yRCwgbi5URVhUVVJFX1dSQVBfVCwgZSksIHRoaXMud3JhcCA9IGUpO1xuICAgIH0sIFRsLnByb3RvdHlwZS5pc1NpemVQb3dlck9mVHdvID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2l6ZVswXSA9PT0gdGhpcy5zaXplWzFdICYmIE1hdGgubG9nKHRoaXMuc2l6ZVswXSkgLyBNYXRoLkxOMiAlIDEgPT0gMDtcbiAgICB9LCBUbC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuY29udGV4dC5nbC5kZWxldGVUZXh0dXJlKHRoaXMudGV4dHVyZSksIHRoaXMudGV4dHVyZSA9IG51bGw7XG4gICAgfTtcblxuICAgIHZhciBWbCA9IGZ1bmN0aW9uIFZsKHQpIHtcbiAgICAgIHZhciBlID0gdGhpcztcbiAgICAgIHRoaXMuX2NhbGxiYWNrID0gdCwgdGhpcy5fdHJpZ2dlcmVkID0gITEsIFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIE1lc3NhZ2VDaGFubmVsICYmICh0aGlzLl9jaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCksIHRoaXMuX2NoYW5uZWwucG9ydDIub25tZXNzYWdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBlLl90cmlnZ2VyZWQgPSAhMSwgZS5fY2FsbGJhY2soKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBWbC5wcm90b3R5cGUudHJpZ2dlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0ID0gdGhpcztcbiAgICAgIHRoaXMuX3RyaWdnZXJlZCB8fCAodGhpcy5fdHJpZ2dlcmVkID0gITAsIHRoaXMuX2NoYW5uZWwgPyB0aGlzLl9jaGFubmVsLnBvcnQxLnBvc3RNZXNzYWdlKCEwKSA6IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICB0Ll90cmlnZ2VyZWQgPSAhMSwgdC5fY2FsbGJhY2soKTtcbiAgICAgIH0sIDApKTtcbiAgICB9LCBWbC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgZGVsZXRlIHRoaXMuX2NoYW5uZWwsIHRoaXMuX2NhbGxiYWNrID0gZnVuY3Rpb24gKCkge307XG4gICAgfTtcblxuICAgIHZhciBGbCA9IGZ1bmN0aW9uIEZsKHQsIGUsIHIpIHtcbiAgICAgIHRoaXMudGFyZ2V0ID0gdCwgdGhpcy5wYXJlbnQgPSBlLCB0aGlzLm1hcElkID0gciwgdGhpcy5jYWxsYmFja3MgPSB7fSwgdGhpcy50YXNrcyA9IHt9LCB0aGlzLnRhc2tRdWV1ZSA9IFtdLCB0aGlzLmNhbmNlbENhbGxiYWNrcyA9IHt9LCB2KFtcInJlY2VpdmVcIiwgXCJwcm9jZXNzXCJdLCB0aGlzKSwgdGhpcy5pbnZva2VyID0gbmV3IFZsKHRoaXMucHJvY2VzcyksIHRoaXMudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHRoaXMucmVjZWl2ZSwgITEpLCB0aGlzLmdsb2JhbFNjb3BlID0gSSgpID8gdCA6IG87XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIERsKHQsIGUsIHIpIHtcbiAgICAgIHZhciBuID0gMiAqIE1hdGguUEkgKiA2Mzc4MTM3IC8gMjU2IC8gTWF0aC5wb3coMiwgcik7XG4gICAgICByZXR1cm4gW3QgKiBuIC0gMiAqIE1hdGguUEkgKiA2Mzc4MTM3IC8gMiwgZSAqIG4gLSAyICogTWF0aC5QSSAqIDYzNzgxMzcgLyAyXTtcbiAgICB9XG5cbiAgICBGbC5wcm90b3R5cGUuc2VuZCA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpKSB7XG4gICAgICB2YXIgYSA9IHRoaXM7XG4gICAgICB2b2lkIDAgPT09IGkgJiYgKGkgPSAhMSk7XG4gICAgICB2YXIgbyA9IE1hdGgucm91bmQoMWUxOCAqIE1hdGgucmFuZG9tKCkpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMCwgMTApO1xuICAgICAgciAmJiAodGhpcy5jYWxsYmFja3Nbb10gPSByKTtcbiAgICAgIHZhciBzID0gRSh0aGlzLmdsb2JhbFNjb3BlKSA/IHZvaWQgMCA6IFtdO1xuICAgICAgcmV0dXJuIHRoaXMudGFyZ2V0LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgaWQ6IG8sXG4gICAgICAgIHR5cGU6IHQsXG4gICAgICAgIGhhc0NhbGxiYWNrOiAhIXIsXG4gICAgICAgIHRhcmdldE1hcElkOiBuLFxuICAgICAgICBtdXN0UXVldWU6IGksXG4gICAgICAgIHNvdXJjZU1hcElkOiB0aGlzLm1hcElkLFxuICAgICAgICBkYXRhOiBxbihlLCBzKVxuICAgICAgfSwgcyksIHtcbiAgICAgICAgY2FuY2VsOiBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgICAgICAgciAmJiBkZWxldGUgYS5jYWxsYmFja3Nbb10sIGEudGFyZ2V0LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIGlkOiBvLFxuICAgICAgICAgICAgdHlwZTogXCI8Y2FuY2VsPlwiLFxuICAgICAgICAgICAgdGFyZ2V0TWFwSWQ6IG4sXG4gICAgICAgICAgICBzb3VyY2VNYXBJZDogYS5tYXBJZFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0sIEZsLnByb3RvdHlwZS5yZWNlaXZlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHZhciBlID0gdC5kYXRhLFxuICAgICAgICAgIHIgPSBlLmlkO1xuICAgICAgaWYgKHIgJiYgKCFlLnRhcmdldE1hcElkIHx8IHRoaXMubWFwSWQgPT09IGUudGFyZ2V0TWFwSWQpKSBpZiAoXCI8Y2FuY2VsPlwiID09PSBlLnR5cGUpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMudGFza3Nbcl07XG4gICAgICAgIHZhciBuID0gdGhpcy5jYW5jZWxDYWxsYmFja3Nbcl07XG4gICAgICAgIGRlbGV0ZSB0aGlzLmNhbmNlbENhbGxiYWNrc1tyXSwgbiAmJiBuKCk7XG4gICAgICB9IGVsc2UgSSgpIHx8IGUubXVzdFF1ZXVlID8gKHRoaXMudGFza3Nbcl0gPSBlLCB0aGlzLnRhc2tRdWV1ZS5wdXNoKHIpLCB0aGlzLmludm9rZXIudHJpZ2dlcigpKSA6IHRoaXMucHJvY2Vzc1Rhc2sociwgZSk7XG4gICAgfSwgRmwucHJvdG90eXBlLnByb2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAodGhpcy50YXNrUXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHZhciB0ID0gdGhpcy50YXNrUXVldWUuc2hpZnQoKSxcbiAgICAgICAgICAgIGUgPSB0aGlzLnRhc2tzW3RdO1xuICAgICAgICBkZWxldGUgdGhpcy50YXNrc1t0XSwgdGhpcy50YXNrUXVldWUubGVuZ3RoICYmIHRoaXMuaW52b2tlci50cmlnZ2VyKCksIGUgJiYgdGhpcy5wcm9jZXNzVGFzayh0LCBlKTtcbiAgICAgIH1cbiAgICB9LCBGbC5wcm90b3R5cGUucHJvY2Vzc1Rhc2sgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgdmFyIHIgPSB0aGlzO1xuXG4gICAgICBpZiAoXCI8cmVzcG9uc2U+XCIgPT09IGUudHlwZSkge1xuICAgICAgICB2YXIgbiA9IHRoaXMuY2FsbGJhY2tzW3RdO1xuICAgICAgICBkZWxldGUgdGhpcy5jYWxsYmFja3NbdF0sIG4gJiYgKGUuZXJyb3IgPyBuKE5uKGUuZXJyb3IpKSA6IG4obnVsbCwgTm4oZS5kYXRhKSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGkgPSAhMSxcbiAgICAgICAgICAgIGEgPSBFKHRoaXMuZ2xvYmFsU2NvcGUpID8gdm9pZCAwIDogW10sXG4gICAgICAgICAgICBvID0gZS5oYXNDYWxsYmFjayA/IGZ1bmN0aW9uIChlLCBuKSB7XG4gICAgICAgICAgaSA9ICEwLCBkZWxldGUgci5jYW5jZWxDYWxsYmFja3NbdF0sIHIudGFyZ2V0LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIGlkOiB0LFxuICAgICAgICAgICAgdHlwZTogXCI8cmVzcG9uc2U+XCIsXG4gICAgICAgICAgICBzb3VyY2VNYXBJZDogci5tYXBJZCxcbiAgICAgICAgICAgIGVycm9yOiBlID8gcW4oZSkgOiBudWxsLFxuICAgICAgICAgICAgZGF0YTogcW4obiwgYSlcbiAgICAgICAgICB9LCBhKTtcbiAgICAgICAgfSA6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgaSA9ICEwO1xuICAgICAgICB9LFxuICAgICAgICAgICAgcyA9IG51bGwsXG4gICAgICAgICAgICB1ID0gTm4oZS5kYXRhKTtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50W2UudHlwZV0pIHMgPSB0aGlzLnBhcmVudFtlLnR5cGVdKGUuc291cmNlTWFwSWQsIHUsIG8pO2Vsc2UgaWYgKHRoaXMucGFyZW50LmdldFdvcmtlclNvdXJjZSkge1xuICAgICAgICAgIHZhciBsID0gZS50eXBlLnNwbGl0KFwiLlwiKTtcbiAgICAgICAgICBzID0gdGhpcy5wYXJlbnQuZ2V0V29ya2VyU291cmNlKGUuc291cmNlTWFwSWQsIGxbMF0sIHUuc291cmNlKVtsWzFdXSh1LCBvKTtcbiAgICAgICAgfSBlbHNlIG8obmV3IEVycm9yKFwiQ291bGQgbm90IGZpbmQgZnVuY3Rpb24gXCIgKyBlLnR5cGUpKTtcbiAgICAgICAgIWkgJiYgcyAmJiBzLmNhbmNlbCAmJiAodGhpcy5jYW5jZWxDYWxsYmFja3NbdF0gPSBzLmNhbmNlbCk7XG4gICAgICB9XG4gICAgfSwgRmwucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuaW52b2tlci5yZW1vdmUoKSwgdGhpcy50YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5yZWNlaXZlLCAhMSk7XG4gICAgfTtcblxuICAgIHZhciBMbCA9IGZ1bmN0aW9uIExsKHQsIGUpIHtcbiAgICAgIHQgJiYgKGUgPyB0aGlzLnNldFNvdXRoV2VzdCh0KS5zZXROb3J0aEVhc3QoZSkgOiA0ID09PSB0Lmxlbmd0aCA/IHRoaXMuc2V0U291dGhXZXN0KFt0WzBdLCB0WzFdXSkuc2V0Tm9ydGhFYXN0KFt0WzJdLCB0WzNdXSkgOiB0aGlzLnNldFNvdXRoV2VzdCh0WzBdKS5zZXROb3J0aEVhc3QodFsxXSkpO1xuICAgIH07XG5cbiAgICBMbC5wcm90b3R5cGUuc2V0Tm9ydGhFYXN0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9uZSA9IHQgaW5zdGFuY2VvZiBPbCA/IG5ldyBPbCh0LmxuZywgdC5sYXQpIDogT2wuY29udmVydCh0KSwgdGhpcztcbiAgICB9LCBMbC5wcm90b3R5cGUuc2V0U291dGhXZXN0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zdyA9IHQgaW5zdGFuY2VvZiBPbCA/IG5ldyBPbCh0LmxuZywgdC5sYXQpIDogT2wuY29udmVydCh0KSwgdGhpcztcbiAgICB9LCBMbC5wcm90b3R5cGUuZXh0ZW5kID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHZhciBlLFxuICAgICAgICAgIHIsXG4gICAgICAgICAgbiA9IHRoaXMuX3N3LFxuICAgICAgICAgIGkgPSB0aGlzLl9uZTtcbiAgICAgIGlmICh0IGluc3RhbmNlb2YgT2wpIGUgPSB0LCByID0gdDtlbHNlIHtcbiAgICAgICAgaWYgKCEodCBpbnN0YW5jZW9mIExsKSkgcmV0dXJuIEFycmF5LmlzQXJyYXkodCkgPyA0ID09PSB0Lmxlbmd0aCB8fCB0LmV2ZXJ5KEFycmF5LmlzQXJyYXkpID8gdGhpcy5leHRlbmQoTGwuY29udmVydCh0KSkgOiB0aGlzLmV4dGVuZChPbC5jb252ZXJ0KHQpKSA6IHRoaXM7XG4gICAgICAgIGlmIChyID0gdC5fbmUsICEoZSA9IHQuX3N3KSB8fCAhcikgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICByZXR1cm4gbiB8fCBpID8gKG4ubG5nID0gTWF0aC5taW4oZS5sbmcsIG4ubG5nKSwgbi5sYXQgPSBNYXRoLm1pbihlLmxhdCwgbi5sYXQpLCBpLmxuZyA9IE1hdGgubWF4KHIubG5nLCBpLmxuZyksIGkubGF0ID0gTWF0aC5tYXgoci5sYXQsIGkubGF0KSkgOiAodGhpcy5fc3cgPSBuZXcgT2woZS5sbmcsIGUubGF0KSwgdGhpcy5fbmUgPSBuZXcgT2woci5sbmcsIHIubGF0KSksIHRoaXM7XG4gICAgfSwgTGwucHJvdG90eXBlLmdldENlbnRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBuZXcgT2woKHRoaXMuX3N3LmxuZyArIHRoaXMuX25lLmxuZykgLyAyLCAodGhpcy5fc3cubGF0ICsgdGhpcy5fbmUubGF0KSAvIDIpO1xuICAgIH0sIExsLnByb3RvdHlwZS5nZXRTb3V0aFdlc3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc3c7XG4gICAgfSwgTGwucHJvdG90eXBlLmdldE5vcnRoRWFzdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9uZTtcbiAgICB9LCBMbC5wcm90b3R5cGUuZ2V0Tm9ydGhXZXN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG5ldyBPbCh0aGlzLmdldFdlc3QoKSwgdGhpcy5nZXROb3J0aCgpKTtcbiAgICB9LCBMbC5wcm90b3R5cGUuZ2V0U291dGhFYXN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG5ldyBPbCh0aGlzLmdldEVhc3QoKSwgdGhpcy5nZXRTb3V0aCgpKTtcbiAgICB9LCBMbC5wcm90b3R5cGUuZ2V0V2VzdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zdy5sbmc7XG4gICAgfSwgTGwucHJvdG90eXBlLmdldFNvdXRoID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3N3LmxhdDtcbiAgICB9LCBMbC5wcm90b3R5cGUuZ2V0RWFzdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9uZS5sbmc7XG4gICAgfSwgTGwucHJvdG90eXBlLmdldE5vcnRoID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX25lLmxhdDtcbiAgICB9LCBMbC5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBbdGhpcy5fc3cudG9BcnJheSgpLCB0aGlzLl9uZS50b0FycmF5KCldO1xuICAgIH0sIExsLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBcIkxuZ0xhdEJvdW5kcyhcIiArIHRoaXMuX3N3LnRvU3RyaW5nKCkgKyBcIiwgXCIgKyB0aGlzLl9uZS50b1N0cmluZygpICsgXCIpXCI7XG4gICAgfSwgTGwucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gISh0aGlzLl9zdyAmJiB0aGlzLl9uZSk7XG4gICAgfSwgTGwucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHZhciBlID0gT2wuY29udmVydCh0KSxcbiAgICAgICAgICByID0gZS5sbmcsXG4gICAgICAgICAgbiA9IGUubGF0LFxuICAgICAgICAgIGkgPSB0aGlzLl9zdy5sbmcgPD0gciAmJiByIDw9IHRoaXMuX25lLmxuZztcbiAgICAgIHJldHVybiB0aGlzLl9zdy5sbmcgPiB0aGlzLl9uZS5sbmcgJiYgKGkgPSB0aGlzLl9zdy5sbmcgPj0gciAmJiByID49IHRoaXMuX25lLmxuZyksIHRoaXMuX3N3LmxhdCA8PSBuICYmIG4gPD0gdGhpcy5fbmUubGF0ICYmIGk7XG4gICAgfSwgTGwuY29udmVydCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gIXQgfHwgdCBpbnN0YW5jZW9mIExsID8gdCA6IG5ldyBMbCh0KTtcbiAgICB9O1xuXG4gICAgdmFyIE9sID0gZnVuY3Rpb24gT2wodCwgZSkge1xuICAgICAgaWYgKGlzTmFOKHQpIHx8IGlzTmFOKGUpKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIExuZ0xhdCBvYmplY3Q6IChcIiArIHQgKyBcIiwgXCIgKyBlICsgXCIpXCIpO1xuICAgICAgaWYgKHRoaXMubG5nID0gK3QsIHRoaXMubGF0ID0gK2UsIHRoaXMubGF0ID4gOTAgfHwgdGhpcy5sYXQgPCAtOTApIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgTG5nTGF0IGxhdGl0dWRlIHZhbHVlOiBtdXN0IGJlIGJldHdlZW4gLTkwIGFuZCA5MFwiKTtcbiAgICB9O1xuXG4gICAgT2wucHJvdG90eXBlLndyYXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbmV3IE9sKGModGhpcy5sbmcsIC0xODAsIDE4MCksIHRoaXMubGF0KTtcbiAgICB9LCBPbC5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBbdGhpcy5sbmcsIHRoaXMubGF0XTtcbiAgICB9LCBPbC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gXCJMbmdMYXQoXCIgKyB0aGlzLmxuZyArIFwiLCBcIiArIHRoaXMubGF0ICsgXCIpXCI7XG4gICAgfSwgT2wucHJvdG90eXBlLmRpc3RhbmNlVG8gPSBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGUgPSBNYXRoLlBJIC8gMTgwLFxuICAgICAgICAgIHIgPSB0aGlzLmxhdCAqIGUsXG4gICAgICAgICAgbiA9IHQubGF0ICogZSxcbiAgICAgICAgICBpID0gTWF0aC5zaW4ocikgKiBNYXRoLnNpbihuKSArIE1hdGguY29zKHIpICogTWF0aC5jb3MobikgKiBNYXRoLmNvcygodC5sbmcgLSB0aGlzLmxuZykgKiBlKTtcbiAgICAgIHJldHVybiA2MzcxMDA4LjggKiBNYXRoLmFjb3MoTWF0aC5taW4oaSwgMSkpO1xuICAgIH0sIE9sLnByb3RvdHlwZS50b0JvdW5kcyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2b2lkIDAgPT09IHQgJiYgKHQgPSAwKTtcbiAgICAgIHZhciBlID0gMzYwICogdCAvIDQwMDc1MDE3LFxuICAgICAgICAgIHIgPSBlIC8gTWF0aC5jb3MoTWF0aC5QSSAvIDE4MCAqIHRoaXMubGF0KTtcbiAgICAgIHJldHVybiBuZXcgTGwobmV3IE9sKHRoaXMubG5nIC0gciwgdGhpcy5sYXQgLSBlKSwgbmV3IE9sKHRoaXMubG5nICsgciwgdGhpcy5sYXQgKyBlKSk7XG4gICAgfSwgT2wuY29udmVydCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBpZiAodCBpbnN0YW5jZW9mIE9sKSByZXR1cm4gdDtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHQpICYmICgyID09PSB0Lmxlbmd0aCB8fCAzID09PSB0Lmxlbmd0aCkpIHJldHVybiBuZXcgT2woTnVtYmVyKHRbMF0pLCBOdW1iZXIodFsxXSkpO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHQpICYmIFwib2JqZWN0XCIgPT0gdHlwZW9mIHQgJiYgbnVsbCAhPT0gdCkgcmV0dXJuIG5ldyBPbChOdW1iZXIoXCJsbmdcIiBpbiB0ID8gdC5sbmcgOiB0LmxvbiksIE51bWJlcih0LmxhdCkpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYExuZ0xhdExpa2VgIGFyZ3VtZW50IG11c3QgYmUgc3BlY2lmaWVkIGFzIGEgTG5nTGF0IGluc3RhbmNlLCBhbiBvYmplY3Qge2xuZzogPGxuZz4sIGxhdDogPGxhdD59LCBhbiBvYmplY3Qge2xvbjogPGxuZz4sIGxhdDogPGxhdD59LCBvciBhbiBhcnJheSBvZiBbPGxuZz4sIDxsYXQ+XVwiKTtcbiAgICB9O1xuICAgIHZhciBSbCA9IDIgKiBNYXRoLlBJICogNjM3MTAwOC44O1xuXG4gICAgZnVuY3Rpb24gVWwodCkge1xuICAgICAgcmV0dXJuIFJsICogTWF0aC5jb3ModCAqIE1hdGguUEkgLyAxODApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGpsKHQpIHtcbiAgICAgIHJldHVybiAoMTgwICsgdCkgLyAzNjA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcWwodCkge1xuICAgICAgcmV0dXJuICgxODAgLSAxODAgLyBNYXRoLlBJICogTWF0aC5sb2coTWF0aC50YW4oTWF0aC5QSSAvIDQgKyB0ICogTWF0aC5QSSAvIDM2MCkpKSAvIDM2MDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBObCh0LCBlKSB7XG4gICAgICByZXR1cm4gdCAvIFVsKGUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIEtsKHQpIHtcbiAgICAgIHJldHVybiAzNjAgLyBNYXRoLlBJICogTWF0aC5hdGFuKE1hdGguZXhwKCgxODAgLSAzNjAgKiB0KSAqIE1hdGguUEkgLyAxODApKSAtIDkwO1xuICAgIH1cblxuICAgIHZhciBHbCA9IGZ1bmN0aW9uIEdsKHQsIGUsIHIpIHtcbiAgICAgIHZvaWQgMCA9PT0gciAmJiAociA9IDApLCB0aGlzLnggPSArdCwgdGhpcy55ID0gK2UsIHRoaXMueiA9ICtyO1xuICAgIH07XG5cbiAgICBHbC5mcm9tTG5nTGF0ID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHZvaWQgMCA9PT0gZSAmJiAoZSA9IDApO1xuICAgICAgdmFyIHIgPSBPbC5jb252ZXJ0KHQpO1xuICAgICAgcmV0dXJuIG5ldyBHbChqbChyLmxuZyksIHFsKHIubGF0KSwgTmwoZSwgci5sYXQpKTtcbiAgICB9LCBHbC5wcm90b3R5cGUudG9MbmdMYXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbmV3IE9sKDM2MCAqIHRoaXMueCAtIDE4MCwgS2wodGhpcy55KSk7XG4gICAgfSwgR2wucHJvdG90eXBlLnRvQWx0aXR1ZGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy56ICogVWwoS2wodGhpcy55KSk7XG4gICAgfSwgR2wucHJvdG90eXBlLm1ldGVySW5NZXJjYXRvckNvb3JkaW5hdGVVbml0cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAxIC8gUmwgKiAodCA9IEtsKHRoaXMueSksIDEgLyBNYXRoLmNvcyh0ICogTWF0aC5QSSAvIDE4MCkpO1xuICAgICAgdmFyIHQ7XG4gICAgfTtcblxuICAgIHZhciBabCA9IGZ1bmN0aW9uIFpsKHQsIGUsIHIpIHtcbiAgICAgIHRoaXMueiA9IHQsIHRoaXMueCA9IGUsIHRoaXMueSA9IHIsIHRoaXMua2V5ID0gSGwoMCwgdCwgdCwgZSwgcik7XG4gICAgfTtcblxuICAgIFpsLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHRoaXMueiA9PT0gdC56ICYmIHRoaXMueCA9PT0gdC54ICYmIHRoaXMueSA9PT0gdC55O1xuICAgIH0sIFpsLnByb3RvdHlwZS51cmwgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgdmFyIHIsXG4gICAgICAgICAgbixcbiAgICAgICAgICBpLFxuICAgICAgICAgIGEsXG4gICAgICAgICAgbyxcbiAgICAgICAgICBzID0gKG4gPSB0aGlzLnksIGkgPSB0aGlzLnosIGEgPSBEbCgyNTYgKiAociA9IHRoaXMueCksIDI1NiAqIChuID0gTWF0aC5wb3coMiwgaSkgLSBuIC0gMSksIGkpLCBvID0gRGwoMjU2ICogKHIgKyAxKSwgMjU2ICogKG4gKyAxKSwgaSksIGFbMF0gKyBcIixcIiArIGFbMV0gKyBcIixcIiArIG9bMF0gKyBcIixcIiArIG9bMV0pLFxuICAgICAgICAgIHUgPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgICBmb3IgKHZhciBuLCBpID0gXCJcIiwgYSA9IHQ7IGEgPiAwOyBhLS0pIHtcbiAgICAgICAgICBpICs9IChlICYgKG4gPSAxIDw8IGEgLSAxKSA/IDEgOiAwKSArIChyICYgbiA/IDIgOiAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpO1xuICAgICAgfSh0aGlzLnosIHRoaXMueCwgdGhpcy55KTtcblxuICAgICAgcmV0dXJuIHRbKHRoaXMueCArIHRoaXMueSkgJSB0Lmxlbmd0aF0ucmVwbGFjZShcIntwcmVmaXh9XCIsICh0aGlzLnggJSAxNikudG9TdHJpbmcoMTYpICsgKHRoaXMueSAlIDE2KS50b1N0cmluZygxNikpLnJlcGxhY2UoXCJ7en1cIiwgU3RyaW5nKHRoaXMueikpLnJlcGxhY2UoXCJ7eH1cIiwgU3RyaW5nKHRoaXMueCkpLnJlcGxhY2UoXCJ7eX1cIiwgU3RyaW5nKFwidG1zXCIgPT09IGUgPyBNYXRoLnBvdygyLCB0aGlzLnopIC0gdGhpcy55IC0gMSA6IHRoaXMueSkpLnJlcGxhY2UoXCJ7cXVhZGtleX1cIiwgdSkucmVwbGFjZShcIntiYm94LWVwc2ctMzg1N31cIiwgcyk7XG4gICAgfSwgWmwucHJvdG90eXBlLmdldFRpbGVQb2ludCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2YXIgZSA9IE1hdGgucG93KDIsIHRoaXMueik7XG4gICAgICByZXR1cm4gbmV3IGkoODE5MiAqICh0LnggKiBlIC0gdGhpcy54KSwgODE5MiAqICh0LnkgKiBlIC0gdGhpcy55KSk7XG4gICAgfSwgWmwucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMueiArIFwiL1wiICsgdGhpcy54ICsgXCIvXCIgKyB0aGlzLnk7XG4gICAgfTtcblxuICAgIHZhciBYbCA9IGZ1bmN0aW9uIFhsKHQsIGUpIHtcbiAgICAgIHRoaXMud3JhcCA9IHQsIHRoaXMuY2Fub25pY2FsID0gZSwgdGhpcy5rZXkgPSBIbCh0LCBlLnosIGUueiwgZS54LCBlLnkpO1xuICAgIH0sXG4gICAgICAgIEpsID0gZnVuY3Rpb24gSmwodCwgZSwgciwgbiwgaSkge1xuICAgICAgdGhpcy5vdmVyc2NhbGVkWiA9IHQsIHRoaXMud3JhcCA9IGUsIHRoaXMuY2Fub25pY2FsID0gbmV3IFpsKHIsICtuLCAraSksIHRoaXMua2V5ID0gSGwoZSwgdCwgciwgbiwgaSk7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIEhsKHQsIGUsIHIsIG4sIGkpIHtcbiAgICAgICh0ICo9IDIpIDwgMCAmJiAodCA9IC0xICogdCAtIDEpO1xuICAgICAgdmFyIGEgPSAxIDw8IHI7XG4gICAgICByZXR1cm4gKGEgKiBhICogdCArIGEgKiBpICsgbikudG9TdHJpbmcoMzYpICsgci50b1N0cmluZygzNikgKyBlLnRvU3RyaW5nKDM2KTtcbiAgICB9XG5cbiAgICBKbC5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0aGlzLm92ZXJzY2FsZWRaID09PSB0Lm92ZXJzY2FsZWRaICYmIHRoaXMud3JhcCA9PT0gdC53cmFwICYmIHRoaXMuY2Fub25pY2FsLmVxdWFscyh0LmNhbm9uaWNhbCk7XG4gICAgfSwgSmwucHJvdG90eXBlLnNjYWxlZFRvID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHZhciBlID0gdGhpcy5jYW5vbmljYWwueiAtIHQ7XG4gICAgICByZXR1cm4gdCA+IHRoaXMuY2Fub25pY2FsLnogPyBuZXcgSmwodCwgdGhpcy53cmFwLCB0aGlzLmNhbm9uaWNhbC56LCB0aGlzLmNhbm9uaWNhbC54LCB0aGlzLmNhbm9uaWNhbC55KSA6IG5ldyBKbCh0LCB0aGlzLndyYXAsIHQsIHRoaXMuY2Fub25pY2FsLnggPj4gZSwgdGhpcy5jYW5vbmljYWwueSA+PiBlKTtcbiAgICB9LCBKbC5wcm90b3R5cGUuY2FsY3VsYXRlU2NhbGVkS2V5ID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHZhciByID0gdGhpcy5jYW5vbmljYWwueiAtIHQ7XG4gICAgICByZXR1cm4gdCA+IHRoaXMuY2Fub25pY2FsLnogPyBIbCh0aGlzLndyYXAgKiArZSwgdCwgdGhpcy5jYW5vbmljYWwueiwgdGhpcy5jYW5vbmljYWwueCwgdGhpcy5jYW5vbmljYWwueSkgOiBIbCh0aGlzLndyYXAgKiArZSwgdCwgdCwgdGhpcy5jYW5vbmljYWwueCA+PiByLCB0aGlzLmNhbm9uaWNhbC55ID4+IHIpO1xuICAgIH0sIEpsLnByb3RvdHlwZS5pc0NoaWxkT2YgPSBmdW5jdGlvbiAodCkge1xuICAgICAgaWYgKHQud3JhcCAhPT0gdGhpcy53cmFwKSByZXR1cm4gITE7XG4gICAgICB2YXIgZSA9IHRoaXMuY2Fub25pY2FsLnogLSB0LmNhbm9uaWNhbC56O1xuICAgICAgcmV0dXJuIDAgPT09IHQub3ZlcnNjYWxlZFogfHwgdC5vdmVyc2NhbGVkWiA8IHRoaXMub3ZlcnNjYWxlZFogJiYgdC5jYW5vbmljYWwueCA9PT0gdGhpcy5jYW5vbmljYWwueCA+PiBlICYmIHQuY2Fub25pY2FsLnkgPT09IHRoaXMuY2Fub25pY2FsLnkgPj4gZTtcbiAgICB9LCBKbC5wcm90b3R5cGUuY2hpbGRyZW4gPSBmdW5jdGlvbiAodCkge1xuICAgICAgaWYgKHRoaXMub3ZlcnNjYWxlZFogPj0gdCkgcmV0dXJuIFtuZXcgSmwodGhpcy5vdmVyc2NhbGVkWiArIDEsIHRoaXMud3JhcCwgdGhpcy5jYW5vbmljYWwueiwgdGhpcy5jYW5vbmljYWwueCwgdGhpcy5jYW5vbmljYWwueSldO1xuICAgICAgdmFyIGUgPSB0aGlzLmNhbm9uaWNhbC56ICsgMSxcbiAgICAgICAgICByID0gMiAqIHRoaXMuY2Fub25pY2FsLngsXG4gICAgICAgICAgbiA9IDIgKiB0aGlzLmNhbm9uaWNhbC55O1xuICAgICAgcmV0dXJuIFtuZXcgSmwoZSwgdGhpcy53cmFwLCBlLCByLCBuKSwgbmV3IEpsKGUsIHRoaXMud3JhcCwgZSwgciArIDEsIG4pLCBuZXcgSmwoZSwgdGhpcy53cmFwLCBlLCByLCBuICsgMSksIG5ldyBKbChlLCB0aGlzLndyYXAsIGUsIHIgKyAxLCBuICsgMSldO1xuICAgIH0sIEpsLnByb3RvdHlwZS5pc0xlc3NUaGFuID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0aGlzLndyYXAgPCB0LndyYXAgfHwgISh0aGlzLndyYXAgPiB0LndyYXApICYmICh0aGlzLm92ZXJzY2FsZWRaIDwgdC5vdmVyc2NhbGVkWiB8fCAhKHRoaXMub3ZlcnNjYWxlZFogPiB0Lm92ZXJzY2FsZWRaKSAmJiAodGhpcy5jYW5vbmljYWwueCA8IHQuY2Fub25pY2FsLnggfHwgISh0aGlzLmNhbm9uaWNhbC54ID4gdC5jYW5vbmljYWwueCkgJiYgdGhpcy5jYW5vbmljYWwueSA8IHQuY2Fub25pY2FsLnkpKTtcbiAgICB9LCBKbC5wcm90b3R5cGUud3JhcHBlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBuZXcgSmwodGhpcy5vdmVyc2NhbGVkWiwgMCwgdGhpcy5jYW5vbmljYWwueiwgdGhpcy5jYW5vbmljYWwueCwgdGhpcy5jYW5vbmljYWwueSk7XG4gICAgfSwgSmwucHJvdG90eXBlLnVud3JhcFRvID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiBuZXcgSmwodGhpcy5vdmVyc2NhbGVkWiwgdCwgdGhpcy5jYW5vbmljYWwueiwgdGhpcy5jYW5vbmljYWwueCwgdGhpcy5jYW5vbmljYWwueSk7XG4gICAgfSwgSmwucHJvdG90eXBlLm92ZXJzY2FsZUZhY3RvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBNYXRoLnBvdygyLCB0aGlzLm92ZXJzY2FsZWRaIC0gdGhpcy5jYW5vbmljYWwueik7XG4gICAgfSwgSmwucHJvdG90eXBlLnRvVW53cmFwcGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG5ldyBYbCh0aGlzLndyYXAsIHRoaXMuY2Fub25pY2FsKTtcbiAgICB9LCBKbC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5vdmVyc2NhbGVkWiArIFwiL1wiICsgdGhpcy5jYW5vbmljYWwueCArIFwiL1wiICsgdGhpcy5jYW5vbmljYWwueTtcbiAgICB9LCBKbC5wcm90b3R5cGUuZ2V0VGlsZVBvaW50ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNhbm9uaWNhbC5nZXRUaWxlUG9pbnQobmV3IEdsKHQueCAtIHRoaXMud3JhcCwgdC55KSk7XG4gICAgfSwgT24oXCJDYW5vbmljYWxUaWxlSURcIiwgWmwpLCBPbihcIk92ZXJzY2FsZWRUaWxlSURcIiwgSmwsIHtcbiAgICAgIG9taXQ6IFtcInBvc01hdHJpeFwiXVxuICAgIH0pO1xuXG4gICAgdmFyIFlsID0gZnVuY3Rpb24gWWwodCwgZSwgcikge1xuICAgICAgaWYgKHRoaXMudWlkID0gdCwgZS5oZWlnaHQgIT09IGUud2lkdGgpIHRocm93IG5ldyBSYW5nZUVycm9yKFwiREVNIHRpbGVzIG11c3QgYmUgc3F1YXJlXCIpO1xuICAgICAgaWYgKHIgJiYgXCJtYXBib3hcIiAhPT0gciAmJiBcInRlcnJhcml1bVwiICE9PSByKSByZXR1cm4gQSgnXCInICsgciArICdcIiBpcyBub3QgYSB2YWxpZCBlbmNvZGluZyB0eXBlLiBWYWxpZCB0eXBlcyBpbmNsdWRlIFwibWFwYm94XCIgYW5kIFwidGVycmFyaXVtXCIuJyk7XG4gICAgICB0aGlzLnN0cmlkZSA9IGUuaGVpZ2h0O1xuICAgICAgdmFyIG4gPSB0aGlzLmRpbSA9IGUuaGVpZ2h0IC0gMjtcbiAgICAgIHRoaXMuZGF0YSA9IG5ldyBVaW50MzJBcnJheShlLmRhdGEuYnVmZmVyKSwgdGhpcy5lbmNvZGluZyA9IHIgfHwgXCJtYXBib3hcIjtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgdGhpcy5kYXRhW3RoaXMuX2lkeCgtMSwgaSldID0gdGhpcy5kYXRhW3RoaXMuX2lkeCgwLCBpKV0sIHRoaXMuZGF0YVt0aGlzLl9pZHgobiwgaSldID0gdGhpcy5kYXRhW3RoaXMuX2lkeChuIC0gMSwgaSldLCB0aGlzLmRhdGFbdGhpcy5faWR4KGksIC0xKV0gPSB0aGlzLmRhdGFbdGhpcy5faWR4KGksIDApXSwgdGhpcy5kYXRhW3RoaXMuX2lkeChpLCBuKV0gPSB0aGlzLmRhdGFbdGhpcy5faWR4KGksIG4gLSAxKV07XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZGF0YVt0aGlzLl9pZHgoLTEsIC0xKV0gPSB0aGlzLmRhdGFbdGhpcy5faWR4KDAsIDApXSwgdGhpcy5kYXRhW3RoaXMuX2lkeChuLCAtMSldID0gdGhpcy5kYXRhW3RoaXMuX2lkeChuIC0gMSwgMCldLCB0aGlzLmRhdGFbdGhpcy5faWR4KC0xLCBuKV0gPSB0aGlzLmRhdGFbdGhpcy5faWR4KDAsIG4gLSAxKV0sIHRoaXMuZGF0YVt0aGlzLl9pZHgobiwgbildID0gdGhpcy5kYXRhW3RoaXMuX2lkeChuIC0gMSwgbiAtIDEpXTtcbiAgICB9O1xuXG4gICAgWWwucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB2YXIgciA9IG5ldyBVaW50OEFycmF5KHRoaXMuZGF0YS5idWZmZXIpLFxuICAgICAgICAgIG4gPSA0ICogdGhpcy5faWR4KHQsIGUpO1xuXG4gICAgICByZXR1cm4gKFwidGVycmFyaXVtXCIgPT09IHRoaXMuZW5jb2RpbmcgPyB0aGlzLl91bnBhY2tUZXJyYXJpdW0gOiB0aGlzLl91bnBhY2tNYXBib3gpKHJbbl0sIHJbbiArIDFdLCByW24gKyAyXSk7XG4gICAgfSwgWWwucHJvdG90eXBlLmdldFVucGFja1ZlY3RvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBcInRlcnJhcml1bVwiID09PSB0aGlzLmVuY29kaW5nID8gWzI1NiwgMSwgMSAvIDI1NiwgMzI3NjhdIDogWzY1NTMuNiwgMjUuNiwgLjEsIDFlNF07XG4gICAgfSwgWWwucHJvdG90eXBlLl9pZHggPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgaWYgKHQgPCAtMSB8fCB0ID49IHRoaXMuZGltICsgMSB8fCBlIDwgLTEgfHwgZSA+PSB0aGlzLmRpbSArIDEpIHRocm93IG5ldyBSYW5nZUVycm9yKFwib3V0IG9mIHJhbmdlIHNvdXJjZSBjb29yZGluYXRlcyBmb3IgREVNIGRhdGFcIik7XG4gICAgICByZXR1cm4gKGUgKyAxKSAqIHRoaXMuc3RyaWRlICsgKHQgKyAxKTtcbiAgICB9LCBZbC5wcm90b3R5cGUuX3VucGFja01hcGJveCA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICByZXR1cm4gKDI1NiAqIHQgKiAyNTYgKyAyNTYgKiBlICsgcikgLyAxMCAtIDFlNDtcbiAgICB9LCBZbC5wcm90b3R5cGUuX3VucGFja1RlcnJhcml1bSA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICByZXR1cm4gMjU2ICogdCArIGUgKyByIC8gMjU2IC0gMzI3Njg7XG4gICAgfSwgWWwucHJvdG90eXBlLmdldFBpeGVscyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBuZXcgeG8oe1xuICAgICAgICB3aWR0aDogdGhpcy5zdHJpZGUsXG4gICAgICAgIGhlaWdodDogdGhpcy5zdHJpZGVcbiAgICAgIH0sIG5ldyBVaW50OEFycmF5KHRoaXMuZGF0YS5idWZmZXIpKTtcbiAgICB9LCBZbC5wcm90b3R5cGUuYmFja2ZpbGxCb3JkZXIgPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgaWYgKHRoaXMuZGltICE9PSB0LmRpbSkgdGhyb3cgbmV3IEVycm9yKFwiZGVtIGRpbWVuc2lvbiBtaXNtYXRjaFwiKTtcbiAgICAgIHZhciBuID0gZSAqIHRoaXMuZGltLFxuICAgICAgICAgIGkgPSBlICogdGhpcy5kaW0gKyB0aGlzLmRpbSxcbiAgICAgICAgICBhID0gciAqIHRoaXMuZGltLFxuICAgICAgICAgIG8gPSByICogdGhpcy5kaW0gKyB0aGlzLmRpbTtcblxuICAgICAgc3dpdGNoIChlKSB7XG4gICAgICAgIGNhc2UgLTE6XG4gICAgICAgICAgbiA9IGkgLSAxO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBpID0gbiArIDE7XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAocikge1xuICAgICAgICBjYXNlIC0xOlxuICAgICAgICAgIGEgPSBvIC0gMTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgbyA9IGEgKyAxO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBzID0gLWUgKiB0aGlzLmRpbSwgdSA9IC1yICogdGhpcy5kaW0sIGwgPSBhOyBsIDwgbzsgbCsrKSB7XG4gICAgICAgIGZvciAodmFyIHAgPSBuOyBwIDwgaTsgcCsrKSB7XG4gICAgICAgICAgdGhpcy5kYXRhW3RoaXMuX2lkeChwLCBsKV0gPSB0LmRhdGFbdGhpcy5faWR4KHAgKyBzLCBsICsgdSldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgT24oXCJERU1EYXRhXCIsIFlsKTtcblxuICAgIHZhciAkbCA9IGZ1bmN0aW9uICRsKHQpIHtcbiAgICAgIHRoaXMuX3N0cmluZ1RvTnVtYmVyID0ge30sIHRoaXMuX251bWJlclRvU3RyaW5nID0gW107XG5cbiAgICAgIGZvciAodmFyIGUgPSAwOyBlIDwgdC5sZW5ndGg7IGUrKykge1xuICAgICAgICB2YXIgciA9IHRbZV07XG4gICAgICAgIHRoaXMuX3N0cmluZ1RvTnVtYmVyW3JdID0gZSwgdGhpcy5fbnVtYmVyVG9TdHJpbmdbZV0gPSByO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAkbC5wcm90b3R5cGUuZW5jb2RlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zdHJpbmdUb051bWJlclt0XTtcbiAgICB9LCAkbC5wcm90b3R5cGUuZGVjb2RlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9udW1iZXJUb1N0cmluZ1t0XTtcbiAgICB9O1xuXG4gICAgdmFyIFdsID0gZnVuY3Rpb24gV2wodCwgZSwgciwgbiwgaSkge1xuICAgICAgdGhpcy50eXBlID0gXCJGZWF0dXJlXCIsIHRoaXMuX3ZlY3RvclRpbGVGZWF0dXJlID0gdCwgdC5feiA9IGUsIHQuX3ggPSByLCB0Ll95ID0gbiwgdGhpcy5wcm9wZXJ0aWVzID0gdC5wcm9wZXJ0aWVzLCB0aGlzLmlkID0gaTtcbiAgICB9LFxuICAgICAgICBRbCA9IHtcbiAgICAgIGdlb21ldHJ5OiB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgUWwuZ2VvbWV0cnkuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gdGhpcy5fZ2VvbWV0cnkgJiYgKHRoaXMuX2dlb21ldHJ5ID0gdGhpcy5fdmVjdG9yVGlsZUZlYXR1cmUudG9HZW9KU09OKHRoaXMuX3ZlY3RvclRpbGVGZWF0dXJlLl94LCB0aGlzLl92ZWN0b3JUaWxlRmVhdHVyZS5feSwgdGhpcy5fdmVjdG9yVGlsZUZlYXR1cmUuX3opLmdlb21ldHJ5KSwgdGhpcy5fZ2VvbWV0cnk7XG4gICAgfSwgUWwuZ2VvbWV0cnkuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHRoaXMuX2dlb21ldHJ5ID0gdDtcbiAgICB9LCBXbC5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHQgPSB7XG4gICAgICAgIGdlb21ldHJ5OiB0aGlzLmdlb21ldHJ5XG4gICAgICB9O1xuXG4gICAgICBmb3IgKHZhciBlIGluIHRoaXMpIHtcbiAgICAgICAgXCJfZ2VvbWV0cnlcIiAhPT0gZSAmJiBcIl92ZWN0b3JUaWxlRmVhdHVyZVwiICE9PSBlICYmICh0W2VdID0gdGhpc1tlXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0O1xuICAgIH0sIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFdsLnByb3RvdHlwZSwgUWwpO1xuXG4gICAgdmFyIHRwID0gZnVuY3Rpb24gdHAoKSB7XG4gICAgICB0aGlzLnN0YXRlID0ge30sIHRoaXMuc3RhdGVDaGFuZ2VzID0ge30sIHRoaXMuZGVsZXRlZFN0YXRlcyA9IHt9O1xuICAgIH07XG5cbiAgICB0cC5wcm90b3R5cGUudXBkYXRlU3RhdGUgPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgdmFyIG4gPSBTdHJpbmcoZSk7XG4gICAgICBpZiAodGhpcy5zdGF0ZUNoYW5nZXNbdF0gPSB0aGlzLnN0YXRlQ2hhbmdlc1t0XSB8fCB7fSwgdGhpcy5zdGF0ZUNoYW5nZXNbdF1bbl0gPSB0aGlzLnN0YXRlQ2hhbmdlc1t0XVtuXSB8fCB7fSwgaCh0aGlzLnN0YXRlQ2hhbmdlc1t0XVtuXSwgciksIG51bGwgPT09IHRoaXMuZGVsZXRlZFN0YXRlc1t0XSkgZm9yICh2YXIgaSBpbiB0aGlzLmRlbGV0ZWRTdGF0ZXNbdF0gPSB7fSwgdGhpcy5zdGF0ZVt0XSkge1xuICAgICAgICBpICE9PSBuICYmICh0aGlzLmRlbGV0ZWRTdGF0ZXNbdF1baV0gPSBudWxsKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5kZWxldGVkU3RhdGVzW3RdICYmIG51bGwgPT09IHRoaXMuZGVsZXRlZFN0YXRlc1t0XVtuXSkgZm9yICh2YXIgYSBpbiB0aGlzLmRlbGV0ZWRTdGF0ZXNbdF1bbl0gPSB7fSwgdGhpcy5zdGF0ZVt0XVtuXSkge1xuICAgICAgICByW2FdIHx8ICh0aGlzLmRlbGV0ZWRTdGF0ZXNbdF1bbl1bYV0gPSBudWxsKTtcbiAgICAgIH0gZWxzZSBmb3IgKHZhciBvIGluIHIpIHtcbiAgICAgICAgdGhpcy5kZWxldGVkU3RhdGVzW3RdICYmIHRoaXMuZGVsZXRlZFN0YXRlc1t0XVtuXSAmJiBudWxsID09PSB0aGlzLmRlbGV0ZWRTdGF0ZXNbdF1bbl1bb10gJiYgZGVsZXRlIHRoaXMuZGVsZXRlZFN0YXRlc1t0XVtuXVtvXTtcbiAgICAgIH1cbiAgICB9LCB0cC5wcm90b3R5cGUucmVtb3ZlRmVhdHVyZVN0YXRlID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgIGlmIChudWxsICE9PSB0aGlzLmRlbGV0ZWRTdGF0ZXNbdF0pIHtcbiAgICAgICAgdmFyIG4gPSBTdHJpbmcoZSk7XG4gICAgICAgIGlmICh0aGlzLmRlbGV0ZWRTdGF0ZXNbdF0gPSB0aGlzLmRlbGV0ZWRTdGF0ZXNbdF0gfHwge30sIHIgJiYgdm9pZCAwICE9PSBlKSBudWxsICE9PSB0aGlzLmRlbGV0ZWRTdGF0ZXNbdF1bbl0gJiYgKHRoaXMuZGVsZXRlZFN0YXRlc1t0XVtuXSA9IHRoaXMuZGVsZXRlZFN0YXRlc1t0XVtuXSB8fCB7fSwgdGhpcy5kZWxldGVkU3RhdGVzW3RdW25dW3JdID0gbnVsbCk7ZWxzZSBpZiAodm9pZCAwICE9PSBlKSB7XG4gICAgICAgICAgaWYgKHRoaXMuc3RhdGVDaGFuZ2VzW3RdICYmIHRoaXMuc3RhdGVDaGFuZ2VzW3RdW25dKSBmb3IgKHIgaW4gdGhpcy5kZWxldGVkU3RhdGVzW3RdW25dID0ge30sIHRoaXMuc3RhdGVDaGFuZ2VzW3RdW25dKSB7XG4gICAgICAgICAgICB0aGlzLmRlbGV0ZWRTdGF0ZXNbdF1bbl1bcl0gPSBudWxsO1xuICAgICAgICAgIH0gZWxzZSB0aGlzLmRlbGV0ZWRTdGF0ZXNbdF1bbl0gPSBudWxsO1xuICAgICAgICB9IGVsc2UgdGhpcy5kZWxldGVkU3RhdGVzW3RdID0gbnVsbDtcbiAgICAgIH1cbiAgICB9LCB0cC5wcm90b3R5cGUuZ2V0U3RhdGUgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgdmFyIHIgPSBTdHJpbmcoZSksXG4gICAgICAgICAgbiA9IGgoe30sICh0aGlzLnN0YXRlW3RdIHx8IHt9KVtyXSwgKHRoaXMuc3RhdGVDaGFuZ2VzW3RdIHx8IHt9KVtyXSk7XG4gICAgICBpZiAobnVsbCA9PT0gdGhpcy5kZWxldGVkU3RhdGVzW3RdKSByZXR1cm4ge307XG5cbiAgICAgIGlmICh0aGlzLmRlbGV0ZWRTdGF0ZXNbdF0pIHtcbiAgICAgICAgdmFyIGkgPSB0aGlzLmRlbGV0ZWRTdGF0ZXNbdF1bZV07XG4gICAgICAgIGlmIChudWxsID09PSBpKSByZXR1cm4ge307XG5cbiAgICAgICAgZm9yICh2YXIgYSBpbiBpKSB7XG4gICAgICAgICAgZGVsZXRlIG5bYV07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG47XG4gICAgfSwgdHAucHJvdG90eXBlLmluaXRpYWxpemVUaWxlU3RhdGUgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgdC5zZXRGZWF0dXJlU3RhdGUodGhpcy5zdGF0ZSwgZSk7XG4gICAgfSwgdHAucHJvdG90eXBlLmNvYWxlc2NlQ2hhbmdlcyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBuIGluIHRoaXMuc3RhdGVDaGFuZ2VzKSB7XG4gICAgICAgIHRoaXMuc3RhdGVbbl0gPSB0aGlzLnN0YXRlW25dIHx8IHt9O1xuICAgICAgICB2YXIgaSA9IHt9O1xuXG4gICAgICAgIGZvciAodmFyIGEgaW4gdGhpcy5zdGF0ZUNoYW5nZXNbbl0pIHtcbiAgICAgICAgICB0aGlzLnN0YXRlW25dW2FdIHx8ICh0aGlzLnN0YXRlW25dW2FdID0ge30pLCBoKHRoaXMuc3RhdGVbbl1bYV0sIHRoaXMuc3RhdGVDaGFuZ2VzW25dW2FdKSwgaVthXSA9IHRoaXMuc3RhdGVbbl1bYV07XG4gICAgICAgIH1cblxuICAgICAgICByW25dID0gaTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgbyBpbiB0aGlzLmRlbGV0ZWRTdGF0ZXMpIHtcbiAgICAgICAgdGhpcy5zdGF0ZVtvXSA9IHRoaXMuc3RhdGVbb10gfHwge307XG4gICAgICAgIHZhciBzID0ge307XG4gICAgICAgIGlmIChudWxsID09PSB0aGlzLmRlbGV0ZWRTdGF0ZXNbb10pIGZvciAodmFyIHUgaW4gdGhpcy5zdGF0ZVtvXSkge1xuICAgICAgICAgIHNbdV0gPSB7fSwgdGhpcy5zdGF0ZVtvXVt1XSA9IHt9O1xuICAgICAgICB9IGVsc2UgZm9yICh2YXIgbCBpbiB0aGlzLmRlbGV0ZWRTdGF0ZXNbb10pIHtcbiAgICAgICAgICBpZiAobnVsbCA9PT0gdGhpcy5kZWxldGVkU3RhdGVzW29dW2xdKSB0aGlzLnN0YXRlW29dW2xdID0ge307ZWxzZSBmb3IgKHZhciBwID0gMCwgYyA9IE9iamVjdC5rZXlzKHRoaXMuZGVsZXRlZFN0YXRlc1tvXVtsXSk7IHAgPCBjLmxlbmd0aDsgcCArPSAxKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5zdGF0ZVtvXVtsXVtjW3BdXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc1tsXSA9IHRoaXMuc3RhdGVbb11bbF07XG4gICAgICAgIH1cbiAgICAgICAgcltvXSA9IHJbb10gfHwge30sIGgocltvXSwgcyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnN0YXRlQ2hhbmdlcyA9IHt9LCB0aGlzLmRlbGV0ZWRTdGF0ZXMgPSB7fSwgMCAhPT0gT2JqZWN0LmtleXMocikubGVuZ3RoKSBmb3IgKHZhciBmIGluIHQpIHtcbiAgICAgICAgdFtmXS5zZXRGZWF0dXJlU3RhdGUociwgZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciBlcCA9IGZ1bmN0aW9uIGVwKHQsIGUpIHtcbiAgICAgIHRoaXMudGlsZUlEID0gdCwgdGhpcy54ID0gdC5jYW5vbmljYWwueCwgdGhpcy55ID0gdC5jYW5vbmljYWwueSwgdGhpcy56ID0gdC5jYW5vbmljYWwueiwgdGhpcy5ncmlkID0gbmV3IFRuKDgxOTIsIDE2LCAwKSwgdGhpcy5ncmlkM0QgPSBuZXcgVG4oODE5MiwgMTYsIDApLCB0aGlzLmZlYXR1cmVJbmRleEFycmF5ID0gbmV3IGFhKCksIHRoaXMucHJvbW90ZUlkID0gZTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gcnAodCwgZSwgciwgbiwgaSkge1xuICAgICAgcmV0dXJuIHgodCwgZnVuY3Rpb24gKHQsIGEpIHtcbiAgICAgICAgdmFyIG8gPSBlIGluc3RhbmNlb2YgZGkgPyBlLmdldChhKSA6IG51bGw7XG4gICAgICAgIHJldHVybiBvICYmIG8uZXZhbHVhdGUgPyBvLmV2YWx1YXRlKHIsIG4sIGkpIDogbztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG5wKHQpIHtcbiAgICAgIGZvciAodmFyIGUgPSAxIC8gMCwgciA9IDEgLyAwLCBuID0gLTEgLyAwLCBpID0gLTEgLyAwLCBhID0gMCwgbyA9IHQ7IGEgPCBvLmxlbmd0aDsgYSArPSAxKSB7XG4gICAgICAgIHZhciBzID0gb1thXTtcbiAgICAgICAgZSA9IE1hdGgubWluKGUsIHMueCksIHIgPSBNYXRoLm1pbihyLCBzLnkpLCBuID0gTWF0aC5tYXgobiwgcy54KSwgaSA9IE1hdGgubWF4KGksIHMueSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1pblg6IGUsXG4gICAgICAgIG1pblk6IHIsXG4gICAgICAgIG1heFg6IG4sXG4gICAgICAgIG1heFk6IGlcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXAodCwgZSkge1xuICAgICAgcmV0dXJuIGUgLSB0O1xuICAgIH1cblxuICAgIGVwLnByb3RvdHlwZS5pbnNlcnQgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSwgYSkge1xuICAgICAgdmFyIG8gPSB0aGlzLmZlYXR1cmVJbmRleEFycmF5Lmxlbmd0aDtcbiAgICAgIHRoaXMuZmVhdHVyZUluZGV4QXJyYXkuZW1wbGFjZUJhY2sociwgbiwgaSk7XG5cbiAgICAgIGZvciAodmFyIHMgPSBhID8gdGhpcy5ncmlkM0QgOiB0aGlzLmdyaWQsIHUgPSAwOyB1IDwgZS5sZW5ndGg7IHUrKykge1xuICAgICAgICBmb3IgKHZhciBsID0gZVt1XSwgcCA9IFsxIC8gMCwgMSAvIDAsIC0xIC8gMCwgLTEgLyAwXSwgYyA9IDA7IGMgPCBsLmxlbmd0aDsgYysrKSB7XG4gICAgICAgICAgdmFyIGggPSBsW2NdO1xuICAgICAgICAgIHBbMF0gPSBNYXRoLm1pbihwWzBdLCBoLngpLCBwWzFdID0gTWF0aC5taW4ocFsxXSwgaC55KSwgcFsyXSA9IE1hdGgubWF4KHBbMl0sIGgueCksIHBbM10gPSBNYXRoLm1heChwWzNdLCBoLnkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcFswXSA8IDgxOTIgJiYgcFsxXSA8IDgxOTIgJiYgcFsyXSA+PSAwICYmIHBbM10gPj0gMCAmJiBzLmluc2VydChvLCBwWzBdLCBwWzFdLCBwWzJdLCBwWzNdKTtcbiAgICAgIH1cbiAgICB9LCBlcC5wcm90b3R5cGUubG9hZFZUTGF5ZXJzID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMudnRMYXllcnMgfHwgKHRoaXMudnRMYXllcnMgPSBuZXcgYnMuVmVjdG9yVGlsZShuZXcgWXModGhpcy5yYXdUaWxlRGF0YSkpLmxheWVycywgdGhpcy5zb3VyY2VMYXllckNvZGVyID0gbmV3ICRsKHRoaXMudnRMYXllcnMgPyBPYmplY3Qua2V5cyh0aGlzLnZ0TGF5ZXJzKS5zb3J0KCkgOiBbXCJfZ2VvanNvblRpbGVMYXllclwiXSkpLCB0aGlzLnZ0TGF5ZXJzO1xuICAgIH0sIGVwLnByb3RvdHlwZS5xdWVyeSA9IGZ1bmN0aW9uICh0LCBlLCByLCBuKSB7XG4gICAgICB2YXIgYSA9IHRoaXM7XG4gICAgICB0aGlzLmxvYWRWVExheWVycygpO1xuXG4gICAgICBmb3IgKHZhciBvID0gdC5wYXJhbXMgfHwge30sIHMgPSA4MTkyIC8gdC50aWxlU2l6ZSAvIHQuc2NhbGUsIHUgPSBvbihvLmZpbHRlciksIGwgPSB0LnF1ZXJ5R2VvbWV0cnksIHAgPSB0LnF1ZXJ5UGFkZGluZyAqIHMsIGMgPSBucChsKSwgaCA9IHRoaXMuZ3JpZC5xdWVyeShjLm1pblggLSBwLCBjLm1pblkgLSBwLCBjLm1heFggKyBwLCBjLm1heFkgKyBwKSwgZiA9IG5wKHQuY2FtZXJhUXVlcnlHZW9tZXRyeSksIHkgPSB0aGlzLmdyaWQzRC5xdWVyeShmLm1pblggLSBwLCBmLm1pblkgLSBwLCBmLm1heFggKyBwLCBmLm1heFkgKyBwLCBmdW5jdGlvbiAoZSwgciwgbiwgYSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGEpIHtcbiAgICAgICAgICBmb3IgKHZhciBvID0gMCwgcyA9IHQ7IG8gPCBzLmxlbmd0aDsgbyArPSAxKSB7XG4gICAgICAgICAgICB2YXIgdSA9IHNbb107XG4gICAgICAgICAgICBpZiAoZSA8PSB1LnggJiYgciA8PSB1LnkgJiYgbiA+PSB1LnggJiYgYSA+PSB1LnkpIHJldHVybiAhMDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgbCA9IFtuZXcgaShlLCByKSwgbmV3IGkoZSwgYSksIG5ldyBpKG4sIGEpLCBuZXcgaShuLCByKV07XG4gICAgICAgICAgaWYgKHQubGVuZ3RoID4gMikgZm9yICh2YXIgcCA9IDAsIGMgPSBsOyBwIDwgYy5sZW5ndGg7IHAgKz0gMSkge1xuICAgICAgICAgICAgaWYgKFdhKHQsIGNbcF0pKSByZXR1cm4gITA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yICh2YXIgaCA9IDA7IGggPCB0Lmxlbmd0aCAtIDE7IGgrKykge1xuICAgICAgICAgICAgaWYgKFFhKHRbaF0sIHRbaCArIDFdLCBsKSkgcmV0dXJuICEwO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgfSh0LmNhbWVyYVF1ZXJ5R2VvbWV0cnksIGUgLSBwLCByIC0gcCwgbiArIHAsIGEgKyBwKTtcbiAgICAgIH0pLCBkID0gMCwgbSA9IHk7IGQgPCBtLmxlbmd0aDsgZCArPSAxKSB7XG4gICAgICAgIGgucHVzaChtW2RdKTtcbiAgICAgIH1cblxuICAgICAgaC5zb3J0KGlwKTtcblxuICAgICAgZm9yICh2YXIgdiwgZyA9IHt9LCB4ID0gZnVuY3Rpb24geChpKSB7XG4gICAgICAgIHZhciBwID0gaFtpXTtcblxuICAgICAgICBpZiAocCAhPT0gdikge1xuICAgICAgICAgIHYgPSBwO1xuICAgICAgICAgIHZhciBjID0gYS5mZWF0dXJlSW5kZXhBcnJheS5nZXQocCksXG4gICAgICAgICAgICAgIGYgPSBudWxsO1xuICAgICAgICAgIGEubG9hZE1hdGNoaW5nRmVhdHVyZShnLCBjLmJ1Y2tldEluZGV4LCBjLnNvdXJjZUxheWVySW5kZXgsIGMuZmVhdHVyZUluZGV4LCB1LCBvLmxheWVycywgby5hdmFpbGFibGVJbWFnZXMsIGUsIHIsIG4sIGZ1bmN0aW9uIChlLCByLCBuKSB7XG4gICAgICAgICAgICByZXR1cm4gZiB8fCAoZiA9IFJhKGUpKSwgci5xdWVyeUludGVyc2VjdHNGZWF0dXJlKGwsIGUsIG4sIGYsIGEueiwgdC50cmFuc2Zvcm0sIHMsIHQucGl4ZWxQb3NNYXRyaXgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LCBiID0gMDsgYiA8IGgubGVuZ3RoOyBiKyspIHtcbiAgICAgICAgeChiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGc7XG4gICAgfSwgZXAucHJvdG90eXBlLmxvYWRNYXRjaGluZ0ZlYXR1cmUgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSwgYSwgbywgcywgdSwgbCwgcCkge1xuICAgICAgdmFyIGMgPSB0aGlzLmJ1Y2tldExheWVySURzW2VdO1xuXG4gICAgICBpZiAoIWEgfHwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCB0Lmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgaWYgKGUuaW5kZXhPZih0W3JdKSA+PSAwKSByZXR1cm4gITA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gITE7XG4gICAgICB9KGEsIGMpKSB7XG4gICAgICAgIHZhciBmID0gdGhpcy5zb3VyY2VMYXllckNvZGVyLmRlY29kZShyKSxcbiAgICAgICAgICAgIHkgPSB0aGlzLnZ0TGF5ZXJzW2ZdLmZlYXR1cmUobik7XG5cbiAgICAgICAgaWYgKGkubmVlZEdlb21ldHJ5KSB7XG4gICAgICAgICAgdmFyIGQgPSBVYSh5LCAhMCk7XG4gICAgICAgICAgaWYgKCFpLmZpbHRlcihuZXcgc2kodGhpcy50aWxlSUQub3ZlcnNjYWxlZFopLCBkLCB0aGlzLnRpbGVJRC5jYW5vbmljYWwpKSByZXR1cm47XG4gICAgICAgIH0gZWxzZSBpZiAoIWkuZmlsdGVyKG5ldyBzaSh0aGlzLnRpbGVJRC5vdmVyc2NhbGVkWiksIHkpKSByZXR1cm47XG5cbiAgICAgICAgZm9yICh2YXIgbSA9IHRoaXMuZ2V0SWQoeSwgZiksIHYgPSAwOyB2IDwgYy5sZW5ndGg7IHYrKykge1xuICAgICAgICAgIHZhciBnID0gY1t2XTtcblxuICAgICAgICAgIGlmICghKGEgJiYgYS5pbmRleE9mKGcpIDwgMCkpIHtcbiAgICAgICAgICAgIHZhciB4ID0gc1tnXTtcblxuICAgICAgICAgICAgaWYgKHgpIHtcbiAgICAgICAgICAgICAgdmFyIGIgPSB7fTtcbiAgICAgICAgICAgICAgdm9pZCAwICE9PSBtICYmIGwgJiYgKGIgPSBsLmdldFN0YXRlKHguc291cmNlTGF5ZXIgfHwgXCJfZ2VvanNvblRpbGVMYXllclwiLCBtKSk7XG4gICAgICAgICAgICAgIHZhciB3ID0gaCh7fSwgdVtnXSk7XG4gICAgICAgICAgICAgIHcucGFpbnQgPSBycCh3LnBhaW50LCB4LnBhaW50LCB5LCBiLCBvKSwgdy5sYXlvdXQgPSBycCh3LmxheW91dCwgeC5sYXlvdXQsIHksIGIsIG8pO1xuXG4gICAgICAgICAgICAgIHZhciBfID0gIXAgfHwgcCh5LCB4LCBiKTtcblxuICAgICAgICAgICAgICBpZiAoXykge1xuICAgICAgICAgICAgICAgIHZhciBBID0gbmV3IFdsKHksIHRoaXMueiwgdGhpcy54LCB0aGlzLnksIG0pO1xuICAgICAgICAgICAgICAgIEEubGF5ZXIgPSB3O1xuICAgICAgICAgICAgICAgIHZhciBTID0gdFtnXTtcbiAgICAgICAgICAgICAgICB2b2lkIDAgPT09IFMgJiYgKFMgPSB0W2ddID0gW10pLCBTLnB1c2goe1xuICAgICAgICAgICAgICAgICAgZmVhdHVyZUluZGV4OiBuLFxuICAgICAgICAgICAgICAgICAgZmVhdHVyZTogQSxcbiAgICAgICAgICAgICAgICAgIGludGVyc2VjdGlvblo6IF9cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIGVwLnByb3RvdHlwZS5sb29rdXBTeW1ib2xGZWF0dXJlcyA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpLCBhLCBvLCBzKSB7XG4gICAgICB2YXIgdSA9IHt9O1xuICAgICAgdGhpcy5sb2FkVlRMYXllcnMoKTtcblxuICAgICAgZm9yICh2YXIgbCA9IG9uKGkpLCBwID0gMCwgYyA9IHQ7IHAgPCBjLmxlbmd0aDsgcCArPSAxKSB7XG4gICAgICAgIHRoaXMubG9hZE1hdGNoaW5nRmVhdHVyZSh1LCByLCBuLCBjW3BdLCBsLCBhLCBvLCBzLCBlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHU7XG4gICAgfSwgZXAucHJvdG90eXBlLmhhc0xheWVyID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZvciAodmFyIGUgPSAwLCByID0gdGhpcy5idWNrZXRMYXllcklEczsgZSA8IHIubGVuZ3RoOyBlICs9IDEpIHtcbiAgICAgICAgZm9yICh2YXIgbiA9IDAsIGkgPSByW2VdOyBuIDwgaS5sZW5ndGg7IG4gKz0gMSkge1xuICAgICAgICAgIGlmICh0ID09PSBpW25dKSByZXR1cm4gITA7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuICExO1xuICAgIH0sIGVwLnByb3RvdHlwZS5nZXRJZCA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB2YXIgciA9IHQuaWQ7XG4gICAgICByZXR1cm4gdGhpcy5wcm9tb3RlSWQgJiYgXCJib29sZWFuXCIgPT0gdHlwZW9mIChyID0gdC5wcm9wZXJ0aWVzW1wic3RyaW5nXCIgPT0gdHlwZW9mIHRoaXMucHJvbW90ZUlkID8gdGhpcy5wcm9tb3RlSWQgOiB0aGlzLnByb21vdGVJZFtlXV0pICYmIChyID0gTnVtYmVyKHIpKSwgcjtcbiAgICB9LCBPbihcIkZlYXR1cmVJbmRleFwiLCBlcCwge1xuICAgICAgb21pdDogW1wicmF3VGlsZURhdGFcIiwgXCJzb3VyY2VMYXllckNvZGVyXCJdXG4gICAgfSk7XG5cbiAgICB2YXIgYXAgPSBmdW5jdGlvbiBhcCh0LCBlKSB7XG4gICAgICB0aGlzLnRpbGVJRCA9IHQsIHRoaXMudWlkID0geSgpLCB0aGlzLnVzZXMgPSAwLCB0aGlzLnRpbGVTaXplID0gZSwgdGhpcy5idWNrZXRzID0ge30sIHRoaXMuZXhwaXJhdGlvblRpbWUgPSBudWxsLCB0aGlzLnF1ZXJ5UGFkZGluZyA9IDAsIHRoaXMuaGFzU3ltYm9sQnVja2V0cyA9ICExLCB0aGlzLmhhc1JUTFRleHQgPSAhMSwgdGhpcy5kZXBlbmRlbmNpZXMgPSB7fSwgdGhpcy5leHBpcmVkUmVxdWVzdENvdW50ID0gMCwgdGhpcy5zdGF0ZSA9IFwibG9hZGluZ1wiO1xuICAgIH07XG5cbiAgICBhcC5wcm90b3R5cGUucmVnaXN0ZXJGYWRlRHVyYXRpb24gPSBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGUgPSB0ICsgdGhpcy50aW1lQWRkZWQ7XG4gICAgICBlIDwgTy5ub3coKSB8fCB0aGlzLmZhZGVFbmRUaW1lICYmIGUgPCB0aGlzLmZhZGVFbmRUaW1lIHx8ICh0aGlzLmZhZGVFbmRUaW1lID0gZSk7XG4gICAgfSwgYXAucHJvdG90eXBlLndhc1JlcXVlc3RlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBcImVycm9yZWRcIiA9PT0gdGhpcy5zdGF0ZSB8fCBcImxvYWRlZFwiID09PSB0aGlzLnN0YXRlIHx8IFwicmVsb2FkaW5nXCIgPT09IHRoaXMuc3RhdGU7XG4gICAgfSwgYXAucHJvdG90eXBlLmxvYWRWZWN0b3JEYXRhID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgIGlmICh0aGlzLmhhc0RhdGEoKSAmJiB0aGlzLnVubG9hZFZlY3RvckRhdGEoKSwgdGhpcy5zdGF0ZSA9IFwibG9hZGVkXCIsIHQpIHtcbiAgICAgICAgZm9yICh2YXIgbiBpbiB0LmZlYXR1cmVJbmRleCAmJiAodGhpcy5sYXRlc3RGZWF0dXJlSW5kZXggPSB0LmZlYXR1cmVJbmRleCwgdC5yYXdUaWxlRGF0YSA/ICh0aGlzLmxhdGVzdFJhd1RpbGVEYXRhID0gdC5yYXdUaWxlRGF0YSwgdGhpcy5sYXRlc3RGZWF0dXJlSW5kZXgucmF3VGlsZURhdGEgPSB0LnJhd1RpbGVEYXRhKSA6IHRoaXMubGF0ZXN0UmF3VGlsZURhdGEgJiYgKHRoaXMubGF0ZXN0RmVhdHVyZUluZGV4LnJhd1RpbGVEYXRhID0gdGhpcy5sYXRlc3RSYXdUaWxlRGF0YSkpLCB0aGlzLmNvbGxpc2lvbkJveEFycmF5ID0gdC5jb2xsaXNpb25Cb3hBcnJheSwgdGhpcy5idWNrZXRzID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICB2YXIgciA9IHt9O1xuICAgICAgICAgIGlmICghZSkgcmV0dXJuIHI7XG5cbiAgICAgICAgICBmb3IgKHZhciBuID0gZnVuY3Rpb24gbigpIHtcbiAgICAgICAgICAgIHZhciB0ID0gYVtpXSxcbiAgICAgICAgICAgICAgICBuID0gdC5sYXllcklkcy5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGUuZ2V0TGF5ZXIodCk7XG4gICAgICAgICAgICB9KS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICAgICAgICAgIGlmICgwICE9PSBuLmxlbmd0aCkge1xuICAgICAgICAgICAgICB0LmxheWVycyA9IG4sIHQuc3RhdGVEZXBlbmRlbnRMYXllcklkcyAmJiAodC5zdGF0ZURlcGVuZGVudExheWVycyA9IHQuc3RhdGVEZXBlbmRlbnRMYXllcklkcy5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbi5maWx0ZXIoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBlLmlkID09PSB0O1xuICAgICAgICAgICAgICAgIH0pWzBdO1xuICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgZm9yICh2YXIgbyA9IDAsIHMgPSBuOyBvIDwgcy5sZW5ndGg7IG8gKz0gMSkge1xuICAgICAgICAgICAgICAgIHJbc1tvXS5pZF0gPSB0O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgaSA9IDAsIGEgPSB0OyBpIDwgYS5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgbigpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiByO1xuICAgICAgICB9KHQuYnVja2V0cywgZS5zdHlsZSksIHRoaXMuaGFzU3ltYm9sQnVja2V0cyA9ICExLCB0aGlzLmJ1Y2tldHMpIHtcbiAgICAgICAgICB2YXIgaSA9IHRoaXMuYnVja2V0c1tuXTtcblxuICAgICAgICAgIGlmIChpIGluc3RhbmNlb2YgdmwpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc1N5bWJvbEJ1Y2tldHMgPSAhMCwgIXIpIGJyZWFrO1xuICAgICAgICAgICAgaS5qdXN0UmVsb2FkZWQgPSAhMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oYXNSVExUZXh0ID0gITEsIHRoaXMuaGFzU3ltYm9sQnVja2V0cykgZm9yICh2YXIgYSBpbiB0aGlzLmJ1Y2tldHMpIHtcbiAgICAgICAgICB2YXIgbyA9IHRoaXMuYnVja2V0c1thXTtcblxuICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgdmwgJiYgby5oYXNSVExUZXh0KSB7XG4gICAgICAgICAgICB0aGlzLmhhc1JUTFRleHQgPSAhMCwgb2kuaXNMb2FkaW5nKCkgfHwgb2kuaXNMb2FkZWQoKSB8fCBcImRlZmVycmVkXCIgIT09IGlpKCkgfHwgYWkoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIHMgaW4gdGhpcy5xdWVyeVBhZGRpbmcgPSAwLCB0aGlzLmJ1Y2tldHMpIHtcbiAgICAgICAgICB2YXIgdSA9IHRoaXMuYnVja2V0c1tzXTtcbiAgICAgICAgICB0aGlzLnF1ZXJ5UGFkZGluZyA9IE1hdGgubWF4KHRoaXMucXVlcnlQYWRkaW5nLCBlLnN0eWxlLmdldExheWVyKHMpLnF1ZXJ5UmFkaXVzKHUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHQuaW1hZ2VBdGxhcyAmJiAodGhpcy5pbWFnZUF0bGFzID0gdC5pbWFnZUF0bGFzKSwgdC5nbHlwaEF0bGFzSW1hZ2UgJiYgKHRoaXMuZ2x5cGhBdGxhc0ltYWdlID0gdC5nbHlwaEF0bGFzSW1hZ2UpO1xuICAgICAgfSBlbHNlIHRoaXMuY29sbGlzaW9uQm94QXJyYXkgPSBuZXcgJGkoKTtcbiAgICB9LCBhcC5wcm90b3R5cGUudW5sb2FkVmVjdG9yRGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIHQgaW4gdGhpcy5idWNrZXRzKSB7XG4gICAgICAgIHRoaXMuYnVja2V0c1t0XS5kZXN0cm95KCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYnVja2V0cyA9IHt9LCB0aGlzLmltYWdlQXRsYXNUZXh0dXJlICYmIHRoaXMuaW1hZ2VBdGxhc1RleHR1cmUuZGVzdHJveSgpLCB0aGlzLmltYWdlQXRsYXMgJiYgKHRoaXMuaW1hZ2VBdGxhcyA9IG51bGwpLCB0aGlzLmdseXBoQXRsYXNUZXh0dXJlICYmIHRoaXMuZ2x5cGhBdGxhc1RleHR1cmUuZGVzdHJveSgpLCB0aGlzLmxhdGVzdEZlYXR1cmVJbmRleCA9IG51bGwsIHRoaXMuc3RhdGUgPSBcInVubG9hZGVkXCI7XG4gICAgfSwgYXAucHJvdG90eXBlLmdldEJ1Y2tldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gdGhpcy5idWNrZXRzW3QuaWRdO1xuICAgIH0sIGFwLnByb3RvdHlwZS51cGxvYWQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZm9yICh2YXIgZSBpbiB0aGlzLmJ1Y2tldHMpIHtcbiAgICAgICAgdmFyIHIgPSB0aGlzLmJ1Y2tldHNbZV07XG4gICAgICAgIHIudXBsb2FkUGVuZGluZygpICYmIHIudXBsb2FkKHQpO1xuICAgICAgfVxuXG4gICAgICB2YXIgbiA9IHQuZ2w7XG4gICAgICB0aGlzLmltYWdlQXRsYXMgJiYgIXRoaXMuaW1hZ2VBdGxhcy51cGxvYWRlZCAmJiAodGhpcy5pbWFnZUF0bGFzVGV4dHVyZSA9IG5ldyBUbCh0LCB0aGlzLmltYWdlQXRsYXMuaW1hZ2UsIG4uUkdCQSksIHRoaXMuaW1hZ2VBdGxhcy51cGxvYWRlZCA9ICEwKSwgdGhpcy5nbHlwaEF0bGFzSW1hZ2UgJiYgKHRoaXMuZ2x5cGhBdGxhc1RleHR1cmUgPSBuZXcgVGwodCwgdGhpcy5nbHlwaEF0bGFzSW1hZ2UsIG4uQUxQSEEpLCB0aGlzLmdseXBoQXRsYXNJbWFnZSA9IG51bGwpO1xuICAgIH0sIGFwLnByb3RvdHlwZS5wcmVwYXJlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHRoaXMuaW1hZ2VBdGxhcyAmJiB0aGlzLmltYWdlQXRsYXMucGF0Y2hVcGRhdGVkSW1hZ2VzKHQsIHRoaXMuaW1hZ2VBdGxhc1RleHR1cmUpO1xuICAgIH0sIGFwLnByb3RvdHlwZS5xdWVyeVJlbmRlcmVkRmVhdHVyZXMgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSwgYSwgbywgcywgdSwgbCkge1xuICAgICAgcmV0dXJuIHRoaXMubGF0ZXN0RmVhdHVyZUluZGV4ICYmIHRoaXMubGF0ZXN0RmVhdHVyZUluZGV4LnJhd1RpbGVEYXRhID8gdGhpcy5sYXRlc3RGZWF0dXJlSW5kZXgucXVlcnkoe1xuICAgICAgICBxdWVyeUdlb21ldHJ5OiBuLFxuICAgICAgICBjYW1lcmFRdWVyeUdlb21ldHJ5OiBpLFxuICAgICAgICBzY2FsZTogYSxcbiAgICAgICAgdGlsZVNpemU6IHRoaXMudGlsZVNpemUsXG4gICAgICAgIHBpeGVsUG9zTWF0cml4OiBsLFxuICAgICAgICB0cmFuc2Zvcm06IHMsXG4gICAgICAgIHBhcmFtczogbyxcbiAgICAgICAgcXVlcnlQYWRkaW5nOiB0aGlzLnF1ZXJ5UGFkZGluZyAqIHVcbiAgICAgIH0sIHQsIGUsIHIpIDoge307XG4gICAgfSwgYXAucHJvdG90eXBlLnF1ZXJ5U291cmNlRmVhdHVyZXMgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgdmFyIHIgPSB0aGlzLmxhdGVzdEZlYXR1cmVJbmRleDtcblxuICAgICAgaWYgKHIgJiYgci5yYXdUaWxlRGF0YSkge1xuICAgICAgICB2YXIgbiA9IHIubG9hZFZUTGF5ZXJzKCksXG4gICAgICAgICAgICBpID0gZSA/IGUuc291cmNlTGF5ZXIgOiBcIlwiLFxuICAgICAgICAgICAgYSA9IG4uX2dlb2pzb25UaWxlTGF5ZXIgfHwgbltpXTtcbiAgICAgICAgaWYgKGEpIGZvciAodmFyIG8gPSBvbihlICYmIGUuZmlsdGVyKSwgcyA9IHRoaXMudGlsZUlELmNhbm9uaWNhbCwgdSA9IHMueiwgbCA9IHMueCwgcCA9IHMueSwgYyA9IHtcbiAgICAgICAgICB6OiB1LFxuICAgICAgICAgIHg6IGwsXG4gICAgICAgICAgeTogcFxuICAgICAgICB9LCBoID0gMDsgaCA8IGEubGVuZ3RoOyBoKyspIHtcbiAgICAgICAgICB2YXIgZiA9IGEuZmVhdHVyZShoKTtcblxuICAgICAgICAgIGlmIChvLm5lZWRHZW9tZXRyeSkge1xuICAgICAgICAgICAgdmFyIHkgPSBVYShmLCAhMCk7XG4gICAgICAgICAgICBpZiAoIW8uZmlsdGVyKG5ldyBzaSh0aGlzLnRpbGVJRC5vdmVyc2NhbGVkWiksIHksIHRoaXMudGlsZUlELmNhbm9uaWNhbCkpIGNvbnRpbnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIW8uZmlsdGVyKG5ldyBzaSh0aGlzLnRpbGVJRC5vdmVyc2NhbGVkWiksIGYpKSBjb250aW51ZTtcblxuICAgICAgICAgIHZhciBkID0gci5nZXRJZChmLCBpKSxcbiAgICAgICAgICAgICAgbSA9IG5ldyBXbChmLCB1LCBsLCBwLCBkKTtcbiAgICAgICAgICBtLnRpbGUgPSBjLCB0LnB1c2gobSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBhcC5wcm90b3R5cGUuaGFzRGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBcImxvYWRlZFwiID09PSB0aGlzLnN0YXRlIHx8IFwicmVsb2FkaW5nXCIgPT09IHRoaXMuc3RhdGUgfHwgXCJleHBpcmVkXCIgPT09IHRoaXMuc3RhdGU7XG4gICAgfSwgYXAucHJvdG90eXBlLnBhdHRlcm5zTG9hZGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW1hZ2VBdGxhcyAmJiAhIU9iamVjdC5rZXlzKHRoaXMuaW1hZ2VBdGxhcy5wYXR0ZXJuUG9zaXRpb25zKS5sZW5ndGg7XG4gICAgfSwgYXAucHJvdG90eXBlLnNldEV4cGlyeURhdGEgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGUgPSB0aGlzLmV4cGlyYXRpb25UaW1lO1xuXG4gICAgICBpZiAodC5jYWNoZUNvbnRyb2wpIHtcbiAgICAgICAgdmFyIHIgPSB6KHQuY2FjaGVDb250cm9sKTtcbiAgICAgICAgcltcIm1heC1hZ2VcIl0gJiYgKHRoaXMuZXhwaXJhdGlvblRpbWUgPSBEYXRlLm5vdygpICsgMWUzICogcltcIm1heC1hZ2VcIl0pO1xuICAgICAgfSBlbHNlIHQuZXhwaXJlcyAmJiAodGhpcy5leHBpcmF0aW9uVGltZSA9IG5ldyBEYXRlKHQuZXhwaXJlcykuZ2V0VGltZSgpKTtcblxuICAgICAgaWYgKHRoaXMuZXhwaXJhdGlvblRpbWUpIHtcbiAgICAgICAgdmFyIG4gPSBEYXRlLm5vdygpLFxuICAgICAgICAgICAgaSA9ICExO1xuICAgICAgICBpZiAodGhpcy5leHBpcmF0aW9uVGltZSA+IG4pIGkgPSAhMTtlbHNlIGlmIChlKSB7XG4gICAgICAgICAgaWYgKHRoaXMuZXhwaXJhdGlvblRpbWUgPCBlKSBpID0gITA7ZWxzZSB7XG4gICAgICAgICAgICB2YXIgYSA9IHRoaXMuZXhwaXJhdGlvblRpbWUgLSBlO1xuICAgICAgICAgICAgYSA/IHRoaXMuZXhwaXJhdGlvblRpbWUgPSBuICsgTWF0aC5tYXgoYSwgM2U0KSA6IGkgPSAhMDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpID0gITA7XG4gICAgICAgIGkgPyAodGhpcy5leHBpcmVkUmVxdWVzdENvdW50KyssIHRoaXMuc3RhdGUgPSBcImV4cGlyZWRcIikgOiB0aGlzLmV4cGlyZWRSZXF1ZXN0Q291bnQgPSAwO1xuICAgICAgfVxuICAgIH0sIGFwLnByb3RvdHlwZS5nZXRFeHBpcnlUaW1lb3V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHRoaXMuZXhwaXJhdGlvblRpbWUpIHJldHVybiB0aGlzLmV4cGlyZWRSZXF1ZXN0Q291bnQgPyAxZTMgKiAoMSA8PCBNYXRoLm1pbih0aGlzLmV4cGlyZWRSZXF1ZXN0Q291bnQgLSAxLCAzMSkpIDogTWF0aC5taW4odGhpcy5leHBpcmF0aW9uVGltZSAtIG5ldyBEYXRlKCkuZ2V0VGltZSgpLCBNYXRoLnBvdygyLCAzMSkgLSAxKTtcbiAgICB9LCBhcC5wcm90b3R5cGUuc2V0RmVhdHVyZVN0YXRlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIGlmICh0aGlzLmxhdGVzdEZlYXR1cmVJbmRleCAmJiB0aGlzLmxhdGVzdEZlYXR1cmVJbmRleC5yYXdUaWxlRGF0YSAmJiAwICE9PSBPYmplY3Qua2V5cyh0KS5sZW5ndGgpIHtcbiAgICAgICAgdmFyIHIgPSB0aGlzLmxhdGVzdEZlYXR1cmVJbmRleC5sb2FkVlRMYXllcnMoKTtcblxuICAgICAgICBmb3IgKHZhciBuIGluIHRoaXMuYnVja2V0cykge1xuICAgICAgICAgIGlmIChlLnN0eWxlLmhhc0xheWVyKG4pKSB7XG4gICAgICAgICAgICB2YXIgaSA9IHRoaXMuYnVja2V0c1tuXSxcbiAgICAgICAgICAgICAgICBhID0gaS5sYXllcnNbMF0uc291cmNlTGF5ZXIgfHwgXCJfZ2VvanNvblRpbGVMYXllclwiLFxuICAgICAgICAgICAgICAgIG8gPSByW2FdLFxuICAgICAgICAgICAgICAgIHMgPSB0W2FdO1xuXG4gICAgICAgICAgICBpZiAobyAmJiBzICYmIDAgIT09IE9iamVjdC5rZXlzKHMpLmxlbmd0aCkge1xuICAgICAgICAgICAgICBpLnVwZGF0ZShzLCBvLCB0aGlzLmltYWdlQXRsYXMgJiYgdGhpcy5pbWFnZUF0bGFzLnBhdHRlcm5Qb3NpdGlvbnMgfHwge30pO1xuICAgICAgICAgICAgICB2YXIgdSA9IGUgJiYgZS5zdHlsZSAmJiBlLnN0eWxlLmdldExheWVyKG4pO1xuICAgICAgICAgICAgICB1ICYmICh0aGlzLnF1ZXJ5UGFkZGluZyA9IE1hdGgubWF4KHRoaXMucXVlcnlQYWRkaW5nLCB1LnF1ZXJ5UmFkaXVzKGkpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgYXAucHJvdG90eXBlLmhvbGRpbmdGb3JGYWRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gdGhpcy5zeW1ib2xGYWRlSG9sZFVudGlsO1xuICAgIH0sIGFwLnByb3RvdHlwZS5zeW1ib2xGYWRlRmluaXNoZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gIXRoaXMuc3ltYm9sRmFkZUhvbGRVbnRpbCB8fCB0aGlzLnN5bWJvbEZhZGVIb2xkVW50aWwgPCBPLm5vdygpO1xuICAgIH0sIGFwLnByb3RvdHlwZS5jbGVhckZhZGVIb2xkID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5zeW1ib2xGYWRlSG9sZFVudGlsID0gdm9pZCAwO1xuICAgIH0sIGFwLnByb3RvdHlwZS5zZXRIb2xkRHVyYXRpb24gPSBmdW5jdGlvbiAodCkge1xuICAgICAgdGhpcy5zeW1ib2xGYWRlSG9sZFVudGlsID0gTy5ub3coKSArIHQ7XG4gICAgfSwgYXAucHJvdG90eXBlLnNldERlcGVuZGVuY2llcyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICBmb3IgKHZhciByID0ge30sIG4gPSAwLCBpID0gZTsgbiA8IGkubGVuZ3RoOyBuICs9IDEpIHtcbiAgICAgICAgcltpW25dXSA9ICEwO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmRlcGVuZGVuY2llc1t0XSA9IHI7XG4gICAgfSwgYXAucHJvdG90eXBlLmhhc0RlcGVuZGVuY3kgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgZm9yICh2YXIgciA9IDAsIG4gPSB0OyByIDwgbi5sZW5ndGg7IHIgKz0gMSkge1xuICAgICAgICB2YXIgaSA9IHRoaXMuZGVwZW5kZW5jaWVzW25bcl1dO1xuICAgICAgICBpZiAoaSkgZm9yICh2YXIgYSA9IDAsIG8gPSBlOyBhIDwgby5sZW5ndGg7IGEgKz0gMSkge1xuICAgICAgICAgIGlmIChpW29bYV1dKSByZXR1cm4gITA7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuICExO1xuICAgIH07XG5cbiAgICB2YXIgb3AgPSBvLnBlcmZvcm1hbmNlLFxuICAgICAgICBzcCA9IGZ1bmN0aW9uIHNwKHQpIHtcbiAgICAgIHRoaXMuX21hcmtzID0ge1xuICAgICAgICBzdGFydDogW3QudXJsLCBcInN0YXJ0XCJdLmpvaW4oXCIjXCIpLFxuICAgICAgICBlbmQ6IFt0LnVybCwgXCJlbmRcIl0uam9pbihcIiNcIiksXG4gICAgICAgIG1lYXN1cmU6IHQudXJsLnRvU3RyaW5nKClcbiAgICAgIH0sIG9wLm1hcmsodGhpcy5fbWFya3Muc3RhcnQpO1xuICAgIH07XG5cbiAgICBzcC5wcm90b3R5cGUuZmluaXNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgb3AubWFyayh0aGlzLl9tYXJrcy5lbmQpO1xuICAgICAgdmFyIHQgPSBvcC5nZXRFbnRyaWVzQnlOYW1lKHRoaXMuX21hcmtzLm1lYXN1cmUpO1xuICAgICAgcmV0dXJuIDAgPT09IHQubGVuZ3RoICYmIChvcC5tZWFzdXJlKHRoaXMuX21hcmtzLm1lYXN1cmUsIHRoaXMuX21hcmtzLnN0YXJ0LCB0aGlzLl9tYXJrcy5lbmQpLCB0ID0gb3AuZ2V0RW50cmllc0J5TmFtZSh0aGlzLl9tYXJrcy5tZWFzdXJlKSwgb3AuY2xlYXJNYXJrcyh0aGlzLl9tYXJrcy5zdGFydCksIG9wLmNsZWFyTWFya3ModGhpcy5fbWFya3MuZW5kKSwgb3AuY2xlYXJNZWFzdXJlcyh0aGlzLl9tYXJrcy5tZWFzdXJlKSksIHQ7XG4gICAgfSwgdC5BY3RvciA9IEZsLCB0LkFscGhhSW1hZ2UgPSBnbywgdC5DYW5vbmljYWxUaWxlSUQgPSBabCwgdC5Db2xsaXNpb25Cb3hBcnJheSA9ICRpLCB0LkNvbG9yID0gdGUsIHQuREVNRGF0YSA9IFlsLCB0LkRhdGFDb25zdGFudFByb3BlcnR5ID0gbWksIHQuRGljdGlvbmFyeUNvZGVyID0gJGwsIHQuRVhURU5UID0gODE5MiwgdC5FcnJvckV2ZW50ID0genQsIHQuRXZhbHVhdGlvblBhcmFtZXRlcnMgPSBzaSwgdC5FdmVudCA9IEl0LCB0LkV2ZW50ZWQgPSBDdCwgdC5GZWF0dXJlSW5kZXggPSBlcCwgdC5GaWxsQnVja2V0ID0gc3MsIHQuRmlsbEV4dHJ1c2lvbkJ1Y2tldCA9IFNzLCB0LkltYWdlQXRsYXMgPSBidSwgdC5JbWFnZVBvc2l0aW9uID0gZ3UsIHQuTGluZUJ1Y2tldCA9IEZzLCB0LkxuZ0xhdCA9IE9sLCB0LkxuZ0xhdEJvdW5kcyA9IExsLCB0Lk1lcmNhdG9yQ29vcmRpbmF0ZSA9IEdsLCB0Lk9ORV9FTSA9IDI0LCB0Lk92ZXJzY2FsZWRUaWxlSUQgPSBKbCwgdC5Qb2ludCA9IGksIHQuUG9pbnQkMSA9IGksIHQuUHJvcGVydGllcyA9IHdpLCB0LlByb3RvYnVmID0gWXMsIHQuUkdCQUltYWdlID0geG8sIHQuUmVxdWVzdE1hbmFnZXIgPSBHLCB0LlJlcXVlc3RQZXJmb3JtYW5jZSA9IHNwLCB0LlJlc291cmNlVHlwZSA9IHl0LCB0LlNlZ21lbnRWZWN0b3IgPSBzYSwgdC5Tb3VyY2VGZWF0dXJlU3RhdGUgPSB0cCwgdC5TdHJ1Y3RBcnJheUxheW91dDF1aTIgPSBKaSwgdC5TdHJ1Y3RBcnJheUxheW91dDJmMWYyaTE2ID0gUmksIHQuU3RydWN0QXJyYXlMYXlvdXQyaTQgPSBDaSwgdC5TdHJ1Y3RBcnJheUxheW91dDN1aTYgPSBqaSwgdC5TdHJ1Y3RBcnJheUxheW91dDRpOCA9IEVpLCB0LlN5bWJvbEJ1Y2tldCA9IHZsLCB0LlRleHR1cmUgPSBUbCwgdC5UaWxlID0gYXAsIHQuVHJhbnNpdGlvbmFibGUgPSBwaSwgdC5Vbmlmb3JtMWYgPSBiYSwgdC5Vbmlmb3JtMWkgPSB4YSwgdC5Vbmlmb3JtMmYgPSB3YSwgdC5Vbmlmb3JtM2YgPSBfYSwgdC5Vbmlmb3JtNGYgPSBBYSwgdC5Vbmlmb3JtQ29sb3IgPSBTYSwgdC5Vbmlmb3JtTWF0cml4NGYgPSBJYSwgdC5VbndyYXBwZWRUaWxlSUQgPSBYbCwgdC5WYWxpZGF0aW9uRXJyb3IgPSBQdCwgdC5Xcml0aW5nTW9kZSA9IHd1LCB0Llpvb21IaXN0b3J5ID0gS24sIHQuYWRkID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgIHJldHVybiB0WzBdID0gZVswXSArIHJbMF0sIHRbMV0gPSBlWzFdICsgclsxXSwgdFsyXSA9IGVbMl0gKyByWzJdLCB0O1xuICAgIH0sIHQuYWRkRHluYW1pY0F0dHJpYnV0ZXMgPSBmbCwgdC5hc3luY0FsbCA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICBpZiAoIXQubGVuZ3RoKSByZXR1cm4gcihudWxsLCBbXSk7XG4gICAgICB2YXIgbiA9IHQubGVuZ3RoLFxuICAgICAgICAgIGkgPSBuZXcgQXJyYXkodC5sZW5ndGgpLFxuICAgICAgICAgIGEgPSBudWxsO1xuICAgICAgdC5mb3JFYWNoKGZ1bmN0aW9uICh0LCBvKSB7XG4gICAgICAgIGUodCwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICB0ICYmIChhID0gdCksIGlbb10gPSBlLCAwID09IC0tbiAmJiByKGEsIGkpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0sIHQuYmV6aWVyID0gdSwgdC5iaW5kQWxsID0gdiwgdC5icm93c2VyID0gTywgdC5jYWNoZUVudHJ5UG9zc2libHlBZGRlZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICArK2h0ID4gdXQgJiYgKHQuZ2V0QWN0b3IoKS5zZW5kKFwiZW5mb3JjZUNhY2hlU2l6ZUxpbWl0XCIsIHN0KSwgaHQgPSAwKTtcbiAgICB9LCB0LmNsYW1wID0gcCwgdC5jbGVhclRpbGVDYWNoZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2YXIgZSA9IG8uY2FjaGVzLmRlbGV0ZShcIm1hcGJveC10aWxlc1wiKTtcbiAgICAgIHQgJiYgZS5jYXRjaCh0KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHQoKTtcbiAgICAgIH0pO1xuICAgIH0sIHQuY2xpcExpbmUgPSBadSwgdC5jbG9uZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2YXIgZSA9IG5ldyBhbygxNik7XG4gICAgICByZXR1cm4gZVswXSA9IHRbMF0sIGVbMV0gPSB0WzFdLCBlWzJdID0gdFsyXSwgZVszXSA9IHRbM10sIGVbNF0gPSB0WzRdLCBlWzVdID0gdFs1XSwgZVs2XSA9IHRbNl0sIGVbN10gPSB0WzddLCBlWzhdID0gdFs4XSwgZVs5XSA9IHRbOV0sIGVbMTBdID0gdFsxMF0sIGVbMTFdID0gdFsxMV0sIGVbMTJdID0gdFsxMl0sIGVbMTNdID0gdFsxM10sIGVbMTRdID0gdFsxNF0sIGVbMTVdID0gdFsxNV0sIGU7XG4gICAgfSwgdC5jbG9uZSQxID0gdywgdC5jbG9uZSQyID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHZhciBlID0gbmV3IGFvKDMpO1xuICAgICAgcmV0dXJuIGVbMF0gPSB0WzBdLCBlWzFdID0gdFsxXSwgZVsyXSA9IHRbMl0sIGU7XG4gICAgfSwgdC5jb2xsaXNpb25DaXJjbGVMYXlvdXQgPSBHcywgdC5jb25maWcgPSBSLCB0LmNyZWF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0ID0gbmV3IGFvKDE2KTtcbiAgICAgIHJldHVybiBhbyAhPSBGbG9hdDMyQXJyYXkgJiYgKHRbMV0gPSAwLCB0WzJdID0gMCwgdFszXSA9IDAsIHRbNF0gPSAwLCB0WzZdID0gMCwgdFs3XSA9IDAsIHRbOF0gPSAwLCB0WzldID0gMCwgdFsxMV0gPSAwLCB0WzEyXSA9IDAsIHRbMTNdID0gMCwgdFsxNF0gPSAwKSwgdFswXSA9IDEsIHRbNV0gPSAxLCB0WzEwXSA9IDEsIHRbMTVdID0gMSwgdDtcbiAgICB9LCB0LmNyZWF0ZSQxID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHQgPSBuZXcgYW8oOSk7XG4gICAgICByZXR1cm4gYW8gIT0gRmxvYXQzMkFycmF5ICYmICh0WzFdID0gMCwgdFsyXSA9IDAsIHRbM10gPSAwLCB0WzVdID0gMCwgdFs2XSA9IDAsIHRbN10gPSAwKSwgdFswXSA9IDEsIHRbNF0gPSAxLCB0WzhdID0gMSwgdDtcbiAgICB9LCB0LmNyZWF0ZSQyID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHQgPSBuZXcgYW8oNCk7XG4gICAgICByZXR1cm4gYW8gIT0gRmxvYXQzMkFycmF5ICYmICh0WzFdID0gMCwgdFsyXSA9IDApLCB0WzBdID0gMSwgdFszXSA9IDEsIHQ7XG4gICAgfSwgdC5jcmVhdGVDb21tb25qc01vZHVsZSA9IGUsIHQuY3JlYXRlRXhwcmVzc2lvbiA9IFpyLCB0LmNyZWF0ZUxheW91dCA9IElpLCB0LmNyZWF0ZVN0eWxlTGF5ZXIgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIFwiY3VzdG9tXCIgPT09IHQudHlwZSA/IG5ldyBJbCh0KSA6IG5ldyB6bFt0LnR5cGVdKHQpO1xuICAgIH0sIHQuY3Jvc3MgPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgdmFyIG4gPSBlWzBdLFxuICAgICAgICAgIGkgPSBlWzFdLFxuICAgICAgICAgIGEgPSBlWzJdLFxuICAgICAgICAgIG8gPSByWzBdLFxuICAgICAgICAgIHMgPSByWzFdLFxuICAgICAgICAgIHUgPSByWzJdO1xuICAgICAgcmV0dXJuIHRbMF0gPSBpICogdSAtIGEgKiBzLCB0WzFdID0gYSAqIG8gLSBuICogdSwgdFsyXSA9IG4gKiBzIC0gaSAqIG8sIHQ7XG4gICAgfSwgdC5kZWVwRXF1YWwgPSBmdW5jdGlvbiB0KGUsIHIpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGUpKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShyKSB8fCBlLmxlbmd0aCAhPT0gci5sZW5ndGgpIHJldHVybiAhMTtcblxuICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IGUubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICBpZiAoIXQoZVtuXSwgcltuXSkpIHJldHVybiAhMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhMDtcbiAgICAgIH1cblxuICAgICAgaWYgKFwib2JqZWN0XCIgPT0gdHlwZW9mIGUgJiYgbnVsbCAhPT0gZSAmJiBudWxsICE9PSByKSB7XG4gICAgICAgIGlmIChcIm9iamVjdFwiICE9IHR5cGVvZiByKSByZXR1cm4gITE7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhlKS5sZW5ndGggIT09IE9iamVjdC5rZXlzKHIpLmxlbmd0aCkgcmV0dXJuICExO1xuXG4gICAgICAgIGZvciAodmFyIGkgaW4gZSkge1xuICAgICAgICAgIGlmICghdChlW2ldLCByW2ldKSkgcmV0dXJuICExO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICEwO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZSA9PT0gcjtcbiAgICB9LCB0LmRvdCA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICByZXR1cm4gdFswXSAqIGVbMF0gKyB0WzFdICogZVsxXSArIHRbMl0gKiBlWzJdO1xuICAgIH0sIHQuZG90JDEgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgcmV0dXJuIHRbMF0gKiBlWzBdICsgdFsxXSAqIGVbMV0gKyB0WzJdICogZVsyXSArIHRbM10gKiBlWzNdO1xuICAgIH0sIHQuZWFzZSA9IGwsIHQuZW1pdFZhbGlkYXRpb25FcnJvcnMgPSBCbiwgdC5lbmRzV2l0aCA9IGcsIHQuZW5mb3JjZUNhY2hlU2l6ZUxpbWl0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGx0KCksIHR0ICYmIHR0LnRoZW4oZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZS5rZXlzKCkudGhlbihmdW5jdGlvbiAocikge1xuICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgci5sZW5ndGggLSB0OyBuKyspIHtcbiAgICAgICAgICAgIGUuZGVsZXRlKHJbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9LCB0LmV2YWx1YXRlU2l6ZUZvckZlYXR1cmUgPSBMdSwgdC5ldmFsdWF0ZVNpemVGb3Jab29tID0gT3UsIHQuZXZhbHVhdGVWYXJpYWJsZU9mZnNldCA9IGFsLCB0LmV2ZW50ZWQgPSBuaSwgdC5leHRlbmQgPSBoLCB0LmZlYXR1cmVGaWx0ZXIgPSBvbiwgdC5maWx0ZXJPYmplY3QgPSBiLCB0LmZyb21Sb3RhdGlvbiA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB2YXIgciA9IE1hdGguc2luKGUpLFxuICAgICAgICAgIG4gPSBNYXRoLmNvcyhlKTtcbiAgICAgIHJldHVybiB0WzBdID0gbiwgdFsxXSA9IHIsIHRbMl0gPSAwLCB0WzNdID0gLXIsIHRbNF0gPSBuLCB0WzVdID0gMCwgdFs2XSA9IDAsIHRbN10gPSAwLCB0WzhdID0gMSwgdDtcbiAgICB9LCB0LmdldEFuY2hvckFsaWdubWVudCA9IEJ1LCB0LmdldEFuY2hvckp1c3RpZmljYXRpb24gPSBvbCwgdC5nZXRBcnJheUJ1ZmZlciA9IGJ0LCB0LmdldEltYWdlID0gQXQsIHQuZ2V0SlNPTiA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICByZXR1cm4geHQoaCh0LCB7XG4gICAgICAgIHR5cGU6IFwianNvblwiXG4gICAgICB9KSwgZSk7XG4gICAgfSwgdC5nZXRSVExUZXh0UGx1Z2luU3RhdHVzID0gaWksIHQuZ2V0UmVmZXJyZXIgPSBtdCwgdC5nZXRWaWRlbyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB2YXIgcixcbiAgICAgICAgICBuLFxuICAgICAgICAgIGkgPSBvLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ2aWRlb1wiKTtcbiAgICAgIGkubXV0ZWQgPSAhMCwgaS5vbmxvYWRzdGFydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZShudWxsLCBpKTtcbiAgICAgIH07XG5cbiAgICAgIGZvciAodmFyIGEgPSAwOyBhIDwgdC5sZW5ndGg7IGErKykge1xuICAgICAgICB2YXIgcyA9IG8uZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNvdXJjZVwiKTtcbiAgICAgICAgciA9IHRbYV0sIG4gPSB2b2lkIDAsIChuID0gby5kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKSkuaHJlZiA9IHIsIChuLnByb3RvY29sICE9PSBvLmRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sIHx8IG4uaG9zdCAhPT0gby5kb2N1bWVudC5sb2NhdGlvbi5ob3N0KSAmJiAoaS5jcm9zc09yaWdpbiA9IFwiQW5vbnltb3VzXCIpLCBzLnNyYyA9IHRbYV0sIGkuYXBwZW5kQ2hpbGQocyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNhbmNlbDogZnVuY3Rpb24gY2FuY2VsKCkge31cbiAgICAgIH07XG4gICAgfSwgdC5pZGVudGl0eSA9IG9vLCB0LmludmVydCA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB2YXIgciA9IGVbMF0sXG4gICAgICAgICAgbiA9IGVbMV0sXG4gICAgICAgICAgaSA9IGVbMl0sXG4gICAgICAgICAgYSA9IGVbM10sXG4gICAgICAgICAgbyA9IGVbNF0sXG4gICAgICAgICAgcyA9IGVbNV0sXG4gICAgICAgICAgdSA9IGVbNl0sXG4gICAgICAgICAgbCA9IGVbN10sXG4gICAgICAgICAgcCA9IGVbOF0sXG4gICAgICAgICAgYyA9IGVbOV0sXG4gICAgICAgICAgaCA9IGVbMTBdLFxuICAgICAgICAgIGYgPSBlWzExXSxcbiAgICAgICAgICB5ID0gZVsxMl0sXG4gICAgICAgICAgZCA9IGVbMTNdLFxuICAgICAgICAgIG0gPSBlWzE0XSxcbiAgICAgICAgICB2ID0gZVsxNV0sXG4gICAgICAgICAgZyA9IHIgKiBzIC0gbiAqIG8sXG4gICAgICAgICAgeCA9IHIgKiB1IC0gaSAqIG8sXG4gICAgICAgICAgYiA9IHIgKiBsIC0gYSAqIG8sXG4gICAgICAgICAgdyA9IG4gKiB1IC0gaSAqIHMsXG4gICAgICAgICAgXyA9IG4gKiBsIC0gYSAqIHMsXG4gICAgICAgICAgQSA9IGkgKiBsIC0gYSAqIHUsXG4gICAgICAgICAgUyA9IHAgKiBkIC0gYyAqIHksXG4gICAgICAgICAgayA9IHAgKiBtIC0gaCAqIHksXG4gICAgICAgICAgSSA9IHAgKiB2IC0gZiAqIHksXG4gICAgICAgICAgeiA9IGMgKiBtIC0gaCAqIGQsXG4gICAgICAgICAgQyA9IGMgKiB2IC0gZiAqIGQsXG4gICAgICAgICAgRSA9IGggKiB2IC0gZiAqIG0sXG4gICAgICAgICAgUCA9IGcgKiBFIC0geCAqIEMgKyBiICogeiArIHcgKiBJIC0gXyAqIGsgKyBBICogUztcblxuICAgICAgcmV0dXJuIFAgPyAodFswXSA9IChzICogRSAtIHUgKiBDICsgbCAqIHopICogKFAgPSAxIC8gUCksIHRbMV0gPSAoaSAqIEMgLSBuICogRSAtIGEgKiB6KSAqIFAsIHRbMl0gPSAoZCAqIEEgLSBtICogXyArIHYgKiB3KSAqIFAsIHRbM10gPSAoaCAqIF8gLSBjICogQSAtIGYgKiB3KSAqIFAsIHRbNF0gPSAodSAqIEkgLSBvICogRSAtIGwgKiBrKSAqIFAsIHRbNV0gPSAociAqIEUgLSBpICogSSArIGEgKiBrKSAqIFAsIHRbNl0gPSAobSAqIGIgLSB5ICogQSAtIHYgKiB4KSAqIFAsIHRbN10gPSAocCAqIEEgLSBoICogYiArIGYgKiB4KSAqIFAsIHRbOF0gPSAobyAqIEMgLSBzICogSSArIGwgKiBTKSAqIFAsIHRbOV0gPSAobiAqIEkgLSByICogQyAtIGEgKiBTKSAqIFAsIHRbMTBdID0gKHkgKiBfIC0gZCAqIGIgKyB2ICogZykgKiBQLCB0WzExXSA9IChjICogYiAtIHAgKiBfIC0gZiAqIGcpICogUCwgdFsxMl0gPSAocyAqIGsgLSBvICogeiAtIHUgKiBTKSAqIFAsIHRbMTNdID0gKHIgKiB6IC0gbiAqIGsgKyBpICogUykgKiBQLCB0WzE0XSA9IChkICogeCAtIHkgKiB3IC0gbSAqIGcpICogUCwgdFsxNV0gPSAocCAqIHcgLSBjICogeCArIGggKiBnKSAqIFAsIHQpIDogbnVsbDtcbiAgICB9LCB0LmlzQ2hhciA9IEduLCB0LmlzTWFwYm94VVJMID0gWiwgdC5rZXlzRGlmZmVyZW5jZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB2YXIgciA9IFtdO1xuXG4gICAgICBmb3IgKHZhciBuIGluIHQpIHtcbiAgICAgICAgbiBpbiBlIHx8IHIucHVzaChuKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSwgdC5tYWtlUmVxdWVzdCA9IHh0LCB0Lm1hcE9iamVjdCA9IHgsIHQubWVyY2F0b3JYZnJvbUxuZyA9IGpsLCB0Lm1lcmNhdG9yWWZyb21MYXQgPSBxbCwgdC5tZXJjYXRvclpmcm9tQWx0aXR1ZGUgPSBObCwgdC5tdWwgPSBsbywgdC5tdWx0aXBseSA9IHNvLCB0Lm12dCA9IGJzLCB0Lm5leHRQb3dlck9mVHdvID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0IDw9IDEgPyAxIDogTWF0aC5wb3coMiwgTWF0aC5jZWlsKE1hdGgubG9nKHQpIC8gTWF0aC5MTjIpKTtcbiAgICB9LCB0Lm5vcm1hbGl6ZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB2YXIgciA9IGVbMF0sXG4gICAgICAgICAgbiA9IGVbMV0sXG4gICAgICAgICAgaSA9IGVbMl0sXG4gICAgICAgICAgYSA9IHIgKiByICsgbiAqIG4gKyBpICogaTtcbiAgICAgIHJldHVybiBhID4gMCAmJiAoYSA9IDEgLyBNYXRoLnNxcnQoYSkpLCB0WzBdID0gZVswXSAqIGEsIHRbMV0gPSBlWzFdICogYSwgdFsyXSA9IGVbMl0gKiBhLCB0O1xuICAgIH0sIHQubnVtYmVyID0gS2UsIHQub2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkID0gZnQsIHQub3J0aG8gPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSwgYSwgbykge1xuICAgICAgdmFyIHMgPSAxIC8gKGUgLSByKSxcbiAgICAgICAgICB1ID0gMSAvIChuIC0gaSksXG4gICAgICAgICAgbCA9IDEgLyAoYSAtIG8pO1xuICAgICAgcmV0dXJuIHRbMF0gPSAtMiAqIHMsIHRbMV0gPSAwLCB0WzJdID0gMCwgdFszXSA9IDAsIHRbNF0gPSAwLCB0WzVdID0gLTIgKiB1LCB0WzZdID0gMCwgdFs3XSA9IDAsIHRbOF0gPSAwLCB0WzldID0gMCwgdFsxMF0gPSAyICogbCwgdFsxMV0gPSAwLCB0WzEyXSA9IChlICsgcikgKiBzLCB0WzEzXSA9IChpICsgbikgKiB1LCB0WzE0XSA9IChvICsgYSkgKiBsLCB0WzE1XSA9IDEsIHQ7XG4gICAgfSwgdC5wYXJzZUdseXBoUEJGID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiBuZXcgWXModCkucmVhZEZpZWxkcyh5dSwgW10pO1xuICAgIH0sIHQucGJmID0gWXMsIHQucGVyZm9ybVN5bWJvbExheW91dCA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpLCBhLCBvKSB7XG4gICAgICB0LmNyZWF0ZUFycmF5cygpLCB0LnRpbGVQaXhlbFJhdGlvID0gODE5MiAvICg1MTIgKiB0Lm92ZXJzY2FsaW5nKSwgdC5jb21wYXJlVGV4dCA9IHt9LCB0Lmljb25zTmVlZExpbmVhciA9ICExO1xuICAgICAgdmFyIHMgPSB0LmxheWVyc1swXS5sYXlvdXQsXG4gICAgICAgICAgdSA9IHQubGF5ZXJzWzBdLl91bmV2YWx1YXRlZExheW91dC5fdmFsdWVzLFxuICAgICAgICAgIGwgPSB7fTtcblxuICAgICAgaWYgKFwiY29tcG9zaXRlXCIgPT09IHQudGV4dFNpemVEYXRhLmtpbmQpIHtcbiAgICAgICAgdmFyIHAgPSB0LnRleHRTaXplRGF0YSxcbiAgICAgICAgICAgIGMgPSBwLm1heFpvb207XG4gICAgICAgIGwuY29tcG9zaXRlVGV4dFNpemVzID0gW3VbXCJ0ZXh0LXNpemVcIl0ucG9zc2libHlFdmFsdWF0ZShuZXcgc2kocC5taW5ab29tKSwgbyksIHVbXCJ0ZXh0LXNpemVcIl0ucG9zc2libHlFdmFsdWF0ZShuZXcgc2koYyksIG8pXTtcbiAgICAgIH1cblxuICAgICAgaWYgKFwiY29tcG9zaXRlXCIgPT09IHQuaWNvblNpemVEYXRhLmtpbmQpIHtcbiAgICAgICAgdmFyIGggPSB0Lmljb25TaXplRGF0YSxcbiAgICAgICAgICAgIGYgPSBoLm1heFpvb207XG4gICAgICAgIGwuY29tcG9zaXRlSWNvblNpemVzID0gW3VbXCJpY29uLXNpemVcIl0ucG9zc2libHlFdmFsdWF0ZShuZXcgc2koaC5taW5ab29tKSwgbyksIHVbXCJpY29uLXNpemVcIl0ucG9zc2libHlFdmFsdWF0ZShuZXcgc2koZiksIG8pXTtcbiAgICAgIH1cblxuICAgICAgbC5sYXlvdXRUZXh0U2l6ZSA9IHVbXCJ0ZXh0LXNpemVcIl0ucG9zc2libHlFdmFsdWF0ZShuZXcgc2kodC56b29tICsgMSksIG8pLCBsLmxheW91dEljb25TaXplID0gdVtcImljb24tc2l6ZVwiXS5wb3NzaWJseUV2YWx1YXRlKG5ldyBzaSh0Lnpvb20gKyAxKSwgbyksIGwudGV4dE1heFNpemUgPSB1W1widGV4dC1zaXplXCJdLnBvc3NpYmx5RXZhbHVhdGUobmV3IHNpKDE4KSk7XG5cbiAgICAgIGZvciAodmFyIHkgPSAyNCAqIHMuZ2V0KFwidGV4dC1saW5lLWhlaWdodFwiKSwgZCA9IFwibWFwXCIgPT09IHMuZ2V0KFwidGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIikgJiYgXCJwb2ludFwiICE9PSBzLmdldChcInN5bWJvbC1wbGFjZW1lbnRcIiksIG0gPSBzLmdldChcInRleHQta2VlcC11cHJpZ2h0XCIpLCB2ID0gcy5nZXQoXCJ0ZXh0LXNpemVcIiksIGcgPSBmdW5jdGlvbiBnKCkge1xuICAgICAgICB2YXIgYSA9IGJbeF0sXG4gICAgICAgICAgICB1ID0gcy5nZXQoXCJ0ZXh0LWZvbnRcIikuZXZhbHVhdGUoYSwge30sIG8pLmpvaW4oXCIsXCIpLFxuICAgICAgICAgICAgcCA9IHYuZXZhbHVhdGUoYSwge30sIG8pLFxuICAgICAgICAgICAgYyA9IGwubGF5b3V0VGV4dFNpemUuZXZhbHVhdGUoYSwge30sIG8pLFxuICAgICAgICAgICAgaCA9IGwubGF5b3V0SWNvblNpemUuZXZhbHVhdGUoYSwge30sIG8pLFxuICAgICAgICAgICAgZiA9IHtcbiAgICAgICAgICBob3Jpem9udGFsOiB7fSxcbiAgICAgICAgICB2ZXJ0aWNhbDogdm9pZCAwXG4gICAgICAgIH0sXG4gICAgICAgICAgICBnID0gYS50ZXh0LFxuICAgICAgICAgICAgdyA9IFswLCAwXTtcblxuICAgICAgICBpZiAoZykge1xuICAgICAgICAgIHZhciBfID0gZy50b1N0cmluZygpLFxuICAgICAgICAgICAgICBTID0gMjQgKiBzLmdldChcInRleHQtbGV0dGVyLXNwYWNpbmdcIikuZXZhbHVhdGUoYSwge30sIG8pLFxuICAgICAgICAgICAgICBrID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGUgPSAwLCByID0gdDsgZSA8IHIubGVuZ3RoOyBlICs9IDEpIHtcbiAgICAgICAgICAgICAgaWYgKG4gPSByW2VdLmNoYXJDb2RlQXQoMCksIEduLkFyYWJpYyhuKSB8fCBHbltcIkFyYWJpYyBTdXBwbGVtZW50XCJdKG4pIHx8IEduW1wiQXJhYmljIEV4dGVuZGVkLUFcIl0obikgfHwgR25bXCJBcmFiaWMgUHJlc2VudGF0aW9uIEZvcm1zLUFcIl0obikgfHwgR25bXCJBcmFiaWMgUHJlc2VudGF0aW9uIEZvcm1zLUJcIl0obikpIHJldHVybiAhMTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIG47XG4gICAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgICAgfShfKSA/IFMgOiAwLFxuICAgICAgICAgICAgICBJID0gcy5nZXQoXCJ0ZXh0LWFuY2hvclwiKS5ldmFsdWF0ZShhLCB7fSwgbyksXG4gICAgICAgICAgICAgIHogPSBzLmdldChcInRleHQtdmFyaWFibGUtYW5jaG9yXCIpO1xuXG4gICAgICAgICAgaWYgKCF6KSB7XG4gICAgICAgICAgICB2YXIgQyA9IHMuZ2V0KFwidGV4dC1yYWRpYWwtb2Zmc2V0XCIpLmV2YWx1YXRlKGEsIHt9LCBvKTtcbiAgICAgICAgICAgIHcgPSBDID8gYWwoSSwgWzI0ICogQywgaWxdKSA6IHMuZ2V0KFwidGV4dC1vZmZzZXRcIikuZXZhbHVhdGUoYSwge30sIG8pLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICByZXR1cm4gMjQgKiB0O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIEUgPSBkID8gXCJjZW50ZXJcIiA6IHMuZ2V0KFwidGV4dC1qdXN0aWZ5XCIpLmV2YWx1YXRlKGEsIHt9LCBvKSxcbiAgICAgICAgICAgICAgUCA9IHMuZ2V0KFwic3ltYm9sLXBsYWNlbWVudFwiKSxcbiAgICAgICAgICAgICAgTSA9IFwicG9pbnRcIiA9PT0gUCA/IDI0ICogcy5nZXQoXCJ0ZXh0LW1heC13aWR0aFwiKS5ldmFsdWF0ZShhLCB7fSwgbykgOiAwLFxuICAgICAgICAgICAgICBCID0gZnVuY3Rpb24gQigpIHtcbiAgICAgICAgICAgIHQuYWxsb3dWZXJ0aWNhbFBsYWNlbWVudCAmJiBabihfKSAmJiAoZi52ZXJ0aWNhbCA9IFN1KGcsIGUsIHIsIGksIHUsIE0sIHksIEksIFwibGVmdFwiLCBrLCB3LCB3dS52ZXJ0aWNhbCwgITAsIFAsIGMsIHApKTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgaWYgKCFkICYmIHopIHtcbiAgICAgICAgICAgIGZvciAodmFyIFQgPSBcImF1dG9cIiA9PT0gRSA/IHoubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgIHJldHVybiBvbCh0KTtcbiAgICAgICAgICAgIH0pIDogW0VdLCBWID0gITEsIEYgPSAwOyBGIDwgVC5sZW5ndGg7IEYrKykge1xuICAgICAgICAgICAgICB2YXIgRCA9IFRbRl07XG4gICAgICAgICAgICAgIGlmICghZi5ob3Jpem9udGFsW0RdKSBpZiAoVikgZi5ob3Jpem9udGFsW0RdID0gZi5ob3Jpem9udGFsWzBdO2Vsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBMID0gU3UoZywgZSwgciwgaSwgdSwgTSwgeSwgXCJjZW50ZXJcIiwgRCwgaywgdywgd3UuaG9yaXpvbnRhbCwgITEsIFAsIGMsIHApO1xuICAgICAgICAgICAgICAgIEwgJiYgKGYuaG9yaXpvbnRhbFtEXSA9IEwsIFYgPSAxID09PSBMLnBvc2l0aW9uZWRMaW5lcy5sZW5ndGgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEIoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgXCJhdXRvXCIgPT09IEUgJiYgKEUgPSBvbChJKSk7XG4gICAgICAgICAgICB2YXIgTyA9IFN1KGcsIGUsIHIsIGksIHUsIE0sIHksIEksIEUsIGssIHcsIHd1Lmhvcml6b250YWwsICExLCBQLCBjLCBwKTtcbiAgICAgICAgICAgIE8gJiYgKGYuaG9yaXpvbnRhbFtFXSA9IE8pLCBCKCksIFpuKF8pICYmIGQgJiYgbSAmJiAoZi52ZXJ0aWNhbCA9IFN1KGcsIGUsIHIsIGksIHUsIE0sIHksIEksIEUsIGssIHcsIHd1LnZlcnRpY2FsLCAhMSwgUCwgYywgcCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBSID0gdm9pZCAwLFxuICAgICAgICAgICAgVSA9ICExO1xuXG4gICAgICAgIGlmIChhLmljb24gJiYgYS5pY29uLm5hbWUpIHtcbiAgICAgICAgICB2YXIgaiA9IG5bYS5pY29uLm5hbWVdO1xuICAgICAgICAgIGogJiYgKFIgPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgICAgICAgdmFyIG4gPSBCdShyKSxcbiAgICAgICAgICAgICAgICBpID0gZVswXSAtIHQuZGlzcGxheVNpemVbMF0gKiBuLmhvcml6b250YWxBbGlnbixcbiAgICAgICAgICAgICAgICBhID0gZVsxXSAtIHQuZGlzcGxheVNpemVbMV0gKiBuLnZlcnRpY2FsQWxpZ247XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBpbWFnZTogdCxcbiAgICAgICAgICAgICAgdG9wOiBhLFxuICAgICAgICAgICAgICBib3R0b206IGEgKyB0LmRpc3BsYXlTaXplWzFdLFxuICAgICAgICAgICAgICBsZWZ0OiBpLFxuICAgICAgICAgICAgICByaWdodDogaSArIHQuZGlzcGxheVNpemVbMF1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfShpW2EuaWNvbi5uYW1lXSwgcy5nZXQoXCJpY29uLW9mZnNldFwiKS5ldmFsdWF0ZShhLCB7fSwgbyksIHMuZ2V0KFwiaWNvbi1hbmNob3JcIikuZXZhbHVhdGUoYSwge30sIG8pKSwgVSA9IGouc2RmLCB2b2lkIDAgPT09IHQuc2RmSWNvbnMgPyB0LnNkZkljb25zID0gai5zZGYgOiB0LnNkZkljb25zICE9PSBqLnNkZiAmJiBBKFwiU3R5bGUgc2hlZXQgd2FybmluZzogQ2Fubm90IG1peCBTREYgYW5kIG5vbi1TREYgaWNvbnMgaW4gb25lIGJ1ZmZlclwiKSwgKGoucGl4ZWxSYXRpbyAhPT0gdC5waXhlbFJhdGlvIHx8IDAgIT09IHMuZ2V0KFwiaWNvbi1yb3RhdGVcIikuY29uc3RhbnRPcigxKSkgJiYgKHQuaWNvbnNOZWVkTGluZWFyID0gITApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBxID0gdWwoZi5ob3Jpem9udGFsKSB8fCBmLnZlcnRpY2FsO1xuICAgICAgICB0Lmljb25zSW5UZXh0ID0gISFxICYmIHEuaWNvbnNJblRleHQsIChxIHx8IFIpICYmIGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpLCBhLCBvLCBzLCB1LCBsLCBwKSB7XG4gICAgICAgICAgdmFyIGMgPSBhLnRleHRNYXhTaXplLmV2YWx1YXRlKGUsIHt9KTtcbiAgICAgICAgICB2b2lkIDAgPT09IGMgJiYgKGMgPSBvKTtcblxuICAgICAgICAgIHZhciBoLFxuICAgICAgICAgICAgICBmID0gdC5sYXllcnNbMF0ubGF5b3V0LFxuICAgICAgICAgICAgICB5ID0gZi5nZXQoXCJpY29uLW9mZnNldFwiKS5ldmFsdWF0ZShlLCB7fSwgcCksXG4gICAgICAgICAgICAgIGQgPSB1bChyLmhvcml6b250YWwpLFxuICAgICAgICAgICAgICBtID0gbyAvIDI0LFxuICAgICAgICAgICAgICB2ID0gdC50aWxlUGl4ZWxSYXRpbyAqIG0sXG4gICAgICAgICAgICAgIGcgPSB0LnRpbGVQaXhlbFJhdGlvICogYyAvIDI0LFxuICAgICAgICAgICAgICB4ID0gdC50aWxlUGl4ZWxSYXRpbyAqIHMsXG4gICAgICAgICAgICAgIGIgPSB0LnRpbGVQaXhlbFJhdGlvICogZi5nZXQoXCJzeW1ib2wtc3BhY2luZ1wiKSxcbiAgICAgICAgICAgICAgdyA9IGYuZ2V0KFwidGV4dC1wYWRkaW5nXCIpICogdC50aWxlUGl4ZWxSYXRpbyxcbiAgICAgICAgICAgICAgXyA9IGYuZ2V0KFwiaWNvbi1wYWRkaW5nXCIpICogdC50aWxlUGl4ZWxSYXRpbyxcbiAgICAgICAgICAgICAgUyA9IGYuZ2V0KFwidGV4dC1tYXgtYW5nbGVcIikgLyAxODAgKiBNYXRoLlBJLFxuICAgICAgICAgICAgICBrID0gXCJtYXBcIiA9PT0gZi5nZXQoXCJ0ZXh0LXJvdGF0aW9uLWFsaWdubWVudFwiKSAmJiBcInBvaW50XCIgIT09IGYuZ2V0KFwic3ltYm9sLXBsYWNlbWVudFwiKSxcbiAgICAgICAgICAgICAgSSA9IFwibWFwXCIgPT09IGYuZ2V0KFwiaWNvbi1yb3RhdGlvbi1hbGlnbm1lbnRcIikgJiYgXCJwb2ludFwiICE9PSBmLmdldChcInN5bWJvbC1wbGFjZW1lbnRcIiksXG4gICAgICAgICAgICAgIHogPSBmLmdldChcInN5bWJvbC1wbGFjZW1lbnRcIiksXG4gICAgICAgICAgICAgIEMgPSBiIC8gMixcbiAgICAgICAgICAgICAgRSA9IGYuZ2V0KFwiaWNvbi10ZXh0LWZpdFwiKTtcblxuICAgICAgICAgIG4gJiYgXCJub25lXCIgIT09IEUgJiYgKHQuYWxsb3dWZXJ0aWNhbFBsYWNlbWVudCAmJiByLnZlcnRpY2FsICYmIChoID0gVnUobiwgci52ZXJ0aWNhbCwgRSwgZi5nZXQoXCJpY29uLXRleHQtZml0LXBhZGRpbmdcIiksIHksIG0pKSwgZCAmJiAobiA9IFZ1KG4sIGQsIEUsIGYuZ2V0KFwiaWNvbi10ZXh0LWZpdC1wYWRkaW5nXCIpLCB5LCBtKSkpO1xuXG4gICAgICAgICAgdmFyIFAgPSBmdW5jdGlvbiBQKHMsIGMpIHtcbiAgICAgICAgICAgIGMueCA8IDAgfHwgYy54ID49IDgxOTIgfHwgYy55IDwgMCB8fCBjLnkgPj0gODE5MiB8fCBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSwgYSwgbywgcywgdSwgbCwgcCwgYywgaCwgZiwgeSwgZCwgbSwgdiwgZywgeCwgYiwgdywgXywgUywgaykge1xuICAgICAgICAgICAgICB2YXIgSSxcbiAgICAgICAgICAgICAgICAgIHosXG4gICAgICAgICAgICAgICAgICBDLFxuICAgICAgICAgICAgICAgICAgRSxcbiAgICAgICAgICAgICAgICAgIFAsXG4gICAgICAgICAgICAgICAgICBNID0gdC5hZGRUb0xpbmVWZXJ0ZXhBcnJheShlLCByKSxcbiAgICAgICAgICAgICAgICAgIEIgPSAwLFxuICAgICAgICAgICAgICAgICAgVCA9IDAsXG4gICAgICAgICAgICAgICAgICBWID0gMCxcbiAgICAgICAgICAgICAgICAgIEYgPSAwLFxuICAgICAgICAgICAgICAgICAgRCA9IC0xLFxuICAgICAgICAgICAgICAgICAgTCA9IC0xLFxuICAgICAgICAgICAgICAgICAgTyA9IHt9LFxuICAgICAgICAgICAgICAgICAgUiA9IGhhKFwiXCIpLFxuICAgICAgICAgICAgICAgICAgVSA9IDAsXG4gICAgICAgICAgICAgICAgICBqID0gMDtcblxuICAgICAgICAgICAgICBpZiAodm9pZCAwID09PSBzLl91bmV2YWx1YXRlZExheW91dC5nZXRWYWx1ZShcInRleHQtcmFkaWFsLW9mZnNldFwiKSA/IChVID0gKEkgPSBzLmxheW91dC5nZXQoXCJ0ZXh0LW9mZnNldFwiKS5ldmFsdWF0ZShiLCB7fSwgUykubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI0ICogdDtcbiAgICAgICAgICAgICAgfSkpWzBdLCBqID0gSVsxXSkgOiAoVSA9IDI0ICogcy5sYXlvdXQuZ2V0KFwidGV4dC1yYWRpYWwtb2Zmc2V0XCIpLmV2YWx1YXRlKGIsIHt9LCBTKSwgaiA9IGlsKSwgdC5hbGxvd1ZlcnRpY2FsUGxhY2VtZW50ICYmIG4udmVydGljYWwpIHtcbiAgICAgICAgICAgICAgICB2YXIgcSA9IHMubGF5b3V0LmdldChcInRleHQtcm90YXRlXCIpLmV2YWx1YXRlKGIsIHt9LCBTKSArIDkwO1xuICAgICAgICAgICAgICAgIEUgPSBuZXcgV3UodSwgZSwgbCwgcCwgYywgbi52ZXJ0aWNhbCwgaCwgZiwgeSwgcSksIG8gJiYgKFAgPSBuZXcgV3UodSwgZSwgbCwgcCwgYywgbywgbSwgdiwgeSwgcSkpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGkpIHtcbiAgICAgICAgICAgICAgICB2YXIgTiA9IHMubGF5b3V0LmdldChcImljb24tcm90YXRlXCIpLmV2YWx1YXRlKGIsIHt9KSxcbiAgICAgICAgICAgICAgICAgICAgSyA9IFwibm9uZVwiICE9PSBzLmxheW91dC5nZXQoXCJpY29uLXRleHQtZml0XCIpLFxuICAgICAgICAgICAgICAgICAgICBHID0gWHUoaSwgTiwgXywgSyksXG4gICAgICAgICAgICAgICAgICAgIFogPSBvID8gWHUobywgTiwgXywgSykgOiB2b2lkIDA7XG4gICAgICAgICAgICAgICAgQyA9IG5ldyBXdSh1LCBlLCBsLCBwLCBjLCBpLCBtLCB2LCAhMSwgTiksIEIgPSA0ICogRy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgdmFyIFggPSB0Lmljb25TaXplRGF0YSxcbiAgICAgICAgICAgICAgICAgICAgSiA9IG51bGw7XG4gICAgICAgICAgICAgICAgXCJzb3VyY2VcIiA9PT0gWC5raW5kID8gKEogPSBbMTI4ICogcy5sYXlvdXQuZ2V0KFwiaWNvbi1zaXplXCIpLmV2YWx1YXRlKGIsIHt9KV0pWzBdID4gMzI2NDAgJiYgQSh0LmxheWVySWRzWzBdICsgJzogVmFsdWUgZm9yIFwiaWNvbi1zaXplXCIgaXMgPj0gMjU1LiBSZWR1Y2UgeW91ciBcImljb24tc2l6ZVwiLicpIDogXCJjb21wb3NpdGVcIiA9PT0gWC5raW5kICYmICgoSiA9IFsxMjggKiB3LmNvbXBvc2l0ZUljb25TaXplc1swXS5ldmFsdWF0ZShiLCB7fSwgUyksIDEyOCAqIHcuY29tcG9zaXRlSWNvblNpemVzWzFdLmV2YWx1YXRlKGIsIHt9LCBTKV0pWzBdID4gMzI2NDAgfHwgSlsxXSA+IDMyNjQwKSAmJiBBKHQubGF5ZXJJZHNbMF0gKyAnOiBWYWx1ZSBmb3IgXCJpY29uLXNpemVcIiBpcyA+PSAyNTUuIFJlZHVjZSB5b3VyIFwiaWNvbi1zaXplXCIuJyksIHQuYWRkU3ltYm9scyh0Lmljb24sIEcsIEosIHgsIGcsIGIsICExLCBlLCBNLmxpbmVTdGFydEluZGV4LCBNLmxpbmVMZW5ndGgsIC0xLCBTKSwgRCA9IHQuaWNvbi5wbGFjZWRTeW1ib2xBcnJheS5sZW5ndGggLSAxLCBaICYmIChUID0gNCAqIFoubGVuZ3RoLCB0LmFkZFN5bWJvbHModC5pY29uLCBaLCBKLCB4LCBnLCBiLCB3dS52ZXJ0aWNhbCwgZSwgTS5saW5lU3RhcnRJbmRleCwgTS5saW5lTGVuZ3RoLCAtMSwgUyksIEwgPSB0Lmljb24ucGxhY2VkU3ltYm9sQXJyYXkubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBmb3IgKHZhciBIIGluIG4uaG9yaXpvbnRhbCkge1xuICAgICAgICAgICAgICAgIHZhciBZID0gbi5ob3Jpem9udGFsW0hdO1xuXG4gICAgICAgICAgICAgICAgaWYgKCF6KSB7XG4gICAgICAgICAgICAgICAgICBSID0gaGEoWS50ZXh0KTtcbiAgICAgICAgICAgICAgICAgIHZhciAkID0gcy5sYXlvdXQuZ2V0KFwidGV4dC1yb3RhdGVcIikuZXZhbHVhdGUoYiwge30sIFMpO1xuICAgICAgICAgICAgICAgICAgeiA9IG5ldyBXdSh1LCBlLCBsLCBwLCBjLCBZLCBoLCBmLCB5LCAkKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgVyA9IDEgPT09IFkucG9zaXRpb25lZExpbmVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAoViArPSBzbCh0LCBlLCBZLCBhLCBzLCB5LCBiLCBkLCBNLCBuLnZlcnRpY2FsID8gd3UuaG9yaXpvbnRhbCA6IHd1Lmhvcml6b250YWxPbmx5LCBXID8gT2JqZWN0LmtleXMobi5ob3Jpem9udGFsKSA6IFtIXSwgTywgRCwgdywgUyksIFcpIGJyZWFrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgbi52ZXJ0aWNhbCAmJiAoRiArPSBzbCh0LCBlLCBuLnZlcnRpY2FsLCBhLCBzLCB5LCBiLCBkLCBNLCB3dS52ZXJ0aWNhbCwgW1widmVydGljYWxcIl0sIE8sIEwsIHcsIFMpKTtcblxuICAgICAgICAgICAgICB2YXIgUSA9IHogPyB6LmJveFN0YXJ0SW5kZXggOiB0LmNvbGxpc2lvbkJveEFycmF5Lmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgIHR0ID0geiA/IHouYm94RW5kSW5kZXggOiB0LmNvbGxpc2lvbkJveEFycmF5Lmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgIGV0ID0gRSA/IEUuYm94U3RhcnRJbmRleCA6IHQuY29sbGlzaW9uQm94QXJyYXkubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgcnQgPSBFID8gRS5ib3hFbmRJbmRleCA6IHQuY29sbGlzaW9uQm94QXJyYXkubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgbnQgPSBDID8gQy5ib3hTdGFydEluZGV4IDogdC5jb2xsaXNpb25Cb3hBcnJheS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICBpdCA9IEMgPyBDLmJveEVuZEluZGV4IDogdC5jb2xsaXNpb25Cb3hBcnJheS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICBhdCA9IFAgPyBQLmJveFN0YXJ0SW5kZXggOiB0LmNvbGxpc2lvbkJveEFycmF5Lmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgIG90ID0gUCA/IFAuYm94RW5kSW5kZXggOiB0LmNvbGxpc2lvbkJveEFycmF5Lmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgIHN0ID0gLTEsXG4gICAgICAgICAgICAgICAgICB1dCA9IGZ1bmN0aW9uIHV0KHQsIGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdCAmJiB0LmNpcmNsZURpYW1ldGVyID8gTWF0aC5tYXgodC5jaXJjbGVEaWFtZXRlciwgZSkgOiBlO1xuICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgIHN0ID0gdXQoeiwgc3QpLCBzdCA9IHV0KEUsIHN0KSwgc3QgPSB1dChDLCBzdCk7XG4gICAgICAgICAgICAgIHZhciBsdCA9IChzdCA9IHV0KFAsIHN0KSkgPiAtMSA/IDEgOiAwO1xuICAgICAgICAgICAgICBsdCAmJiAoc3QgKj0gayAvIDI0KSwgdC5nbHlwaE9mZnNldEFycmF5Lmxlbmd0aCA+PSB2bC5NQVhfR0xZUEhTICYmIEEoXCJUb28gbWFueSBnbHlwaHMgYmVpbmcgcmVuZGVyZWQgaW4gYSB0aWxlLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzI5MDdcIiksIHZvaWQgMCAhPT0gYi5zb3J0S2V5ICYmIHQuYWRkVG9Tb3J0S2V5UmFuZ2VzKHQuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aCwgYi5zb3J0S2V5KSwgdC5zeW1ib2xJbnN0YW5jZXMuZW1wbGFjZUJhY2soZS54LCBlLnksIE8ucmlnaHQgPj0gMCA/IE8ucmlnaHQgOiAtMSwgTy5jZW50ZXIgPj0gMCA/IE8uY2VudGVyIDogLTEsIE8ubGVmdCA+PSAwID8gTy5sZWZ0IDogLTEsIE8udmVydGljYWwgfHwgLTEsIEQsIEwsIFIsIFEsIHR0LCBldCwgcnQsIG50LCBpdCwgYXQsIG90LCBsLCBWLCBGLCBCLCBULCBsdCwgMCwgaCwgVSwgaiwgc3QpO1xuICAgICAgICAgICAgfSh0LCBjLCBzLCByLCBuLCBpLCBoLCB0LmxheWVyc1swXSwgdC5jb2xsaXNpb25Cb3hBcnJheSwgZS5pbmRleCwgZS5zb3VyY2VMYXllckluZGV4LCB0LmluZGV4LCB2LCB3LCBrLCB1LCB4LCBfLCBJLCB5LCBlLCBhLCBsLCBwLCBvKTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgaWYgKFwibGluZVwiID09PSB6KSBmb3IgKHZhciBNID0gMCwgQiA9IFp1KGUuZ2VvbWV0cnksIDAsIDAsIDgxOTIsIDgxOTIpOyBNIDwgQi5sZW5ndGg7IE0gKz0gMSkge1xuICAgICAgICAgICAgZm9yICh2YXIgVCA9IEJbTV0sIFYgPSAwLCBGID0gR3UoVCwgYiwgUywgci52ZXJ0aWNhbCB8fCBkLCBuLCAyNCwgZywgdC5vdmVyc2NhbGluZywgODE5Mik7IFYgPCBGLmxlbmd0aDsgViArPSAxKSB7XG4gICAgICAgICAgICAgIHZhciBEID0gRltWXTtcbiAgICAgICAgICAgICAgZCAmJiBsbCh0LCBkLnRleHQsIEMsIEQpIHx8IFAoVCwgRCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChcImxpbmUtY2VudGVyXCIgPT09IHopIGZvciAodmFyIEwgPSAwLCBPID0gZS5nZW9tZXRyeTsgTCA8IE8ubGVuZ3RoOyBMICs9IDEpIHtcbiAgICAgICAgICAgIHZhciBSID0gT1tMXTtcblxuICAgICAgICAgICAgaWYgKFIubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICB2YXIgVSA9IEt1KFIsIFMsIHIudmVydGljYWwgfHwgZCwgbiwgMjQsIGcpO1xuICAgICAgICAgICAgICBVICYmIFAoUiwgVSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChcIlBvbHlnb25cIiA9PT0gZS50eXBlKSBmb3IgKHZhciBqID0gMCwgcSA9IG5zKGUuZ2VvbWV0cnksIDApOyBqIDwgcS5sZW5ndGg7IGogKz0gMSkge1xuICAgICAgICAgICAgdmFyIE4gPSBxW2pdLFxuICAgICAgICAgICAgICAgIEsgPSBlbChOLCAxNik7XG4gICAgICAgICAgICBQKE5bMF0sIG5ldyBGdShLLngsIEsueSwgMCkpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoXCJMaW5lU3RyaW5nXCIgPT09IGUudHlwZSkgZm9yICh2YXIgRyA9IDAsIFogPSBlLmdlb21ldHJ5OyBHIDwgWi5sZW5ndGg7IEcgKz0gMSkge1xuICAgICAgICAgICAgdmFyIFggPSBaW0ddO1xuICAgICAgICAgICAgUChYLCBuZXcgRnUoWFswXS54LCBYWzBdLnksIDApKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKFwiUG9pbnRcIiA9PT0gZS50eXBlKSBmb3IgKHZhciBKID0gMCwgSCA9IGUuZ2VvbWV0cnk7IEogPCBILmxlbmd0aDsgSiArPSAxKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBZID0gMCwgJCA9IEhbSl07IFkgPCAkLmxlbmd0aDsgWSArPSAxKSB7XG4gICAgICAgICAgICAgIHZhciBXID0gJFtZXTtcbiAgICAgICAgICAgICAgUChbV10sIG5ldyBGdShXLngsIFcueSwgMCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSh0LCBhLCBmLCBSLCBuLCBsLCBjLCBoLCB3LCBVLCBvKTtcbiAgICAgIH0sIHggPSAwLCBiID0gdC5mZWF0dXJlczsgeCA8IGIubGVuZ3RoOyB4ICs9IDEpIHtcbiAgICAgICAgZygpO1xuICAgICAgfVxuXG4gICAgICBhICYmIHQuZ2VuZXJhdGVDb2xsaXNpb25EZWJ1Z0J1ZmZlcnMoKTtcbiAgICB9LCB0LnBlcnNwZWN0aXZlID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGkpIHtcbiAgICAgIHZhciBhLFxuICAgICAgICAgIG8gPSAxIC8gTWF0aC50YW4oZSAvIDIpO1xuICAgICAgcmV0dXJuIHRbMF0gPSBvIC8gciwgdFsxXSA9IDAsIHRbMl0gPSAwLCB0WzNdID0gMCwgdFs0XSA9IDAsIHRbNV0gPSBvLCB0WzZdID0gMCwgdFs3XSA9IDAsIHRbOF0gPSAwLCB0WzldID0gMCwgdFsxMV0gPSAtMSwgdFsxMl0gPSAwLCB0WzEzXSA9IDAsIHRbMTVdID0gMCwgbnVsbCAhPSBpICYmIGkgIT09IDEgLyAwID8gKHRbMTBdID0gKGkgKyBuKSAqIChhID0gMSAvIChuIC0gaSkpLCB0WzE0XSA9IDIgKiBpICogbiAqIGEpIDogKHRbMTBdID0gLTEsIHRbMTRdID0gLTIgKiBuKSwgdDtcbiAgICB9LCB0LnBpY2sgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgZm9yICh2YXIgciA9IHt9LCBuID0gMDsgbiA8IGUubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgdmFyIGkgPSBlW25dO1xuICAgICAgICBpIGluIHQgJiYgKHJbaV0gPSB0W2ldKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSwgdC5wbHVnaW4gPSBvaSwgdC5wb2x5Z29uSW50ZXJzZWN0c1BvbHlnb24gPSBOYSwgdC5wb3N0TWFwTG9hZEV2ZW50ID0gb3QsIHQucG9zdFR1cm5zdGlsZUV2ZW50ID0gaXQsIHQucG90cGFjayA9IHZ1LCB0LnJlZlByb3BlcnRpZXMgPSBbXCJ0eXBlXCIsIFwic291cmNlXCIsIFwic291cmNlLWxheWVyXCIsIFwibWluem9vbVwiLCBcIm1heHpvb21cIiwgXCJmaWx0ZXJcIiwgXCJsYXlvdXRcIl0sIHQucmVnaXN0ZXIgPSBPbiwgdC5yZWdpc3RlckZvclBsdWdpblN0YXRlQ2hhbmdlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0KHtcbiAgICAgICAgcGx1Z2luU3RhdHVzOiBRbixcbiAgICAgICAgcGx1Z2luVVJMOiB0aVxuICAgICAgfSksIG5pLm9uKFwicGx1Z2luU3RhdGVDaGFuZ2VcIiwgdCksIHQ7XG4gICAgfSwgdC5yZW5kZXJDb2xvclJhbXAgPSB3bywgdC5yb3RhdGUgPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgdmFyIG4gPSBlWzBdLFxuICAgICAgICAgIGkgPSBlWzFdLFxuICAgICAgICAgIGEgPSBlWzJdLFxuICAgICAgICAgIG8gPSBlWzNdLFxuICAgICAgICAgIHMgPSBNYXRoLnNpbihyKSxcbiAgICAgICAgICB1ID0gTWF0aC5jb3Mocik7XG4gICAgICByZXR1cm4gdFswXSA9IG4gKiB1ICsgYSAqIHMsIHRbMV0gPSBpICogdSArIG8gKiBzLCB0WzJdID0gbiAqIC1zICsgYSAqIHUsIHRbM10gPSBpICogLXMgKyBvICogdSwgdDtcbiAgICB9LCB0LnJvdGF0ZVggPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgdmFyIG4gPSBNYXRoLnNpbihyKSxcbiAgICAgICAgICBpID0gTWF0aC5jb3MociksXG4gICAgICAgICAgYSA9IGVbNF0sXG4gICAgICAgICAgbyA9IGVbNV0sXG4gICAgICAgICAgcyA9IGVbNl0sXG4gICAgICAgICAgdSA9IGVbN10sXG4gICAgICAgICAgbCA9IGVbOF0sXG4gICAgICAgICAgcCA9IGVbOV0sXG4gICAgICAgICAgYyA9IGVbMTBdLFxuICAgICAgICAgIGggPSBlWzExXTtcbiAgICAgIHJldHVybiBlICE9PSB0ICYmICh0WzBdID0gZVswXSwgdFsxXSA9IGVbMV0sIHRbMl0gPSBlWzJdLCB0WzNdID0gZVszXSwgdFsxMl0gPSBlWzEyXSwgdFsxM10gPSBlWzEzXSwgdFsxNF0gPSBlWzE0XSwgdFsxNV0gPSBlWzE1XSksIHRbNF0gPSBhICogaSArIGwgKiBuLCB0WzVdID0gbyAqIGkgKyBwICogbiwgdFs2XSA9IHMgKiBpICsgYyAqIG4sIHRbN10gPSB1ICogaSArIGggKiBuLCB0WzhdID0gbCAqIGkgLSBhICogbiwgdFs5XSA9IHAgKiBpIC0gbyAqIG4sIHRbMTBdID0gYyAqIGkgLSBzICogbiwgdFsxMV0gPSBoICogaSAtIHUgKiBuLCB0O1xuICAgIH0sIHQucm90YXRlWiA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICB2YXIgbiA9IE1hdGguc2luKHIpLFxuICAgICAgICAgIGkgPSBNYXRoLmNvcyhyKSxcbiAgICAgICAgICBhID0gZVswXSxcbiAgICAgICAgICBvID0gZVsxXSxcbiAgICAgICAgICBzID0gZVsyXSxcbiAgICAgICAgICB1ID0gZVszXSxcbiAgICAgICAgICBsID0gZVs0XSxcbiAgICAgICAgICBwID0gZVs1XSxcbiAgICAgICAgICBjID0gZVs2XSxcbiAgICAgICAgICBoID0gZVs3XTtcbiAgICAgIHJldHVybiBlICE9PSB0ICYmICh0WzhdID0gZVs4XSwgdFs5XSA9IGVbOV0sIHRbMTBdID0gZVsxMF0sIHRbMTFdID0gZVsxMV0sIHRbMTJdID0gZVsxMl0sIHRbMTNdID0gZVsxM10sIHRbMTRdID0gZVsxNF0sIHRbMTVdID0gZVsxNV0pLCB0WzBdID0gYSAqIGkgKyBsICogbiwgdFsxXSA9IG8gKiBpICsgcCAqIG4sIHRbMl0gPSBzICogaSArIGMgKiBuLCB0WzNdID0gdSAqIGkgKyBoICogbiwgdFs0XSA9IGwgKiBpIC0gYSAqIG4sIHRbNV0gPSBwICogaSAtIG8gKiBuLCB0WzZdID0gYyAqIGkgLSBzICogbiwgdFs3XSA9IGggKiBpIC0gdSAqIG4sIHQ7XG4gICAgfSwgdC5zY2FsZSA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICB2YXIgbiA9IHJbMF0sXG4gICAgICAgICAgaSA9IHJbMV0sXG4gICAgICAgICAgYSA9IHJbMl07XG4gICAgICByZXR1cm4gdFswXSA9IGVbMF0gKiBuLCB0WzFdID0gZVsxXSAqIG4sIHRbMl0gPSBlWzJdICogbiwgdFszXSA9IGVbM10gKiBuLCB0WzRdID0gZVs0XSAqIGksIHRbNV0gPSBlWzVdICogaSwgdFs2XSA9IGVbNl0gKiBpLCB0WzddID0gZVs3XSAqIGksIHRbOF0gPSBlWzhdICogYSwgdFs5XSA9IGVbOV0gKiBhLCB0WzEwXSA9IGVbMTBdICogYSwgdFsxMV0gPSBlWzExXSAqIGEsIHRbMTJdID0gZVsxMl0sIHRbMTNdID0gZVsxM10sIHRbMTRdID0gZVsxNF0sIHRbMTVdID0gZVsxNV0sIHQ7XG4gICAgfSwgdC5zY2FsZSQxID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgIHJldHVybiB0WzBdID0gZVswXSAqIHIsIHRbMV0gPSBlWzFdICogciwgdFsyXSA9IGVbMl0gKiByLCB0WzNdID0gZVszXSAqIHIsIHQ7XG4gICAgfSwgdC5zY2FsZSQyID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgIHJldHVybiB0WzBdID0gZVswXSAqIHIsIHRbMV0gPSBlWzFdICogciwgdFsyXSA9IGVbMl0gKiByLCB0O1xuICAgIH0sIHQuc2V0Q2FjaGVMaW1pdHMgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgc3QgPSB0LCB1dCA9IGU7XG4gICAgfSwgdC5zZXRSVExUZXh0UGx1Z2luID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgIGlmICh2b2lkIDAgPT09IHIgJiYgKHIgPSAhMSksIFwiZGVmZXJyZWRcIiA9PT0gUW4gfHwgXCJsb2FkaW5nXCIgPT09IFFuIHx8IFwibG9hZGVkXCIgPT09IFFuKSB0aHJvdyBuZXcgRXJyb3IoXCJzZXRSVExUZXh0UGx1Z2luIGNhbm5vdCBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuXCIpO1xuICAgICAgdGkgPSBPLnJlc29sdmVVUkwodCksIFFuID0gXCJkZWZlcnJlZFwiLCBXbiA9IGUsIHJpKCksIHIgfHwgYWkoKTtcbiAgICB9LCB0LnNwaGVyaWNhbFRvQ2FydGVzaWFuID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHZhciBlID0gdFswXSxcbiAgICAgICAgICByID0gdFsxXSxcbiAgICAgICAgICBuID0gdFsyXTtcbiAgICAgIHJldHVybiByICs9IDkwLCByICo9IE1hdGguUEkgLyAxODAsIG4gKj0gTWF0aC5QSSAvIDE4MCwge1xuICAgICAgICB4OiBlICogTWF0aC5jb3MocikgKiBNYXRoLnNpbihuKSxcbiAgICAgICAgeTogZSAqIE1hdGguc2luKHIpICogTWF0aC5zaW4obiksXG4gICAgICAgIHo6IGUgKiBNYXRoLmNvcyhuKVxuICAgICAgfTtcbiAgICB9LCB0LnNxckxlbiA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2YXIgZSA9IHRbMF0sXG4gICAgICAgICAgciA9IHRbMV07XG4gICAgICByZXR1cm4gZSAqIGUgKyByICogcjtcbiAgICB9LCB0LnN0eWxlU3BlYyA9IEV0LCB0LnN1YiA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICByZXR1cm4gdFswXSA9IGVbMF0gLSByWzBdLCB0WzFdID0gZVsxXSAtIHJbMV0sIHRbMl0gPSBlWzJdIC0gclsyXSwgdDtcbiAgICB9LCB0LnN5bWJvbFNpemUgPSBSdSwgdC50cmFuc2Zvcm1NYXQzID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgIHZhciBuID0gZVswXSxcbiAgICAgICAgICBpID0gZVsxXSxcbiAgICAgICAgICBhID0gZVsyXTtcbiAgICAgIHJldHVybiB0WzBdID0gbiAqIHJbMF0gKyBpICogclszXSArIGEgKiByWzZdLCB0WzFdID0gbiAqIHJbMV0gKyBpICogcls0XSArIGEgKiByWzddLCB0WzJdID0gbiAqIHJbMl0gKyBpICogcls1XSArIGEgKiByWzhdLCB0O1xuICAgIH0sIHQudHJhbnNmb3JtTWF0NCA9IHBvLCB0LnRyYW5zbGF0ZSA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICB2YXIgbixcbiAgICAgICAgICBpLFxuICAgICAgICAgIGEsXG4gICAgICAgICAgbyxcbiAgICAgICAgICBzLFxuICAgICAgICAgIHUsXG4gICAgICAgICAgbCxcbiAgICAgICAgICBwLFxuICAgICAgICAgIGMsXG4gICAgICAgICAgaCxcbiAgICAgICAgICBmLFxuICAgICAgICAgIHksXG4gICAgICAgICAgZCA9IHJbMF0sXG4gICAgICAgICAgbSA9IHJbMV0sXG4gICAgICAgICAgdiA9IHJbMl07XG4gICAgICByZXR1cm4gZSA9PT0gdCA/ICh0WzEyXSA9IGVbMF0gKiBkICsgZVs0XSAqIG0gKyBlWzhdICogdiArIGVbMTJdLCB0WzEzXSA9IGVbMV0gKiBkICsgZVs1XSAqIG0gKyBlWzldICogdiArIGVbMTNdLCB0WzE0XSA9IGVbMl0gKiBkICsgZVs2XSAqIG0gKyBlWzEwXSAqIHYgKyBlWzE0XSwgdFsxNV0gPSBlWzNdICogZCArIGVbN10gKiBtICsgZVsxMV0gKiB2ICsgZVsxNV0pIDogKGkgPSBlWzFdLCBhID0gZVsyXSwgbyA9IGVbM10sIHMgPSBlWzRdLCB1ID0gZVs1XSwgbCA9IGVbNl0sIHAgPSBlWzddLCBjID0gZVs4XSwgaCA9IGVbOV0sIGYgPSBlWzEwXSwgeSA9IGVbMTFdLCB0WzBdID0gbiA9IGVbMF0sIHRbMV0gPSBpLCB0WzJdID0gYSwgdFszXSA9IG8sIHRbNF0gPSBzLCB0WzVdID0gdSwgdFs2XSA9IGwsIHRbN10gPSBwLCB0WzhdID0gYywgdFs5XSA9IGgsIHRbMTBdID0gZiwgdFsxMV0gPSB5LCB0WzEyXSA9IG4gKiBkICsgcyAqIG0gKyBjICogdiArIGVbMTJdLCB0WzEzXSA9IGkgKiBkICsgdSAqIG0gKyBoICogdiArIGVbMTNdLCB0WzE0XSA9IGEgKiBkICsgbCAqIG0gKyBmICogdiArIGVbMTRdLCB0WzE1XSA9IG8gKiBkICsgcCAqIG0gKyB5ICogdiArIGVbMTVdKSwgdDtcbiAgICB9LCB0LnRyaWdnZXJQbHVnaW5Db21wbGV0aW9uRXZlbnQgPSBlaSwgdC51bmlxdWVJZCA9IHksIHQudmFsaWRhdGVDdXN0b21TdHlsZUxheWVyID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHZhciBlID0gW10sXG4gICAgICAgICAgciA9IHQuaWQ7XG4gICAgICByZXR1cm4gdm9pZCAwID09PSByICYmIGUucHVzaCh7XG4gICAgICAgIG1lc3NhZ2U6IFwibGF5ZXJzLlwiICsgciArICc6IG1pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgXCJpZFwiJ1xuICAgICAgfSksIHZvaWQgMCA9PT0gdC5yZW5kZXIgJiYgZS5wdXNoKHtcbiAgICAgICAgbWVzc2FnZTogXCJsYXllcnMuXCIgKyByICsgJzogbWlzc2luZyByZXF1aXJlZCBtZXRob2QgXCJyZW5kZXJcIidcbiAgICAgIH0pLCB0LnJlbmRlcmluZ01vZGUgJiYgXCIyZFwiICE9PSB0LnJlbmRlcmluZ01vZGUgJiYgXCIzZFwiICE9PSB0LnJlbmRlcmluZ01vZGUgJiYgZS5wdXNoKHtcbiAgICAgICAgbWVzc2FnZTogXCJsYXllcnMuXCIgKyByICsgJzogcHJvcGVydHkgXCJyZW5kZXJpbmdNb2RlXCIgbXVzdCBiZSBlaXRoZXIgXCIyZFwiIG9yIFwiM2RcIidcbiAgICAgIH0pLCBlO1xuICAgIH0sIHQudmFsaWRhdGVMaWdodCA9IEVuLCB0LnZhbGlkYXRlU3R5bGUgPSBDbiwgdC52YWx1ZXMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGUgPSBbXTtcblxuICAgICAgZm9yICh2YXIgciBpbiB0KSB7XG4gICAgICAgIGUucHVzaCh0W3JdKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGU7XG4gICAgfSwgdC52ZWN0b3JUaWxlID0gYnMsIHQudmVyc2lvbiA9IFwiMS4xMy4xXCIsIHQud2Fybk9uY2UgPSBBLCB0LndlYnBTdXBwb3J0ZWQgPSBVLCB0LndpbmRvdyA9IG8sIHQud3JhcCA9IGM7XG4gIH0pO1xuICBkZWZpbmUoW1wiLi9zaGFyZWRcIl0sIGZ1bmN0aW9uIChlKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBmdW5jdGlvbiB0KGUpIHtcbiAgICAgIHZhciByID0gdHlwZW9mIGU7XG4gICAgICBpZiAoXCJudW1iZXJcIiA9PT0gciB8fCBcImJvb2xlYW5cIiA9PT0gciB8fCBcInN0cmluZ1wiID09PSByIHx8IG51bGwgPT0gZSkgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGUpO1xuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShlKSkge1xuICAgICAgICBmb3IgKHZhciBpID0gXCJbXCIsIG8gPSAwLCBuID0gZTsgbyA8IG4ubGVuZ3RoOyBvICs9IDEpIHtcbiAgICAgICAgICBpICs9IHQobltvXSkgKyBcIixcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpICsgXCJdXCI7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIHMgPSBPYmplY3Qua2V5cyhlKS5zb3J0KCksIGEgPSBcIntcIiwgbCA9IDA7IGwgPCBzLmxlbmd0aDsgbCsrKSB7XG4gICAgICAgIGEgKz0gSlNPTi5zdHJpbmdpZnkoc1tsXSkgKyBcIjpcIiArIHQoZVtzW2xdXSkgKyBcIixcIjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGEgKyBcIn1cIjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByKHIpIHtcbiAgICAgIGZvciAodmFyIGkgPSBcIlwiLCBvID0gMCwgbiA9IGUucmVmUHJvcGVydGllczsgbyA8IG4ubGVuZ3RoOyBvICs9IDEpIHtcbiAgICAgICAgaSArPSBcIi9cIiArIHQocltuW29dXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpO1xuICAgIH1cblxuICAgIHZhciBpID0gZnVuY3Rpb24gaShlKSB7XG4gICAgICB0aGlzLmtleUNhY2hlID0ge30sIGUgJiYgdGhpcy5yZXBsYWNlKGUpO1xuICAgIH07XG5cbiAgICBpLnByb3RvdHlwZS5yZXBsYWNlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHRoaXMuX2xheWVyQ29uZmlncyA9IHt9LCB0aGlzLl9sYXllcnMgPSB7fSwgdGhpcy51cGRhdGUoZSwgW10pO1xuICAgIH0sIGkucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICh0LCBpKSB7XG4gICAgICBmb3IgKHZhciBvID0gdGhpcywgbiA9IDAsIHMgPSB0OyBuIDwgcy5sZW5ndGg7IG4gKz0gMSkge1xuICAgICAgICB2YXIgYSA9IHNbbl07XG4gICAgICAgIHRoaXMuX2xheWVyQ29uZmlnc1thLmlkXSA9IGE7XG4gICAgICAgIHZhciBsID0gdGhpcy5fbGF5ZXJzW2EuaWRdID0gZS5jcmVhdGVTdHlsZUxheWVyKGEpO1xuICAgICAgICBsLl9mZWF0dXJlRmlsdGVyID0gZS5mZWF0dXJlRmlsdGVyKGwuZmlsdGVyKSwgdGhpcy5rZXlDYWNoZVthLmlkXSAmJiBkZWxldGUgdGhpcy5rZXlDYWNoZVthLmlkXTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgdSA9IDAsIGggPSBpOyB1IDwgaC5sZW5ndGg7IHUgKz0gMSkge1xuICAgICAgICB2YXIgYyA9IGhbdV07XG4gICAgICAgIGRlbGV0ZSB0aGlzLmtleUNhY2hlW2NdLCBkZWxldGUgdGhpcy5fbGF5ZXJDb25maWdzW2NdLCBkZWxldGUgdGhpcy5fbGF5ZXJzW2NdO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmZhbWlsaWVzQnlTb3VyY2UgPSB7fTtcblxuICAgICAgZm9yICh2YXIgcCA9IDAsIGYgPSBmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgICBmb3IgKHZhciBpID0ge30sIG8gPSAwOyBvIDwgZS5sZW5ndGg7IG8rKykge1xuICAgICAgICAgIHZhciBuID0gdCAmJiB0W2Vbb10uaWRdIHx8IHIoZVtvXSk7XG4gICAgICAgICAgdCAmJiAodFtlW29dLmlkXSA9IG4pO1xuICAgICAgICAgIHZhciBzID0gaVtuXTtcbiAgICAgICAgICBzIHx8IChzID0gaVtuXSA9IFtdKSwgcy5wdXNoKGVbb10pO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGEgPSBbXTtcblxuICAgICAgICBmb3IgKHZhciBsIGluIGkpIHtcbiAgICAgICAgICBhLnB1c2goaVtsXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYTtcbiAgICAgIH0oZS52YWx1ZXModGhpcy5fbGF5ZXJDb25maWdzKSwgdGhpcy5rZXlDYWNoZSk7IHAgPCBmLmxlbmd0aDsgcCArPSAxKSB7XG4gICAgICAgIHZhciBkID0gZltwXS5tYXAoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICByZXR1cm4gby5fbGF5ZXJzW2UuaWRdO1xuICAgICAgICB9KSxcbiAgICAgICAgICAgIGcgPSBkWzBdO1xuXG4gICAgICAgIGlmIChcIm5vbmVcIiAhPT0gZy52aXNpYmlsaXR5KSB7XG4gICAgICAgICAgdmFyIHYgPSBnLnNvdXJjZSB8fCBcIlwiLFxuICAgICAgICAgICAgICBtID0gdGhpcy5mYW1pbGllc0J5U291cmNlW3ZdO1xuICAgICAgICAgIG0gfHwgKG0gPSB0aGlzLmZhbWlsaWVzQnlTb3VyY2Vbdl0gPSB7fSk7XG4gICAgICAgICAgdmFyIHkgPSBnLnNvdXJjZUxheWVyIHx8IFwiX2dlb2pzb25UaWxlTGF5ZXJcIixcbiAgICAgICAgICAgICAgeCA9IG1beV07XG4gICAgICAgICAgeCB8fCAoeCA9IG1beV0gPSBbXSksIHgucHVzaChkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgbyA9IGZ1bmN0aW9uIG8odCkge1xuICAgICAgdmFyIHIgPSB7fSxcbiAgICAgICAgICBpID0gW107XG5cbiAgICAgIGZvciAodmFyIG8gaW4gdCkge1xuICAgICAgICB2YXIgbiA9IHRbb10sXG4gICAgICAgICAgICBzID0gcltvXSA9IHt9O1xuXG4gICAgICAgIGZvciAodmFyIGEgaW4gbikge1xuICAgICAgICAgIHZhciBsID0gblsrYV07XG5cbiAgICAgICAgICBpZiAobCAmJiAwICE9PSBsLmJpdG1hcC53aWR0aCAmJiAwICE9PSBsLmJpdG1hcC5oZWlnaHQpIHtcbiAgICAgICAgICAgIHZhciB1ID0ge1xuICAgICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgICB5OiAwLFxuICAgICAgICAgICAgICB3OiBsLmJpdG1hcC53aWR0aCArIDIsXG4gICAgICAgICAgICAgIGg6IGwuYml0bWFwLmhlaWdodCArIDJcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpLnB1c2godSksIHNbYV0gPSB7XG4gICAgICAgICAgICAgIHJlY3Q6IHUsXG4gICAgICAgICAgICAgIG1ldHJpY3M6IGwubWV0cmljc1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGggPSBlLnBvdHBhY2soaSksXG4gICAgICAgICAgYyA9IG5ldyBlLkFscGhhSW1hZ2Uoe1xuICAgICAgICB3aWR0aDogaC53IHx8IDEsXG4gICAgICAgIGhlaWdodDogaC5oIHx8IDFcbiAgICAgIH0pO1xuXG4gICAgICBmb3IgKHZhciBwIGluIHQpIHtcbiAgICAgICAgdmFyIGYgPSB0W3BdO1xuXG4gICAgICAgIGZvciAodmFyIGQgaW4gZikge1xuICAgICAgICAgIHZhciBnID0gZlsrZF07XG5cbiAgICAgICAgICBpZiAoZyAmJiAwICE9PSBnLmJpdG1hcC53aWR0aCAmJiAwICE9PSBnLmJpdG1hcC5oZWlnaHQpIHtcbiAgICAgICAgICAgIHZhciB2ID0gcltwXVtkXS5yZWN0O1xuICAgICAgICAgICAgZS5BbHBoYUltYWdlLmNvcHkoZy5iaXRtYXAsIGMsIHtcbiAgICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgICAgeTogMFxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICB4OiB2LnggKyAxLFxuICAgICAgICAgICAgICB5OiB2LnkgKyAxXG4gICAgICAgICAgICB9LCBnLmJpdG1hcCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaW1hZ2UgPSBjLCB0aGlzLnBvc2l0aW9ucyA9IHI7XG4gICAgfTtcblxuICAgIGUucmVnaXN0ZXIoXCJHbHlwaEF0bGFzXCIsIG8pO1xuXG4gICAgdmFyIG4gPSBmdW5jdGlvbiBuKHQpIHtcbiAgICAgIHRoaXMudGlsZUlEID0gbmV3IGUuT3ZlcnNjYWxlZFRpbGVJRCh0LnRpbGVJRC5vdmVyc2NhbGVkWiwgdC50aWxlSUQud3JhcCwgdC50aWxlSUQuY2Fub25pY2FsLnosIHQudGlsZUlELmNhbm9uaWNhbC54LCB0LnRpbGVJRC5jYW5vbmljYWwueSksIHRoaXMudWlkID0gdC51aWQsIHRoaXMuem9vbSA9IHQuem9vbSwgdGhpcy5waXhlbFJhdGlvID0gdC5waXhlbFJhdGlvLCB0aGlzLnRpbGVTaXplID0gdC50aWxlU2l6ZSwgdGhpcy5zb3VyY2UgPSB0LnNvdXJjZSwgdGhpcy5vdmVyc2NhbGluZyA9IHRoaXMudGlsZUlELm92ZXJzY2FsZUZhY3RvcigpLCB0aGlzLnNob3dDb2xsaXNpb25Cb3hlcyA9IHQuc2hvd0NvbGxpc2lvbkJveGVzLCB0aGlzLmNvbGxlY3RSZXNvdXJjZVRpbWluZyA9ICEhdC5jb2xsZWN0UmVzb3VyY2VUaW1pbmcsIHRoaXMucmV0dXJuRGVwZW5kZW5jaWVzID0gISF0LnJldHVybkRlcGVuZGVuY2llcywgdGhpcy5wcm9tb3RlSWQgPSB0LnByb21vdGVJZDtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gcyh0LCByLCBpKSB7XG4gICAgICBmb3IgKHZhciBvID0gbmV3IGUuRXZhbHVhdGlvblBhcmFtZXRlcnMociksIG4gPSAwLCBzID0gdDsgbiA8IHMubGVuZ3RoOyBuICs9IDEpIHtcbiAgICAgICAgc1tuXS5yZWNhbGN1bGF0ZShvLCBpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhKHQsIHIpIHtcbiAgICAgIHZhciBpID0gZS5nZXRBcnJheUJ1ZmZlcih0LnJlcXVlc3QsIGZ1bmN0aW9uICh0LCBpLCBvLCBuKSB7XG4gICAgICAgIHQgPyByKHQpIDogaSAmJiByKG51bGwsIHtcbiAgICAgICAgICB2ZWN0b3JUaWxlOiBuZXcgZS52ZWN0b3JUaWxlLlZlY3RvclRpbGUobmV3IGUucGJmKGkpKSxcbiAgICAgICAgICByYXdEYXRhOiBpLFxuICAgICAgICAgIGNhY2hlQ29udHJvbDogbyxcbiAgICAgICAgICBleHBpcmVzOiBuXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICBpLmNhbmNlbCgpLCByKCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIG4ucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24gKHQsIHIsIGksIG4sIGEpIHtcbiAgICAgIHZhciBsID0gdGhpcztcbiAgICAgIHRoaXMuc3RhdHVzID0gXCJwYXJzaW5nXCIsIHRoaXMuZGF0YSA9IHQsIHRoaXMuY29sbGlzaW9uQm94QXJyYXkgPSBuZXcgZS5Db2xsaXNpb25Cb3hBcnJheSgpO1xuICAgICAgdmFyIHUgPSBuZXcgZS5EaWN0aW9uYXJ5Q29kZXIoT2JqZWN0LmtleXModC5sYXllcnMpLnNvcnQoKSksXG4gICAgICAgICAgaCA9IG5ldyBlLkZlYXR1cmVJbmRleCh0aGlzLnRpbGVJRCwgdGhpcy5wcm9tb3RlSWQpO1xuICAgICAgaC5idWNrZXRMYXllcklEcyA9IFtdO1xuICAgICAgdmFyIGMsXG4gICAgICAgICAgcCxcbiAgICAgICAgICBmLFxuICAgICAgICAgIGQsXG4gICAgICAgICAgZyA9IHt9LFxuICAgICAgICAgIHYgPSB7XG4gICAgICAgIGZlYXR1cmVJbmRleDogaCxcbiAgICAgICAgaWNvbkRlcGVuZGVuY2llczoge30sXG4gICAgICAgIHBhdHRlcm5EZXBlbmRlbmNpZXM6IHt9LFxuICAgICAgICBnbHlwaERlcGVuZGVuY2llczoge30sXG4gICAgICAgIGF2YWlsYWJsZUltYWdlczogaVxuICAgICAgfSxcbiAgICAgICAgICBtID0gci5mYW1pbGllc0J5U291cmNlW3RoaXMuc291cmNlXTtcblxuICAgICAgZm9yICh2YXIgeSBpbiBtKSB7XG4gICAgICAgIHZhciB4ID0gdC5sYXllcnNbeV07XG5cbiAgICAgICAgaWYgKHgpIHtcbiAgICAgICAgICAxID09PSB4LnZlcnNpb24gJiYgZS53YXJuT25jZSgnVmVjdG9yIHRpbGUgc291cmNlIFwiJyArIHRoaXMuc291cmNlICsgJ1wiIGxheWVyIFwiJyArIHkgKyAnXCIgZG9lcyBub3QgdXNlIHZlY3RvciB0aWxlIHNwZWMgdjIgYW5kIHRoZXJlZm9yZSBtYXkgaGF2ZSBzb21lIHJlbmRlcmluZyBlcnJvcnMuJyk7XG5cbiAgICAgICAgICBmb3IgKHZhciB3ID0gdS5lbmNvZGUoeSksIFMgPSBbXSwgSSA9IDA7IEkgPCB4Lmxlbmd0aDsgSSsrKSB7XG4gICAgICAgICAgICB2YXIgTSA9IHguZmVhdHVyZShJKSxcbiAgICAgICAgICAgICAgICBiID0gaC5nZXRJZChNLCB5KTtcbiAgICAgICAgICAgIFMucHVzaCh7XG4gICAgICAgICAgICAgIGZlYXR1cmU6IE0sXG4gICAgICAgICAgICAgIGlkOiBiLFxuICAgICAgICAgICAgICBpbmRleDogSSxcbiAgICAgICAgICAgICAgc291cmNlTGF5ZXJJbmRleDogd1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yICh2YXIgXyA9IDAsIGsgPSBtW3ldOyBfIDwgay5sZW5ndGg7IF8gKz0gMSkge1xuICAgICAgICAgICAgdmFyIFAgPSBrW19dLFxuICAgICAgICAgICAgICAgIFQgPSBQWzBdO1xuICAgICAgICAgICAgVC5taW56b29tICYmIHRoaXMuem9vbSA8IE1hdGguZmxvb3IoVC5taW56b29tKSB8fCBULm1heHpvb20gJiYgdGhpcy56b29tID49IFQubWF4em9vbSB8fCBcIm5vbmVcIiAhPT0gVC52aXNpYmlsaXR5ICYmIChzKFAsIHRoaXMuem9vbSwgaSksIChnW1QuaWRdID0gVC5jcmVhdGVCdWNrZXQoe1xuICAgICAgICAgICAgICBpbmRleDogaC5idWNrZXRMYXllcklEcy5sZW5ndGgsXG4gICAgICAgICAgICAgIGxheWVyczogUCxcbiAgICAgICAgICAgICAgem9vbTogdGhpcy56b29tLFxuICAgICAgICAgICAgICBwaXhlbFJhdGlvOiB0aGlzLnBpeGVsUmF0aW8sXG4gICAgICAgICAgICAgIG92ZXJzY2FsaW5nOiB0aGlzLm92ZXJzY2FsaW5nLFxuICAgICAgICAgICAgICBjb2xsaXNpb25Cb3hBcnJheTogdGhpcy5jb2xsaXNpb25Cb3hBcnJheSxcbiAgICAgICAgICAgICAgc291cmNlTGF5ZXJJbmRleDogdyxcbiAgICAgICAgICAgICAgc291cmNlSUQ6IHRoaXMuc291cmNlXG4gICAgICAgICAgICB9KSkucG9wdWxhdGUoUywgdiwgdGhpcy50aWxlSUQuY2Fub25pY2FsKSwgaC5idWNrZXRMYXllcklEcy5wdXNoKFAubWFwKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlLmlkO1xuICAgICAgICAgICAgfSkpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIEMgPSBlLm1hcE9iamVjdCh2LmdseXBoRGVwZW5kZW5jaWVzLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoZSkubWFwKE51bWJlcik7XG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5rZXlzKEMpLmxlbmd0aCA/IG4uc2VuZChcImdldEdseXBoc1wiLCB7XG4gICAgICAgIHVpZDogdGhpcy51aWQsXG4gICAgICAgIHN0YWNrczogQ1xuICAgICAgfSwgZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgICAgYyB8fCAoYyA9IGUsIHAgPSB0LCB6LmNhbGwobCkpO1xuICAgICAgfSkgOiBwID0ge307XG4gICAgICB2YXIgRCA9IE9iamVjdC5rZXlzKHYuaWNvbkRlcGVuZGVuY2llcyk7XG4gICAgICBELmxlbmd0aCA/IG4uc2VuZChcImdldEltYWdlc1wiLCB7XG4gICAgICAgIGljb25zOiBELFxuICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlLFxuICAgICAgICB0aWxlSUQ6IHRoaXMudGlsZUlELFxuICAgICAgICB0eXBlOiBcImljb25zXCJcbiAgICAgIH0sIGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICAgIGMgfHwgKGMgPSBlLCBmID0gdCwgei5jYWxsKGwpKTtcbiAgICAgIH0pIDogZiA9IHt9O1xuICAgICAgdmFyIEwgPSBPYmplY3Qua2V5cyh2LnBhdHRlcm5EZXBlbmRlbmNpZXMpO1xuXG4gICAgICBmdW5jdGlvbiB6KCkge1xuICAgICAgICBpZiAoYykgcmV0dXJuIGEoYyk7XG5cbiAgICAgICAgaWYgKHAgJiYgZiAmJiBkKSB7XG4gICAgICAgICAgdmFyIHQgPSBuZXcgbyhwKSxcbiAgICAgICAgICAgICAgciA9IG5ldyBlLkltYWdlQXRsYXMoZiwgZCk7XG5cbiAgICAgICAgICBmb3IgKHZhciBuIGluIGcpIHtcbiAgICAgICAgICAgIHZhciBsID0gZ1tuXTtcbiAgICAgICAgICAgIGwgaW5zdGFuY2VvZiBlLlN5bWJvbEJ1Y2tldCA/IChzKGwubGF5ZXJzLCB0aGlzLnpvb20sIGkpLCBlLnBlcmZvcm1TeW1ib2xMYXlvdXQobCwgcCwgdC5wb3NpdGlvbnMsIGYsIHIuaWNvblBvc2l0aW9ucywgdGhpcy5zaG93Q29sbGlzaW9uQm94ZXMsIHRoaXMudGlsZUlELmNhbm9uaWNhbCkpIDogbC5oYXNQYXR0ZXJuICYmIChsIGluc3RhbmNlb2YgZS5MaW5lQnVja2V0IHx8IGwgaW5zdGFuY2VvZiBlLkZpbGxCdWNrZXQgfHwgbCBpbnN0YW5jZW9mIGUuRmlsbEV4dHJ1c2lvbkJ1Y2tldCkgJiYgKHMobC5sYXllcnMsIHRoaXMuem9vbSwgaSksIGwuYWRkRmVhdHVyZXModiwgdGhpcy50aWxlSUQuY2Fub25pY2FsLCByLnBhdHRlcm5Qb3NpdGlvbnMpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLnN0YXR1cyA9IFwiZG9uZVwiLCBhKG51bGwsIHtcbiAgICAgICAgICAgIGJ1Y2tldHM6IGUudmFsdWVzKGcpLmZpbHRlcihmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICByZXR1cm4gIWUuaXNFbXB0eSgpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBmZWF0dXJlSW5kZXg6IGgsXG4gICAgICAgICAgICBjb2xsaXNpb25Cb3hBcnJheTogdGhpcy5jb2xsaXNpb25Cb3hBcnJheSxcbiAgICAgICAgICAgIGdseXBoQXRsYXNJbWFnZTogdC5pbWFnZSxcbiAgICAgICAgICAgIGltYWdlQXRsYXM6IHIsXG4gICAgICAgICAgICBnbHlwaE1hcDogdGhpcy5yZXR1cm5EZXBlbmRlbmNpZXMgPyBwIDogbnVsbCxcbiAgICAgICAgICAgIGljb25NYXA6IHRoaXMucmV0dXJuRGVwZW5kZW5jaWVzID8gZiA6IG51bGwsXG4gICAgICAgICAgICBnbHlwaFBvc2l0aW9uczogdGhpcy5yZXR1cm5EZXBlbmRlbmNpZXMgPyB0LnBvc2l0aW9ucyA6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBMLmxlbmd0aCA/IG4uc2VuZChcImdldEltYWdlc1wiLCB7XG4gICAgICAgIGljb25zOiBMLFxuICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlLFxuICAgICAgICB0aWxlSUQ6IHRoaXMudGlsZUlELFxuICAgICAgICB0eXBlOiBcInBhdHRlcm5zXCJcbiAgICAgIH0sIGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICAgIGMgfHwgKGMgPSBlLCBkID0gdCwgei5jYWxsKGwpKTtcbiAgICAgIH0pIDogZCA9IHt9LCB6LmNhbGwodGhpcyk7XG4gICAgfTtcblxuICAgIHZhciBsID0gZnVuY3Rpb24gbChlLCB0LCByLCBpKSB7XG4gICAgICB0aGlzLmFjdG9yID0gZSwgdGhpcy5sYXllckluZGV4ID0gdCwgdGhpcy5hdmFpbGFibGVJbWFnZXMgPSByLCB0aGlzLmxvYWRWZWN0b3JEYXRhID0gaSB8fCBhLCB0aGlzLmxvYWRpbmcgPSB7fSwgdGhpcy5sb2FkZWQgPSB7fTtcbiAgICB9O1xuXG4gICAgbC5wcm90b3R5cGUubG9hZFRpbGUgPSBmdW5jdGlvbiAodCwgcikge1xuICAgICAgdmFyIGkgPSB0aGlzLFxuICAgICAgICAgIG8gPSB0LnVpZDtcbiAgICAgIHRoaXMubG9hZGluZyB8fCAodGhpcy5sb2FkaW5nID0ge30pO1xuICAgICAgdmFyIHMgPSAhISh0ICYmIHQucmVxdWVzdCAmJiB0LnJlcXVlc3QuY29sbGVjdFJlc291cmNlVGltaW5nKSAmJiBuZXcgZS5SZXF1ZXN0UGVyZm9ybWFuY2UodC5yZXF1ZXN0KSxcbiAgICAgICAgICBhID0gdGhpcy5sb2FkaW5nW29dID0gbmV3IG4odCk7XG4gICAgICBhLmFib3J0ID0gdGhpcy5sb2FkVmVjdG9yRGF0YSh0LCBmdW5jdGlvbiAodCwgbikge1xuICAgICAgICBpZiAoZGVsZXRlIGkubG9hZGluZ1tvXSwgdCB8fCAhbikgcmV0dXJuIGEuc3RhdHVzID0gXCJkb25lXCIsIGkubG9hZGVkW29dID0gYSwgcih0KTtcbiAgICAgICAgdmFyIGwgPSBuLnJhd0RhdGEsXG4gICAgICAgICAgICB1ID0ge307XG4gICAgICAgIG4uZXhwaXJlcyAmJiAodS5leHBpcmVzID0gbi5leHBpcmVzKSwgbi5jYWNoZUNvbnRyb2wgJiYgKHUuY2FjaGVDb250cm9sID0gbi5jYWNoZUNvbnRyb2wpO1xuICAgICAgICB2YXIgaCA9IHt9O1xuXG4gICAgICAgIGlmIChzKSB7XG4gICAgICAgICAgdmFyIGMgPSBzLmZpbmlzaCgpO1xuICAgICAgICAgIGMgJiYgKGgucmVzb3VyY2VUaW1pbmcgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGMpKSk7XG4gICAgICAgIH1cblxuICAgICAgICBhLnZlY3RvclRpbGUgPSBuLnZlY3RvclRpbGUsIGEucGFyc2Uobi52ZWN0b3JUaWxlLCBpLmxheWVySW5kZXgsIGkuYXZhaWxhYmxlSW1hZ2VzLCBpLmFjdG9yLCBmdW5jdGlvbiAodCwgaSkge1xuICAgICAgICAgIGlmICh0IHx8ICFpKSByZXR1cm4gcih0KTtcbiAgICAgICAgICByKG51bGwsIGUuZXh0ZW5kKHtcbiAgICAgICAgICAgIHJhd1RpbGVEYXRhOiBsLnNsaWNlKDApXG4gICAgICAgICAgfSwgaSwgdSwgaCkpO1xuICAgICAgICB9KSwgaS5sb2FkZWQgPSBpLmxvYWRlZCB8fCB7fSwgaS5sb2FkZWRbb10gPSBhO1xuICAgICAgfSk7XG4gICAgfSwgbC5wcm90b3R5cGUucmVsb2FkVGlsZSA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICB2YXIgciA9IHRoaXMsXG4gICAgICAgICAgaSA9IHRoaXMubG9hZGVkLFxuICAgICAgICAgIG8gPSBlLnVpZCxcbiAgICAgICAgICBuID0gdGhpcztcblxuICAgICAgaWYgKGkgJiYgaVtvXSkge1xuICAgICAgICB2YXIgcyA9IGlbb107XG4gICAgICAgIHMuc2hvd0NvbGxpc2lvbkJveGVzID0gZS5zaG93Q29sbGlzaW9uQm94ZXM7XG5cbiAgICAgICAgdmFyIGEgPSBmdW5jdGlvbiBhKGUsIGkpIHtcbiAgICAgICAgICB2YXIgbyA9IHMucmVsb2FkQ2FsbGJhY2s7XG4gICAgICAgICAgbyAmJiAoZGVsZXRlIHMucmVsb2FkQ2FsbGJhY2ssIHMucGFyc2Uocy52ZWN0b3JUaWxlLCBuLmxheWVySW5kZXgsIHIuYXZhaWxhYmxlSW1hZ2VzLCBuLmFjdG9yLCBvKSksIHQoZSwgaSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgXCJwYXJzaW5nXCIgPT09IHMuc3RhdHVzID8gcy5yZWxvYWRDYWxsYmFjayA9IGEgOiBcImRvbmVcIiA9PT0gcy5zdGF0dXMgJiYgKHMudmVjdG9yVGlsZSA/IHMucGFyc2Uocy52ZWN0b3JUaWxlLCB0aGlzLmxheWVySW5kZXgsIHRoaXMuYXZhaWxhYmxlSW1hZ2VzLCB0aGlzLmFjdG9yLCBhKSA6IGEoKSk7XG4gICAgICB9XG4gICAgfSwgbC5wcm90b3R5cGUuYWJvcnRUaWxlID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIHZhciByID0gdGhpcy5sb2FkaW5nLFxuICAgICAgICAgIGkgPSBlLnVpZDtcbiAgICAgIHIgJiYgcltpXSAmJiByW2ldLmFib3J0ICYmIChyW2ldLmFib3J0KCksIGRlbGV0ZSByW2ldKSwgdCgpO1xuICAgIH0sIGwucHJvdG90eXBlLnJlbW92ZVRpbGUgPSBmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgdmFyIHIgPSB0aGlzLmxvYWRlZCxcbiAgICAgICAgICBpID0gZS51aWQ7XG4gICAgICByICYmIHJbaV0gJiYgZGVsZXRlIHJbaV0sIHQoKTtcbiAgICB9O1xuXG4gICAgdmFyIHUgPSBlLndpbmRvdy5JbWFnZUJpdG1hcCxcbiAgICAgICAgaCA9IGZ1bmN0aW9uIGgoKSB7XG4gICAgICB0aGlzLmxvYWRlZCA9IHt9O1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBjKGUsIHQpIHtcbiAgICAgIGlmICgwICE9PSBlLmxlbmd0aCkge1xuICAgICAgICBwKGVbMF0sIHQpO1xuXG4gICAgICAgIGZvciAodmFyIHIgPSAxOyByIDwgZS5sZW5ndGg7IHIrKykge1xuICAgICAgICAgIHAoZVtyXSwgIXQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcChlLCB0KSB7XG4gICAgICBmb3IgKHZhciByID0gMCwgaSA9IDAsIG8gPSBlLmxlbmd0aCwgbiA9IG8gLSAxOyBpIDwgbzsgbiA9IGkrKykge1xuICAgICAgICByICs9IChlW2ldWzBdIC0gZVtuXVswXSkgKiAoZVtuXVsxXSArIGVbaV1bMV0pO1xuICAgICAgfVxuXG4gICAgICByID49IDAgIT0gISF0ICYmIGUucmV2ZXJzZSgpO1xuICAgIH1cblxuICAgIGgucHJvdG90eXBlLmxvYWRUaWxlID0gZnVuY3Rpb24gKHQsIHIpIHtcbiAgICAgIHZhciBpID0gdC51aWQsXG4gICAgICAgICAgbyA9IHQuZW5jb2RpbmcsXG4gICAgICAgICAgbiA9IHQucmF3SW1hZ2VEYXRhLFxuICAgICAgICAgIHMgPSB1ICYmIG4gaW5zdGFuY2VvZiB1ID8gdGhpcy5nZXRJbWFnZURhdGEobikgOiBuLFxuICAgICAgICAgIGEgPSBuZXcgZS5ERU1EYXRhKGksIHMsIG8pO1xuICAgICAgdGhpcy5sb2FkZWQgPSB0aGlzLmxvYWRlZCB8fCB7fSwgdGhpcy5sb2FkZWRbaV0gPSBhLCByKG51bGwsIGEpO1xuICAgIH0sIGgucHJvdG90eXBlLmdldEltYWdlRGF0YSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0aGlzLm9mZnNjcmVlbkNhbnZhcyAmJiB0aGlzLm9mZnNjcmVlbkNhbnZhc0NvbnRleHQgfHwgKHRoaXMub2Zmc2NyZWVuQ2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh0LndpZHRoLCB0LmhlaWdodCksIHRoaXMub2Zmc2NyZWVuQ2FudmFzQ29udGV4dCA9IHRoaXMub2Zmc2NyZWVuQ2FudmFzLmdldENvbnRleHQoXCIyZFwiKSksIHRoaXMub2Zmc2NyZWVuQ2FudmFzLndpZHRoID0gdC53aWR0aCwgdGhpcy5vZmZzY3JlZW5DYW52YXMuaGVpZ2h0ID0gdC5oZWlnaHQsIHRoaXMub2Zmc2NyZWVuQ2FudmFzQ29udGV4dC5kcmF3SW1hZ2UodCwgMCwgMCwgdC53aWR0aCwgdC5oZWlnaHQpO1xuICAgICAgdmFyIHIgPSB0aGlzLm9mZnNjcmVlbkNhbnZhc0NvbnRleHQuZ2V0SW1hZ2VEYXRhKC0xLCAtMSwgdC53aWR0aCArIDIsIHQuaGVpZ2h0ICsgMik7XG4gICAgICByZXR1cm4gdGhpcy5vZmZzY3JlZW5DYW52YXNDb250ZXh0LmNsZWFyUmVjdCgwLCAwLCB0aGlzLm9mZnNjcmVlbkNhbnZhcy53aWR0aCwgdGhpcy5vZmZzY3JlZW5DYW52YXMuaGVpZ2h0KSwgbmV3IGUuUkdCQUltYWdlKHtcbiAgICAgICAgd2lkdGg6IHIud2lkdGgsXG4gICAgICAgIGhlaWdodDogci5oZWlnaHRcbiAgICAgIH0sIHIuZGF0YSk7XG4gICAgfSwgaC5wcm90b3R5cGUucmVtb3ZlVGlsZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCA9IHRoaXMubG9hZGVkLFxuICAgICAgICAgIHIgPSBlLnVpZDtcbiAgICAgIHQgJiYgdFtyXSAmJiBkZWxldGUgdFtyXTtcbiAgICB9O1xuXG4gICAgdmFyIGYgPSBlLnZlY3RvclRpbGUuVmVjdG9yVGlsZUZlYXR1cmUucHJvdG90eXBlLnRvR2VvSlNPTixcbiAgICAgICAgZCA9IGZ1bmN0aW9uIGQodCkge1xuICAgICAgdGhpcy5fZmVhdHVyZSA9IHQsIHRoaXMuZXh0ZW50ID0gZS5FWFRFTlQsIHRoaXMudHlwZSA9IHQudHlwZSwgdGhpcy5wcm9wZXJ0aWVzID0gdC50YWdzLCBcImlkXCIgaW4gdCAmJiAhaXNOYU4odC5pZCkgJiYgKHRoaXMuaWQgPSBwYXJzZUludCh0LmlkLCAxMCkpO1xuICAgIH07XG5cbiAgICBkLnByb3RvdHlwZS5sb2FkR2VvbWV0cnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoMSA9PT0gdGhpcy5fZmVhdHVyZS50eXBlKSB7XG4gICAgICAgIGZvciAodmFyIHQgPSBbXSwgciA9IDAsIGkgPSB0aGlzLl9mZWF0dXJlLmdlb21ldHJ5OyByIDwgaS5sZW5ndGg7IHIgKz0gMSkge1xuICAgICAgICAgIHZhciBvID0gaVtyXTtcbiAgICAgICAgICB0LnB1c2goW25ldyBlLlBvaW50JDEob1swXSwgb1sxXSldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0O1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBuID0gW10sIHMgPSAwLCBhID0gdGhpcy5fZmVhdHVyZS5nZW9tZXRyeTsgcyA8IGEubGVuZ3RoOyBzICs9IDEpIHtcbiAgICAgICAgZm9yICh2YXIgbCA9IFtdLCB1ID0gMCwgaCA9IGFbc107IHUgPCBoLmxlbmd0aDsgdSArPSAxKSB7XG4gICAgICAgICAgdmFyIGMgPSBoW3VdO1xuICAgICAgICAgIGwucHVzaChuZXcgZS5Qb2ludCQxKGNbMF0sIGNbMV0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG4ucHVzaChsKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG47XG4gICAgfSwgZC5wcm90b3R5cGUudG9HZW9KU09OID0gZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICAgIHJldHVybiBmLmNhbGwodGhpcywgZSwgdCwgcik7XG4gICAgfTtcblxuICAgIHZhciBnID0gZnVuY3Rpb24gZyh0KSB7XG4gICAgICB0aGlzLmxheWVycyA9IHtcbiAgICAgICAgX2dlb2pzb25UaWxlTGF5ZXI6IHRoaXNcbiAgICAgIH0sIHRoaXMubmFtZSA9IFwiX2dlb2pzb25UaWxlTGF5ZXJcIiwgdGhpcy5leHRlbnQgPSBlLkVYVEVOVCwgdGhpcy5sZW5ndGggPSB0Lmxlbmd0aCwgdGhpcy5fZmVhdHVyZXMgPSB0O1xuICAgIH07XG5cbiAgICBnLnByb3RvdHlwZS5mZWF0dXJlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHJldHVybiBuZXcgZCh0aGlzLl9mZWF0dXJlc1tlXSk7XG4gICAgfTtcblxuICAgIHZhciB2ID0gZS52ZWN0b3JUaWxlLlZlY3RvclRpbGVGZWF0dXJlLFxuICAgICAgICBtID0geTtcblxuICAgIGZ1bmN0aW9uIHkoZSwgdCkge1xuICAgICAgdGhpcy5vcHRpb25zID0gdCB8fCB7fSwgdGhpcy5mZWF0dXJlcyA9IGUsIHRoaXMubGVuZ3RoID0gZS5sZW5ndGg7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24geChlLCB0KSB7XG4gICAgICB0aGlzLmlkID0gXCJudW1iZXJcIiA9PSB0eXBlb2YgZS5pZCA/IGUuaWQgOiB2b2lkIDAsIHRoaXMudHlwZSA9IGUudHlwZSwgdGhpcy5yYXdHZW9tZXRyeSA9IDEgPT09IGUudHlwZSA/IFtlLmdlb21ldHJ5XSA6IGUuZ2VvbWV0cnksIHRoaXMucHJvcGVydGllcyA9IGUudGFncywgdGhpcy5leHRlbnQgPSB0IHx8IDQwOTY7XG4gICAgfVxuXG4gICAgeS5wcm90b3R5cGUuZmVhdHVyZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gbmV3IHgodGhpcy5mZWF0dXJlc1tlXSwgdGhpcy5vcHRpb25zLmV4dGVudCk7XG4gICAgfSwgeC5wcm90b3R5cGUubG9hZEdlb21ldHJ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHQgPSB0aGlzLnJhd0dlb21ldHJ5O1xuICAgICAgdGhpcy5nZW9tZXRyeSA9IFtdO1xuXG4gICAgICBmb3IgKHZhciByID0gMDsgciA8IHQubGVuZ3RoOyByKyspIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IHRbcl0sIG8gPSBbXSwgbiA9IDA7IG4gPCBpLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgby5wdXNoKG5ldyBlLlBvaW50JDEoaVtuXVswXSwgaVtuXVsxXSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5nZW9tZXRyeS5wdXNoKG8pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5nZW9tZXRyeTtcbiAgICB9LCB4LnByb3RvdHlwZS5iYm94ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5nZW9tZXRyeSB8fCB0aGlzLmxvYWRHZW9tZXRyeSgpO1xuXG4gICAgICBmb3IgKHZhciBlID0gdGhpcy5nZW9tZXRyeSwgdCA9IDEgLyAwLCByID0gLTEgLyAwLCBpID0gMSAvIDAsIG8gPSAtMSAvIDAsIG4gPSAwOyBuIDwgZS5sZW5ndGg7IG4rKykge1xuICAgICAgICBmb3IgKHZhciBzID0gZVtuXSwgYSA9IDA7IGEgPCBzLmxlbmd0aDsgYSsrKSB7XG4gICAgICAgICAgdmFyIGwgPSBzW2FdO1xuICAgICAgICAgIHQgPSBNYXRoLm1pbih0LCBsLngpLCByID0gTWF0aC5tYXgociwgbC54KSwgaSA9IE1hdGgubWluKGksIGwueSksIG8gPSBNYXRoLm1heChvLCBsLnkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbdCwgaSwgciwgb107XG4gICAgfSwgeC5wcm90b3R5cGUudG9HZW9KU09OID0gdi5wcm90b3R5cGUudG9HZW9KU09OO1xuICAgIHZhciB3ID0gSSxcbiAgICAgICAgUyA9IG07XG5cbiAgICBmdW5jdGlvbiBJKHQpIHtcbiAgICAgIHZhciByID0gbmV3IGUucGJmKCk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgICAgZm9yICh2YXIgciBpbiBlLmxheWVycykge1xuICAgICAgICAgIHQud3JpdGVNZXNzYWdlKDMsIE0sIGUubGF5ZXJzW3JdKTtcbiAgICAgICAgfVxuICAgICAgfSh0LCByKSwgci5maW5pc2goKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBNKGUsIHQpIHtcbiAgICAgIHZhciByO1xuICAgICAgdC53cml0ZVZhcmludEZpZWxkKDE1LCBlLnZlcnNpb24gfHwgMSksIHQud3JpdGVTdHJpbmdGaWVsZCgxLCBlLm5hbWUgfHwgXCJcIiksIHQud3JpdGVWYXJpbnRGaWVsZCg1LCBlLmV4dGVudCB8fCA0MDk2KTtcbiAgICAgIHZhciBpID0ge1xuICAgICAgICBrZXlzOiBbXSxcbiAgICAgICAgdmFsdWVzOiBbXSxcbiAgICAgICAga2V5Y2FjaGU6IHt9LFxuICAgICAgICB2YWx1ZWNhY2hlOiB7fVxuICAgICAgfTtcblxuICAgICAgZm9yIChyID0gMDsgciA8IGUubGVuZ3RoOyByKyspIHtcbiAgICAgICAgaS5mZWF0dXJlID0gZS5mZWF0dXJlKHIpLCB0LndyaXRlTWVzc2FnZSgyLCBiLCBpKTtcbiAgICAgIH1cblxuICAgICAgdmFyIG8gPSBpLmtleXM7XG5cbiAgICAgIGZvciAociA9IDA7IHIgPCBvLmxlbmd0aDsgcisrKSB7XG4gICAgICAgIHQud3JpdGVTdHJpbmdGaWVsZCgzLCBvW3JdKTtcbiAgICAgIH1cblxuICAgICAgdmFyIG4gPSBpLnZhbHVlcztcblxuICAgICAgZm9yIChyID0gMDsgciA8IG4ubGVuZ3RoOyByKyspIHtcbiAgICAgICAgdC53cml0ZU1lc3NhZ2UoNCwgQywgbltyXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYihlLCB0KSB7XG4gICAgICB2YXIgciA9IGUuZmVhdHVyZTtcbiAgICAgIHZvaWQgMCAhPT0gci5pZCAmJiB0LndyaXRlVmFyaW50RmllbGQoMSwgci5pZCksIHQud3JpdGVNZXNzYWdlKDIsIF8sIGUpLCB0LndyaXRlVmFyaW50RmllbGQoMywgci50eXBlKSwgdC53cml0ZU1lc3NhZ2UoNCwgVCwgcik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gXyhlLCB0KSB7XG4gICAgICB2YXIgciA9IGUuZmVhdHVyZSxcbiAgICAgICAgICBpID0gZS5rZXlzLFxuICAgICAgICAgIG8gPSBlLnZhbHVlcyxcbiAgICAgICAgICBuID0gZS5rZXljYWNoZSxcbiAgICAgICAgICBzID0gZS52YWx1ZWNhY2hlO1xuXG4gICAgICBmb3IgKHZhciBhIGluIHIucHJvcGVydGllcykge1xuICAgICAgICB2YXIgbCA9IG5bYV07XG4gICAgICAgIHZvaWQgMCA9PT0gbCAmJiAoaS5wdXNoKGEpLCBuW2FdID0gbCA9IGkubGVuZ3RoIC0gMSksIHQud3JpdGVWYXJpbnQobCk7XG4gICAgICAgIHZhciB1ID0gci5wcm9wZXJ0aWVzW2FdLFxuICAgICAgICAgICAgaCA9IHR5cGVvZiB1O1xuICAgICAgICBcInN0cmluZ1wiICE9PSBoICYmIFwiYm9vbGVhblwiICE9PSBoICYmIFwibnVtYmVyXCIgIT09IGggJiYgKHUgPSBKU09OLnN0cmluZ2lmeSh1KSk7XG4gICAgICAgIHZhciBjID0gaCArIFwiOlwiICsgdSxcbiAgICAgICAgICAgIHAgPSBzW2NdO1xuICAgICAgICB2b2lkIDAgPT09IHAgJiYgKG8ucHVzaCh1KSwgc1tjXSA9IHAgPSBvLmxlbmd0aCAtIDEpLCB0LndyaXRlVmFyaW50KHApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGsoZSwgdCkge1xuICAgICAgcmV0dXJuICh0IDw8IDMpICsgKDcgJiBlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBQKGUpIHtcbiAgICAgIHJldHVybiBlIDw8IDEgXiBlID4+IDMxO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFQoZSwgdCkge1xuICAgICAgZm9yICh2YXIgciA9IGUubG9hZEdlb21ldHJ5KCksIGkgPSBlLnR5cGUsIG8gPSAwLCBuID0gMCwgcyA9IHIubGVuZ3RoLCBhID0gMDsgYSA8IHM7IGErKykge1xuICAgICAgICB2YXIgbCA9IHJbYV0sXG4gICAgICAgICAgICB1ID0gMTtcbiAgICAgICAgMSA9PT0gaSAmJiAodSA9IGwubGVuZ3RoKSwgdC53cml0ZVZhcmludChrKDEsIHUpKTtcblxuICAgICAgICBmb3IgKHZhciBoID0gMyA9PT0gaSA/IGwubGVuZ3RoIC0gMSA6IGwubGVuZ3RoLCBjID0gMDsgYyA8IGg7IGMrKykge1xuICAgICAgICAgIDEgPT09IGMgJiYgMSAhPT0gaSAmJiB0LndyaXRlVmFyaW50KGsoMiwgaCAtIDEpKTtcbiAgICAgICAgICB2YXIgcCA9IGxbY10ueCAtIG8sXG4gICAgICAgICAgICAgIGYgPSBsW2NdLnkgLSBuO1xuICAgICAgICAgIHQud3JpdGVWYXJpbnQoUChwKSksIHQud3JpdGVWYXJpbnQoUChmKSksIG8gKz0gcCwgbiArPSBmO1xuICAgICAgICB9XG5cbiAgICAgICAgMyA9PT0gaSAmJiB0LndyaXRlVmFyaW50KGsoNywgMSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIEMoZSwgdCkge1xuICAgICAgdmFyIHIgPSB0eXBlb2YgZTtcbiAgICAgIFwic3RyaW5nXCIgPT09IHIgPyB0LndyaXRlU3RyaW5nRmllbGQoMSwgZSkgOiBcImJvb2xlYW5cIiA9PT0gciA/IHQud3JpdGVCb29sZWFuRmllbGQoNywgZSkgOiBcIm51bWJlclwiID09PSByICYmIChlICUgMSAhPSAwID8gdC53cml0ZURvdWJsZUZpZWxkKDMsIGUpIDogZSA8IDAgPyB0LndyaXRlU1ZhcmludEZpZWxkKDYsIGUpIDogdC53cml0ZVZhcmludEZpZWxkKDUsIGUpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBEKGUsIHQsIHIsIGkpIHtcbiAgICAgIEwoZSwgciwgaSksIEwodCwgMiAqIHIsIDIgKiBpKSwgTCh0LCAyICogciArIDEsIDIgKiBpICsgMSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gTChlLCB0LCByKSB7XG4gICAgICB2YXIgaSA9IGVbdF07XG4gICAgICBlW3RdID0gZVtyXSwgZVtyXSA9IGk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24geihlLCB0LCByLCBpKSB7XG4gICAgICB2YXIgbyA9IGUgLSByLFxuICAgICAgICAgIG4gPSB0IC0gaTtcbiAgICAgIHJldHVybiBvICogbyArIG4gKiBuO1xuICAgIH1cblxuICAgIHcuZnJvbVZlY3RvclRpbGVKcyA9IEksIHcuZnJvbUdlb2pzb25WdCA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICB0ID0gdCB8fCB7fTtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGkgaW4gZSkge1xuICAgICAgICByW2ldID0gbmV3IG0oZVtpXS5mZWF0dXJlcywgdCksIHJbaV0ubmFtZSA9IGksIHJbaV0udmVyc2lvbiA9IHQudmVyc2lvbiwgcltpXS5leHRlbnQgPSB0LmV4dGVudDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIEkoe1xuICAgICAgICBsYXllcnM6IHJcbiAgICAgIH0pO1xuICAgIH0sIHcuR2VvSlNPTldyYXBwZXIgPSBTO1xuXG4gICAgdmFyIE8gPSBmdW5jdGlvbiBPKGUpIHtcbiAgICAgIHJldHVybiBlWzBdO1xuICAgIH0sXG4gICAgICAgIEUgPSBmdW5jdGlvbiBFKGUpIHtcbiAgICAgIHJldHVybiBlWzFdO1xuICAgIH0sXG4gICAgICAgIEYgPSBmdW5jdGlvbiBGKGUsIHQsIHIsIGksIG8pIHtcbiAgICAgIHZvaWQgMCA9PT0gdCAmJiAodCA9IE8pLCB2b2lkIDAgPT09IHIgJiYgKHIgPSBFKSwgdm9pZCAwID09PSBpICYmIChpID0gNjQpLCB2b2lkIDAgPT09IG8gJiYgKG8gPSBGbG9hdDY0QXJyYXkpLCB0aGlzLm5vZGVTaXplID0gaSwgdGhpcy5wb2ludHMgPSBlO1xuXG4gICAgICBmb3IgKHZhciBuID0gZS5sZW5ndGggPCA2NTUzNiA/IFVpbnQxNkFycmF5IDogVWludDMyQXJyYXksIHMgPSB0aGlzLmlkcyA9IG5ldyBuKGUubGVuZ3RoKSwgYSA9IHRoaXMuY29vcmRzID0gbmV3IG8oMiAqIGUubGVuZ3RoKSwgbCA9IDA7IGwgPCBlLmxlbmd0aDsgbCsrKSB7XG4gICAgICAgIHNbbF0gPSBsLCBhWzIgKiBsXSA9IHQoZVtsXSksIGFbMiAqIGwgKyAxXSA9IHIoZVtsXSk7XG4gICAgICB9XG5cbiAgICAgICFmdW5jdGlvbiBlKHQsIHIsIGksIG8sIG4sIHMpIHtcbiAgICAgICAgaWYgKCEobiAtIG8gPD0gaSkpIHtcbiAgICAgICAgICB2YXIgYSA9IG8gKyBuID4+IDE7XG4gICAgICAgICAgIWZ1bmN0aW9uIGUodCwgciwgaSwgbywgbiwgcykge1xuICAgICAgICAgICAgZm9yICg7IG4gPiBvOykge1xuICAgICAgICAgICAgICBpZiAobiAtIG8gPiA2MDApIHtcbiAgICAgICAgICAgICAgICB2YXIgYSA9IG4gLSBvICsgMSxcbiAgICAgICAgICAgICAgICAgICAgbCA9IGkgLSBvICsgMSxcbiAgICAgICAgICAgICAgICAgICAgdSA9IE1hdGgubG9nKGEpLFxuICAgICAgICAgICAgICAgICAgICBoID0gLjUgKiBNYXRoLmV4cCgyICogdSAvIDMpLFxuICAgICAgICAgICAgICAgICAgICBjID0gLjUgKiBNYXRoLnNxcnQodSAqIGggKiAoYSAtIGgpIC8gYSkgKiAobCAtIGEgLyAyIDwgMCA/IC0xIDogMSk7XG4gICAgICAgICAgICAgICAgZSh0LCByLCBpLCBNYXRoLm1heChvLCBNYXRoLmZsb29yKGkgLSBsICogaCAvIGEgKyBjKSksIE1hdGgubWluKG4sIE1hdGguZmxvb3IoaSArIChhIC0gbCkgKiBoIC8gYSArIGMpKSwgcyk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB2YXIgcCA9IHJbMiAqIGkgKyBzXSxcbiAgICAgICAgICAgICAgICAgIGYgPSBvLFxuICAgICAgICAgICAgICAgICAgZCA9IG47XG5cbiAgICAgICAgICAgICAgZm9yIChEKHQsIHIsIG8sIGkpLCByWzIgKiBuICsgc10gPiBwICYmIEQodCwgciwgbywgbik7IGYgPCBkOykge1xuICAgICAgICAgICAgICAgIGZvciAoRCh0LCByLCBmLCBkKSwgZisrLCBkLS07IHJbMiAqIGYgKyBzXSA8IHA7KSB7XG4gICAgICAgICAgICAgICAgICBmKys7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9yICg7IHJbMiAqIGQgKyBzXSA+IHA7KSB7XG4gICAgICAgICAgICAgICAgICBkLS07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgclsyICogbyArIHNdID09PSBwID8gRCh0LCByLCBvLCBkKSA6IEQodCwgciwgKytkLCBuKSwgZCA8PSBpICYmIChvID0gZCArIDEpLCBpIDw9IGQgJiYgKG4gPSBkIC0gMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSh0LCByLCBhLCBvLCBuLCBzICUgMiksIGUodCwgciwgaSwgbywgYSAtIDEsIHMgKyAxKSwgZSh0LCByLCBpLCBhICsgMSwgbiwgcyArIDEpO1xuICAgICAgICB9XG4gICAgICB9KHMsIGEsIGksIDAsIHMubGVuZ3RoIC0gMSwgMCk7XG4gICAgfTtcblxuICAgIEYucHJvdG90eXBlLnJhbmdlID0gZnVuY3Rpb24gKGUsIHQsIHIsIGkpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoZSwgdCwgciwgaSwgbywgbiwgcykge1xuICAgICAgICBmb3IgKHZhciBhLCBsLCB1ID0gWzAsIGUubGVuZ3RoIC0gMSwgMF0sIGggPSBbXTsgdS5sZW5ndGg7KSB7XG4gICAgICAgICAgdmFyIGMgPSB1LnBvcCgpLFxuICAgICAgICAgICAgICBwID0gdS5wb3AoKSxcbiAgICAgICAgICAgICAgZiA9IHUucG9wKCk7XG4gICAgICAgICAgaWYgKHAgLSBmIDw9IHMpIGZvciAodmFyIGQgPSBmOyBkIDw9IHA7IGQrKykge1xuICAgICAgICAgICAgbCA9IHRbMiAqIGQgKyAxXSwgKGEgPSB0WzIgKiBkXSkgPj0gciAmJiBhIDw9IG8gJiYgbCA+PSBpICYmIGwgPD0gbiAmJiBoLnB1c2goZVtkXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBnID0gTWF0aC5mbG9vcigoZiArIHApIC8gMik7XG4gICAgICAgICAgICBsID0gdFsyICogZyArIDFdLCAoYSA9IHRbMiAqIGddKSA+PSByICYmIGEgPD0gbyAmJiBsID49IGkgJiYgbCA8PSBuICYmIGgucHVzaChlW2ddKTtcbiAgICAgICAgICAgIHZhciB2ID0gKGMgKyAxKSAlIDI7XG4gICAgICAgICAgICAoMCA9PT0gYyA/IHIgPD0gYSA6IGkgPD0gbCkgJiYgKHUucHVzaChmKSwgdS5wdXNoKGcgLSAxKSwgdS5wdXNoKHYpKSwgKDAgPT09IGMgPyBvID49IGEgOiBuID49IGwpICYmICh1LnB1c2goZyArIDEpLCB1LnB1c2gocCksIHUucHVzaCh2KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGg7XG4gICAgICB9KHRoaXMuaWRzLCB0aGlzLmNvb3JkcywgZSwgdCwgciwgaSwgdGhpcy5ub2RlU2l6ZSk7XG4gICAgfSwgRi5wcm90b3R5cGUud2l0aGluID0gZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoZSwgdCwgciwgaSwgbywgbikge1xuICAgICAgICBmb3IgKHZhciBzID0gWzAsIGUubGVuZ3RoIC0gMSwgMF0sIGEgPSBbXSwgbCA9IG8gKiBvOyBzLmxlbmd0aDspIHtcbiAgICAgICAgICB2YXIgdSA9IHMucG9wKCksXG4gICAgICAgICAgICAgIGggPSBzLnBvcCgpLFxuICAgICAgICAgICAgICBjID0gcy5wb3AoKTtcbiAgICAgICAgICBpZiAoaCAtIGMgPD0gbikgZm9yICh2YXIgcCA9IGM7IHAgPD0gaDsgcCsrKSB7XG4gICAgICAgICAgICB6KHRbMiAqIHBdLCB0WzIgKiBwICsgMV0sIHIsIGkpIDw9IGwgJiYgYS5wdXNoKGVbcF0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgZiA9IE1hdGguZmxvb3IoKGMgKyBoKSAvIDIpLFxuICAgICAgICAgICAgICAgIGQgPSB0WzIgKiBmXSxcbiAgICAgICAgICAgICAgICBnID0gdFsyICogZiArIDFdO1xuICAgICAgICAgICAgeihkLCBnLCByLCBpKSA8PSBsICYmIGEucHVzaChlW2ZdKTtcbiAgICAgICAgICAgIHZhciB2ID0gKHUgKyAxKSAlIDI7XG4gICAgICAgICAgICAoMCA9PT0gdSA/IHIgLSBvIDw9IGQgOiBpIC0gbyA8PSBnKSAmJiAocy5wdXNoKGMpLCBzLnB1c2goZiAtIDEpLCBzLnB1c2godikpLCAoMCA9PT0gdSA/IHIgKyBvID49IGQgOiBpICsgbyA+PSBnKSAmJiAocy5wdXNoKGYgKyAxKSwgcy5wdXNoKGgpLCBzLnB1c2godikpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhO1xuICAgICAgfSh0aGlzLmlkcywgdGhpcy5jb29yZHMsIGUsIHQsIHIsIHRoaXMubm9kZVNpemUpO1xuICAgIH07XG5cbiAgICB2YXIgTiA9IHtcbiAgICAgIG1pblpvb206IDAsXG4gICAgICBtYXhab29tOiAxNixcbiAgICAgIG1pblBvaW50czogMixcbiAgICAgIHJhZGl1czogNDAsXG4gICAgICBleHRlbnQ6IDUxMixcbiAgICAgIG5vZGVTaXplOiA2NCxcbiAgICAgIGxvZzogITEsXG4gICAgICBnZW5lcmF0ZUlkOiAhMSxcbiAgICAgIHJlZHVjZTogbnVsbCxcbiAgICAgIG1hcDogZnVuY3Rpb24gbWFwKGUpIHtcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9XG4gICAgfSxcbiAgICAgICAgSiA9IGZ1bmN0aW9uIEooZSkge1xuICAgICAgdGhpcy5vcHRpb25zID0gVihPYmplY3QuY3JlYXRlKE4pLCBlKSwgdGhpcy50cmVlcyA9IG5ldyBBcnJheSh0aGlzLm9wdGlvbnMubWF4Wm9vbSArIDEpO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBaKGUsIHQsIHIsIGksIG8pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IGUsXG4gICAgICAgIHk6IHQsXG4gICAgICAgIHpvb206IDEgLyAwLFxuICAgICAgICBpZDogcixcbiAgICAgICAgcGFyZW50SWQ6IC0xLFxuICAgICAgICBudW1Qb2ludHM6IGksXG4gICAgICAgIHByb3BlcnRpZXM6IG9cbiAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gQShlLCB0KSB7XG4gICAgICB2YXIgciA9IGUuZ2VvbWV0cnkuY29vcmRpbmF0ZXMsXG4gICAgICAgICAgaSA9IHJbMV07XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiBZKHJbMF0pLFxuICAgICAgICB5OiBqKGkpLFxuICAgICAgICB6b29tOiAxIC8gMCxcbiAgICAgICAgaW5kZXg6IHQsXG4gICAgICAgIHBhcmVudElkOiAtMVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBCKGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiRmVhdHVyZVwiLFxuICAgICAgICBpZDogZS5pZCxcbiAgICAgICAgcHJvcGVydGllczogRyhlKSxcbiAgICAgICAgZ2VvbWV0cnk6IHtcbiAgICAgICAgICB0eXBlOiBcIlBvaW50XCIsXG4gICAgICAgICAgY29vcmRpbmF0ZXM6IFsoaSA9IGUueCwgMzYwICogKGkgLSAuNSkpLCAodCA9IGUueSwgciA9ICgxODAgLSAzNjAgKiB0KSAqIE1hdGguUEkgLyAxODAsIDM2MCAqIE1hdGguYXRhbihNYXRoLmV4cChyKSkgLyBNYXRoLlBJIC0gOTApXVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdmFyIHQsIHIsIGk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gRyhlKSB7XG4gICAgICB2YXIgdCA9IGUubnVtUG9pbnRzLFxuICAgICAgICAgIHIgPSB0ID49IDFlNCA/IE1hdGgucm91bmQodCAvIDFlMykgKyBcImtcIiA6IHQgPj0gMWUzID8gTWF0aC5yb3VuZCh0IC8gMTAwKSAvIDEwICsgXCJrXCIgOiB0O1xuICAgICAgcmV0dXJuIFYoVih7fSwgZS5wcm9wZXJ0aWVzKSwge1xuICAgICAgICBjbHVzdGVyOiAhMCxcbiAgICAgICAgY2x1c3Rlcl9pZDogZS5pZCxcbiAgICAgICAgcG9pbnRfY291bnQ6IHQsXG4gICAgICAgIHBvaW50X2NvdW50X2FiYnJldmlhdGVkOiByXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBZKGUpIHtcbiAgICAgIHJldHVybiBlIC8gMzYwICsgLjU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaihlKSB7XG4gICAgICB2YXIgdCA9IE1hdGguc2luKGUgKiBNYXRoLlBJIC8gMTgwKSxcbiAgICAgICAgICByID0gLjUgLSAuMjUgKiBNYXRoLmxvZygoMSArIHQpIC8gKDEgLSB0KSkgLyBNYXRoLlBJO1xuICAgICAgcmV0dXJuIHIgPCAwID8gMCA6IHIgPiAxID8gMSA6IHI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gVihlLCB0KSB7XG4gICAgICBmb3IgKHZhciByIGluIHQpIHtcbiAgICAgICAgZVtyXSA9IHRbcl07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFgoZSkge1xuICAgICAgcmV0dXJuIGUueDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBXKGUpIHtcbiAgICAgIHJldHVybiBlLnk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gUihlLCB0LCByLCBpLCBvLCBuKSB7XG4gICAgICB2YXIgcyA9IG8gLSByLFxuICAgICAgICAgIGEgPSBuIC0gaTtcblxuICAgICAgaWYgKDAgIT09IHMgfHwgMCAhPT0gYSkge1xuICAgICAgICB2YXIgbCA9ICgoZSAtIHIpICogcyArICh0IC0gaSkgKiBhKSAvIChzICogcyArIGEgKiBhKTtcbiAgICAgICAgbCA+IDEgPyAociA9IG8sIGkgPSBuKSA6IGwgPiAwICYmIChyICs9IHMgKiBsLCBpICs9IGEgKiBsKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIChzID0gZSAtIHIpICogcyArIChhID0gdCAtIGkpICogYTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBxKGUsIHQsIHIsIGkpIHtcbiAgICAgIHZhciBvID0ge1xuICAgICAgICBpZDogdm9pZCAwID09PSBlID8gbnVsbCA6IGUsXG4gICAgICAgIHR5cGU6IHQsXG4gICAgICAgIGdlb21ldHJ5OiByLFxuICAgICAgICB0YWdzOiBpLFxuICAgICAgICBtaW5YOiAxIC8gMCxcbiAgICAgICAgbWluWTogMSAvIDAsXG4gICAgICAgIG1heFg6IC0xIC8gMCxcbiAgICAgICAgbWF4WTogLTEgLyAwXG4gICAgICB9O1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciB0ID0gZS5nZW9tZXRyeSxcbiAgICAgICAgICAgIHIgPSBlLnR5cGU7XG4gICAgICAgIGlmIChcIlBvaW50XCIgPT09IHIgfHwgXCJNdWx0aVBvaW50XCIgPT09IHIgfHwgXCJMaW5lU3RyaW5nXCIgPT09IHIpIFUoZSwgdCk7ZWxzZSBpZiAoXCJQb2x5Z29uXCIgPT09IHIgfHwgXCJNdWx0aUxpbmVTdHJpbmdcIiA9PT0gcikgZm9yICh2YXIgaSA9IDA7IGkgPCB0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgVShlLCB0W2ldKTtcbiAgICAgICAgfSBlbHNlIGlmIChcIk11bHRpUG9seWdvblwiID09PSByKSBmb3IgKGkgPSAwOyBpIDwgdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGZvciAodmFyIG8gPSAwOyBvIDwgdFtpXS5sZW5ndGg7IG8rKykge1xuICAgICAgICAgICAgVShlLCB0W2ldW29dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0obyksIG87XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gVShlLCB0KSB7XG4gICAgICBmb3IgKHZhciByID0gMDsgciA8IHQubGVuZ3RoOyByICs9IDMpIHtcbiAgICAgICAgZS5taW5YID0gTWF0aC5taW4oZS5taW5YLCB0W3JdKSwgZS5taW5ZID0gTWF0aC5taW4oZS5taW5ZLCB0W3IgKyAxXSksIGUubWF4WCA9IE1hdGgubWF4KGUubWF4WCwgdFtyXSksIGUubWF4WSA9IE1hdGgubWF4KGUubWF4WSwgdFtyICsgMV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uICQoZSwgdCwgciwgaSkge1xuICAgICAgaWYgKHQuZ2VvbWV0cnkpIHtcbiAgICAgICAgdmFyIG8gPSB0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzLFxuICAgICAgICAgICAgbiA9IHQuZ2VvbWV0cnkudHlwZSxcbiAgICAgICAgICAgIHMgPSBNYXRoLnBvdyhyLnRvbGVyYW5jZSAvICgoMSA8PCByLm1heFpvb20pICogci5leHRlbnQpLCAyKSxcbiAgICAgICAgICAgIGEgPSBbXSxcbiAgICAgICAgICAgIGwgPSB0LmlkO1xuICAgICAgICBpZiAoci5wcm9tb3RlSWQgPyBsID0gdC5wcm9wZXJ0aWVzW3IucHJvbW90ZUlkXSA6IHIuZ2VuZXJhdGVJZCAmJiAobCA9IGkgfHwgMCksIFwiUG9pbnRcIiA9PT0gbikgSChvLCBhKTtlbHNlIGlmIChcIk11bHRpUG9pbnRcIiA9PT0gbikgZm9yICh2YXIgdSA9IDA7IHUgPCBvLmxlbmd0aDsgdSsrKSB7XG4gICAgICAgICAgSChvW3VdLCBhKTtcbiAgICAgICAgfSBlbHNlIGlmIChcIkxpbmVTdHJpbmdcIiA9PT0gbikgSyhvLCBhLCBzLCAhMSk7ZWxzZSBpZiAoXCJNdWx0aUxpbmVTdHJpbmdcIiA9PT0gbikge1xuICAgICAgICAgIGlmIChyLmxpbmVNZXRyaWNzKSB7XG4gICAgICAgICAgICBmb3IgKHUgPSAwOyB1IDwgby5sZW5ndGg7IHUrKykge1xuICAgICAgICAgICAgICBLKG9bdV0sIGEgPSBbXSwgcywgITEpLCBlLnB1c2gocShsLCBcIkxpbmVTdHJpbmdcIiwgYSwgdC5wcm9wZXJ0aWVzKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBRKG8sIGEsIHMsICExKTtcbiAgICAgICAgfSBlbHNlIGlmIChcIlBvbHlnb25cIiA9PT0gbikgUShvLCBhLCBzLCAhMCk7ZWxzZSB7XG4gICAgICAgICAgaWYgKFwiTXVsdGlQb2x5Z29uXCIgIT09IG4pIHtcbiAgICAgICAgICAgIGlmIChcIkdlb21ldHJ5Q29sbGVjdGlvblwiID09PSBuKSB7XG4gICAgICAgICAgICAgIGZvciAodSA9IDA7IHUgPCB0Lmdlb21ldHJ5Lmdlb21ldHJpZXMubGVuZ3RoOyB1KyspIHtcbiAgICAgICAgICAgICAgICAkKGUsIHtcbiAgICAgICAgICAgICAgICAgIGlkOiBsLFxuICAgICAgICAgICAgICAgICAgZ2VvbWV0cnk6IHQuZ2VvbWV0cnkuZ2VvbWV0cmllc1t1XSxcbiAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHQucHJvcGVydGllc1xuICAgICAgICAgICAgICAgIH0sIHIsIGkpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnB1dCBkYXRhIGlzIG5vdCBhIHZhbGlkIEdlb0pTT04gb2JqZWN0LlwiKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKHUgPSAwOyB1IDwgby5sZW5ndGg7IHUrKykge1xuICAgICAgICAgICAgdmFyIGggPSBbXTtcbiAgICAgICAgICAgIFEob1t1XSwgaCwgcywgITApLCBhLnB1c2goaCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGUucHVzaChxKGwsIG4sIGEsIHQucHJvcGVydGllcykpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIEgoZSwgdCkge1xuICAgICAgdC5wdXNoKGVlKGVbMF0pKSwgdC5wdXNoKHRlKGVbMV0pKSwgdC5wdXNoKDApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIEsoZSwgdCwgciwgaSkge1xuICAgICAgZm9yICh2YXIgbywgbiwgcyA9IDAsIGEgPSAwOyBhIDwgZS5sZW5ndGg7IGErKykge1xuICAgICAgICB2YXIgbCA9IGVlKGVbYV1bMF0pLFxuICAgICAgICAgICAgdSA9IHRlKGVbYV1bMV0pO1xuICAgICAgICB0LnB1c2gobCksIHQucHVzaCh1KSwgdC5wdXNoKDApLCBhID4gMCAmJiAocyArPSBpID8gKG8gKiB1IC0gbCAqIG4pIC8gMiA6IE1hdGguc3FydChNYXRoLnBvdyhsIC0gbywgMikgKyBNYXRoLnBvdyh1IC0gbiwgMikpKSwgbyA9IGwsIG4gPSB1O1xuICAgICAgfVxuXG4gICAgICB2YXIgaCA9IHQubGVuZ3RoIC0gMztcbiAgICAgIHRbMl0gPSAxLCBmdW5jdGlvbiBlKHQsIHIsIGksIG8pIHtcbiAgICAgICAgZm9yICh2YXIgbiwgcyA9IG8sIGEgPSBpIC0gciA+PiAxLCBsID0gaSAtIHIsIHUgPSB0W3JdLCBoID0gdFtyICsgMV0sIGMgPSB0W2ldLCBwID0gdFtpICsgMV0sIGYgPSByICsgMzsgZiA8IGk7IGYgKz0gMykge1xuICAgICAgICAgIHZhciBkID0gUih0W2ZdLCB0W2YgKyAxXSwgdSwgaCwgYywgcCk7XG4gICAgICAgICAgaWYgKGQgPiBzKSBuID0gZiwgcyA9IGQ7ZWxzZSBpZiAoZCA9PT0gcykge1xuICAgICAgICAgICAgdmFyIGcgPSBNYXRoLmFicyhmIC0gYSk7XG4gICAgICAgICAgICBnIDwgbCAmJiAobiA9IGYsIGwgPSBnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzID4gbyAmJiAobiAtIHIgPiAzICYmIGUodCwgciwgbiwgbyksIHRbbiArIDJdID0gcywgaSAtIG4gPiAzICYmIGUodCwgbiwgaSwgbykpO1xuICAgICAgfSh0LCAwLCBoLCByKSwgdFtoICsgMl0gPSAxLCB0LnNpemUgPSBNYXRoLmFicyhzKSwgdC5zdGFydCA9IDAsIHQuZW5kID0gdC5zaXplO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFEoZSwgdCwgciwgaSkge1xuICAgICAgZm9yICh2YXIgbyA9IDA7IG8gPCBlLmxlbmd0aDsgbysrKSB7XG4gICAgICAgIHZhciBuID0gW107XG4gICAgICAgIEsoZVtvXSwgbiwgciwgaSksIHQucHVzaChuKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlZShlKSB7XG4gICAgICByZXR1cm4gZSAvIDM2MCArIC41O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRlKGUpIHtcbiAgICAgIHZhciB0ID0gTWF0aC5zaW4oZSAqIE1hdGguUEkgLyAxODApLFxuICAgICAgICAgIHIgPSAuNSAtIC4yNSAqIE1hdGgubG9nKCgxICsgdCkgLyAoMSAtIHQpKSAvIE1hdGguUEk7XG4gICAgICByZXR1cm4gciA8IDAgPyAwIDogciA+IDEgPyAxIDogcjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZShlLCB0LCByLCBpLCBvLCBuLCBzLCBhKSB7XG4gICAgICBpZiAoaSAvPSB0LCBuID49IChyIC89IHQpICYmIHMgPCBpKSByZXR1cm4gZTtcbiAgICAgIGlmIChzIDwgciB8fCBuID49IGkpIHJldHVybiBudWxsO1xuXG4gICAgICBmb3IgKHZhciBsID0gW10sIHUgPSAwOyB1IDwgZS5sZW5ndGg7IHUrKykge1xuICAgICAgICB2YXIgaCA9IGVbdV0sXG4gICAgICAgICAgICBjID0gaC5nZW9tZXRyeSxcbiAgICAgICAgICAgIHAgPSBoLnR5cGUsXG4gICAgICAgICAgICBmID0gMCA9PT0gbyA/IGgubWluWCA6IGgubWluWSxcbiAgICAgICAgICAgIGQgPSAwID09PSBvID8gaC5tYXhYIDogaC5tYXhZO1xuICAgICAgICBpZiAoZiA+PSByICYmIGQgPCBpKSBsLnB1c2goaCk7ZWxzZSBpZiAoIShkIDwgciB8fCBmID49IGkpKSB7XG4gICAgICAgICAgdmFyIGcgPSBbXTtcbiAgICAgICAgICBpZiAoXCJQb2ludFwiID09PSBwIHx8IFwiTXVsdGlQb2ludFwiID09PSBwKSBpZShjLCBnLCByLCBpLCBvKTtlbHNlIGlmIChcIkxpbmVTdHJpbmdcIiA9PT0gcCkgb2UoYywgZywgciwgaSwgbywgITEsIGEubGluZU1ldHJpY3MpO2Vsc2UgaWYgKFwiTXVsdGlMaW5lU3RyaW5nXCIgPT09IHApIHNlKGMsIGcsIHIsIGksIG8sICExKTtlbHNlIGlmIChcIlBvbHlnb25cIiA9PT0gcCkgc2UoYywgZywgciwgaSwgbywgITApO2Vsc2UgaWYgKFwiTXVsdGlQb2x5Z29uXCIgPT09IHApIGZvciAodmFyIHYgPSAwOyB2IDwgYy5sZW5ndGg7IHYrKykge1xuICAgICAgICAgICAgdmFyIG0gPSBbXTtcbiAgICAgICAgICAgIHNlKGNbdl0sIG0sIHIsIGksIG8sICEwKSwgbS5sZW5ndGggJiYgZy5wdXNoKG0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChnLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGEubGluZU1ldHJpY3MgJiYgXCJMaW5lU3RyaW5nXCIgPT09IHApIHtcbiAgICAgICAgICAgICAgZm9yICh2ID0gMDsgdiA8IGcubGVuZ3RoOyB2KyspIHtcbiAgICAgICAgICAgICAgICBsLnB1c2gocShoLmlkLCBwLCBnW3ZdLCBoLnRhZ3MpKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBcIkxpbmVTdHJpbmdcIiAhPT0gcCAmJiBcIk11bHRpTGluZVN0cmluZ1wiICE9PSBwIHx8ICgxID09PSBnLmxlbmd0aCA/IChwID0gXCJMaW5lU3RyaW5nXCIsIGcgPSBnWzBdKSA6IHAgPSBcIk11bHRpTGluZVN0cmluZ1wiKSwgXCJQb2ludFwiICE9PSBwICYmIFwiTXVsdGlQb2ludFwiICE9PSBwIHx8IChwID0gMyA9PT0gZy5sZW5ndGggPyBcIlBvaW50XCIgOiBcIk11bHRpUG9pbnRcIiksIGwucHVzaChxKGguaWQsIHAsIGcsIGgudGFncykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbC5sZW5ndGggPyBsIDogbnVsbDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpZShlLCB0LCByLCBpLCBvKSB7XG4gICAgICBmb3IgKHZhciBuID0gMDsgbiA8IGUubGVuZ3RoOyBuICs9IDMpIHtcbiAgICAgICAgdmFyIHMgPSBlW24gKyBvXTtcbiAgICAgICAgcyA+PSByICYmIHMgPD0gaSAmJiAodC5wdXNoKGVbbl0pLCB0LnB1c2goZVtuICsgMV0pLCB0LnB1c2goZVtuICsgMl0pKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvZShlLCB0LCByLCBpLCBvLCBuLCBzKSB7XG4gICAgICBmb3IgKHZhciBhLCBsLCB1ID0gbmUoZSksIGggPSAwID09PSBvID8gbGUgOiB1ZSwgYyA9IGUuc3RhcnQsIHAgPSAwOyBwIDwgZS5sZW5ndGggLSAzOyBwICs9IDMpIHtcbiAgICAgICAgdmFyIGYgPSBlW3BdLFxuICAgICAgICAgICAgZCA9IGVbcCArIDFdLFxuICAgICAgICAgICAgZyA9IGVbcCArIDJdLFxuICAgICAgICAgICAgdiA9IGVbcCArIDNdLFxuICAgICAgICAgICAgbSA9IGVbcCArIDRdLFxuICAgICAgICAgICAgeSA9IDAgPT09IG8gPyBmIDogZCxcbiAgICAgICAgICAgIHggPSAwID09PSBvID8gdiA6IG0sXG4gICAgICAgICAgICB3ID0gITE7XG4gICAgICAgIHMgJiYgKGEgPSBNYXRoLnNxcnQoTWF0aC5wb3coZiAtIHYsIDIpICsgTWF0aC5wb3coZCAtIG0sIDIpKSksIHkgPCByID8geCA+IHIgJiYgKGwgPSBoKHUsIGYsIGQsIHYsIG0sIHIpLCBzICYmICh1LnN0YXJ0ID0gYyArIGEgKiBsKSkgOiB5ID4gaSA/IHggPCBpICYmIChsID0gaCh1LCBmLCBkLCB2LCBtLCBpKSwgcyAmJiAodS5zdGFydCA9IGMgKyBhICogbCkpIDogYWUodSwgZiwgZCwgZyksIHggPCByICYmIHkgPj0gciAmJiAobCA9IGgodSwgZiwgZCwgdiwgbSwgciksIHcgPSAhMCksIHggPiBpICYmIHkgPD0gaSAmJiAobCA9IGgodSwgZiwgZCwgdiwgbSwgaSksIHcgPSAhMCksICFuICYmIHcgJiYgKHMgJiYgKHUuZW5kID0gYyArIGEgKiBsKSwgdC5wdXNoKHUpLCB1ID0gbmUoZSkpLCBzICYmIChjICs9IGEpO1xuICAgICAgfVxuXG4gICAgICB2YXIgUyA9IGUubGVuZ3RoIC0gMztcbiAgICAgIGYgPSBlW1NdLCBkID0gZVtTICsgMV0sIGcgPSBlW1MgKyAyXSwgKHkgPSAwID09PSBvID8gZiA6IGQpID49IHIgJiYgeSA8PSBpICYmIGFlKHUsIGYsIGQsIGcpLCBTID0gdS5sZW5ndGggLSAzLCBuICYmIFMgPj0gMyAmJiAodVtTXSAhPT0gdVswXSB8fCB1W1MgKyAxXSAhPT0gdVsxXSkgJiYgYWUodSwgdVswXSwgdVsxXSwgdVsyXSksIHUubGVuZ3RoICYmIHQucHVzaCh1KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBuZShlKSB7XG4gICAgICB2YXIgdCA9IFtdO1xuICAgICAgcmV0dXJuIHQuc2l6ZSA9IGUuc2l6ZSwgdC5zdGFydCA9IGUuc3RhcnQsIHQuZW5kID0gZS5lbmQsIHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2UoZSwgdCwgciwgaSwgbywgbikge1xuICAgICAgZm9yICh2YXIgcyA9IDA7IHMgPCBlLmxlbmd0aDsgcysrKSB7XG4gICAgICAgIG9lKGVbc10sIHQsIHIsIGksIG8sIG4sICExKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZShlLCB0LCByLCBpKSB7XG4gICAgICBlLnB1c2godCksIGUucHVzaChyKSwgZS5wdXNoKGkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxlKGUsIHQsIHIsIGksIG8sIG4pIHtcbiAgICAgIHZhciBzID0gKG4gLSB0KSAvIChpIC0gdCk7XG4gICAgICByZXR1cm4gZS5wdXNoKG4pLCBlLnB1c2gociArIChvIC0gcikgKiBzKSwgZS5wdXNoKDEpLCBzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVlKGUsIHQsIHIsIGksIG8sIG4pIHtcbiAgICAgIHZhciBzID0gKG4gLSByKSAvIChvIC0gcik7XG4gICAgICByZXR1cm4gZS5wdXNoKHQgKyAoaSAtIHQpICogcyksIGUucHVzaChuKSwgZS5wdXNoKDEpLCBzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhlKGUsIHQpIHtcbiAgICAgIGZvciAodmFyIHIgPSBbXSwgaSA9IDA7IGkgPCBlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBvLFxuICAgICAgICAgICAgbiA9IGVbaV0sXG4gICAgICAgICAgICBzID0gbi50eXBlO1xuICAgICAgICBpZiAoXCJQb2ludFwiID09PSBzIHx8IFwiTXVsdGlQb2ludFwiID09PSBzIHx8IFwiTGluZVN0cmluZ1wiID09PSBzKSBvID0gY2Uobi5nZW9tZXRyeSwgdCk7ZWxzZSBpZiAoXCJNdWx0aUxpbmVTdHJpbmdcIiA9PT0gcyB8fCBcIlBvbHlnb25cIiA9PT0gcykge1xuICAgICAgICAgIG8gPSBbXTtcblxuICAgICAgICAgIGZvciAodmFyIGEgPSAwOyBhIDwgbi5nZW9tZXRyeS5sZW5ndGg7IGErKykge1xuICAgICAgICAgICAgby5wdXNoKGNlKG4uZ2VvbWV0cnlbYV0sIHQpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoXCJNdWx0aVBvbHlnb25cIiA9PT0gcykgZm9yIChvID0gW10sIGEgPSAwOyBhIDwgbi5nZW9tZXRyeS5sZW5ndGg7IGErKykge1xuICAgICAgICAgIGZvciAodmFyIGwgPSBbXSwgdSA9IDA7IHUgPCBuLmdlb21ldHJ5W2FdLmxlbmd0aDsgdSsrKSB7XG4gICAgICAgICAgICBsLnB1c2goY2Uobi5nZW9tZXRyeVthXVt1XSwgdCkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG8ucHVzaChsKTtcbiAgICAgICAgfVxuICAgICAgICByLnB1c2gocShuLmlkLCBzLCBvLCBuLnRhZ3MpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2UoZSwgdCkge1xuICAgICAgdmFyIHIgPSBbXTtcbiAgICAgIHIuc2l6ZSA9IGUuc2l6ZSwgdm9pZCAwICE9PSBlLnN0YXJ0ICYmIChyLnN0YXJ0ID0gZS5zdGFydCwgci5lbmQgPSBlLmVuZCk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZS5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICByLnB1c2goZVtpXSArIHQsIGVbaSArIDFdLCBlW2kgKyAyXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBlKGUsIHQpIHtcbiAgICAgIGlmIChlLnRyYW5zZm9ybWVkKSByZXR1cm4gZTtcbiAgICAgIHZhciByLFxuICAgICAgICAgIGksXG4gICAgICAgICAgbyxcbiAgICAgICAgICBuID0gMSA8PCBlLnosXG4gICAgICAgICAgcyA9IGUueCxcbiAgICAgICAgICBhID0gZS55O1xuXG4gICAgICBmb3IgKHIgPSAwOyByIDwgZS5mZWF0dXJlcy5sZW5ndGg7IHIrKykge1xuICAgICAgICB2YXIgbCA9IGUuZmVhdHVyZXNbcl0sXG4gICAgICAgICAgICB1ID0gbC5nZW9tZXRyeSxcbiAgICAgICAgICAgIGggPSBsLnR5cGU7XG4gICAgICAgIGlmIChsLmdlb21ldHJ5ID0gW10sIDEgPT09IGgpIGZvciAoaSA9IDA7IGkgPCB1Lmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgICAgbC5nZW9tZXRyeS5wdXNoKGZlKHVbaV0sIHVbaSArIDFdLCB0LCBuLCBzLCBhKSk7XG4gICAgICAgIH0gZWxzZSBmb3IgKGkgPSAwOyBpIDwgdS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBjID0gW107XG5cbiAgICAgICAgICBmb3IgKG8gPSAwOyBvIDwgdVtpXS5sZW5ndGg7IG8gKz0gMikge1xuICAgICAgICAgICAgYy5wdXNoKGZlKHVbaV1bb10sIHVbaV1bbyArIDFdLCB0LCBuLCBzLCBhKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbC5nZW9tZXRyeS5wdXNoKGMpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlLnRyYW5zZm9ybWVkID0gITAsIGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZmUoZSwgdCwgciwgaSwgbywgbikge1xuICAgICAgcmV0dXJuIFtNYXRoLnJvdW5kKHIgKiAoZSAqIGkgLSBvKSksIE1hdGgucm91bmQociAqICh0ICogaSAtIG4pKV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGUoZSwgdCwgciwgaSwgbykge1xuICAgICAgZm9yICh2YXIgbiA9IHQgPT09IG8ubWF4Wm9vbSA/IDAgOiBvLnRvbGVyYW5jZSAvICgoMSA8PCB0KSAqIG8uZXh0ZW50KSwgcyA9IHtcbiAgICAgICAgZmVhdHVyZXM6IFtdLFxuICAgICAgICBudW1Qb2ludHM6IDAsXG4gICAgICAgIG51bVNpbXBsaWZpZWQ6IDAsXG4gICAgICAgIG51bUZlYXR1cmVzOiAwLFxuICAgICAgICBzb3VyY2U6IG51bGwsXG4gICAgICAgIHg6IHIsXG4gICAgICAgIHk6IGksXG4gICAgICAgIHo6IHQsXG4gICAgICAgIHRyYW5zZm9ybWVkOiAhMSxcbiAgICAgICAgbWluWDogMixcbiAgICAgICAgbWluWTogMSxcbiAgICAgICAgbWF4WDogLTEsXG4gICAgICAgIG1heFk6IDBcbiAgICAgIH0sIGEgPSAwOyBhIDwgZS5sZW5ndGg7IGErKykge1xuICAgICAgICBzLm51bUZlYXR1cmVzKyssIGdlKHMsIGVbYV0sIG4sIG8pO1xuICAgICAgICB2YXIgbCA9IGVbYV0ubWluWCxcbiAgICAgICAgICAgIHUgPSBlW2FdLm1pblksXG4gICAgICAgICAgICBoID0gZVthXS5tYXhYLFxuICAgICAgICAgICAgYyA9IGVbYV0ubWF4WTtcbiAgICAgICAgbCA8IHMubWluWCAmJiAocy5taW5YID0gbCksIHUgPCBzLm1pblkgJiYgKHMubWluWSA9IHUpLCBoID4gcy5tYXhYICYmIChzLm1heFggPSBoKSwgYyA+IHMubWF4WSAmJiAocy5tYXhZID0gYyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdlKGUsIHQsIHIsIGkpIHtcbiAgICAgIHZhciBvID0gdC5nZW9tZXRyeSxcbiAgICAgICAgICBuID0gdC50eXBlLFxuICAgICAgICAgIHMgPSBbXTtcbiAgICAgIGlmIChcIlBvaW50XCIgPT09IG4gfHwgXCJNdWx0aVBvaW50XCIgPT09IG4pIGZvciAodmFyIGEgPSAwOyBhIDwgby5sZW5ndGg7IGEgKz0gMykge1xuICAgICAgICBzLnB1c2gob1thXSksIHMucHVzaChvW2EgKyAxXSksIGUubnVtUG9pbnRzKyssIGUubnVtU2ltcGxpZmllZCsrO1xuICAgICAgfSBlbHNlIGlmIChcIkxpbmVTdHJpbmdcIiA9PT0gbikgdmUocywgbywgZSwgciwgITEsICExKTtlbHNlIGlmIChcIk11bHRpTGluZVN0cmluZ1wiID09PSBuIHx8IFwiUG9seWdvblwiID09PSBuKSBmb3IgKGEgPSAwOyBhIDwgby5sZW5ndGg7IGErKykge1xuICAgICAgICB2ZShzLCBvW2FdLCBlLCByLCBcIlBvbHlnb25cIiA9PT0gbiwgMCA9PT0gYSk7XG4gICAgICB9IGVsc2UgaWYgKFwiTXVsdGlQb2x5Z29uXCIgPT09IG4pIGZvciAodmFyIGwgPSAwOyBsIDwgby5sZW5ndGg7IGwrKykge1xuICAgICAgICB2YXIgdSA9IG9bbF07XG5cbiAgICAgICAgZm9yIChhID0gMDsgYSA8IHUubGVuZ3RoOyBhKyspIHtcbiAgICAgICAgICB2ZShzLCB1W2FdLCBlLCByLCAhMCwgMCA9PT0gYSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBoID0gdC50YWdzIHx8IG51bGw7XG5cbiAgICAgICAgaWYgKFwiTGluZVN0cmluZ1wiID09PSBuICYmIGkubGluZU1ldHJpY3MpIHtcbiAgICAgICAgICBmb3IgKHZhciBjIGluIGggPSB7fSwgdC50YWdzKSB7XG4gICAgICAgICAgICBoW2NdID0gdC50YWdzW2NdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGgubWFwYm94X2NsaXBfc3RhcnQgPSBvLnN0YXJ0IC8gby5zaXplLCBoLm1hcGJveF9jbGlwX2VuZCA9IG8uZW5kIC8gby5zaXplO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHAgPSB7XG4gICAgICAgICAgZ2VvbWV0cnk6IHMsXG4gICAgICAgICAgdHlwZTogXCJQb2x5Z29uXCIgPT09IG4gfHwgXCJNdWx0aVBvbHlnb25cIiA9PT0gbiA/IDMgOiBcIkxpbmVTdHJpbmdcIiA9PT0gbiB8fCBcIk11bHRpTGluZVN0cmluZ1wiID09PSBuID8gMiA6IDEsXG4gICAgICAgICAgdGFnczogaFxuICAgICAgICB9O1xuICAgICAgICBudWxsICE9PSB0LmlkICYmIChwLmlkID0gdC5pZCksIGUuZmVhdHVyZXMucHVzaChwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2ZShlLCB0LCByLCBpLCBvLCBuKSB7XG4gICAgICB2YXIgcyA9IGkgKiBpO1xuICAgICAgaWYgKGkgPiAwICYmIHQuc2l6ZSA8IChvID8gcyA6IGkpKSByLm51bVBvaW50cyArPSB0Lmxlbmd0aCAvIDM7ZWxzZSB7XG4gICAgICAgIGZvciAodmFyIGEgPSBbXSwgbCA9IDA7IGwgPCB0Lmxlbmd0aDsgbCArPSAzKSB7XG4gICAgICAgICAgKDAgPT09IGkgfHwgdFtsICsgMl0gPiBzKSAmJiAoci5udW1TaW1wbGlmaWVkKyssIGEucHVzaCh0W2xdKSwgYS5wdXNoKHRbbCArIDFdKSksIHIubnVtUG9pbnRzKys7XG4gICAgICAgIH1cblxuICAgICAgICBvICYmIGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICAgICAgZm9yICh2YXIgciA9IDAsIGkgPSAwLCBvID0gZS5sZW5ndGgsIG4gPSBvIC0gMjsgaSA8IG87IG4gPSBpLCBpICs9IDIpIHtcbiAgICAgICAgICAgIHIgKz0gKGVbaV0gLSBlW25dKSAqIChlW2kgKyAxXSArIGVbbiArIDFdKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAociA+IDAgPT09IHQpIGZvciAoaSA9IDAsIG8gPSBlLmxlbmd0aDsgaSA8IG8gLyAyOyBpICs9IDIpIHtcbiAgICAgICAgICAgIHZhciBzID0gZVtpXSxcbiAgICAgICAgICAgICAgICBhID0gZVtpICsgMV07XG4gICAgICAgICAgICBlW2ldID0gZVtvIC0gMiAtIGldLCBlW2kgKyAxXSA9IGVbbyAtIDEgLSBpXSwgZVtvIC0gMiAtIGldID0gcywgZVtvIC0gMSAtIGldID0gYTtcbiAgICAgICAgICB9XG4gICAgICAgIH0oYSwgbiksIGUucHVzaChhKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtZShlLCB0KSB7XG4gICAgICB2YXIgciA9ICh0ID0gdGhpcy5vcHRpb25zID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgICAgZm9yICh2YXIgciBpbiB0KSB7XG4gICAgICAgICAgZVtyXSA9IHRbcl07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0oT2JqZWN0LmNyZWF0ZSh0aGlzLm9wdGlvbnMpLCB0KSkuZGVidWc7XG5cbiAgICAgIGlmIChyICYmIGNvbnNvbGUudGltZShcInByZXByb2Nlc3MgZGF0YVwiKSwgdC5tYXhab29tIDwgMCB8fCB0Lm1heFpvb20gPiAyNCkgdGhyb3cgbmV3IEVycm9yKFwibWF4Wm9vbSBzaG91bGQgYmUgaW4gdGhlIDAtMjQgcmFuZ2VcIik7XG4gICAgICBpZiAodC5wcm9tb3RlSWQgJiYgdC5nZW5lcmF0ZUlkKSB0aHJvdyBuZXcgRXJyb3IoXCJwcm9tb3RlSWQgYW5kIGdlbmVyYXRlSWQgY2Fubm90IGJlIHVzZWQgdG9nZXRoZXIuXCIpO1xuXG4gICAgICB2YXIgaSA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICAgIHZhciByID0gW107XG4gICAgICAgIGlmIChcIkZlYXR1cmVDb2xsZWN0aW9uXCIgPT09IGUudHlwZSkgZm9yICh2YXIgaSA9IDA7IGkgPCBlLmZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgJChyLCBlLmZlYXR1cmVzW2ldLCB0LCBpKTtcbiAgICAgICAgfSBlbHNlICQociwgXCJGZWF0dXJlXCIgPT09IGUudHlwZSA/IGUgOiB7XG4gICAgICAgICAgZ2VvbWV0cnk6IGVcbiAgICAgICAgfSwgdCk7XG4gICAgICAgIHJldHVybiByO1xuICAgICAgfShlLCB0KTtcblxuICAgICAgdGhpcy50aWxlcyA9IHt9LCB0aGlzLnRpbGVDb29yZHMgPSBbXSwgciAmJiAoY29uc29sZS50aW1lRW5kKFwicHJlcHJvY2VzcyBkYXRhXCIpLCBjb25zb2xlLmxvZyhcImluZGV4OiBtYXhab29tOiAlZCwgbWF4UG9pbnRzOiAlZFwiLCB0LmluZGV4TWF4Wm9vbSwgdC5pbmRleE1heFBvaW50cyksIGNvbnNvbGUudGltZShcImdlbmVyYXRlIHRpbGVzXCIpLCB0aGlzLnN0YXRzID0ge30sIHRoaXMudG90YWwgPSAwKSwgKGkgPSBmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgICB2YXIgciA9IHQuYnVmZmVyIC8gdC5leHRlbnQsXG4gICAgICAgICAgICBpID0gZSxcbiAgICAgICAgICAgIG8gPSByZShlLCAxLCAtMSAtIHIsIHIsIDAsIC0xLCAyLCB0KSxcbiAgICAgICAgICAgIG4gPSByZShlLCAxLCAxIC0gciwgMiArIHIsIDAsIC0xLCAyLCB0KTtcbiAgICAgICAgcmV0dXJuIChvIHx8IG4pICYmIChpID0gcmUoZSwgMSwgLXIsIDEgKyByLCAwLCAtMSwgMiwgdCkgfHwgW10sIG8gJiYgKGkgPSBoZShvLCAxKS5jb25jYXQoaSkpLCBuICYmIChpID0gaS5jb25jYXQoaGUobiwgLTEpKSkpLCBpO1xuICAgICAgfShpLCB0KSkubGVuZ3RoICYmIHRoaXMuc3BsaXRUaWxlKGksIDAsIDAsIDApLCByICYmIChpLmxlbmd0aCAmJiBjb25zb2xlLmxvZyhcImZlYXR1cmVzOiAlZCwgcG9pbnRzOiAlZFwiLCB0aGlzLnRpbGVzWzBdLm51bUZlYXR1cmVzLCB0aGlzLnRpbGVzWzBdLm51bVBvaW50cyksIGNvbnNvbGUudGltZUVuZChcImdlbmVyYXRlIHRpbGVzXCIpLCBjb25zb2xlLmxvZyhcInRpbGVzIGdlbmVyYXRlZDpcIiwgdGhpcy50b3RhbCwgSlNPTi5zdHJpbmdpZnkodGhpcy5zdGF0cykpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB5ZShlLCB0LCByKSB7XG4gICAgICByZXR1cm4gMzIgKiAoKDEgPDwgZSkgKiByICsgdCkgKyBlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHhlKGUsIHQpIHtcbiAgICAgIHZhciByID0gZS50aWxlSUQuY2Fub25pY2FsO1xuICAgICAgaWYgKCF0aGlzLl9nZW9KU09OSW5kZXgpIHJldHVybiB0KG51bGwsIG51bGwpO1xuXG4gICAgICB2YXIgaSA9IHRoaXMuX2dlb0pTT05JbmRleC5nZXRUaWxlKHIueiwgci54LCByLnkpO1xuXG4gICAgICBpZiAoIWkpIHJldHVybiB0KG51bGwsIG51bGwpO1xuICAgICAgdmFyIG8gPSBuZXcgZyhpLmZlYXR1cmVzKSxcbiAgICAgICAgICBuID0gdyhvKTtcbiAgICAgIDAgPT09IG4uYnl0ZU9mZnNldCAmJiBuLmJ5dGVMZW5ndGggPT09IG4uYnVmZmVyLmJ5dGVMZW5ndGggfHwgKG4gPSBuZXcgVWludDhBcnJheShuKSksIHQobnVsbCwge1xuICAgICAgICB2ZWN0b3JUaWxlOiBvLFxuICAgICAgICByYXdEYXRhOiBuLmJ1ZmZlclxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgSi5wcm90b3R5cGUubG9hZCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCA9IHRoaXMub3B0aW9ucyxcbiAgICAgICAgICByID0gdC5sb2csXG4gICAgICAgICAgaSA9IHQubWluWm9vbSxcbiAgICAgICAgICBvID0gdC5tYXhab29tLFxuICAgICAgICAgIG4gPSB0Lm5vZGVTaXplO1xuICAgICAgciAmJiBjb25zb2xlLnRpbWUoXCJ0b3RhbCB0aW1lXCIpO1xuICAgICAgdmFyIHMgPSBcInByZXBhcmUgXCIgKyBlLmxlbmd0aCArIFwiIHBvaW50c1wiO1xuICAgICAgciAmJiBjb25zb2xlLnRpbWUocyksIHRoaXMucG9pbnRzID0gZTtcblxuICAgICAgZm9yICh2YXIgYSA9IFtdLCBsID0gMDsgbCA8IGUubGVuZ3RoOyBsKyspIHtcbiAgICAgICAgZVtsXS5nZW9tZXRyeSAmJiBhLnB1c2goQShlW2xdLCBsKSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudHJlZXNbbyArIDFdID0gbmV3IEYoYSwgWCwgVywgbiwgRmxvYXQzMkFycmF5KSwgciAmJiBjb25zb2xlLnRpbWVFbmQocyk7XG5cbiAgICAgIGZvciAodmFyIHUgPSBvOyB1ID49IGk7IHUtLSkge1xuICAgICAgICB2YXIgaCA9ICtEYXRlLm5vdygpO1xuICAgICAgICBhID0gdGhpcy5fY2x1c3RlcihhLCB1KSwgdGhpcy50cmVlc1t1XSA9IG5ldyBGKGEsIFgsIFcsIG4sIEZsb2F0MzJBcnJheSksIHIgJiYgY29uc29sZS5sb2coXCJ6JWQ6ICVkIGNsdXN0ZXJzIGluICVkbXNcIiwgdSwgYS5sZW5ndGgsICtEYXRlLm5vdygpIC0gaCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByICYmIGNvbnNvbGUudGltZUVuZChcInRvdGFsIHRpbWVcIiksIHRoaXM7XG4gICAgfSwgSi5wcm90b3R5cGUuZ2V0Q2x1c3RlcnMgPSBmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgdmFyIHIgPSAoKGVbMF0gKyAxODApICUgMzYwICsgMzYwKSAlIDM2MCAtIDE4MCxcbiAgICAgICAgICBpID0gTWF0aC5tYXgoLTkwLCBNYXRoLm1pbig5MCwgZVsxXSkpLFxuICAgICAgICAgIG8gPSAxODAgPT09IGVbMl0gPyAxODAgOiAoKGVbMl0gKyAxODApICUgMzYwICsgMzYwKSAlIDM2MCAtIDE4MCxcbiAgICAgICAgICBuID0gTWF0aC5tYXgoLTkwLCBNYXRoLm1pbig5MCwgZVszXSkpO1xuICAgICAgaWYgKGVbMl0gLSBlWzBdID49IDM2MCkgciA9IC0xODAsIG8gPSAxODA7ZWxzZSBpZiAociA+IG8pIHtcbiAgICAgICAgdmFyIHMgPSB0aGlzLmdldENsdXN0ZXJzKFtyLCBpLCAxODAsIG5dLCB0KSxcbiAgICAgICAgICAgIGEgPSB0aGlzLmdldENsdXN0ZXJzKFstMTgwLCBpLCBvLCBuXSwgdCk7XG4gICAgICAgIHJldHVybiBzLmNvbmNhdChhKTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgbCA9IHRoaXMudHJlZXNbdGhpcy5fbGltaXRab29tKHQpXSwgdSA9IFtdLCBoID0gMCwgYyA9IGwucmFuZ2UoWShyKSwgaihuKSwgWShvKSwgaihpKSk7IGggPCBjLmxlbmd0aDsgaCArPSAxKSB7XG4gICAgICAgIHZhciBwID0gbC5wb2ludHNbY1toXV07XG4gICAgICAgIHUucHVzaChwLm51bVBvaW50cyA/IEIocCkgOiB0aGlzLnBvaW50c1twLmluZGV4XSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1O1xuICAgIH0sIEoucHJvdG90eXBlLmdldENoaWxkcmVuID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0ID0gdGhpcy5fZ2V0T3JpZ2luSWQoZSksXG4gICAgICAgICAgciA9IHRoaXMuX2dldE9yaWdpblpvb20oZSksXG4gICAgICAgICAgaSA9IFwiTm8gY2x1c3RlciB3aXRoIHRoZSBzcGVjaWZpZWQgaWQuXCIsXG4gICAgICAgICAgbyA9IHRoaXMudHJlZXNbcl07XG5cbiAgICAgIGlmICghbykgdGhyb3cgbmV3IEVycm9yKGkpO1xuICAgICAgdmFyIG4gPSBvLnBvaW50c1t0XTtcbiAgICAgIGlmICghbikgdGhyb3cgbmV3IEVycm9yKGkpO1xuXG4gICAgICBmb3IgKHZhciBzID0gdGhpcy5vcHRpb25zLnJhZGl1cyAvICh0aGlzLm9wdGlvbnMuZXh0ZW50ICogTWF0aC5wb3coMiwgciAtIDEpKSwgYSA9IFtdLCBsID0gMCwgdSA9IG8ud2l0aGluKG4ueCwgbi55LCBzKTsgbCA8IHUubGVuZ3RoOyBsICs9IDEpIHtcbiAgICAgICAgdmFyIGggPSBvLnBvaW50c1t1W2xdXTtcbiAgICAgICAgaC5wYXJlbnRJZCA9PT0gZSAmJiBhLnB1c2goaC5udW1Qb2ludHMgPyBCKGgpIDogdGhpcy5wb2ludHNbaC5pbmRleF0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoMCA9PT0gYS5sZW5ndGgpIHRocm93IG5ldyBFcnJvcihpKTtcbiAgICAgIHJldHVybiBhO1xuICAgIH0sIEoucHJvdG90eXBlLmdldExlYXZlcyA9IGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgICB2YXIgaSA9IFtdO1xuICAgICAgcmV0dXJuIHRoaXMuX2FwcGVuZExlYXZlcyhpLCBlLCB0ID0gdCB8fCAxMCwgciA9IHIgfHwgMCwgMCksIGk7XG4gICAgfSwgSi5wcm90b3R5cGUuZ2V0VGlsZSA9IGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgICB2YXIgaSA9IHRoaXMudHJlZXNbdGhpcy5fbGltaXRab29tKGUpXSxcbiAgICAgICAgICBvID0gTWF0aC5wb3coMiwgZSksXG4gICAgICAgICAgbiA9IHRoaXMub3B0aW9ucyxcbiAgICAgICAgICBzID0gbi5yYWRpdXMgLyBuLmV4dGVudCxcbiAgICAgICAgICBhID0gKHIgLSBzKSAvIG8sXG4gICAgICAgICAgbCA9IChyICsgMSArIHMpIC8gbyxcbiAgICAgICAgICB1ID0ge1xuICAgICAgICBmZWF0dXJlczogW11cbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB0aGlzLl9hZGRUaWxlRmVhdHVyZXMoaS5yYW5nZSgodCAtIHMpIC8gbywgYSwgKHQgKyAxICsgcykgLyBvLCBsKSwgaS5wb2ludHMsIHQsIHIsIG8sIHUpLCAwID09PSB0ICYmIHRoaXMuX2FkZFRpbGVGZWF0dXJlcyhpLnJhbmdlKDEgLSBzIC8gbywgYSwgMSwgbCksIGkucG9pbnRzLCBvLCByLCBvLCB1KSwgdCA9PT0gbyAtIDEgJiYgdGhpcy5fYWRkVGlsZUZlYXR1cmVzKGkucmFuZ2UoMCwgYSwgcyAvIG8sIGwpLCBpLnBvaW50cywgLTEsIHIsIG8sIHUpLCB1LmZlYXR1cmVzLmxlbmd0aCA/IHUgOiBudWxsO1xuICAgIH0sIEoucHJvdG90eXBlLmdldENsdXN0ZXJFeHBhbnNpb25ab29tID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGZvciAodmFyIHQgPSB0aGlzLl9nZXRPcmlnaW5ab29tKGUpIC0gMTsgdCA8PSB0aGlzLm9wdGlvbnMubWF4Wm9vbTspIHtcbiAgICAgICAgdmFyIHIgPSB0aGlzLmdldENoaWxkcmVuKGUpO1xuICAgICAgICBpZiAodCsrLCAxICE9PSByLmxlbmd0aCkgYnJlYWs7XG4gICAgICAgIGUgPSByWzBdLnByb3BlcnRpZXMuY2x1c3Rlcl9pZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQ7XG4gICAgfSwgSi5wcm90b3R5cGUuX2FwcGVuZExlYXZlcyA9IGZ1bmN0aW9uIChlLCB0LCByLCBpLCBvKSB7XG4gICAgICBmb3IgKHZhciBuID0gMCwgcyA9IHRoaXMuZ2V0Q2hpbGRyZW4odCk7IG4gPCBzLmxlbmd0aDsgbiArPSAxKSB7XG4gICAgICAgIHZhciBhID0gc1tuXSxcbiAgICAgICAgICAgIGwgPSBhLnByb3BlcnRpZXM7XG4gICAgICAgIGlmIChsICYmIGwuY2x1c3RlciA/IG8gKyBsLnBvaW50X2NvdW50IDw9IGkgPyBvICs9IGwucG9pbnRfY291bnQgOiBvID0gdGhpcy5fYXBwZW5kTGVhdmVzKGUsIGwuY2x1c3Rlcl9pZCwgciwgaSwgbykgOiBvIDwgaSA/IG8rKyA6IGUucHVzaChhKSwgZS5sZW5ndGggPT09IHIpIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbztcbiAgICB9LCBKLnByb3RvdHlwZS5fYWRkVGlsZUZlYXR1cmVzID0gZnVuY3Rpb24gKGUsIHQsIHIsIGksIG8sIG4pIHtcbiAgICAgIGZvciAodmFyIHMgPSAwLCBhID0gZTsgcyA8IGEubGVuZ3RoOyBzICs9IDEpIHtcbiAgICAgICAgdmFyIGwgPSB0W2Fbc11dLFxuICAgICAgICAgICAgdSA9IGwubnVtUG9pbnRzLFxuICAgICAgICAgICAgaCA9IHtcbiAgICAgICAgICB0eXBlOiAxLFxuICAgICAgICAgIGdlb21ldHJ5OiBbW01hdGgucm91bmQodGhpcy5vcHRpb25zLmV4dGVudCAqIChsLnggKiBvIC0gcikpLCBNYXRoLnJvdW5kKHRoaXMub3B0aW9ucy5leHRlbnQgKiAobC55ICogbyAtIGkpKV1dLFxuICAgICAgICAgIHRhZ3M6IHUgPyBHKGwpIDogdGhpcy5wb2ludHNbbC5pbmRleF0ucHJvcGVydGllc1xuICAgICAgICB9LFxuICAgICAgICAgICAgYyA9IHZvaWQgMDtcbiAgICAgICAgdSA/IGMgPSBsLmlkIDogdGhpcy5vcHRpb25zLmdlbmVyYXRlSWQgPyBjID0gbC5pbmRleCA6IHRoaXMucG9pbnRzW2wuaW5kZXhdLmlkICYmIChjID0gdGhpcy5wb2ludHNbbC5pbmRleF0uaWQpLCB2b2lkIDAgIT09IGMgJiYgKGguaWQgPSBjKSwgbi5mZWF0dXJlcy5wdXNoKGgpO1xuICAgICAgfVxuICAgIH0sIEoucHJvdG90eXBlLl9saW1pdFpvb20gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgcmV0dXJuIE1hdGgubWF4KHRoaXMub3B0aW9ucy5taW5ab29tLCBNYXRoLm1pbigrZSwgdGhpcy5vcHRpb25zLm1heFpvb20gKyAxKSk7XG4gICAgfSwgSi5wcm90b3R5cGUuX2NsdXN0ZXIgPSBmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgZm9yICh2YXIgciA9IFtdLCBpID0gdGhpcy5vcHRpb25zLCBvID0gaS5yZWR1Y2UsIG4gPSBpLm1pblBvaW50cywgcyA9IGkucmFkaXVzIC8gKGkuZXh0ZW50ICogTWF0aC5wb3coMiwgdCkpLCBhID0gMDsgYSA8IGUubGVuZ3RoOyBhKyspIHtcbiAgICAgICAgdmFyIGwgPSBlW2FdO1xuXG4gICAgICAgIGlmICghKGwuem9vbSA8PSB0KSkge1xuICAgICAgICAgIGwuem9vbSA9IHQ7XG5cbiAgICAgICAgICBmb3IgKHZhciB1ID0gdGhpcy50cmVlc1t0ICsgMV0sIGggPSB1LndpdGhpbihsLngsIGwueSwgcyksIGMgPSBsLm51bVBvaW50cyB8fCAxLCBwID0gYywgZiA9IDAsIGQgPSBoOyBmIDwgZC5sZW5ndGg7IGYgKz0gMSkge1xuICAgICAgICAgICAgdmFyIGcgPSB1LnBvaW50c1tkW2ZdXTtcbiAgICAgICAgICAgIGcuem9vbSA+IHQgJiYgKHAgKz0gZy5udW1Qb2ludHMgfHwgMSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHAgPj0gbikge1xuICAgICAgICAgICAgZm9yICh2YXIgdiA9IGwueCAqIGMsIG0gPSBsLnkgKiBjLCB5ID0gbyAmJiBjID4gMSA/IHRoaXMuX21hcChsLCAhMCkgOiBudWxsLCB4ID0gKGEgPDwgNSkgKyAodCArIDEpICsgdGhpcy5wb2ludHMubGVuZ3RoLCB3ID0gMCwgUyA9IGg7IHcgPCBTLmxlbmd0aDsgdyArPSAxKSB7XG4gICAgICAgICAgICAgIHZhciBJID0gdS5wb2ludHNbU1t3XV07XG5cbiAgICAgICAgICAgICAgaWYgKCEoSS56b29tIDw9IHQpKSB7XG4gICAgICAgICAgICAgICAgSS56b29tID0gdDtcbiAgICAgICAgICAgICAgICB2YXIgTSA9IEkubnVtUG9pbnRzIHx8IDE7XG4gICAgICAgICAgICAgICAgdiArPSBJLnggKiBNLCBtICs9IEkueSAqIE0sIEkucGFyZW50SWQgPSB4LCBvICYmICh5IHx8ICh5ID0gdGhpcy5fbWFwKGwsICEwKSksIG8oeSwgdGhpcy5fbWFwKEkpKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbC5wYXJlbnRJZCA9IHgsIHIucHVzaChaKHYgLyBwLCBtIC8gcCwgeCwgcCwgeSkpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoci5wdXNoKGwpLCBwID4gMSkgZm9yICh2YXIgYiA9IDAsIF8gPSBoOyBiIDwgXy5sZW5ndGg7IGIgKz0gMSkge1xuICAgICAgICAgICAgdmFyIGsgPSB1LnBvaW50c1tfW2JdXTtcbiAgICAgICAgICAgIGsuem9vbSA8PSB0IHx8IChrLnpvb20gPSB0LCByLnB1c2goaykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9LCBKLnByb3RvdHlwZS5fZ2V0T3JpZ2luSWQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgcmV0dXJuIGUgLSB0aGlzLnBvaW50cy5sZW5ndGggPj4gNTtcbiAgICB9LCBKLnByb3RvdHlwZS5fZ2V0T3JpZ2luWm9vbSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gKGUgLSB0aGlzLnBvaW50cy5sZW5ndGgpICUgMzI7XG4gICAgfSwgSi5wcm90b3R5cGUuX21hcCA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICBpZiAoZS5udW1Qb2ludHMpIHJldHVybiB0ID8gVih7fSwgZS5wcm9wZXJ0aWVzKSA6IGUucHJvcGVydGllcztcbiAgICAgIHZhciByID0gdGhpcy5wb2ludHNbZS5pbmRleF0ucHJvcGVydGllcyxcbiAgICAgICAgICBpID0gdGhpcy5vcHRpb25zLm1hcChyKTtcbiAgICAgIHJldHVybiB0ICYmIGkgPT09IHIgPyBWKHt9LCBpKSA6IGk7XG4gICAgfSwgbWUucHJvdG90eXBlLm9wdGlvbnMgPSB7XG4gICAgICBtYXhab29tOiAxNCxcbiAgICAgIGluZGV4TWF4Wm9vbTogNSxcbiAgICAgIGluZGV4TWF4UG9pbnRzOiAxZTUsXG4gICAgICB0b2xlcmFuY2U6IDMsXG4gICAgICBleHRlbnQ6IDQwOTYsXG4gICAgICBidWZmZXI6IDY0LFxuICAgICAgbGluZU1ldHJpY3M6ICExLFxuICAgICAgcHJvbW90ZUlkOiBudWxsLFxuICAgICAgZ2VuZXJhdGVJZDogITEsXG4gICAgICBkZWJ1ZzogMFxuICAgIH0sIG1lLnByb3RvdHlwZS5zcGxpdFRpbGUgPSBmdW5jdGlvbiAoZSwgdCwgciwgaSwgbywgbiwgcykge1xuICAgICAgZm9yICh2YXIgYSA9IFtlLCB0LCByLCBpXSwgbCA9IHRoaXMub3B0aW9ucywgdSA9IGwuZGVidWc7IGEubGVuZ3RoOykge1xuICAgICAgICBpID0gYS5wb3AoKSwgciA9IGEucG9wKCksIHQgPSBhLnBvcCgpLCBlID0gYS5wb3AoKTtcbiAgICAgICAgdmFyIGggPSAxIDw8IHQsXG4gICAgICAgICAgICBjID0geWUodCwgciwgaSksXG4gICAgICAgICAgICBwID0gdGhpcy50aWxlc1tjXTtcblxuICAgICAgICBpZiAoIXAgJiYgKHUgPiAxICYmIGNvbnNvbGUudGltZShcImNyZWF0aW9uXCIpLCBwID0gdGhpcy50aWxlc1tjXSA9IGRlKGUsIHQsIHIsIGksIGwpLCB0aGlzLnRpbGVDb29yZHMucHVzaCh7XG4gICAgICAgICAgejogdCxcbiAgICAgICAgICB4OiByLFxuICAgICAgICAgIHk6IGlcbiAgICAgICAgfSksIHUpKSB7XG4gICAgICAgICAgdSA+IDEgJiYgKGNvbnNvbGUubG9nKFwidGlsZSB6JWQtJWQtJWQgKGZlYXR1cmVzOiAlZCwgcG9pbnRzOiAlZCwgc2ltcGxpZmllZDogJWQpXCIsIHQsIHIsIGksIHAubnVtRmVhdHVyZXMsIHAubnVtUG9pbnRzLCBwLm51bVNpbXBsaWZpZWQpLCBjb25zb2xlLnRpbWVFbmQoXCJjcmVhdGlvblwiKSk7XG4gICAgICAgICAgdmFyIGYgPSBcInpcIiArIHQ7XG4gICAgICAgICAgdGhpcy5zdGF0c1tmXSA9ICh0aGlzLnN0YXRzW2ZdIHx8IDApICsgMSwgdGhpcy50b3RhbCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHAuc291cmNlID0gZSwgbykge1xuICAgICAgICAgIGlmICh0ID09PSBsLm1heFpvb20gfHwgdCA9PT0gbykgY29udGludWU7XG4gICAgICAgICAgdmFyIGQgPSAxIDw8IG8gLSB0O1xuICAgICAgICAgIGlmIChyICE9PSBNYXRoLmZsb29yKG4gLyBkKSB8fCBpICE9PSBNYXRoLmZsb29yKHMgLyBkKSkgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAodCA9PT0gbC5pbmRleE1heFpvb20gfHwgcC5udW1Qb2ludHMgPD0gbC5pbmRleE1heFBvaW50cykgY29udGludWU7XG5cbiAgICAgICAgaWYgKHAuc291cmNlID0gbnVsbCwgMCAhPT0gZS5sZW5ndGgpIHtcbiAgICAgICAgICB1ID4gMSAmJiBjb25zb2xlLnRpbWUoXCJjbGlwcGluZ1wiKTtcbiAgICAgICAgICB2YXIgZyxcbiAgICAgICAgICAgICAgdixcbiAgICAgICAgICAgICAgbSxcbiAgICAgICAgICAgICAgeSxcbiAgICAgICAgICAgICAgeCxcbiAgICAgICAgICAgICAgdyxcbiAgICAgICAgICAgICAgUyA9IC41ICogbC5idWZmZXIgLyBsLmV4dGVudCxcbiAgICAgICAgICAgICAgSSA9IC41IC0gUyxcbiAgICAgICAgICAgICAgTSA9IC41ICsgUyxcbiAgICAgICAgICAgICAgYiA9IDEgKyBTO1xuICAgICAgICAgIGcgPSB2ID0gbSA9IHkgPSBudWxsLCB4ID0gcmUoZSwgaCwgciAtIFMsIHIgKyBNLCAwLCBwLm1pblgsIHAubWF4WCwgbCksIHcgPSByZShlLCBoLCByICsgSSwgciArIGIsIDAsIHAubWluWCwgcC5tYXhYLCBsKSwgZSA9IG51bGwsIHggJiYgKGcgPSByZSh4LCBoLCBpIC0gUywgaSArIE0sIDEsIHAubWluWSwgcC5tYXhZLCBsKSwgdiA9IHJlKHgsIGgsIGkgKyBJLCBpICsgYiwgMSwgcC5taW5ZLCBwLm1heFksIGwpLCB4ID0gbnVsbCksIHcgJiYgKG0gPSByZSh3LCBoLCBpIC0gUywgaSArIE0sIDEsIHAubWluWSwgcC5tYXhZLCBsKSwgeSA9IHJlKHcsIGgsIGkgKyBJLCBpICsgYiwgMSwgcC5taW5ZLCBwLm1heFksIGwpLCB3ID0gbnVsbCksIHUgPiAxICYmIGNvbnNvbGUudGltZUVuZChcImNsaXBwaW5nXCIpLCBhLnB1c2goZyB8fCBbXSwgdCArIDEsIDIgKiByLCAyICogaSksIGEucHVzaCh2IHx8IFtdLCB0ICsgMSwgMiAqIHIsIDIgKiBpICsgMSksIGEucHVzaChtIHx8IFtdLCB0ICsgMSwgMiAqIHIgKyAxLCAyICogaSksIGEucHVzaCh5IHx8IFtdLCB0ICsgMSwgMiAqIHIgKyAxLCAyICogaSArIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgbWUucHJvdG90eXBlLmdldFRpbGUgPSBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgICAgdmFyIGkgPSB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgbyA9IGkuZXh0ZW50LFxuICAgICAgICAgIG4gPSBpLmRlYnVnO1xuICAgICAgaWYgKGUgPCAwIHx8IGUgPiAyNCkgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgcyA9IDEgPDwgZSxcbiAgICAgICAgICBhID0geWUoZSwgdCA9ICh0ICUgcyArIHMpICUgcywgcik7XG4gICAgICBpZiAodGhpcy50aWxlc1thXSkgcmV0dXJuIHBlKHRoaXMudGlsZXNbYV0sIG8pO1xuICAgICAgbiA+IDEgJiYgY29uc29sZS5sb2coXCJkcmlsbGluZyBkb3duIHRvIHolZC0lZC0lZFwiLCBlLCB0LCByKTtcblxuICAgICAgZm9yICh2YXIgbCwgdSA9IGUsIGggPSB0LCBjID0gcjsgIWwgJiYgdSA+IDA7KSB7XG4gICAgICAgIHUtLSwgaCA9IE1hdGguZmxvb3IoaCAvIDIpLCBjID0gTWF0aC5mbG9vcihjIC8gMiksIGwgPSB0aGlzLnRpbGVzW3llKHUsIGgsIGMpXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGwgJiYgbC5zb3VyY2UgPyAobiA+IDEgJiYgY29uc29sZS5sb2coXCJmb3VuZCBwYXJlbnQgdGlsZSB6JWQtJWQtJWRcIiwgdSwgaCwgYyksIG4gPiAxICYmIGNvbnNvbGUudGltZShcImRyaWxsaW5nIGRvd25cIiksIHRoaXMuc3BsaXRUaWxlKGwuc291cmNlLCB1LCBoLCBjLCBlLCB0LCByKSwgbiA+IDEgJiYgY29uc29sZS50aW1lRW5kKFwiZHJpbGxpbmcgZG93blwiKSwgdGhpcy50aWxlc1thXSA/IHBlKHRoaXMudGlsZXNbYV0sIG8pIDogbnVsbCkgOiBudWxsO1xuICAgIH07XG5cbiAgICB2YXIgd2UgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gcihlLCByLCBpLCBvKSB7XG4gICAgICAgIHQuY2FsbCh0aGlzLCBlLCByLCBpLCB4ZSksIG8gJiYgKHRoaXMubG9hZEdlb0pTT04gPSBvKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKHIuX19wcm90b19fID0gdCksIChyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gciwgci5wcm90b3R5cGUubG9hZERhdGEgPSBmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgICB0aGlzLl9wZW5kaW5nQ2FsbGJhY2sgJiYgdGhpcy5fcGVuZGluZ0NhbGxiYWNrKG51bGwsIHtcbiAgICAgICAgICBhYmFuZG9uZWQ6ICEwXG4gICAgICAgIH0pLCB0aGlzLl9wZW5kaW5nQ2FsbGJhY2sgPSB0LCB0aGlzLl9wZW5kaW5nTG9hZERhdGFQYXJhbXMgPSBlLCB0aGlzLl9zdGF0ZSAmJiBcIklkbGVcIiAhPT0gdGhpcy5fc3RhdGUgPyB0aGlzLl9zdGF0ZSA9IFwiTmVlZHNMb2FkRGF0YVwiIDogKHRoaXMuX3N0YXRlID0gXCJDb2FsZXNjaW5nXCIsIHRoaXMuX2xvYWREYXRhKCkpO1xuICAgICAgfSwgci5wcm90b3R5cGUuX2xvYWREYXRhID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdCA9IHRoaXM7XG5cbiAgICAgICAgaWYgKHRoaXMuX3BlbmRpbmdDYWxsYmFjayAmJiB0aGlzLl9wZW5kaW5nTG9hZERhdGFQYXJhbXMpIHtcbiAgICAgICAgICB2YXIgciA9IHRoaXMuX3BlbmRpbmdDYWxsYmFjayxcbiAgICAgICAgICAgICAgaSA9IHRoaXMuX3BlbmRpbmdMb2FkRGF0YVBhcmFtcztcbiAgICAgICAgICBkZWxldGUgdGhpcy5fcGVuZGluZ0NhbGxiYWNrLCBkZWxldGUgdGhpcy5fcGVuZGluZ0xvYWREYXRhUGFyYW1zO1xuICAgICAgICAgIHZhciBvID0gISEoaSAmJiBpLnJlcXVlc3QgJiYgaS5yZXF1ZXN0LmNvbGxlY3RSZXNvdXJjZVRpbWluZykgJiYgbmV3IGUuUmVxdWVzdFBlcmZvcm1hbmNlKGkucmVxdWVzdCk7XG4gICAgICAgICAgdGhpcy5sb2FkR2VvSlNPTihpLCBmdW5jdGlvbiAobiwgcykge1xuICAgICAgICAgICAgaWYgKG4gfHwgIXMpIHJldHVybiByKG4pO1xuICAgICAgICAgICAgaWYgKFwib2JqZWN0XCIgIT0gdHlwZW9mIHMpIHJldHVybiByKG5ldyBFcnJvcihcIklucHV0IGRhdGEgZ2l2ZW4gdG8gJ1wiICsgaS5zb3VyY2UgKyBcIicgaXMgbm90IGEgdmFsaWQgR2VvSlNPTiBvYmplY3QuXCIpKTtcbiAgICAgICAgICAgICFmdW5jdGlvbiBlKHQsIHIpIHtcbiAgICAgICAgICAgICAgdmFyIGksXG4gICAgICAgICAgICAgICAgICBvID0gdCAmJiB0LnR5cGU7XG4gICAgICAgICAgICAgIGlmIChcIkZlYXR1cmVDb2xsZWN0aW9uXCIgPT09IG8pIGZvciAoaSA9IDA7IGkgPCB0LmZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgZSh0LmZlYXR1cmVzW2ldLCByKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChcIkdlb21ldHJ5Q29sbGVjdGlvblwiID09PSBvKSBmb3IgKGkgPSAwOyBpIDwgdC5nZW9tZXRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgZSh0Lmdlb21ldHJpZXNbaV0sIHIpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKFwiRmVhdHVyZVwiID09PSBvKSBlKHQuZ2VvbWV0cnksIHIpO2Vsc2UgaWYgKFwiUG9seWdvblwiID09PSBvKSBjKHQuY29vcmRpbmF0ZXMsIHIpO2Vsc2UgaWYgKFwiTXVsdGlQb2x5Z29uXCIgPT09IG8pIGZvciAoaSA9IDA7IGkgPCB0LmNvb3JkaW5hdGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgYyh0LmNvb3JkaW5hdGVzW2ldLCByKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gdDtcbiAgICAgICAgICAgIH0ocywgITApO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBpZiAoaS5maWx0ZXIpIHtcbiAgICAgICAgICAgICAgICB2YXIgYSA9IGUuY3JlYXRlRXhwcmVzc2lvbihpLmZpbHRlciwge1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICAgICAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWRyaXZlblwiLFxuICAgICAgICAgICAgICAgICAgb3ZlcnJpZGFibGU6ICExLFxuICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbjogITFcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoXCJlcnJvclwiID09PSBhLnJlc3VsdCkgdGhyb3cgbmV3IEVycm9yKGEudmFsdWUubWFwKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZS5rZXkgKyBcIjogXCIgKyBlLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgfSkuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICB2YXIgbCA9IHMuZmVhdHVyZXMuZmlsdGVyKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gYS52YWx1ZS5ldmFsdWF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIHpvb206IDBcbiAgICAgICAgICAgICAgICAgIH0sIGUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHMgPSB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcIkZlYXR1cmVDb2xsZWN0aW9uXCIsXG4gICAgICAgICAgICAgICAgICBmZWF0dXJlczogbFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB0Ll9nZW9KU09OSW5kZXggPSBpLmNsdXN0ZXIgPyBuZXcgSihmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgIHZhciByID0gdC5zdXBlcmNsdXN0ZXJPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICBpID0gdC5jbHVzdGVyUHJvcGVydGllcztcbiAgICAgICAgICAgICAgICBpZiAoIWkgfHwgIXIpIHJldHVybiByO1xuXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgbyA9IHt9LCBuID0ge30sIHMgPSB7XG4gICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZDogbnVsbCxcbiAgICAgICAgICAgICAgICAgIHpvb206IDBcbiAgICAgICAgICAgICAgICB9LCBhID0ge1xuICAgICAgICAgICAgICAgICAgcHJvcGVydGllczogbnVsbFxuICAgICAgICAgICAgICAgIH0sIGwgPSBPYmplY3Qua2V5cyhpKSwgdSA9IDAsIGggPSBsOyB1IDwgaC5sZW5ndGg7IHUgKz0gMSkge1xuICAgICAgICAgICAgICAgICAgdmFyIGMgPSBoW3VdLFxuICAgICAgICAgICAgICAgICAgICAgIHAgPSBpW2NdLFxuICAgICAgICAgICAgICAgICAgICAgIGYgPSBwWzBdLFxuICAgICAgICAgICAgICAgICAgICAgIGQgPSBlLmNyZWF0ZUV4cHJlc3Npb24ocFsxXSksXG4gICAgICAgICAgICAgICAgICAgICAgZyA9IGUuY3JlYXRlRXhwcmVzc2lvbihcInN0cmluZ1wiID09IHR5cGVvZiBmID8gW2YsIFtcImFjY3VtdWxhdGVkXCJdLCBbXCJnZXRcIiwgY11dIDogZik7XG4gICAgICAgICAgICAgICAgICBvW2NdID0gZC52YWx1ZSwgbltjXSA9IGcudmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHIubWFwID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgIGEucHJvcGVydGllcyA9IGU7XG5cbiAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSB7fSwgciA9IDAsIGkgPSBsOyByIDwgaS5sZW5ndGg7IHIgKz0gMSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGlbcl07XG4gICAgICAgICAgICAgICAgICAgIHRbbl0gPSBvW25dLmV2YWx1YXRlKHMsIGEpO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICByZXR1cm4gdDtcbiAgICAgICAgICAgICAgICB9LCByLnJlZHVjZSA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICAgICAgICAgICAgICBhLnByb3BlcnRpZXMgPSB0O1xuXG4gICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gMCwgaSA9IGw7IHIgPCBpLmxlbmd0aDsgciArPSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBvID0gaVtyXTtcbiAgICAgICAgICAgICAgICAgICAgcy5hY2N1bXVsYXRlZCA9IGVbb10sIGVbb10gPSBuW29dLmV2YWx1YXRlKHMsIGEpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIHI7XG4gICAgICAgICAgICAgIH0oaSkpLmxvYWQocy5mZWF0dXJlcykgOiBmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgbWUoZSwgdCk7XG4gICAgICAgICAgICAgIH0ocywgaS5nZW9qc29uVnRPcHRpb25zKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKG4pIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHIobik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHQubG9hZGVkID0ge307XG4gICAgICAgICAgICB2YXIgdSA9IHt9O1xuXG4gICAgICAgICAgICBpZiAobykge1xuICAgICAgICAgICAgICB2YXIgaCA9IG8uZmluaXNoKCk7XG4gICAgICAgICAgICAgIGggJiYgKHUucmVzb3VyY2VUaW1pbmcgPSB7fSwgdS5yZXNvdXJjZVRpbWluZ1tpLnNvdXJjZV0gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGgpKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHIobnVsbCwgdSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sIHIucHJvdG90eXBlLmNvYWxlc2NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBcIkNvYWxlc2NpbmdcIiA9PT0gdGhpcy5fc3RhdGUgPyB0aGlzLl9zdGF0ZSA9IFwiSWRsZVwiIDogXCJOZWVkc0xvYWREYXRhXCIgPT09IHRoaXMuX3N0YXRlICYmICh0aGlzLl9zdGF0ZSA9IFwiQ29hbGVzY2luZ1wiLCB0aGlzLl9sb2FkRGF0YSgpKTtcbiAgICAgIH0sIHIucHJvdG90eXBlLnJlbG9hZFRpbGUgPSBmdW5jdGlvbiAoZSwgcikge1xuICAgICAgICB2YXIgaSA9IHRoaXMubG9hZGVkO1xuICAgICAgICByZXR1cm4gaSAmJiBpW2UudWlkXSA/IHQucHJvdG90eXBlLnJlbG9hZFRpbGUuY2FsbCh0aGlzLCBlLCByKSA6IHRoaXMubG9hZFRpbGUoZSwgcik7XG4gICAgICB9LCByLnByb3RvdHlwZS5sb2FkR2VvSlNPTiA9IGZ1bmN0aW9uICh0LCByKSB7XG4gICAgICAgIGlmICh0LnJlcXVlc3QpIGUuZ2V0SlNPTih0LnJlcXVlc3QsIHIpO2Vsc2Uge1xuICAgICAgICAgIGlmIChcInN0cmluZ1wiICE9IHR5cGVvZiB0LmRhdGEpIHJldHVybiByKG5ldyBFcnJvcihcIklucHV0IGRhdGEgZ2l2ZW4gdG8gJ1wiICsgdC5zb3VyY2UgKyBcIicgaXMgbm90IGEgdmFsaWQgR2VvSlNPTiBvYmplY3QuXCIpKTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gcihudWxsLCBKU09OLnBhcnNlKHQuZGF0YSkpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiByKG5ldyBFcnJvcihcIklucHV0IGRhdGEgZ2l2ZW4gdG8gJ1wiICsgdC5zb3VyY2UgKyBcIicgaXMgbm90IGEgdmFsaWQgR2VvSlNPTiBvYmplY3QuXCIpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIHIucHJvdG90eXBlLnJlbW92ZVNvdXJjZSA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICAgIHRoaXMuX3BlbmRpbmdDYWxsYmFjayAmJiB0aGlzLl9wZW5kaW5nQ2FsbGJhY2sobnVsbCwge1xuICAgICAgICAgIGFiYW5kb25lZDogITBcbiAgICAgICAgfSksIHQoKTtcbiAgICAgIH0sIHIucHJvdG90eXBlLmdldENsdXN0ZXJFeHBhbnNpb25ab29tID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0KG51bGwsIHRoaXMuX2dlb0pTT05JbmRleC5nZXRDbHVzdGVyRXhwYW5zaW9uWm9vbShlLmNsdXN0ZXJJZCkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdChlKTtcbiAgICAgICAgfVxuICAgICAgfSwgci5wcm90b3R5cGUuZ2V0Q2x1c3RlckNoaWxkcmVuID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0KG51bGwsIHRoaXMuX2dlb0pTT05JbmRleC5nZXRDaGlsZHJlbihlLmNsdXN0ZXJJZCkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdChlKTtcbiAgICAgICAgfVxuICAgICAgfSwgci5wcm90b3R5cGUuZ2V0Q2x1c3RlckxlYXZlcyA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdChudWxsLCB0aGlzLl9nZW9KU09OSW5kZXguZ2V0TGVhdmVzKGUuY2x1c3RlcklkLCBlLmxpbWl0LCBlLm9mZnNldCkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdChlKTtcbiAgICAgICAgfVxuICAgICAgfSwgcjtcbiAgICB9KGwpLFxuICAgICAgICBTZSA9IGZ1bmN0aW9uIFNlKHQpIHtcbiAgICAgIHZhciByID0gdGhpcztcbiAgICAgIHRoaXMuc2VsZiA9IHQsIHRoaXMuYWN0b3IgPSBuZXcgZS5BY3Rvcih0LCB0aGlzKSwgdGhpcy5sYXllckluZGV4ZXMgPSB7fSwgdGhpcy5hdmFpbGFibGVJbWFnZXMgPSB7fSwgdGhpcy53b3JrZXJTb3VyY2VUeXBlcyA9IHtcbiAgICAgICAgdmVjdG9yOiBsLFxuICAgICAgICBnZW9qc29uOiB3ZVxuICAgICAgfSwgdGhpcy53b3JrZXJTb3VyY2VzID0ge30sIHRoaXMuZGVtV29ya2VyU291cmNlcyA9IHt9LCB0aGlzLnNlbGYucmVnaXN0ZXJXb3JrZXJTb3VyY2UgPSBmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgICBpZiAoci53b3JrZXJTb3VyY2VUeXBlc1tlXSkgdGhyb3cgbmV3IEVycm9yKCdXb3JrZXIgc291cmNlIHdpdGggbmFtZSBcIicgKyBlICsgJ1wiIGFscmVhZHkgcmVnaXN0ZXJlZC4nKTtcbiAgICAgICAgci53b3JrZXJTb3VyY2VUeXBlc1tlXSA9IHQ7XG4gICAgICB9LCB0aGlzLnNlbGYucmVnaXN0ZXJSVExUZXh0UGx1Z2luID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgaWYgKGUucGx1Z2luLmlzUGFyc2VkKCkpIHRocm93IG5ldyBFcnJvcihcIlJUTCB0ZXh0IHBsdWdpbiBhbHJlYWR5IHJlZ2lzdGVyZWQuXCIpO1xuICAgICAgICBlLnBsdWdpbi5hcHBseUFyYWJpY1NoYXBpbmcgPSB0LmFwcGx5QXJhYmljU2hhcGluZywgZS5wbHVnaW4ucHJvY2Vzc0JpZGlyZWN0aW9uYWxUZXh0ID0gdC5wcm9jZXNzQmlkaXJlY3Rpb25hbFRleHQsIGUucGx1Z2luLnByb2Nlc3NTdHlsZWRCaWRpcmVjdGlvbmFsVGV4dCA9IHQucHJvY2Vzc1N0eWxlZEJpZGlyZWN0aW9uYWxUZXh0O1xuICAgICAgfTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFNlLnByb3RvdHlwZS5zZXRSZWZlcnJlciA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICB0aGlzLnJlZmVycmVyID0gdDtcbiAgICB9LCBTZS5wcm90b3R5cGUuc2V0SW1hZ2VzID0gZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICAgIGZvciAodmFyIGkgaW4gdGhpcy5hdmFpbGFibGVJbWFnZXNbZV0gPSB0LCB0aGlzLndvcmtlclNvdXJjZXNbZV0pIHtcbiAgICAgICAgdmFyIG8gPSB0aGlzLndvcmtlclNvdXJjZXNbZV1baV07XG5cbiAgICAgICAgZm9yICh2YXIgbiBpbiBvKSB7XG4gICAgICAgICAgb1tuXS5hdmFpbGFibGVJbWFnZXMgPSB0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHIoKTtcbiAgICB9LCBTZS5wcm90b3R5cGUuc2V0TGF5ZXJzID0gZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICAgIHRoaXMuZ2V0TGF5ZXJJbmRleChlKS5yZXBsYWNlKHQpLCByKCk7XG4gICAgfSwgU2UucHJvdG90eXBlLnVwZGF0ZUxheWVycyA9IGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgICB0aGlzLmdldExheWVySW5kZXgoZSkudXBkYXRlKHQubGF5ZXJzLCB0LnJlbW92ZWRJZHMpLCByKCk7XG4gICAgfSwgU2UucHJvdG90eXBlLmxvYWRUaWxlID0gZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICAgIHRoaXMuZ2V0V29ya2VyU291cmNlKGUsIHQudHlwZSwgdC5zb3VyY2UpLmxvYWRUaWxlKHQsIHIpO1xuICAgIH0sIFNlLnByb3RvdHlwZS5sb2FkREVNVGlsZSA9IGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgICB0aGlzLmdldERFTVdvcmtlclNvdXJjZShlLCB0LnNvdXJjZSkubG9hZFRpbGUodCwgcik7XG4gICAgfSwgU2UucHJvdG90eXBlLnJlbG9hZFRpbGUgPSBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgICAgdGhpcy5nZXRXb3JrZXJTb3VyY2UoZSwgdC50eXBlLCB0LnNvdXJjZSkucmVsb2FkVGlsZSh0LCByKTtcbiAgICB9LCBTZS5wcm90b3R5cGUuYWJvcnRUaWxlID0gZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICAgIHRoaXMuZ2V0V29ya2VyU291cmNlKGUsIHQudHlwZSwgdC5zb3VyY2UpLmFib3J0VGlsZSh0LCByKTtcbiAgICB9LCBTZS5wcm90b3R5cGUucmVtb3ZlVGlsZSA9IGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgICB0aGlzLmdldFdvcmtlclNvdXJjZShlLCB0LnR5cGUsIHQuc291cmNlKS5yZW1vdmVUaWxlKHQsIHIpO1xuICAgIH0sIFNlLnByb3RvdHlwZS5yZW1vdmVERU1UaWxlID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIHRoaXMuZ2V0REVNV29ya2VyU291cmNlKGUsIHQuc291cmNlKS5yZW1vdmVUaWxlKHQpO1xuICAgIH0sIFNlLnByb3RvdHlwZS5yZW1vdmVTb3VyY2UgPSBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgICAgaWYgKHRoaXMud29ya2VyU291cmNlc1tlXSAmJiB0aGlzLndvcmtlclNvdXJjZXNbZV1bdC50eXBlXSAmJiB0aGlzLndvcmtlclNvdXJjZXNbZV1bdC50eXBlXVt0LnNvdXJjZV0pIHtcbiAgICAgICAgdmFyIGkgPSB0aGlzLndvcmtlclNvdXJjZXNbZV1bdC50eXBlXVt0LnNvdXJjZV07XG4gICAgICAgIGRlbGV0ZSB0aGlzLndvcmtlclNvdXJjZXNbZV1bdC50eXBlXVt0LnNvdXJjZV0sIHZvaWQgMCAhPT0gaS5yZW1vdmVTb3VyY2UgPyBpLnJlbW92ZVNvdXJjZSh0LCByKSA6IHIoKTtcbiAgICAgIH1cbiAgICB9LCBTZS5wcm90b3R5cGUubG9hZFdvcmtlclNvdXJjZSA9IGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnNlbGYuaW1wb3J0U2NyaXB0cyh0LnVybCksIHIoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcihlLnRvU3RyaW5nKCkpO1xuICAgICAgfVxuICAgIH0sIFNlLnByb3RvdHlwZS5zeW5jUlRMUGx1Z2luU3RhdGUgPSBmdW5jdGlvbiAodCwgciwgaSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZS5wbHVnaW4uc2V0U3RhdGUocik7XG4gICAgICAgIHZhciBvID0gZS5wbHVnaW4uZ2V0UGx1Z2luVVJMKCk7XG5cbiAgICAgICAgaWYgKGUucGx1Z2luLmlzTG9hZGVkKCkgJiYgIWUucGx1Z2luLmlzUGFyc2VkKCkgJiYgbnVsbCAhPSBvKSB7XG4gICAgICAgICAgdGhpcy5zZWxmLmltcG9ydFNjcmlwdHMobyk7XG4gICAgICAgICAgdmFyIG4gPSBlLnBsdWdpbi5pc1BhcnNlZCgpO1xuICAgICAgICAgIGkobiA/IHZvaWQgMCA6IG5ldyBFcnJvcihcIlJUTCBUZXh0IFBsdWdpbiBmYWlsZWQgdG8gaW1wb3J0IHNjcmlwdHMgZnJvbSBcIiArIG8pLCBuKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpKGUudG9TdHJpbmcoKSk7XG4gICAgICB9XG4gICAgfSwgU2UucHJvdG90eXBlLmdldEF2YWlsYWJsZUltYWdlcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCA9IHRoaXMuYXZhaWxhYmxlSW1hZ2VzW2VdO1xuICAgICAgcmV0dXJuIHQgfHwgKHQgPSBbXSksIHQ7XG4gICAgfSwgU2UucHJvdG90eXBlLmdldExheWVySW5kZXggPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSB0aGlzLmxheWVySW5kZXhlc1tlXTtcbiAgICAgIHJldHVybiB0IHx8ICh0ID0gdGhpcy5sYXllckluZGV4ZXNbZV0gPSBuZXcgaSgpKSwgdDtcbiAgICB9LCBTZS5wcm90b3R5cGUuZ2V0V29ya2VyU291cmNlID0gZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICAgIHZhciBpID0gdGhpcztcbiAgICAgIHJldHVybiB0aGlzLndvcmtlclNvdXJjZXNbZV0gfHwgKHRoaXMud29ya2VyU291cmNlc1tlXSA9IHt9KSwgdGhpcy53b3JrZXJTb3VyY2VzW2VdW3RdIHx8ICh0aGlzLndvcmtlclNvdXJjZXNbZV1bdF0gPSB7fSksIHRoaXMud29ya2VyU291cmNlc1tlXVt0XVtyXSB8fCAodGhpcy53b3JrZXJTb3VyY2VzW2VdW3RdW3JdID0gbmV3IHRoaXMud29ya2VyU291cmNlVHlwZXNbdF0oe1xuICAgICAgICBzZW5kOiBmdW5jdGlvbiBzZW5kKHQsIHIsIG8pIHtcbiAgICAgICAgICBpLmFjdG9yLnNlbmQodCwgciwgbywgZSk7XG4gICAgICAgIH1cbiAgICAgIH0sIHRoaXMuZ2V0TGF5ZXJJbmRleChlKSwgdGhpcy5nZXRBdmFpbGFibGVJbWFnZXMoZSkpKSwgdGhpcy53b3JrZXJTb3VyY2VzW2VdW3RdW3JdO1xuICAgIH0sIFNlLnByb3RvdHlwZS5nZXRERU1Xb3JrZXJTb3VyY2UgPSBmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGVtV29ya2VyU291cmNlc1tlXSB8fCAodGhpcy5kZW1Xb3JrZXJTb3VyY2VzW2VdID0ge30pLCB0aGlzLmRlbVdvcmtlclNvdXJjZXNbZV1bdF0gfHwgKHRoaXMuZGVtV29ya2VyU291cmNlc1tlXVt0XSA9IG5ldyBoKCkpLCB0aGlzLmRlbVdvcmtlclNvdXJjZXNbZV1bdF07XG4gICAgfSwgU2UucHJvdG90eXBlLmVuZm9yY2VDYWNoZVNpemVMaW1pdCA9IGZ1bmN0aW9uICh0LCByKSB7XG4gICAgICBlLmVuZm9yY2VDYWNoZVNpemVMaW1pdChyKTtcbiAgICB9LCBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZSAmJiBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBzZWxmICYmIHNlbGYgaW5zdGFuY2VvZiBXb3JrZXJHbG9iYWxTY29wZSAmJiAoc2VsZi53b3JrZXIgPSBuZXcgU2Uoc2VsZikpLCBTZTtcbiAgfSk7XG4gIGRlZmluZShbXCIuL3NoYXJlZFwiXSwgZnVuY3Rpb24gKHQpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIHZhciBlID0gdC5jcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSh0KSB7XG4gICAgICAgIHJldHVybiAhaSh0KTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gaSh0KSB7XG4gICAgICAgIHJldHVybiBcInVuZGVmaW5lZFwiID09IHR5cGVvZiB3aW5kb3cgfHwgXCJ1bmRlZmluZWRcIiA9PSB0eXBlb2YgZG9jdW1lbnQgPyBcIm5vdCBhIGJyb3dzZXJcIiA6IEFycmF5LnByb3RvdHlwZSAmJiBBcnJheS5wcm90b3R5cGUuZXZlcnkgJiYgQXJyYXkucHJvdG90eXBlLmZpbHRlciAmJiBBcnJheS5wcm90b3R5cGUuZm9yRWFjaCAmJiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiAmJiBBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YgJiYgQXJyYXkucHJvdG90eXBlLm1hcCAmJiBBcnJheS5wcm90b3R5cGUuc29tZSAmJiBBcnJheS5wcm90b3R5cGUucmVkdWNlICYmIEFycmF5LnByb3RvdHlwZS5yZWR1Y2VSaWdodCAmJiBBcnJheS5pc0FycmF5ID8gRnVuY3Rpb24ucHJvdG90eXBlICYmIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kID8gT2JqZWN0LmtleXMgJiYgT2JqZWN0LmNyZWF0ZSAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YgJiYgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgJiYgT2JqZWN0LmlzU2VhbGVkICYmIE9iamVjdC5pc0Zyb3plbiAmJiBPYmplY3QuaXNFeHRlbnNpYmxlICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzICYmIE9iamVjdC5zZWFsICYmIE9iamVjdC5mcmVlemUgJiYgT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zID8gXCJKU09OXCIgaW4gd2luZG93ICYmIFwicGFyc2VcIiBpbiBKU09OICYmIFwic3RyaW5naWZ5XCIgaW4gSlNPTiA/IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoIShcIldvcmtlclwiIGluIHdpbmRvdyAmJiBcIkJsb2JcIiBpbiB3aW5kb3cgJiYgXCJVUkxcIiBpbiB3aW5kb3cpKSByZXR1cm4gITE7XG4gICAgICAgICAgdmFyIHQsXG4gICAgICAgICAgICAgIGUsXG4gICAgICAgICAgICAgIGkgPSBuZXcgQmxvYihbXCJcIl0sIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dC9qYXZhc2NyaXB0XCJcbiAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgbyA9IFVSTC5jcmVhdGVPYmplY3RVUkwoaSk7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgZSA9IG5ldyBXb3JrZXIobyksIHQgPSAhMDtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0ID0gITE7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGUgJiYgZS50ZXJtaW5hdGUoKSwgVVJMLnJldm9rZU9iamVjdFVSTChvKSwgdDtcbiAgICAgICAgfSgpID8gXCJVaW50OENsYW1wZWRBcnJheVwiIGluIHdpbmRvdyA/IEFycmF5QnVmZmVyLmlzVmlldyA/IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgICAgICAgdC53aWR0aCA9IHQuaGVpZ2h0ID0gMTtcbiAgICAgICAgICB2YXIgZSA9IHQuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgICAgICAgIGlmICghZSkgcmV0dXJuICExO1xuICAgICAgICAgIHZhciBpID0gZS5nZXRJbWFnZURhdGEoMCwgMCwgMSwgMSk7XG4gICAgICAgICAgcmV0dXJuIGkgJiYgaS53aWR0aCA9PT0gdC53aWR0aDtcbiAgICAgICAgfSgpID8gKHZvaWQgMCA9PT0gb1tpID0gdCAmJiB0LmZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXRdICYmIChvW2ldID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICB2YXIgaSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICB2YXIgaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIiksXG4gICAgICAgICAgICAgICAgbyA9IE9iamVjdC5jcmVhdGUoZS53ZWJHTENvbnRleHRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgIHJldHVybiBvLmZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQgPSB0LCBpLnByb2JhYmx5U3VwcG9ydHNDb250ZXh0ID8gaS5wcm9iYWJseVN1cHBvcnRzQ29udGV4dChcIndlYmdsXCIsIG8pIHx8IGkucHJvYmFibHlTdXBwb3J0c0NvbnRleHQoXCJleHBlcmltZW50YWwtd2ViZ2xcIiwgbykgOiBpLnN1cHBvcnRzQ29udGV4dCA/IGkuc3VwcG9ydHNDb250ZXh0KFwid2ViZ2xcIiwgbykgfHwgaS5zdXBwb3J0c0NvbnRleHQoXCJleHBlcmltZW50YWwtd2ViZ2xcIiwgbykgOiBpLmdldENvbnRleHQoXCJ3ZWJnbFwiLCBvKSB8fCBpLmdldENvbnRleHQoXCJleHBlcmltZW50YWwtd2ViZ2xcIiwgbyk7XG4gICAgICAgICAgfSh0KTtcblxuICAgICAgICAgIGlmICghaSkgcmV0dXJuICExO1xuICAgICAgICAgIHZhciBvID0gaS5jcmVhdGVTaGFkZXIoaS5WRVJURVhfU0hBREVSKTtcbiAgICAgICAgICByZXR1cm4gISghbyB8fCBpLmlzQ29udGV4dExvc3QoKSkgJiYgKGkuc2hhZGVyU291cmNlKG8sIFwidm9pZCBtYWluKCkge31cIiksIGkuY29tcGlsZVNoYWRlcihvKSwgITAgPT09IGkuZ2V0U2hhZGVyUGFyYW1ldGVyKG8sIGkuQ09NUElMRV9TVEFUVVMpKTtcbiAgICAgICAgfShpKSksIG9baV0gPyB2b2lkIDAgOiBcImluc3VmZmljaWVudCBXZWJHTCBzdXBwb3J0XCIpIDogXCJpbnN1ZmZpY2llbnQgQ2FudmFzL2dldEltYWdlRGF0YSBzdXBwb3J0XCIgOiBcImluc3VmZmljaWVudCBBcnJheUJ1ZmZlciBzdXBwb3J0XCIgOiBcImluc3VmZmljaWVudCBVaW50OENsYW1wZWRBcnJheSBzdXBwb3J0XCIgOiBcImluc3VmZmljaWVudCB3b3JrZXIgc3VwcG9ydFwiIDogXCJpbnN1ZmZpY2llbnQgSlNPTiBzdXBwb3J0XCIgOiBcImluc3VmZmljaWVudCBPYmplY3Qgc3VwcG9ydFwiIDogXCJpbnN1ZmZpY2llbnQgRnVuY3Rpb24gc3VwcG9ydFwiIDogXCJpbnN1ZmZpY2VudCBBcnJheSBzdXBwb3J0XCI7XG4gICAgICAgIHZhciBpO1xuICAgICAgfVxuXG4gICAgICB0LmV4cG9ydHMgPyB0LmV4cG9ydHMgPSBlIDogd2luZG93ICYmICh3aW5kb3cubWFwYm94Z2wgPSB3aW5kb3cubWFwYm94Z2wgfHwge30sIHdpbmRvdy5tYXBib3hnbC5zdXBwb3J0ZWQgPSBlLCB3aW5kb3cubWFwYm94Z2wubm90U3VwcG9ydGVkUmVhc29uID0gaSk7XG4gICAgICB2YXIgbyA9IHt9O1xuICAgICAgZS53ZWJHTENvbnRleHRBdHRyaWJ1dGVzID0ge1xuICAgICAgICBhbnRpYWxpYXM6ICExLFxuICAgICAgICBhbHBoYTogITAsXG4gICAgICAgIHN0ZW5jaWw6ICEwLFxuICAgICAgICBkZXB0aDogITBcbiAgICAgIH07XG4gICAgfSksXG4gICAgICAgIGkgPSB7XG4gICAgICBjcmVhdGU6IGZ1bmN0aW9uIGNyZWF0ZShlLCBpLCBvKSB7XG4gICAgICAgIHZhciByID0gdC53aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlKTtcbiAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gaSAmJiAoci5jbGFzc05hbWUgPSBpKSwgbyAmJiBvLmFwcGVuZENoaWxkKHIpLCByO1xuICAgICAgfSxcbiAgICAgIGNyZWF0ZU5TOiBmdW5jdGlvbiBjcmVhdGVOUyhlLCBpKSB7XG4gICAgICAgIHJldHVybiB0LndpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZSwgaSk7XG4gICAgICB9XG4gICAgfSxcbiAgICAgICAgbyA9IHQud2luZG93LmRvY3VtZW50ICYmIHQud2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZTtcblxuICAgIGZ1bmN0aW9uIHIodCkge1xuICAgICAgaWYgKCFvKSByZXR1cm4gdFswXTtcblxuICAgICAgZm9yICh2YXIgZSA9IDA7IGUgPCB0Lmxlbmd0aDsgZSsrKSB7XG4gICAgICAgIGlmICh0W2VdIGluIG8pIHJldHVybiB0W2VdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdFswXTtcbiAgICB9XG5cbiAgICB2YXIgYSxcbiAgICAgICAgbiA9IHIoW1widXNlclNlbGVjdFwiLCBcIk1velVzZXJTZWxlY3RcIiwgXCJXZWJraXRVc2VyU2VsZWN0XCIsIFwibXNVc2VyU2VsZWN0XCJdKTtcbiAgICBpLmRpc2FibGVEcmFnID0gZnVuY3Rpb24gKCkge1xuICAgICAgbyAmJiBuICYmIChhID0gb1tuXSwgb1tuXSA9IFwibm9uZVwiKTtcbiAgICB9LCBpLmVuYWJsZURyYWcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBvICYmIG4gJiYgKG9bbl0gPSBhKTtcbiAgICB9O1xuICAgIHZhciBzID0gcihbXCJ0cmFuc2Zvcm1cIiwgXCJXZWJraXRUcmFuc2Zvcm1cIl0pO1xuXG4gICAgaS5zZXRUcmFuc2Zvcm0gPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgdC5zdHlsZVtzXSA9IGU7XG4gICAgfTtcblxuICAgIHZhciBsID0gITE7XG5cbiAgICB0cnkge1xuICAgICAgdmFyIGMgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sIFwicGFzc2l2ZVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgIGwgPSAhMDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0LndpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwidGVzdFwiLCBjLCBjKSwgdC53aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRlc3RcIiwgYywgYyk7XG4gICAgfSBjYXRjaCAodCkge1xuICAgICAgbCA9ICExO1xuICAgIH1cblxuICAgIGkuYWRkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uICh0LCBlLCBpLCBvKSB7XG4gICAgICB2b2lkIDAgPT09IG8gJiYgKG8gPSB7fSksIHQuYWRkRXZlbnRMaXN0ZW5lcihlLCBpLCBcInBhc3NpdmVcIiBpbiBvICYmIGwgPyBvIDogby5jYXB0dXJlKTtcbiAgICB9LCBpLnJlbW92ZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAodCwgZSwgaSwgbykge1xuICAgICAgdm9pZCAwID09PSBvICYmIChvID0ge30pLCB0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZSwgaSwgXCJwYXNzaXZlXCIgaW4gbyAmJiBsID8gbyA6IG8uY2FwdHVyZSk7XG4gICAgfTtcblxuICAgIHZhciB1ID0gZnVuY3Rpb24gdShlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCksIGUuc3RvcFByb3BhZ2F0aW9uKCksIHQud2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB1LCAhMCk7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGgodCkge1xuICAgICAgdmFyIGUgPSB0LnVzZXJJbWFnZTtcbiAgICAgIHJldHVybiAhIShlICYmIGUucmVuZGVyICYmIGUucmVuZGVyKCkpICYmICh0LmRhdGEucmVwbGFjZShuZXcgVWludDhBcnJheShlLmRhdGEuYnVmZmVyKSksICEwKTtcbiAgICB9XG5cbiAgICBpLnN1cHByZXNzQ2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0LndpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdSwgITApLCB0LndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdC53aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHUsICEwKTtcbiAgICAgIH0sIDApO1xuICAgIH0sIGkubW91c2VQb3MgPSBmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgdmFyIG8gPSBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgcmV0dXJuIG5ldyB0LlBvaW50KGkuY2xpZW50WCAtIG8ubGVmdCAtIGUuY2xpZW50TGVmdCwgaS5jbGllbnRZIC0gby50b3AgLSBlLmNsaWVudFRvcCk7XG4gICAgfSwgaS50b3VjaFBvcyA9IGZ1bmN0aW9uIChlLCBpKSB7XG4gICAgICBmb3IgKHZhciBvID0gZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgciA9IFtdLCBhID0gMDsgYSA8IGkubGVuZ3RoOyBhKyspIHtcbiAgICAgICAgci5wdXNoKG5ldyB0LlBvaW50KGlbYV0uY2xpZW50WCAtIG8ubGVmdCAtIGUuY2xpZW50TGVmdCwgaVthXS5jbGllbnRZIC0gby50b3AgLSBlLmNsaWVudFRvcCkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9LCBpLm1vdXNlQnV0dG9uID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHJldHVybiB2b2lkIDAgIT09IHQud2luZG93Lkluc3RhbGxUcmlnZ2VyICYmIDIgPT09IGUuYnV0dG9uICYmIGUuY3RybEtleSAmJiB0LndpbmRvdy5uYXZpZ2F0b3IucGxhdGZvcm0udG9VcHBlckNhc2UoKS5pbmRleE9mKFwiTUFDXCIpID49IDAgPyAwIDogZS5idXR0b247XG4gICAgfSwgaS5yZW1vdmUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdC5wYXJlbnROb2RlICYmIHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KTtcbiAgICB9O1xuXG4gICAgdmFyIHAgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgZnVuY3Rpb24gaSgpIHtcbiAgICAgICAgZS5jYWxsKHRoaXMpLCB0aGlzLmltYWdlcyA9IHt9LCB0aGlzLnVwZGF0ZWRJbWFnZXMgPSB7fSwgdGhpcy5jYWxsYmFja0Rpc3BhdGNoZWRUaGlzRnJhbWUgPSB7fSwgdGhpcy5sb2FkZWQgPSAhMSwgdGhpcy5yZXF1ZXN0b3JzID0gW10sIHRoaXMucGF0dGVybnMgPSB7fSwgdGhpcy5hdGxhc0ltYWdlID0gbmV3IHQuUkdCQUltYWdlKHtcbiAgICAgICAgICB3aWR0aDogMSxcbiAgICAgICAgICBoZWlnaHQ6IDFcbiAgICAgICAgfSksIHRoaXMuZGlydHkgPSAhMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGUgJiYgKGkuX19wcm90b19fID0gZSksIChpLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoZSAmJiBlLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gaSwgaS5wcm90b3R5cGUuaXNMb2FkZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRlZDtcbiAgICAgIH0sIGkucHJvdG90eXBlLnNldExvYWRlZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGlmICh0aGlzLmxvYWRlZCAhPT0gdCAmJiAodGhpcy5sb2FkZWQgPSB0LCB0KSkge1xuICAgICAgICAgIGZvciAodmFyIGUgPSAwLCBpID0gdGhpcy5yZXF1ZXN0b3JzOyBlIDwgaS5sZW5ndGg7IGUgKz0gMSkge1xuICAgICAgICAgICAgdmFyIG8gPSBpW2VdO1xuXG4gICAgICAgICAgICB0aGlzLl9ub3RpZnkoby5pZHMsIG8uY2FsbGJhY2spO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMucmVxdWVzdG9ycyA9IFtdO1xuICAgICAgICB9XG4gICAgICB9LCBpLnByb3RvdHlwZS5nZXRJbWFnZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmltYWdlc1t0XTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmFkZEltYWdlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgdGhpcy5fdmFsaWRhdGUodCwgZSkgJiYgKHRoaXMuaW1hZ2VzW3RdID0gZSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5fdmFsaWRhdGUgPSBmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgICB2YXIgbyA9ICEwO1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGVTdHJldGNoKGkuc3RyZXRjaFgsIGkuZGF0YSAmJiBpLmRhdGEud2lkdGgpIHx8ICh0aGlzLmZpcmUobmV3IHQuRXJyb3JFdmVudChuZXcgRXJyb3IoJ0ltYWdlIFwiJyArIGUgKyAnXCIgaGFzIGludmFsaWQgXCJzdHJldGNoWFwiIHZhbHVlJykpKSwgbyA9ICExKSwgdGhpcy5fdmFsaWRhdGVTdHJldGNoKGkuc3RyZXRjaFksIGkuZGF0YSAmJiBpLmRhdGEuaGVpZ2h0KSB8fCAodGhpcy5maXJlKG5ldyB0LkVycm9yRXZlbnQobmV3IEVycm9yKCdJbWFnZSBcIicgKyBlICsgJ1wiIGhhcyBpbnZhbGlkIFwic3RyZXRjaFlcIiB2YWx1ZScpKSksIG8gPSAhMSksIHRoaXMuX3ZhbGlkYXRlQ29udGVudChpLmNvbnRlbnQsIGkpIHx8ICh0aGlzLmZpcmUobmV3IHQuRXJyb3JFdmVudChuZXcgRXJyb3IoJ0ltYWdlIFwiJyArIGUgKyAnXCIgaGFzIGludmFsaWQgXCJjb250ZW50XCIgdmFsdWUnKSkpLCBvID0gITEpLCBvO1xuICAgICAgfSwgaS5wcm90b3R5cGUuX3ZhbGlkYXRlU3RyZXRjaCA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIGlmICghdCkgcmV0dXJuICEwO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBvID0gMCwgciA9IHQ7IG8gPCByLmxlbmd0aDsgbyArPSAxKSB7XG4gICAgICAgICAgdmFyIGEgPSByW29dO1xuICAgICAgICAgIGlmIChhWzBdIDwgaSB8fCBhWzFdIDwgYVswXSB8fCBlIDwgYVsxXSkgcmV0dXJuICExO1xuICAgICAgICAgIGkgPSBhWzFdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICEwO1xuICAgICAgfSwgaS5wcm90b3R5cGUuX3ZhbGlkYXRlQ29udGVudCA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiAhKHQgJiYgKDQgIT09IHQubGVuZ3RoIHx8IHRbMF0gPCAwIHx8IGUuZGF0YS53aWR0aCA8IHRbMF0gfHwgdFsxXSA8IDAgfHwgZS5kYXRhLmhlaWdodCA8IHRbMV0gfHwgdFsyXSA8IDAgfHwgZS5kYXRhLndpZHRoIDwgdFsyXSB8fCB0WzNdIDwgMCB8fCBlLmRhdGEuaGVpZ2h0IDwgdFszXSB8fCB0WzJdIDwgdFswXSB8fCB0WzNdIDwgdFsxXSkpO1xuICAgICAgfSwgaS5wcm90b3R5cGUudXBkYXRlSW1hZ2UgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICBlLnZlcnNpb24gPSB0aGlzLmltYWdlc1t0XS52ZXJzaW9uICsgMSwgdGhpcy5pbWFnZXNbdF0gPSBlLCB0aGlzLnVwZGF0ZWRJbWFnZXNbdF0gPSAhMDtcbiAgICAgIH0sIGkucHJvdG90eXBlLnJlbW92ZUltYWdlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdmFyIGUgPSB0aGlzLmltYWdlc1t0XTtcbiAgICAgICAgZGVsZXRlIHRoaXMuaW1hZ2VzW3RdLCBkZWxldGUgdGhpcy5wYXR0ZXJuc1t0XSwgZS51c2VySW1hZ2UgJiYgZS51c2VySW1hZ2Uub25SZW1vdmUgJiYgZS51c2VySW1hZ2Uub25SZW1vdmUoKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmxpc3RJbWFnZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmltYWdlcyk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5nZXRJbWFnZXMgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICB2YXIgaSA9ICEwO1xuICAgICAgICBpZiAoIXRoaXMuaXNMb2FkZWQoKSkgZm9yICh2YXIgbyA9IDAsIHIgPSB0OyBvIDwgci5sZW5ndGg7IG8gKz0gMSkge1xuICAgICAgICAgIHRoaXMuaW1hZ2VzW3Jbb11dIHx8IChpID0gITEpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNMb2FkZWQoKSB8fCBpID8gdGhpcy5fbm90aWZ5KHQsIGUpIDogdGhpcy5yZXF1ZXN0b3JzLnB1c2goe1xuICAgICAgICAgIGlkczogdCxcbiAgICAgICAgICBjYWxsYmFjazogZVxuICAgICAgICB9KTtcbiAgICAgIH0sIGkucHJvdG90eXBlLl9ub3RpZnkgPSBmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgICBmb3IgKHZhciBvID0ge30sIHIgPSAwLCBhID0gZTsgciA8IGEubGVuZ3RoOyByICs9IDEpIHtcbiAgICAgICAgICB2YXIgbiA9IGFbcl07XG4gICAgICAgICAgdGhpcy5pbWFnZXNbbl0gfHwgdGhpcy5maXJlKG5ldyB0LkV2ZW50KFwic3R5bGVpbWFnZW1pc3NpbmdcIiwge1xuICAgICAgICAgICAgaWQ6IG5cbiAgICAgICAgICB9KSk7XG4gICAgICAgICAgdmFyIHMgPSB0aGlzLmltYWdlc1tuXTtcbiAgICAgICAgICBzID8gb1tuXSA9IHtcbiAgICAgICAgICAgIGRhdGE6IHMuZGF0YS5jbG9uZSgpLFxuICAgICAgICAgICAgcGl4ZWxSYXRpbzogcy5waXhlbFJhdGlvLFxuICAgICAgICAgICAgc2RmOiBzLnNkZixcbiAgICAgICAgICAgIHZlcnNpb246IHMudmVyc2lvbixcbiAgICAgICAgICAgIHN0cmV0Y2hYOiBzLnN0cmV0Y2hYLFxuICAgICAgICAgICAgc3RyZXRjaFk6IHMuc3RyZXRjaFksXG4gICAgICAgICAgICBjb250ZW50OiBzLmNvbnRlbnQsXG4gICAgICAgICAgICBoYXNSZW5kZXJDYWxsYmFjazogQm9vbGVhbihzLnVzZXJJbWFnZSAmJiBzLnVzZXJJbWFnZS5yZW5kZXIpXG4gICAgICAgICAgfSA6IHQud2Fybk9uY2UoJ0ltYWdlIFwiJyArIG4gKyAnXCIgY291bGQgbm90IGJlIGxvYWRlZC4gUGxlYXNlIG1ha2Ugc3VyZSB5b3UgaGF2ZSBhZGRlZCB0aGUgaW1hZ2Ugd2l0aCBtYXAuYWRkSW1hZ2UoKSBvciBhIFwic3ByaXRlXCIgcHJvcGVydHkgaW4geW91ciBzdHlsZS4gWW91IGNhbiBwcm92aWRlIG1pc3NpbmcgaW1hZ2VzIGJ5IGxpc3RlbmluZyBmb3IgdGhlIFwic3R5bGVpbWFnZW1pc3NpbmdcIiBtYXAgZXZlbnQuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpKG51bGwsIG8pO1xuICAgICAgfSwgaS5wcm90b3R5cGUuZ2V0UGl4ZWxTaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdCA9IHRoaXMuYXRsYXNJbWFnZTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB3aWR0aDogdC53aWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IHQuaGVpZ2h0XG4gICAgICAgIH07XG4gICAgICB9LCBpLnByb3RvdHlwZS5nZXRQYXR0ZXJuID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIGkgPSB0aGlzLnBhdHRlcm5zW2VdLFxuICAgICAgICAgICAgbyA9IHRoaXMuZ2V0SW1hZ2UoZSk7XG4gICAgICAgIGlmICghbykgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmIChpICYmIGkucG9zaXRpb24udmVyc2lvbiA9PT0gby52ZXJzaW9uKSByZXR1cm4gaS5wb3NpdGlvbjtcbiAgICAgICAgaWYgKGkpIGkucG9zaXRpb24udmVyc2lvbiA9IG8udmVyc2lvbjtlbHNlIHtcbiAgICAgICAgICB2YXIgciA9IHtcbiAgICAgICAgICAgIHc6IG8uZGF0YS53aWR0aCArIDIsXG4gICAgICAgICAgICBoOiBvLmRhdGEuaGVpZ2h0ICsgMixcbiAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICB5OiAwXG4gICAgICAgICAgfSxcbiAgICAgICAgICAgICAgYSA9IG5ldyB0LkltYWdlUG9zaXRpb24ociwgbyk7XG4gICAgICAgICAgdGhpcy5wYXR0ZXJuc1tlXSA9IHtcbiAgICAgICAgICAgIGJpbjogcixcbiAgICAgICAgICAgIHBvc2l0aW9uOiBhXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdXBkYXRlUGF0dGVybkF0bGFzKCksIHRoaXMucGF0dGVybnNbZV0ucG9zaXRpb247XG4gICAgICB9LCBpLnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIGkgPSBlLmdsO1xuICAgICAgICB0aGlzLmF0bGFzVGV4dHVyZSA/IHRoaXMuZGlydHkgJiYgKHRoaXMuYXRsYXNUZXh0dXJlLnVwZGF0ZSh0aGlzLmF0bGFzSW1hZ2UpLCB0aGlzLmRpcnR5ID0gITEpIDogdGhpcy5hdGxhc1RleHR1cmUgPSBuZXcgdC5UZXh0dXJlKGUsIHRoaXMuYXRsYXNJbWFnZSwgaS5SR0JBKSwgdGhpcy5hdGxhc1RleHR1cmUuYmluZChpLkxJTkVBUiwgaS5DTEFNUF9UT19FREdFKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLl91cGRhdGVQYXR0ZXJuQXRsYXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlID0gW107XG5cbiAgICAgICAgZm9yICh2YXIgaSBpbiB0aGlzLnBhdHRlcm5zKSB7XG4gICAgICAgICAgZS5wdXNoKHRoaXMucGF0dGVybnNbaV0uYmluKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBvID0gdC5wb3RwYWNrKGUpLFxuICAgICAgICAgICAgciA9IG8udyxcbiAgICAgICAgICAgIGEgPSBvLmgsXG4gICAgICAgICAgICBuID0gdGhpcy5hdGxhc0ltYWdlO1xuXG4gICAgICAgIGZvciAodmFyIHMgaW4gbi5yZXNpemUoe1xuICAgICAgICAgIHdpZHRoOiByIHx8IDEsXG4gICAgICAgICAgaGVpZ2h0OiBhIHx8IDFcbiAgICAgICAgfSksIHRoaXMucGF0dGVybnMpIHtcbiAgICAgICAgICB2YXIgbCA9IHRoaXMucGF0dGVybnNbc10uYmluLFxuICAgICAgICAgICAgICBjID0gbC54ICsgMSxcbiAgICAgICAgICAgICAgdSA9IGwueSArIDEsXG4gICAgICAgICAgICAgIGggPSB0aGlzLmltYWdlc1tzXS5kYXRhLFxuICAgICAgICAgICAgICBwID0gaC53aWR0aCxcbiAgICAgICAgICAgICAgZCA9IGguaGVpZ2h0O1xuICAgICAgICAgIHQuUkdCQUltYWdlLmNvcHkoaCwgbiwge1xuICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgIHk6IDBcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICB4OiBjLFxuICAgICAgICAgICAgeTogdVxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIHdpZHRoOiBwLFxuICAgICAgICAgICAgaGVpZ2h0OiBkXG4gICAgICAgICAgfSksIHQuUkdCQUltYWdlLmNvcHkoaCwgbiwge1xuICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgIHk6IGQgLSAxXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgeDogYyxcbiAgICAgICAgICAgIHk6IHUgLSAxXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgd2lkdGg6IHAsXG4gICAgICAgICAgICBoZWlnaHQ6IDFcbiAgICAgICAgICB9KSwgdC5SR0JBSW1hZ2UuY29weShoLCBuLCB7XG4gICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgeTogMFxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIHg6IGMsXG4gICAgICAgICAgICB5OiB1ICsgZFxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIHdpZHRoOiBwLFxuICAgICAgICAgICAgaGVpZ2h0OiAxXG4gICAgICAgICAgfSksIHQuUkdCQUltYWdlLmNvcHkoaCwgbiwge1xuICAgICAgICAgICAgeDogcCAtIDEsXG4gICAgICAgICAgICB5OiAwXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgeDogYyAtIDEsXG4gICAgICAgICAgICB5OiB1XG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgd2lkdGg6IDEsXG4gICAgICAgICAgICBoZWlnaHQ6IGRcbiAgICAgICAgICB9KSwgdC5SR0JBSW1hZ2UuY29weShoLCBuLCB7XG4gICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgeTogMFxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIHg6IGMgKyBwLFxuICAgICAgICAgICAgeTogdVxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIHdpZHRoOiAxLFxuICAgICAgICAgICAgaGVpZ2h0OiBkXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRpcnR5ID0gITA7XG4gICAgICB9LCBpLnByb3RvdHlwZS5iZWdpbkZyYW1lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmNhbGxiYWNrRGlzcGF0Y2hlZFRoaXNGcmFtZSA9IHt9O1xuICAgICAgfSwgaS5wcm90b3R5cGUuZGlzcGF0Y2hSZW5kZXJDYWxsYmFja3MgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICBmb3IgKHZhciBlID0gMCwgaSA9IHQ7IGUgPCBpLmxlbmd0aDsgZSArPSAxKSB7XG4gICAgICAgICAgdmFyIG8gPSBpW2VdO1xuXG4gICAgICAgICAgaWYgKCF0aGlzLmNhbGxiYWNrRGlzcGF0Y2hlZFRoaXNGcmFtZVtvXSkge1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFja0Rpc3BhdGNoZWRUaGlzRnJhbWVbb10gPSAhMDtcbiAgICAgICAgICAgIHZhciByID0gdGhpcy5pbWFnZXNbb107XG4gICAgICAgICAgICBoKHIpICYmIHRoaXMudXBkYXRlSW1hZ2Uobywgcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCBpO1xuICAgIH0odC5FdmVudGVkKSxcbiAgICAgICAgZCA9IG0sXG4gICAgICAgIF8gPSBtLFxuICAgICAgICBmID0gMWUyMDtcblxuICAgIGZ1bmN0aW9uIG0odCwgZSwgaSwgbywgciwgYSkge1xuICAgICAgdGhpcy5mb250U2l6ZSA9IHQgfHwgMjQsIHRoaXMuYnVmZmVyID0gdm9pZCAwID09PSBlID8gMyA6IGUsIHRoaXMuY3V0b2ZmID0gbyB8fCAuMjUsIHRoaXMuZm9udEZhbWlseSA9IHIgfHwgXCJzYW5zLXNlcmlmXCIsIHRoaXMuZm9udFdlaWdodCA9IGEgfHwgXCJub3JtYWxcIiwgdGhpcy5yYWRpdXMgPSBpIHx8IDg7XG4gICAgICB2YXIgbiA9IHRoaXMuc2l6ZSA9IHRoaXMuZm9udFNpemUgKyAyICogdGhpcy5idWZmZXI7XG4gICAgICB0aGlzLmNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIiksIHRoaXMuY2FudmFzLndpZHRoID0gdGhpcy5jYW52YXMuaGVpZ2h0ID0gbiwgdGhpcy5jdHggPSB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIiksIHRoaXMuY3R4LmZvbnQgPSB0aGlzLmZvbnRXZWlnaHQgKyBcIiBcIiArIHRoaXMuZm9udFNpemUgKyBcInB4IFwiICsgdGhpcy5mb250RmFtaWx5LCB0aGlzLmN0eC50ZXh0QmFzZWxpbmUgPSBcIm1pZGRsZVwiLCB0aGlzLmN0eC5maWxsU3R5bGUgPSBcImJsYWNrXCIsIHRoaXMuZ3JpZE91dGVyID0gbmV3IEZsb2F0NjRBcnJheShuICogbiksIHRoaXMuZ3JpZElubmVyID0gbmV3IEZsb2F0NjRBcnJheShuICogbiksIHRoaXMuZiA9IG5ldyBGbG9hdDY0QXJyYXkobiksIHRoaXMuZCA9IG5ldyBGbG9hdDY0QXJyYXkobiksIHRoaXMueiA9IG5ldyBGbG9hdDY0QXJyYXkobiArIDEpLCB0aGlzLnYgPSBuZXcgSW50MTZBcnJheShuKSwgdGhpcy5taWRkbGUgPSBNYXRoLnJvdW5kKG4gLyAyICogKG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZihcIkdlY2tvL1wiKSA+PSAwID8gMS4yIDogMSkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGcodCwgZSwgaSwgbywgciwgYSwgbikge1xuICAgICAgZm9yICh2YXIgcyA9IDA7IHMgPCBlOyBzKyspIHtcbiAgICAgICAgZm9yICh2YXIgbCA9IDA7IGwgPCBpOyBsKyspIHtcbiAgICAgICAgICBvW2xdID0gdFtsICogZSArIHNdO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2KG8sIHIsIGEsIG4sIGkpLCBsID0gMDsgbCA8IGk7IGwrKykge1xuICAgICAgICAgIHRbbCAqIGUgKyBzXSA9IHJbbF07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChsID0gMDsgbCA8IGk7IGwrKykge1xuICAgICAgICBmb3IgKHMgPSAwOyBzIDwgZTsgcysrKSB7XG4gICAgICAgICAgb1tzXSA9IHRbbCAqIGUgKyBzXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodihvLCByLCBhLCBuLCBlKSwgcyA9IDA7IHMgPCBlOyBzKyspIHtcbiAgICAgICAgICB0W2wgKiBlICsgc10gPSBNYXRoLnNxcnQocltzXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2KHQsIGUsIGksIG8sIHIpIHtcbiAgICAgIGlbMF0gPSAwLCBvWzBdID0gLWYsIG9bMV0gPSArZjtcblxuICAgICAgZm9yICh2YXIgYSA9IDEsIG4gPSAwOyBhIDwgcjsgYSsrKSB7XG4gICAgICAgIGZvciAodmFyIHMgPSAodFthXSArIGEgKiBhIC0gKHRbaVtuXV0gKyBpW25dICogaVtuXSkpIC8gKDIgKiBhIC0gMiAqIGlbbl0pOyBzIDw9IG9bbl07KSB7XG4gICAgICAgICAgbi0tLCBzID0gKHRbYV0gKyBhICogYSAtICh0W2lbbl1dICsgaVtuXSAqIGlbbl0pKSAvICgyICogYSAtIDIgKiBpW25dKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlbKytuXSA9IGEsIG9bbl0gPSBzLCBvW24gKyAxXSA9ICtmO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGEgPSAwLCBuID0gMDsgYSA8IHI7IGErKykge1xuICAgICAgICBmb3IgKDsgb1tuICsgMV0gPCBhOykge1xuICAgICAgICAgIG4rKztcbiAgICAgICAgfVxuXG4gICAgICAgIGVbYV0gPSAoYSAtIGlbbl0pICogKGEgLSBpW25dKSArIHRbaVtuXV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgbS5wcm90b3R5cGUuZHJhdyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0aGlzLmN0eC5jbGVhclJlY3QoMCwgMCwgdGhpcy5zaXplLCB0aGlzLnNpemUpLCB0aGlzLmN0eC5maWxsVGV4dCh0LCB0aGlzLmJ1ZmZlciwgdGhpcy5taWRkbGUpO1xuXG4gICAgICBmb3IgKHZhciBlID0gdGhpcy5jdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHRoaXMuc2l6ZSwgdGhpcy5zaXplKSwgaSA9IG5ldyBVaW50OENsYW1wZWRBcnJheSh0aGlzLnNpemUgKiB0aGlzLnNpemUpLCBvID0gMDsgbyA8IHRoaXMuc2l6ZSAqIHRoaXMuc2l6ZTsgbysrKSB7XG4gICAgICAgIHZhciByID0gZS5kYXRhWzQgKiBvICsgM10gLyAyNTU7XG4gICAgICAgIHRoaXMuZ3JpZE91dGVyW29dID0gMSA9PT0gciA/IDAgOiAwID09PSByID8gZiA6IE1hdGgucG93KE1hdGgubWF4KDAsIC41IC0gciksIDIpLCB0aGlzLmdyaWRJbm5lcltvXSA9IDEgPT09IHIgPyBmIDogMCA9PT0gciA/IDAgOiBNYXRoLnBvdyhNYXRoLm1heCgwLCByIC0gLjUpLCAyKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChnKHRoaXMuZ3JpZE91dGVyLCB0aGlzLnNpemUsIHRoaXMuc2l6ZSwgdGhpcy5mLCB0aGlzLmQsIHRoaXMudiwgdGhpcy56KSwgZyh0aGlzLmdyaWRJbm5lciwgdGhpcy5zaXplLCB0aGlzLnNpemUsIHRoaXMuZiwgdGhpcy5kLCB0aGlzLnYsIHRoaXMueiksIG8gPSAwOyBvIDwgdGhpcy5zaXplICogdGhpcy5zaXplOyBvKyspIHtcbiAgICAgICAgaVtvXSA9IE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCgyNTUgLSAyNTUgKiAoKHRoaXMuZ3JpZE91dGVyW29dIC0gdGhpcy5ncmlkSW5uZXJbb10pIC8gdGhpcy5yYWRpdXMgKyB0aGlzLmN1dG9mZikpKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpO1xuICAgIH0sIGQuZGVmYXVsdCA9IF87XG5cbiAgICB2YXIgeSA9IGZ1bmN0aW9uIHkodCwgZSkge1xuICAgICAgdGhpcy5yZXF1ZXN0TWFuYWdlciA9IHQsIHRoaXMubG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5ID0gZSwgdGhpcy5lbnRyaWVzID0ge307XG4gICAgfTtcblxuICAgIHkucHJvdG90eXBlLnNldFVSTCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0aGlzLnVybCA9IHQ7XG4gICAgfSwgeS5wcm90b3R5cGUuZ2V0R2x5cGhzID0gZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgIHZhciBvID0gdGhpcyxcbiAgICAgICAgICByID0gW107XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBmb3IgKHZhciBuID0gMCwgcyA9IGVbYV07IG4gPCBzLmxlbmd0aDsgbiArPSAxKSB7XG4gICAgICAgICAgci5wdXNoKHtcbiAgICAgICAgICAgIHN0YWNrOiBhLFxuICAgICAgICAgICAgaWQ6IHNbbl1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0LmFzeW5jQWxsKHIsIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHZhciBpID0gdC5zdGFjayxcbiAgICAgICAgICAgIHIgPSB0LmlkLFxuICAgICAgICAgICAgYSA9IG8uZW50cmllc1tpXTtcbiAgICAgICAgYSB8fCAoYSA9IG8uZW50cmllc1tpXSA9IHtcbiAgICAgICAgICBnbHlwaHM6IHt9LFxuICAgICAgICAgIHJlcXVlc3RzOiB7fSxcbiAgICAgICAgICByYW5nZXM6IHt9XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgbiA9IGEuZ2x5cGhzW3JdO1xuXG4gICAgICAgIGlmICh2b2lkIDAgPT09IG4pIHtcbiAgICAgICAgICBpZiAobiA9IG8uX3RpbnlTREYoYSwgaSwgcikpIHJldHVybiBhLmdseXBoc1tyXSA9IG4sIHZvaWQgZShudWxsLCB7XG4gICAgICAgICAgICBzdGFjazogaSxcbiAgICAgICAgICAgIGlkOiByLFxuICAgICAgICAgICAgZ2x5cGg6IG5cbiAgICAgICAgICB9KTtcbiAgICAgICAgICB2YXIgcyA9IE1hdGguZmxvb3IociAvIDI1Nik7XG4gICAgICAgICAgaWYgKDI1NiAqIHMgPiA2NTUzNSkgZShuZXcgRXJyb3IoXCJnbHlwaHMgPiA2NTUzNSBub3Qgc3VwcG9ydGVkXCIpKTtlbHNlIGlmIChhLnJhbmdlc1tzXSkgZShudWxsLCB7XG4gICAgICAgICAgICBzdGFjazogaSxcbiAgICAgICAgICAgIGlkOiByLFxuICAgICAgICAgICAgZ2x5cGg6IG5cbiAgICAgICAgICB9KTtlbHNlIHtcbiAgICAgICAgICAgIHZhciBsID0gYS5yZXF1ZXN0c1tzXTtcbiAgICAgICAgICAgIGwgfHwgKGwgPSBhLnJlcXVlc3RzW3NdID0gW10sIHkubG9hZEdseXBoUmFuZ2UoaSwgcywgby51cmwsIG8ucmVxdWVzdE1hbmFnZXIsIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBlKSB7XG4gICAgICAgICAgICAgICAgICBvLl9kb2VzQ2hhclN1cHBvcnRMb2NhbEdseXBoKCtpKSB8fCAoYS5nbHlwaHNbK2ldID0gZVsraV0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGEucmFuZ2VzW3NdID0gITA7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBmb3IgKHZhciByID0gMCwgbiA9IGw7IHIgPCBuLmxlbmd0aDsgciArPSAxKSB7XG4gICAgICAgICAgICAgICAgKDAsIG5bcl0pKHQsIGUpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZGVsZXRlIGEucmVxdWVzdHNbc107XG4gICAgICAgICAgICB9KSksIGwucHVzaChmdW5jdGlvbiAodCwgbykge1xuICAgICAgICAgICAgICB0ID8gZSh0KSA6IG8gJiYgZShudWxsLCB7XG4gICAgICAgICAgICAgICAgc3RhY2s6IGksXG4gICAgICAgICAgICAgICAgaWQ6IHIsXG4gICAgICAgICAgICAgICAgZ2x5cGg6IG9bcl0gfHwgbnVsbFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGUobnVsbCwge1xuICAgICAgICAgIHN0YWNrOiBpLFxuICAgICAgICAgIGlkOiByLFxuICAgICAgICAgIGdseXBoOiBuXG4gICAgICAgIH0pO1xuICAgICAgfSwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgaWYgKHQpIGkodCk7ZWxzZSBpZiAoZSkge1xuICAgICAgICAgIGZvciAodmFyIG8gPSB7fSwgciA9IDAsIGEgPSBlOyByIDwgYS5sZW5ndGg7IHIgKz0gMSkge1xuICAgICAgICAgICAgdmFyIG4gPSBhW3JdLFxuICAgICAgICAgICAgICAgIHMgPSBuLnN0YWNrLFxuICAgICAgICAgICAgICAgIGwgPSBuLmlkLFxuICAgICAgICAgICAgICAgIGMgPSBuLmdseXBoO1xuICAgICAgICAgICAgKG9bc10gfHwgKG9bc10gPSB7fSkpW2xdID0gYyAmJiB7XG4gICAgICAgICAgICAgIGlkOiBjLmlkLFxuICAgICAgICAgICAgICBiaXRtYXA6IGMuYml0bWFwLmNsb25lKCksXG4gICAgICAgICAgICAgIG1ldHJpY3M6IGMubWV0cmljc1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpKG51bGwsIG8pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LCB5LnByb3RvdHlwZS5fZG9lc0NoYXJTdXBwb3J0TG9jYWxHbHlwaCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gISF0aGlzLmxvY2FsSWRlb2dyYXBoRm9udEZhbWlseSAmJiAodC5pc0NoYXJbXCJDSksgVW5pZmllZCBJZGVvZ3JhcGhzXCJdKGUpIHx8IHQuaXNDaGFyW1wiSGFuZ3VsIFN5bGxhYmxlc1wiXShlKSB8fCB0LmlzQ2hhci5IaXJhZ2FuYShlKSB8fCB0LmlzQ2hhci5LYXRha2FuYShlKSk7XG4gICAgfSwgeS5wcm90b3R5cGUuX3RpbnlTREYgPSBmdW5jdGlvbiAoZSwgaSwgbykge1xuICAgICAgdmFyIHIgPSB0aGlzLmxvY2FsSWRlb2dyYXBoRm9udEZhbWlseTtcblxuICAgICAgaWYgKHIgJiYgdGhpcy5fZG9lc0NoYXJTdXBwb3J0TG9jYWxHbHlwaChvKSkge1xuICAgICAgICB2YXIgYSA9IGUudGlueVNERjtcblxuICAgICAgICBpZiAoIWEpIHtcbiAgICAgICAgICB2YXIgbiA9IFwiNDAwXCI7XG4gICAgICAgICAgL2JvbGQvaS50ZXN0KGkpID8gbiA9IFwiOTAwXCIgOiAvbWVkaXVtL2kudGVzdChpKSA/IG4gPSBcIjUwMFwiIDogL2xpZ2h0L2kudGVzdChpKSAmJiAobiA9IFwiMjAwXCIpLCBhID0gZS50aW55U0RGID0gbmV3IHkuVGlueVNERigyNCwgMywgOCwgLjI1LCByLCBuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaWQ6IG8sXG4gICAgICAgICAgYml0bWFwOiBuZXcgdC5BbHBoYUltYWdlKHtcbiAgICAgICAgICAgIHdpZHRoOiAzMCxcbiAgICAgICAgICAgIGhlaWdodDogMzBcbiAgICAgICAgICB9LCBhLmRyYXcoU3RyaW5nLmZyb21DaGFyQ29kZShvKSkpLFxuICAgICAgICAgIG1ldHJpY3M6IHtcbiAgICAgICAgICAgIHdpZHRoOiAyNCxcbiAgICAgICAgICAgIGhlaWdodDogMjQsXG4gICAgICAgICAgICBsZWZ0OiAwLFxuICAgICAgICAgICAgdG9wOiAtOCxcbiAgICAgICAgICAgIGFkdmFuY2U6IDI0XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sIHkubG9hZEdseXBoUmFuZ2UgPSBmdW5jdGlvbiAoZSwgaSwgbywgciwgYSkge1xuICAgICAgdmFyIG4gPSAyNTYgKiBpLFxuICAgICAgICAgIHMgPSBuICsgMjU1LFxuICAgICAgICAgIGwgPSByLnRyYW5zZm9ybVJlcXVlc3Qoci5ub3JtYWxpemVHbHlwaHNVUkwobykucmVwbGFjZShcIntmb250c3RhY2t9XCIsIGUpLnJlcGxhY2UoXCJ7cmFuZ2V9XCIsIG4gKyBcIi1cIiArIHMpLCB0LlJlc291cmNlVHlwZS5HbHlwaHMpO1xuICAgICAgdC5nZXRBcnJheUJ1ZmZlcihsLCBmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgICBpZiAoZSkgYShlKTtlbHNlIGlmIChpKSB7XG4gICAgICAgICAgZm9yICh2YXIgbyA9IHt9LCByID0gMCwgbiA9IHQucGFyc2VHbHlwaFBCRihpKTsgciA8IG4ubGVuZ3RoOyByICs9IDEpIHtcbiAgICAgICAgICAgIHZhciBzID0gbltyXTtcbiAgICAgICAgICAgIG9bcy5pZF0gPSBzO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGEobnVsbCwgbyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sIHkuVGlueVNERiA9IGQ7XG5cbiAgICB2YXIgeCA9IGZ1bmN0aW9uIHgoKSB7XG4gICAgICB0aGlzLnNwZWNpZmljYXRpb24gPSB0LnN0eWxlU3BlYy5saWdodC5wb3NpdGlvbjtcbiAgICB9O1xuXG4gICAgeC5wcm90b3R5cGUucG9zc2libHlFdmFsdWF0ZSA9IGZ1bmN0aW9uIChlLCBpKSB7XG4gICAgICByZXR1cm4gdC5zcGhlcmljYWxUb0NhcnRlc2lhbihlLmV4cHJlc3Npb24uZXZhbHVhdGUoaSkpO1xuICAgIH0sIHgucHJvdG90eXBlLmludGVycG9sYXRlID0gZnVuY3Rpb24gKGUsIGksIG8pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IHQubnVtYmVyKGUueCwgaS54LCBvKSxcbiAgICAgICAgeTogdC5udW1iZXIoZS55LCBpLnksIG8pLFxuICAgICAgICB6OiB0Lm51bWJlcihlLnosIGkueiwgbylcbiAgICAgIH07XG4gICAgfTtcblxuICAgIHZhciBiID0gbmV3IHQuUHJvcGVydGllcyh7XG4gICAgICBhbmNob3I6IG5ldyB0LkRhdGFDb25zdGFudFByb3BlcnR5KHQuc3R5bGVTcGVjLmxpZ2h0LmFuY2hvciksXG4gICAgICBwb3NpdGlvbjogbmV3IHgoKSxcbiAgICAgIGNvbG9yOiBuZXcgdC5EYXRhQ29uc3RhbnRQcm9wZXJ0eSh0LnN0eWxlU3BlYy5saWdodC5jb2xvciksXG4gICAgICBpbnRlbnNpdHk6IG5ldyB0LkRhdGFDb25zdGFudFByb3BlcnR5KHQuc3R5bGVTcGVjLmxpZ2h0LmludGVuc2l0eSlcbiAgICB9KSxcbiAgICAgICAgdyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBmdW5jdGlvbiBpKGkpIHtcbiAgICAgICAgZS5jYWxsKHRoaXMpLCB0aGlzLl90cmFuc2l0aW9uYWJsZSA9IG5ldyB0LlRyYW5zaXRpb25hYmxlKGIpLCB0aGlzLnNldExpZ2h0KGkpLCB0aGlzLl90cmFuc2l0aW9uaW5nID0gdGhpcy5fdHJhbnNpdGlvbmFibGUudW50cmFuc2l0aW9uZWQoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGUgJiYgKGkuX19wcm90b19fID0gZSksIChpLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoZSAmJiBlLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gaSwgaS5wcm90b3R5cGUuZ2V0TGlnaHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90cmFuc2l0aW9uYWJsZS5zZXJpYWxpemUoKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnNldExpZ2h0ID0gZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgICAgaWYgKHZvaWQgMCA9PT0gaSAmJiAoaSA9IHt9KSwgIXRoaXMuX3ZhbGlkYXRlKHQudmFsaWRhdGVMaWdodCwgZSwgaSkpIGZvciAodmFyIG8gaW4gZSkge1xuICAgICAgICAgIHZhciByID0gZVtvXTtcbiAgICAgICAgICB0LmVuZHNXaXRoKG8sIFwiLXRyYW5zaXRpb25cIikgPyB0aGlzLl90cmFuc2l0aW9uYWJsZS5zZXRUcmFuc2l0aW9uKG8uc2xpY2UoMCwgLVwiLXRyYW5zaXRpb25cIi5sZW5ndGgpLCByKSA6IHRoaXMuX3RyYW5zaXRpb25hYmxlLnNldFZhbHVlKG8sIHIpO1xuICAgICAgICB9XG4gICAgICB9LCBpLnByb3RvdHlwZS51cGRhdGVUcmFuc2l0aW9ucyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHRoaXMuX3RyYW5zaXRpb25pbmcgPSB0aGlzLl90cmFuc2l0aW9uYWJsZS50cmFuc2l0aW9uZWQodCwgdGhpcy5fdHJhbnNpdGlvbmluZyk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5oYXNUcmFuc2l0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNpdGlvbmluZy5oYXNUcmFuc2l0aW9uKCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5yZWNhbGN1bGF0ZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHRoaXMucHJvcGVydGllcyA9IHRoaXMuX3RyYW5zaXRpb25pbmcucG9zc2libHlFdmFsdWF0ZSh0KTtcbiAgICAgIH0sIGkucHJvdG90eXBlLl92YWxpZGF0ZSA9IGZ1bmN0aW9uIChlLCBpLCBvKSB7XG4gICAgICAgIHJldHVybiAoIW8gfHwgITEgIT09IG8udmFsaWRhdGUpICYmIHQuZW1pdFZhbGlkYXRpb25FcnJvcnModGhpcywgZS5jYWxsKHQudmFsaWRhdGVTdHlsZSwgdC5leHRlbmQoe1xuICAgICAgICAgIHZhbHVlOiBpLFxuICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICBnbHlwaHM6ICEwLFxuICAgICAgICAgICAgc3ByaXRlOiAhMFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3R5bGVTcGVjOiB0LnN0eWxlU3BlY1xuICAgICAgICB9KSkpO1xuICAgICAgfSwgaTtcbiAgICB9KHQuRXZlbnRlZCksXG4gICAgICAgIFQgPSBmdW5jdGlvbiBUKHQsIGUpIHtcbiAgICAgIHRoaXMud2lkdGggPSB0LCB0aGlzLmhlaWdodCA9IGUsIHRoaXMubmV4dFJvdyA9IDAsIHRoaXMuZGF0YSA9IG5ldyBVaW50OEFycmF5KHRoaXMud2lkdGggKiB0aGlzLmhlaWdodCksIHRoaXMuZGFzaEVudHJ5ID0ge307XG4gICAgfTtcblxuICAgIFQucHJvdG90eXBlLmdldERhc2ggPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgdmFyIGkgPSB0LmpvaW4oXCIsXCIpICsgU3RyaW5nKGUpO1xuICAgICAgcmV0dXJuIHRoaXMuZGFzaEVudHJ5W2ldIHx8ICh0aGlzLmRhc2hFbnRyeVtpXSA9IHRoaXMuYWRkRGFzaCh0LCBlKSksIHRoaXMuZGFzaEVudHJ5W2ldO1xuICAgIH0sIFQucHJvdG90eXBlLmdldERhc2hSYW5nZXMgPSBmdW5jdGlvbiAodCwgZSwgaSkge1xuICAgICAgdmFyIG8gPSBbXSxcbiAgICAgICAgICByID0gdC5sZW5ndGggJSAyID09IDEgPyAtdFt0Lmxlbmd0aCAtIDFdICogaSA6IDAsXG4gICAgICAgICAgYSA9IHRbMF0gKiBpLFxuICAgICAgICAgIG4gPSAhMDtcbiAgICAgIG8ucHVzaCh7XG4gICAgICAgIGxlZnQ6IHIsXG4gICAgICAgIHJpZ2h0OiBhLFxuICAgICAgICBpc0Rhc2g6IG4sXG4gICAgICAgIHplcm9MZW5ndGg6IDAgPT09IHRbMF1cbiAgICAgIH0pO1xuXG4gICAgICBmb3IgKHZhciBzID0gdFswXSwgbCA9IDE7IGwgPCB0Lmxlbmd0aDsgbCsrKSB7XG4gICAgICAgIHZhciBjID0gdFtsXTtcbiAgICAgICAgby5wdXNoKHtcbiAgICAgICAgICBsZWZ0OiByID0gcyAqIGksXG4gICAgICAgICAgcmlnaHQ6IGEgPSAocyArPSBjKSAqIGksXG4gICAgICAgICAgaXNEYXNoOiBuID0gIW4sXG4gICAgICAgICAgemVyb0xlbmd0aDogMCA9PT0gY1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG87XG4gICAgfSwgVC5wcm90b3R5cGUuYWRkUm91bmREYXNoID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcbiAgICAgIGZvciAodmFyIG8gPSBlIC8gMiwgciA9IC1pOyByIDw9IGk7IHIrKykge1xuICAgICAgICBmb3IgKHZhciBhID0gdGhpcy53aWR0aCAqICh0aGlzLm5leHRSb3cgKyBpICsgciksIG4gPSAwLCBzID0gdFtuXSwgbCA9IDA7IGwgPCB0aGlzLndpZHRoOyBsKyspIHtcbiAgICAgICAgICBsIC8gcy5yaWdodCA+IDEgJiYgKHMgPSB0Wysrbl0pO1xuICAgICAgICAgIHZhciBjID0gTWF0aC5hYnMobCAtIHMubGVmdCksXG4gICAgICAgICAgICAgIHUgPSBNYXRoLmFicyhsIC0gcy5yaWdodCksXG4gICAgICAgICAgICAgIGggPSBNYXRoLm1pbihjLCB1KSxcbiAgICAgICAgICAgICAgcCA9IHZvaWQgMCxcbiAgICAgICAgICAgICAgZCA9IHIgLyBpICogKG8gKyAxKTtcblxuICAgICAgICAgIGlmIChzLmlzRGFzaCkge1xuICAgICAgICAgICAgdmFyIF8gPSBvIC0gTWF0aC5hYnMoZCk7XG5cbiAgICAgICAgICAgIHAgPSBNYXRoLnNxcnQoaCAqIGggKyBfICogXyk7XG4gICAgICAgICAgfSBlbHNlIHAgPSBvIC0gTWF0aC5zcXJ0KGggKiBoICsgZCAqIGQpO1xuXG4gICAgICAgICAgdGhpcy5kYXRhW2EgKyBsXSA9IE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgcCArIDEyOCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgVC5wcm90b3R5cGUuYWRkUmVndWxhckRhc2ggPSBmdW5jdGlvbiAodCkge1xuICAgICAgZm9yICh2YXIgZSA9IHQubGVuZ3RoIC0gMTsgZSA+PSAwOyAtLWUpIHtcbiAgICAgICAgdmFyIGkgPSB0W2VdLFxuICAgICAgICAgICAgbyA9IHRbZSArIDFdO1xuICAgICAgICBpLnplcm9MZW5ndGggPyB0LnNwbGljZShlLCAxKSA6IG8gJiYgby5pc0Rhc2ggPT09IGkuaXNEYXNoICYmIChvLmxlZnQgPSBpLmxlZnQsIHQuc3BsaWNlKGUsIDEpKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHIgPSB0WzBdLFxuICAgICAgICAgIGEgPSB0W3QubGVuZ3RoIC0gMV07XG4gICAgICByLmlzRGFzaCA9PT0gYS5pc0Rhc2ggJiYgKHIubGVmdCA9IGEubGVmdCAtIHRoaXMud2lkdGgsIGEucmlnaHQgPSByLnJpZ2h0ICsgdGhpcy53aWR0aCk7XG5cbiAgICAgIGZvciAodmFyIG4gPSB0aGlzLndpZHRoICogdGhpcy5uZXh0Um93LCBzID0gMCwgbCA9IHRbc10sIGMgPSAwOyBjIDwgdGhpcy53aWR0aDsgYysrKSB7XG4gICAgICAgIGMgLyBsLnJpZ2h0ID4gMSAmJiAobCA9IHRbKytzXSk7XG4gICAgICAgIHZhciB1ID0gTWF0aC5hYnMoYyAtIGwubGVmdCksXG4gICAgICAgICAgICBoID0gTWF0aC5hYnMoYyAtIGwucmlnaHQpLFxuICAgICAgICAgICAgcCA9IE1hdGgubWluKHUsIGgpO1xuICAgICAgICB0aGlzLmRhdGFbbiArIGNdID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCAobC5pc0Rhc2ggPyBwIDogLXApICsgMTI4KSk7XG4gICAgICB9XG4gICAgfSwgVC5wcm90b3R5cGUuYWRkRGFzaCA9IGZ1bmN0aW9uIChlLCBpKSB7XG4gICAgICB2YXIgbyA9IGkgPyA3IDogMCxcbiAgICAgICAgICByID0gMiAqIG8gKyAxO1xuICAgICAgaWYgKHRoaXMubmV4dFJvdyArIHIgPiB0aGlzLmhlaWdodCkgcmV0dXJuIHQud2Fybk9uY2UoXCJMaW5lQXRsYXMgb3V0IG9mIHNwYWNlXCIpLCBudWxsO1xuXG4gICAgICBmb3IgKHZhciBhID0gMCwgbiA9IDA7IG4gPCBlLmxlbmd0aDsgbisrKSB7XG4gICAgICAgIGEgKz0gZVtuXTtcbiAgICAgIH1cblxuICAgICAgaWYgKDAgIT09IGEpIHtcbiAgICAgICAgdmFyIHMgPSB0aGlzLndpZHRoIC8gYSxcbiAgICAgICAgICAgIGwgPSB0aGlzLmdldERhc2hSYW5nZXMoZSwgdGhpcy53aWR0aCwgcyk7XG4gICAgICAgIGkgPyB0aGlzLmFkZFJvdW5kRGFzaChsLCBzLCBvKSA6IHRoaXMuYWRkUmVndWxhckRhc2gobCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBjID0ge1xuICAgICAgICB5OiAodGhpcy5uZXh0Um93ICsgbyArIC41KSAvIHRoaXMuaGVpZ2h0LFxuICAgICAgICBoZWlnaHQ6IDIgKiBvIC8gdGhpcy5oZWlnaHQsXG4gICAgICAgIHdpZHRoOiBhXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHRoaXMubmV4dFJvdyArPSByLCB0aGlzLmRpcnR5ID0gITAsIGM7XG4gICAgfSwgVC5wcm90b3R5cGUuYmluZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2YXIgZSA9IHQuZ2w7XG4gICAgICB0aGlzLnRleHR1cmUgPyAoZS5iaW5kVGV4dHVyZShlLlRFWFRVUkVfMkQsIHRoaXMudGV4dHVyZSksIHRoaXMuZGlydHkgJiYgKHRoaXMuZGlydHkgPSAhMSwgZS50ZXhTdWJJbWFnZTJEKGUuVEVYVFVSRV8yRCwgMCwgMCwgMCwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQsIGUuQUxQSEEsIGUuVU5TSUdORURfQllURSwgdGhpcy5kYXRhKSkpIDogKHRoaXMudGV4dHVyZSA9IGUuY3JlYXRlVGV4dHVyZSgpLCBlLmJpbmRUZXh0dXJlKGUuVEVYVFVSRV8yRCwgdGhpcy50ZXh0dXJlKSwgZS50ZXhQYXJhbWV0ZXJpKGUuVEVYVFVSRV8yRCwgZS5URVhUVVJFX1dSQVBfUywgZS5SRVBFQVQpLCBlLnRleFBhcmFtZXRlcmkoZS5URVhUVVJFXzJELCBlLlRFWFRVUkVfV1JBUF9ULCBlLlJFUEVBVCksIGUudGV4UGFyYW1ldGVyaShlLlRFWFRVUkVfMkQsIGUuVEVYVFVSRV9NSU5fRklMVEVSLCBlLkxJTkVBUiksIGUudGV4UGFyYW1ldGVyaShlLlRFWFRVUkVfMkQsIGUuVEVYVFVSRV9NQUdfRklMVEVSLCBlLkxJTkVBUiksIGUudGV4SW1hZ2UyRChlLlRFWFRVUkVfMkQsIDAsIGUuQUxQSEEsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCAwLCBlLkFMUEhBLCBlLlVOU0lHTkVEX0JZVEUsIHRoaXMuZGF0YSkpO1xuICAgIH07XG5cbiAgICB2YXIgRSA9IGZ1bmN0aW9uIGUoaSwgbykge1xuICAgICAgdGhpcy53b3JrZXJQb29sID0gaSwgdGhpcy5hY3RvcnMgPSBbXSwgdGhpcy5jdXJyZW50QWN0b3IgPSAwLCB0aGlzLmlkID0gdC51bmlxdWVJZCgpO1xuXG4gICAgICBmb3IgKHZhciByID0gdGhpcy53b3JrZXJQb29sLmFjcXVpcmUodGhpcy5pZCksIGEgPSAwOyBhIDwgci5sZW5ndGg7IGErKykge1xuICAgICAgICB2YXIgbiA9IG5ldyBlLkFjdG9yKHJbYV0sIG8sIHRoaXMuaWQpO1xuICAgICAgICBuLm5hbWUgPSBcIldvcmtlciBcIiArIGEsIHRoaXMuYWN0b3JzLnB1c2gobik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIEkoZSwgaSwgbykge1xuICAgICAgdmFyIHIgPSBmdW5jdGlvbiByKF9yMiwgYSkge1xuICAgICAgICBpZiAoX3IyKSByZXR1cm4gbyhfcjIpO1xuXG4gICAgICAgIGlmIChhKSB7XG4gICAgICAgICAgdmFyIG4gPSB0LnBpY2sodC5leHRlbmQoYSwgZSksIFtcInRpbGVzXCIsIFwibWluem9vbVwiLCBcIm1heHpvb21cIiwgXCJhdHRyaWJ1dGlvblwiLCBcIm1hcGJveF9sb2dvXCIsIFwiYm91bmRzXCIsIFwic2NoZW1lXCIsIFwidGlsZVNpemVcIiwgXCJlbmNvZGluZ1wiXSk7XG4gICAgICAgICAgYS52ZWN0b3JfbGF5ZXJzICYmIChuLnZlY3RvckxheWVycyA9IGEudmVjdG9yX2xheWVycywgbi52ZWN0b3JMYXllcklkcyA9IG4udmVjdG9yTGF5ZXJzLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgcmV0dXJuIHQuaWQ7XG4gICAgICAgICAgfSkpLCBuLnRpbGVzID0gaS5jYW5vbmljYWxpemVUaWxlc2V0KG4sIGUudXJsKSwgbyhudWxsLCBuKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGUudXJsID8gdC5nZXRKU09OKGkudHJhbnNmb3JtUmVxdWVzdChpLm5vcm1hbGl6ZVNvdXJjZVVSTChlLnVybCksIHQuUmVzb3VyY2VUeXBlLlNvdXJjZSksIHIpIDogdC5icm93c2VyLmZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHIobnVsbCwgZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBFLnByb3RvdHlwZS5icm9hZGNhc3QgPSBmdW5jdGlvbiAoZSwgaSwgbykge1xuICAgICAgdC5hc3luY0FsbCh0aGlzLmFjdG9ycywgZnVuY3Rpb24gKHQsIG8pIHtcbiAgICAgICAgdC5zZW5kKGUsIGksIG8pO1xuICAgICAgfSwgbyA9IG8gfHwgZnVuY3Rpb24gKCkge30pO1xuICAgIH0sIEUucHJvdG90eXBlLmdldEFjdG9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY3VycmVudEFjdG9yID0gKHRoaXMuY3VycmVudEFjdG9yICsgMSkgJSB0aGlzLmFjdG9ycy5sZW5ndGgsIHRoaXMuYWN0b3JzW3RoaXMuY3VycmVudEFjdG9yXTtcbiAgICB9LCBFLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLmFjdG9ycy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHQucmVtb3ZlKCk7XG4gICAgICB9KSwgdGhpcy5hY3RvcnMgPSBbXSwgdGhpcy53b3JrZXJQb29sLnJlbGVhc2UodGhpcy5pZCk7XG4gICAgfSwgRS5BY3RvciA9IHQuQWN0b3I7XG5cbiAgICB2YXIgUCA9IGZ1bmN0aW9uIFAoZSwgaSwgbykge1xuICAgICAgdGhpcy5ib3VuZHMgPSB0LkxuZ0xhdEJvdW5kcy5jb252ZXJ0KHRoaXMudmFsaWRhdGVCb3VuZHMoZSkpLCB0aGlzLm1pbnpvb20gPSBpIHx8IDAsIHRoaXMubWF4em9vbSA9IG8gfHwgMjQ7XG4gICAgfTtcblxuICAgIFAucHJvdG90eXBlLnZhbGlkYXRlQm91bmRzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHQpICYmIDQgPT09IHQubGVuZ3RoID8gW01hdGgubWF4KC0xODAsIHRbMF0pLCBNYXRoLm1heCgtOTAsIHRbMV0pLCBNYXRoLm1pbigxODAsIHRbMl0pLCBNYXRoLm1pbig5MCwgdFszXSldIDogWy0xODAsIC05MCwgMTgwLCA5MF07XG4gICAgfSwgUC5wcm90b3R5cGUuY29udGFpbnMgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIGkgPSBNYXRoLnBvdygyLCBlLnopLFxuICAgICAgICAgIG8gPSBNYXRoLmZsb29yKHQubWVyY2F0b3JYZnJvbUxuZyh0aGlzLmJvdW5kcy5nZXRXZXN0KCkpICogaSksXG4gICAgICAgICAgciA9IE1hdGguZmxvb3IodC5tZXJjYXRvcllmcm9tTGF0KHRoaXMuYm91bmRzLmdldE5vcnRoKCkpICogaSksXG4gICAgICAgICAgYSA9IE1hdGguY2VpbCh0Lm1lcmNhdG9yWGZyb21MbmcodGhpcy5ib3VuZHMuZ2V0RWFzdCgpKSAqIGkpLFxuICAgICAgICAgIG4gPSBNYXRoLmNlaWwodC5tZXJjYXRvcllmcm9tTGF0KHRoaXMuYm91bmRzLmdldFNvdXRoKCkpICogaSk7XG4gICAgICByZXR1cm4gZS54ID49IG8gJiYgZS54IDwgYSAmJiBlLnkgPj0gciAmJiBlLnkgPCBuO1xuICAgIH07XG5cbiAgICB2YXIgUyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBmdW5jdGlvbiBpKGksIG8sIHIsIGEpIHtcbiAgICAgICAgaWYgKGUuY2FsbCh0aGlzKSwgdGhpcy5pZCA9IGksIHRoaXMuZGlzcGF0Y2hlciA9IHIsIHRoaXMudHlwZSA9IFwidmVjdG9yXCIsIHRoaXMubWluem9vbSA9IDAsIHRoaXMubWF4em9vbSA9IDIyLCB0aGlzLnNjaGVtZSA9IFwieHl6XCIsIHRoaXMudGlsZVNpemUgPSA1MTIsIHRoaXMucmVwYXJzZU92ZXJzY2FsZWQgPSAhMCwgdGhpcy5pc1RpbGVDbGlwcGVkID0gITAsIHRoaXMuX2xvYWRlZCA9ICExLCB0LmV4dGVuZCh0aGlzLCB0LnBpY2sobywgW1widXJsXCIsIFwic2NoZW1lXCIsIFwidGlsZVNpemVcIiwgXCJwcm9tb3RlSWRcIl0pKSwgdGhpcy5fb3B0aW9ucyA9IHQuZXh0ZW5kKHtcbiAgICAgICAgICB0eXBlOiBcInZlY3RvclwiXG4gICAgICAgIH0sIG8pLCB0aGlzLl9jb2xsZWN0UmVzb3VyY2VUaW1pbmcgPSBvLmNvbGxlY3RSZXNvdXJjZVRpbWluZywgNTEyICE9PSB0aGlzLnRpbGVTaXplKSB0aHJvdyBuZXcgRXJyb3IoXCJ2ZWN0b3IgdGlsZSBzb3VyY2VzIG11c3QgaGF2ZSBhIHRpbGVTaXplIG9mIDUxMlwiKTtcbiAgICAgICAgdGhpcy5zZXRFdmVudGVkUGFyZW50KGEpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZSAmJiAoaS5fX3Byb3RvX18gPSBlKSwgKGkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShlICYmIGUucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBpLCBpLnByb3RvdHlwZS5sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZSA9IHRoaXM7XG4gICAgICAgIHRoaXMuX2xvYWRlZCA9ICExLCB0aGlzLmZpcmUobmV3IHQuRXZlbnQoXCJkYXRhbG9hZGluZ1wiLCB7XG4gICAgICAgICAgZGF0YVR5cGU6IFwic291cmNlXCJcbiAgICAgICAgfSkpLCB0aGlzLl90aWxlSlNPTlJlcXVlc3QgPSBJKHRoaXMuX29wdGlvbnMsIHRoaXMubWFwLl9yZXF1ZXN0TWFuYWdlciwgZnVuY3Rpb24gKGksIG8pIHtcbiAgICAgICAgICBlLl90aWxlSlNPTlJlcXVlc3QgPSBudWxsLCBlLl9sb2FkZWQgPSAhMCwgaSA/IGUuZmlyZShuZXcgdC5FcnJvckV2ZW50KGkpKSA6IG8gJiYgKHQuZXh0ZW5kKGUsIG8pLCBvLmJvdW5kcyAmJiAoZS50aWxlQm91bmRzID0gbmV3IFAoby5ib3VuZHMsIGUubWluem9vbSwgZS5tYXh6b29tKSksIHQucG9zdFR1cm5zdGlsZUV2ZW50KG8udGlsZXMsIGUubWFwLl9yZXF1ZXN0TWFuYWdlci5fY3VzdG9tQWNjZXNzVG9rZW4pLCB0LnBvc3RNYXBMb2FkRXZlbnQoby50aWxlcywgZS5tYXAuX2dldE1hcElkKCksIGUubWFwLl9yZXF1ZXN0TWFuYWdlci5fc2t1VG9rZW4sIGUubWFwLl9yZXF1ZXN0TWFuYWdlci5fY3VzdG9tQWNjZXNzVG9rZW4pLCBlLmZpcmUobmV3IHQuRXZlbnQoXCJkYXRhXCIsIHtcbiAgICAgICAgICAgIGRhdGFUeXBlOiBcInNvdXJjZVwiLFxuICAgICAgICAgICAgc291cmNlRGF0YVR5cGU6IFwibWV0YWRhdGFcIlxuICAgICAgICAgIH0pKSwgZS5maXJlKG5ldyB0LkV2ZW50KFwiZGF0YVwiLCB7XG4gICAgICAgICAgICBkYXRhVHlwZTogXCJzb3VyY2VcIixcbiAgICAgICAgICAgIHNvdXJjZURhdGFUeXBlOiBcImNvbnRlbnRcIlxuICAgICAgICAgIH0pKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSwgaS5wcm90b3R5cGUubG9hZGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZGVkO1xuICAgICAgfSwgaS5wcm90b3R5cGUuaGFzVGlsZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiAhdGhpcy50aWxlQm91bmRzIHx8IHRoaXMudGlsZUJvdW5kcy5jb250YWlucyh0LmNhbm9uaWNhbCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5vbkFkZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHRoaXMubWFwID0gdCwgdGhpcy5sb2FkKCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5zZXRTb3VyY2VQcm9wZXJ0eSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHRoaXMuX3RpbGVKU09OUmVxdWVzdCAmJiB0aGlzLl90aWxlSlNPTlJlcXVlc3QuY2FuY2VsKCksIHQoKSwgdGhpcy5tYXAuc3R5bGUuc291cmNlQ2FjaGVzW3RoaXMuaWRdLmNsZWFyVGlsZXMoKSwgdGhpcy5sb2FkKCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5zZXRUaWxlcyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHZhciBlID0gdGhpcztcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0U291cmNlUHJvcGVydHkoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGUuX29wdGlvbnMudGlsZXMgPSB0O1xuICAgICAgICB9KSwgdGhpcztcbiAgICAgIH0sIGkucHJvdG90eXBlLnNldFVybCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHZhciBlID0gdGhpcztcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0U291cmNlUHJvcGVydHkoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGUudXJsID0gdCwgZS5fb3B0aW9ucy51cmwgPSB0O1xuICAgICAgICB9KSwgdGhpcztcbiAgICAgIH0sIGkucHJvdG90eXBlLm9uUmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl90aWxlSlNPTlJlcXVlc3QgJiYgKHRoaXMuX3RpbGVKU09OUmVxdWVzdC5jYW5jZWwoKSwgdGhpcy5fdGlsZUpTT05SZXF1ZXN0ID0gbnVsbCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5zZXJpYWxpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0LmV4dGVuZCh7fSwgdGhpcy5fb3B0aW9ucyk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5sb2FkVGlsZSA9IGZ1bmN0aW9uIChlLCBpKSB7XG4gICAgICAgIHZhciBvID0gdGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLm5vcm1hbGl6ZVRpbGVVUkwoZS50aWxlSUQuY2Fub25pY2FsLnVybCh0aGlzLnRpbGVzLCB0aGlzLnNjaGVtZSkpLFxuICAgICAgICAgICAgciA9IHtcbiAgICAgICAgICByZXF1ZXN0OiB0aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIudHJhbnNmb3JtUmVxdWVzdChvLCB0LlJlc291cmNlVHlwZS5UaWxlKSxcbiAgICAgICAgICB1aWQ6IGUudWlkLFxuICAgICAgICAgIHRpbGVJRDogZS50aWxlSUQsXG4gICAgICAgICAgem9vbTogZS50aWxlSUQub3ZlcnNjYWxlZFosXG4gICAgICAgICAgdGlsZVNpemU6IHRoaXMudGlsZVNpemUgKiBlLnRpbGVJRC5vdmVyc2NhbGVGYWN0b3IoKSxcbiAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgc291cmNlOiB0aGlzLmlkLFxuICAgICAgICAgIHBpeGVsUmF0aW86IHQuYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvLFxuICAgICAgICAgIHNob3dDb2xsaXNpb25Cb3hlczogdGhpcy5tYXAuc2hvd0NvbGxpc2lvbkJveGVzLFxuICAgICAgICAgIHByb21vdGVJZDogdGhpcy5wcm9tb3RlSWRcbiAgICAgICAgfTtcblxuICAgICAgICBmdW5jdGlvbiBhKG8sIHIpIHtcbiAgICAgICAgICByZXR1cm4gZGVsZXRlIGUucmVxdWVzdCwgZS5hYm9ydGVkID8gaShudWxsKSA6IG8gJiYgNDA0ICE9PSBvLnN0YXR1cyA/IGkobykgOiAociAmJiByLnJlc291cmNlVGltaW5nICYmIChlLnJlc291cmNlVGltaW5nID0gci5yZXNvdXJjZVRpbWluZyksIHRoaXMubWFwLl9yZWZyZXNoRXhwaXJlZFRpbGVzICYmIHIgJiYgZS5zZXRFeHBpcnlEYXRhKHIpLCBlLmxvYWRWZWN0b3JEYXRhKHIsIHRoaXMubWFwLnBhaW50ZXIpLCB0LmNhY2hlRW50cnlQb3NzaWJseUFkZGVkKHRoaXMuZGlzcGF0Y2hlciksIGkobnVsbCksIHZvaWQgKGUucmVsb2FkQ2FsbGJhY2sgJiYgKHRoaXMubG9hZFRpbGUoZSwgZS5yZWxvYWRDYWxsYmFjayksIGUucmVsb2FkQ2FsbGJhY2sgPSBudWxsKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgci5yZXF1ZXN0LmNvbGxlY3RSZXNvdXJjZVRpbWluZyA9IHRoaXMuX2NvbGxlY3RSZXNvdXJjZVRpbWluZywgZS5hY3RvciAmJiBcImV4cGlyZWRcIiAhPT0gZS5zdGF0ZSA/IFwibG9hZGluZ1wiID09PSBlLnN0YXRlID8gZS5yZWxvYWRDYWxsYmFjayA9IGkgOiBlLnJlcXVlc3QgPSBlLmFjdG9yLnNlbmQoXCJyZWxvYWRUaWxlXCIsIHIsIGEuYmluZCh0aGlzKSkgOiAoZS5hY3RvciA9IHRoaXMuZGlzcGF0Y2hlci5nZXRBY3RvcigpLCBlLnJlcXVlc3QgPSBlLmFjdG9yLnNlbmQoXCJsb2FkVGlsZVwiLCByLCBhLmJpbmQodGhpcykpKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmFib3J0VGlsZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHQucmVxdWVzdCAmJiAodC5yZXF1ZXN0LmNhbmNlbCgpLCBkZWxldGUgdC5yZXF1ZXN0KSwgdC5hY3RvciAmJiB0LmFjdG9yLnNlbmQoXCJhYm9ydFRpbGVcIiwge1xuICAgICAgICAgIHVpZDogdC51aWQsXG4gICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgIHNvdXJjZTogdGhpcy5pZFxuICAgICAgICB9LCB2b2lkIDApO1xuICAgICAgfSwgaS5wcm90b3R5cGUudW5sb2FkVGlsZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHQudW5sb2FkVmVjdG9yRGF0YSgpLCB0LmFjdG9yICYmIHQuYWN0b3Iuc2VuZChcInJlbW92ZVRpbGVcIiwge1xuICAgICAgICAgIHVpZDogdC51aWQsXG4gICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgIHNvdXJjZTogdGhpcy5pZFxuICAgICAgICB9LCB2b2lkIDApO1xuICAgICAgfSwgaS5wcm90b3R5cGUuaGFzVHJhbnNpdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICExO1xuICAgICAgfSwgaTtcbiAgICB9KHQuRXZlbnRlZCksXG4gICAgICAgIEMgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgZnVuY3Rpb24gaShpLCBvLCByLCBhKSB7XG4gICAgICAgIGUuY2FsbCh0aGlzKSwgdGhpcy5pZCA9IGksIHRoaXMuZGlzcGF0Y2hlciA9IHIsIHRoaXMuc2V0RXZlbnRlZFBhcmVudChhKSwgdGhpcy50eXBlID0gXCJyYXN0ZXJcIiwgdGhpcy5taW56b29tID0gMCwgdGhpcy5tYXh6b29tID0gMjIsIHRoaXMucm91bmRab29tID0gITAsIHRoaXMuc2NoZW1lID0gXCJ4eXpcIiwgdGhpcy50aWxlU2l6ZSA9IDUxMiwgdGhpcy5fbG9hZGVkID0gITEsIHRoaXMuX29wdGlvbnMgPSB0LmV4dGVuZCh7XG4gICAgICAgICAgdHlwZTogXCJyYXN0ZXJcIlxuICAgICAgICB9LCBvKSwgdC5leHRlbmQodGhpcywgdC5waWNrKG8sIFtcInVybFwiLCBcInNjaGVtZVwiLCBcInRpbGVTaXplXCJdKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlICYmIChpLl9fcHJvdG9fXyA9IGUpLCAoaS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGUgJiYgZS5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGksIGkucHJvdG90eXBlLmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlID0gdGhpcztcbiAgICAgICAgdGhpcy5fbG9hZGVkID0gITEsIHRoaXMuZmlyZShuZXcgdC5FdmVudChcImRhdGFsb2FkaW5nXCIsIHtcbiAgICAgICAgICBkYXRhVHlwZTogXCJzb3VyY2VcIlxuICAgICAgICB9KSksIHRoaXMuX3RpbGVKU09OUmVxdWVzdCA9IEkodGhpcy5fb3B0aW9ucywgdGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLCBmdW5jdGlvbiAoaSwgbykge1xuICAgICAgICAgIGUuX3RpbGVKU09OUmVxdWVzdCA9IG51bGwsIGUuX2xvYWRlZCA9ICEwLCBpID8gZS5maXJlKG5ldyB0LkVycm9yRXZlbnQoaSkpIDogbyAmJiAodC5leHRlbmQoZSwgbyksIG8uYm91bmRzICYmIChlLnRpbGVCb3VuZHMgPSBuZXcgUChvLmJvdW5kcywgZS5taW56b29tLCBlLm1heHpvb20pKSwgdC5wb3N0VHVybnN0aWxlRXZlbnQoby50aWxlcyksIHQucG9zdE1hcExvYWRFdmVudChvLnRpbGVzLCBlLm1hcC5fZ2V0TWFwSWQoKSwgZS5tYXAuX3JlcXVlc3RNYW5hZ2VyLl9za3VUb2tlbiksIGUuZmlyZShuZXcgdC5FdmVudChcImRhdGFcIiwge1xuICAgICAgICAgICAgZGF0YVR5cGU6IFwic291cmNlXCIsXG4gICAgICAgICAgICBzb3VyY2VEYXRhVHlwZTogXCJtZXRhZGF0YVwiXG4gICAgICAgICAgfSkpLCBlLmZpcmUobmV3IHQuRXZlbnQoXCJkYXRhXCIsIHtcbiAgICAgICAgICAgIGRhdGFUeXBlOiBcInNvdXJjZVwiLFxuICAgICAgICAgICAgc291cmNlRGF0YVR5cGU6IFwiY29udGVudFwiXG4gICAgICAgICAgfSkpKTtcbiAgICAgICAgfSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5sb2FkZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2FkZWQ7XG4gICAgICB9LCBpLnByb3RvdHlwZS5vbkFkZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHRoaXMubWFwID0gdCwgdGhpcy5sb2FkKCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5vblJlbW92ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fdGlsZUpTT05SZXF1ZXN0ICYmICh0aGlzLl90aWxlSlNPTlJlcXVlc3QuY2FuY2VsKCksIHRoaXMuX3RpbGVKU09OUmVxdWVzdCA9IG51bGwpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuc2VyaWFsaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdC5leHRlbmQoe30sIHRoaXMuX29wdGlvbnMpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuaGFzVGlsZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiAhdGhpcy50aWxlQm91bmRzIHx8IHRoaXMudGlsZUJvdW5kcy5jb250YWlucyh0LmNhbm9uaWNhbCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5sb2FkVGlsZSA9IGZ1bmN0aW9uIChlLCBpKSB7XG4gICAgICAgIHZhciBvID0gdGhpcyxcbiAgICAgICAgICAgIHIgPSB0aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIubm9ybWFsaXplVGlsZVVSTChlLnRpbGVJRC5jYW5vbmljYWwudXJsKHRoaXMudGlsZXMsIHRoaXMuc2NoZW1lKSwgdGhpcy50aWxlU2l6ZSk7XG5cbiAgICAgICAgZS5yZXF1ZXN0ID0gdC5nZXRJbWFnZSh0aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIudHJhbnNmb3JtUmVxdWVzdChyLCB0LlJlc291cmNlVHlwZS5UaWxlKSwgZnVuY3Rpb24gKHIsIGEpIHtcbiAgICAgICAgICBpZiAoZGVsZXRlIGUucmVxdWVzdCwgZS5hYm9ydGVkKSBlLnN0YXRlID0gXCJ1bmxvYWRlZFwiLCBpKG51bGwpO2Vsc2UgaWYgKHIpIGUuc3RhdGUgPSBcImVycm9yZWRcIiwgaShyKTtlbHNlIGlmIChhKSB7XG4gICAgICAgICAgICBvLm1hcC5fcmVmcmVzaEV4cGlyZWRUaWxlcyAmJiBlLnNldEV4cGlyeURhdGEoYSksIGRlbGV0ZSBhLmNhY2hlQ29udHJvbCwgZGVsZXRlIGEuZXhwaXJlcztcbiAgICAgICAgICAgIHZhciBuID0gby5tYXAucGFpbnRlci5jb250ZXh0LFxuICAgICAgICAgICAgICAgIHMgPSBuLmdsO1xuICAgICAgICAgICAgZS50ZXh0dXJlID0gby5tYXAucGFpbnRlci5nZXRUaWxlVGV4dHVyZShhLndpZHRoKSwgZS50ZXh0dXJlID8gZS50ZXh0dXJlLnVwZGF0ZShhLCB7XG4gICAgICAgICAgICAgIHVzZU1pcG1hcDogITBcbiAgICAgICAgICAgIH0pIDogKGUudGV4dHVyZSA9IG5ldyB0LlRleHR1cmUobiwgYSwgcy5SR0JBLCB7XG4gICAgICAgICAgICAgIHVzZU1pcG1hcDogITBcbiAgICAgICAgICAgIH0pLCBlLnRleHR1cmUuYmluZChzLkxJTkVBUiwgcy5DTEFNUF9UT19FREdFLCBzLkxJTkVBUl9NSVBNQVBfTkVBUkVTVCksIG4uZXh0VGV4dHVyZUZpbHRlckFuaXNvdHJvcGljICYmIHMudGV4UGFyYW1ldGVyZihzLlRFWFRVUkVfMkQsIG4uZXh0VGV4dHVyZUZpbHRlckFuaXNvdHJvcGljLlRFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhULCBuLmV4dFRleHR1cmVGaWx0ZXJBbmlzb3Ryb3BpY01heCkpLCBlLnN0YXRlID0gXCJsb2FkZWRcIiwgdC5jYWNoZUVudHJ5UG9zc2libHlBZGRlZChvLmRpc3BhdGNoZXIpLCBpKG51bGwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5hYm9ydFRpbGUgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICB0LnJlcXVlc3QgJiYgKHQucmVxdWVzdC5jYW5jZWwoKSwgZGVsZXRlIHQucmVxdWVzdCksIGUoKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnVubG9hZFRpbGUgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICB0LnRleHR1cmUgJiYgdGhpcy5tYXAucGFpbnRlci5zYXZlVGlsZVRleHR1cmUodC50ZXh0dXJlKSwgZSgpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuaGFzVHJhbnNpdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICExO1xuICAgICAgfSwgaTtcbiAgICB9KHQuRXZlbnRlZCksXG4gICAgICAgIHogPSBmdW5jdGlvbiAoZSkge1xuICAgICAgZnVuY3Rpb24gaShpLCBvLCByLCBhKSB7XG4gICAgICAgIGUuY2FsbCh0aGlzLCBpLCBvLCByLCBhKSwgdGhpcy50eXBlID0gXCJyYXN0ZXItZGVtXCIsIHRoaXMubWF4em9vbSA9IDIyLCB0aGlzLl9vcHRpb25zID0gdC5leHRlbmQoe1xuICAgICAgICAgIHR5cGU6IFwicmFzdGVyLWRlbVwiXG4gICAgICAgIH0sIG8pLCB0aGlzLmVuY29kaW5nID0gby5lbmNvZGluZyB8fCBcIm1hcGJveFwiO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZSAmJiAoaS5fX3Byb3RvX18gPSBlKSwgKGkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShlICYmIGUucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBpLCBpLnByb3RvdHlwZS5zZXJpYWxpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogXCJyYXN0ZXItZGVtXCIsXG4gICAgICAgICAgdXJsOiB0aGlzLnVybCxcbiAgICAgICAgICB0aWxlU2l6ZTogdGhpcy50aWxlU2l6ZSxcbiAgICAgICAgICB0aWxlczogdGhpcy50aWxlcyxcbiAgICAgICAgICBib3VuZHM6IHRoaXMuYm91bmRzLFxuICAgICAgICAgIGVuY29kaW5nOiB0aGlzLmVuY29kaW5nXG4gICAgICAgIH07XG4gICAgICB9LCBpLnByb3RvdHlwZS5sb2FkVGlsZSA9IGZ1bmN0aW9uIChlLCBpKSB7XG4gICAgICAgIHZhciBvID0gdGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLm5vcm1hbGl6ZVRpbGVVUkwoZS50aWxlSUQuY2Fub25pY2FsLnVybCh0aGlzLnRpbGVzLCB0aGlzLnNjaGVtZSksIHRoaXMudGlsZVNpemUpO1xuXG4gICAgICAgIGZ1bmN0aW9uIHIodCwgbykge1xuICAgICAgICAgIHQgJiYgKGUuc3RhdGUgPSBcImVycm9yZWRcIiwgaSh0KSksIG8gJiYgKGUuZGVtID0gbywgZS5uZWVkc0hpbGxzaGFkZVByZXBhcmUgPSAhMCwgZS5zdGF0ZSA9IFwibG9hZGVkXCIsIGkobnVsbCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgZS5yZXF1ZXN0ID0gdC5nZXRJbWFnZSh0aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIudHJhbnNmb3JtUmVxdWVzdChvLCB0LlJlc291cmNlVHlwZS5UaWxlKSwgZnVuY3Rpb24gKG8sIGEpIHtcbiAgICAgICAgICBpZiAoZGVsZXRlIGUucmVxdWVzdCwgZS5hYm9ydGVkKSBlLnN0YXRlID0gXCJ1bmxvYWRlZFwiLCBpKG51bGwpO2Vsc2UgaWYgKG8pIGUuc3RhdGUgPSBcImVycm9yZWRcIiwgaShvKTtlbHNlIGlmIChhKSB7XG4gICAgICAgICAgICB0aGlzLm1hcC5fcmVmcmVzaEV4cGlyZWRUaWxlcyAmJiBlLnNldEV4cGlyeURhdGEoYSksIGRlbGV0ZSBhLmNhY2hlQ29udHJvbCwgZGVsZXRlIGEuZXhwaXJlcztcbiAgICAgICAgICAgIHZhciBuID0gdC53aW5kb3cuSW1hZ2VCaXRtYXAgJiYgYSBpbnN0YW5jZW9mIHQud2luZG93LkltYWdlQml0bWFwICYmIHQub2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKCkgPyBhIDogdC5icm93c2VyLmdldEltYWdlRGF0YShhLCAxKSxcbiAgICAgICAgICAgICAgICBzID0ge1xuICAgICAgICAgICAgICB1aWQ6IGUudWlkLFxuICAgICAgICAgICAgICBjb29yZDogZS50aWxlSUQsXG4gICAgICAgICAgICAgIHNvdXJjZTogdGhpcy5pZCxcbiAgICAgICAgICAgICAgcmF3SW1hZ2VEYXRhOiBuLFxuICAgICAgICAgICAgICBlbmNvZGluZzogdGhpcy5lbmNvZGluZ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGUuYWN0b3IgJiYgXCJleHBpcmVkXCIgIT09IGUuc3RhdGUgfHwgKGUuYWN0b3IgPSB0aGlzLmRpc3BhdGNoZXIuZ2V0QWN0b3IoKSwgZS5hY3Rvci5zZW5kKFwibG9hZERFTVRpbGVcIiwgcywgci5iaW5kKHRoaXMpKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LmJpbmQodGhpcykpLCBlLm5laWdoYm9yaW5nVGlsZXMgPSB0aGlzLl9nZXROZWlnaGJvcmluZ1RpbGVzKGUudGlsZUlEKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLl9nZXROZWlnaGJvcmluZ1RpbGVzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIGkgPSBlLmNhbm9uaWNhbCxcbiAgICAgICAgICAgIG8gPSBNYXRoLnBvdygyLCBpLnopLFxuICAgICAgICAgICAgciA9IChpLnggLSAxICsgbykgJSBvLFxuICAgICAgICAgICAgYSA9IDAgPT09IGkueCA/IGUud3JhcCAtIDEgOiBlLndyYXAsXG4gICAgICAgICAgICBuID0gKGkueCArIDEgKyBvKSAlIG8sXG4gICAgICAgICAgICBzID0gaS54ICsgMSA9PT0gbyA/IGUud3JhcCArIDEgOiBlLndyYXAsXG4gICAgICAgICAgICBsID0ge307XG4gICAgICAgIHJldHVybiBsW25ldyB0Lk92ZXJzY2FsZWRUaWxlSUQoZS5vdmVyc2NhbGVkWiwgYSwgaS56LCByLCBpLnkpLmtleV0gPSB7XG4gICAgICAgICAgYmFja2ZpbGxlZDogITFcbiAgICAgICAgfSwgbFtuZXcgdC5PdmVyc2NhbGVkVGlsZUlEKGUub3ZlcnNjYWxlZFosIHMsIGkueiwgbiwgaS55KS5rZXldID0ge1xuICAgICAgICAgIGJhY2tmaWxsZWQ6ICExXG4gICAgICAgIH0sIGkueSA+IDAgJiYgKGxbbmV3IHQuT3ZlcnNjYWxlZFRpbGVJRChlLm92ZXJzY2FsZWRaLCBhLCBpLnosIHIsIGkueSAtIDEpLmtleV0gPSB7XG4gICAgICAgICAgYmFja2ZpbGxlZDogITFcbiAgICAgICAgfSwgbFtuZXcgdC5PdmVyc2NhbGVkVGlsZUlEKGUub3ZlcnNjYWxlZFosIGUud3JhcCwgaS56LCBpLngsIGkueSAtIDEpLmtleV0gPSB7XG4gICAgICAgICAgYmFja2ZpbGxlZDogITFcbiAgICAgICAgfSwgbFtuZXcgdC5PdmVyc2NhbGVkVGlsZUlEKGUub3ZlcnNjYWxlZFosIHMsIGkueiwgbiwgaS55IC0gMSkua2V5XSA9IHtcbiAgICAgICAgICBiYWNrZmlsbGVkOiAhMVxuICAgICAgICB9KSwgaS55ICsgMSA8IG8gJiYgKGxbbmV3IHQuT3ZlcnNjYWxlZFRpbGVJRChlLm92ZXJzY2FsZWRaLCBhLCBpLnosIHIsIGkueSArIDEpLmtleV0gPSB7XG4gICAgICAgICAgYmFja2ZpbGxlZDogITFcbiAgICAgICAgfSwgbFtuZXcgdC5PdmVyc2NhbGVkVGlsZUlEKGUub3ZlcnNjYWxlZFosIGUud3JhcCwgaS56LCBpLngsIGkueSArIDEpLmtleV0gPSB7XG4gICAgICAgICAgYmFja2ZpbGxlZDogITFcbiAgICAgICAgfSwgbFtuZXcgdC5PdmVyc2NhbGVkVGlsZUlEKGUub3ZlcnNjYWxlZFosIHMsIGkueiwgbiwgaS55ICsgMSkua2V5XSA9IHtcbiAgICAgICAgICBiYWNrZmlsbGVkOiAhMVxuICAgICAgICB9KSwgbDtcbiAgICAgIH0sIGkucHJvdG90eXBlLnVubG9hZFRpbGUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB0LmRlbVRleHR1cmUgJiYgdGhpcy5tYXAucGFpbnRlci5zYXZlVGlsZVRleHR1cmUodC5kZW1UZXh0dXJlKSwgdC5mYm8gJiYgKHQuZmJvLmRlc3Ryb3koKSwgZGVsZXRlIHQuZmJvKSwgdC5kZW0gJiYgZGVsZXRlIHQuZGVtLCBkZWxldGUgdC5uZWlnaGJvcmluZ1RpbGVzLCB0LnN0YXRlID0gXCJ1bmxvYWRlZFwiLCB0LmFjdG9yICYmIHQuYWN0b3Iuc2VuZChcInJlbW92ZURFTVRpbGVcIiwge1xuICAgICAgICAgIHVpZDogdC51aWQsXG4gICAgICAgICAgc291cmNlOiB0aGlzLmlkXG4gICAgICAgIH0pO1xuICAgICAgfSwgaTtcbiAgICB9KEMpLFxuICAgICAgICBEID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGZ1bmN0aW9uIGkoaSwgbywgciwgYSkge1xuICAgICAgICBlLmNhbGwodGhpcyksIHRoaXMuaWQgPSBpLCB0aGlzLnR5cGUgPSBcImdlb2pzb25cIiwgdGhpcy5taW56b29tID0gMCwgdGhpcy5tYXh6b29tID0gMTgsIHRoaXMudGlsZVNpemUgPSA1MTIsIHRoaXMuaXNUaWxlQ2xpcHBlZCA9ICEwLCB0aGlzLnJlcGFyc2VPdmVyc2NhbGVkID0gITAsIHRoaXMuX3JlbW92ZWQgPSAhMSwgdGhpcy5fbG9hZGVkID0gITEsIHRoaXMuYWN0b3IgPSByLmdldEFjdG9yKCksIHRoaXMuc2V0RXZlbnRlZFBhcmVudChhKSwgdGhpcy5fZGF0YSA9IG8uZGF0YSwgdGhpcy5fb3B0aW9ucyA9IHQuZXh0ZW5kKHt9LCBvKSwgdGhpcy5fY29sbGVjdFJlc291cmNlVGltaW5nID0gby5jb2xsZWN0UmVzb3VyY2VUaW1pbmcsIHRoaXMuX3Jlc291cmNlVGltaW5nID0gW10sIHZvaWQgMCAhPT0gby5tYXh6b29tICYmICh0aGlzLm1heHpvb20gPSBvLm1heHpvb20pLCBvLnR5cGUgJiYgKHRoaXMudHlwZSA9IG8udHlwZSksIG8uYXR0cmlidXRpb24gJiYgKHRoaXMuYXR0cmlidXRpb24gPSBvLmF0dHJpYnV0aW9uKSwgdGhpcy5wcm9tb3RlSWQgPSBvLnByb21vdGVJZDtcbiAgICAgICAgdmFyIG4gPSB0LkVYVEVOVCAvIHRoaXMudGlsZVNpemU7XG4gICAgICAgIHRoaXMud29ya2VyT3B0aW9ucyA9IHQuZXh0ZW5kKHtcbiAgICAgICAgICBzb3VyY2U6IHRoaXMuaWQsXG4gICAgICAgICAgY2x1c3Rlcjogby5jbHVzdGVyIHx8ICExLFxuICAgICAgICAgIGdlb2pzb25WdE9wdGlvbnM6IHtcbiAgICAgICAgICAgIGJ1ZmZlcjogKHZvaWQgMCAhPT0gby5idWZmZXIgPyBvLmJ1ZmZlciA6IDEyOCkgKiBuLFxuICAgICAgICAgICAgdG9sZXJhbmNlOiAodm9pZCAwICE9PSBvLnRvbGVyYW5jZSA/IG8udG9sZXJhbmNlIDogLjM3NSkgKiBuLFxuICAgICAgICAgICAgZXh0ZW50OiB0LkVYVEVOVCxcbiAgICAgICAgICAgIG1heFpvb206IHRoaXMubWF4em9vbSxcbiAgICAgICAgICAgIGxpbmVNZXRyaWNzOiBvLmxpbmVNZXRyaWNzIHx8ICExLFxuICAgICAgICAgICAgZ2VuZXJhdGVJZDogby5nZW5lcmF0ZUlkIHx8ICExXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdXBlcmNsdXN0ZXJPcHRpb25zOiB7XG4gICAgICAgICAgICBtYXhab29tOiB2b2lkIDAgIT09IG8uY2x1c3Rlck1heFpvb20gPyBNYXRoLm1pbihvLmNsdXN0ZXJNYXhab29tLCB0aGlzLm1heHpvb20gLSAxKSA6IHRoaXMubWF4em9vbSAtIDEsXG4gICAgICAgICAgICBtaW5Qb2ludHM6IE1hdGgubWF4KDIsIG8uY2x1c3Rlck1pblBvaW50cyB8fCAyKSxcbiAgICAgICAgICAgIGV4dGVudDogdC5FWFRFTlQsXG4gICAgICAgICAgICByYWRpdXM6IChvLmNsdXN0ZXJSYWRpdXMgfHwgNTApICogbixcbiAgICAgICAgICAgIGxvZzogITEsXG4gICAgICAgICAgICBnZW5lcmF0ZUlkOiBvLmdlbmVyYXRlSWQgfHwgITFcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNsdXN0ZXJQcm9wZXJ0aWVzOiBvLmNsdXN0ZXJQcm9wZXJ0aWVzLFxuICAgICAgICAgIGZpbHRlcjogby5maWx0ZXJcbiAgICAgICAgfSwgby53b3JrZXJPcHRpb25zKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGUgJiYgKGkuX19wcm90b19fID0gZSksIChpLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoZSAmJiBlLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gaSwgaS5wcm90b3R5cGUubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGUgPSB0aGlzO1xuICAgICAgICB0aGlzLmZpcmUobmV3IHQuRXZlbnQoXCJkYXRhbG9hZGluZ1wiLCB7XG4gICAgICAgICAgZGF0YVR5cGU6IFwic291cmNlXCJcbiAgICAgICAgfSkpLCB0aGlzLl91cGRhdGVXb3JrZXJEYXRhKGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgaWYgKGkpIGUuZmlyZShuZXcgdC5FcnJvckV2ZW50KGkpKTtlbHNlIHtcbiAgICAgICAgICAgIHZhciBvID0ge1xuICAgICAgICAgICAgICBkYXRhVHlwZTogXCJzb3VyY2VcIixcbiAgICAgICAgICAgICAgc291cmNlRGF0YVR5cGU6IFwibWV0YWRhdGFcIlxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGUuX2NvbGxlY3RSZXNvdXJjZVRpbWluZyAmJiBlLl9yZXNvdXJjZVRpbWluZyAmJiBlLl9yZXNvdXJjZVRpbWluZy5sZW5ndGggPiAwICYmIChvLnJlc291cmNlVGltaW5nID0gZS5fcmVzb3VyY2VUaW1pbmcsIGUuX3Jlc291cmNlVGltaW5nID0gW10pLCBlLmZpcmUobmV3IHQuRXZlbnQoXCJkYXRhXCIsIG8pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSwgaS5wcm90b3R5cGUub25BZGQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB0aGlzLm1hcCA9IHQsIHRoaXMubG9hZCgpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuc2V0RGF0YSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBpID0gdGhpcztcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEgPSBlLCB0aGlzLmZpcmUobmV3IHQuRXZlbnQoXCJkYXRhbG9hZGluZ1wiLCB7XG4gICAgICAgICAgZGF0YVR5cGU6IFwic291cmNlXCJcbiAgICAgICAgfSkpLCB0aGlzLl91cGRhdGVXb3JrZXJEYXRhKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgaWYgKGUpIGkuZmlyZShuZXcgdC5FcnJvckV2ZW50KGUpKTtlbHNlIHtcbiAgICAgICAgICAgIHZhciBvID0ge1xuICAgICAgICAgICAgICBkYXRhVHlwZTogXCJzb3VyY2VcIixcbiAgICAgICAgICAgICAgc291cmNlRGF0YVR5cGU6IFwiY29udGVudFwiXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaS5fY29sbGVjdFJlc291cmNlVGltaW5nICYmIGkuX3Jlc291cmNlVGltaW5nICYmIGkuX3Jlc291cmNlVGltaW5nLmxlbmd0aCA+IDAgJiYgKG8ucmVzb3VyY2VUaW1pbmcgPSBpLl9yZXNvdXJjZVRpbWluZywgaS5fcmVzb3VyY2VUaW1pbmcgPSBbXSksIGkuZmlyZShuZXcgdC5FdmVudChcImRhdGFcIiwgbykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksIHRoaXM7XG4gICAgICB9LCBpLnByb3RvdHlwZS5nZXRDbHVzdGVyRXhwYW5zaW9uWm9vbSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjdG9yLnNlbmQoXCJnZW9qc29uLmdldENsdXN0ZXJFeHBhbnNpb25ab29tXCIsIHtcbiAgICAgICAgICBjbHVzdGVySWQ6IHQsXG4gICAgICAgICAgc291cmNlOiB0aGlzLmlkXG4gICAgICAgIH0sIGUpLCB0aGlzO1xuICAgICAgfSwgaS5wcm90b3R5cGUuZ2V0Q2x1c3RlckNoaWxkcmVuID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0b3Iuc2VuZChcImdlb2pzb24uZ2V0Q2x1c3RlckNoaWxkcmVuXCIsIHtcbiAgICAgICAgICBjbHVzdGVySWQ6IHQsXG4gICAgICAgICAgc291cmNlOiB0aGlzLmlkXG4gICAgICAgIH0sIGUpLCB0aGlzO1xuICAgICAgfSwgaS5wcm90b3R5cGUuZ2V0Q2x1c3RlckxlYXZlcyA9IGZ1bmN0aW9uICh0LCBlLCBpLCBvKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjdG9yLnNlbmQoXCJnZW9qc29uLmdldENsdXN0ZXJMZWF2ZXNcIiwge1xuICAgICAgICAgIHNvdXJjZTogdGhpcy5pZCxcbiAgICAgICAgICBjbHVzdGVySWQ6IHQsXG4gICAgICAgICAgbGltaXQ6IGUsXG4gICAgICAgICAgb2Zmc2V0OiBpXG4gICAgICAgIH0sIG8pLCB0aGlzO1xuICAgICAgfSwgaS5wcm90b3R5cGUuX3VwZGF0ZVdvcmtlckRhdGEgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgaSA9IHRoaXM7XG4gICAgICAgIHRoaXMuX2xvYWRlZCA9ICExO1xuICAgICAgICB2YXIgbyA9IHQuZXh0ZW5kKHt9LCB0aGlzLndvcmtlck9wdGlvbnMpLFxuICAgICAgICAgICAgciA9IHRoaXMuX2RhdGE7XG4gICAgICAgIFwic3RyaW5nXCIgPT0gdHlwZW9mIHIgPyAoby5yZXF1ZXN0ID0gdGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLnRyYW5zZm9ybVJlcXVlc3QodC5icm93c2VyLnJlc29sdmVVUkwociksIHQuUmVzb3VyY2VUeXBlLlNvdXJjZSksIG8ucmVxdWVzdC5jb2xsZWN0UmVzb3VyY2VUaW1pbmcgPSB0aGlzLl9jb2xsZWN0UmVzb3VyY2VUaW1pbmcpIDogby5kYXRhID0gSlNPTi5zdHJpbmdpZnkociksIHRoaXMuYWN0b3Iuc2VuZCh0aGlzLnR5cGUgKyBcIi5sb2FkRGF0YVwiLCBvLCBmdW5jdGlvbiAodCwgcikge1xuICAgICAgICAgIGkuX3JlbW92ZWQgfHwgciAmJiByLmFiYW5kb25lZCB8fCAoaS5fbG9hZGVkID0gITAsIHIgJiYgci5yZXNvdXJjZVRpbWluZyAmJiByLnJlc291cmNlVGltaW5nW2kuaWRdICYmIChpLl9yZXNvdXJjZVRpbWluZyA9IHIucmVzb3VyY2VUaW1pbmdbaS5pZF0uc2xpY2UoMCkpLCBpLmFjdG9yLnNlbmQoaS50eXBlICsgXCIuY29hbGVzY2VcIiwge1xuICAgICAgICAgICAgc291cmNlOiBvLnNvdXJjZVxuICAgICAgICAgIH0sIG51bGwpLCBlKHQpKTtcbiAgICAgICAgfSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5sb2FkZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2FkZWQ7XG4gICAgICB9LCBpLnByb3RvdHlwZS5sb2FkVGlsZSA9IGZ1bmN0aW9uIChlLCBpKSB7XG4gICAgICAgIHZhciBvID0gdGhpcyxcbiAgICAgICAgICAgIHIgPSBlLmFjdG9yID8gXCJyZWxvYWRUaWxlXCIgOiBcImxvYWRUaWxlXCI7XG4gICAgICAgIGUuYWN0b3IgPSB0aGlzLmFjdG9yLCBlLnJlcXVlc3QgPSB0aGlzLmFjdG9yLnNlbmQociwge1xuICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICB1aWQ6IGUudWlkLFxuICAgICAgICAgIHRpbGVJRDogZS50aWxlSUQsXG4gICAgICAgICAgem9vbTogZS50aWxlSUQub3ZlcnNjYWxlZFosXG4gICAgICAgICAgbWF4Wm9vbTogdGhpcy5tYXh6b29tLFxuICAgICAgICAgIHRpbGVTaXplOiB0aGlzLnRpbGVTaXplLFxuICAgICAgICAgIHNvdXJjZTogdGhpcy5pZCxcbiAgICAgICAgICBwaXhlbFJhdGlvOiB0LmJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgICAgICBzaG93Q29sbGlzaW9uQm94ZXM6IHRoaXMubWFwLnNob3dDb2xsaXNpb25Cb3hlcyxcbiAgICAgICAgICBwcm9tb3RlSWQ6IHRoaXMucHJvbW90ZUlkXG4gICAgICAgIH0sIGZ1bmN0aW9uICh0LCBhKSB7XG4gICAgICAgICAgcmV0dXJuIGRlbGV0ZSBlLnJlcXVlc3QsIGUudW5sb2FkVmVjdG9yRGF0YSgpLCBlLmFib3J0ZWQgPyBpKG51bGwpIDogdCA/IGkodCkgOiAoZS5sb2FkVmVjdG9yRGF0YShhLCBvLm1hcC5wYWludGVyLCBcInJlbG9hZFRpbGVcIiA9PT0gciksIGkobnVsbCkpO1xuICAgICAgICB9KTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmFib3J0VGlsZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHQucmVxdWVzdCAmJiAodC5yZXF1ZXN0LmNhbmNlbCgpLCBkZWxldGUgdC5yZXF1ZXN0KSwgdC5hYm9ydGVkID0gITA7XG4gICAgICB9LCBpLnByb3RvdHlwZS51bmxvYWRUaWxlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdC51bmxvYWRWZWN0b3JEYXRhKCksIHRoaXMuYWN0b3Iuc2VuZChcInJlbW92ZVRpbGVcIiwge1xuICAgICAgICAgIHVpZDogdC51aWQsXG4gICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgIHNvdXJjZTogdGhpcy5pZFxuICAgICAgICB9KTtcbiAgICAgIH0sIGkucHJvdG90eXBlLm9uUmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9yZW1vdmVkID0gITAsIHRoaXMuYWN0b3Iuc2VuZChcInJlbW92ZVNvdXJjZVwiLCB7XG4gICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgIHNvdXJjZTogdGhpcy5pZFxuICAgICAgICB9KTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHQuZXh0ZW5kKHt9LCB0aGlzLl9vcHRpb25zLCB7XG4gICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgIGRhdGE6IHRoaXMuX2RhdGFcbiAgICAgICAgfSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5oYXNUcmFuc2l0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gITE7XG4gICAgICB9LCBpO1xuICAgIH0odC5FdmVudGVkKSxcbiAgICAgICAgQSA9IHQuY3JlYXRlTGF5b3V0KFt7XG4gICAgICBuYW1lOiBcImFfcG9zXCIsXG4gICAgICB0eXBlOiBcIkludDE2XCIsXG4gICAgICBjb21wb25lbnRzOiAyXG4gICAgfSwge1xuICAgICAgbmFtZTogXCJhX3RleHR1cmVfcG9zXCIsXG4gICAgICB0eXBlOiBcIkludDE2XCIsXG4gICAgICBjb21wb25lbnRzOiAyXG4gICAgfV0pLFxuICAgICAgICBNID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGZ1bmN0aW9uIGkodCwgaSwgbywgcikge1xuICAgICAgICBlLmNhbGwodGhpcyksIHRoaXMuaWQgPSB0LCB0aGlzLmRpc3BhdGNoZXIgPSBvLCB0aGlzLmNvb3JkaW5hdGVzID0gaS5jb29yZGluYXRlcywgdGhpcy50eXBlID0gXCJpbWFnZVwiLCB0aGlzLm1pbnpvb20gPSAwLCB0aGlzLm1heHpvb20gPSAyMiwgdGhpcy50aWxlU2l6ZSA9IDUxMiwgdGhpcy50aWxlcyA9IHt9LCB0aGlzLl9sb2FkZWQgPSAhMSwgdGhpcy5zZXRFdmVudGVkUGFyZW50KHIpLCB0aGlzLm9wdGlvbnMgPSBpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZSAmJiAoaS5fX3Byb3RvX18gPSBlKSwgKGkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShlICYmIGUucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBpLCBpLnByb3RvdHlwZS5sb2FkID0gZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgICAgdmFyIG8gPSB0aGlzO1xuICAgICAgICB0aGlzLl9sb2FkZWQgPSAhMSwgdGhpcy5maXJlKG5ldyB0LkV2ZW50KFwiZGF0YWxvYWRpbmdcIiwge1xuICAgICAgICAgIGRhdGFUeXBlOiBcInNvdXJjZVwiXG4gICAgICAgIH0pKSwgdGhpcy51cmwgPSB0aGlzLm9wdGlvbnMudXJsLCB0LmdldEltYWdlKHRoaXMubWFwLl9yZXF1ZXN0TWFuYWdlci50cmFuc2Zvcm1SZXF1ZXN0KHRoaXMudXJsLCB0LlJlc291cmNlVHlwZS5JbWFnZSksIGZ1bmN0aW9uIChyLCBhKSB7XG4gICAgICAgICAgby5fbG9hZGVkID0gITAsIHIgPyBvLmZpcmUobmV3IHQuRXJyb3JFdmVudChyKSkgOiBhICYmIChvLmltYWdlID0gYSwgZSAmJiAoby5jb29yZGluYXRlcyA9IGUpLCBpICYmIGkoKSwgby5fZmluaXNoTG9hZGluZygpKTtcbiAgICAgICAgfSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5sb2FkZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2FkZWQ7XG4gICAgICB9LCBpLnByb3RvdHlwZS51cGRhdGVJbWFnZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHZhciBlID0gdGhpcztcbiAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2UgJiYgdC51cmwgPyAodGhpcy5vcHRpb25zLnVybCA9IHQudXJsLCB0aGlzLmxvYWQodC5jb29yZGluYXRlcywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGUudGV4dHVyZSA9IG51bGw7XG4gICAgICAgIH0pLCB0aGlzKSA6IHRoaXM7XG4gICAgICB9LCBpLnByb3RvdHlwZS5fZmluaXNoTG9hZGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5tYXAgJiYgKHRoaXMuc2V0Q29vcmRpbmF0ZXModGhpcy5jb29yZGluYXRlcyksIHRoaXMuZmlyZShuZXcgdC5FdmVudChcImRhdGFcIiwge1xuICAgICAgICAgIGRhdGFUeXBlOiBcInNvdXJjZVwiLFxuICAgICAgICAgIHNvdXJjZURhdGFUeXBlOiBcIm1ldGFkYXRhXCJcbiAgICAgICAgfSkpKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLm9uQWRkID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdGhpcy5tYXAgPSB0LCB0aGlzLmxvYWQoKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnNldENvb3JkaW5hdGVzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIGkgPSB0aGlzO1xuICAgICAgICB0aGlzLmNvb3JkaW5hdGVzID0gZTtcbiAgICAgICAgdmFyIG8gPSBlLm1hcCh0Lk1lcmNhdG9yQ29vcmRpbmF0ZS5mcm9tTG5nTGF0KTtcbiAgICAgICAgdGhpcy50aWxlSUQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAxIC8gMCwgbyA9IDEgLyAwLCByID0gLTEgLyAwLCBhID0gLTEgLyAwLCBuID0gMCwgcyA9IGU7IG4gPCBzLmxlbmd0aDsgbiArPSAxKSB7XG4gICAgICAgICAgICB2YXIgbCA9IHNbbl07XG4gICAgICAgICAgICBpID0gTWF0aC5taW4oaSwgbC54KSwgbyA9IE1hdGgubWluKG8sIGwueSksIHIgPSBNYXRoLm1heChyLCBsLngpLCBhID0gTWF0aC5tYXgoYSwgbC55KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgYyA9IE1hdGgubWF4KHIgLSBpLCBhIC0gbyksXG4gICAgICAgICAgICAgIHUgPSBNYXRoLm1heCgwLCBNYXRoLmZsb29yKC1NYXRoLmxvZyhjKSAvIE1hdGguTE4yKSksXG4gICAgICAgICAgICAgIGggPSBNYXRoLnBvdygyLCB1KTtcbiAgICAgICAgICByZXR1cm4gbmV3IHQuQ2Fub25pY2FsVGlsZUlEKHUsIE1hdGguZmxvb3IoKGkgKyByKSAvIDIgKiBoKSwgTWF0aC5mbG9vcigobyArIGEpIC8gMiAqIGgpKTtcbiAgICAgICAgfShvKSwgdGhpcy5taW56b29tID0gdGhpcy5tYXh6b29tID0gdGhpcy50aWxlSUQuejtcbiAgICAgICAgdmFyIHIgPSBvLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHJldHVybiBpLnRpbGVJRC5nZXRUaWxlUG9pbnQodCkuX3JvdW5kKCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5fYm91bmRzQXJyYXkgPSBuZXcgdC5TdHJ1Y3RBcnJheUxheW91dDRpOCgpLCB0aGlzLl9ib3VuZHNBcnJheS5lbXBsYWNlQmFjayhyWzBdLngsIHJbMF0ueSwgMCwgMCksIHRoaXMuX2JvdW5kc0FycmF5LmVtcGxhY2VCYWNrKHJbMV0ueCwgclsxXS55LCB0LkVYVEVOVCwgMCksIHRoaXMuX2JvdW5kc0FycmF5LmVtcGxhY2VCYWNrKHJbM10ueCwgclszXS55LCAwLCB0LkVYVEVOVCksIHRoaXMuX2JvdW5kc0FycmF5LmVtcGxhY2VCYWNrKHJbMl0ueCwgclsyXS55LCB0LkVYVEVOVCwgdC5FWFRFTlQpLCB0aGlzLmJvdW5kc0J1ZmZlciAmJiAodGhpcy5ib3VuZHNCdWZmZXIuZGVzdHJveSgpLCBkZWxldGUgdGhpcy5ib3VuZHNCdWZmZXIpLCB0aGlzLmZpcmUobmV3IHQuRXZlbnQoXCJkYXRhXCIsIHtcbiAgICAgICAgICBkYXRhVHlwZTogXCJzb3VyY2VcIixcbiAgICAgICAgICBzb3VyY2VEYXRhVHlwZTogXCJjb250ZW50XCJcbiAgICAgICAgfSkpLCB0aGlzO1xuICAgICAgfSwgaS5wcm90b3R5cGUucHJlcGFyZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKDAgIT09IE9iamVjdC5rZXlzKHRoaXMudGlsZXMpLmxlbmd0aCAmJiB0aGlzLmltYWdlKSB7XG4gICAgICAgICAgdmFyIGUgPSB0aGlzLm1hcC5wYWludGVyLmNvbnRleHQsXG4gICAgICAgICAgICAgIGkgPSBlLmdsO1xuXG4gICAgICAgICAgZm9yICh2YXIgbyBpbiB0aGlzLmJvdW5kc0J1ZmZlciB8fCAodGhpcy5ib3VuZHNCdWZmZXIgPSBlLmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLl9ib3VuZHNBcnJheSwgQS5tZW1iZXJzKSksIHRoaXMuYm91bmRzU2VnbWVudHMgfHwgKHRoaXMuYm91bmRzU2VnbWVudHMgPSB0LlNlZ21lbnRWZWN0b3Iuc2ltcGxlU2VnbWVudCgwLCAwLCA0LCAyKSksIHRoaXMudGV4dHVyZSB8fCAodGhpcy50ZXh0dXJlID0gbmV3IHQuVGV4dHVyZShlLCB0aGlzLmltYWdlLCBpLlJHQkEpLCB0aGlzLnRleHR1cmUuYmluZChpLkxJTkVBUiwgaS5DTEFNUF9UT19FREdFKSksIHRoaXMudGlsZXMpIHtcbiAgICAgICAgICAgIHZhciByID0gdGhpcy50aWxlc1tvXTtcbiAgICAgICAgICAgIFwibG9hZGVkXCIgIT09IHIuc3RhdGUgJiYgKHIuc3RhdGUgPSBcImxvYWRlZFwiLCByLnRleHR1cmUgPSB0aGlzLnRleHR1cmUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgaS5wcm90b3R5cGUubG9hZFRpbGUgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICB0aGlzLnRpbGVJRCAmJiB0aGlzLnRpbGVJRC5lcXVhbHModC50aWxlSUQuY2Fub25pY2FsKSA/ICh0aGlzLnRpbGVzW1N0cmluZyh0LnRpbGVJRC53cmFwKV0gPSB0LCB0LmJ1Y2tldHMgPSB7fSwgZShudWxsKSkgOiAodC5zdGF0ZSA9IFwiZXJyb3JlZFwiLCBlKG51bGwpKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiBcImltYWdlXCIsXG4gICAgICAgICAgdXJsOiB0aGlzLm9wdGlvbnMudXJsLFxuICAgICAgICAgIGNvb3JkaW5hdGVzOiB0aGlzLmNvb3JkaW5hdGVzXG4gICAgICAgIH07XG4gICAgICB9LCBpLnByb3RvdHlwZS5oYXNUcmFuc2l0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gITE7XG4gICAgICB9LCBpO1xuICAgIH0odC5FdmVudGVkKSxcbiAgICAgICAgTCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBmdW5jdGlvbiBpKHQsIGksIG8sIHIpIHtcbiAgICAgICAgZS5jYWxsKHRoaXMsIHQsIGksIG8sIHIpLCB0aGlzLnJvdW5kWm9vbSA9ICEwLCB0aGlzLnR5cGUgPSBcInZpZGVvXCIsIHRoaXMub3B0aW9ucyA9IGk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlICYmIChpLl9fcHJvdG9fXyA9IGUpLCAoaS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGUgJiYgZS5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGksIGkucHJvdG90eXBlLmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlID0gdGhpcztcbiAgICAgICAgdGhpcy5fbG9hZGVkID0gITE7XG4gICAgICAgIHZhciBpID0gdGhpcy5vcHRpb25zO1xuICAgICAgICB0aGlzLnVybHMgPSBbXTtcblxuICAgICAgICBmb3IgKHZhciBvID0gMCwgciA9IGkudXJsczsgbyA8IHIubGVuZ3RoOyBvICs9IDEpIHtcbiAgICAgICAgICB0aGlzLnVybHMucHVzaCh0aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIudHJhbnNmb3JtUmVxdWVzdChyW29dLCB0LlJlc291cmNlVHlwZS5Tb3VyY2UpLnVybCk7XG4gICAgICAgIH1cblxuICAgICAgICB0LmdldFZpZGVvKHRoaXMudXJscywgZnVuY3Rpb24gKGksIG8pIHtcbiAgICAgICAgICBlLl9sb2FkZWQgPSAhMCwgaSA/IGUuZmlyZShuZXcgdC5FcnJvckV2ZW50KGkpKSA6IG8gJiYgKGUudmlkZW8gPSBvLCBlLnZpZGVvLmxvb3AgPSAhMCwgZS52aWRlby5hZGRFdmVudExpc3RlbmVyKFwicGxheWluZ1wiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBlLm1hcC50cmlnZ2VyUmVwYWludCgpO1xuICAgICAgICAgIH0pLCBlLm1hcCAmJiBlLnZpZGVvLnBsYXkoKSwgZS5fZmluaXNoTG9hZGluZygpKTtcbiAgICAgICAgfSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy52aWRlbyAmJiB0aGlzLnZpZGVvLnBhdXNlKCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5wbGF5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnZpZGVvICYmIHRoaXMudmlkZW8ucGxheSgpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuc2VlayA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmICh0aGlzLnZpZGVvKSB7XG4gICAgICAgICAgdmFyIGkgPSB0aGlzLnZpZGVvLnNlZWthYmxlO1xuICAgICAgICAgIGUgPCBpLnN0YXJ0KDApIHx8IGUgPiBpLmVuZCgwKSA/IHRoaXMuZmlyZShuZXcgdC5FcnJvckV2ZW50KG5ldyB0LlZhbGlkYXRpb25FcnJvcihcInNvdXJjZXMuXCIgKyB0aGlzLmlkLCBudWxsLCBcIlBsYXliYWNrIGZvciB0aGlzIHZpZGVvIGNhbiBiZSBzZXQgb25seSBiZXR3ZWVuIHRoZSBcIiArIGkuc3RhcnQoMCkgKyBcIiBhbmQgXCIgKyBpLmVuZCgwKSArIFwiLXNlY29uZCBtYXJrLlwiKSkpIDogdGhpcy52aWRlby5jdXJyZW50VGltZSA9IGU7XG4gICAgICAgIH1cbiAgICAgIH0sIGkucHJvdG90eXBlLmdldFZpZGVvID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWRlbztcbiAgICAgIH0sIGkucHJvdG90eXBlLm9uQWRkID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdGhpcy5tYXAgfHwgKHRoaXMubWFwID0gdCwgdGhpcy5sb2FkKCksIHRoaXMudmlkZW8gJiYgKHRoaXMudmlkZW8ucGxheSgpLCB0aGlzLnNldENvb3JkaW5hdGVzKHRoaXMuY29vcmRpbmF0ZXMpKSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5wcmVwYXJlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoISgwID09PSBPYmplY3Qua2V5cyh0aGlzLnRpbGVzKS5sZW5ndGggfHwgdGhpcy52aWRlby5yZWFkeVN0YXRlIDwgMikpIHtcbiAgICAgICAgICB2YXIgZSA9IHRoaXMubWFwLnBhaW50ZXIuY29udGV4dCxcbiAgICAgICAgICAgICAgaSA9IGUuZ2w7XG5cbiAgICAgICAgICBmb3IgKHZhciBvIGluIHRoaXMuYm91bmRzQnVmZmVyIHx8ICh0aGlzLmJvdW5kc0J1ZmZlciA9IGUuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMuX2JvdW5kc0FycmF5LCBBLm1lbWJlcnMpKSwgdGhpcy5ib3VuZHNTZWdtZW50cyB8fCAodGhpcy5ib3VuZHNTZWdtZW50cyA9IHQuU2VnbWVudFZlY3Rvci5zaW1wbGVTZWdtZW50KDAsIDAsIDQsIDIpKSwgdGhpcy50ZXh0dXJlID8gdGhpcy52aWRlby5wYXVzZWQgfHwgKHRoaXMudGV4dHVyZS5iaW5kKGkuTElORUFSLCBpLkNMQU1QX1RPX0VER0UpLCBpLnRleFN1YkltYWdlMkQoaS5URVhUVVJFXzJELCAwLCAwLCAwLCBpLlJHQkEsIGkuVU5TSUdORURfQllURSwgdGhpcy52aWRlbykpIDogKHRoaXMudGV4dHVyZSA9IG5ldyB0LlRleHR1cmUoZSwgdGhpcy52aWRlbywgaS5SR0JBKSwgdGhpcy50ZXh0dXJlLmJpbmQoaS5MSU5FQVIsIGkuQ0xBTVBfVE9fRURHRSkpLCB0aGlzLnRpbGVzKSB7XG4gICAgICAgICAgICB2YXIgciA9IHRoaXMudGlsZXNbb107XG4gICAgICAgICAgICBcImxvYWRlZFwiICE9PSByLnN0YXRlICYmIChyLnN0YXRlID0gXCJsb2FkZWRcIiwgci50ZXh0dXJlID0gdGhpcy50ZXh0dXJlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIGkucHJvdG90eXBlLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiBcInZpZGVvXCIsXG4gICAgICAgICAgdXJsczogdGhpcy51cmxzLFxuICAgICAgICAgIGNvb3JkaW5hdGVzOiB0aGlzLmNvb3JkaW5hdGVzXG4gICAgICAgIH07XG4gICAgICB9LCBpLnByb3RvdHlwZS5oYXNUcmFuc2l0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWRlbyAmJiAhdGhpcy52aWRlby5wYXVzZWQ7XG4gICAgICB9LCBpO1xuICAgIH0oTSksXG4gICAgICAgIFIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgZnVuY3Rpb24gaShpLCBvLCByLCBhKSB7XG4gICAgICAgIGUuY2FsbCh0aGlzLCBpLCBvLCByLCBhKSwgby5jb29yZGluYXRlcyA/IEFycmF5LmlzQXJyYXkoby5jb29yZGluYXRlcykgJiYgNCA9PT0gby5jb29yZGluYXRlcy5sZW5ndGggJiYgIW8uY29vcmRpbmF0ZXMuc29tZShmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHJldHVybiAhQXJyYXkuaXNBcnJheSh0KSB8fCAyICE9PSB0Lmxlbmd0aCB8fCB0LnNvbWUoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgIHJldHVybiBcIm51bWJlclwiICE9IHR5cGVvZiB0O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KSB8fCB0aGlzLmZpcmUobmV3IHQuRXJyb3JFdmVudChuZXcgdC5WYWxpZGF0aW9uRXJyb3IoXCJzb3VyY2VzLlwiICsgaSwgbnVsbCwgJ1wiY29vcmRpbmF0ZXNcIiBwcm9wZXJ0eSBtdXN0IGJlIGFuIGFycmF5IG9mIDQgbG9uZ2l0dWRlL2xhdGl0dWRlIGFycmF5IHBhaXJzJykpKSA6IHRoaXMuZmlyZShuZXcgdC5FcnJvckV2ZW50KG5ldyB0LlZhbGlkYXRpb25FcnJvcihcInNvdXJjZXMuXCIgKyBpLCBudWxsLCAnbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eSBcImNvb3JkaW5hdGVzXCInKSkpLCBvLmFuaW1hdGUgJiYgXCJib29sZWFuXCIgIT0gdHlwZW9mIG8uYW5pbWF0ZSAmJiB0aGlzLmZpcmUobmV3IHQuRXJyb3JFdmVudChuZXcgdC5WYWxpZGF0aW9uRXJyb3IoXCJzb3VyY2VzLlwiICsgaSwgbnVsbCwgJ29wdGlvbmFsIFwiYW5pbWF0ZVwiIHByb3BlcnR5IG11c3QgYmUgYSBib29sZWFuIHZhbHVlJykpKSwgby5jYW52YXMgPyBcInN0cmluZ1wiID09IHR5cGVvZiBvLmNhbnZhcyB8fCBvLmNhbnZhcyBpbnN0YW5jZW9mIHQud2luZG93LkhUTUxDYW52YXNFbGVtZW50IHx8IHRoaXMuZmlyZShuZXcgdC5FcnJvckV2ZW50KG5ldyB0LlZhbGlkYXRpb25FcnJvcihcInNvdXJjZXMuXCIgKyBpLCBudWxsLCAnXCJjYW52YXNcIiBtdXN0IGJlIGVpdGhlciBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIElEIG9mIHRoZSBjYW52YXMgZWxlbWVudCBmcm9tIHdoaWNoIHRvIHJlYWQsIG9yIGFuIEhUTUxDYW52YXNFbGVtZW50IGluc3RhbmNlJykpKSA6IHRoaXMuZmlyZShuZXcgdC5FcnJvckV2ZW50KG5ldyB0LlZhbGlkYXRpb25FcnJvcihcInNvdXJjZXMuXCIgKyBpLCBudWxsLCAnbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eSBcImNhbnZhc1wiJykpKSwgdGhpcy5vcHRpb25zID0gbywgdGhpcy5hbmltYXRlID0gdm9pZCAwID09PSBvLmFuaW1hdGUgfHwgby5hbmltYXRlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZSAmJiAoaS5fX3Byb3RvX18gPSBlKSwgKGkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShlICYmIGUucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBpLCBpLnByb3RvdHlwZS5sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9sb2FkZWQgPSAhMCwgdGhpcy5jYW52YXMgfHwgKHRoaXMuY2FudmFzID0gdGhpcy5vcHRpb25zLmNhbnZhcyBpbnN0YW5jZW9mIHQud2luZG93LkhUTUxDYW52YXNFbGVtZW50ID8gdGhpcy5vcHRpb25zLmNhbnZhcyA6IHQud2luZG93LmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMub3B0aW9ucy5jYW52YXMpKSwgdGhpcy53aWR0aCA9IHRoaXMuY2FudmFzLndpZHRoLCB0aGlzLmhlaWdodCA9IHRoaXMuY2FudmFzLmhlaWdodCwgdGhpcy5faGFzSW52YWxpZERpbWVuc2lvbnMoKSA/IHRoaXMuZmlyZShuZXcgdC5FcnJvckV2ZW50KG5ldyBFcnJvcihcIkNhbnZhcyBkaW1lbnNpb25zIGNhbm5vdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gemVyby5cIikpKSA6ICh0aGlzLnBsYXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdGhpcy5fcGxheWluZyA9ICEwLCB0aGlzLm1hcC50cmlnZ2VyUmVwYWludCgpO1xuICAgICAgICB9LCB0aGlzLnBhdXNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRoaXMuX3BsYXlpbmcgJiYgKHRoaXMucHJlcGFyZSgpLCB0aGlzLl9wbGF5aW5nID0gITEpO1xuICAgICAgICB9LCB0aGlzLl9maW5pc2hMb2FkaW5nKCkpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuZ2V0Q2FudmFzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYW52YXM7XG4gICAgICB9LCBpLnByb3RvdHlwZS5vbkFkZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHRoaXMubWFwID0gdCwgdGhpcy5sb2FkKCksIHRoaXMuY2FudmFzICYmIHRoaXMuYW5pbWF0ZSAmJiB0aGlzLnBsYXkoKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLm9uUmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnBhdXNlKCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5wcmVwYXJlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZSA9ICExO1xuXG4gICAgICAgIGlmICh0aGlzLmNhbnZhcy53aWR0aCAhPT0gdGhpcy53aWR0aCAmJiAodGhpcy53aWR0aCA9IHRoaXMuY2FudmFzLndpZHRoLCBlID0gITApLCB0aGlzLmNhbnZhcy5oZWlnaHQgIT09IHRoaXMuaGVpZ2h0ICYmICh0aGlzLmhlaWdodCA9IHRoaXMuY2FudmFzLmhlaWdodCwgZSA9ICEwKSwgIXRoaXMuX2hhc0ludmFsaWREaW1lbnNpb25zKCkgJiYgMCAhPT0gT2JqZWN0LmtleXModGhpcy50aWxlcykubGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIGkgPSB0aGlzLm1hcC5wYWludGVyLmNvbnRleHQsXG4gICAgICAgICAgICAgIG8gPSBpLmdsO1xuXG4gICAgICAgICAgZm9yICh2YXIgciBpbiB0aGlzLmJvdW5kc0J1ZmZlciB8fCAodGhpcy5ib3VuZHNCdWZmZXIgPSBpLmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLl9ib3VuZHNBcnJheSwgQS5tZW1iZXJzKSksIHRoaXMuYm91bmRzU2VnbWVudHMgfHwgKHRoaXMuYm91bmRzU2VnbWVudHMgPSB0LlNlZ21lbnRWZWN0b3Iuc2ltcGxlU2VnbWVudCgwLCAwLCA0LCAyKSksIHRoaXMudGV4dHVyZSA/IChlIHx8IHRoaXMuX3BsYXlpbmcpICYmIHRoaXMudGV4dHVyZS51cGRhdGUodGhpcy5jYW52YXMsIHtcbiAgICAgICAgICAgIHByZW11bHRpcGx5OiAhMFxuICAgICAgICAgIH0pIDogdGhpcy50ZXh0dXJlID0gbmV3IHQuVGV4dHVyZShpLCB0aGlzLmNhbnZhcywgby5SR0JBLCB7XG4gICAgICAgICAgICBwcmVtdWx0aXBseTogITBcbiAgICAgICAgICB9KSwgdGhpcy50aWxlcykge1xuICAgICAgICAgICAgdmFyIGEgPSB0aGlzLnRpbGVzW3JdO1xuICAgICAgICAgICAgXCJsb2FkZWRcIiAhPT0gYS5zdGF0ZSAmJiAoYS5zdGF0ZSA9IFwibG9hZGVkXCIsIGEudGV4dHVyZSA9IHRoaXMudGV4dHVyZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCBpLnByb3RvdHlwZS5zZXJpYWxpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogXCJjYW52YXNcIixcbiAgICAgICAgICBjb29yZGluYXRlczogdGhpcy5jb29yZGluYXRlc1xuICAgICAgICB9O1xuICAgICAgfSwgaS5wcm90b3R5cGUuaGFzVHJhbnNpdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BsYXlpbmc7XG4gICAgICB9LCBpLnByb3RvdHlwZS5faGFzSW52YWxpZERpbWVuc2lvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvciAodmFyIHQgPSAwLCBlID0gW3RoaXMuY2FudmFzLndpZHRoLCB0aGlzLmNhbnZhcy5oZWlnaHRdOyB0IDwgZS5sZW5ndGg7IHQgKz0gMSkge1xuICAgICAgICAgIHZhciBpID0gZVt0XTtcbiAgICAgICAgICBpZiAoaXNOYU4oaSkgfHwgaSA8PSAwKSByZXR1cm4gITA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gITE7XG4gICAgICB9LCBpO1xuICAgIH0oTSksXG4gICAgICAgIGsgPSB7XG4gICAgICB2ZWN0b3I6IFMsXG4gICAgICByYXN0ZXI6IEMsXG4gICAgICBcInJhc3Rlci1kZW1cIjogeixcbiAgICAgIGdlb2pzb246IEQsXG4gICAgICB2aWRlbzogTCxcbiAgICAgIGltYWdlOiBNLFxuICAgICAgY2FudmFzOiBSXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIEIoZSwgaSkge1xuICAgICAgdmFyIG8gPSB0LmlkZW50aXR5KFtdKTtcbiAgICAgIHJldHVybiB0LnRyYW5zbGF0ZShvLCBvLCBbMSwgMSwgMF0pLCB0LnNjYWxlKG8sIG8sIFsuNSAqIGUud2lkdGgsIC41ICogZS5oZWlnaHQsIDFdKSwgdC5tdWx0aXBseShvLCBvLCBlLmNhbGN1bGF0ZVBvc01hdHJpeChpLnRvVW53cmFwcGVkKCkpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBPKHQsIGUsIGksIG8sIHIsIGEpIHtcbiAgICAgIHZhciBuID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcbiAgICAgICAgaWYgKHQpIGZvciAodmFyIG8gPSAwLCByID0gdDsgbyA8IHIubGVuZ3RoOyBvICs9IDEpIHtcbiAgICAgICAgICB2YXIgYSA9IGVbcltvXV07XG4gICAgICAgICAgaWYgKGEgJiYgYS5zb3VyY2UgPT09IGkgJiYgXCJmaWxsLWV4dHJ1c2lvblwiID09PSBhLnR5cGUpIHJldHVybiAhMDtcbiAgICAgICAgfSBlbHNlIGZvciAodmFyIG4gaW4gZSkge1xuICAgICAgICAgIHZhciBzID0gZVtuXTtcbiAgICAgICAgICBpZiAocy5zb3VyY2UgPT09IGkgJiYgXCJmaWxsLWV4dHJ1c2lvblwiID09PSBzLnR5cGUpIHJldHVybiAhMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gITE7XG4gICAgICB9KHIgJiYgci5sYXllcnMsIGUsIHQuaWQpLFxuICAgICAgICAgIHMgPSBhLm1heFBpdGNoU2NhbGVGYWN0b3IoKSxcbiAgICAgICAgICBsID0gdC50aWxlc0luKG8sIHMsIG4pO1xuXG4gICAgICBsLnNvcnQoRik7XG5cbiAgICAgIGZvciAodmFyIGMgPSBbXSwgdSA9IDAsIGggPSBsOyB1IDwgaC5sZW5ndGg7IHUgKz0gMSkge1xuICAgICAgICB2YXIgcCA9IGhbdV07XG4gICAgICAgIGMucHVzaCh7XG4gICAgICAgICAgd3JhcHBlZFRpbGVJRDogcC50aWxlSUQud3JhcHBlZCgpLmtleSxcbiAgICAgICAgICBxdWVyeVJlc3VsdHM6IHAudGlsZS5xdWVyeVJlbmRlcmVkRmVhdHVyZXMoZSwgaSwgdC5fc3RhdGUsIHAucXVlcnlHZW9tZXRyeSwgcC5jYW1lcmFRdWVyeUdlb21ldHJ5LCBwLnNjYWxlLCByLCBhLCBzLCBCKHQudHJhbnNmb3JtLCBwLnRpbGVJRCkpXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB2YXIgZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGZvciAodmFyIGUgPSB7fSwgaSA9IHt9LCBvID0gMCwgciA9IHQ7IG8gPCByLmxlbmd0aDsgbyArPSAxKSB7XG4gICAgICAgICAgdmFyIGEgPSByW29dLFxuICAgICAgICAgICAgICBuID0gYS5xdWVyeVJlc3VsdHMsXG4gICAgICAgICAgICAgIHMgPSBhLndyYXBwZWRUaWxlSUQsXG4gICAgICAgICAgICAgIGwgPSBpW3NdID0gaVtzXSB8fCB7fTtcblxuICAgICAgICAgIGZvciAodmFyIGMgaW4gbikge1xuICAgICAgICAgICAgZm9yICh2YXIgdSA9IG5bY10sIGggPSBsW2NdID0gbFtjXSB8fCB7fSwgcCA9IGVbY10gPSBlW2NdIHx8IFtdLCBkID0gMCwgXyA9IHU7IGQgPCBfLmxlbmd0aDsgZCArPSAxKSB7XG4gICAgICAgICAgICAgIHZhciBmID0gX1tkXTtcbiAgICAgICAgICAgICAgaFtmLmZlYXR1cmVJbmRleF0gfHwgKGhbZi5mZWF0dXJlSW5kZXhdID0gITAsIHAucHVzaChmKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KGMpO1xuXG4gICAgICBmb3IgKHZhciBfIGluIGQpIHtcbiAgICAgICAgZFtfXS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgdmFyIGkgPSBlLmZlYXR1cmUsXG4gICAgICAgICAgICAgIG8gPSB0LmdldEZlYXR1cmVTdGF0ZShpLmxheWVyW1wic291cmNlLWxheWVyXCJdLCBpLmlkKTtcbiAgICAgICAgICBpLnNvdXJjZSA9IGkubGF5ZXIuc291cmNlLCBpLmxheWVyW1wic291cmNlLWxheWVyXCJdICYmIChpLnNvdXJjZUxheWVyID0gaS5sYXllcltcInNvdXJjZS1sYXllclwiXSksIGkuc3RhdGUgPSBvO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gRih0LCBlKSB7XG4gICAgICB2YXIgaSA9IHQudGlsZUlELFxuICAgICAgICAgIG8gPSBlLnRpbGVJRDtcbiAgICAgIHJldHVybiBpLm92ZXJzY2FsZWRaIC0gby5vdmVyc2NhbGVkWiB8fCBpLmNhbm9uaWNhbC55IC0gby5jYW5vbmljYWwueSB8fCBpLndyYXAgLSBvLndyYXAgfHwgaS5jYW5vbmljYWwueCAtIG8uY2Fub25pY2FsLng7XG4gICAgfVxuXG4gICAgdmFyIFUgPSBmdW5jdGlvbiBVKHQsIGUpIHtcbiAgICAgIHRoaXMubWF4ID0gdCwgdGhpcy5vblJlbW92ZSA9IGUsIHRoaXMucmVzZXQoKTtcbiAgICB9O1xuXG4gICAgVS5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKHZhciB0IGluIHRoaXMuZGF0YSkge1xuICAgICAgICBmb3IgKHZhciBlID0gMCwgaSA9IHRoaXMuZGF0YVt0XTsgZSA8IGkubGVuZ3RoOyBlICs9IDEpIHtcbiAgICAgICAgICB2YXIgbyA9IGlbZV07XG4gICAgICAgICAgby50aW1lb3V0ICYmIGNsZWFyVGltZW91dChvLnRpbWVvdXQpLCB0aGlzLm9uUmVtb3ZlKG8udmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmRhdGEgPSB7fSwgdGhpcy5vcmRlciA9IFtdLCB0aGlzO1xuICAgIH0sIFUucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICB2YXIgbyA9IHRoaXMsXG4gICAgICAgICAgciA9IHQud3JhcHBlZCgpLmtleTtcbiAgICAgIHZvaWQgMCA9PT0gdGhpcy5kYXRhW3JdICYmICh0aGlzLmRhdGFbcl0gPSBbXSk7XG4gICAgICB2YXIgYSA9IHtcbiAgICAgICAgdmFsdWU6IGUsXG4gICAgICAgIHRpbWVvdXQ6IHZvaWQgMFxuICAgICAgfTtcblxuICAgICAgaWYgKHZvaWQgMCAhPT0gaSAmJiAoYS50aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIG8ucmVtb3ZlKHQsIGEpO1xuICAgICAgfSwgaSkpLCB0aGlzLmRhdGFbcl0ucHVzaChhKSwgdGhpcy5vcmRlci5wdXNoKHIpLCB0aGlzLm9yZGVyLmxlbmd0aCA+IHRoaXMubWF4KSB7XG4gICAgICAgIHZhciBuID0gdGhpcy5fZ2V0QW5kUmVtb3ZlQnlLZXkodGhpcy5vcmRlclswXSk7XG5cbiAgICAgICAgbiAmJiB0aGlzLm9uUmVtb3ZlKG4pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LCBVLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHQud3JhcHBlZCgpLmtleSBpbiB0aGlzLmRhdGE7XG4gICAgfSwgVS5wcm90b3R5cGUuZ2V0QW5kUmVtb3ZlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhcyh0KSA/IHRoaXMuX2dldEFuZFJlbW92ZUJ5S2V5KHQud3JhcHBlZCgpLmtleSkgOiBudWxsO1xuICAgIH0sIFUucHJvdG90eXBlLl9nZXRBbmRSZW1vdmVCeUtleSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2YXIgZSA9IHRoaXMuZGF0YVt0XS5zaGlmdCgpO1xuICAgICAgcmV0dXJuIGUudGltZW91dCAmJiBjbGVhclRpbWVvdXQoZS50aW1lb3V0KSwgMCA9PT0gdGhpcy5kYXRhW3RdLmxlbmd0aCAmJiBkZWxldGUgdGhpcy5kYXRhW3RdLCB0aGlzLm9yZGVyLnNwbGljZSh0aGlzLm9yZGVyLmluZGV4T2YodCksIDEpLCBlLnZhbHVlO1xuICAgIH0sIFUucHJvdG90eXBlLmdldEJ5S2V5ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHZhciBlID0gdGhpcy5kYXRhW3RdO1xuICAgICAgcmV0dXJuIGUgPyBlWzBdLnZhbHVlIDogbnVsbDtcbiAgICB9LCBVLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzKHQpID8gdGhpcy5kYXRhW3Qud3JhcHBlZCgpLmtleV1bMF0udmFsdWUgOiBudWxsO1xuICAgIH0sIFUucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICBpZiAoIXRoaXMuaGFzKHQpKSByZXR1cm4gdGhpcztcbiAgICAgIHZhciBpID0gdC53cmFwcGVkKCkua2V5LFxuICAgICAgICAgIG8gPSB2b2lkIDAgPT09IGUgPyAwIDogdGhpcy5kYXRhW2ldLmluZGV4T2YoZSksXG4gICAgICAgICAgciA9IHRoaXMuZGF0YVtpXVtvXTtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFbaV0uc3BsaWNlKG8sIDEpLCByLnRpbWVvdXQgJiYgY2xlYXJUaW1lb3V0KHIudGltZW91dCksIDAgPT09IHRoaXMuZGF0YVtpXS5sZW5ndGggJiYgZGVsZXRlIHRoaXMuZGF0YVtpXSwgdGhpcy5vblJlbW92ZShyLnZhbHVlKSwgdGhpcy5vcmRlci5zcGxpY2UodGhpcy5vcmRlci5pbmRleE9mKGkpLCAxKSwgdGhpcztcbiAgICB9LCBVLnByb3RvdHlwZS5zZXRNYXhTaXplID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZvciAodGhpcy5tYXggPSB0OyB0aGlzLm9yZGVyLmxlbmd0aCA+IHRoaXMubWF4Oykge1xuICAgICAgICB2YXIgZSA9IHRoaXMuX2dldEFuZFJlbW92ZUJ5S2V5KHRoaXMub3JkZXJbMF0pO1xuXG4gICAgICAgIGUgJiYgdGhpcy5vblJlbW92ZShlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSwgVS5wcm90b3R5cGUuZmlsdGVyID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHZhciBlID0gW107XG5cbiAgICAgIGZvciAodmFyIGkgaW4gdGhpcy5kYXRhKSB7XG4gICAgICAgIGZvciAodmFyIG8gPSAwLCByID0gdGhpcy5kYXRhW2ldOyBvIDwgci5sZW5ndGg7IG8gKz0gMSkge1xuICAgICAgICAgIHZhciBhID0gcltvXTtcbiAgICAgICAgICB0KGEudmFsdWUpIHx8IGUucHVzaChhKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBuID0gMCwgcyA9IGU7IG4gPCBzLmxlbmd0aDsgbiArPSAxKSB7XG4gICAgICAgIHZhciBsID0gc1tuXTtcbiAgICAgICAgdGhpcy5yZW1vdmUobC52YWx1ZS50aWxlSUQsIGwpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgTiA9IGZ1bmN0aW9uIE4odCwgZSwgaSkge1xuICAgICAgdGhpcy5jb250ZXh0ID0gdDtcbiAgICAgIHZhciBvID0gdC5nbDtcbiAgICAgIHRoaXMuYnVmZmVyID0gby5jcmVhdGVCdWZmZXIoKSwgdGhpcy5keW5hbWljRHJhdyA9IEJvb2xlYW4oaSksIHRoaXMuY29udGV4dC51bmJpbmRWQU8oKSwgdC5iaW5kRWxlbWVudEJ1ZmZlci5zZXQodGhpcy5idWZmZXIpLCBvLmJ1ZmZlckRhdGEoby5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgZS5hcnJheUJ1ZmZlciwgdGhpcy5keW5hbWljRHJhdyA/IG8uRFlOQU1JQ19EUkFXIDogby5TVEFUSUNfRFJBVyksIHRoaXMuZHluYW1pY0RyYXcgfHwgZGVsZXRlIGUuYXJyYXlCdWZmZXI7XG4gICAgfTtcblxuICAgIE4ucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLmNvbnRleHQuYmluZEVsZW1lbnRCdWZmZXIuc2V0KHRoaXMuYnVmZmVyKTtcbiAgICB9LCBOLnByb3RvdHlwZS51cGRhdGVEYXRhID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHZhciBlID0gdGhpcy5jb250ZXh0LmdsO1xuICAgICAgdGhpcy5jb250ZXh0LnVuYmluZFZBTygpLCB0aGlzLmJpbmQoKSwgZS5idWZmZXJTdWJEYXRhKGUuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIDAsIHQuYXJyYXlCdWZmZXIpO1xuICAgIH0sIE4ucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLmJ1ZmZlciAmJiAodGhpcy5jb250ZXh0LmdsLmRlbGV0ZUJ1ZmZlcih0aGlzLmJ1ZmZlciksIGRlbGV0ZSB0aGlzLmJ1ZmZlcik7XG4gICAgfTtcblxuICAgIHZhciBaID0ge1xuICAgICAgSW50ODogXCJCWVRFXCIsXG4gICAgICBVaW50ODogXCJVTlNJR05FRF9CWVRFXCIsXG4gICAgICBJbnQxNjogXCJTSE9SVFwiLFxuICAgICAgVWludDE2OiBcIlVOU0lHTkVEX1NIT1JUXCIsXG4gICAgICBJbnQzMjogXCJJTlRcIixcbiAgICAgIFVpbnQzMjogXCJVTlNJR05FRF9JTlRcIixcbiAgICAgIEZsb2F0MzI6IFwiRkxPQVRcIlxuICAgIH0sXG4gICAgICAgIHEgPSBmdW5jdGlvbiBxKHQsIGUsIGksIG8pIHtcbiAgICAgIHRoaXMubGVuZ3RoID0gZS5sZW5ndGgsIHRoaXMuYXR0cmlidXRlcyA9IGksIHRoaXMuaXRlbVNpemUgPSBlLmJ5dGVzUGVyRWxlbWVudCwgdGhpcy5keW5hbWljRHJhdyA9IG8sIHRoaXMuY29udGV4dCA9IHQ7XG4gICAgICB2YXIgciA9IHQuZ2w7XG4gICAgICB0aGlzLmJ1ZmZlciA9IHIuY3JlYXRlQnVmZmVyKCksIHQuYmluZFZlcnRleEJ1ZmZlci5zZXQodGhpcy5idWZmZXIpLCByLmJ1ZmZlckRhdGEoci5BUlJBWV9CVUZGRVIsIGUuYXJyYXlCdWZmZXIsIHRoaXMuZHluYW1pY0RyYXcgPyByLkRZTkFNSUNfRFJBVyA6IHIuU1RBVElDX0RSQVcpLCB0aGlzLmR5bmFtaWNEcmF3IHx8IGRlbGV0ZSBlLmFycmF5QnVmZmVyO1xuICAgIH07XG5cbiAgICBxLnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5jb250ZXh0LmJpbmRWZXJ0ZXhCdWZmZXIuc2V0KHRoaXMuYnVmZmVyKTtcbiAgICB9LCBxLnByb3RvdHlwZS51cGRhdGVEYXRhID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHZhciBlID0gdGhpcy5jb250ZXh0LmdsO1xuICAgICAgdGhpcy5iaW5kKCksIGUuYnVmZmVyU3ViRGF0YShlLkFSUkFZX0JVRkZFUiwgMCwgdC5hcnJheUJ1ZmZlcik7XG4gICAgfSwgcS5wcm90b3R5cGUuZW5hYmxlQXR0cmlidXRlcyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbyA9IGUuYXR0cmlidXRlc1t0aGlzLmF0dHJpYnV0ZXNbaV0ubmFtZV07XG4gICAgICAgIHZvaWQgMCAhPT0gbyAmJiB0LmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KG8pO1xuICAgICAgfVxuICAgIH0sIHEucHJvdG90eXBlLnNldFZlcnRleEF0dHJpYlBvaW50ZXJzID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcbiAgICAgIGZvciAodmFyIG8gPSAwOyBvIDwgdGhpcy5hdHRyaWJ1dGVzLmxlbmd0aDsgbysrKSB7XG4gICAgICAgIHZhciByID0gdGhpcy5hdHRyaWJ1dGVzW29dLFxuICAgICAgICAgICAgYSA9IGUuYXR0cmlidXRlc1tyLm5hbWVdO1xuICAgICAgICB2b2lkIDAgIT09IGEgJiYgdC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGEsIHIuY29tcG9uZW50cywgdFtaW3IudHlwZV1dLCAhMSwgdGhpcy5pdGVtU2l6ZSwgci5vZmZzZXQgKyB0aGlzLml0ZW1TaXplICogKGkgfHwgMCkpO1xuICAgICAgfVxuICAgIH0sIHEucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLmJ1ZmZlciAmJiAodGhpcy5jb250ZXh0LmdsLmRlbGV0ZUJ1ZmZlcih0aGlzLmJ1ZmZlciksIGRlbGV0ZSB0aGlzLmJ1ZmZlcik7XG4gICAgfTtcblxuICAgIHZhciBqID0gZnVuY3Rpb24gaih0KSB7XG4gICAgICB0aGlzLmdsID0gdC5nbCwgdGhpcy5kZWZhdWx0ID0gdGhpcy5nZXREZWZhdWx0KCksIHRoaXMuY3VycmVudCA9IHRoaXMuZGVmYXVsdCwgdGhpcy5kaXJ0eSA9ICExO1xuICAgIH07XG5cbiAgICBqLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jdXJyZW50O1xuICAgIH0sIGoucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uICh0KSB7fSwgai5wcm90b3R5cGUuZ2V0RGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLmRlZmF1bHQ7XG4gICAgfSwgai5wcm90b3R5cGUuc2V0RGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuc2V0KHRoaXMuZGVmYXVsdCk7XG4gICAgfTtcblxuICAgIHZhciBWID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGZ1bmN0aW9uIGkoKSB7XG4gICAgICAgIGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGUgJiYgKGkuX19wcm90b19fID0gZSksIChpLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoZSAmJiBlLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gaSwgaS5wcm90b3R5cGUuZ2V0RGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHQuQ29sb3IudHJhbnNwYXJlbnQ7XG4gICAgICB9LCBpLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgZSA9IHRoaXMuY3VycmVudDtcbiAgICAgICAgKHQuciAhPT0gZS5yIHx8IHQuZyAhPT0gZS5nIHx8IHQuYiAhPT0gZS5iIHx8IHQuYSAhPT0gZS5hIHx8IHRoaXMuZGlydHkpICYmICh0aGlzLmdsLmNsZWFyQ29sb3IodC5yLCB0LmcsIHQuYiwgdC5hKSwgdGhpcy5jdXJyZW50ID0gdCwgdGhpcy5kaXJ0eSA9ICExKTtcbiAgICAgIH0sIGk7XG4gICAgfShqKSxcbiAgICAgICAgRyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLmdldERlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfSwgZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgKHQgIT09IHRoaXMuY3VycmVudCB8fCB0aGlzLmRpcnR5KSAmJiAodGhpcy5nbC5jbGVhckRlcHRoKHQpLCB0aGlzLmN1cnJlbnQgPSB0LCB0aGlzLmRpcnR5ID0gITEpO1xuICAgICAgfSwgZTtcbiAgICB9KGopLFxuICAgICAgICBXID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuZ2V0RGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9LCBlLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICAodCAhPT0gdGhpcy5jdXJyZW50IHx8IHRoaXMuZGlydHkpICYmICh0aGlzLmdsLmNsZWFyU3RlbmNpbCh0KSwgdGhpcy5jdXJyZW50ID0gdCwgdGhpcy5kaXJ0eSA9ICExKTtcbiAgICAgIH0sIGU7XG4gICAgfShqKSxcbiAgICAgICAgWCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLmdldERlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBbITAsICEwLCAhMCwgITBdO1xuICAgICAgfSwgZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdmFyIGUgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICAgICh0WzBdICE9PSBlWzBdIHx8IHRbMV0gIT09IGVbMV0gfHwgdFsyXSAhPT0gZVsyXSB8fCB0WzNdICE9PSBlWzNdIHx8IHRoaXMuZGlydHkpICYmICh0aGlzLmdsLmNvbG9yTWFzayh0WzBdLCB0WzFdLCB0WzJdLCB0WzNdKSwgdGhpcy5jdXJyZW50ID0gdCwgdGhpcy5kaXJ0eSA9ICExKTtcbiAgICAgIH0sIGU7XG4gICAgfShqKSxcbiAgICAgICAgSCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLmdldERlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAhMDtcbiAgICAgIH0sIGUucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICh0ICE9PSB0aGlzLmN1cnJlbnQgfHwgdGhpcy5kaXJ0eSkgJiYgKHRoaXMuZ2wuZGVwdGhNYXNrKHQpLCB0aGlzLmN1cnJlbnQgPSB0LCB0aGlzLmRpcnR5ID0gITEpO1xuICAgICAgfSwgZTtcbiAgICB9KGopLFxuICAgICAgICBLID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuZ2V0RGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIDI1NTtcbiAgICAgIH0sIGUucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICh0ICE9PSB0aGlzLmN1cnJlbnQgfHwgdGhpcy5kaXJ0eSkgJiYgKHRoaXMuZ2wuc3RlbmNpbE1hc2sodCksIHRoaXMuY3VycmVudCA9IHQsIHRoaXMuZGlydHkgPSAhMSk7XG4gICAgICB9LCBlO1xuICAgIH0oaiksXG4gICAgICAgIFkgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5nZXREZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGZ1bmM6IHRoaXMuZ2wuQUxXQVlTLFxuICAgICAgICAgIHJlZjogMCxcbiAgICAgICAgICBtYXNrOiAyNTVcbiAgICAgICAgfTtcbiAgICAgIH0sIGUucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHZhciBlID0gdGhpcy5jdXJyZW50O1xuICAgICAgICAodC5mdW5jICE9PSBlLmZ1bmMgfHwgdC5yZWYgIT09IGUucmVmIHx8IHQubWFzayAhPT0gZS5tYXNrIHx8IHRoaXMuZGlydHkpICYmICh0aGlzLmdsLnN0ZW5jaWxGdW5jKHQuZnVuYywgdC5yZWYsIHQubWFzayksIHRoaXMuY3VycmVudCA9IHQsIHRoaXMuZGlydHkgPSAhMSk7XG4gICAgICB9LCBlO1xuICAgIH0oaiksXG4gICAgICAgIEogPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5nZXREZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdCA9IHRoaXMuZ2w7XG4gICAgICAgIHJldHVybiBbdC5LRUVQLCB0LktFRVAsIHQuS0VFUF07XG4gICAgICB9LCBlLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgZSA9IHRoaXMuY3VycmVudDtcbiAgICAgICAgKHRbMF0gIT09IGVbMF0gfHwgdFsxXSAhPT0gZVsxXSB8fCB0WzJdICE9PSBlWzJdIHx8IHRoaXMuZGlydHkpICYmICh0aGlzLmdsLnN0ZW5jaWxPcCh0WzBdLCB0WzFdLCB0WzJdKSwgdGhpcy5jdXJyZW50ID0gdCwgdGhpcy5kaXJ0eSA9ICExKTtcbiAgICAgIH0sIGU7XG4gICAgfShqKSxcbiAgICAgICAgUSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLmdldERlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAhMTtcbiAgICAgIH0sIGUucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGlmICh0ICE9PSB0aGlzLmN1cnJlbnQgfHwgdGhpcy5kaXJ0eSkge1xuICAgICAgICAgIHZhciBlID0gdGhpcy5nbDtcbiAgICAgICAgICB0ID8gZS5lbmFibGUoZS5TVEVOQ0lMX1RFU1QpIDogZS5kaXNhYmxlKGUuU1RFTkNJTF9URVNUKSwgdGhpcy5jdXJyZW50ID0gdCwgdGhpcy5kaXJ0eSA9ICExO1xuICAgICAgICB9XG4gICAgICB9LCBlO1xuICAgIH0oaiksXG4gICAgICAgICQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5nZXREZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gWzAsIDFdO1xuICAgICAgfSwgZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdmFyIGUgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICAgICh0WzBdICE9PSBlWzBdIHx8IHRbMV0gIT09IGVbMV0gfHwgdGhpcy5kaXJ0eSkgJiYgKHRoaXMuZ2wuZGVwdGhSYW5nZSh0WzBdLCB0WzFdKSwgdGhpcy5jdXJyZW50ID0gdCwgdGhpcy5kaXJ0eSA9ICExKTtcbiAgICAgIH0sIGU7XG4gICAgfShqKSxcbiAgICAgICAgdHQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5nZXREZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gITE7XG4gICAgICB9LCBlLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICBpZiAodCAhPT0gdGhpcy5jdXJyZW50IHx8IHRoaXMuZGlydHkpIHtcbiAgICAgICAgICB2YXIgZSA9IHRoaXMuZ2w7XG4gICAgICAgICAgdCA/IGUuZW5hYmxlKGUuREVQVEhfVEVTVCkgOiBlLmRpc2FibGUoZS5ERVBUSF9URVNUKSwgdGhpcy5jdXJyZW50ID0gdCwgdGhpcy5kaXJ0eSA9ICExO1xuICAgICAgICB9XG4gICAgICB9LCBlO1xuICAgIH0oaiksXG4gICAgICAgIGV0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuZ2V0RGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2wuTEVTUztcbiAgICAgIH0sIGUucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICh0ICE9PSB0aGlzLmN1cnJlbnQgfHwgdGhpcy5kaXJ0eSkgJiYgKHRoaXMuZ2wuZGVwdGhGdW5jKHQpLCB0aGlzLmN1cnJlbnQgPSB0LCB0aGlzLmRpcnR5ID0gITEpO1xuICAgICAgfSwgZTtcbiAgICB9KGopLFxuICAgICAgICBpdCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLmdldERlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAhMTtcbiAgICAgIH0sIGUucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGlmICh0ICE9PSB0aGlzLmN1cnJlbnQgfHwgdGhpcy5kaXJ0eSkge1xuICAgICAgICAgIHZhciBlID0gdGhpcy5nbDtcbiAgICAgICAgICB0ID8gZS5lbmFibGUoZS5CTEVORCkgOiBlLmRpc2FibGUoZS5CTEVORCksIHRoaXMuY3VycmVudCA9IHQsIHRoaXMuZGlydHkgPSAhMTtcbiAgICAgICAgfVxuICAgICAgfSwgZTtcbiAgICB9KGopLFxuICAgICAgICBvdCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLmdldERlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB0ID0gdGhpcy5nbDtcbiAgICAgICAgcmV0dXJuIFt0Lk9ORSwgdC5aRVJPXTtcbiAgICAgIH0sIGUucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHZhciBlID0gdGhpcy5jdXJyZW50O1xuICAgICAgICAodFswXSAhPT0gZVswXSB8fCB0WzFdICE9PSBlWzFdIHx8IHRoaXMuZGlydHkpICYmICh0aGlzLmdsLmJsZW5kRnVuYyh0WzBdLCB0WzFdKSwgdGhpcy5jdXJyZW50ID0gdCwgdGhpcy5kaXJ0eSA9ICExKTtcbiAgICAgIH0sIGU7XG4gICAgfShqKSxcbiAgICAgICAgcnQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgZnVuY3Rpb24gaSgpIHtcbiAgICAgICAgZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZSAmJiAoaS5fX3Byb3RvX18gPSBlKSwgKGkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShlICYmIGUucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBpLCBpLnByb3RvdHlwZS5nZXREZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdC5Db2xvci50cmFuc3BhcmVudDtcbiAgICAgIH0sIGkucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHZhciBlID0gdGhpcy5jdXJyZW50O1xuICAgICAgICAodC5yICE9PSBlLnIgfHwgdC5nICE9PSBlLmcgfHwgdC5iICE9PSBlLmIgfHwgdC5hICE9PSBlLmEgfHwgdGhpcy5kaXJ0eSkgJiYgKHRoaXMuZ2wuYmxlbmRDb2xvcih0LnIsIHQuZywgdC5iLCB0LmEpLCB0aGlzLmN1cnJlbnQgPSB0LCB0aGlzLmRpcnR5ID0gITEpO1xuICAgICAgfSwgaTtcbiAgICB9KGopLFxuICAgICAgICBhdCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLmdldERlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdsLkZVTkNfQUREO1xuICAgICAgfSwgZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgKHQgIT09IHRoaXMuY3VycmVudCB8fCB0aGlzLmRpcnR5KSAmJiAodGhpcy5nbC5ibGVuZEVxdWF0aW9uKHQpLCB0aGlzLmN1cnJlbnQgPSB0LCB0aGlzLmRpcnR5ID0gITEpO1xuICAgICAgfSwgZTtcbiAgICB9KGopLFxuICAgICAgICBudCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLmdldERlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAhMTtcbiAgICAgIH0sIGUucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGlmICh0ICE9PSB0aGlzLmN1cnJlbnQgfHwgdGhpcy5kaXJ0eSkge1xuICAgICAgICAgIHZhciBlID0gdGhpcy5nbDtcbiAgICAgICAgICB0ID8gZS5lbmFibGUoZS5DVUxMX0ZBQ0UpIDogZS5kaXNhYmxlKGUuQ1VMTF9GQUNFKSwgdGhpcy5jdXJyZW50ID0gdCwgdGhpcy5kaXJ0eSA9ICExO1xuICAgICAgICB9XG4gICAgICB9LCBlO1xuICAgIH0oaiksXG4gICAgICAgIHN0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuZ2V0RGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2wuQkFDSztcbiAgICAgIH0sIGUucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICh0ICE9PSB0aGlzLmN1cnJlbnQgfHwgdGhpcy5kaXJ0eSkgJiYgKHRoaXMuZ2wuY3VsbEZhY2UodCksIHRoaXMuY3VycmVudCA9IHQsIHRoaXMuZGlydHkgPSAhMSk7XG4gICAgICB9LCBlO1xuICAgIH0oaiksXG4gICAgICAgIGx0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuZ2V0RGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2wuQ0NXO1xuICAgICAgfSwgZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgKHQgIT09IHRoaXMuY3VycmVudCB8fCB0aGlzLmRpcnR5KSAmJiAodGhpcy5nbC5mcm9udEZhY2UodCksIHRoaXMuY3VycmVudCA9IHQsIHRoaXMuZGlydHkgPSAhMSk7XG4gICAgICB9LCBlO1xuICAgIH0oaiksXG4gICAgICAgIGN0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuZ2V0RGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9LCBlLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICAodCAhPT0gdGhpcy5jdXJyZW50IHx8IHRoaXMuZGlydHkpICYmICh0aGlzLmdsLnVzZVByb2dyYW0odCksIHRoaXMuY3VycmVudCA9IHQsIHRoaXMuZGlydHkgPSAhMSk7XG4gICAgICB9LCBlO1xuICAgIH0oaiksXG4gICAgICAgIHV0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuZ2V0RGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2wuVEVYVFVSRTA7XG4gICAgICB9LCBlLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICAodCAhPT0gdGhpcy5jdXJyZW50IHx8IHRoaXMuZGlydHkpICYmICh0aGlzLmdsLmFjdGl2ZVRleHR1cmUodCksIHRoaXMuY3VycmVudCA9IHQsIHRoaXMuZGlydHkgPSAhMSk7XG4gICAgICB9LCBlO1xuICAgIH0oaiksXG4gICAgICAgIGh0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuZ2V0RGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHQgPSB0aGlzLmdsO1xuICAgICAgICByZXR1cm4gWzAsIDAsIHQuZHJhd2luZ0J1ZmZlcldpZHRoLCB0LmRyYXdpbmdCdWZmZXJIZWlnaHRdO1xuICAgICAgfSwgZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdmFyIGUgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICAgICh0WzBdICE9PSBlWzBdIHx8IHRbMV0gIT09IGVbMV0gfHwgdFsyXSAhPT0gZVsyXSB8fCB0WzNdICE9PSBlWzNdIHx8IHRoaXMuZGlydHkpICYmICh0aGlzLmdsLnZpZXdwb3J0KHRbMF0sIHRbMV0sIHRbMl0sIHRbM10pLCB0aGlzLmN1cnJlbnQgPSB0LCB0aGlzLmRpcnR5ID0gITEpO1xuICAgICAgfSwgZTtcbiAgICB9KGopLFxuICAgICAgICBwdCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLmdldERlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSwgZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgaWYgKHQgIT09IHRoaXMuY3VycmVudCB8fCB0aGlzLmRpcnR5KSB7XG4gICAgICAgICAgdmFyIGUgPSB0aGlzLmdsO1xuICAgICAgICAgIGUuYmluZEZyYW1lYnVmZmVyKGUuRlJBTUVCVUZGRVIsIHQpLCB0aGlzLmN1cnJlbnQgPSB0LCB0aGlzLmRpcnR5ID0gITE7XG4gICAgICAgIH1cbiAgICAgIH0sIGU7XG4gICAgfShqKSxcbiAgICAgICAgZHQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5nZXREZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0sIGUucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGlmICh0ICE9PSB0aGlzLmN1cnJlbnQgfHwgdGhpcy5kaXJ0eSkge1xuICAgICAgICAgIHZhciBlID0gdGhpcy5nbDtcbiAgICAgICAgICBlLmJpbmRSZW5kZXJidWZmZXIoZS5SRU5ERVJCVUZGRVIsIHQpLCB0aGlzLmN1cnJlbnQgPSB0LCB0aGlzLmRpcnR5ID0gITE7XG4gICAgICAgIH1cbiAgICAgIH0sIGU7XG4gICAgfShqKSxcbiAgICAgICAgX3QgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5nZXREZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0sIGUucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGlmICh0ICE9PSB0aGlzLmN1cnJlbnQgfHwgdGhpcy5kaXJ0eSkge1xuICAgICAgICAgIHZhciBlID0gdGhpcy5nbDtcbiAgICAgICAgICBlLmJpbmRUZXh0dXJlKGUuVEVYVFVSRV8yRCwgdCksIHRoaXMuY3VycmVudCA9IHQsIHRoaXMuZGlydHkgPSAhMTtcbiAgICAgICAgfVxuICAgICAgfSwgZTtcbiAgICB9KGopLFxuICAgICAgICBmdCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLmdldERlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSwgZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgaWYgKHQgIT09IHRoaXMuY3VycmVudCB8fCB0aGlzLmRpcnR5KSB7XG4gICAgICAgICAgdmFyIGUgPSB0aGlzLmdsO1xuICAgICAgICAgIGUuYmluZEJ1ZmZlcihlLkFSUkFZX0JVRkZFUiwgdCksIHRoaXMuY3VycmVudCA9IHQsIHRoaXMuZGlydHkgPSAhMTtcbiAgICAgICAgfVxuICAgICAgfSwgZTtcbiAgICB9KGopLFxuICAgICAgICBtdCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLmdldERlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSwgZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdmFyIGUgPSB0aGlzLmdsO1xuICAgICAgICBlLmJpbmRCdWZmZXIoZS5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgdCksIHRoaXMuY3VycmVudCA9IHQsIHRoaXMuZGlydHkgPSAhMTtcbiAgICAgIH0sIGU7XG4gICAgfShqKSxcbiAgICAgICAgZ3QgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZShlKSB7XG4gICAgICAgIHQuY2FsbCh0aGlzLCBlKSwgdGhpcy52YW8gPSBlLmV4dFZlcnRleEFycmF5T2JqZWN0O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5nZXREZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0sIGUucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHRoaXMudmFvICYmICh0ICE9PSB0aGlzLmN1cnJlbnQgfHwgdGhpcy5kaXJ0eSkgJiYgKHRoaXMudmFvLmJpbmRWZXJ0ZXhBcnJheU9FUyh0KSwgdGhpcy5jdXJyZW50ID0gdCwgdGhpcy5kaXJ0eSA9ICExKTtcbiAgICAgIH0sIGU7XG4gICAgfShqKSxcbiAgICAgICAgdnQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5nZXREZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gNDtcbiAgICAgIH0sIGUucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGlmICh0ICE9PSB0aGlzLmN1cnJlbnQgfHwgdGhpcy5kaXJ0eSkge1xuICAgICAgICAgIHZhciBlID0gdGhpcy5nbDtcbiAgICAgICAgICBlLnBpeGVsU3RvcmVpKGUuVU5QQUNLX0FMSUdOTUVOVCwgdCksIHRoaXMuY3VycmVudCA9IHQsIHRoaXMuZGlydHkgPSAhMTtcbiAgICAgICAgfVxuICAgICAgfSwgZTtcbiAgICB9KGopLFxuICAgICAgICB5dCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLmdldERlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAhMTtcbiAgICAgIH0sIGUucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGlmICh0ICE9PSB0aGlzLmN1cnJlbnQgfHwgdGhpcy5kaXJ0eSkge1xuICAgICAgICAgIHZhciBlID0gdGhpcy5nbDtcbiAgICAgICAgICBlLnBpeGVsU3RvcmVpKGUuVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMLCB0KSwgdGhpcy5jdXJyZW50ID0gdCwgdGhpcy5kaXJ0eSA9ICExO1xuICAgICAgICB9XG4gICAgICB9LCBlO1xuICAgIH0oaiksXG4gICAgICAgIHh0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuZ2V0RGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICExO1xuICAgICAgfSwgZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgaWYgKHQgIT09IHRoaXMuY3VycmVudCB8fCB0aGlzLmRpcnR5KSB7XG4gICAgICAgICAgdmFyIGUgPSB0aGlzLmdsO1xuICAgICAgICAgIGUucGl4ZWxTdG9yZWkoZS5VTlBBQ0tfRkxJUF9ZX1dFQkdMLCB0KSwgdGhpcy5jdXJyZW50ID0gdCwgdGhpcy5kaXJ0eSA9ICExO1xuICAgICAgICB9XG4gICAgICB9LCBlO1xuICAgIH0oaiksXG4gICAgICAgIGJ0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoZSwgaSkge1xuICAgICAgICB0LmNhbGwodGhpcywgZSksIHRoaXMuY29udGV4dCA9IGUsIHRoaXMucGFyZW50ID0gaTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuZ2V0RGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9LCBlO1xuICAgIH0oaiksXG4gICAgICAgIHd0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuc2V0RGlydHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZGlydHkgPSAhMDtcbiAgICAgIH0sIGUucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGlmICh0ICE9PSB0aGlzLmN1cnJlbnQgfHwgdGhpcy5kaXJ0eSkge1xuICAgICAgICAgIHRoaXMuY29udGV4dC5iaW5kRnJhbWVidWZmZXIuc2V0KHRoaXMucGFyZW50KTtcbiAgICAgICAgICB2YXIgZSA9IHRoaXMuZ2w7XG4gICAgICAgICAgZS5mcmFtZWJ1ZmZlclRleHR1cmUyRChlLkZSQU1FQlVGRkVSLCBlLkNPTE9SX0FUVEFDSE1FTlQwLCBlLlRFWFRVUkVfMkQsIHQsIDApLCB0aGlzLmN1cnJlbnQgPSB0LCB0aGlzLmRpcnR5ID0gITE7XG4gICAgICAgIH1cbiAgICAgIH0sIGU7XG4gICAgfShidCksXG4gICAgICAgIFR0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgaWYgKHQgIT09IHRoaXMuY3VycmVudCB8fCB0aGlzLmRpcnR5KSB7XG4gICAgICAgICAgdGhpcy5jb250ZXh0LmJpbmRGcmFtZWJ1ZmZlci5zZXQodGhpcy5wYXJlbnQpO1xuICAgICAgICAgIHZhciBlID0gdGhpcy5nbDtcbiAgICAgICAgICBlLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKGUuRlJBTUVCVUZGRVIsIGUuREVQVEhfQVRUQUNITUVOVCwgZS5SRU5ERVJCVUZGRVIsIHQpLCB0aGlzLmN1cnJlbnQgPSB0LCB0aGlzLmRpcnR5ID0gITE7XG4gICAgICAgIH1cbiAgICAgIH0sIGU7XG4gICAgfShidCksXG4gICAgICAgIEV0ID0gZnVuY3Rpb24gRXQodCwgZSwgaSwgbykge1xuICAgICAgdGhpcy5jb250ZXh0ID0gdCwgdGhpcy53aWR0aCA9IGUsIHRoaXMuaGVpZ2h0ID0gaTtcbiAgICAgIHZhciByID0gdGhpcy5mcmFtZWJ1ZmZlciA9IHQuZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTtcbiAgICAgIHRoaXMuY29sb3JBdHRhY2htZW50ID0gbmV3IHd0KHQsIHIpLCBvICYmICh0aGlzLmRlcHRoQXR0YWNobWVudCA9IG5ldyBUdCh0LCByKSk7XG4gICAgfTtcblxuICAgIEV0LnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHQgPSB0aGlzLmNvbnRleHQuZ2wsXG4gICAgICAgICAgZSA9IHRoaXMuY29sb3JBdHRhY2htZW50LmdldCgpO1xuXG4gICAgICBpZiAoZSAmJiB0LmRlbGV0ZVRleHR1cmUoZSksIHRoaXMuZGVwdGhBdHRhY2htZW50KSB7XG4gICAgICAgIHZhciBpID0gdGhpcy5kZXB0aEF0dGFjaG1lbnQuZ2V0KCk7XG4gICAgICAgIGkgJiYgdC5kZWxldGVSZW5kZXJidWZmZXIoaSk7XG4gICAgICB9XG5cbiAgICAgIHQuZGVsZXRlRnJhbWVidWZmZXIodGhpcy5mcmFtZWJ1ZmZlcik7XG4gICAgfTtcblxuICAgIHZhciBJdCA9IGZ1bmN0aW9uIEl0KHQsIGUsIGkpIHtcbiAgICAgIHRoaXMuZnVuYyA9IHQsIHRoaXMubWFzayA9IGUsIHRoaXMucmFuZ2UgPSBpO1xuICAgIH07XG5cbiAgICBJdC5SZWFkT25seSA9ICExLCBJdC5SZWFkV3JpdGUgPSAhMCwgSXQuZGlzYWJsZWQgPSBuZXcgSXQoNTE5LCBJdC5SZWFkT25seSwgWzAsIDFdKTtcblxuICAgIHZhciBQdCA9IGZ1bmN0aW9uIFB0KHQsIGUsIGksIG8sIHIsIGEpIHtcbiAgICAgIHRoaXMudGVzdCA9IHQsIHRoaXMucmVmID0gZSwgdGhpcy5tYXNrID0gaSwgdGhpcy5mYWlsID0gbywgdGhpcy5kZXB0aEZhaWwgPSByLCB0aGlzLnBhc3MgPSBhO1xuICAgIH07XG5cbiAgICBQdC5kaXNhYmxlZCA9IG5ldyBQdCh7XG4gICAgICBmdW5jOiA1MTksXG4gICAgICBtYXNrOiAwXG4gICAgfSwgMCwgMCwgNzY4MCwgNzY4MCwgNzY4MCk7XG5cbiAgICB2YXIgU3QgPSBmdW5jdGlvbiBTdCh0LCBlLCBpKSB7XG4gICAgICB0aGlzLmJsZW5kRnVuY3Rpb24gPSB0LCB0aGlzLmJsZW5kQ29sb3IgPSBlLCB0aGlzLm1hc2sgPSBpO1xuICAgIH07XG5cbiAgICBTdC5kaXNhYmxlZCA9IG5ldyBTdChTdC5SZXBsYWNlID0gWzEsIDBdLCB0LkNvbG9yLnRyYW5zcGFyZW50LCBbITEsICExLCAhMSwgITFdKSwgU3QudW5ibGVuZGVkID0gbmV3IFN0KFN0LlJlcGxhY2UsIHQuQ29sb3IudHJhbnNwYXJlbnQsIFshMCwgITAsICEwLCAhMF0pLCBTdC5hbHBoYUJsZW5kZWQgPSBuZXcgU3QoWzEsIDc3MV0sIHQuQ29sb3IudHJhbnNwYXJlbnQsIFshMCwgITAsICEwLCAhMF0pO1xuXG4gICAgdmFyIEN0ID0gZnVuY3Rpb24gQ3QodCwgZSwgaSkge1xuICAgICAgdGhpcy5lbmFibGUgPSB0LCB0aGlzLm1vZGUgPSBlLCB0aGlzLmZyb250RmFjZSA9IGk7XG4gICAgfTtcblxuICAgIEN0LmRpc2FibGVkID0gbmV3IEN0KCExLCAxMDI5LCAyMzA1KSwgQ3QuYmFja0NDVyA9IG5ldyBDdCghMCwgMTAyOSwgMjMwNSk7XG5cbiAgICB2YXIgenQgPSBmdW5jdGlvbiB6dCh0KSB7XG4gICAgICB0aGlzLmdsID0gdCwgdGhpcy5leHRWZXJ0ZXhBcnJheU9iamVjdCA9IHRoaXMuZ2wuZ2V0RXh0ZW5zaW9uKFwiT0VTX3ZlcnRleF9hcnJheV9vYmplY3RcIiksIHRoaXMuY2xlYXJDb2xvciA9IG5ldyBWKHRoaXMpLCB0aGlzLmNsZWFyRGVwdGggPSBuZXcgRyh0aGlzKSwgdGhpcy5jbGVhclN0ZW5jaWwgPSBuZXcgVyh0aGlzKSwgdGhpcy5jb2xvck1hc2sgPSBuZXcgWCh0aGlzKSwgdGhpcy5kZXB0aE1hc2sgPSBuZXcgSCh0aGlzKSwgdGhpcy5zdGVuY2lsTWFzayA9IG5ldyBLKHRoaXMpLCB0aGlzLnN0ZW5jaWxGdW5jID0gbmV3IFkodGhpcyksIHRoaXMuc3RlbmNpbE9wID0gbmV3IEoodGhpcyksIHRoaXMuc3RlbmNpbFRlc3QgPSBuZXcgUSh0aGlzKSwgdGhpcy5kZXB0aFJhbmdlID0gbmV3ICQodGhpcyksIHRoaXMuZGVwdGhUZXN0ID0gbmV3IHR0KHRoaXMpLCB0aGlzLmRlcHRoRnVuYyA9IG5ldyBldCh0aGlzKSwgdGhpcy5ibGVuZCA9IG5ldyBpdCh0aGlzKSwgdGhpcy5ibGVuZEZ1bmMgPSBuZXcgb3QodGhpcyksIHRoaXMuYmxlbmRDb2xvciA9IG5ldyBydCh0aGlzKSwgdGhpcy5ibGVuZEVxdWF0aW9uID0gbmV3IGF0KHRoaXMpLCB0aGlzLmN1bGxGYWNlID0gbmV3IG50KHRoaXMpLCB0aGlzLmN1bGxGYWNlU2lkZSA9IG5ldyBzdCh0aGlzKSwgdGhpcy5mcm9udEZhY2UgPSBuZXcgbHQodGhpcyksIHRoaXMucHJvZ3JhbSA9IG5ldyBjdCh0aGlzKSwgdGhpcy5hY3RpdmVUZXh0dXJlID0gbmV3IHV0KHRoaXMpLCB0aGlzLnZpZXdwb3J0ID0gbmV3IGh0KHRoaXMpLCB0aGlzLmJpbmRGcmFtZWJ1ZmZlciA9IG5ldyBwdCh0aGlzKSwgdGhpcy5iaW5kUmVuZGVyYnVmZmVyID0gbmV3IGR0KHRoaXMpLCB0aGlzLmJpbmRUZXh0dXJlID0gbmV3IF90KHRoaXMpLCB0aGlzLmJpbmRWZXJ0ZXhCdWZmZXIgPSBuZXcgZnQodGhpcyksIHRoaXMuYmluZEVsZW1lbnRCdWZmZXIgPSBuZXcgbXQodGhpcyksIHRoaXMuYmluZFZlcnRleEFycmF5T0VTID0gdGhpcy5leHRWZXJ0ZXhBcnJheU9iamVjdCAmJiBuZXcgZ3QodGhpcyksIHRoaXMucGl4ZWxTdG9yZVVucGFjayA9IG5ldyB2dCh0aGlzKSwgdGhpcy5waXhlbFN0b3JlVW5wYWNrUHJlbXVsdGlwbHlBbHBoYSA9IG5ldyB5dCh0aGlzKSwgdGhpcy5waXhlbFN0b3JlVW5wYWNrRmxpcFkgPSBuZXcgeHQodGhpcyksIHRoaXMuZXh0VGV4dHVyZUZpbHRlckFuaXNvdHJvcGljID0gdC5nZXRFeHRlbnNpb24oXCJFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWNcIikgfHwgdC5nZXRFeHRlbnNpb24oXCJNT1pfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljXCIpIHx8IHQuZ2V0RXh0ZW5zaW9uKFwiV0VCS0lUX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpY1wiKSwgdGhpcy5leHRUZXh0dXJlRmlsdGVyQW5pc290cm9waWMgJiYgKHRoaXMuZXh0VGV4dHVyZUZpbHRlckFuaXNvdHJvcGljTWF4ID0gdC5nZXRQYXJhbWV0ZXIodGhpcy5leHRUZXh0dXJlRmlsdGVyQW5pc290cm9waWMuTUFYX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUKSksIHRoaXMuZXh0VGV4dHVyZUhhbGZGbG9hdCA9IHQuZ2V0RXh0ZW5zaW9uKFwiT0VTX3RleHR1cmVfaGFsZl9mbG9hdFwiKSwgdGhpcy5leHRUZXh0dXJlSGFsZkZsb2F0ICYmICh0LmdldEV4dGVuc2lvbihcIk9FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyXCIpLCB0aGlzLmV4dFJlbmRlclRvVGV4dHVyZUhhbGZGbG9hdCA9IHQuZ2V0RXh0ZW5zaW9uKFwiRVhUX2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0XCIpKSwgdGhpcy5leHRUaW1lclF1ZXJ5ID0gdC5nZXRFeHRlbnNpb24oXCJFWFRfZGlzam9pbnRfdGltZXJfcXVlcnlcIiksIHRoaXMubWF4VGV4dHVyZVNpemUgPSB0LmdldFBhcmFtZXRlcih0Lk1BWF9URVhUVVJFX1NJWkUpO1xuICAgIH07XG5cbiAgICB6dC5wcm90b3R5cGUuc2V0RGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMudW5iaW5kVkFPKCksIHRoaXMuY2xlYXJDb2xvci5zZXREZWZhdWx0KCksIHRoaXMuY2xlYXJEZXB0aC5zZXREZWZhdWx0KCksIHRoaXMuY2xlYXJTdGVuY2lsLnNldERlZmF1bHQoKSwgdGhpcy5jb2xvck1hc2suc2V0RGVmYXVsdCgpLCB0aGlzLmRlcHRoTWFzay5zZXREZWZhdWx0KCksIHRoaXMuc3RlbmNpbE1hc2suc2V0RGVmYXVsdCgpLCB0aGlzLnN0ZW5jaWxGdW5jLnNldERlZmF1bHQoKSwgdGhpcy5zdGVuY2lsT3Auc2V0RGVmYXVsdCgpLCB0aGlzLnN0ZW5jaWxUZXN0LnNldERlZmF1bHQoKSwgdGhpcy5kZXB0aFJhbmdlLnNldERlZmF1bHQoKSwgdGhpcy5kZXB0aFRlc3Quc2V0RGVmYXVsdCgpLCB0aGlzLmRlcHRoRnVuYy5zZXREZWZhdWx0KCksIHRoaXMuYmxlbmQuc2V0RGVmYXVsdCgpLCB0aGlzLmJsZW5kRnVuYy5zZXREZWZhdWx0KCksIHRoaXMuYmxlbmRDb2xvci5zZXREZWZhdWx0KCksIHRoaXMuYmxlbmRFcXVhdGlvbi5zZXREZWZhdWx0KCksIHRoaXMuY3VsbEZhY2Uuc2V0RGVmYXVsdCgpLCB0aGlzLmN1bGxGYWNlU2lkZS5zZXREZWZhdWx0KCksIHRoaXMuZnJvbnRGYWNlLnNldERlZmF1bHQoKSwgdGhpcy5wcm9ncmFtLnNldERlZmF1bHQoKSwgdGhpcy5hY3RpdmVUZXh0dXJlLnNldERlZmF1bHQoKSwgdGhpcy5iaW5kRnJhbWVidWZmZXIuc2V0RGVmYXVsdCgpLCB0aGlzLnBpeGVsU3RvcmVVbnBhY2suc2V0RGVmYXVsdCgpLCB0aGlzLnBpeGVsU3RvcmVVbnBhY2tQcmVtdWx0aXBseUFscGhhLnNldERlZmF1bHQoKSwgdGhpcy5waXhlbFN0b3JlVW5wYWNrRmxpcFkuc2V0RGVmYXVsdCgpO1xuICAgIH0sIHp0LnByb3RvdHlwZS5zZXREaXJ0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuY2xlYXJDb2xvci5kaXJ0eSA9ICEwLCB0aGlzLmNsZWFyRGVwdGguZGlydHkgPSAhMCwgdGhpcy5jbGVhclN0ZW5jaWwuZGlydHkgPSAhMCwgdGhpcy5jb2xvck1hc2suZGlydHkgPSAhMCwgdGhpcy5kZXB0aE1hc2suZGlydHkgPSAhMCwgdGhpcy5zdGVuY2lsTWFzay5kaXJ0eSA9ICEwLCB0aGlzLnN0ZW5jaWxGdW5jLmRpcnR5ID0gITAsIHRoaXMuc3RlbmNpbE9wLmRpcnR5ID0gITAsIHRoaXMuc3RlbmNpbFRlc3QuZGlydHkgPSAhMCwgdGhpcy5kZXB0aFJhbmdlLmRpcnR5ID0gITAsIHRoaXMuZGVwdGhUZXN0LmRpcnR5ID0gITAsIHRoaXMuZGVwdGhGdW5jLmRpcnR5ID0gITAsIHRoaXMuYmxlbmQuZGlydHkgPSAhMCwgdGhpcy5ibGVuZEZ1bmMuZGlydHkgPSAhMCwgdGhpcy5ibGVuZENvbG9yLmRpcnR5ID0gITAsIHRoaXMuYmxlbmRFcXVhdGlvbi5kaXJ0eSA9ICEwLCB0aGlzLmN1bGxGYWNlLmRpcnR5ID0gITAsIHRoaXMuY3VsbEZhY2VTaWRlLmRpcnR5ID0gITAsIHRoaXMuZnJvbnRGYWNlLmRpcnR5ID0gITAsIHRoaXMucHJvZ3JhbS5kaXJ0eSA9ICEwLCB0aGlzLmFjdGl2ZVRleHR1cmUuZGlydHkgPSAhMCwgdGhpcy52aWV3cG9ydC5kaXJ0eSA9ICEwLCB0aGlzLmJpbmRGcmFtZWJ1ZmZlci5kaXJ0eSA9ICEwLCB0aGlzLmJpbmRSZW5kZXJidWZmZXIuZGlydHkgPSAhMCwgdGhpcy5iaW5kVGV4dHVyZS5kaXJ0eSA9ICEwLCB0aGlzLmJpbmRWZXJ0ZXhCdWZmZXIuZGlydHkgPSAhMCwgdGhpcy5iaW5kRWxlbWVudEJ1ZmZlci5kaXJ0eSA9ICEwLCB0aGlzLmV4dFZlcnRleEFycmF5T2JqZWN0ICYmICh0aGlzLmJpbmRWZXJ0ZXhBcnJheU9FUy5kaXJ0eSA9ICEwKSwgdGhpcy5waXhlbFN0b3JlVW5wYWNrLmRpcnR5ID0gITAsIHRoaXMucGl4ZWxTdG9yZVVucGFja1ByZW11bHRpcGx5QWxwaGEuZGlydHkgPSAhMCwgdGhpcy5waXhlbFN0b3JlVW5wYWNrRmxpcFkuZGlydHkgPSAhMDtcbiAgICB9LCB6dC5wcm90b3R5cGUuY3JlYXRlSW5kZXhCdWZmZXIgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgcmV0dXJuIG5ldyBOKHRoaXMsIHQsIGUpO1xuICAgIH0sIHp0LnByb3RvdHlwZS5jcmVhdGVWZXJ0ZXhCdWZmZXIgPSBmdW5jdGlvbiAodCwgZSwgaSkge1xuICAgICAgcmV0dXJuIG5ldyBxKHRoaXMsIHQsIGUsIGkpO1xuICAgIH0sIHp0LnByb3RvdHlwZS5jcmVhdGVSZW5kZXJidWZmZXIgPSBmdW5jdGlvbiAodCwgZSwgaSkge1xuICAgICAgdmFyIG8gPSB0aGlzLmdsLFxuICAgICAgICAgIHIgPSBvLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpO1xuICAgICAgcmV0dXJuIHRoaXMuYmluZFJlbmRlcmJ1ZmZlci5zZXQociksIG8ucmVuZGVyYnVmZmVyU3RvcmFnZShvLlJFTkRFUkJVRkZFUiwgdCwgZSwgaSksIHRoaXMuYmluZFJlbmRlcmJ1ZmZlci5zZXQobnVsbCksIHI7XG4gICAgfSwgenQucHJvdG90eXBlLmNyZWF0ZUZyYW1lYnVmZmVyID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcbiAgICAgIHJldHVybiBuZXcgRXQodGhpcywgdCwgZSwgaSk7XG4gICAgfSwgenQucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHZhciBlID0gdC5jb2xvcixcbiAgICAgICAgICBpID0gdC5kZXB0aCxcbiAgICAgICAgICBvID0gdGhpcy5nbCxcbiAgICAgICAgICByID0gMDtcbiAgICAgIGUgJiYgKHIgfD0gby5DT0xPUl9CVUZGRVJfQklULCB0aGlzLmNsZWFyQ29sb3Iuc2V0KGUpLCB0aGlzLmNvbG9yTWFzay5zZXQoWyEwLCAhMCwgITAsICEwXSkpLCB2b2lkIDAgIT09IGkgJiYgKHIgfD0gby5ERVBUSF9CVUZGRVJfQklULCB0aGlzLmRlcHRoUmFuZ2Uuc2V0KFswLCAxXSksIHRoaXMuY2xlYXJEZXB0aC5zZXQoaSksIHRoaXMuZGVwdGhNYXNrLnNldCghMCkpLCBvLmNsZWFyKHIpO1xuICAgIH0sIHp0LnByb3RvdHlwZS5zZXRDdWxsRmFjZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAhMSA9PT0gdC5lbmFibGUgPyB0aGlzLmN1bGxGYWNlLnNldCghMSkgOiAodGhpcy5jdWxsRmFjZS5zZXQoITApLCB0aGlzLmN1bGxGYWNlU2lkZS5zZXQodC5tb2RlKSwgdGhpcy5mcm9udEZhY2Uuc2V0KHQuZnJvbnRGYWNlKSk7XG4gICAgfSwgenQucHJvdG90eXBlLnNldERlcHRoTW9kZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0LmZ1bmMgIT09IHRoaXMuZ2wuQUxXQVlTIHx8IHQubWFzayA/ICh0aGlzLmRlcHRoVGVzdC5zZXQoITApLCB0aGlzLmRlcHRoRnVuYy5zZXQodC5mdW5jKSwgdGhpcy5kZXB0aE1hc2suc2V0KHQubWFzayksIHRoaXMuZGVwdGhSYW5nZS5zZXQodC5yYW5nZSkpIDogdGhpcy5kZXB0aFRlc3Quc2V0KCExKTtcbiAgICB9LCB6dC5wcm90b3R5cGUuc2V0U3RlbmNpbE1vZGUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdC50ZXN0LmZ1bmMgIT09IHRoaXMuZ2wuQUxXQVlTIHx8IHQubWFzayA/ICh0aGlzLnN0ZW5jaWxUZXN0LnNldCghMCksIHRoaXMuc3RlbmNpbE1hc2suc2V0KHQubWFzayksIHRoaXMuc3RlbmNpbE9wLnNldChbdC5mYWlsLCB0LmRlcHRoRmFpbCwgdC5wYXNzXSksIHRoaXMuc3RlbmNpbEZ1bmMuc2V0KHtcbiAgICAgICAgZnVuYzogdC50ZXN0LmZ1bmMsXG4gICAgICAgIHJlZjogdC5yZWYsXG4gICAgICAgIG1hc2s6IHQudGVzdC5tYXNrXG4gICAgICB9KSkgOiB0aGlzLnN0ZW5jaWxUZXN0LnNldCghMSk7XG4gICAgfSwgenQucHJvdG90eXBlLnNldENvbG9yTW9kZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB0LmRlZXBFcXVhbChlLmJsZW5kRnVuY3Rpb24sIFN0LlJlcGxhY2UpID8gdGhpcy5ibGVuZC5zZXQoITEpIDogKHRoaXMuYmxlbmQuc2V0KCEwKSwgdGhpcy5ibGVuZEZ1bmMuc2V0KGUuYmxlbmRGdW5jdGlvbiksIHRoaXMuYmxlbmRDb2xvci5zZXQoZS5ibGVuZENvbG9yKSksIHRoaXMuY29sb3JNYXNrLnNldChlLm1hc2spO1xuICAgIH0sIHp0LnByb3RvdHlwZS51bmJpbmRWQU8gPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLmV4dFZlcnRleEFycmF5T2JqZWN0ICYmIHRoaXMuYmluZFZlcnRleEFycmF5T0VTLnNldChudWxsKTtcbiAgICB9O1xuXG4gICAgdmFyIER0ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGZ1bmN0aW9uIGkoaSwgbywgcikge1xuICAgICAgICB2YXIgYSA9IHRoaXM7XG4gICAgICAgIGUuY2FsbCh0aGlzKSwgdGhpcy5pZCA9IGksIHRoaXMuZGlzcGF0Y2hlciA9IHIsIHRoaXMub24oXCJkYXRhXCIsIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgXCJzb3VyY2VcIiA9PT0gdC5kYXRhVHlwZSAmJiBcIm1ldGFkYXRhXCIgPT09IHQuc291cmNlRGF0YVR5cGUgJiYgKGEuX3NvdXJjZUxvYWRlZCA9ICEwKSwgYS5fc291cmNlTG9hZGVkICYmICFhLl9wYXVzZWQgJiYgXCJzb3VyY2VcIiA9PT0gdC5kYXRhVHlwZSAmJiBcImNvbnRlbnRcIiA9PT0gdC5zb3VyY2VEYXRhVHlwZSAmJiAoYS5yZWxvYWQoKSwgYS50cmFuc2Zvcm0gJiYgYS51cGRhdGUoYS50cmFuc2Zvcm0pKTtcbiAgICAgICAgfSksIHRoaXMub24oXCJlcnJvclwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgYS5fc291cmNlRXJyb3JlZCA9ICEwO1xuICAgICAgICB9KSwgdGhpcy5fc291cmNlID0gZnVuY3Rpb24gKGUsIGksIG8sIHIpIHtcbiAgICAgICAgICB2YXIgYSA9IG5ldyBrW2kudHlwZV0oZSwgaSwgbywgcik7XG4gICAgICAgICAgaWYgKGEuaWQgIT09IGUpIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIFNvdXJjZSBpZCB0byBiZSBcIiArIGUgKyBcIiBpbnN0ZWFkIG9mIFwiICsgYS5pZCk7XG4gICAgICAgICAgcmV0dXJuIHQuYmluZEFsbChbXCJsb2FkXCIsIFwiYWJvcnRcIiwgXCJ1bmxvYWRcIiwgXCJzZXJpYWxpemVcIiwgXCJwcmVwYXJlXCJdLCBhKSwgYTtcbiAgICAgICAgfShpLCBvLCByLCB0aGlzKSwgdGhpcy5fdGlsZXMgPSB7fSwgdGhpcy5fY2FjaGUgPSBuZXcgVSgwLCB0aGlzLl91bmxvYWRUaWxlLmJpbmQodGhpcykpLCB0aGlzLl90aW1lcnMgPSB7fSwgdGhpcy5fY2FjaGVUaW1lcnMgPSB7fSwgdGhpcy5fbWF4VGlsZUNhY2hlU2l6ZSA9IG51bGwsIHRoaXMuX2xvYWRlZFBhcmVudFRpbGVzID0ge30sIHRoaXMuX2NvdmVyZWRUaWxlcyA9IHt9LCB0aGlzLl9zdGF0ZSA9IG5ldyB0LlNvdXJjZUZlYXR1cmVTdGF0ZSgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZSAmJiAoaS5fX3Byb3RvX18gPSBlKSwgKGkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShlICYmIGUucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBpLCBpLnByb3RvdHlwZS5vbkFkZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHRoaXMubWFwID0gdCwgdGhpcy5fbWF4VGlsZUNhY2hlU2l6ZSA9IHQgPyB0Ll9tYXhUaWxlQ2FjaGVTaXplIDogbnVsbCwgdGhpcy5fc291cmNlICYmIHRoaXMuX3NvdXJjZS5vbkFkZCAmJiB0aGlzLl9zb3VyY2Uub25BZGQodCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5vblJlbW92ZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHRoaXMuX3NvdXJjZSAmJiB0aGlzLl9zb3VyY2Uub25SZW1vdmUgJiYgdGhpcy5fc291cmNlLm9uUmVtb3ZlKHQpO1xuICAgICAgfSwgaS5wcm90b3R5cGUubG9hZGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fc291cmNlRXJyb3JlZCkgcmV0dXJuICEwO1xuICAgICAgICBpZiAoIXRoaXMuX3NvdXJjZUxvYWRlZCkgcmV0dXJuICExO1xuICAgICAgICBpZiAoIXRoaXMuX3NvdXJjZS5sb2FkZWQoKSkgcmV0dXJuICExO1xuXG4gICAgICAgIGZvciAodmFyIHQgaW4gdGhpcy5fdGlsZXMpIHtcbiAgICAgICAgICB2YXIgZSA9IHRoaXMuX3RpbGVzW3RdO1xuICAgICAgICAgIGlmIChcImxvYWRlZFwiICE9PSBlLnN0YXRlICYmIFwiZXJyb3JlZFwiICE9PSBlLnN0YXRlKSByZXR1cm4gITE7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gITA7XG4gICAgICB9LCBpLnByb3RvdHlwZS5nZXRTb3VyY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zb3VyY2U7XG4gICAgICB9LCBpLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fcGF1c2VkID0gITA7XG4gICAgICB9LCBpLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLl9wYXVzZWQpIHtcbiAgICAgICAgICB2YXIgdCA9IHRoaXMuX3Nob3VsZFJlbG9hZE9uUmVzdW1lO1xuICAgICAgICAgIHRoaXMuX3BhdXNlZCA9ICExLCB0aGlzLl9zaG91bGRSZWxvYWRPblJlc3VtZSA9ICExLCB0ICYmIHRoaXMucmVsb2FkKCksIHRoaXMudHJhbnNmb3JtICYmIHRoaXMudXBkYXRlKHRoaXMudHJhbnNmb3JtKTtcbiAgICAgICAgfVxuICAgICAgfSwgaS5wcm90b3R5cGUuX2xvYWRUaWxlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvdXJjZS5sb2FkVGlsZSh0LCBlKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLl91bmxvYWRUaWxlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgaWYgKHRoaXMuX3NvdXJjZS51bmxvYWRUaWxlKSByZXR1cm4gdGhpcy5fc291cmNlLnVubG9hZFRpbGUodCwgZnVuY3Rpb24gKCkge30pO1xuICAgICAgfSwgaS5wcm90b3R5cGUuX2Fib3J0VGlsZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGlmICh0aGlzLl9zb3VyY2UuYWJvcnRUaWxlKSByZXR1cm4gdGhpcy5fc291cmNlLmFib3J0VGlsZSh0LCBmdW5jdGlvbiAoKSB7fSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5zZXJpYWxpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zb3VyY2Uuc2VyaWFsaXplKCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5wcmVwYXJlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgZm9yICh2YXIgZSBpbiB0aGlzLl9zb3VyY2UucHJlcGFyZSAmJiB0aGlzLl9zb3VyY2UucHJlcGFyZSgpLCB0aGlzLl9zdGF0ZS5jb2FsZXNjZUNoYW5nZXModGhpcy5fdGlsZXMsIHRoaXMubWFwID8gdGhpcy5tYXAucGFpbnRlciA6IG51bGwpLCB0aGlzLl90aWxlcykge1xuICAgICAgICAgIHZhciBpID0gdGhpcy5fdGlsZXNbZV07XG4gICAgICAgICAgaS51cGxvYWQodCksIGkucHJlcGFyZSh0aGlzLm1hcC5zdHlsZS5pbWFnZU1hbmFnZXIpO1xuICAgICAgICB9XG4gICAgICB9LCBpLnByb3RvdHlwZS5nZXRJZHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0LnZhbHVlcyh0aGlzLl90aWxlcykubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgcmV0dXJuIHQudGlsZUlEO1xuICAgICAgICB9KS5zb3J0KEF0KS5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICByZXR1cm4gdC5rZXk7XG4gICAgICAgIH0pO1xuICAgICAgfSwgaS5wcm90b3R5cGUuZ2V0UmVuZGVyYWJsZUlkcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBpID0gdGhpcyxcbiAgICAgICAgICAgIG8gPSBbXTtcblxuICAgICAgICBmb3IgKHZhciByIGluIHRoaXMuX3RpbGVzKSB7XG4gICAgICAgICAgdGhpcy5faXNJZFJlbmRlcmFibGUociwgZSkgJiYgby5wdXNoKHRoaXMuX3RpbGVzW3JdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlID8gby5zb3J0KGZ1bmN0aW9uIChlLCBvKSB7XG4gICAgICAgICAgdmFyIHIgPSBlLnRpbGVJRCxcbiAgICAgICAgICAgICAgYSA9IG8udGlsZUlELFxuICAgICAgICAgICAgICBuID0gbmV3IHQuUG9pbnQoci5jYW5vbmljYWwueCwgci5jYW5vbmljYWwueSkuX3JvdGF0ZShpLnRyYW5zZm9ybS5hbmdsZSksXG4gICAgICAgICAgICAgIHMgPSBuZXcgdC5Qb2ludChhLmNhbm9uaWNhbC54LCBhLmNhbm9uaWNhbC55KS5fcm90YXRlKGkudHJhbnNmb3JtLmFuZ2xlKTtcblxuICAgICAgICAgIHJldHVybiByLm92ZXJzY2FsZWRaIC0gYS5vdmVyc2NhbGVkWiB8fCBzLnkgLSBuLnkgfHwgcy54IC0gbi54O1xuICAgICAgICB9KS5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICByZXR1cm4gdC50aWxlSUQua2V5O1xuICAgICAgICB9KSA6IG8ubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgcmV0dXJuIHQudGlsZUlEO1xuICAgICAgICB9KS5zb3J0KEF0KS5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICByZXR1cm4gdC5rZXk7XG4gICAgICAgIH0pO1xuICAgICAgfSwgaS5wcm90b3R5cGUuaGFzUmVuZGVyYWJsZVBhcmVudCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHZhciBlID0gdGhpcy5maW5kTG9hZGVkUGFyZW50KHQsIDApO1xuICAgICAgICByZXR1cm4gISFlICYmIHRoaXMuX2lzSWRSZW5kZXJhYmxlKGUudGlsZUlELmtleSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5faXNJZFJlbmRlcmFibGUgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGlsZXNbdF0gJiYgdGhpcy5fdGlsZXNbdF0uaGFzRGF0YSgpICYmICF0aGlzLl9jb3ZlcmVkVGlsZXNbdF0gJiYgKGUgfHwgIXRoaXMuX3RpbGVzW3RdLmhvbGRpbmdGb3JGYWRlKCkpO1xuICAgICAgfSwgaS5wcm90b3R5cGUucmVsb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fcGF1c2VkKSB0aGlzLl9zaG91bGRSZWxvYWRPblJlc3VtZSA9ICEwO2Vsc2UgZm9yICh2YXIgdCBpbiB0aGlzLl9jYWNoZS5yZXNldCgpLCB0aGlzLl90aWxlcykge1xuICAgICAgICAgIFwiZXJyb3JlZFwiICE9PSB0aGlzLl90aWxlc1t0XS5zdGF0ZSAmJiB0aGlzLl9yZWxvYWRUaWxlKHQsIFwicmVsb2FkaW5nXCIpO1xuICAgICAgICB9XG4gICAgICB9LCBpLnByb3RvdHlwZS5fcmVsb2FkVGlsZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHZhciBpID0gdGhpcy5fdGlsZXNbdF07XG4gICAgICAgIGkgJiYgKFwibG9hZGluZ1wiICE9PSBpLnN0YXRlICYmIChpLnN0YXRlID0gZSksIHRoaXMuX2xvYWRUaWxlKGksIHRoaXMuX3RpbGVMb2FkZWQuYmluZCh0aGlzLCBpLCB0LCBlKSkpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuX3RpbGVMb2FkZWQgPSBmdW5jdGlvbiAoZSwgaSwgbywgcikge1xuICAgICAgICBpZiAocikgcmV0dXJuIGUuc3RhdGUgPSBcImVycm9yZWRcIiwgdm9pZCAoNDA0ICE9PSByLnN0YXR1cyA/IHRoaXMuX3NvdXJjZS5maXJlKG5ldyB0LkVycm9yRXZlbnQociwge1xuICAgICAgICAgIHRpbGU6IGVcbiAgICAgICAgfSkpIDogdGhpcy51cGRhdGUodGhpcy50cmFuc2Zvcm0pKTtcbiAgICAgICAgZS50aW1lQWRkZWQgPSB0LmJyb3dzZXIubm93KCksIFwiZXhwaXJlZFwiID09PSBvICYmIChlLnJlZnJlc2hlZFVwb25FeHBpcmF0aW9uID0gITApLCB0aGlzLl9zZXRUaWxlUmVsb2FkVGltZXIoaSwgZSksIFwicmFzdGVyLWRlbVwiID09PSB0aGlzLmdldFNvdXJjZSgpLnR5cGUgJiYgZS5kZW0gJiYgdGhpcy5fYmFja2ZpbGxERU0oZSksIHRoaXMuX3N0YXRlLmluaXRpYWxpemVUaWxlU3RhdGUoZSwgdGhpcy5tYXAgPyB0aGlzLm1hcC5wYWludGVyIDogbnVsbCksIHRoaXMuX3NvdXJjZS5maXJlKG5ldyB0LkV2ZW50KFwiZGF0YVwiLCB7XG4gICAgICAgICAgZGF0YVR5cGU6IFwic291cmNlXCIsXG4gICAgICAgICAgdGlsZTogZSxcbiAgICAgICAgICBjb29yZDogZS50aWxlSURcbiAgICAgICAgfSkpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuX2JhY2tmaWxsREVNID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgZm9yICh2YXIgZSA9IHRoaXMuZ2V0UmVuZGVyYWJsZUlkcygpLCBpID0gMDsgaSA8IGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgbyA9IGVbaV07XG5cbiAgICAgICAgICBpZiAodC5uZWlnaGJvcmluZ1RpbGVzICYmIHQubmVpZ2hib3JpbmdUaWxlc1tvXSkge1xuICAgICAgICAgICAgdmFyIHIgPSB0aGlzLmdldFRpbGVCeUlEKG8pO1xuICAgICAgICAgICAgYSh0LCByKSwgYShyLCB0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBhKHQsIGUpIHtcbiAgICAgICAgICB0Lm5lZWRzSGlsbHNoYWRlUHJlcGFyZSA9ICEwO1xuICAgICAgICAgIHZhciBpID0gZS50aWxlSUQuY2Fub25pY2FsLnggLSB0LnRpbGVJRC5jYW5vbmljYWwueCxcbiAgICAgICAgICAgICAgbyA9IGUudGlsZUlELmNhbm9uaWNhbC55IC0gdC50aWxlSUQuY2Fub25pY2FsLnksXG4gICAgICAgICAgICAgIHIgPSBNYXRoLnBvdygyLCB0LnRpbGVJRC5jYW5vbmljYWwueiksXG4gICAgICAgICAgICAgIGEgPSBlLnRpbGVJRC5rZXk7XG4gICAgICAgICAgMCA9PT0gaSAmJiAwID09PSBvIHx8IE1hdGguYWJzKG8pID4gMSB8fCAoTWF0aC5hYnMoaSkgPiAxICYmICgxID09PSBNYXRoLmFicyhpICsgcikgPyBpICs9IHIgOiAxID09PSBNYXRoLmFicyhpIC0gcikgJiYgKGkgLT0gcikpLCBlLmRlbSAmJiB0LmRlbSAmJiAodC5kZW0uYmFja2ZpbGxCb3JkZXIoZS5kZW0sIGksIG8pLCB0Lm5laWdoYm9yaW5nVGlsZXMgJiYgdC5uZWlnaGJvcmluZ1RpbGVzW2FdICYmICh0Lm5laWdoYm9yaW5nVGlsZXNbYV0uYmFja2ZpbGxlZCA9ICEwKSkpO1xuICAgICAgICB9XG4gICAgICB9LCBpLnByb3RvdHlwZS5nZXRUaWxlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VGlsZUJ5SUQodC5rZXkpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuZ2V0VGlsZUJ5SUQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGlsZXNbdF07XG4gICAgICB9LCBpLnByb3RvdHlwZS5fcmV0YWluTG9hZGVkQ2hpbGRyZW4gPSBmdW5jdGlvbiAodCwgZSwgaSwgbykge1xuICAgICAgICBmb3IgKHZhciByIGluIHRoaXMuX3RpbGVzKSB7XG4gICAgICAgICAgdmFyIGEgPSB0aGlzLl90aWxlc1tyXTtcblxuICAgICAgICAgIGlmICghKG9bcl0gfHwgIWEuaGFzRGF0YSgpIHx8IGEudGlsZUlELm92ZXJzY2FsZWRaIDw9IGUgfHwgYS50aWxlSUQub3ZlcnNjYWxlZFogPiBpKSkge1xuICAgICAgICAgICAgZm9yICh2YXIgbiA9IGEudGlsZUlEOyBhICYmIGEudGlsZUlELm92ZXJzY2FsZWRaID4gZSArIDE7KSB7XG4gICAgICAgICAgICAgIHZhciBzID0gYS50aWxlSUQuc2NhbGVkVG8oYS50aWxlSUQub3ZlcnNjYWxlZFogLSAxKTtcbiAgICAgICAgICAgICAgKGEgPSB0aGlzLl90aWxlc1tzLmtleV0pICYmIGEuaGFzRGF0YSgpICYmIChuID0gcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAodmFyIGwgPSBuOyBsLm92ZXJzY2FsZWRaID4gZTspIHtcbiAgICAgICAgICAgICAgaWYgKHRbKGwgPSBsLnNjYWxlZFRvKGwub3ZlcnNjYWxlZFogLSAxKSkua2V5XSkge1xuICAgICAgICAgICAgICAgIG9bbi5rZXldID0gbjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgaS5wcm90b3R5cGUuZmluZExvYWRlZFBhcmVudCA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIGlmICh0LmtleSBpbiB0aGlzLl9sb2FkZWRQYXJlbnRUaWxlcykge1xuICAgICAgICAgIHZhciBpID0gdGhpcy5fbG9hZGVkUGFyZW50VGlsZXNbdC5rZXldO1xuICAgICAgICAgIHJldHVybiBpICYmIGkudGlsZUlELm92ZXJzY2FsZWRaID49IGUgPyBpIDogbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIG8gPSB0Lm92ZXJzY2FsZWRaIC0gMTsgbyA+PSBlOyBvLS0pIHtcbiAgICAgICAgICB2YXIgciA9IHQuc2NhbGVkVG8obyksXG4gICAgICAgICAgICAgIGEgPSB0aGlzLl9nZXRMb2FkZWRUaWxlKHIpO1xuXG4gICAgICAgICAgaWYgKGEpIHJldHVybiBhO1xuICAgICAgICB9XG4gICAgICB9LCBpLnByb3RvdHlwZS5fZ2V0TG9hZGVkVGlsZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHZhciBlID0gdGhpcy5fdGlsZXNbdC5rZXldO1xuICAgICAgICByZXR1cm4gZSAmJiBlLmhhc0RhdGEoKSA/IGUgOiB0aGlzLl9jYWNoZS5nZXRCeUtleSh0LndyYXBwZWQoKS5rZXkpO1xuICAgICAgfSwgaS5wcm90b3R5cGUudXBkYXRlQ2FjaGVTaXplID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdmFyIGUgPSBNYXRoLmNlaWwodC53aWR0aCAvIHRoaXMuX3NvdXJjZS50aWxlU2l6ZSkgKyAxLFxuICAgICAgICAgICAgaSA9IE1hdGguY2VpbCh0LmhlaWdodCAvIHRoaXMuX3NvdXJjZS50aWxlU2l6ZSkgKyAxLFxuICAgICAgICAgICAgbyA9IE1hdGguZmxvb3IoZSAqIGkgKiA1KSxcbiAgICAgICAgICAgIHIgPSBcIm51bWJlclwiID09IHR5cGVvZiB0aGlzLl9tYXhUaWxlQ2FjaGVTaXplID8gTWF0aC5taW4odGhpcy5fbWF4VGlsZUNhY2hlU2l6ZSwgbykgOiBvO1xuXG4gICAgICAgIHRoaXMuX2NhY2hlLnNldE1heFNpemUocik7XG4gICAgICB9LCBpLnByb3RvdHlwZS5oYW5kbGVXcmFwSnVtcCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHZhciBlID0gTWF0aC5yb3VuZCgodCAtICh2b2lkIDAgPT09IHRoaXMuX3ByZXZMbmcgPyB0IDogdGhpcy5fcHJldkxuZykpIC8gMzYwKTtcblxuICAgICAgICBpZiAodGhpcy5fcHJldkxuZyA9IHQsIGUpIHtcbiAgICAgICAgICB2YXIgaSA9IHt9O1xuXG4gICAgICAgICAgZm9yICh2YXIgbyBpbiB0aGlzLl90aWxlcykge1xuICAgICAgICAgICAgdmFyIHIgPSB0aGlzLl90aWxlc1tvXTtcbiAgICAgICAgICAgIHIudGlsZUlEID0gci50aWxlSUQudW53cmFwVG8oci50aWxlSUQud3JhcCArIGUpLCBpW3IudGlsZUlELmtleV0gPSByO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAodmFyIGEgaW4gdGhpcy5fdGlsZXMgPSBpLCB0aGlzLl90aW1lcnMpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lcnNbYV0pLCBkZWxldGUgdGhpcy5fdGltZXJzW2FdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAodmFyIG4gaW4gdGhpcy5fdGlsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldFRpbGVSZWxvYWRUaW1lcihuLCB0aGlzLl90aWxlc1tuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCBpLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgbyA9IHRoaXM7XG5cbiAgICAgICAgaWYgKHRoaXMudHJhbnNmb3JtID0gZSwgdGhpcy5fc291cmNlTG9hZGVkICYmICF0aGlzLl9wYXVzZWQpIHtcbiAgICAgICAgICB2YXIgcjtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlU2l6ZShlKSwgdGhpcy5oYW5kbGVXcmFwSnVtcCh0aGlzLnRyYW5zZm9ybS5jZW50ZXIubG5nKSwgdGhpcy5fY292ZXJlZFRpbGVzID0ge30sIHRoaXMudXNlZCA/IHRoaXMuX3NvdXJjZS50aWxlSUQgPyByID0gZS5nZXRWaXNpYmxlVW53cmFwcGVkQ29vcmRpbmF0ZXModGhpcy5fc291cmNlLnRpbGVJRCkubWFwKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHQuT3ZlcnNjYWxlZFRpbGVJRChlLmNhbm9uaWNhbC56LCBlLndyYXAsIGUuY2Fub25pY2FsLnosIGUuY2Fub25pY2FsLngsIGUuY2Fub25pY2FsLnkpO1xuICAgICAgICAgIH0pIDogKHIgPSBlLmNvdmVyaW5nVGlsZXMoe1xuICAgICAgICAgICAgdGlsZVNpemU6IHRoaXMuX3NvdXJjZS50aWxlU2l6ZSxcbiAgICAgICAgICAgIG1pbnpvb206IHRoaXMuX3NvdXJjZS5taW56b29tLFxuICAgICAgICAgICAgbWF4em9vbTogdGhpcy5fc291cmNlLm1heHpvb20sXG4gICAgICAgICAgICByb3VuZFpvb206IHRoaXMuX3NvdXJjZS5yb3VuZFpvb20sXG4gICAgICAgICAgICByZXBhcnNlT3ZlcnNjYWxlZDogdGhpcy5fc291cmNlLnJlcGFyc2VPdmVyc2NhbGVkXG4gICAgICAgICAgfSksIHRoaXMuX3NvdXJjZS5oYXNUaWxlICYmIChyID0gci5maWx0ZXIoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgIHJldHVybiBvLl9zb3VyY2UuaGFzVGlsZSh0KTtcbiAgICAgICAgICB9KSkpIDogciA9IFtdO1xuXG4gICAgICAgICAgdmFyIGEgPSBlLmNvdmVyaW5nWm9vbUxldmVsKHRoaXMuX3NvdXJjZSksXG4gICAgICAgICAgICAgIG4gPSBNYXRoLm1heChhIC0gaS5tYXhPdmVyem9vbWluZywgdGhpcy5fc291cmNlLm1pbnpvb20pLFxuICAgICAgICAgICAgICBzID0gTWF0aC5tYXgoYSArIGkubWF4VW5kZXJ6b29taW5nLCB0aGlzLl9zb3VyY2UubWluem9vbSksXG4gICAgICAgICAgICAgIGwgPSB0aGlzLl91cGRhdGVSZXRhaW5lZFRpbGVzKHIsIGEpO1xuXG4gICAgICAgICAgaWYgKE10KHRoaXMuX3NvdXJjZS50eXBlKSkge1xuICAgICAgICAgICAgZm9yICh2YXIgYyA9IHt9LCB1ID0ge30sIGggPSAwLCBwID0gT2JqZWN0LmtleXMobCk7IGggPCBwLmxlbmd0aDsgaCArPSAxKSB7XG4gICAgICAgICAgICAgIHZhciBkID0gcFtoXSxcbiAgICAgICAgICAgICAgICAgIF8gPSBsW2RdLFxuICAgICAgICAgICAgICAgICAgZiA9IHRoaXMuX3RpbGVzW2RdO1xuXG4gICAgICAgICAgICAgIGlmIChmICYmICEoZi5mYWRlRW5kVGltZSAmJiBmLmZhZGVFbmRUaW1lIDw9IHQuYnJvd3Nlci5ub3coKSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgbSA9IHRoaXMuZmluZExvYWRlZFBhcmVudChfLCBuKTtcbiAgICAgICAgICAgICAgICBtICYmICh0aGlzLl9hZGRUaWxlKG0udGlsZUlEKSwgY1ttLnRpbGVJRC5rZXldID0gbS50aWxlSUQpLCB1W2RdID0gXztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKHZhciBnIGluIHRoaXMuX3JldGFpbkxvYWRlZENoaWxkcmVuKHUsIGEsIHMsIGwpLCBjKSB7XG4gICAgICAgICAgICAgIGxbZ10gfHwgKHRoaXMuX2NvdmVyZWRUaWxlc1tnXSA9ICEwLCBsW2ddID0gY1tnXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yICh2YXIgdiBpbiBsKSB7XG4gICAgICAgICAgICB0aGlzLl90aWxlc1t2XS5jbGVhckZhZGVIb2xkKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yICh2YXIgeSA9IDAsIHggPSB0LmtleXNEaWZmZXJlbmNlKHRoaXMuX3RpbGVzLCBsKTsgeSA8IHgubGVuZ3RoOyB5ICs9IDEpIHtcbiAgICAgICAgICAgIHZhciBiID0geFt5XSxcbiAgICAgICAgICAgICAgICB3ID0gdGhpcy5fdGlsZXNbYl07XG4gICAgICAgICAgICB3Lmhhc1N5bWJvbEJ1Y2tldHMgJiYgIXcuaG9sZGluZ0ZvckZhZGUoKSA/IHcuc2V0SG9sZER1cmF0aW9uKHRoaXMubWFwLl9mYWRlRHVyYXRpb24pIDogdy5oYXNTeW1ib2xCdWNrZXRzICYmICF3LnN5bWJvbEZhZGVGaW5pc2hlZCgpIHx8IHRoaXMuX3JlbW92ZVRpbGUoYik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5fdXBkYXRlTG9hZGVkUGFyZW50VGlsZUNhY2hlKCk7XG4gICAgICAgIH1cbiAgICAgIH0sIGkucHJvdG90eXBlLnJlbGVhc2VTeW1ib2xGYWRlVGlsZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvciAodmFyIHQgaW4gdGhpcy5fdGlsZXMpIHtcbiAgICAgICAgICB0aGlzLl90aWxlc1t0XS5ob2xkaW5nRm9yRmFkZSgpICYmIHRoaXMuX3JlbW92ZVRpbGUodCk7XG4gICAgICAgIH1cbiAgICAgIH0sIGkucHJvdG90eXBlLl91cGRhdGVSZXRhaW5lZFRpbGVzID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgZm9yICh2YXIgbyA9IHt9LCByID0ge30sIGEgPSBNYXRoLm1heChlIC0gaS5tYXhPdmVyem9vbWluZywgdGhpcy5fc291cmNlLm1pbnpvb20pLCBuID0gTWF0aC5tYXgoZSArIGkubWF4VW5kZXJ6b29taW5nLCB0aGlzLl9zb3VyY2UubWluem9vbSksIHMgPSB7fSwgbCA9IDAsIGMgPSB0OyBsIDwgYy5sZW5ndGg7IGwgKz0gMSkge1xuICAgICAgICAgIHZhciB1ID0gY1tsXSxcbiAgICAgICAgICAgICAgaCA9IHRoaXMuX2FkZFRpbGUodSk7XG5cbiAgICAgICAgICBvW3Uua2V5XSA9IHUsIGguaGFzRGF0YSgpIHx8IGUgPCB0aGlzLl9zb3VyY2UubWF4em9vbSAmJiAoc1t1LmtleV0gPSB1KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3JldGFpbkxvYWRlZENoaWxkcmVuKHMsIGUsIG4sIG8pO1xuXG4gICAgICAgIGZvciAodmFyIHAgPSAwLCBkID0gdDsgcCA8IGQubGVuZ3RoOyBwICs9IDEpIHtcbiAgICAgICAgICB2YXIgXyA9IGRbcF0sXG4gICAgICAgICAgICAgIGYgPSB0aGlzLl90aWxlc1tfLmtleV07XG5cbiAgICAgICAgICBpZiAoIWYuaGFzRGF0YSgpKSB7XG4gICAgICAgICAgICBpZiAoZSArIDEgPiB0aGlzLl9zb3VyY2UubWF4em9vbSkge1xuICAgICAgICAgICAgICB2YXIgbSA9IF8uY2hpbGRyZW4odGhpcy5fc291cmNlLm1heHpvb20pWzBdLFxuICAgICAgICAgICAgICAgICAgZyA9IHRoaXMuZ2V0VGlsZShtKTtcblxuICAgICAgICAgICAgICBpZiAoZyAmJiBnLmhhc0RhdGEoKSkge1xuICAgICAgICAgICAgICAgIG9bbS5rZXldID0gbTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdmFyIHYgPSBfLmNoaWxkcmVuKHRoaXMuX3NvdXJjZS5tYXh6b29tKTtcblxuICAgICAgICAgICAgICBpZiAob1t2WzBdLmtleV0gJiYgb1t2WzFdLmtleV0gJiYgb1t2WzJdLmtleV0gJiYgb1t2WzNdLmtleV0pIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKHZhciB5ID0gZi53YXNSZXF1ZXN0ZWQoKSwgeCA9IF8ub3ZlcnNjYWxlZFogLSAxOyB4ID49IGE7IC0teCkge1xuICAgICAgICAgICAgICB2YXIgYiA9IF8uc2NhbGVkVG8oeCk7XG5cbiAgICAgICAgICAgICAgaWYgKHJbYi5rZXldKSBicmVhaztcbiAgICAgICAgICAgICAgaWYgKHJbYi5rZXldID0gITAsICEoZiA9IHRoaXMuZ2V0VGlsZShiKSkgJiYgeSAmJiAoZiA9IHRoaXMuX2FkZFRpbGUoYikpLCBmICYmIChvW2Iua2V5XSA9IGIsIHkgPSBmLndhc1JlcXVlc3RlZCgpLCBmLmhhc0RhdGEoKSkpIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvO1xuICAgICAgfSwgaS5wcm90b3R5cGUuX3VwZGF0ZUxvYWRlZFBhcmVudFRpbGVDYWNoZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm9yICh2YXIgdCBpbiB0aGlzLl9sb2FkZWRQYXJlbnRUaWxlcyA9IHt9LCB0aGlzLl90aWxlcykge1xuICAgICAgICAgIGZvciAodmFyIGUgPSBbXSwgaSA9IHZvaWQgMCwgbyA9IHRoaXMuX3RpbGVzW3RdLnRpbGVJRDsgby5vdmVyc2NhbGVkWiA+IDA7KSB7XG4gICAgICAgICAgICBpZiAoby5rZXkgaW4gdGhpcy5fbG9hZGVkUGFyZW50VGlsZXMpIHtcbiAgICAgICAgICAgICAgaSA9IHRoaXMuX2xvYWRlZFBhcmVudFRpbGVzW28ua2V5XTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGUucHVzaChvLmtleSk7XG4gICAgICAgICAgICB2YXIgciA9IG8uc2NhbGVkVG8oby5vdmVyc2NhbGVkWiAtIDEpO1xuICAgICAgICAgICAgaWYgKGkgPSB0aGlzLl9nZXRMb2FkZWRUaWxlKHIpKSBicmVhaztcbiAgICAgICAgICAgIG8gPSByO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAodmFyIGEgPSAwLCBuID0gZTsgYSA8IG4ubGVuZ3RoOyBhICs9IDEpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvYWRlZFBhcmVudFRpbGVzW25bYV1dID0gaTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIGkucHJvdG90eXBlLl9hZGRUaWxlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIGkgPSB0aGlzLl90aWxlc1tlLmtleV07XG4gICAgICAgIGlmIChpKSByZXR1cm4gaTtcbiAgICAgICAgKGkgPSB0aGlzLl9jYWNoZS5nZXRBbmRSZW1vdmUoZSkpICYmICh0aGlzLl9zZXRUaWxlUmVsb2FkVGltZXIoZS5rZXksIGkpLCBpLnRpbGVJRCA9IGUsIHRoaXMuX3N0YXRlLmluaXRpYWxpemVUaWxlU3RhdGUoaSwgdGhpcy5tYXAgPyB0aGlzLm1hcC5wYWludGVyIDogbnVsbCksIHRoaXMuX2NhY2hlVGltZXJzW2Uua2V5XSAmJiAoY2xlYXJUaW1lb3V0KHRoaXMuX2NhY2hlVGltZXJzW2Uua2V5XSksIGRlbGV0ZSB0aGlzLl9jYWNoZVRpbWVyc1tlLmtleV0sIHRoaXMuX3NldFRpbGVSZWxvYWRUaW1lcihlLmtleSwgaSkpKTtcbiAgICAgICAgdmFyIG8gPSBCb29sZWFuKGkpO1xuICAgICAgICByZXR1cm4gbyB8fCAoaSA9IG5ldyB0LlRpbGUoZSwgdGhpcy5fc291cmNlLnRpbGVTaXplICogZS5vdmVyc2NhbGVGYWN0b3IoKSksIHRoaXMuX2xvYWRUaWxlKGksIHRoaXMuX3RpbGVMb2FkZWQuYmluZCh0aGlzLCBpLCBlLmtleSwgaS5zdGF0ZSkpKSwgaSA/IChpLnVzZXMrKywgdGhpcy5fdGlsZXNbZS5rZXldID0gaSwgbyB8fCB0aGlzLl9zb3VyY2UuZmlyZShuZXcgdC5FdmVudChcImRhdGFsb2FkaW5nXCIsIHtcbiAgICAgICAgICB0aWxlOiBpLFxuICAgICAgICAgIGNvb3JkOiBpLnRpbGVJRCxcbiAgICAgICAgICBkYXRhVHlwZTogXCJzb3VyY2VcIlxuICAgICAgICB9KSksIGkpIDogbnVsbDtcbiAgICAgIH0sIGkucHJvdG90eXBlLl9zZXRUaWxlUmVsb2FkVGltZXIgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICB2YXIgaSA9IHRoaXM7XG4gICAgICAgIHQgaW4gdGhpcy5fdGltZXJzICYmIChjbGVhclRpbWVvdXQodGhpcy5fdGltZXJzW3RdKSwgZGVsZXRlIHRoaXMuX3RpbWVyc1t0XSk7XG4gICAgICAgIHZhciBvID0gZS5nZXRFeHBpcnlUaW1lb3V0KCk7XG4gICAgICAgIG8gJiYgKHRoaXMuX3RpbWVyc1t0XSA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGkuX3JlbG9hZFRpbGUodCwgXCJleHBpcmVkXCIpLCBkZWxldGUgaS5fdGltZXJzW3RdO1xuICAgICAgICB9LCBvKSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5fcmVtb3ZlVGlsZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHZhciBlID0gdGhpcy5fdGlsZXNbdF07XG4gICAgICAgIGUgJiYgKGUudXNlcy0tLCBkZWxldGUgdGhpcy5fdGlsZXNbdF0sIHRoaXMuX3RpbWVyc1t0XSAmJiAoY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyc1t0XSksIGRlbGV0ZSB0aGlzLl90aW1lcnNbdF0pLCBlLnVzZXMgPiAwIHx8IChlLmhhc0RhdGEoKSAmJiBcInJlbG9hZGluZ1wiICE9PSBlLnN0YXRlID8gdGhpcy5fY2FjaGUuYWRkKGUudGlsZUlELCBlLCBlLmdldEV4cGlyeVRpbWVvdXQoKSkgOiAoZS5hYm9ydGVkID0gITAsIHRoaXMuX2Fib3J0VGlsZShlKSwgdGhpcy5fdW5sb2FkVGlsZShlKSkpKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmNsZWFyVGlsZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvciAodmFyIHQgaW4gdGhpcy5fc2hvdWxkUmVsb2FkT25SZXN1bWUgPSAhMSwgdGhpcy5fcGF1c2VkID0gITEsIHRoaXMuX3RpbGVzKSB7XG4gICAgICAgICAgdGhpcy5fcmVtb3ZlVGlsZSh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NhY2hlLnJlc2V0KCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS50aWxlc0luID0gZnVuY3Rpb24gKGUsIGksIG8pIHtcbiAgICAgICAgdmFyIHIgPSB0aGlzLFxuICAgICAgICAgICAgYSA9IFtdLFxuICAgICAgICAgICAgbiA9IHRoaXMudHJhbnNmb3JtO1xuICAgICAgICBpZiAoIW4pIHJldHVybiBhO1xuXG4gICAgICAgIGZvciAodmFyIHMgPSBvID8gbi5nZXRDYW1lcmFRdWVyeUdlb21ldHJ5KGUpIDogZSwgbCA9IGUubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgcmV0dXJuIG4ucG9pbnRDb29yZGluYXRlKHQpO1xuICAgICAgICB9KSwgYyA9IHMubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgcmV0dXJuIG4ucG9pbnRDb29yZGluYXRlKHQpO1xuICAgICAgICB9KSwgdSA9IHRoaXMuZ2V0SWRzKCksIGggPSAxIC8gMCwgcCA9IDEgLyAwLCBkID0gLTEgLyAwLCBfID0gLTEgLyAwLCBmID0gMCwgbSA9IGM7IGYgPCBtLmxlbmd0aDsgZiArPSAxKSB7XG4gICAgICAgICAgdmFyIGcgPSBtW2ZdO1xuICAgICAgICAgIGggPSBNYXRoLm1pbihoLCBnLngpLCBwID0gTWF0aC5taW4ocCwgZy55KSwgZCA9IE1hdGgubWF4KGQsIGcueCksIF8gPSBNYXRoLm1heChfLCBnLnkpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgdiA9IGZ1bmN0aW9uIHYoZSkge1xuICAgICAgICAgIHZhciBvID0gci5fdGlsZXNbdVtlXV07XG5cbiAgICAgICAgICBpZiAoIW8uaG9sZGluZ0ZvckZhZGUoKSkge1xuICAgICAgICAgICAgdmFyIHMgPSBvLnRpbGVJRCxcbiAgICAgICAgICAgICAgICBmID0gTWF0aC5wb3coMiwgbi56b29tIC0gby50aWxlSUQub3ZlcnNjYWxlZFopLFxuICAgICAgICAgICAgICAgIG0gPSBpICogby5xdWVyeVBhZGRpbmcgKiB0LkVYVEVOVCAvIG8udGlsZVNpemUgLyBmLFxuICAgICAgICAgICAgICAgIGcgPSBbcy5nZXRUaWxlUG9pbnQobmV3IHQuTWVyY2F0b3JDb29yZGluYXRlKGgsIHApKSwgcy5nZXRUaWxlUG9pbnQobmV3IHQuTWVyY2F0b3JDb29yZGluYXRlKGQsIF8pKV07XG5cbiAgICAgICAgICAgIGlmIChnWzBdLnggLSBtIDwgdC5FWFRFTlQgJiYgZ1swXS55IC0gbSA8IHQuRVhURU5UICYmIGdbMV0ueCArIG0gPj0gMCAmJiBnWzFdLnkgKyBtID49IDApIHtcbiAgICAgICAgICAgICAgdmFyIHYgPSBsLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzLmdldFRpbGVQb2ludCh0KTtcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICB5ID0gYy5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcy5nZXRUaWxlUG9pbnQodCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBhLnB1c2goe1xuICAgICAgICAgICAgICAgIHRpbGU6IG8sXG4gICAgICAgICAgICAgICAgdGlsZUlEOiBzLFxuICAgICAgICAgICAgICAgIHF1ZXJ5R2VvbWV0cnk6IHYsXG4gICAgICAgICAgICAgICAgY2FtZXJhUXVlcnlHZW9tZXRyeTogeSxcbiAgICAgICAgICAgICAgICBzY2FsZTogZlxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIHkgPSAwOyB5IDwgdS5sZW5ndGg7IHkrKykge1xuICAgICAgICAgIHYoeSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmdldFZpc2libGVDb29yZGluYXRlcyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGZvciAodmFyIGUgPSB0aGlzLCBpID0gdGhpcy5nZXRSZW5kZXJhYmxlSWRzKHQpLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHJldHVybiBlLl90aWxlc1t0XS50aWxlSUQ7XG4gICAgICAgIH0pLCBvID0gMCwgciA9IGk7IG8gPCByLmxlbmd0aDsgbyArPSAxKSB7XG4gICAgICAgICAgdmFyIGEgPSByW29dO1xuICAgICAgICAgIGEucG9zTWF0cml4ID0gdGhpcy50cmFuc2Zvcm0uY2FsY3VsYXRlUG9zTWF0cml4KGEudG9VbndyYXBwZWQoKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmhhc1RyYW5zaXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLl9zb3VyY2UuaGFzVHJhbnNpdGlvbigpKSByZXR1cm4gITA7XG4gICAgICAgIGlmIChNdCh0aGlzLl9zb3VyY2UudHlwZSkpIGZvciAodmFyIGUgaW4gdGhpcy5fdGlsZXMpIHtcbiAgICAgICAgICB2YXIgaSA9IHRoaXMuX3RpbGVzW2VdO1xuICAgICAgICAgIGlmICh2b2lkIDAgIT09IGkuZmFkZUVuZFRpbWUgJiYgaS5mYWRlRW5kVGltZSA+PSB0LmJyb3dzZXIubm93KCkpIHJldHVybiAhMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gITE7XG4gICAgICB9LCBpLnByb3RvdHlwZS5zZXRGZWF0dXJlU3RhdGUgPSBmdW5jdGlvbiAodCwgZSwgaSkge1xuICAgICAgICB0aGlzLl9zdGF0ZS51cGRhdGVTdGF0ZSh0ID0gdCB8fCBcIl9nZW9qc29uVGlsZUxheWVyXCIsIGUsIGkpO1xuICAgICAgfSwgaS5wcm90b3R5cGUucmVtb3ZlRmVhdHVyZVN0YXRlID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcbiAgICAgICAgdGhpcy5fc3RhdGUucmVtb3ZlRmVhdHVyZVN0YXRlKHQgPSB0IHx8IFwiX2dlb2pzb25UaWxlTGF5ZXJcIiwgZSwgaSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5nZXRGZWF0dXJlU3RhdGUgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGUuZ2V0U3RhdGUodCA9IHQgfHwgXCJfZ2VvanNvblRpbGVMYXllclwiLCBlKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnNldERlcGVuZGVuY2llcyA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICAgIHZhciBvID0gdGhpcy5fdGlsZXNbdF07XG4gICAgICAgIG8gJiYgby5zZXREZXBlbmRlbmNpZXMoZSwgaSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5yZWxvYWRUaWxlc0ZvckRlcGVuZGVuY2llcyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIGZvciAodmFyIGkgaW4gdGhpcy5fdGlsZXMpIHtcbiAgICAgICAgICB0aGlzLl90aWxlc1tpXS5oYXNEZXBlbmRlbmN5KHQsIGUpICYmIHRoaXMuX3JlbG9hZFRpbGUoaSwgXCJyZWxvYWRpbmdcIik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jYWNoZS5maWx0ZXIoZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICByZXR1cm4gIWkuaGFzRGVwZW5kZW5jeSh0LCBlKTtcbiAgICAgICAgfSk7XG4gICAgICB9LCBpO1xuICAgIH0odC5FdmVudGVkKTtcblxuICAgIGZ1bmN0aW9uIEF0KHQsIGUpIHtcbiAgICAgIHZhciBpID0gTWF0aC5hYnMoMiAqIHQud3JhcCkgLSArKHQud3JhcCA8IDApLFxuICAgICAgICAgIG8gPSBNYXRoLmFicygyICogZS53cmFwKSAtICsoZS53cmFwIDwgMCk7XG4gICAgICByZXR1cm4gdC5vdmVyc2NhbGVkWiAtIGUub3ZlcnNjYWxlZFogfHwgbyAtIGkgfHwgZS5jYW5vbmljYWwueSAtIHQuY2Fub25pY2FsLnkgfHwgZS5jYW5vbmljYWwueCAtIHQuY2Fub25pY2FsLng7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gTXQodCkge1xuICAgICAgcmV0dXJuIFwicmFzdGVyXCIgPT09IHQgfHwgXCJpbWFnZVwiID09PSB0IHx8IFwidmlkZW9cIiA9PT0gdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBMdCgpIHtcbiAgICAgIHJldHVybiBuZXcgdC53aW5kb3cuV29ya2VyKEtyLndvcmtlclVybCk7XG4gICAgfVxuXG4gICAgRHQubWF4T3Zlcnpvb21pbmcgPSAxMCwgRHQubWF4VW5kZXJ6b29taW5nID0gMztcblxuICAgIHZhciBSdCA9IFwibWFwYm94Z2xfcHJlbG9hZGVkX3dvcmtlcl9wb29sXCIsXG4gICAgICAgIGt0ID0gZnVuY3Rpb24ga3QoKSB7XG4gICAgICB0aGlzLmFjdGl2ZSA9IHt9O1xuICAgIH07XG5cbiAgICBrdC5wcm90b3R5cGUuYWNxdWlyZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBpZiAoIXRoaXMud29ya2VycykgZm9yICh0aGlzLndvcmtlcnMgPSBbXTsgdGhpcy53b3JrZXJzLmxlbmd0aCA8IGt0LndvcmtlckNvdW50Oykge1xuICAgICAgICB0aGlzLndvcmtlcnMucHVzaChuZXcgTHQoKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5hY3RpdmVbdF0gPSAhMCwgdGhpcy53b3JrZXJzLnNsaWNlKCk7XG4gICAgfSwga3QucHJvdG90eXBlLnJlbGVhc2UgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZGVsZXRlIHRoaXMuYWN0aXZlW3RdLCAwID09PSB0aGlzLm51bUFjdGl2ZSgpICYmICh0aGlzLndvcmtlcnMuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICB0LnRlcm1pbmF0ZSgpO1xuICAgICAgfSksIHRoaXMud29ya2VycyA9IG51bGwpO1xuICAgIH0sIGt0LnByb3RvdHlwZS5pc1ByZWxvYWRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhIXRoaXMuYWN0aXZlW1J0XTtcbiAgICB9LCBrdC5wcm90b3R5cGUubnVtQWN0aXZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuYWN0aXZlKS5sZW5ndGg7XG4gICAgfTtcbiAgICB2YXIgQnQsXG4gICAgICAgIE90ID0gTWF0aC5mbG9vcih0LmJyb3dzZXIuaGFyZHdhcmVDb25jdXJyZW5jeSAvIDIpO1xuXG4gICAgZnVuY3Rpb24gRnQoKSB7XG4gICAgICByZXR1cm4gQnQgfHwgKEJ0ID0gbmV3IGt0KCkpLCBCdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBVdChlLCBpKSB7XG4gICAgICB2YXIgbyA9IHt9O1xuXG4gICAgICBmb3IgKHZhciByIGluIGUpIHtcbiAgICAgICAgXCJyZWZcIiAhPT0gciAmJiAob1tyXSA9IGVbcl0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdC5yZWZQcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdCBpbiBpICYmIChvW3RdID0gaVt0XSk7XG4gICAgICB9KSwgbztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBOdCh0KSB7XG4gICAgICB0ID0gdC5zbGljZSgpO1xuXG4gICAgICBmb3IgKHZhciBlID0gT2JqZWN0LmNyZWF0ZShudWxsKSwgaSA9IDA7IGkgPCB0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGVbdFtpXS5pZF0gPSB0W2ldO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBvID0gMDsgbyA8IHQubGVuZ3RoOyBvKyspIHtcbiAgICAgICAgXCJyZWZcIiBpbiB0W29dICYmICh0W29dID0gVXQodFtvXSwgZVt0W29dLnJlZl0pKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQ7XG4gICAgfVxuXG4gICAga3Qud29ya2VyQ291bnQgPSBNYXRoLm1heChNYXRoLm1pbihPdCwgNiksIDEpO1xuICAgIHZhciBadCA9IHtcbiAgICAgIHNldFN0eWxlOiBcInNldFN0eWxlXCIsXG4gICAgICBhZGRMYXllcjogXCJhZGRMYXllclwiLFxuICAgICAgcmVtb3ZlTGF5ZXI6IFwicmVtb3ZlTGF5ZXJcIixcbiAgICAgIHNldFBhaW50UHJvcGVydHk6IFwic2V0UGFpbnRQcm9wZXJ0eVwiLFxuICAgICAgc2V0TGF5b3V0UHJvcGVydHk6IFwic2V0TGF5b3V0UHJvcGVydHlcIixcbiAgICAgIHNldEZpbHRlcjogXCJzZXRGaWx0ZXJcIixcbiAgICAgIGFkZFNvdXJjZTogXCJhZGRTb3VyY2VcIixcbiAgICAgIHJlbW92ZVNvdXJjZTogXCJyZW1vdmVTb3VyY2VcIixcbiAgICAgIHNldEdlb0pTT05Tb3VyY2VEYXRhOiBcInNldEdlb0pTT05Tb3VyY2VEYXRhXCIsXG4gICAgICBzZXRMYXllclpvb21SYW5nZTogXCJzZXRMYXllclpvb21SYW5nZVwiLFxuICAgICAgc2V0TGF5ZXJQcm9wZXJ0eTogXCJzZXRMYXllclByb3BlcnR5XCIsXG4gICAgICBzZXRDZW50ZXI6IFwic2V0Q2VudGVyXCIsXG4gICAgICBzZXRab29tOiBcInNldFpvb21cIixcbiAgICAgIHNldEJlYXJpbmc6IFwic2V0QmVhcmluZ1wiLFxuICAgICAgc2V0UGl0Y2g6IFwic2V0UGl0Y2hcIixcbiAgICAgIHNldFNwcml0ZTogXCJzZXRTcHJpdGVcIixcbiAgICAgIHNldEdseXBoczogXCJzZXRHbHlwaHNcIixcbiAgICAgIHNldFRyYW5zaXRpb246IFwic2V0VHJhbnNpdGlvblwiLFxuICAgICAgc2V0TGlnaHQ6IFwic2V0TGlnaHRcIlxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBxdCh0LCBlLCBpKSB7XG4gICAgICBpLnB1c2goe1xuICAgICAgICBjb21tYW5kOiBadC5hZGRTb3VyY2UsXG4gICAgICAgIGFyZ3M6IFt0LCBlW3RdXVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24ganQodCwgZSwgaSkge1xuICAgICAgZS5wdXNoKHtcbiAgICAgICAgY29tbWFuZDogWnQucmVtb3ZlU291cmNlLFxuICAgICAgICBhcmdzOiBbdF1cbiAgICAgIH0pLCBpW3RdID0gITA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gVnQodCwgZSwgaSwgbykge1xuICAgICAganQodCwgaSwgbyksIHF0KHQsIGUsIGkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIEd0KGUsIGksIG8pIHtcbiAgICAgIHZhciByO1xuXG4gICAgICBmb3IgKHIgaW4gZVtvXSkge1xuICAgICAgICBpZiAoZVtvXS5oYXNPd25Qcm9wZXJ0eShyKSAmJiBcImRhdGFcIiAhPT0gciAmJiAhdC5kZWVwRXF1YWwoZVtvXVtyXSwgaVtvXVtyXSkpIHJldHVybiAhMTtcbiAgICAgIH1cblxuICAgICAgZm9yIChyIGluIGlbb10pIHtcbiAgICAgICAgaWYgKGlbb10uaGFzT3duUHJvcGVydHkocikgJiYgXCJkYXRhXCIgIT09IHIgJiYgIXQuZGVlcEVxdWFsKGVbb11bcl0sIGlbb11bcl0pKSByZXR1cm4gITE7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAhMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBXdChlLCBpLCBvLCByLCBhLCBuKSB7XG4gICAgICB2YXIgcztcblxuICAgICAgZm9yIChzIGluIGkgPSBpIHx8IHt9LCBlID0gZSB8fCB7fSkge1xuICAgICAgICBlLmhhc093blByb3BlcnR5KHMpICYmICh0LmRlZXBFcXVhbChlW3NdLCBpW3NdKSB8fCBvLnB1c2goe1xuICAgICAgICAgIGNvbW1hbmQ6IG4sXG4gICAgICAgICAgYXJnczogW3IsIHMsIGlbc10sIGFdXG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChzIGluIGkpIHtcbiAgICAgICAgaS5oYXNPd25Qcm9wZXJ0eShzKSAmJiAhZS5oYXNPd25Qcm9wZXJ0eShzKSAmJiAodC5kZWVwRXF1YWwoZVtzXSwgaVtzXSkgfHwgby5wdXNoKHtcbiAgICAgICAgICBjb21tYW5kOiBuLFxuICAgICAgICAgIGFyZ3M6IFtyLCBzLCBpW3NdLCBhXVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gWHQodCkge1xuICAgICAgcmV0dXJuIHQuaWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gSHQodCwgZSkge1xuICAgICAgcmV0dXJuIHRbZS5pZF0gPSBlLCB0O1xuICAgIH1cblxuICAgIHZhciBLdCA9IGZ1bmN0aW9uIEt0KHQsIGUpIHtcbiAgICAgIHRoaXMucmVzZXQodCwgZSk7XG4gICAgfTtcblxuICAgIEt0LnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB0aGlzLnBvaW50cyA9IHQgfHwgW10sIHRoaXMuX2Rpc3RhbmNlcyA9IFswXTtcblxuICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCB0aGlzLnBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLl9kaXN0YW5jZXNbaV0gPSB0aGlzLl9kaXN0YW5jZXNbaSAtIDFdICsgdGhpcy5wb2ludHNbaV0uZGlzdCh0aGlzLnBvaW50c1tpIC0gMV0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxlbmd0aCA9IHRoaXMuX2Rpc3RhbmNlc1t0aGlzLl9kaXN0YW5jZXMubGVuZ3RoIC0gMV0sIHRoaXMucGFkZGluZyA9IE1hdGgubWluKGUgfHwgMCwgLjUgKiB0aGlzLmxlbmd0aCksIHRoaXMucGFkZGVkTGVuZ3RoID0gdGhpcy5sZW5ndGggLSAyICogdGhpcy5wYWRkaW5nO1xuICAgIH0sIEt0LnByb3RvdHlwZS5sZXJwID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmICgxID09PSB0aGlzLnBvaW50cy5sZW5ndGgpIHJldHVybiB0aGlzLnBvaW50c1swXTtcbiAgICAgIGUgPSB0LmNsYW1wKGUsIDAsIDEpO1xuXG4gICAgICBmb3IgKHZhciBpID0gMSwgbyA9IHRoaXMuX2Rpc3RhbmNlc1tpXSwgciA9IGUgKiB0aGlzLnBhZGRlZExlbmd0aCArIHRoaXMucGFkZGluZzsgbyA8IHIgJiYgaSA8IHRoaXMuX2Rpc3RhbmNlcy5sZW5ndGg7KSB7XG4gICAgICAgIG8gPSB0aGlzLl9kaXN0YW5jZXNbKytpXTtcbiAgICAgIH1cblxuICAgICAgdmFyIGEgPSBpIC0gMSxcbiAgICAgICAgICBuID0gdGhpcy5fZGlzdGFuY2VzW2FdLFxuICAgICAgICAgIHMgPSBvIC0gbixcbiAgICAgICAgICBsID0gcyA+IDAgPyAociAtIG4pIC8gcyA6IDA7XG4gICAgICByZXR1cm4gdGhpcy5wb2ludHNbYV0ubXVsdCgxIC0gbCkuYWRkKHRoaXMucG9pbnRzW2ldLm11bHQobCkpO1xuICAgIH07XG5cbiAgICB2YXIgWXQgPSBmdW5jdGlvbiBZdCh0LCBlLCBpKSB7XG4gICAgICB2YXIgbyA9IHRoaXMuYm94Q2VsbHMgPSBbXSxcbiAgICAgICAgICByID0gdGhpcy5jaXJjbGVDZWxscyA9IFtdO1xuICAgICAgdGhpcy54Q2VsbENvdW50ID0gTWF0aC5jZWlsKHQgLyBpKSwgdGhpcy55Q2VsbENvdW50ID0gTWF0aC5jZWlsKGUgLyBpKTtcblxuICAgICAgZm9yICh2YXIgYSA9IDA7IGEgPCB0aGlzLnhDZWxsQ291bnQgKiB0aGlzLnlDZWxsQ291bnQ7IGErKykge1xuICAgICAgICBvLnB1c2goW10pLCByLnB1c2goW10pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNpcmNsZUtleXMgPSBbXSwgdGhpcy5ib3hLZXlzID0gW10sIHRoaXMuYmJveGVzID0gW10sIHRoaXMuY2lyY2xlcyA9IFtdLCB0aGlzLndpZHRoID0gdCwgdGhpcy5oZWlnaHQgPSBlLCB0aGlzLnhTY2FsZSA9IHRoaXMueENlbGxDb3VudCAvIHQsIHRoaXMueVNjYWxlID0gdGhpcy55Q2VsbENvdW50IC8gZSwgdGhpcy5ib3hVaWQgPSAwLCB0aGlzLmNpcmNsZVVpZCA9IDA7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIEp0KGUsIGksIG8sIHIsIGEpIHtcbiAgICAgIHZhciBuID0gdC5jcmVhdGUoKTtcbiAgICAgIHJldHVybiBpID8gKHQuc2NhbGUobiwgbiwgWzEgLyBhLCAxIC8gYSwgMV0pLCBvIHx8IHQucm90YXRlWihuLCBuLCByLmFuZ2xlKSkgOiB0Lm11bHRpcGx5KG4sIHIubGFiZWxQbGFuZU1hdHJpeCwgZSksIG47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gUXQoZSwgaSwgbywgciwgYSkge1xuICAgICAgaWYgKGkpIHtcbiAgICAgICAgdmFyIG4gPSB0LmNsb25lKGUpO1xuICAgICAgICByZXR1cm4gdC5zY2FsZShuLCBuLCBbYSwgYSwgMV0pLCBvIHx8IHQucm90YXRlWihuLCBuLCAtci5hbmdsZSksIG47XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByLmdsQ29vcmRNYXRyaXg7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gJHQoZSwgaSkge1xuICAgICAgdmFyIG8gPSBbZS54LCBlLnksIDAsIDFdO1xuICAgICAgdWUobywgbywgaSk7XG4gICAgICB2YXIgciA9IG9bM107XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwb2ludDogbmV3IHQuUG9pbnQob1swXSAvIHIsIG9bMV0gLyByKSxcbiAgICAgICAgc2lnbmVkRGlzdGFuY2VGcm9tQ2FtZXJhOiByXG4gICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRlKHQsIGUpIHtcbiAgICAgIHJldHVybiAuNSArIHQgLyBlICogLjU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZWUodCwgZSkge1xuICAgICAgdmFyIGkgPSB0WzBdIC8gdFszXSxcbiAgICAgICAgICBvID0gdFsxXSAvIHRbM107XG4gICAgICByZXR1cm4gaSA+PSAtZVswXSAmJiBpIDw9IGVbMF0gJiYgbyA+PSAtZVsxXSAmJiBvIDw9IGVbMV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaWUoZSwgaSwgbywgciwgYSwgbiwgcywgbCkge1xuICAgICAgdmFyIGMgPSByID8gZS50ZXh0U2l6ZURhdGEgOiBlLmljb25TaXplRGF0YSxcbiAgICAgICAgICB1ID0gdC5ldmFsdWF0ZVNpemVGb3Jab29tKGMsIG8udHJhbnNmb3JtLnpvb20pLFxuICAgICAgICAgIGggPSBbMjU2IC8gby53aWR0aCAqIDIgKyAxLCAyNTYgLyBvLmhlaWdodCAqIDIgKyAxXSxcbiAgICAgICAgICBwID0gciA/IGUudGV4dC5keW5hbWljTGF5b3V0VmVydGV4QXJyYXkgOiBlLmljb24uZHluYW1pY0xheW91dFZlcnRleEFycmF5O1xuICAgICAgcC5jbGVhcigpO1xuXG4gICAgICBmb3IgKHZhciBkID0gZS5saW5lVmVydGV4QXJyYXksIF8gPSByID8gZS50ZXh0LnBsYWNlZFN5bWJvbEFycmF5IDogZS5pY29uLnBsYWNlZFN5bWJvbEFycmF5LCBmID0gby50cmFuc2Zvcm0ud2lkdGggLyBvLnRyYW5zZm9ybS5oZWlnaHQsIG0gPSAhMSwgZyA9IDA7IGcgPCBfLmxlbmd0aDsgZysrKSB7XG4gICAgICAgIHZhciB2ID0gXy5nZXQoZyk7XG5cbiAgICAgICAgaWYgKHYuaGlkZGVuIHx8IHYud3JpdGluZ01vZGUgPT09IHQuV3JpdGluZ01vZGUudmVydGljYWwgJiYgIW0pIGNlKHYubnVtR2x5cGhzLCBwKTtlbHNlIHtcbiAgICAgICAgICBtID0gITE7XG4gICAgICAgICAgdmFyIHkgPSBbdi5hbmNob3JYLCB2LmFuY2hvclksIDAsIDFdO1xuXG4gICAgICAgICAgaWYgKHQudHJhbnNmb3JtTWF0NCh5LCB5LCBpKSwgZWUoeSwgaCkpIHtcbiAgICAgICAgICAgIHZhciB4ID0gdGUoby50cmFuc2Zvcm0uY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSwgeVszXSksXG4gICAgICAgICAgICAgICAgYiA9IHQuZXZhbHVhdGVTaXplRm9yRmVhdHVyZShjLCB1LCB2KSxcbiAgICAgICAgICAgICAgICB3ID0gcyA/IGIgLyB4IDogYiAqIHgsXG4gICAgICAgICAgICAgICAgVCA9IG5ldyB0LlBvaW50KHYuYW5jaG9yWCwgdi5hbmNob3JZKSxcbiAgICAgICAgICAgICAgICBFID0gJHQoVCwgYSkucG9pbnQsXG4gICAgICAgICAgICAgICAgSSA9IHt9LFxuICAgICAgICAgICAgICAgIFAgPSBhZSh2LCB3LCAhMSwgbCwgaSwgYSwgbiwgZS5nbHlwaE9mZnNldEFycmF5LCBkLCBwLCBFLCBULCBJLCBmKTtcbiAgICAgICAgICAgIG0gPSBQLnVzZVZlcnRpY2FsLCAoUC5ub3RFbm91Z2hSb29tIHx8IG0gfHwgUC5uZWVkc0ZsaXBwaW5nICYmIGFlKHYsIHcsICEwLCBsLCBpLCBhLCBuLCBlLmdseXBoT2Zmc2V0QXJyYXksIGQsIHAsIEUsIFQsIEksIGYpLm5vdEVub3VnaFJvb20pICYmIGNlKHYubnVtR2x5cGhzLCBwKTtcbiAgICAgICAgICB9IGVsc2UgY2Uodi5udW1HbHlwaHMsIHApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHIgPyBlLnRleHQuZHluYW1pY0xheW91dFZlcnRleEJ1ZmZlci51cGRhdGVEYXRhKHApIDogZS5pY29uLmR5bmFtaWNMYXlvdXRWZXJ0ZXhCdWZmZXIudXBkYXRlRGF0YShwKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvZSh0LCBlLCBpLCBvLCByLCBhLCBuLCBzLCBsLCBjLCB1KSB7XG4gICAgICB2YXIgaCA9IHMuZ2x5cGhTdGFydEluZGV4ICsgcy5udW1HbHlwaHMsXG4gICAgICAgICAgcCA9IHMubGluZVN0YXJ0SW5kZXgsXG4gICAgICAgICAgZCA9IHMubGluZVN0YXJ0SW5kZXggKyBzLmxpbmVMZW5ndGgsXG4gICAgICAgICAgXyA9IGUuZ2V0b2Zmc2V0WChzLmdseXBoU3RhcnRJbmRleCksXG4gICAgICAgICAgZiA9IGUuZ2V0b2Zmc2V0WChoIC0gMSksXG4gICAgICAgICAgbSA9IHNlKHQgKiBfLCBpLCBvLCByLCBhLCBuLCBzLnNlZ21lbnQsIHAsIGQsIGwsIGMsIHUpO1xuXG4gICAgICBpZiAoIW0pIHJldHVybiBudWxsO1xuICAgICAgdmFyIGcgPSBzZSh0ICogZiwgaSwgbywgciwgYSwgbiwgcy5zZWdtZW50LCBwLCBkLCBsLCBjLCB1KTtcbiAgICAgIHJldHVybiBnID8ge1xuICAgICAgICBmaXJzdDogbSxcbiAgICAgICAgbGFzdDogZ1xuICAgICAgfSA6IG51bGw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmUoZSwgaSwgbywgcikge1xuICAgICAgcmV0dXJuIGUgPT09IHQuV3JpdGluZ01vZGUuaG9yaXpvbnRhbCAmJiBNYXRoLmFicyhvLnkgLSBpLnkpID4gTWF0aC5hYnMoby54IC0gaS54KSAqIHIgPyB7XG4gICAgICAgIHVzZVZlcnRpY2FsOiAhMFxuICAgICAgfSA6IChlID09PSB0LldyaXRpbmdNb2RlLnZlcnRpY2FsID8gaS55IDwgby55IDogaS54ID4gby54KSA/IHtcbiAgICAgICAgbmVlZHNGbGlwcGluZzogITBcbiAgICAgIH0gOiBudWxsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFlKGUsIGksIG8sIHIsIGEsIG4sIHMsIGwsIGMsIHUsIGgsIHAsIGQsIF8pIHtcbiAgICAgIHZhciBmLFxuICAgICAgICAgIG0gPSBpIC8gMjQsXG4gICAgICAgICAgZyA9IGUubGluZU9mZnNldFggKiBtLFxuICAgICAgICAgIHYgPSBlLmxpbmVPZmZzZXRZICogbTtcblxuICAgICAgaWYgKGUubnVtR2x5cGhzID4gMSkge1xuICAgICAgICB2YXIgeSA9IGUuZ2x5cGhTdGFydEluZGV4ICsgZS5udW1HbHlwaHMsXG4gICAgICAgICAgICB4ID0gZS5saW5lU3RhcnRJbmRleCxcbiAgICAgICAgICAgIGIgPSBlLmxpbmVTdGFydEluZGV4ICsgZS5saW5lTGVuZ3RoLFxuICAgICAgICAgICAgdyA9IG9lKG0sIGwsIGcsIHYsIG8sIGgsIHAsIGUsIGMsIG4sIGQpO1xuICAgICAgICBpZiAoIXcpIHJldHVybiB7XG4gICAgICAgICAgbm90RW5vdWdoUm9vbTogITBcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIFQgPSAkdCh3LmZpcnN0LnBvaW50LCBzKS5wb2ludCxcbiAgICAgICAgICAgIEUgPSAkdCh3Lmxhc3QucG9pbnQsIHMpLnBvaW50O1xuXG4gICAgICAgIGlmIChyICYmICFvKSB7XG4gICAgICAgICAgdmFyIEkgPSByZShlLndyaXRpbmdNb2RlLCBULCBFLCBfKTtcbiAgICAgICAgICBpZiAoSSkgcmV0dXJuIEk7XG4gICAgICAgIH1cblxuICAgICAgICBmID0gW3cuZmlyc3RdO1xuXG4gICAgICAgIGZvciAodmFyIFAgPSBlLmdseXBoU3RhcnRJbmRleCArIDE7IFAgPCB5IC0gMTsgUCsrKSB7XG4gICAgICAgICAgZi5wdXNoKHNlKG0gKiBsLmdldG9mZnNldFgoUCksIGcsIHYsIG8sIGgsIHAsIGUuc2VnbWVudCwgeCwgYiwgYywgbiwgZCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgZi5wdXNoKHcubGFzdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAociAmJiAhbykge1xuICAgICAgICAgIHZhciBTID0gJHQocCwgYSkucG9pbnQsXG4gICAgICAgICAgICAgIEMgPSBlLmxpbmVTdGFydEluZGV4ICsgZS5zZWdtZW50ICsgMSxcbiAgICAgICAgICAgICAgeiA9IG5ldyB0LlBvaW50KGMuZ2V0eChDKSwgYy5nZXR5KEMpKSxcbiAgICAgICAgICAgICAgRCA9ICR0KHosIGEpLFxuICAgICAgICAgICAgICBBID0gRC5zaWduZWREaXN0YW5jZUZyb21DYW1lcmEgPiAwID8gRC5wb2ludCA6IG5lKHAsIHosIFMsIDEsIGEpLFxuICAgICAgICAgICAgICBNID0gcmUoZS53cml0aW5nTW9kZSwgUywgQSwgXyk7XG4gICAgICAgICAgaWYgKE0pIHJldHVybiBNO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIEwgPSBzZShtICogbC5nZXRvZmZzZXRYKGUuZ2x5cGhTdGFydEluZGV4KSwgZywgdiwgbywgaCwgcCwgZS5zZWdtZW50LCBlLmxpbmVTdGFydEluZGV4LCBlLmxpbmVTdGFydEluZGV4ICsgZS5saW5lTGVuZ3RoLCBjLCBuLCBkKTtcbiAgICAgICAgaWYgKCFMKSByZXR1cm4ge1xuICAgICAgICAgIG5vdEVub3VnaFJvb206ICEwXG4gICAgICAgIH07XG4gICAgICAgIGYgPSBbTF07XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIFIgPSAwLCBrID0gZjsgUiA8IGsubGVuZ3RoOyBSICs9IDEpIHtcbiAgICAgICAgdmFyIEIgPSBrW1JdO1xuICAgICAgICB0LmFkZER5bmFtaWNBdHRyaWJ1dGVzKHUsIEIucG9pbnQsIEIuYW5nbGUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbmUodCwgZSwgaSwgbywgcikge1xuICAgICAgdmFyIGEgPSAkdCh0LmFkZCh0LnN1YihlKS5fdW5pdCgpKSwgcikucG9pbnQsXG4gICAgICAgICAgbiA9IGkuc3ViKGEpO1xuICAgICAgcmV0dXJuIGkuYWRkKG4uX211bHQobyAvIG4ubWFnKCkpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZShlLCBpLCBvLCByLCBhLCBuLCBzLCBsLCBjLCB1LCBoLCBwKSB7XG4gICAgICB2YXIgZCA9IHIgPyBlIC0gaSA6IGUgKyBpLFxuICAgICAgICAgIF8gPSBkID4gMCA/IDEgOiAtMSxcbiAgICAgICAgICBmID0gMDtcblxuICAgICAgciAmJiAoXyAqPSAtMSwgZiA9IE1hdGguUEkpLCBfIDwgMCAmJiAoZiArPSBNYXRoLlBJKTtcblxuICAgICAgZm9yICh2YXIgbSA9IF8gPiAwID8gbCArIHMgOiBsICsgcyArIDEsIGcgPSBhLCB2ID0gYSwgeSA9IDAsIHggPSAwLCBiID0gTWF0aC5hYnMoZCksIHcgPSBbXTsgeSArIHggPD0gYjspIHtcbiAgICAgICAgaWYgKChtICs9IF8pIDwgbCB8fCBtID49IGMpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGlmICh2ID0gZywgdy5wdXNoKGcpLCB2b2lkIDAgPT09IChnID0gcFttXSkpIHtcbiAgICAgICAgICB2YXIgVCA9IG5ldyB0LlBvaW50KHUuZ2V0eChtKSwgdS5nZXR5KG0pKSxcbiAgICAgICAgICAgICAgRSA9ICR0KFQsIGgpO1xuICAgICAgICAgIGlmIChFLnNpZ25lZERpc3RhbmNlRnJvbUNhbWVyYSA+IDApIGcgPSBwW21dID0gRS5wb2ludDtlbHNlIHtcbiAgICAgICAgICAgIHZhciBJID0gbSAtIF87XG4gICAgICAgICAgICBnID0gbmUoMCA9PT0geSA/IG4gOiBuZXcgdC5Qb2ludCh1LmdldHgoSSksIHUuZ2V0eShJKSksIFQsIHYsIGIgLSB5ICsgMSwgaCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgeSArPSB4LCB4ID0gdi5kaXN0KGcpO1xuICAgICAgfVxuXG4gICAgICB2YXIgUCA9IChiIC0geSkgLyB4LFxuICAgICAgICAgIFMgPSBnLnN1Yih2KSxcbiAgICAgICAgICBDID0gUy5tdWx0KFApLl9hZGQodik7XG5cbiAgICAgIEMuX2FkZChTLl91bml0KCkuX3BlcnAoKS5fbXVsdChvICogXykpO1xuXG4gICAgICB2YXIgeiA9IGYgKyBNYXRoLmF0YW4yKGcueSAtIHYueSwgZy54IC0gdi54KTtcbiAgICAgIHJldHVybiB3LnB1c2goQyksIHtcbiAgICAgICAgcG9pbnQ6IEMsXG4gICAgICAgIGFuZ2xlOiB6LFxuICAgICAgICBwYXRoOiB3XG4gICAgICB9O1xuICAgIH1cblxuICAgIFl0LnByb3RvdHlwZS5rZXlzTGVuZ3RoID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuYm94S2V5cy5sZW5ndGggKyB0aGlzLmNpcmNsZUtleXMubGVuZ3RoO1xuICAgIH0sIFl0LnByb3RvdHlwZS5pbnNlcnQgPSBmdW5jdGlvbiAodCwgZSwgaSwgbywgcikge1xuICAgICAgdGhpcy5fZm9yRWFjaENlbGwoZSwgaSwgbywgciwgdGhpcy5faW5zZXJ0Qm94Q2VsbCwgdGhpcy5ib3hVaWQrKyksIHRoaXMuYm94S2V5cy5wdXNoKHQpLCB0aGlzLmJib3hlcy5wdXNoKGUpLCB0aGlzLmJib3hlcy5wdXNoKGkpLCB0aGlzLmJib3hlcy5wdXNoKG8pLCB0aGlzLmJib3hlcy5wdXNoKHIpO1xuICAgIH0sIFl0LnByb3RvdHlwZS5pbnNlcnRDaXJjbGUgPSBmdW5jdGlvbiAodCwgZSwgaSwgbykge1xuICAgICAgdGhpcy5fZm9yRWFjaENlbGwoZSAtIG8sIGkgLSBvLCBlICsgbywgaSArIG8sIHRoaXMuX2luc2VydENpcmNsZUNlbGwsIHRoaXMuY2lyY2xlVWlkKyspLCB0aGlzLmNpcmNsZUtleXMucHVzaCh0KSwgdGhpcy5jaXJjbGVzLnB1c2goZSksIHRoaXMuY2lyY2xlcy5wdXNoKGkpLCB0aGlzLmNpcmNsZXMucHVzaChvKTtcbiAgICB9LCBZdC5wcm90b3R5cGUuX2luc2VydEJveENlbGwgPSBmdW5jdGlvbiAodCwgZSwgaSwgbywgciwgYSkge1xuICAgICAgdGhpcy5ib3hDZWxsc1tyXS5wdXNoKGEpO1xuICAgIH0sIFl0LnByb3RvdHlwZS5faW5zZXJ0Q2lyY2xlQ2VsbCA9IGZ1bmN0aW9uICh0LCBlLCBpLCBvLCByLCBhKSB7XG4gICAgICB0aGlzLmNpcmNsZUNlbGxzW3JdLnB1c2goYSk7XG4gICAgfSwgWXQucHJvdG90eXBlLl9xdWVyeSA9IGZ1bmN0aW9uICh0LCBlLCBpLCBvLCByLCBhKSB7XG4gICAgICBpZiAoaSA8IDAgfHwgdCA+IHRoaXMud2lkdGggfHwgbyA8IDAgfHwgZSA+IHRoaXMuaGVpZ2h0KSByZXR1cm4gIXIgJiYgW107XG4gICAgICB2YXIgbiA9IFtdO1xuXG4gICAgICBpZiAodCA8PSAwICYmIGUgPD0gMCAmJiB0aGlzLndpZHRoIDw9IGkgJiYgdGhpcy5oZWlnaHQgPD0gbykge1xuICAgICAgICBpZiAocikgcmV0dXJuICEwO1xuXG4gICAgICAgIGZvciAodmFyIHMgPSAwOyBzIDwgdGhpcy5ib3hLZXlzLmxlbmd0aDsgcysrKSB7XG4gICAgICAgICAgbi5wdXNoKHtcbiAgICAgICAgICAgIGtleTogdGhpcy5ib3hLZXlzW3NdLFxuICAgICAgICAgICAgeDE6IHRoaXMuYmJveGVzWzQgKiBzXSxcbiAgICAgICAgICAgIHkxOiB0aGlzLmJib3hlc1s0ICogcyArIDFdLFxuICAgICAgICAgICAgeDI6IHRoaXMuYmJveGVzWzQgKiBzICsgMl0sXG4gICAgICAgICAgICB5MjogdGhpcy5iYm94ZXNbNCAqIHMgKyAzXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgbCA9IDA7IGwgPCB0aGlzLmNpcmNsZUtleXMubGVuZ3RoOyBsKyspIHtcbiAgICAgICAgICB2YXIgYyA9IHRoaXMuY2lyY2xlc1szICogbF0sXG4gICAgICAgICAgICAgIHUgPSB0aGlzLmNpcmNsZXNbMyAqIGwgKyAxXSxcbiAgICAgICAgICAgICAgaCA9IHRoaXMuY2lyY2xlc1szICogbCArIDJdO1xuICAgICAgICAgIG4ucHVzaCh7XG4gICAgICAgICAgICBrZXk6IHRoaXMuY2lyY2xlS2V5c1tsXSxcbiAgICAgICAgICAgIHgxOiBjIC0gaCxcbiAgICAgICAgICAgIHkxOiB1IC0gaCxcbiAgICAgICAgICAgIHgyOiBjICsgaCxcbiAgICAgICAgICAgIHkyOiB1ICsgaFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGEgPyBuLmZpbHRlcihhKSA6IG47XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLl9mb3JFYWNoQ2VsbCh0LCBlLCBpLCBvLCB0aGlzLl9xdWVyeUNlbGwsIG4sIHtcbiAgICAgICAgaGl0VGVzdDogcixcbiAgICAgICAgc2VlblVpZHM6IHtcbiAgICAgICAgICBib3g6IHt9LFxuICAgICAgICAgIGNpcmNsZToge31cbiAgICAgICAgfVxuICAgICAgfSwgYSksIHIgPyBuLmxlbmd0aCA+IDAgOiBuO1xuICAgIH0sIFl0LnByb3RvdHlwZS5fcXVlcnlDaXJjbGUgPSBmdW5jdGlvbiAodCwgZSwgaSwgbywgcikge1xuICAgICAgdmFyIGEgPSB0IC0gaSxcbiAgICAgICAgICBuID0gdCArIGksXG4gICAgICAgICAgcyA9IGUgLSBpLFxuICAgICAgICAgIGwgPSBlICsgaTtcbiAgICAgIGlmIChuIDwgMCB8fCBhID4gdGhpcy53aWR0aCB8fCBsIDwgMCB8fCBzID4gdGhpcy5oZWlnaHQpIHJldHVybiAhbyAmJiBbXTtcbiAgICAgIHZhciBjID0gW107XG4gICAgICByZXR1cm4gdGhpcy5fZm9yRWFjaENlbGwoYSwgcywgbiwgbCwgdGhpcy5fcXVlcnlDZWxsQ2lyY2xlLCBjLCB7XG4gICAgICAgIGhpdFRlc3Q6IG8sXG4gICAgICAgIGNpcmNsZToge1xuICAgICAgICAgIHg6IHQsXG4gICAgICAgICAgeTogZSxcbiAgICAgICAgICByYWRpdXM6IGlcbiAgICAgICAgfSxcbiAgICAgICAgc2VlblVpZHM6IHtcbiAgICAgICAgICBib3g6IHt9LFxuICAgICAgICAgIGNpcmNsZToge31cbiAgICAgICAgfVxuICAgICAgfSwgciksIG8gPyBjLmxlbmd0aCA+IDAgOiBjO1xuICAgIH0sIFl0LnByb3RvdHlwZS5xdWVyeSA9IGZ1bmN0aW9uICh0LCBlLCBpLCBvLCByKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcXVlcnkodCwgZSwgaSwgbywgITEsIHIpO1xuICAgIH0sIFl0LnByb3RvdHlwZS5oaXRUZXN0ID0gZnVuY3Rpb24gKHQsIGUsIGksIG8sIHIpIHtcbiAgICAgIHJldHVybiB0aGlzLl9xdWVyeSh0LCBlLCBpLCBvLCAhMCwgcik7XG4gICAgfSwgWXQucHJvdG90eXBlLmhpdFRlc3RDaXJjbGUgPSBmdW5jdGlvbiAodCwgZSwgaSwgbykge1xuICAgICAgcmV0dXJuIHRoaXMuX3F1ZXJ5Q2lyY2xlKHQsIGUsIGksICEwLCBvKTtcbiAgICB9LCBZdC5wcm90b3R5cGUuX3F1ZXJ5Q2VsbCA9IGZ1bmN0aW9uICh0LCBlLCBpLCBvLCByLCBhLCBuLCBzKSB7XG4gICAgICB2YXIgbCA9IG4uc2VlblVpZHMsXG4gICAgICAgICAgYyA9IHRoaXMuYm94Q2VsbHNbcl07XG4gICAgICBpZiAobnVsbCAhPT0gYykgZm9yICh2YXIgdSA9IHRoaXMuYmJveGVzLCBoID0gMCwgcCA9IGM7IGggPCBwLmxlbmd0aDsgaCArPSAxKSB7XG4gICAgICAgIHZhciBkID0gcFtoXTtcblxuICAgICAgICBpZiAoIWwuYm94W2RdKSB7XG4gICAgICAgICAgbC5ib3hbZF0gPSAhMDtcblxuICAgICAgICAgIHZhciBfID0gNCAqIGQ7XG5cbiAgICAgICAgICBpZiAodCA8PSB1W18gKyAyXSAmJiBlIDw9IHVbXyArIDNdICYmIGkgPj0gdVtfICsgMF0gJiYgbyA+PSB1W18gKyAxXSAmJiAoIXMgfHwgcyh0aGlzLmJveEtleXNbZF0pKSkge1xuICAgICAgICAgICAgaWYgKG4uaGl0VGVzdCkgcmV0dXJuIGEucHVzaCghMCksICEwO1xuICAgICAgICAgICAgYS5wdXNoKHtcbiAgICAgICAgICAgICAga2V5OiB0aGlzLmJveEtleXNbZF0sXG4gICAgICAgICAgICAgIHgxOiB1W19dLFxuICAgICAgICAgICAgICB5MTogdVtfICsgMV0sXG4gICAgICAgICAgICAgIHgyOiB1W18gKyAyXSxcbiAgICAgICAgICAgICAgeTI6IHVbXyArIDNdXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBmID0gdGhpcy5jaXJjbGVDZWxsc1tyXTtcbiAgICAgIGlmIChudWxsICE9PSBmKSBmb3IgKHZhciBtID0gdGhpcy5jaXJjbGVzLCBnID0gMCwgdiA9IGY7IGcgPCB2Lmxlbmd0aDsgZyArPSAxKSB7XG4gICAgICAgIHZhciB5ID0gdltnXTtcblxuICAgICAgICBpZiAoIWwuY2lyY2xlW3ldKSB7XG4gICAgICAgICAgbC5jaXJjbGVbeV0gPSAhMDtcbiAgICAgICAgICB2YXIgeCA9IDMgKiB5O1xuXG4gICAgICAgICAgaWYgKHRoaXMuX2NpcmNsZUFuZFJlY3RDb2xsaWRlKG1beF0sIG1beCArIDFdLCBtW3ggKyAyXSwgdCwgZSwgaSwgbykgJiYgKCFzIHx8IHModGhpcy5jaXJjbGVLZXlzW3ldKSkpIHtcbiAgICAgICAgICAgIGlmIChuLmhpdFRlc3QpIHJldHVybiBhLnB1c2goITApLCAhMDtcbiAgICAgICAgICAgIHZhciBiID0gbVt4XSxcbiAgICAgICAgICAgICAgICB3ID0gbVt4ICsgMV0sXG4gICAgICAgICAgICAgICAgVCA9IG1beCArIDJdO1xuICAgICAgICAgICAgYS5wdXNoKHtcbiAgICAgICAgICAgICAga2V5OiB0aGlzLmNpcmNsZUtleXNbeV0sXG4gICAgICAgICAgICAgIHgxOiBiIC0gVCxcbiAgICAgICAgICAgICAgeTE6IHcgLSBULFxuICAgICAgICAgICAgICB4MjogYiArIFQsXG4gICAgICAgICAgICAgIHkyOiB3ICsgVFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgWXQucHJvdG90eXBlLl9xdWVyeUNlbGxDaXJjbGUgPSBmdW5jdGlvbiAodCwgZSwgaSwgbywgciwgYSwgbiwgcykge1xuICAgICAgdmFyIGwgPSBuLmNpcmNsZSxcbiAgICAgICAgICBjID0gbi5zZWVuVWlkcyxcbiAgICAgICAgICB1ID0gdGhpcy5ib3hDZWxsc1tyXTtcbiAgICAgIGlmIChudWxsICE9PSB1KSBmb3IgKHZhciBoID0gdGhpcy5iYm94ZXMsIHAgPSAwLCBkID0gdTsgcCA8IGQubGVuZ3RoOyBwICs9IDEpIHtcbiAgICAgICAgdmFyIF8gPSBkW3BdO1xuXG4gICAgICAgIGlmICghYy5ib3hbX10pIHtcbiAgICAgICAgICBjLmJveFtfXSA9ICEwO1xuICAgICAgICAgIHZhciBmID0gNCAqIF87XG4gICAgICAgICAgaWYgKHRoaXMuX2NpcmNsZUFuZFJlY3RDb2xsaWRlKGwueCwgbC55LCBsLnJhZGl1cywgaFtmICsgMF0sIGhbZiArIDFdLCBoW2YgKyAyXSwgaFtmICsgM10pICYmICghcyB8fCBzKHRoaXMuYm94S2V5c1tfXSkpKSByZXR1cm4gYS5wdXNoKCEwKSwgITA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBtID0gdGhpcy5jaXJjbGVDZWxsc1tyXTtcbiAgICAgIGlmIChudWxsICE9PSBtKSBmb3IgKHZhciBnID0gdGhpcy5jaXJjbGVzLCB2ID0gMCwgeSA9IG07IHYgPCB5Lmxlbmd0aDsgdiArPSAxKSB7XG4gICAgICAgIHZhciB4ID0geVt2XTtcblxuICAgICAgICBpZiAoIWMuY2lyY2xlW3hdKSB7XG4gICAgICAgICAgYy5jaXJjbGVbeF0gPSAhMDtcbiAgICAgICAgICB2YXIgYiA9IDMgKiB4O1xuICAgICAgICAgIGlmICh0aGlzLl9jaXJjbGVzQ29sbGlkZShnW2JdLCBnW2IgKyAxXSwgZ1tiICsgMl0sIGwueCwgbC55LCBsLnJhZGl1cykgJiYgKCFzIHx8IHModGhpcy5jaXJjbGVLZXlzW3hdKSkpIHJldHVybiBhLnB1c2goITApLCAhMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIFl0LnByb3RvdHlwZS5fZm9yRWFjaENlbGwgPSBmdW5jdGlvbiAodCwgZSwgaSwgbywgciwgYSwgbiwgcykge1xuICAgICAgZm9yICh2YXIgbCA9IHRoaXMuX2NvbnZlcnRUb1hDZWxsQ29vcmQodCksIGMgPSB0aGlzLl9jb252ZXJ0VG9ZQ2VsbENvb3JkKGUpLCB1ID0gdGhpcy5fY29udmVydFRvWENlbGxDb29yZChpKSwgaCA9IHRoaXMuX2NvbnZlcnRUb1lDZWxsQ29vcmQobyksIHAgPSBsOyBwIDw9IHU7IHArKykge1xuICAgICAgICBmb3IgKHZhciBkID0gYzsgZCA8PSBoOyBkKyspIHtcbiAgICAgICAgICBpZiAoci5jYWxsKHRoaXMsIHQsIGUsIGksIG8sIHRoaXMueENlbGxDb3VudCAqIGQgKyBwLCBhLCBuLCBzKSkgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgWXQucHJvdG90eXBlLl9jb252ZXJ0VG9YQ2VsbENvb3JkID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbih0aGlzLnhDZWxsQ291bnQgLSAxLCBNYXRoLmZsb29yKHQgKiB0aGlzLnhTY2FsZSkpKTtcbiAgICB9LCBZdC5wcm90b3R5cGUuX2NvbnZlcnRUb1lDZWxsQ29vcmQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKHRoaXMueUNlbGxDb3VudCAtIDEsIE1hdGguZmxvb3IodCAqIHRoaXMueVNjYWxlKSkpO1xuICAgIH0sIFl0LnByb3RvdHlwZS5fY2lyY2xlc0NvbGxpZGUgPSBmdW5jdGlvbiAodCwgZSwgaSwgbywgciwgYSkge1xuICAgICAgdmFyIG4gPSBvIC0gdCxcbiAgICAgICAgICBzID0gciAtIGUsXG4gICAgICAgICAgbCA9IGkgKyBhO1xuICAgICAgcmV0dXJuIGwgKiBsID4gbiAqIG4gKyBzICogcztcbiAgICB9LCBZdC5wcm90b3R5cGUuX2NpcmNsZUFuZFJlY3RDb2xsaWRlID0gZnVuY3Rpb24gKHQsIGUsIGksIG8sIHIsIGEsIG4pIHtcbiAgICAgIHZhciBzID0gKGEgLSBvKSAvIDIsXG4gICAgICAgICAgbCA9IE1hdGguYWJzKHQgLSAobyArIHMpKTtcbiAgICAgIGlmIChsID4gcyArIGkpIHJldHVybiAhMTtcbiAgICAgIHZhciBjID0gKG4gLSByKSAvIDIsXG4gICAgICAgICAgdSA9IE1hdGguYWJzKGUgLSAociArIGMpKTtcbiAgICAgIGlmICh1ID4gYyArIGkpIHJldHVybiAhMTtcbiAgICAgIGlmIChsIDw9IHMgfHwgdSA8PSBjKSByZXR1cm4gITA7XG4gICAgICB2YXIgaCA9IGwgLSBzLFxuICAgICAgICAgIHAgPSB1IC0gYztcbiAgICAgIHJldHVybiBoICogaCArIHAgKiBwIDw9IGkgKiBpO1xuICAgIH07XG4gICAgdmFyIGxlID0gbmV3IEZsb2F0MzJBcnJheShbLTEgLyAwLCAtMSAvIDAsIDAsIC0xIC8gMCwgLTEgLyAwLCAwLCAtMSAvIDAsIC0xIC8gMCwgMCwgLTEgLyAwLCAtMSAvIDAsIDBdKTtcblxuICAgIGZ1bmN0aW9uIGNlKHQsIGUpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdDsgaSsrKSB7XG4gICAgICAgIHZhciBvID0gZS5sZW5ndGg7XG4gICAgICAgIGUucmVzaXplKG8gKyA0KSwgZS5mbG9hdDMyLnNldChsZSwgMyAqIG8pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVlKHQsIGUsIGkpIHtcbiAgICAgIHZhciBvID0gZVswXSxcbiAgICAgICAgICByID0gZVsxXTtcbiAgICAgIHJldHVybiB0WzBdID0gaVswXSAqIG8gKyBpWzRdICogciArIGlbMTJdLCB0WzFdID0gaVsxXSAqIG8gKyBpWzVdICogciArIGlbMTNdLCB0WzNdID0gaVszXSAqIG8gKyBpWzddICogciArIGlbMTVdLCB0O1xuICAgIH1cblxuICAgIHZhciBoZSA9IGZ1bmN0aW9uIGhlKHQsIGUsIGkpIHtcbiAgICAgIHZvaWQgMCA9PT0gZSAmJiAoZSA9IG5ldyBZdCh0LndpZHRoICsgMjAwLCB0LmhlaWdodCArIDIwMCwgMjUpKSwgdm9pZCAwID09PSBpICYmIChpID0gbmV3IFl0KHQud2lkdGggKyAyMDAsIHQuaGVpZ2h0ICsgMjAwLCAyNSkpLCB0aGlzLnRyYW5zZm9ybSA9IHQsIHRoaXMuZ3JpZCA9IGUsIHRoaXMuaWdub3JlZEdyaWQgPSBpLCB0aGlzLnBpdGNoZmFjdG9yID0gTWF0aC5jb3ModC5fcGl0Y2gpICogdC5jYW1lcmFUb0NlbnRlckRpc3RhbmNlLCB0aGlzLnNjcmVlblJpZ2h0Qm91bmRhcnkgPSB0LndpZHRoICsgMTAwLCB0aGlzLnNjcmVlbkJvdHRvbUJvdW5kYXJ5ID0gdC5oZWlnaHQgKyAxMDAsIHRoaXMuZ3JpZFJpZ2h0Qm91bmRhcnkgPSB0LndpZHRoICsgMjAwLCB0aGlzLmdyaWRCb3R0b21Cb3VuZGFyeSA9IHQuaGVpZ2h0ICsgMjAwO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBwZShlLCBpLCBvKSB7XG4gICAgICByZXR1cm4gaSAqICh0LkVYVEVOVCAvIChlLnRpbGVTaXplICogTWF0aC5wb3coMiwgbyAtIGUudGlsZUlELm92ZXJzY2FsZWRaKSkpO1xuICAgIH1cblxuICAgIGhlLnByb3RvdHlwZS5wbGFjZUNvbGxpc2lvbkJveCA9IGZ1bmN0aW9uICh0LCBlLCBpLCBvLCByKSB7XG4gICAgICB2YXIgYSA9IHRoaXMucHJvamVjdEFuZEdldFBlcnNwZWN0aXZlUmF0aW8obywgdC5hbmNob3JQb2ludFgsIHQuYW5jaG9yUG9pbnRZKSxcbiAgICAgICAgICBuID0gaSAqIGEucGVyc3BlY3RpdmVSYXRpbyxcbiAgICAgICAgICBzID0gdC54MSAqIG4gKyBhLnBvaW50LngsXG4gICAgICAgICAgbCA9IHQueTEgKiBuICsgYS5wb2ludC55LFxuICAgICAgICAgIGMgPSB0LngyICogbiArIGEucG9pbnQueCxcbiAgICAgICAgICB1ID0gdC55MiAqIG4gKyBhLnBvaW50Lnk7XG4gICAgICByZXR1cm4gIXRoaXMuaXNJbnNpZGVHcmlkKHMsIGwsIGMsIHUpIHx8ICFlICYmIHRoaXMuZ3JpZC5oaXRUZXN0KHMsIGwsIGMsIHUsIHIpID8ge1xuICAgICAgICBib3g6IFtdLFxuICAgICAgICBvZmZzY3JlZW46ICExXG4gICAgICB9IDoge1xuICAgICAgICBib3g6IFtzLCBsLCBjLCB1XSxcbiAgICAgICAgb2Zmc2NyZWVuOiB0aGlzLmlzT2Zmc2NyZWVuKHMsIGwsIGMsIHUpXG4gICAgICB9O1xuICAgIH0sIGhlLnByb3RvdHlwZS5wbGFjZUNvbGxpc2lvbkNpcmNsZXMgPSBmdW5jdGlvbiAoZSwgaSwgbywgciwgYSwgbiwgcywgbCwgYywgdSwgaCwgcCwgZCkge1xuICAgICAgdmFyIF8gPSBbXSxcbiAgICAgICAgICBmID0gbmV3IHQuUG9pbnQoaS5hbmNob3JYLCBpLmFuY2hvclkpLFxuICAgICAgICAgIG0gPSAkdChmLCBuKSxcbiAgICAgICAgICBnID0gdGUodGhpcy50cmFuc2Zvcm0uY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSwgbS5zaWduZWREaXN0YW5jZUZyb21DYW1lcmEpLFxuICAgICAgICAgIHYgPSAodSA/IGEgLyBnIDogYSAqIGcpIC8gdC5PTkVfRU0sXG4gICAgICAgICAgeSA9ICR0KGYsIHMpLnBvaW50LFxuICAgICAgICAgIHggPSBvZSh2LCByLCBpLmxpbmVPZmZzZXRYICogdiwgaS5saW5lT2Zmc2V0WSAqIHYsICExLCB5LCBmLCBpLCBvLCBzLCB7fSksXG4gICAgICAgICAgYiA9ICExLFxuICAgICAgICAgIHcgPSAhMSxcbiAgICAgICAgICBUID0gITA7XG5cbiAgICAgIGlmICh4KSB7XG4gICAgICAgIGZvciAodmFyIEUgPSAuNSAqIHAgKiBnICsgZCwgSSA9IG5ldyB0LlBvaW50KC0xMDAsIC0xMDApLCBQID0gbmV3IHQuUG9pbnQodGhpcy5zY3JlZW5SaWdodEJvdW5kYXJ5LCB0aGlzLnNjcmVlbkJvdHRvbUJvdW5kYXJ5KSwgUyA9IG5ldyBLdCgpLCBDID0geC5maXJzdCwgeiA9IHgubGFzdCwgRCA9IFtdLCBBID0gQy5wYXRoLmxlbmd0aCAtIDE7IEEgPj0gMTsgQS0tKSB7XG4gICAgICAgICAgRC5wdXNoKEMucGF0aFtBXSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBNID0gMTsgTSA8IHoucGF0aC5sZW5ndGg7IE0rKykge1xuICAgICAgICAgIEQucHVzaCh6LnBhdGhbTV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIEwgPSAyLjUgKiBFO1xuXG4gICAgICAgIGlmIChsKSB7XG4gICAgICAgICAgdmFyIFIgPSBELm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgcmV0dXJuICR0KHQsIGwpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIEQgPSBSLnNvbWUoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgIHJldHVybiB0LnNpZ25lZERpc3RhbmNlRnJvbUNhbWVyYSA8PSAwO1xuICAgICAgICAgIH0pID8gW10gOiBSLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgcmV0dXJuIHQucG9pbnQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgayA9IFtdO1xuXG4gICAgICAgIGlmIChELmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBmb3IgKHZhciBCID0gRFswXS5jbG9uZSgpLCBPID0gRFswXS5jbG9uZSgpLCBGID0gMTsgRiA8IEQubGVuZ3RoOyBGKyspIHtcbiAgICAgICAgICAgIEIueCA9IE1hdGgubWluKEIueCwgRFtGXS54KSwgQi55ID0gTWF0aC5taW4oQi55LCBEW0ZdLnkpLCBPLnggPSBNYXRoLm1heChPLngsIERbRl0ueCksIE8ueSA9IE1hdGgubWF4KE8ueSwgRFtGXS55KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBrID0gQi54ID49IEkueCAmJiBPLnggPD0gUC54ICYmIEIueSA+PSBJLnkgJiYgTy55IDw9IFAueSA/IFtEXSA6IE8ueCA8IEkueCB8fCBCLnggPiBQLnggfHwgTy55IDwgSS55IHx8IEIueSA+IFAueSA/IFtdIDogdC5jbGlwTGluZShbRF0sIEkueCwgSS55LCBQLngsIFAueSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBVID0gMCwgTiA9IGs7IFUgPCBOLmxlbmd0aDsgVSArPSAxKSB7XG4gICAgICAgICAgdmFyIFo7XG4gICAgICAgICAgUy5yZXNldChOW1VdLCAuMjUgKiBFKSwgWiA9IFMubGVuZ3RoIDw9IC41ICogRSA/IDEgOiBNYXRoLmNlaWwoUy5wYWRkZWRMZW5ndGggLyBMKSArIDE7XG5cbiAgICAgICAgICBmb3IgKHZhciBxID0gMDsgcSA8IFo7IHErKykge1xuICAgICAgICAgICAgdmFyIGogPSBxIC8gTWF0aC5tYXgoWiAtIDEsIDEpLFxuICAgICAgICAgICAgICAgIFYgPSBTLmxlcnAoaiksXG4gICAgICAgICAgICAgICAgRyA9IFYueCArIDEwMCxcbiAgICAgICAgICAgICAgICBXID0gVi55ICsgMTAwO1xuXG4gICAgICAgICAgICBfLnB1c2goRywgVywgRSwgMCk7XG5cbiAgICAgICAgICAgIHZhciBYID0gRyAtIEUsXG4gICAgICAgICAgICAgICAgSCA9IFcgLSBFLFxuICAgICAgICAgICAgICAgIEsgPSBHICsgRSxcbiAgICAgICAgICAgICAgICBZID0gVyArIEU7XG4gICAgICAgICAgICBpZiAoVCA9IFQgJiYgdGhpcy5pc09mZnNjcmVlbihYLCBILCBLLCBZKSwgdyA9IHcgfHwgdGhpcy5pc0luc2lkZUdyaWQoWCwgSCwgSywgWSksICFlICYmIHRoaXMuZ3JpZC5oaXRUZXN0Q2lyY2xlKEcsIFcsIEUsIGgpICYmIChiID0gITAsICFjKSkgcmV0dXJuIHtcbiAgICAgICAgICAgICAgY2lyY2xlczogW10sXG4gICAgICAgICAgICAgIG9mZnNjcmVlbjogITEsXG4gICAgICAgICAgICAgIGNvbGxpc2lvbkRldGVjdGVkOiBiXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjaXJjbGVzOiAhYyAmJiBiIHx8ICF3ID8gW10gOiBfLFxuICAgICAgICBvZmZzY3JlZW46IFQsXG4gICAgICAgIGNvbGxpc2lvbkRldGVjdGVkOiBiXG4gICAgICB9O1xuICAgIH0sIGhlLnByb3RvdHlwZS5xdWVyeVJlbmRlcmVkU3ltYm9scyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoMCA9PT0gZS5sZW5ndGggfHwgMCA9PT0gdGhpcy5ncmlkLmtleXNMZW5ndGgoKSAmJiAwID09PSB0aGlzLmlnbm9yZWRHcmlkLmtleXNMZW5ndGgoKSkgcmV0dXJuIHt9O1xuXG4gICAgICBmb3IgKHZhciBpID0gW10sIG8gPSAxIC8gMCwgciA9IDEgLyAwLCBhID0gLTEgLyAwLCBuID0gLTEgLyAwLCBzID0gMCwgbCA9IGU7IHMgPCBsLmxlbmd0aDsgcyArPSAxKSB7XG4gICAgICAgIHZhciBjID0gbFtzXSxcbiAgICAgICAgICAgIHUgPSBuZXcgdC5Qb2ludChjLnggKyAxMDAsIGMueSArIDEwMCk7XG4gICAgICAgIG8gPSBNYXRoLm1pbihvLCB1LngpLCByID0gTWF0aC5taW4ociwgdS55KSwgYSA9IE1hdGgubWF4KGEsIHUueCksIG4gPSBNYXRoLm1heChuLCB1LnkpLCBpLnB1c2godSk7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGggPSB7fSwgcCA9IHt9LCBkID0gMCwgXyA9IHRoaXMuZ3JpZC5xdWVyeShvLCByLCBhLCBuKS5jb25jYXQodGhpcy5pZ25vcmVkR3JpZC5xdWVyeShvLCByLCBhLCBuKSk7IGQgPCBfLmxlbmd0aDsgZCArPSAxKSB7XG4gICAgICAgIHZhciBmID0gX1tkXSxcbiAgICAgICAgICAgIG0gPSBmLmtleTtcblxuICAgICAgICBpZiAodm9pZCAwID09PSBoW20uYnVja2V0SW5zdGFuY2VJZF0gJiYgKGhbbS5idWNrZXRJbnN0YW5jZUlkXSA9IHt9KSwgIWhbbS5idWNrZXRJbnN0YW5jZUlkXVttLmZlYXR1cmVJbmRleF0pIHtcbiAgICAgICAgICB2YXIgZyA9IFtuZXcgdC5Qb2ludChmLngxLCBmLnkxKSwgbmV3IHQuUG9pbnQoZi54MiwgZi55MSksIG5ldyB0LlBvaW50KGYueDIsIGYueTIpLCBuZXcgdC5Qb2ludChmLngxLCBmLnkyKV07XG4gICAgICAgICAgdC5wb2x5Z29uSW50ZXJzZWN0c1BvbHlnb24oaSwgZykgJiYgKGhbbS5idWNrZXRJbnN0YW5jZUlkXVttLmZlYXR1cmVJbmRleF0gPSAhMCwgdm9pZCAwID09PSBwW20uYnVja2V0SW5zdGFuY2VJZF0gJiYgKHBbbS5idWNrZXRJbnN0YW5jZUlkXSA9IFtdKSwgcFttLmJ1Y2tldEluc3RhbmNlSWRdLnB1c2gobS5mZWF0dXJlSW5kZXgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcDtcbiAgICB9LCBoZS5wcm90b3R5cGUuaW5zZXJ0Q29sbGlzaW9uQm94ID0gZnVuY3Rpb24gKHQsIGUsIGksIG8sIHIpIHtcbiAgICAgIChlID8gdGhpcy5pZ25vcmVkR3JpZCA6IHRoaXMuZ3JpZCkuaW5zZXJ0KHtcbiAgICAgICAgYnVja2V0SW5zdGFuY2VJZDogaSxcbiAgICAgICAgZmVhdHVyZUluZGV4OiBvLFxuICAgICAgICBjb2xsaXNpb25Hcm91cElEOiByXG4gICAgICB9LCB0WzBdLCB0WzFdLCB0WzJdLCB0WzNdKTtcbiAgICB9LCBoZS5wcm90b3R5cGUuaW5zZXJ0Q29sbGlzaW9uQ2lyY2xlcyA9IGZ1bmN0aW9uICh0LCBlLCBpLCBvLCByKSB7XG4gICAgICBmb3IgKHZhciBhID0gZSA/IHRoaXMuaWdub3JlZEdyaWQgOiB0aGlzLmdyaWQsIG4gPSB7XG4gICAgICAgIGJ1Y2tldEluc3RhbmNlSWQ6IGksXG4gICAgICAgIGZlYXR1cmVJbmRleDogbyxcbiAgICAgICAgY29sbGlzaW9uR3JvdXBJRDogclxuICAgICAgfSwgcyA9IDA7IHMgPCB0Lmxlbmd0aDsgcyArPSA0KSB7XG4gICAgICAgIGEuaW5zZXJ0Q2lyY2xlKG4sIHRbc10sIHRbcyArIDFdLCB0W3MgKyAyXSk7XG4gICAgICB9XG4gICAgfSwgaGUucHJvdG90eXBlLnByb2plY3RBbmRHZXRQZXJzcGVjdGl2ZVJhdGlvID0gZnVuY3Rpb24gKGUsIGksIG8pIHtcbiAgICAgIHZhciByID0gW2ksIG8sIDAsIDFdO1xuICAgICAgcmV0dXJuIHVlKHIsIHIsIGUpLCB7XG4gICAgICAgIHBvaW50OiBuZXcgdC5Qb2ludCgoclswXSAvIHJbM10gKyAxKSAvIDIgKiB0aGlzLnRyYW5zZm9ybS53aWR0aCArIDEwMCwgKC1yWzFdIC8gclszXSArIDEpIC8gMiAqIHRoaXMudHJhbnNmb3JtLmhlaWdodCArIDEwMCksXG4gICAgICAgIHBlcnNwZWN0aXZlUmF0aW86IC41ICsgdGhpcy50cmFuc2Zvcm0uY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSAvIHJbM10gKiAuNVxuICAgICAgfTtcbiAgICB9LCBoZS5wcm90b3R5cGUuaXNPZmZzY3JlZW4gPSBmdW5jdGlvbiAodCwgZSwgaSwgbykge1xuICAgICAgcmV0dXJuIGkgPCAxMDAgfHwgdCA+PSB0aGlzLnNjcmVlblJpZ2h0Qm91bmRhcnkgfHwgbyA8IDEwMCB8fCBlID4gdGhpcy5zY3JlZW5Cb3R0b21Cb3VuZGFyeTtcbiAgICB9LCBoZS5wcm90b3R5cGUuaXNJbnNpZGVHcmlkID0gZnVuY3Rpb24gKHQsIGUsIGksIG8pIHtcbiAgICAgIHJldHVybiBpID49IDAgJiYgdCA8IHRoaXMuZ3JpZFJpZ2h0Qm91bmRhcnkgJiYgbyA+PSAwICYmIGUgPCB0aGlzLmdyaWRCb3R0b21Cb3VuZGFyeTtcbiAgICB9LCBoZS5wcm90b3R5cGUuZ2V0Vmlld3BvcnRNYXRyaXggPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgZSA9IHQuaWRlbnRpdHkoW10pO1xuICAgICAgcmV0dXJuIHQudHJhbnNsYXRlKGUsIGUsIFstMTAwLCAtMTAwLCAwXSksIGU7XG4gICAgfTtcblxuICAgIHZhciBkZSA9IGZ1bmN0aW9uIGRlKHQsIGUsIGksIG8pIHtcbiAgICAgIHRoaXMub3BhY2l0eSA9IHQgPyBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCB0Lm9wYWNpdHkgKyAodC5wbGFjZWQgPyBlIDogLWUpKSkgOiBvICYmIGkgPyAxIDogMCwgdGhpcy5wbGFjZWQgPSBpO1xuICAgIH07XG5cbiAgICBkZS5wcm90b3R5cGUuaXNIaWRkZW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gMCA9PT0gdGhpcy5vcGFjaXR5ICYmICF0aGlzLnBsYWNlZDtcbiAgICB9O1xuXG4gICAgdmFyIF9lID0gZnVuY3Rpb24gX2UodCwgZSwgaSwgbywgcikge1xuICAgICAgdGhpcy50ZXh0ID0gbmV3IGRlKHQgPyB0LnRleHQgOiBudWxsLCBlLCBpLCByKSwgdGhpcy5pY29uID0gbmV3IGRlKHQgPyB0Lmljb24gOiBudWxsLCBlLCBvLCByKTtcbiAgICB9O1xuXG4gICAgX2UucHJvdG90eXBlLmlzSGlkZGVuID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMudGV4dC5pc0hpZGRlbigpICYmIHRoaXMuaWNvbi5pc0hpZGRlbigpO1xuICAgIH07XG5cbiAgICB2YXIgZmUgPSBmdW5jdGlvbiBmZSh0LCBlLCBpKSB7XG4gICAgICB0aGlzLnRleHQgPSB0LCB0aGlzLmljb24gPSBlLCB0aGlzLnNraXBGYWRlID0gaTtcbiAgICB9LFxuICAgICAgICBtZSA9IGZ1bmN0aW9uIG1lKCkge1xuICAgICAgdGhpcy5pbnZQcm9qTWF0cml4ID0gdC5jcmVhdGUoKSwgdGhpcy52aWV3cG9ydE1hdHJpeCA9IHQuY3JlYXRlKCksIHRoaXMuY2lyY2xlcyA9IFtdO1xuICAgIH0sXG4gICAgICAgIGdlID0gZnVuY3Rpb24gZ2UodCwgZSwgaSwgbywgcikge1xuICAgICAgdGhpcy5idWNrZXRJbnN0YW5jZUlkID0gdCwgdGhpcy5mZWF0dXJlSW5kZXggPSBlLCB0aGlzLnNvdXJjZUxheWVySW5kZXggPSBpLCB0aGlzLmJ1Y2tldEluZGV4ID0gbywgdGhpcy50aWxlSUQgPSByO1xuICAgIH0sXG4gICAgICAgIHZlID0gZnVuY3Rpb24gdmUodCkge1xuICAgICAgdGhpcy5jcm9zc1NvdXJjZUNvbGxpc2lvbnMgPSB0LCB0aGlzLm1heEdyb3VwSUQgPSAwLCB0aGlzLmNvbGxpc2lvbkdyb3VwcyA9IHt9O1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiB5ZShlLCBpLCBvLCByLCBhKSB7XG4gICAgICB2YXIgbiA9IHQuZ2V0QW5jaG9yQWxpZ25tZW50KGUpLFxuICAgICAgICAgIHMgPSAtKG4uaG9yaXpvbnRhbEFsaWduIC0gLjUpICogaSxcbiAgICAgICAgICBsID0gLShuLnZlcnRpY2FsQWxpZ24gLSAuNSkgKiBvLFxuICAgICAgICAgIGMgPSB0LmV2YWx1YXRlVmFyaWFibGVPZmZzZXQoZSwgcik7XG4gICAgICByZXR1cm4gbmV3IHQuUG9pbnQocyArIGNbMF0gKiBhLCBsICsgY1sxXSAqIGEpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHhlKGUsIGksIG8sIHIsIGEsIG4pIHtcbiAgICAgIHZhciBzID0gZS54MSxcbiAgICAgICAgICBsID0gZS54MixcbiAgICAgICAgICBjID0gZS55MSxcbiAgICAgICAgICB1ID0gZS55MixcbiAgICAgICAgICBoID0gZS5hbmNob3JQb2ludFgsXG4gICAgICAgICAgcCA9IGUuYW5jaG9yUG9pbnRZLFxuICAgICAgICAgIGQgPSBuZXcgdC5Qb2ludChpLCBvKTtcbiAgICAgIHJldHVybiByICYmIGQuX3JvdGF0ZShhID8gbiA6IC1uKSwge1xuICAgICAgICB4MTogcyArIGQueCxcbiAgICAgICAgeTE6IGMgKyBkLnksXG4gICAgICAgIHgyOiBsICsgZC54LFxuICAgICAgICB5MjogdSArIGQueSxcbiAgICAgICAgYW5jaG9yUG9pbnRYOiBoLFxuICAgICAgICBhbmNob3JQb2ludFk6IHBcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBpZiAodGhpcy5jcm9zc1NvdXJjZUNvbGxpc2lvbnMpIHJldHVybiB7XG4gICAgICAgIElEOiAwLFxuICAgICAgICBwcmVkaWNhdGU6IG51bGxcbiAgICAgIH07XG5cbiAgICAgIGlmICghdGhpcy5jb2xsaXNpb25Hcm91cHNbdF0pIHtcbiAgICAgICAgdmFyIGUgPSArK3RoaXMubWF4R3JvdXBJRDtcbiAgICAgICAgdGhpcy5jb2xsaXNpb25Hcm91cHNbdF0gPSB7XG4gICAgICAgICAgSUQ6IGUsXG4gICAgICAgICAgcHJlZGljYXRlOiBmdW5jdGlvbiBwcmVkaWNhdGUodCkge1xuICAgICAgICAgICAgcmV0dXJuIHQuY29sbGlzaW9uR3JvdXBJRCA9PT0gZTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmNvbGxpc2lvbkdyb3Vwc1t0XTtcbiAgICB9O1xuXG4gICAgdmFyIGJlID0gZnVuY3Rpb24gYmUodCwgZSwgaSwgbykge1xuICAgICAgdGhpcy50cmFuc2Zvcm0gPSB0LmNsb25lKCksIHRoaXMuY29sbGlzaW9uSW5kZXggPSBuZXcgaGUodGhpcy50cmFuc2Zvcm0pLCB0aGlzLnBsYWNlbWVudHMgPSB7fSwgdGhpcy5vcGFjaXRpZXMgPSB7fSwgdGhpcy52YXJpYWJsZU9mZnNldHMgPSB7fSwgdGhpcy5zdGFsZSA9ICExLCB0aGlzLmNvbW1pdFRpbWUgPSAwLCB0aGlzLmZhZGVEdXJhdGlvbiA9IGUsIHRoaXMucmV0YWluZWRRdWVyeURhdGEgPSB7fSwgdGhpcy5jb2xsaXNpb25Hcm91cHMgPSBuZXcgdmUoaSksIHRoaXMuY29sbGlzaW9uQ2lyY2xlQXJyYXlzID0ge30sIHRoaXMucHJldlBsYWNlbWVudCA9IG8sIG8gJiYgKG8ucHJldlBsYWNlbWVudCA9IHZvaWQgMCksIHRoaXMucGxhY2VkT3JpZW50YXRpb25zID0ge307XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHdlKHQsIGUsIGksIG8sIHIpIHtcbiAgICAgIHQuZW1wbGFjZUJhY2soZSA/IDEgOiAwLCBpID8gMSA6IDAsIG8gfHwgMCwgciB8fCAwKSwgdC5lbXBsYWNlQmFjayhlID8gMSA6IDAsIGkgPyAxIDogMCwgbyB8fCAwLCByIHx8IDApLCB0LmVtcGxhY2VCYWNrKGUgPyAxIDogMCwgaSA/IDEgOiAwLCBvIHx8IDAsIHIgfHwgMCksIHQuZW1wbGFjZUJhY2soZSA/IDEgOiAwLCBpID8gMSA6IDAsIG8gfHwgMCwgciB8fCAwKTtcbiAgICB9XG5cbiAgICBiZS5wcm90b3R5cGUuZ2V0QnVja2V0UGFydHMgPSBmdW5jdGlvbiAoZSwgaSwgbywgcikge1xuICAgICAgdmFyIGEgPSBvLmdldEJ1Y2tldChpKSxcbiAgICAgICAgICBuID0gby5sYXRlc3RGZWF0dXJlSW5kZXg7XG5cbiAgICAgIGlmIChhICYmIG4gJiYgaS5pZCA9PT0gYS5sYXllcklkc1swXSkge1xuICAgICAgICB2YXIgcyA9IG8uY29sbGlzaW9uQm94QXJyYXksXG4gICAgICAgICAgICBsID0gYS5sYXllcnNbMF0ubGF5b3V0LFxuICAgICAgICAgICAgYyA9IE1hdGgucG93KDIsIHRoaXMudHJhbnNmb3JtLnpvb20gLSBvLnRpbGVJRC5vdmVyc2NhbGVkWiksXG4gICAgICAgICAgICB1ID0gby50aWxlU2l6ZSAvIHQuRVhURU5ULFxuICAgICAgICAgICAgaCA9IHRoaXMudHJhbnNmb3JtLmNhbGN1bGF0ZVBvc01hdHJpeChvLnRpbGVJRC50b1Vud3JhcHBlZCgpKSxcbiAgICAgICAgICAgIHAgPSBcIm1hcFwiID09PSBsLmdldChcInRleHQtcGl0Y2gtYWxpZ25tZW50XCIpLFxuICAgICAgICAgICAgZCA9IFwibWFwXCIgPT09IGwuZ2V0KFwidGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIiksXG4gICAgICAgICAgICBfID0gcGUobywgMSwgdGhpcy50cmFuc2Zvcm0uem9vbSksXG4gICAgICAgICAgICBmID0gSnQoaCwgcCwgZCwgdGhpcy50cmFuc2Zvcm0sIF8pLFxuICAgICAgICAgICAgbSA9IG51bGw7XG5cbiAgICAgICAgaWYgKHApIHtcbiAgICAgICAgICB2YXIgZyA9IFF0KGgsIHAsIGQsIHRoaXMudHJhbnNmb3JtLCBfKTtcbiAgICAgICAgICBtID0gdC5tdWx0aXBseShbXSwgdGhpcy50cmFuc2Zvcm0ubGFiZWxQbGFuZU1hdHJpeCwgZyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJldGFpbmVkUXVlcnlEYXRhW2EuYnVja2V0SW5zdGFuY2VJZF0gPSBuZXcgZ2UoYS5idWNrZXRJbnN0YW5jZUlkLCBuLCBhLnNvdXJjZUxheWVySW5kZXgsIGEuaW5kZXgsIG8udGlsZUlEKTtcbiAgICAgICAgdmFyIHYgPSB7XG4gICAgICAgICAgYnVja2V0OiBhLFxuICAgICAgICAgIGxheW91dDogbCxcbiAgICAgICAgICBwb3NNYXRyaXg6IGgsXG4gICAgICAgICAgdGV4dExhYmVsUGxhbmVNYXRyaXg6IGYsXG4gICAgICAgICAgbGFiZWxUb1NjcmVlbk1hdHJpeDogbSxcbiAgICAgICAgICBzY2FsZTogYyxcbiAgICAgICAgICB0ZXh0UGl4ZWxSYXRpbzogdSxcbiAgICAgICAgICBob2xkaW5nRm9yRmFkZTogby5ob2xkaW5nRm9yRmFkZSgpLFxuICAgICAgICAgIGNvbGxpc2lvbkJveEFycmF5OiBzLFxuICAgICAgICAgIHBhcnRpYWxseUV2YWx1YXRlZFRleHRTaXplOiB0LmV2YWx1YXRlU2l6ZUZvclpvb20oYS50ZXh0U2l6ZURhdGEsIHRoaXMudHJhbnNmb3JtLnpvb20pLFxuICAgICAgICAgIGNvbGxpc2lvbkdyb3VwOiB0aGlzLmNvbGxpc2lvbkdyb3Vwcy5nZXQoYS5zb3VyY2VJRClcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHIpIGZvciAodmFyIHkgPSAwLCB4ID0gYS5zb3J0S2V5UmFuZ2VzOyB5IDwgeC5sZW5ndGg7IHkgKz0gMSkge1xuICAgICAgICAgIHZhciBiID0geFt5XTtcbiAgICAgICAgICBlLnB1c2goe1xuICAgICAgICAgICAgc29ydEtleTogYi5zb3J0S2V5LFxuICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2VTdGFydDogYi5zeW1ib2xJbnN0YW5jZVN0YXJ0LFxuICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2VFbmQ6IGIuc3ltYm9sSW5zdGFuY2VFbmQsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiB2XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBlLnB1c2goe1xuICAgICAgICAgIHN5bWJvbEluc3RhbmNlU3RhcnQ6IDAsXG4gICAgICAgICAgc3ltYm9sSW5zdGFuY2VFbmQ6IGEuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aCxcbiAgICAgICAgICBwYXJhbWV0ZXJzOiB2XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sIGJlLnByb3RvdHlwZS5hdHRlbXB0QW5jaG9yUGxhY2VtZW50ID0gZnVuY3Rpb24gKHQsIGUsIGksIG8sIHIsIGEsIG4sIHMsIGwsIGMsIHUsIGgsIHAsIGQsIF8pIHtcbiAgICAgIHZhciBmLFxuICAgICAgICAgIG0gPSBbaC50ZXh0T2Zmc2V0MCwgaC50ZXh0T2Zmc2V0MV0sXG4gICAgICAgICAgZyA9IHllKHQsIGksIG8sIG0sIHIpLFxuICAgICAgICAgIHYgPSB0aGlzLmNvbGxpc2lvbkluZGV4LnBsYWNlQ29sbGlzaW9uQm94KHhlKGUsIGcueCwgZy55LCBhLCBuLCB0aGlzLnRyYW5zZm9ybS5hbmdsZSksIHUsIHMsIGwsIGMucHJlZGljYXRlKTtcbiAgICAgIGlmICghXyB8fCAwICE9PSB0aGlzLmNvbGxpc2lvbkluZGV4LnBsYWNlQ29sbGlzaW9uQm94KHhlKF8sIGcueCwgZy55LCBhLCBuLCB0aGlzLnRyYW5zZm9ybS5hbmdsZSksIHUsIHMsIGwsIGMucHJlZGljYXRlKS5ib3gubGVuZ3RoKSByZXR1cm4gdi5ib3gubGVuZ3RoID4gMCA/ICh0aGlzLnByZXZQbGFjZW1lbnQgJiYgdGhpcy5wcmV2UGxhY2VtZW50LnZhcmlhYmxlT2Zmc2V0c1toLmNyb3NzVGlsZUlEXSAmJiB0aGlzLnByZXZQbGFjZW1lbnQucGxhY2VtZW50c1toLmNyb3NzVGlsZUlEXSAmJiB0aGlzLnByZXZQbGFjZW1lbnQucGxhY2VtZW50c1toLmNyb3NzVGlsZUlEXS50ZXh0ICYmIChmID0gdGhpcy5wcmV2UGxhY2VtZW50LnZhcmlhYmxlT2Zmc2V0c1toLmNyb3NzVGlsZUlEXS5hbmNob3IpLCB0aGlzLnZhcmlhYmxlT2Zmc2V0c1toLmNyb3NzVGlsZUlEXSA9IHtcbiAgICAgICAgdGV4dE9mZnNldDogbSxcbiAgICAgICAgd2lkdGg6IGksXG4gICAgICAgIGhlaWdodDogbyxcbiAgICAgICAgYW5jaG9yOiB0LFxuICAgICAgICB0ZXh0Qm94U2NhbGU6IHIsXG4gICAgICAgIHByZXZBbmNob3I6IGZcbiAgICAgIH0sIHRoaXMubWFya1VzZWRKdXN0aWZpY2F0aW9uKHAsIHQsIGgsIGQpLCBwLmFsbG93VmVydGljYWxQbGFjZW1lbnQgJiYgKHRoaXMubWFya1VzZWRPcmllbnRhdGlvbihwLCBkLCBoKSwgdGhpcy5wbGFjZWRPcmllbnRhdGlvbnNbaC5jcm9zc1RpbGVJRF0gPSBkKSwge1xuICAgICAgICBzaGlmdDogZyxcbiAgICAgICAgcGxhY2VkR2x5cGhCb3hlczogdlxuICAgICAgfSkgOiB2b2lkIDA7XG4gICAgfSwgYmUucHJvdG90eXBlLnBsYWNlTGF5ZXJCdWNrZXRQYXJ0ID0gZnVuY3Rpb24gKGUsIGksIG8pIHtcbiAgICAgIHZhciByID0gdGhpcyxcbiAgICAgICAgICBhID0gZS5wYXJhbWV0ZXJzLFxuICAgICAgICAgIG4gPSBhLmJ1Y2tldCxcbiAgICAgICAgICBzID0gYS5sYXlvdXQsXG4gICAgICAgICAgbCA9IGEucG9zTWF0cml4LFxuICAgICAgICAgIGMgPSBhLnRleHRMYWJlbFBsYW5lTWF0cml4LFxuICAgICAgICAgIHUgPSBhLmxhYmVsVG9TY3JlZW5NYXRyaXgsXG4gICAgICAgICAgaCA9IGEudGV4dFBpeGVsUmF0aW8sXG4gICAgICAgICAgcCA9IGEuaG9sZGluZ0ZvckZhZGUsXG4gICAgICAgICAgZCA9IGEuY29sbGlzaW9uQm94QXJyYXksXG4gICAgICAgICAgXyA9IGEucGFydGlhbGx5RXZhbHVhdGVkVGV4dFNpemUsXG4gICAgICAgICAgZiA9IGEuY29sbGlzaW9uR3JvdXAsXG4gICAgICAgICAgbSA9IHMuZ2V0KFwidGV4dC1vcHRpb25hbFwiKSxcbiAgICAgICAgICBnID0gcy5nZXQoXCJpY29uLW9wdGlvbmFsXCIpLFxuICAgICAgICAgIHYgPSBzLmdldChcInRleHQtYWxsb3ctb3ZlcmxhcFwiKSxcbiAgICAgICAgICB5ID0gcy5nZXQoXCJpY29uLWFsbG93LW92ZXJsYXBcIiksXG4gICAgICAgICAgeCA9IFwibWFwXCIgPT09IHMuZ2V0KFwidGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIiksXG4gICAgICAgICAgYiA9IFwibWFwXCIgPT09IHMuZ2V0KFwidGV4dC1waXRjaC1hbGlnbm1lbnRcIiksXG4gICAgICAgICAgdyA9IFwibm9uZVwiICE9PSBzLmdldChcImljb24tdGV4dC1maXRcIiksXG4gICAgICAgICAgVCA9IFwidmlld3BvcnQteVwiID09PSBzLmdldChcInN5bWJvbC16LW9yZGVyXCIpLFxuICAgICAgICAgIEUgPSB2ICYmICh5IHx8ICFuLmhhc0ljb25EYXRhKCkgfHwgZyksXG4gICAgICAgICAgSSA9IHkgJiYgKHYgfHwgIW4uaGFzVGV4dERhdGEoKSB8fCBtKTtcbiAgICAgICFuLmNvbGxpc2lvbkFycmF5cyAmJiBkICYmIG4uZGVzZXJpYWxpemVDb2xsaXNpb25Cb3hlcyhkKTtcblxuICAgICAgdmFyIFAgPSBmdW5jdGlvbiBQKGUsIGEpIHtcbiAgICAgICAgaWYgKCFpW2UuY3Jvc3NUaWxlSURdKSBpZiAocCkgci5wbGFjZW1lbnRzW2UuY3Jvc3NUaWxlSURdID0gbmV3IGZlKCExLCAhMSwgITEpO2Vsc2Uge1xuICAgICAgICAgIHZhciBkLFxuICAgICAgICAgICAgICBUID0gITEsXG4gICAgICAgICAgICAgIFAgPSAhMSxcbiAgICAgICAgICAgICAgUyA9ICEwLFxuICAgICAgICAgICAgICBDID0gbnVsbCxcbiAgICAgICAgICAgICAgeiA9IHtcbiAgICAgICAgICAgIGJveDogbnVsbCxcbiAgICAgICAgICAgIG9mZnNjcmVlbjogbnVsbFxuICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIEQgPSB7XG4gICAgICAgICAgICBib3g6IG51bGwsXG4gICAgICAgICAgICBvZmZzY3JlZW46IG51bGxcbiAgICAgICAgICB9LFxuICAgICAgICAgICAgICBBID0gbnVsbCxcbiAgICAgICAgICAgICAgTSA9IG51bGwsXG4gICAgICAgICAgICAgIEwgPSAwLFxuICAgICAgICAgICAgICBSID0gMCxcbiAgICAgICAgICAgICAgayA9IDA7XG4gICAgICAgICAgYS50ZXh0RmVhdHVyZUluZGV4ID8gTCA9IGEudGV4dEZlYXR1cmVJbmRleCA6IGUudXNlUnVudGltZUNvbGxpc2lvbkNpcmNsZXMgJiYgKEwgPSBlLmZlYXR1cmVJbmRleCksIGEudmVydGljYWxUZXh0RmVhdHVyZUluZGV4ICYmIChSID0gYS52ZXJ0aWNhbFRleHRGZWF0dXJlSW5kZXgpO1xuICAgICAgICAgIHZhciBCID0gYS50ZXh0Qm94O1xuXG4gICAgICAgICAgaWYgKEIpIHtcbiAgICAgICAgICAgIHZhciBPID0gZnVuY3Rpb24gTyhpKSB7XG4gICAgICAgICAgICAgIHZhciBvID0gdC5Xcml0aW5nTW9kZS5ob3Jpem9udGFsO1xuXG4gICAgICAgICAgICAgIGlmIChuLmFsbG93VmVydGljYWxQbGFjZW1lbnQgJiYgIWkgJiYgci5wcmV2UGxhY2VtZW50KSB7XG4gICAgICAgICAgICAgICAgdmFyIGEgPSByLnByZXZQbGFjZW1lbnQucGxhY2VkT3JpZW50YXRpb25zW2UuY3Jvc3NUaWxlSURdO1xuICAgICAgICAgICAgICAgIGEgJiYgKHIucGxhY2VkT3JpZW50YXRpb25zW2UuY3Jvc3NUaWxlSURdID0gYSwgci5tYXJrVXNlZE9yaWVudGF0aW9uKG4sIG8gPSBhLCBlKSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm4gbztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgRiA9IGZ1bmN0aW9uIEYoaSwgbykge1xuICAgICAgICAgICAgICBpZiAobi5hbGxvd1ZlcnRpY2FsUGxhY2VtZW50ICYmIGUubnVtVmVydGljYWxHbHlwaFZlcnRpY2VzID4gMCAmJiBhLnZlcnRpY2FsVGV4dEJveCkgZm9yICh2YXIgciA9IDAsIHMgPSBuLndyaXRpbmdNb2RlczsgciA8IHMubGVuZ3RoICYmIChzW3JdID09PSB0LldyaXRpbmdNb2RlLnZlcnRpY2FsID8gKHogPSBvKCksIEQgPSB6KSA6IHogPSBpKCksICEoeiAmJiB6LmJveCAmJiB6LmJveC5sZW5ndGgpKTsgciArPSAxKSB7XG4gICAgICAgICAgICAgICAgO1xuICAgICAgICAgICAgICB9IGVsc2UgeiA9IGkoKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChzLmdldChcInRleHQtdmFyaWFibGUtYW5jaG9yXCIpKSB7XG4gICAgICAgICAgICAgIHZhciBVID0gcy5nZXQoXCJ0ZXh0LXZhcmlhYmxlLWFuY2hvclwiKTtcblxuICAgICAgICAgICAgICBpZiAoci5wcmV2UGxhY2VtZW50ICYmIHIucHJldlBsYWNlbWVudC52YXJpYWJsZU9mZnNldHNbZS5jcm9zc1RpbGVJRF0pIHtcbiAgICAgICAgICAgICAgICB2YXIgTiA9IHIucHJldlBsYWNlbWVudC52YXJpYWJsZU9mZnNldHNbZS5jcm9zc1RpbGVJRF07XG4gICAgICAgICAgICAgICAgVS5pbmRleE9mKE4uYW5jaG9yKSA+IDAgJiYgKFUgPSBVLmZpbHRlcihmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgIT09IE4uYW5jaG9yO1xuICAgICAgICAgICAgICAgIH0pKS51bnNoaWZ0KE4uYW5jaG9yKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHZhciBaID0gZnVuY3Rpb24gWih0LCBpLCBvKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgYSA9IHQueDIgLSB0LngxLCBzID0gdC55MiAtIHQueTEsIGMgPSBlLnRleHRCb3hTY2FsZSwgdSA9IHcgJiYgIXkgPyBpIDogbnVsbCwgcCA9IHtcbiAgICAgICAgICAgICAgICAgIGJveDogW10sXG4gICAgICAgICAgICAgICAgICBvZmZzY3JlZW46ICExXG4gICAgICAgICAgICAgICAgfSwgZCA9IHYgPyAyICogVS5sZW5ndGggOiBVLmxlbmd0aCwgXyA9IDA7IF8gPCBkOyArK18pIHtcbiAgICAgICAgICAgICAgICAgIHZhciBtID0gci5hdHRlbXB0QW5jaG9yUGxhY2VtZW50KFVbXyAlIFUubGVuZ3RoXSwgdCwgYSwgcywgYywgeCwgYiwgaCwgbCwgZiwgXyA+PSBVLmxlbmd0aCwgZSwgbiwgbywgdSk7XG5cbiAgICAgICAgICAgICAgICAgIGlmIChtICYmIChwID0gbS5wbGFjZWRHbHlwaEJveGVzKSAmJiBwLmJveCAmJiBwLmJveC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgVCA9ICEwLCBDID0gbS5zaGlmdDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHA7XG4gICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgRihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFooQiwgYS5pY29uQm94LCB0LldyaXRpbmdNb2RlLmhvcml6b250YWwpO1xuICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGkgPSBhLnZlcnRpY2FsVGV4dEJveDtcbiAgICAgICAgICAgICAgICByZXR1cm4gbi5hbGxvd1ZlcnRpY2FsUGxhY2VtZW50ICYmICEoeiAmJiB6LmJveCAmJiB6LmJveC5sZW5ndGgpICYmIGUubnVtVmVydGljYWxHbHlwaFZlcnRpY2VzID4gMCAmJiBpID8gWihpLCBhLnZlcnRpY2FsSWNvbkJveCwgdC5Xcml0aW5nTW9kZS52ZXJ0aWNhbCkgOiB7XG4gICAgICAgICAgICAgICAgICBib3g6IG51bGwsXG4gICAgICAgICAgICAgICAgICBvZmZzY3JlZW46IG51bGxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9KSwgeiAmJiAoVCA9IHouYm94LCBTID0gei5vZmZzY3JlZW4pO1xuICAgICAgICAgICAgICB2YXIgcSA9IE8oeiAmJiB6LmJveCk7XG5cbiAgICAgICAgICAgICAgaWYgKCFUICYmIHIucHJldlBsYWNlbWVudCkge1xuICAgICAgICAgICAgICAgIHZhciBqID0gci5wcmV2UGxhY2VtZW50LnZhcmlhYmxlT2Zmc2V0c1tlLmNyb3NzVGlsZUlEXTtcbiAgICAgICAgICAgICAgICBqICYmIChyLnZhcmlhYmxlT2Zmc2V0c1tlLmNyb3NzVGlsZUlEXSA9IGosIHIubWFya1VzZWRKdXN0aWZpY2F0aW9uKG4sIGouYW5jaG9yLCBlLCBxKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhciBWID0gZnVuY3Rpb24gVih0LCBpKSB7XG4gICAgICAgICAgICAgICAgdmFyIG8gPSByLmNvbGxpc2lvbkluZGV4LnBsYWNlQ29sbGlzaW9uQm94KHQsIHYsIGgsIGwsIGYucHJlZGljYXRlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbyAmJiBvLmJveCAmJiBvLmJveC5sZW5ndGggJiYgKHIubWFya1VzZWRPcmllbnRhdGlvbihuLCBpLCBlKSwgci5wbGFjZWRPcmllbnRhdGlvbnNbZS5jcm9zc1RpbGVJRF0gPSBpKSwgbztcbiAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICBGKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gVihCLCB0LldyaXRpbmdNb2RlLmhvcml6b250YWwpO1xuICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGkgPSBhLnZlcnRpY2FsVGV4dEJveDtcbiAgICAgICAgICAgICAgICByZXR1cm4gbi5hbGxvd1ZlcnRpY2FsUGxhY2VtZW50ICYmIGUubnVtVmVydGljYWxHbHlwaFZlcnRpY2VzID4gMCAmJiBpID8gVihpLCB0LldyaXRpbmdNb2RlLnZlcnRpY2FsKSA6IHtcbiAgICAgICAgICAgICAgICAgIGJveDogbnVsbCxcbiAgICAgICAgICAgICAgICAgIG9mZnNjcmVlbjogbnVsbFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH0pLCBPKHogJiYgei5ib3ggJiYgei5ib3gubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoVCA9IChkID0geikgJiYgZC5ib3ggJiYgZC5ib3gubGVuZ3RoID4gMCwgUyA9IGQgJiYgZC5vZmZzY3JlZW4sIGUudXNlUnVudGltZUNvbGxpc2lvbkNpcmNsZXMpIHtcbiAgICAgICAgICAgIHZhciBHID0gbi50ZXh0LnBsYWNlZFN5bWJvbEFycmF5LmdldChlLmNlbnRlckp1c3RpZmllZFRleHRTeW1ib2xJbmRleCksXG4gICAgICAgICAgICAgICAgVyA9IHQuZXZhbHVhdGVTaXplRm9yRmVhdHVyZShuLnRleHRTaXplRGF0YSwgXywgRyksXG4gICAgICAgICAgICAgICAgWCA9IHMuZ2V0KFwidGV4dC1wYWRkaW5nXCIpO1xuICAgICAgICAgICAgQSA9IHIuY29sbGlzaW9uSW5kZXgucGxhY2VDb2xsaXNpb25DaXJjbGVzKHYsIEcsIG4ubGluZVZlcnRleEFycmF5LCBuLmdseXBoT2Zmc2V0QXJyYXksIFcsIGwsIGMsIHUsIG8sIGIsIGYucHJlZGljYXRlLCBlLmNvbGxpc2lvbkNpcmNsZURpYW1ldGVyLCBYKSwgVCA9IHYgfHwgQS5jaXJjbGVzLmxlbmd0aCA+IDAgJiYgIUEuY29sbGlzaW9uRGV0ZWN0ZWQsIFMgPSBTICYmIEEub2Zmc2NyZWVuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChhLmljb25GZWF0dXJlSW5kZXggJiYgKGsgPSBhLmljb25GZWF0dXJlSW5kZXgpLCBhLmljb25Cb3gpIHtcbiAgICAgICAgICAgIHZhciBIID0gZnVuY3Rpb24gSCh0KSB7XG4gICAgICAgICAgICAgIHZhciBlID0gdyAmJiBDID8geGUodCwgQy54LCBDLnksIHgsIGIsIHIudHJhbnNmb3JtLmFuZ2xlKSA6IHQ7XG4gICAgICAgICAgICAgIHJldHVybiByLmNvbGxpc2lvbkluZGV4LnBsYWNlQ29sbGlzaW9uQm94KGUsIHksIGgsIGwsIGYucHJlZGljYXRlKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIFAgPSBEICYmIEQuYm94ICYmIEQuYm94Lmxlbmd0aCAmJiBhLnZlcnRpY2FsSWNvbkJveCA/IChNID0gSChhLnZlcnRpY2FsSWNvbkJveCkpLmJveC5sZW5ndGggPiAwIDogKE0gPSBIKGEuaWNvbkJveCkpLmJveC5sZW5ndGggPiAwLCBTID0gUyAmJiBNLm9mZnNjcmVlbjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgSyA9IG0gfHwgMCA9PT0gZS5udW1Ib3Jpem9udGFsR2x5cGhWZXJ0aWNlcyAmJiAwID09PSBlLm51bVZlcnRpY2FsR2x5cGhWZXJ0aWNlcyxcbiAgICAgICAgICAgICAgWSA9IGcgfHwgMCA9PT0gZS5udW1JY29uVmVydGljZXM7XG5cbiAgICAgICAgICBpZiAoSyB8fCBZID8gWSA/IEsgfHwgKFAgPSBQICYmIFQpIDogVCA9IFAgJiYgVCA6IFAgPSBUID0gUCAmJiBULCBUICYmIGQgJiYgZC5ib3ggJiYgci5jb2xsaXNpb25JbmRleC5pbnNlcnRDb2xsaXNpb25Cb3goZC5ib3gsIHMuZ2V0KFwidGV4dC1pZ25vcmUtcGxhY2VtZW50XCIpLCBuLmJ1Y2tldEluc3RhbmNlSWQsIEQgJiYgRC5ib3ggJiYgUiA/IFIgOiBMLCBmLklEKSwgUCAmJiBNICYmIHIuY29sbGlzaW9uSW5kZXguaW5zZXJ0Q29sbGlzaW9uQm94KE0uYm94LCBzLmdldChcImljb24taWdub3JlLXBsYWNlbWVudFwiKSwgbi5idWNrZXRJbnN0YW5jZUlkLCBrLCBmLklEKSwgQSAmJiAoVCAmJiByLmNvbGxpc2lvbkluZGV4Lmluc2VydENvbGxpc2lvbkNpcmNsZXMoQS5jaXJjbGVzLCBzLmdldChcInRleHQtaWdub3JlLXBsYWNlbWVudFwiKSwgbi5idWNrZXRJbnN0YW5jZUlkLCBMLCBmLklEKSwgbykpIHtcbiAgICAgICAgICAgIHZhciBKID0gbi5idWNrZXRJbnN0YW5jZUlkLFxuICAgICAgICAgICAgICAgIFEgPSByLmNvbGxpc2lvbkNpcmNsZUFycmF5c1tKXTtcbiAgICAgICAgICAgIHZvaWQgMCA9PT0gUSAmJiAoUSA9IHIuY29sbGlzaW9uQ2lyY2xlQXJyYXlzW0pdID0gbmV3IG1lKCkpO1xuXG4gICAgICAgICAgICBmb3IgKHZhciAkID0gMDsgJCA8IEEuY2lyY2xlcy5sZW5ndGg7ICQgKz0gNCkge1xuICAgICAgICAgICAgICBRLmNpcmNsZXMucHVzaChBLmNpcmNsZXNbJCArIDBdKSwgUS5jaXJjbGVzLnB1c2goQS5jaXJjbGVzWyQgKyAxXSksIFEuY2lyY2xlcy5wdXNoKEEuY2lyY2xlc1skICsgMl0pLCBRLmNpcmNsZXMucHVzaChBLmNvbGxpc2lvbkRldGVjdGVkID8gMSA6IDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHIucGxhY2VtZW50c1tlLmNyb3NzVGlsZUlEXSA9IG5ldyBmZShUIHx8IEUsIFAgfHwgSSwgUyB8fCBuLmp1c3RSZWxvYWRlZCksIGlbZS5jcm9zc1RpbGVJRF0gPSAhMDtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgaWYgKFQpIGZvciAodmFyIFMgPSBuLmdldFNvcnRlZFN5bWJvbEluZGV4ZXModGhpcy50cmFuc2Zvcm0uYW5nbGUpLCBDID0gUy5sZW5ndGggLSAxOyBDID49IDA7IC0tQykge1xuICAgICAgICB2YXIgeiA9IFNbQ107XG4gICAgICAgIFAobi5zeW1ib2xJbnN0YW5jZXMuZ2V0KHopLCBuLmNvbGxpc2lvbkFycmF5c1t6XSk7XG4gICAgICB9IGVsc2UgZm9yICh2YXIgRCA9IGUuc3ltYm9sSW5zdGFuY2VTdGFydDsgRCA8IGUuc3ltYm9sSW5zdGFuY2VFbmQ7IEQrKykge1xuICAgICAgICBQKG4uc3ltYm9sSW5zdGFuY2VzLmdldChEKSwgbi5jb2xsaXNpb25BcnJheXNbRF0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobyAmJiBuLmJ1Y2tldEluc3RhbmNlSWQgaW4gdGhpcy5jb2xsaXNpb25DaXJjbGVBcnJheXMpIHtcbiAgICAgICAgdmFyIEEgPSB0aGlzLmNvbGxpc2lvbkNpcmNsZUFycmF5c1tuLmJ1Y2tldEluc3RhbmNlSWRdO1xuICAgICAgICB0LmludmVydChBLmludlByb2pNYXRyaXgsIGwpLCBBLnZpZXdwb3J0TWF0cml4ID0gdGhpcy5jb2xsaXNpb25JbmRleC5nZXRWaWV3cG9ydE1hdHJpeCgpO1xuICAgICAgfVxuXG4gICAgICBuLmp1c3RSZWxvYWRlZCA9ICExO1xuICAgIH0sIGJlLnByb3RvdHlwZS5tYXJrVXNlZEp1c3RpZmljYXRpb24gPSBmdW5jdGlvbiAoZSwgaSwgbywgcikge1xuICAgICAgdmFyIGE7XG4gICAgICBhID0gciA9PT0gdC5Xcml0aW5nTW9kZS52ZXJ0aWNhbCA/IG8udmVydGljYWxQbGFjZWRUZXh0U3ltYm9sSW5kZXggOiB7XG4gICAgICAgIGxlZnQ6IG8ubGVmdEp1c3RpZmllZFRleHRTeW1ib2xJbmRleCxcbiAgICAgICAgY2VudGVyOiBvLmNlbnRlckp1c3RpZmllZFRleHRTeW1ib2xJbmRleCxcbiAgICAgICAgcmlnaHQ6IG8ucmlnaHRKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXhcbiAgICAgIH1bdC5nZXRBbmNob3JKdXN0aWZpY2F0aW9uKGkpXTtcblxuICAgICAgZm9yICh2YXIgbiA9IDAsIHMgPSBbby5sZWZ0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4LCBvLmNlbnRlckp1c3RpZmllZFRleHRTeW1ib2xJbmRleCwgby5yaWdodEp1c3RpZmllZFRleHRTeW1ib2xJbmRleCwgby52ZXJ0aWNhbFBsYWNlZFRleHRTeW1ib2xJbmRleF07IG4gPCBzLmxlbmd0aDsgbiArPSAxKSB7XG4gICAgICAgIHZhciBsID0gc1tuXTtcbiAgICAgICAgbCA+PSAwICYmIChlLnRleHQucGxhY2VkU3ltYm9sQXJyYXkuZ2V0KGwpLmNyb3NzVGlsZUlEID0gYSA+PSAwICYmIGwgIT09IGEgPyAwIDogby5jcm9zc1RpbGVJRCk7XG4gICAgICB9XG4gICAgfSwgYmUucHJvdG90eXBlLm1hcmtVc2VkT3JpZW50YXRpb24gPSBmdW5jdGlvbiAoZSwgaSwgbykge1xuICAgICAgZm9yICh2YXIgciA9IGkgPT09IHQuV3JpdGluZ01vZGUuaG9yaXpvbnRhbCB8fCBpID09PSB0LldyaXRpbmdNb2RlLmhvcml6b250YWxPbmx5ID8gaSA6IDAsIGEgPSBpID09PSB0LldyaXRpbmdNb2RlLnZlcnRpY2FsID8gaSA6IDAsIG4gPSAwLCBzID0gW28ubGVmdEp1c3RpZmllZFRleHRTeW1ib2xJbmRleCwgby5jZW50ZXJKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXgsIG8ucmlnaHRKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXhdOyBuIDwgcy5sZW5ndGg7IG4gKz0gMSkge1xuICAgICAgICBlLnRleHQucGxhY2VkU3ltYm9sQXJyYXkuZ2V0KHNbbl0pLnBsYWNlZE9yaWVudGF0aW9uID0gcjtcbiAgICAgIH1cblxuICAgICAgby52ZXJ0aWNhbFBsYWNlZFRleHRTeW1ib2xJbmRleCAmJiAoZS50ZXh0LnBsYWNlZFN5bWJvbEFycmF5LmdldChvLnZlcnRpY2FsUGxhY2VkVGV4dFN5bWJvbEluZGV4KS5wbGFjZWRPcmllbnRhdGlvbiA9IGEpO1xuICAgIH0sIGJlLnByb3RvdHlwZS5jb21taXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdGhpcy5jb21taXRUaW1lID0gdCwgdGhpcy56b29tQXRMYXN0UmVjZW5jeUNoZWNrID0gdGhpcy50cmFuc2Zvcm0uem9vbTtcbiAgICAgIHZhciBlID0gdGhpcy5wcmV2UGxhY2VtZW50LFxuICAgICAgICAgIGkgPSAhMTtcbiAgICAgIHRoaXMucHJldlpvb21BZGp1c3RtZW50ID0gZSA/IGUuem9vbUFkanVzdG1lbnQodGhpcy50cmFuc2Zvcm0uem9vbSkgOiAwO1xuICAgICAgdmFyIG8gPSBlID8gZS5zeW1ib2xGYWRlQ2hhbmdlKHQpIDogMSxcbiAgICAgICAgICByID0gZSA/IGUub3BhY2l0aWVzIDoge30sXG4gICAgICAgICAgYSA9IGUgPyBlLnZhcmlhYmxlT2Zmc2V0cyA6IHt9LFxuICAgICAgICAgIG4gPSBlID8gZS5wbGFjZWRPcmllbnRhdGlvbnMgOiB7fTtcblxuICAgICAgZm9yICh2YXIgcyBpbiB0aGlzLnBsYWNlbWVudHMpIHtcbiAgICAgICAgdmFyIGwgPSB0aGlzLnBsYWNlbWVudHNbc10sXG4gICAgICAgICAgICBjID0gcltzXTtcbiAgICAgICAgYyA/ICh0aGlzLm9wYWNpdGllc1tzXSA9IG5ldyBfZShjLCBvLCBsLnRleHQsIGwuaWNvbiksIGkgPSBpIHx8IGwudGV4dCAhPT0gYy50ZXh0LnBsYWNlZCB8fCBsLmljb24gIT09IGMuaWNvbi5wbGFjZWQpIDogKHRoaXMub3BhY2l0aWVzW3NdID0gbmV3IF9lKG51bGwsIG8sIGwudGV4dCwgbC5pY29uLCBsLnNraXBGYWRlKSwgaSA9IGkgfHwgbC50ZXh0IHx8IGwuaWNvbik7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIHUgaW4gcikge1xuICAgICAgICB2YXIgaCA9IHJbdV07XG5cbiAgICAgICAgaWYgKCF0aGlzLm9wYWNpdGllc1t1XSkge1xuICAgICAgICAgIHZhciBwID0gbmV3IF9lKGgsIG8sICExLCAhMSk7XG4gICAgICAgICAgcC5pc0hpZGRlbigpIHx8ICh0aGlzLm9wYWNpdGllc1t1XSA9IHAsIGkgPSBpIHx8IGgudGV4dC5wbGFjZWQgfHwgaC5pY29uLnBsYWNlZCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgZCBpbiBhKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVPZmZzZXRzW2RdIHx8ICF0aGlzLm9wYWNpdGllc1tkXSB8fCB0aGlzLm9wYWNpdGllc1tkXS5pc0hpZGRlbigpIHx8ICh0aGlzLnZhcmlhYmxlT2Zmc2V0c1tkXSA9IGFbZF0pO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBfIGluIG4pIHtcbiAgICAgICAgdGhpcy5wbGFjZWRPcmllbnRhdGlvbnNbX10gfHwgIXRoaXMub3BhY2l0aWVzW19dIHx8IHRoaXMub3BhY2l0aWVzW19dLmlzSGlkZGVuKCkgfHwgKHRoaXMucGxhY2VkT3JpZW50YXRpb25zW19dID0gbltfXSk7XG4gICAgICB9XG5cbiAgICAgIGkgPyB0aGlzLmxhc3RQbGFjZW1lbnRDaGFuZ2VUaW1lID0gdCA6IFwibnVtYmVyXCIgIT0gdHlwZW9mIHRoaXMubGFzdFBsYWNlbWVudENoYW5nZVRpbWUgJiYgKHRoaXMubGFzdFBsYWNlbWVudENoYW5nZVRpbWUgPSBlID8gZS5sYXN0UGxhY2VtZW50Q2hhbmdlVGltZSA6IHQpO1xuICAgIH0sIGJlLnByb3RvdHlwZS51cGRhdGVMYXllck9wYWNpdGllcyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICBmb3IgKHZhciBpID0ge30sIG8gPSAwLCByID0gZTsgbyA8IHIubGVuZ3RoOyBvICs9IDEpIHtcbiAgICAgICAgdmFyIGEgPSByW29dLFxuICAgICAgICAgICAgbiA9IGEuZ2V0QnVja2V0KHQpO1xuICAgICAgICBuICYmIGEubGF0ZXN0RmVhdHVyZUluZGV4ICYmIHQuaWQgPT09IG4ubGF5ZXJJZHNbMF0gJiYgdGhpcy51cGRhdGVCdWNrZXRPcGFjaXRpZXMobiwgaSwgYS5jb2xsaXNpb25Cb3hBcnJheSk7XG4gICAgICB9XG4gICAgfSwgYmUucHJvdG90eXBlLnVwZGF0ZUJ1Y2tldE9wYWNpdGllcyA9IGZ1bmN0aW9uIChlLCBpLCBvKSB7XG4gICAgICB2YXIgciA9IHRoaXM7XG4gICAgICBlLmhhc1RleHREYXRhKCkgJiYgZS50ZXh0Lm9wYWNpdHlWZXJ0ZXhBcnJheS5jbGVhcigpLCBlLmhhc0ljb25EYXRhKCkgJiYgZS5pY29uLm9wYWNpdHlWZXJ0ZXhBcnJheS5jbGVhcigpLCBlLmhhc0ljb25Db2xsaXNpb25Cb3hEYXRhKCkgJiYgZS5pY29uQ29sbGlzaW9uQm94LmNvbGxpc2lvblZlcnRleEFycmF5LmNsZWFyKCksIGUuaGFzVGV4dENvbGxpc2lvbkJveERhdGEoKSAmJiBlLnRleHRDb2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QXJyYXkuY2xlYXIoKTtcbiAgICAgIHZhciBhID0gZS5sYXllcnNbMF0ubGF5b3V0LFxuICAgICAgICAgIG4gPSBuZXcgX2UobnVsbCwgMCwgITEsICExLCAhMCksXG4gICAgICAgICAgcyA9IGEuZ2V0KFwidGV4dC1hbGxvdy1vdmVybGFwXCIpLFxuICAgICAgICAgIGwgPSBhLmdldChcImljb24tYWxsb3ctb3ZlcmxhcFwiKSxcbiAgICAgICAgICBjID0gYS5nZXQoXCJ0ZXh0LXZhcmlhYmxlLWFuY2hvclwiKSxcbiAgICAgICAgICB1ID0gXCJtYXBcIiA9PT0gYS5nZXQoXCJ0ZXh0LXJvdGF0aW9uLWFsaWdubWVudFwiKSxcbiAgICAgICAgICBoID0gXCJtYXBcIiA9PT0gYS5nZXQoXCJ0ZXh0LXBpdGNoLWFsaWdubWVudFwiKSxcbiAgICAgICAgICBwID0gXCJub25lXCIgIT09IGEuZ2V0KFwiaWNvbi10ZXh0LWZpdFwiKSxcbiAgICAgICAgICBkID0gbmV3IF9lKG51bGwsIDAsIHMgJiYgKGwgfHwgIWUuaGFzSWNvbkRhdGEoKSB8fCBhLmdldChcImljb24tb3B0aW9uYWxcIikpLCBsICYmIChzIHx8ICFlLmhhc1RleHREYXRhKCkgfHwgYS5nZXQoXCJ0ZXh0LW9wdGlvbmFsXCIpKSwgITApO1xuICAgICAgIWUuY29sbGlzaW9uQXJyYXlzICYmIG8gJiYgKGUuaGFzSWNvbkNvbGxpc2lvbkJveERhdGEoKSB8fCBlLmhhc1RleHRDb2xsaXNpb25Cb3hEYXRhKCkpICYmIGUuZGVzZXJpYWxpemVDb2xsaXNpb25Cb3hlcyhvKTtcblxuICAgICAgZm9yICh2YXIgXyA9IGZ1bmN0aW9uIF8odCwgZSwgaSkge1xuICAgICAgICBmb3IgKHZhciBvID0gMDsgbyA8IGUgLyA0OyBvKyspIHtcbiAgICAgICAgICB0Lm9wYWNpdHlWZXJ0ZXhBcnJheS5lbXBsYWNlQmFjayhpKTtcbiAgICAgICAgfVxuICAgICAgfSwgZiA9IGZ1bmN0aW9uIGYobykge1xuICAgICAgICB2YXIgYSA9IGUuc3ltYm9sSW5zdGFuY2VzLmdldChvKSxcbiAgICAgICAgICAgIHMgPSBhLm51bUhvcml6b250YWxHbHlwaFZlcnRpY2VzLFxuICAgICAgICAgICAgbCA9IGEubnVtVmVydGljYWxHbHlwaFZlcnRpY2VzLFxuICAgICAgICAgICAgZiA9IGEuY3Jvc3NUaWxlSUQsXG4gICAgICAgICAgICBtID0gci5vcGFjaXRpZXNbZl07XG4gICAgICAgIGlbZl0gPyBtID0gbiA6IG0gfHwgKHIub3BhY2l0aWVzW2ZdID0gbSA9IGQpLCBpW2ZdID0gITA7XG4gICAgICAgIHZhciBnID0gYS5udW1JY29uVmVydGljZXMgPiAwLFxuICAgICAgICAgICAgdiA9IHIucGxhY2VkT3JpZW50YXRpb25zW2EuY3Jvc3NUaWxlSURdLFxuICAgICAgICAgICAgeSA9IHYgPT09IHQuV3JpdGluZ01vZGUudmVydGljYWwsXG4gICAgICAgICAgICB4ID0gdiA9PT0gdC5Xcml0aW5nTW9kZS5ob3Jpem9udGFsIHx8IHYgPT09IHQuV3JpdGluZ01vZGUuaG9yaXpvbnRhbE9ubHk7XG5cbiAgICAgICAgaWYgKHMgPiAwIHx8IGwgPiAwKSB7XG4gICAgICAgICAgdmFyIGIgPSBEZShtLnRleHQpO1xuICAgICAgICAgIF8oZS50ZXh0LCBzLCB5ID8gQWUgOiBiKSwgXyhlLnRleHQsIGwsIHggPyBBZSA6IGIpO1xuICAgICAgICAgIHZhciB3ID0gbS50ZXh0LmlzSGlkZGVuKCk7XG4gICAgICAgICAgW2EucmlnaHRKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXgsIGEuY2VudGVySnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4LCBhLmxlZnRKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXhdLmZvckVhY2goZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgIHQgPj0gMCAmJiAoZS50ZXh0LnBsYWNlZFN5bWJvbEFycmF5LmdldCh0KS5oaWRkZW4gPSB3IHx8IHkgPyAxIDogMCk7XG4gICAgICAgICAgfSksIGEudmVydGljYWxQbGFjZWRUZXh0U3ltYm9sSW5kZXggPj0gMCAmJiAoZS50ZXh0LnBsYWNlZFN5bWJvbEFycmF5LmdldChhLnZlcnRpY2FsUGxhY2VkVGV4dFN5bWJvbEluZGV4KS5oaWRkZW4gPSB3IHx8IHggPyAxIDogMCk7XG4gICAgICAgICAgdmFyIFQgPSByLnZhcmlhYmxlT2Zmc2V0c1thLmNyb3NzVGlsZUlEXTtcbiAgICAgICAgICBUICYmIHIubWFya1VzZWRKdXN0aWZpY2F0aW9uKGUsIFQuYW5jaG9yLCBhLCB2KTtcbiAgICAgICAgICB2YXIgRSA9IHIucGxhY2VkT3JpZW50YXRpb25zW2EuY3Jvc3NUaWxlSURdO1xuICAgICAgICAgIEUgJiYgKHIubWFya1VzZWRKdXN0aWZpY2F0aW9uKGUsIFwibGVmdFwiLCBhLCBFKSwgci5tYXJrVXNlZE9yaWVudGF0aW9uKGUsIEUsIGEpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChnKSB7XG4gICAgICAgICAgdmFyIEkgPSBEZShtLmljb24pLFxuICAgICAgICAgICAgICBQID0gIShwICYmIGEudmVydGljYWxQbGFjZWRJY29uU3ltYm9sSW5kZXggJiYgeSk7XG4gICAgICAgICAgYS5wbGFjZWRJY29uU3ltYm9sSW5kZXggPj0gMCAmJiAoXyhlLmljb24sIGEubnVtSWNvblZlcnRpY2VzLCBQID8gSSA6IEFlKSwgZS5pY29uLnBsYWNlZFN5bWJvbEFycmF5LmdldChhLnBsYWNlZEljb25TeW1ib2xJbmRleCkuaGlkZGVuID0gbS5pY29uLmlzSGlkZGVuKCkpLCBhLnZlcnRpY2FsUGxhY2VkSWNvblN5bWJvbEluZGV4ID49IDAgJiYgKF8oZS5pY29uLCBhLm51bVZlcnRpY2FsSWNvblZlcnRpY2VzLCBQID8gQWUgOiBJKSwgZS5pY29uLnBsYWNlZFN5bWJvbEFycmF5LmdldChhLnZlcnRpY2FsUGxhY2VkSWNvblN5bWJvbEluZGV4KS5oaWRkZW4gPSBtLmljb24uaXNIaWRkZW4oKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZS5oYXNJY29uQ29sbGlzaW9uQm94RGF0YSgpIHx8IGUuaGFzVGV4dENvbGxpc2lvbkJveERhdGEoKSkge1xuICAgICAgICAgIHZhciBTID0gZS5jb2xsaXNpb25BcnJheXNbb107XG5cbiAgICAgICAgICBpZiAoUykge1xuICAgICAgICAgICAgdmFyIEMgPSBuZXcgdC5Qb2ludCgwLCAwKTtcblxuICAgICAgICAgICAgaWYgKFMudGV4dEJveCB8fCBTLnZlcnRpY2FsVGV4dEJveCkge1xuICAgICAgICAgICAgICB2YXIgeiA9ICEwO1xuXG4gICAgICAgICAgICAgIGlmIChjKSB7XG4gICAgICAgICAgICAgICAgdmFyIEQgPSByLnZhcmlhYmxlT2Zmc2V0c1tmXTtcbiAgICAgICAgICAgICAgICBEID8gKEMgPSB5ZShELmFuY2hvciwgRC53aWR0aCwgRC5oZWlnaHQsIEQudGV4dE9mZnNldCwgRC50ZXh0Qm94U2NhbGUpLCB1ICYmIEMuX3JvdGF0ZShoID8gci50cmFuc2Zvcm0uYW5nbGUgOiAtci50cmFuc2Zvcm0uYW5nbGUpKSA6IHogPSAhMTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIFMudGV4dEJveCAmJiB3ZShlLnRleHRDb2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QXJyYXksIG0udGV4dC5wbGFjZWQsICF6IHx8IHksIEMueCwgQy55KSwgUy52ZXJ0aWNhbFRleHRCb3ggJiYgd2UoZS50ZXh0Q29sbGlzaW9uQm94LmNvbGxpc2lvblZlcnRleEFycmF5LCBtLnRleHQucGxhY2VkLCAheiB8fCB4LCBDLngsIEMueSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBBID0gQm9vbGVhbigheCAmJiBTLnZlcnRpY2FsSWNvbkJveCk7XG4gICAgICAgICAgICBTLmljb25Cb3ggJiYgd2UoZS5pY29uQ29sbGlzaW9uQm94LmNvbGxpc2lvblZlcnRleEFycmF5LCBtLmljb24ucGxhY2VkLCBBLCBwID8gQy54IDogMCwgcCA/IEMueSA6IDApLCBTLnZlcnRpY2FsSWNvbkJveCAmJiB3ZShlLmljb25Db2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QXJyYXksIG0uaWNvbi5wbGFjZWQsICFBLCBwID8gQy54IDogMCwgcCA/IEMueSA6IDApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgbSA9IDA7IG0gPCBlLnN5bWJvbEluc3RhbmNlcy5sZW5ndGg7IG0rKykge1xuICAgICAgICBmKG0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZS5zb3J0RmVhdHVyZXModGhpcy50cmFuc2Zvcm0uYW5nbGUpLCB0aGlzLnJldGFpbmVkUXVlcnlEYXRhW2UuYnVja2V0SW5zdGFuY2VJZF0gJiYgKHRoaXMucmV0YWluZWRRdWVyeURhdGFbZS5idWNrZXRJbnN0YW5jZUlkXS5mZWF0dXJlU29ydE9yZGVyID0gZS5mZWF0dXJlU29ydE9yZGVyKSwgZS5oYXNUZXh0RGF0YSgpICYmIGUudGV4dC5vcGFjaXR5VmVydGV4QnVmZmVyICYmIGUudGV4dC5vcGFjaXR5VmVydGV4QnVmZmVyLnVwZGF0ZURhdGEoZS50ZXh0Lm9wYWNpdHlWZXJ0ZXhBcnJheSksIGUuaGFzSWNvbkRhdGEoKSAmJiBlLmljb24ub3BhY2l0eVZlcnRleEJ1ZmZlciAmJiBlLmljb24ub3BhY2l0eVZlcnRleEJ1ZmZlci51cGRhdGVEYXRhKGUuaWNvbi5vcGFjaXR5VmVydGV4QXJyYXkpLCBlLmhhc0ljb25Db2xsaXNpb25Cb3hEYXRhKCkgJiYgZS5pY29uQ29sbGlzaW9uQm94LmNvbGxpc2lvblZlcnRleEJ1ZmZlciAmJiBlLmljb25Db2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QnVmZmVyLnVwZGF0ZURhdGEoZS5pY29uQ29sbGlzaW9uQm94LmNvbGxpc2lvblZlcnRleEFycmF5KSwgZS5oYXNUZXh0Q29sbGlzaW9uQm94RGF0YSgpICYmIGUudGV4dENvbGxpc2lvbkJveC5jb2xsaXNpb25WZXJ0ZXhCdWZmZXIgJiYgZS50ZXh0Q29sbGlzaW9uQm94LmNvbGxpc2lvblZlcnRleEJ1ZmZlci51cGRhdGVEYXRhKGUudGV4dENvbGxpc2lvbkJveC5jb2xsaXNpb25WZXJ0ZXhBcnJheSksIGUuYnVja2V0SW5zdGFuY2VJZCBpbiB0aGlzLmNvbGxpc2lvbkNpcmNsZUFycmF5cykge1xuICAgICAgICB2YXIgZyA9IHRoaXMuY29sbGlzaW9uQ2lyY2xlQXJyYXlzW2UuYnVja2V0SW5zdGFuY2VJZF07XG4gICAgICAgIGUucGxhY2VtZW50SW52UHJvak1hdHJpeCA9IGcuaW52UHJvak1hdHJpeCwgZS5wbGFjZW1lbnRWaWV3cG9ydE1hdHJpeCA9IGcudmlld3BvcnRNYXRyaXgsIGUuY29sbGlzaW9uQ2lyY2xlQXJyYXkgPSBnLmNpcmNsZXMsIGRlbGV0ZSB0aGlzLmNvbGxpc2lvbkNpcmNsZUFycmF5c1tlLmJ1Y2tldEluc3RhbmNlSWRdO1xuICAgICAgfVxuICAgIH0sIGJlLnByb3RvdHlwZS5zeW1ib2xGYWRlQ2hhbmdlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiAwID09PSB0aGlzLmZhZGVEdXJhdGlvbiA/IDEgOiAodCAtIHRoaXMuY29tbWl0VGltZSkgLyB0aGlzLmZhZGVEdXJhdGlvbiArIHRoaXMucHJldlpvb21BZGp1c3RtZW50O1xuICAgIH0sIGJlLnByb3RvdHlwZS56b29tQWRqdXN0bWVudCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gTWF0aC5tYXgoMCwgKHRoaXMudHJhbnNmb3JtLnpvb20gLSB0KSAvIDEuNSk7XG4gICAgfSwgYmUucHJvdG90eXBlLmhhc1RyYW5zaXRpb25zID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0YWxlIHx8IHQgLSB0aGlzLmxhc3RQbGFjZW1lbnRDaGFuZ2VUaW1lIDwgdGhpcy5mYWRlRHVyYXRpb247XG4gICAgfSwgYmUucHJvdG90eXBlLnN0aWxsUmVjZW50ID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHZhciBpID0gdGhpcy56b29tQXRMYXN0UmVjZW5jeUNoZWNrID09PSBlID8gMSAtIHRoaXMuem9vbUFkanVzdG1lbnQoZSkgOiAxO1xuICAgICAgcmV0dXJuIHRoaXMuem9vbUF0TGFzdFJlY2VuY3lDaGVjayA9IGUsIHRoaXMuY29tbWl0VGltZSArIHRoaXMuZmFkZUR1cmF0aW9uICogaSA+IHQ7XG4gICAgfSwgYmUucHJvdG90eXBlLnNldFN0YWxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5zdGFsZSA9ICEwO1xuICAgIH07XG4gICAgdmFyIFRlID0gTWF0aC5wb3coMiwgMjUpLFxuICAgICAgICBFZSA9IE1hdGgucG93KDIsIDI0KSxcbiAgICAgICAgSWUgPSBNYXRoLnBvdygyLCAxNyksXG4gICAgICAgIFBlID0gTWF0aC5wb3coMiwgMTYpLFxuICAgICAgICBTZSA9IE1hdGgucG93KDIsIDkpLFxuICAgICAgICBDZSA9IE1hdGgucG93KDIsIDgpLFxuICAgICAgICB6ZSA9IE1hdGgucG93KDIsIDEpO1xuXG4gICAgZnVuY3Rpb24gRGUodCkge1xuICAgICAgaWYgKDAgPT09IHQub3BhY2l0eSAmJiAhdC5wbGFjZWQpIHJldHVybiAwO1xuICAgICAgaWYgKDEgPT09IHQub3BhY2l0eSAmJiB0LnBsYWNlZCkgcmV0dXJuIDQyOTQ5NjcyOTU7XG4gICAgICB2YXIgZSA9IHQucGxhY2VkID8gMSA6IDAsXG4gICAgICAgICAgaSA9IE1hdGguZmxvb3IoMTI3ICogdC5vcGFjaXR5KTtcbiAgICAgIHJldHVybiBpICogVGUgKyBlICogRWUgKyBpICogSWUgKyBlICogUGUgKyBpICogU2UgKyBlICogQ2UgKyBpICogemUgKyBlO1xuICAgIH1cblxuICAgIHZhciBBZSA9IDAsXG4gICAgICAgIE1lID0gZnVuY3Rpb24gTWUodCkge1xuICAgICAgdGhpcy5fc29ydEFjcm9zc1RpbGVzID0gXCJ2aWV3cG9ydC15XCIgIT09IHQubGF5b3V0LmdldChcInN5bWJvbC16LW9yZGVyXCIpICYmIHZvaWQgMCAhPT0gdC5sYXlvdXQuZ2V0KFwic3ltYm9sLXNvcnQta2V5XCIpLmNvbnN0YW50T3IoMSksIHRoaXMuX2N1cnJlbnRUaWxlSW5kZXggPSAwLCB0aGlzLl9jdXJyZW50UGFydEluZGV4ID0gMCwgdGhpcy5fc2VlbkNyb3NzVGlsZUlEcyA9IHt9LCB0aGlzLl9idWNrZXRQYXJ0cyA9IFtdO1xuICAgIH07XG5cbiAgICBNZS5wcm90b3R5cGUuY29udGludWVQbGFjZW1lbnQgPSBmdW5jdGlvbiAodCwgZSwgaSwgbywgcikge1xuICAgICAgZm9yICh2YXIgYSA9IHRoaXMuX2J1Y2tldFBhcnRzOyB0aGlzLl9jdXJyZW50VGlsZUluZGV4IDwgdC5sZW5ndGg7KSB7XG4gICAgICAgIGlmIChlLmdldEJ1Y2tldFBhcnRzKGEsIG8sIHRbdGhpcy5fY3VycmVudFRpbGVJbmRleF0sIHRoaXMuX3NvcnRBY3Jvc3NUaWxlcyksIHRoaXMuX2N1cnJlbnRUaWxlSW5kZXgrKywgcigpKSByZXR1cm4gITA7XG4gICAgICB9XG5cbiAgICAgIGZvciAodGhpcy5fc29ydEFjcm9zc1RpbGVzICYmICh0aGlzLl9zb3J0QWNyb3NzVGlsZXMgPSAhMSwgYS5zb3J0KGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0LnNvcnRLZXkgLSBlLnNvcnRLZXk7XG4gICAgICB9KSk7IHRoaXMuX2N1cnJlbnRQYXJ0SW5kZXggPCBhLmxlbmd0aDspIHtcbiAgICAgICAgaWYgKGUucGxhY2VMYXllckJ1Y2tldFBhcnQoYVt0aGlzLl9jdXJyZW50UGFydEluZGV4XSwgdGhpcy5fc2VlbkNyb3NzVGlsZUlEcywgaSksIHRoaXMuX2N1cnJlbnRQYXJ0SW5kZXgrKywgcigpKSByZXR1cm4gITA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAhMTtcbiAgICB9O1xuXG4gICAgdmFyIExlID0gZnVuY3Rpb24gTGUodCwgZSwgaSwgbywgciwgYSwgbikge1xuICAgICAgdGhpcy5wbGFjZW1lbnQgPSBuZXcgYmUodCwgciwgYSwgbiksIHRoaXMuX2N1cnJlbnRQbGFjZW1lbnRJbmRleCA9IGUubGVuZ3RoIC0gMSwgdGhpcy5fZm9yY2VGdWxsUGxhY2VtZW50ID0gaSwgdGhpcy5fc2hvd0NvbGxpc2lvbkJveGVzID0gbywgdGhpcy5fZG9uZSA9ICExO1xuICAgIH07XG5cbiAgICBMZS5wcm90b3R5cGUuaXNEb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2RvbmU7XG4gICAgfSwgTGUucHJvdG90eXBlLmNvbnRpbnVlUGxhY2VtZW50ID0gZnVuY3Rpb24gKGUsIGksIG8pIHtcbiAgICAgIGZvciAodmFyIHIgPSB0aGlzLCBhID0gdC5icm93c2VyLm5vdygpLCBuID0gZnVuY3Rpb24gbigpIHtcbiAgICAgICAgdmFyIGUgPSB0LmJyb3dzZXIubm93KCkgLSBhO1xuICAgICAgICByZXR1cm4gIXIuX2ZvcmNlRnVsbFBsYWNlbWVudCAmJiBlID4gMjtcbiAgICAgIH07IHRoaXMuX2N1cnJlbnRQbGFjZW1lbnRJbmRleCA+PSAwOykge1xuICAgICAgICB2YXIgcyA9IGlbZVt0aGlzLl9jdXJyZW50UGxhY2VtZW50SW5kZXhdXSxcbiAgICAgICAgICAgIGwgPSB0aGlzLnBsYWNlbWVudC5jb2xsaXNpb25JbmRleC50cmFuc2Zvcm0uem9vbTtcblxuICAgICAgICBpZiAoXCJzeW1ib2xcIiA9PT0gcy50eXBlICYmICghcy5taW56b29tIHx8IHMubWluem9vbSA8PSBsKSAmJiAoIXMubWF4em9vbSB8fCBzLm1heHpvb20gPiBsKSkge1xuICAgICAgICAgIGlmICh0aGlzLl9pblByb2dyZXNzTGF5ZXIgfHwgKHRoaXMuX2luUHJvZ3Jlc3NMYXllciA9IG5ldyBNZShzKSksIHRoaXMuX2luUHJvZ3Jlc3NMYXllci5jb250aW51ZVBsYWNlbWVudChvW3Muc291cmNlXSwgdGhpcy5wbGFjZW1lbnQsIHRoaXMuX3Nob3dDb2xsaXNpb25Cb3hlcywgcywgbikpIHJldHVybjtcbiAgICAgICAgICBkZWxldGUgdGhpcy5faW5Qcm9ncmVzc0xheWVyO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY3VycmVudFBsYWNlbWVudEluZGV4LS07XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2RvbmUgPSAhMDtcbiAgICB9LCBMZS5wcm90b3R5cGUuY29tbWl0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0aGlzLnBsYWNlbWVudC5jb21taXQodCksIHRoaXMucGxhY2VtZW50O1xuICAgIH07XG5cbiAgICB2YXIgUmUgPSA1MTIgLyB0LkVYVEVOVCAvIDIsXG4gICAgICAgIGtlID0gZnVuY3Rpb24ga2UodCwgZSwgaSkge1xuICAgICAgdGhpcy50aWxlSUQgPSB0LCB0aGlzLmluZGV4ZWRTeW1ib2xJbnN0YW5jZXMgPSB7fSwgdGhpcy5idWNrZXRJbnN0YW5jZUlkID0gaTtcblxuICAgICAgZm9yICh2YXIgbyA9IDA7IG8gPCBlLmxlbmd0aDsgbysrKSB7XG4gICAgICAgIHZhciByID0gZS5nZXQobyksXG4gICAgICAgICAgICBhID0gci5rZXk7XG4gICAgICAgIHRoaXMuaW5kZXhlZFN5bWJvbEluc3RhbmNlc1thXSB8fCAodGhpcy5pbmRleGVkU3ltYm9sSW5zdGFuY2VzW2FdID0gW10pLCB0aGlzLmluZGV4ZWRTeW1ib2xJbnN0YW5jZXNbYV0ucHVzaCh7XG4gICAgICAgICAgY3Jvc3NUaWxlSUQ6IHIuY3Jvc3NUaWxlSUQsXG4gICAgICAgICAgY29vcmQ6IHRoaXMuZ2V0U2NhbGVkQ29vcmRpbmF0ZXMociwgdClcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGtlLnByb3RvdHlwZS5nZXRTY2FsZWRDb29yZGluYXRlcyA9IGZ1bmN0aW9uIChlLCBpKSB7XG4gICAgICB2YXIgbyA9IFJlIC8gTWF0aC5wb3coMiwgaS5jYW5vbmljYWwueiAtIHRoaXMudGlsZUlELmNhbm9uaWNhbC56KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IE1hdGguZmxvb3IoKGkuY2Fub25pY2FsLnggKiB0LkVYVEVOVCArIGUuYW5jaG9yWCkgKiBvKSxcbiAgICAgICAgeTogTWF0aC5mbG9vcigoaS5jYW5vbmljYWwueSAqIHQuRVhURU5UICsgZS5hbmNob3JZKSAqIG8pXG4gICAgICB9O1xuICAgIH0sIGtlLnByb3RvdHlwZS5maW5kTWF0Y2hlcyA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICBmb3IgKHZhciBvID0gdGhpcy50aWxlSUQuY2Fub25pY2FsLnogPCBlLmNhbm9uaWNhbC56ID8gMSA6IE1hdGgucG93KDIsIHRoaXMudGlsZUlELmNhbm9uaWNhbC56IC0gZS5jYW5vbmljYWwueiksIHIgPSAwOyByIDwgdC5sZW5ndGg7IHIrKykge1xuICAgICAgICB2YXIgYSA9IHQuZ2V0KHIpO1xuXG4gICAgICAgIGlmICghYS5jcm9zc1RpbGVJRCkge1xuICAgICAgICAgIHZhciBuID0gdGhpcy5pbmRleGVkU3ltYm9sSW5zdGFuY2VzW2Eua2V5XTtcbiAgICAgICAgICBpZiAobikgZm9yICh2YXIgcyA9IHRoaXMuZ2V0U2NhbGVkQ29vcmRpbmF0ZXMoYSwgZSksIGwgPSAwLCBjID0gbjsgbCA8IGMubGVuZ3RoOyBsICs9IDEpIHtcbiAgICAgICAgICAgIHZhciB1ID0gY1tsXTtcblxuICAgICAgICAgICAgaWYgKE1hdGguYWJzKHUuY29vcmQueCAtIHMueCkgPD0gbyAmJiBNYXRoLmFicyh1LmNvb3JkLnkgLSBzLnkpIDw9IG8gJiYgIWlbdS5jcm9zc1RpbGVJRF0pIHtcbiAgICAgICAgICAgICAgaVt1LmNyb3NzVGlsZUlEXSA9ICEwLCBhLmNyb3NzVGlsZUlEID0gdS5jcm9zc1RpbGVJRDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciBCZSA9IGZ1bmN0aW9uIEJlKCkge1xuICAgICAgdGhpcy5tYXhDcm9zc1RpbGVJRCA9IDA7XG4gICAgfTtcblxuICAgIEJlLnByb3RvdHlwZS5nZW5lcmF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiArK3RoaXMubWF4Q3Jvc3NUaWxlSUQ7XG4gICAgfTtcblxuICAgIHZhciBPZSA9IGZ1bmN0aW9uIE9lKCkge1xuICAgICAgdGhpcy5pbmRleGVzID0ge30sIHRoaXMudXNlZENyb3NzVGlsZUlEcyA9IHt9LCB0aGlzLmxuZyA9IDA7XG4gICAgfTtcblxuICAgIE9lLnByb3RvdHlwZS5oYW5kbGVXcmFwSnVtcCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2YXIgZSA9IE1hdGgucm91bmQoKHQgLSB0aGlzLmxuZykgLyAzNjApO1xuICAgICAgaWYgKDAgIT09IGUpIGZvciAodmFyIGkgaW4gdGhpcy5pbmRleGVzKSB7XG4gICAgICAgIHZhciBvID0gdGhpcy5pbmRleGVzW2ldLFxuICAgICAgICAgICAgciA9IHt9O1xuXG4gICAgICAgIGZvciAodmFyIGEgaW4gbykge1xuICAgICAgICAgIHZhciBuID0gb1thXTtcbiAgICAgICAgICBuLnRpbGVJRCA9IG4udGlsZUlELnVud3JhcFRvKG4udGlsZUlELndyYXAgKyBlKSwgcltuLnRpbGVJRC5rZXldID0gbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5kZXhlc1tpXSA9IHI7XG4gICAgICB9XG4gICAgICB0aGlzLmxuZyA9IHQ7XG4gICAgfSwgT2UucHJvdG90eXBlLmFkZEJ1Y2tldCA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICBpZiAodGhpcy5pbmRleGVzW3Qub3ZlcnNjYWxlZFpdICYmIHRoaXMuaW5kZXhlc1t0Lm92ZXJzY2FsZWRaXVt0LmtleV0pIHtcbiAgICAgICAgaWYgKHRoaXMuaW5kZXhlc1t0Lm92ZXJzY2FsZWRaXVt0LmtleV0uYnVja2V0SW5zdGFuY2VJZCA9PT0gZS5idWNrZXRJbnN0YW5jZUlkKSByZXR1cm4gITE7XG4gICAgICAgIHRoaXMucmVtb3ZlQnVja2V0Q3Jvc3NUaWxlSURzKHQub3ZlcnNjYWxlZFosIHRoaXMuaW5kZXhlc1t0Lm92ZXJzY2FsZWRaXVt0LmtleV0pO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBvID0gMDsgbyA8IGUuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aDsgbysrKSB7XG4gICAgICAgIGUuc3ltYm9sSW5zdGFuY2VzLmdldChvKS5jcm9zc1RpbGVJRCA9IDA7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudXNlZENyb3NzVGlsZUlEc1t0Lm92ZXJzY2FsZWRaXSB8fCAodGhpcy51c2VkQ3Jvc3NUaWxlSURzW3Qub3ZlcnNjYWxlZFpdID0ge30pO1xuICAgICAgdmFyIHIgPSB0aGlzLnVzZWRDcm9zc1RpbGVJRHNbdC5vdmVyc2NhbGVkWl07XG5cbiAgICAgIGZvciAodmFyIGEgaW4gdGhpcy5pbmRleGVzKSB7XG4gICAgICAgIHZhciBuID0gdGhpcy5pbmRleGVzW2FdO1xuICAgICAgICBpZiAoTnVtYmVyKGEpID4gdC5vdmVyc2NhbGVkWikgZm9yICh2YXIgcyBpbiBuKSB7XG4gICAgICAgICAgdmFyIGwgPSBuW3NdO1xuICAgICAgICAgIGwudGlsZUlELmlzQ2hpbGRPZih0KSAmJiBsLmZpbmRNYXRjaGVzKGUuc3ltYm9sSW5zdGFuY2VzLCB0LCByKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgYyA9IG5bdC5zY2FsZWRUbyhOdW1iZXIoYSkpLmtleV07XG4gICAgICAgICAgYyAmJiBjLmZpbmRNYXRjaGVzKGUuc3ltYm9sSW5zdGFuY2VzLCB0LCByKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciB1ID0gMDsgdSA8IGUuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aDsgdSsrKSB7XG4gICAgICAgIHZhciBoID0gZS5zeW1ib2xJbnN0YW5jZXMuZ2V0KHUpO1xuICAgICAgICBoLmNyb3NzVGlsZUlEIHx8IChoLmNyb3NzVGlsZUlEID0gaS5nZW5lcmF0ZSgpLCByW2guY3Jvc3NUaWxlSURdID0gITApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdm9pZCAwID09PSB0aGlzLmluZGV4ZXNbdC5vdmVyc2NhbGVkWl0gJiYgKHRoaXMuaW5kZXhlc1t0Lm92ZXJzY2FsZWRaXSA9IHt9KSwgdGhpcy5pbmRleGVzW3Qub3ZlcnNjYWxlZFpdW3Qua2V5XSA9IG5ldyBrZSh0LCBlLnN5bWJvbEluc3RhbmNlcywgZS5idWNrZXRJbnN0YW5jZUlkKSwgITA7XG4gICAgfSwgT2UucHJvdG90eXBlLnJlbW92ZUJ1Y2tldENyb3NzVGlsZUlEcyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICBmb3IgKHZhciBpIGluIGUuaW5kZXhlZFN5bWJvbEluc3RhbmNlcykge1xuICAgICAgICBmb3IgKHZhciBvID0gMCwgciA9IGUuaW5kZXhlZFN5bWJvbEluc3RhbmNlc1tpXTsgbyA8IHIubGVuZ3RoOyBvICs9IDEpIHtcbiAgICAgICAgICBkZWxldGUgdGhpcy51c2VkQ3Jvc3NUaWxlSURzW3RdW3Jbb10uY3Jvc3NUaWxlSURdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgT2UucHJvdG90eXBlLnJlbW92ZVN0YWxlQnVja2V0cyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2YXIgZSA9ICExO1xuXG4gICAgICBmb3IgKHZhciBpIGluIHRoaXMuaW5kZXhlcykge1xuICAgICAgICB2YXIgbyA9IHRoaXMuaW5kZXhlc1tpXTtcblxuICAgICAgICBmb3IgKHZhciByIGluIG8pIHtcbiAgICAgICAgICB0W29bcl0uYnVja2V0SW5zdGFuY2VJZF0gfHwgKHRoaXMucmVtb3ZlQnVja2V0Q3Jvc3NUaWxlSURzKGksIG9bcl0pLCBkZWxldGUgb1tyXSwgZSA9ICEwKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZTtcbiAgICB9O1xuXG4gICAgdmFyIEZlID0gZnVuY3Rpb24gRmUoKSB7XG4gICAgICB0aGlzLmxheWVySW5kZXhlcyA9IHt9LCB0aGlzLmNyb3NzVGlsZUlEcyA9IG5ldyBCZSgpLCB0aGlzLm1heEJ1Y2tldEluc3RhbmNlSWQgPSAwLCB0aGlzLmJ1Y2tldHNJbkN1cnJlbnRQbGFjZW1lbnQgPSB7fTtcbiAgICB9O1xuXG4gICAgRmUucHJvdG90eXBlLmFkZExheWVyID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcbiAgICAgIHZhciBvID0gdGhpcy5sYXllckluZGV4ZXNbdC5pZF07XG4gICAgICB2b2lkIDAgPT09IG8gJiYgKG8gPSB0aGlzLmxheWVySW5kZXhlc1t0LmlkXSA9IG5ldyBPZSgpKTtcbiAgICAgIHZhciByID0gITEsXG4gICAgICAgICAgYSA9IHt9O1xuICAgICAgby5oYW5kbGVXcmFwSnVtcChpKTtcblxuICAgICAgZm9yICh2YXIgbiA9IDAsIHMgPSBlOyBuIDwgcy5sZW5ndGg7IG4gKz0gMSkge1xuICAgICAgICB2YXIgbCA9IHNbbl0sXG4gICAgICAgICAgICBjID0gbC5nZXRCdWNrZXQodCk7XG4gICAgICAgIGMgJiYgdC5pZCA9PT0gYy5sYXllcklkc1swXSAmJiAoYy5idWNrZXRJbnN0YW5jZUlkIHx8IChjLmJ1Y2tldEluc3RhbmNlSWQgPSArK3RoaXMubWF4QnVja2V0SW5zdGFuY2VJZCksIG8uYWRkQnVja2V0KGwudGlsZUlELCBjLCB0aGlzLmNyb3NzVGlsZUlEcykgJiYgKHIgPSAhMCksIGFbYy5idWNrZXRJbnN0YW5jZUlkXSA9ICEwKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG8ucmVtb3ZlU3RhbGVCdWNrZXRzKGEpICYmIChyID0gITApLCByO1xuICAgIH0sIEZlLnByb3RvdHlwZS5wcnVuZVVudXNlZExheWVycyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2YXIgZSA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBpIGluIHQuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICBlW3RdID0gITA7XG4gICAgICB9KSwgdGhpcy5sYXllckluZGV4ZXMpIHtcbiAgICAgICAgZVtpXSB8fCBkZWxldGUgdGhpcy5sYXllckluZGV4ZXNbaV07XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciBVZSA9IGZ1bmN0aW9uIFVlKGUsIGkpIHtcbiAgICAgIHJldHVybiB0LmVtaXRWYWxpZGF0aW9uRXJyb3JzKGUsIGkgJiYgaS5maWx0ZXIoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIFwic291cmNlLmNhbnZhc1wiICE9PSB0LmlkZW50aWZpZXI7XG4gICAgICB9KSk7XG4gICAgfSxcbiAgICAgICAgTmUgPSB0LnBpY2soWnQsIFtcImFkZExheWVyXCIsIFwicmVtb3ZlTGF5ZXJcIiwgXCJzZXRQYWludFByb3BlcnR5XCIsIFwic2V0TGF5b3V0UHJvcGVydHlcIiwgXCJzZXRGaWx0ZXJcIiwgXCJhZGRTb3VyY2VcIiwgXCJyZW1vdmVTb3VyY2VcIiwgXCJzZXRMYXllclpvb21SYW5nZVwiLCBcInNldExpZ2h0XCIsIFwic2V0VHJhbnNpdGlvblwiLCBcInNldEdlb0pTT05Tb3VyY2VEYXRhXCJdKSxcbiAgICAgICAgWmUgPSB0LnBpY2soWnQsIFtcInNldENlbnRlclwiLCBcInNldFpvb21cIiwgXCJzZXRCZWFyaW5nXCIsIFwic2V0UGl0Y2hcIl0pLFxuICAgICAgICBxZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBlID0ge30sXG4gICAgICAgICAgaSA9IHQuc3R5bGVTcGVjLiR2ZXJzaW9uO1xuXG4gICAgICBmb3IgKHZhciBvIGluIHQuc3R5bGVTcGVjLiRyb290KSB7XG4gICAgICAgIHZhciByLFxuICAgICAgICAgICAgYSA9IHQuc3R5bGVTcGVjLiRyb290W29dO1xuICAgICAgICBpZiAoYS5yZXF1aXJlZCkgbnVsbCAhPSAociA9IFwidmVyc2lvblwiID09PSBvID8gaSA6IFwiYXJyYXlcIiA9PT0gYS50eXBlID8gW10gOiB7fSkgJiYgKGVbb10gPSByKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGU7XG4gICAgfSgpLFxuICAgICAgICBqZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBmdW5jdGlvbiBpKG8sIHIpIHtcbiAgICAgICAgdmFyIGEgPSB0aGlzO1xuICAgICAgICB2b2lkIDAgPT09IHIgJiYgKHIgPSB7fSksIGUuY2FsbCh0aGlzKSwgdGhpcy5tYXAgPSBvLCB0aGlzLmRpc3BhdGNoZXIgPSBuZXcgRShGdCgpLCB0aGlzKSwgdGhpcy5pbWFnZU1hbmFnZXIgPSBuZXcgcCgpLCB0aGlzLmltYWdlTWFuYWdlci5zZXRFdmVudGVkUGFyZW50KHRoaXMpLCB0aGlzLmdseXBoTWFuYWdlciA9IG5ldyB5KG8uX3JlcXVlc3RNYW5hZ2VyLCByLmxvY2FsSWRlb2dyYXBoRm9udEZhbWlseSksIHRoaXMubGluZUF0bGFzID0gbmV3IFQoMjU2LCA1MTIpLCB0aGlzLmNyb3NzVGlsZVN5bWJvbEluZGV4ID0gbmV3IEZlKCksIHRoaXMuX2xheWVycyA9IHt9LCB0aGlzLl9zZXJpYWxpemVkTGF5ZXJzID0ge30sIHRoaXMuX29yZGVyID0gW10sIHRoaXMuc291cmNlQ2FjaGVzID0ge30sIHRoaXMuem9vbUhpc3RvcnkgPSBuZXcgdC5ab29tSGlzdG9yeSgpLCB0aGlzLl9sb2FkZWQgPSAhMSwgdGhpcy5fYXZhaWxhYmxlSW1hZ2VzID0gW10sIHRoaXMuX3Jlc2V0VXBkYXRlcygpLCB0aGlzLmRpc3BhdGNoZXIuYnJvYWRjYXN0KFwic2V0UmVmZXJyZXJcIiwgdC5nZXRSZWZlcnJlcigpKTtcbiAgICAgICAgdmFyIG4gPSB0aGlzO1xuICAgICAgICB0aGlzLl9ydGxUZXh0UGx1Z2luQ2FsbGJhY2sgPSBpLnJlZ2lzdGVyRm9yUGx1Z2luU3RhdGVDaGFuZ2UoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICBuLmRpc3BhdGNoZXIuYnJvYWRjYXN0KFwic3luY1JUTFBsdWdpblN0YXRlXCIsIHtcbiAgICAgICAgICAgIHBsdWdpblN0YXR1czogZS5wbHVnaW5TdGF0dXMsXG4gICAgICAgICAgICBwbHVnaW5VUkw6IGUucGx1Z2luVVJMXG4gICAgICAgICAgfSwgZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgICAgICAgIGlmICh0LnRyaWdnZXJQbHVnaW5Db21wbGV0aW9uRXZlbnQoZSksIGkgJiYgaS5ldmVyeShmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICByZXR1cm4gdDtcbiAgICAgICAgICAgIH0pKSBmb3IgKHZhciBvIGluIG4uc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICAgIG4uc291cmNlQ2FjaGVzW29dLnJlbG9hZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KSwgdGhpcy5vbihcImRhdGFcIiwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICBpZiAoXCJzb3VyY2VcIiA9PT0gdC5kYXRhVHlwZSAmJiBcIm1ldGFkYXRhXCIgPT09IHQuc291cmNlRGF0YVR5cGUpIHtcbiAgICAgICAgICAgIHZhciBlID0gYS5zb3VyY2VDYWNoZXNbdC5zb3VyY2VJZF07XG5cbiAgICAgICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICAgIHZhciBpID0gZS5nZXRTb3VyY2UoKTtcbiAgICAgICAgICAgICAgaWYgKGkgJiYgaS52ZWN0b3JMYXllcklkcykgZm9yICh2YXIgbyBpbiBhLl9sYXllcnMpIHtcbiAgICAgICAgICAgICAgICB2YXIgciA9IGEuX2xheWVyc1tvXTtcbiAgICAgICAgICAgICAgICByLnNvdXJjZSA9PT0gaS5pZCAmJiBhLl92YWxpZGF0ZUxheWVyKHIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGUgJiYgKGkuX19wcm90b19fID0gZSksIChpLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoZSAmJiBlLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gaSwgaS5wcm90b3R5cGUubG9hZFVSTCA9IGZ1bmN0aW9uIChlLCBpKSB7XG4gICAgICAgIHZhciBvID0gdGhpcztcbiAgICAgICAgdm9pZCAwID09PSBpICYmIChpID0ge30pLCB0aGlzLmZpcmUobmV3IHQuRXZlbnQoXCJkYXRhbG9hZGluZ1wiLCB7XG4gICAgICAgICAgZGF0YVR5cGU6IFwic3R5bGVcIlxuICAgICAgICB9KSk7XG4gICAgICAgIHZhciByID0gXCJib29sZWFuXCIgPT0gdHlwZW9mIGkudmFsaWRhdGUgPyBpLnZhbGlkYXRlIDogIXQuaXNNYXBib3hVUkwoZSk7XG4gICAgICAgIGUgPSB0aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIubm9ybWFsaXplU3R5bGVVUkwoZSwgaS5hY2Nlc3NUb2tlbik7XG5cbiAgICAgICAgdmFyIGEgPSB0aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIudHJhbnNmb3JtUmVxdWVzdChlLCB0LlJlc291cmNlVHlwZS5TdHlsZSk7XG5cbiAgICAgICAgdGhpcy5fcmVxdWVzdCA9IHQuZ2V0SlNPTihhLCBmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgICAgIG8uX3JlcXVlc3QgPSBudWxsLCBlID8gby5maXJlKG5ldyB0LkVycm9yRXZlbnQoZSkpIDogaSAmJiBvLl9sb2FkKGksIHIpO1xuICAgICAgICB9KTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmxvYWRKU09OID0gZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgICAgdmFyIG8gPSB0aGlzO1xuICAgICAgICB2b2lkIDAgPT09IGkgJiYgKGkgPSB7fSksIHRoaXMuZmlyZShuZXcgdC5FdmVudChcImRhdGFsb2FkaW5nXCIsIHtcbiAgICAgICAgICBkYXRhVHlwZTogXCJzdHlsZVwiXG4gICAgICAgIH0pKSwgdGhpcy5fcmVxdWVzdCA9IHQuYnJvd3Nlci5mcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgby5fcmVxdWVzdCA9IG51bGwsIG8uX2xvYWQoZSwgITEgIT09IGkudmFsaWRhdGUpO1xuICAgICAgICB9KTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmxvYWRFbXB0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5maXJlKG5ldyB0LkV2ZW50KFwiZGF0YWxvYWRpbmdcIiwge1xuICAgICAgICAgIGRhdGFUeXBlOiBcInN0eWxlXCJcbiAgICAgICAgfSkpLCB0aGlzLl9sb2FkKHFlLCAhMSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5fbG9hZCA9IGZ1bmN0aW9uIChlLCBpKSB7XG4gICAgICAgIGlmICghaSB8fCAhVWUodGhpcywgdC52YWxpZGF0ZVN0eWxlKGUpKSkge1xuICAgICAgICAgIGZvciAodmFyIG8gaW4gdGhpcy5fbG9hZGVkID0gITAsIHRoaXMuc3R5bGVzaGVldCA9IGUsIGUuc291cmNlcykge1xuICAgICAgICAgICAgdGhpcy5hZGRTb3VyY2UobywgZS5zb3VyY2VzW29dLCB7XG4gICAgICAgICAgICAgIHZhbGlkYXRlOiAhMVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZS5zcHJpdGUgPyB0aGlzLl9sb2FkU3ByaXRlKGUuc3ByaXRlKSA6IHRoaXMuaW1hZ2VNYW5hZ2VyLnNldExvYWRlZCghMCksIHRoaXMuZ2x5cGhNYW5hZ2VyLnNldFVSTChlLmdseXBocyk7XG4gICAgICAgICAgdmFyIHIgPSBOdCh0aGlzLnN0eWxlc2hlZXQubGF5ZXJzKTtcbiAgICAgICAgICB0aGlzLl9vcmRlciA9IHIubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICByZXR1cm4gdC5pZDtcbiAgICAgICAgICB9KSwgdGhpcy5fbGF5ZXJzID0ge30sIHRoaXMuX3NlcmlhbGl6ZWRMYXllcnMgPSB7fTtcblxuICAgICAgICAgIGZvciAodmFyIGEgPSAwLCBuID0gcjsgYSA8IG4ubGVuZ3RoOyBhICs9IDEpIHtcbiAgICAgICAgICAgIHZhciBzID0gblthXTtcbiAgICAgICAgICAgIChzID0gdC5jcmVhdGVTdHlsZUxheWVyKHMpKS5zZXRFdmVudGVkUGFyZW50KHRoaXMsIHtcbiAgICAgICAgICAgICAgbGF5ZXI6IHtcbiAgICAgICAgICAgICAgICBpZDogcy5pZFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSwgdGhpcy5fbGF5ZXJzW3MuaWRdID0gcywgdGhpcy5fc2VyaWFsaXplZExheWVyc1tzLmlkXSA9IHMuc2VyaWFsaXplKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5kaXNwYXRjaGVyLmJyb2FkY2FzdChcInNldExheWVyc1wiLCB0aGlzLl9zZXJpYWxpemVMYXllcnModGhpcy5fb3JkZXIpKSwgdGhpcy5saWdodCA9IG5ldyB3KHRoaXMuc3R5bGVzaGVldC5saWdodCksIHRoaXMuZmlyZShuZXcgdC5FdmVudChcImRhdGFcIiwge1xuICAgICAgICAgICAgZGF0YVR5cGU6IFwic3R5bGVcIlxuICAgICAgICAgIH0pKSwgdGhpcy5maXJlKG5ldyB0LkV2ZW50KFwic3R5bGUubG9hZFwiKSk7XG4gICAgICAgIH1cbiAgICAgIH0sIGkucHJvdG90eXBlLl9sb2FkU3ByaXRlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIGkgPSB0aGlzO1xuXG4gICAgICAgIHRoaXMuX3Nwcml0ZVJlcXVlc3QgPSBmdW5jdGlvbiAoZSwgaSwgbykge1xuICAgICAgICAgIHZhciByLFxuICAgICAgICAgICAgICBhLFxuICAgICAgICAgICAgICBuLFxuICAgICAgICAgICAgICBzID0gdC5icm93c2VyLmRldmljZVBpeGVsUmF0aW8gPiAxID8gXCJAMnhcIiA6IFwiXCIsXG4gICAgICAgICAgICAgIGwgPSB0LmdldEpTT04oaS50cmFuc2Zvcm1SZXF1ZXN0KGkubm9ybWFsaXplU3ByaXRlVVJMKGUsIHMsIFwiLmpzb25cIiksIHQuUmVzb3VyY2VUeXBlLlNwcml0ZUpTT04pLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgICAgbCA9IG51bGwsIG4gfHwgKG4gPSB0LCByID0gZSwgdSgpKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgYyA9IHQuZ2V0SW1hZ2UoaS50cmFuc2Zvcm1SZXF1ZXN0KGkubm9ybWFsaXplU3ByaXRlVVJMKGUsIHMsIFwiLnBuZ1wiKSwgdC5SZXNvdXJjZVR5cGUuU3ByaXRlSW1hZ2UpLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgICAgYyA9IG51bGwsIG4gfHwgKG4gPSB0LCBhID0gZSwgdSgpKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGZ1bmN0aW9uIHUoKSB7XG4gICAgICAgICAgICBpZiAobikgbyhuKTtlbHNlIGlmIChyICYmIGEpIHtcbiAgICAgICAgICAgICAgdmFyIGUgPSB0LmJyb3dzZXIuZ2V0SW1hZ2VEYXRhKGEpLFxuICAgICAgICAgICAgICAgICAgaSA9IHt9O1xuXG4gICAgICAgICAgICAgIGZvciAodmFyIHMgaW4gcikge1xuICAgICAgICAgICAgICAgIHZhciBsID0gcltzXSxcbiAgICAgICAgICAgICAgICAgICAgYyA9IGwud2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIHUgPSBsLmhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgaCA9IGwueCxcbiAgICAgICAgICAgICAgICAgICAgcCA9IGwueSxcbiAgICAgICAgICAgICAgICAgICAgZCA9IGwuc2RmLFxuICAgICAgICAgICAgICAgICAgICBfID0gbC5waXhlbFJhdGlvLFxuICAgICAgICAgICAgICAgICAgICBmID0gbC5zdHJldGNoWCxcbiAgICAgICAgICAgICAgICAgICAgbSA9IGwuc3RyZXRjaFksXG4gICAgICAgICAgICAgICAgICAgIGcgPSBsLmNvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgIHYgPSBuZXcgdC5SR0JBSW1hZ2Uoe1xuICAgICAgICAgICAgICAgICAgd2lkdGg6IGMsXG4gICAgICAgICAgICAgICAgICBoZWlnaHQ6IHVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0LlJHQkFJbWFnZS5jb3B5KGUsIHYsIHtcbiAgICAgICAgICAgICAgICAgIHg6IGgsXG4gICAgICAgICAgICAgICAgICB5OiBwXG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgICAgICAgIHk6IDBcbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICB3aWR0aDogYyxcbiAgICAgICAgICAgICAgICAgIGhlaWdodDogdVxuICAgICAgICAgICAgICAgIH0pLCBpW3NdID0ge1xuICAgICAgICAgICAgICAgICAgZGF0YTogdixcbiAgICAgICAgICAgICAgICAgIHBpeGVsUmF0aW86IF8sXG4gICAgICAgICAgICAgICAgICBzZGY6IGQsXG4gICAgICAgICAgICAgICAgICBzdHJldGNoWDogZixcbiAgICAgICAgICAgICAgICAgIHN0cmV0Y2hZOiBtLFxuICAgICAgICAgICAgICAgICAgY29udGVudDogZ1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBvKG51bGwsIGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uIGNhbmNlbCgpIHtcbiAgICAgICAgICAgICAgbCAmJiAobC5jYW5jZWwoKSwgbCA9IG51bGwpLCBjICYmIChjLmNhbmNlbCgpLCBjID0gbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfShlLCB0aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIsIGZ1bmN0aW9uIChlLCBvKSB7XG4gICAgICAgICAgaWYgKGkuX3Nwcml0ZVJlcXVlc3QgPSBudWxsLCBlKSBpLmZpcmUobmV3IHQuRXJyb3JFdmVudChlKSk7ZWxzZSBpZiAobykgZm9yICh2YXIgciBpbiBvKSB7XG4gICAgICAgICAgICBpLmltYWdlTWFuYWdlci5hZGRJbWFnZShyLCBvW3JdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaS5pbWFnZU1hbmFnZXIuc2V0TG9hZGVkKCEwKSwgaS5fYXZhaWxhYmxlSW1hZ2VzID0gaS5pbWFnZU1hbmFnZXIubGlzdEltYWdlcygpLCBpLmRpc3BhdGNoZXIuYnJvYWRjYXN0KFwic2V0SW1hZ2VzXCIsIGkuX2F2YWlsYWJsZUltYWdlcyksIGkuZmlyZShuZXcgdC5FdmVudChcImRhdGFcIiwge1xuICAgICAgICAgICAgZGF0YVR5cGU6IFwic3R5bGVcIlxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5fdmFsaWRhdGVMYXllciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBpID0gdGhpcy5zb3VyY2VDYWNoZXNbZS5zb3VyY2VdO1xuXG4gICAgICAgIGlmIChpKSB7XG4gICAgICAgICAgdmFyIG8gPSBlLnNvdXJjZUxheWVyO1xuXG4gICAgICAgICAgaWYgKG8pIHtcbiAgICAgICAgICAgIHZhciByID0gaS5nZXRTb3VyY2UoKTtcbiAgICAgICAgICAgIChcImdlb2pzb25cIiA9PT0gci50eXBlIHx8IHIudmVjdG9yTGF5ZXJJZHMgJiYgLTEgPT09IHIudmVjdG9yTGF5ZXJJZHMuaW5kZXhPZihvKSkgJiYgdGhpcy5maXJlKG5ldyB0LkVycm9yRXZlbnQobmV3IEVycm9yKCdTb3VyY2UgbGF5ZXIgXCInICsgbyArICdcIiBkb2VzIG5vdCBleGlzdCBvbiBzb3VyY2UgXCInICsgci5pZCArICdcIiBhcyBzcGVjaWZpZWQgYnkgc3R5bGUgbGF5ZXIgXCInICsgZS5pZCArICdcIicpKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCBpLnByb3RvdHlwZS5sb2FkZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5fbG9hZGVkKSByZXR1cm4gITE7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl91cGRhdGVkU291cmNlcykubGVuZ3RoKSByZXR1cm4gITE7XG5cbiAgICAgICAgZm9yICh2YXIgdCBpbiB0aGlzLnNvdXJjZUNhY2hlcykge1xuICAgICAgICAgIGlmICghdGhpcy5zb3VyY2VDYWNoZXNbdF0ubG9hZGVkKCkpIHJldHVybiAhMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhIXRoaXMuaW1hZ2VNYW5hZ2VyLmlzTG9hZGVkKCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5fc2VyaWFsaXplTGF5ZXJzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgZm9yICh2YXIgZSA9IFtdLCBpID0gMCwgbyA9IHQ7IGkgPCBvLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgdmFyIHIgPSB0aGlzLl9sYXllcnNbb1tpXV07XG4gICAgICAgICAgXCJjdXN0b21cIiAhPT0gci50eXBlICYmIGUucHVzaChyLnNlcmlhbGl6ZSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSwgaS5wcm90b3R5cGUuaGFzVHJhbnNpdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmxpZ2h0ICYmIHRoaXMubGlnaHQuaGFzVHJhbnNpdGlvbigpKSByZXR1cm4gITA7XG5cbiAgICAgICAgZm9yICh2YXIgdCBpbiB0aGlzLnNvdXJjZUNhY2hlcykge1xuICAgICAgICAgIGlmICh0aGlzLnNvdXJjZUNhY2hlc1t0XS5oYXNUcmFuc2l0aW9uKCkpIHJldHVybiAhMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGUgaW4gdGhpcy5fbGF5ZXJzKSB7XG4gICAgICAgICAgaWYgKHRoaXMuX2xheWVyc1tlXS5oYXNUcmFuc2l0aW9uKCkpIHJldHVybiAhMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhMTtcbiAgICAgIH0sIGkucHJvdG90eXBlLl9jaGVja0xvYWRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9sb2FkZWQpIHRocm93IG5ldyBFcnJvcihcIlN0eWxlIGlzIG5vdCBkb25lIGxvYWRpbmdcIik7XG4gICAgICB9LCBpLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAodGhpcy5fbG9hZGVkKSB7XG4gICAgICAgICAgdmFyIGkgPSB0aGlzLl9jaGFuZ2VkO1xuXG4gICAgICAgICAgaWYgKHRoaXMuX2NoYW5nZWQpIHtcbiAgICAgICAgICAgIHZhciBvID0gT2JqZWN0LmtleXModGhpcy5fdXBkYXRlZExheWVycyksXG4gICAgICAgICAgICAgICAgciA9IE9iamVjdC5rZXlzKHRoaXMuX3JlbW92ZWRMYXllcnMpO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBhIGluIChvLmxlbmd0aCB8fCByLmxlbmd0aCkgJiYgdGhpcy5fdXBkYXRlV29ya2VyTGF5ZXJzKG8sIHIpLCB0aGlzLl91cGRhdGVkU291cmNlcykge1xuICAgICAgICAgICAgICB2YXIgbiA9IHRoaXMuX3VwZGF0ZWRTb3VyY2VzW2FdO1xuICAgICAgICAgICAgICBcInJlbG9hZFwiID09PSBuID8gdGhpcy5fcmVsb2FkU291cmNlKGEpIDogXCJjbGVhclwiID09PSBuICYmIHRoaXMuX2NsZWFyU291cmNlKGEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKHZhciBzIGluIHRoaXMuX3VwZGF0ZVRpbGVzRm9yQ2hhbmdlZEltYWdlcygpLCB0aGlzLl91cGRhdGVkUGFpbnRQcm9wcykge1xuICAgICAgICAgICAgICB0aGlzLl9sYXllcnNbc10udXBkYXRlVHJhbnNpdGlvbnMoZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMubGlnaHQudXBkYXRlVHJhbnNpdGlvbnMoZSksIHRoaXMuX3Jlc2V0VXBkYXRlcygpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBsID0ge307XG5cbiAgICAgICAgICBmb3IgKHZhciBjIGluIHRoaXMuc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICB2YXIgdSA9IHRoaXMuc291cmNlQ2FjaGVzW2NdO1xuICAgICAgICAgICAgbFtjXSA9IHUudXNlZCwgdS51c2VkID0gITE7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yICh2YXIgaCA9IDAsIHAgPSB0aGlzLl9vcmRlcjsgaCA8IHAubGVuZ3RoOyBoICs9IDEpIHtcbiAgICAgICAgICAgIHZhciBkID0gdGhpcy5fbGF5ZXJzW3BbaF1dO1xuICAgICAgICAgICAgZC5yZWNhbGN1bGF0ZShlLCB0aGlzLl9hdmFpbGFibGVJbWFnZXMpLCAhZC5pc0hpZGRlbihlLnpvb20pICYmIGQuc291cmNlICYmICh0aGlzLnNvdXJjZUNhY2hlc1tkLnNvdXJjZV0udXNlZCA9ICEwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKHZhciBfIGluIGwpIHtcbiAgICAgICAgICAgIHZhciBmID0gdGhpcy5zb3VyY2VDYWNoZXNbX107XG4gICAgICAgICAgICBsW19dICE9PSBmLnVzZWQgJiYgZi5maXJlKG5ldyB0LkV2ZW50KFwiZGF0YVwiLCB7XG4gICAgICAgICAgICAgIHNvdXJjZURhdGFUeXBlOiBcInZpc2liaWxpdHlcIixcbiAgICAgICAgICAgICAgZGF0YVR5cGU6IFwic291cmNlXCIsXG4gICAgICAgICAgICAgIHNvdXJjZUlkOiBfXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5saWdodC5yZWNhbGN1bGF0ZShlKSwgdGhpcy56ID0gZS56b29tLCBpICYmIHRoaXMuZmlyZShuZXcgdC5FdmVudChcImRhdGFcIiwge1xuICAgICAgICAgICAgZGF0YVR5cGU6IFwic3R5bGVcIlxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgfSwgaS5wcm90b3R5cGUuX3VwZGF0ZVRpbGVzRm9yQ2hhbmdlZEltYWdlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHQgPSBPYmplY3Qua2V5cyh0aGlzLl9jaGFuZ2VkSW1hZ2VzKTtcblxuICAgICAgICBpZiAodC5sZW5ndGgpIHtcbiAgICAgICAgICBmb3IgKHZhciBlIGluIHRoaXMuc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZUNhY2hlc1tlXS5yZWxvYWRUaWxlc0ZvckRlcGVuZGVuY2llcyhbXCJpY29uc1wiLCBcInBhdHRlcm5zXCJdLCB0KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLl9jaGFuZ2VkSW1hZ2VzID0ge307XG4gICAgICAgIH1cbiAgICAgIH0sIGkucHJvdG90eXBlLl91cGRhdGVXb3JrZXJMYXllcnMgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIuYnJvYWRjYXN0KFwidXBkYXRlTGF5ZXJzXCIsIHtcbiAgICAgICAgICBsYXllcnM6IHRoaXMuX3NlcmlhbGl6ZUxheWVycyh0KSxcbiAgICAgICAgICByZW1vdmVkSWRzOiBlXG4gICAgICAgIH0pO1xuICAgICAgfSwgaS5wcm90b3R5cGUuX3Jlc2V0VXBkYXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fY2hhbmdlZCA9ICExLCB0aGlzLl91cGRhdGVkTGF5ZXJzID0ge30sIHRoaXMuX3JlbW92ZWRMYXllcnMgPSB7fSwgdGhpcy5fdXBkYXRlZFNvdXJjZXMgPSB7fSwgdGhpcy5fdXBkYXRlZFBhaW50UHJvcHMgPSB7fSwgdGhpcy5fY2hhbmdlZEltYWdlcyA9IHt9O1xuICAgICAgfSwgaS5wcm90b3R5cGUuc2V0U3RhdGUgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgaSA9IHRoaXM7XG4gICAgICAgIGlmICh0aGlzLl9jaGVja0xvYWRlZCgpLCBVZSh0aGlzLCB0LnZhbGlkYXRlU3R5bGUoZSkpKSByZXR1cm4gITE7XG4gICAgICAgIChlID0gdC5jbG9uZSQxKGUpKS5sYXllcnMgPSBOdChlLmxheWVycyk7XG5cbiAgICAgICAgdmFyIG8gPSBmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgICAgIGlmICghZSkgcmV0dXJuIFt7XG4gICAgICAgICAgICBjb21tYW5kOiBadC5zZXRTdHlsZSxcbiAgICAgICAgICAgIGFyZ3M6IFtpXVxuICAgICAgICAgIH1dO1xuICAgICAgICAgIHZhciBvID0gW107XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCF0LmRlZXBFcXVhbChlLnZlcnNpb24sIGkudmVyc2lvbikpIHJldHVybiBbe1xuICAgICAgICAgICAgICBjb21tYW5kOiBadC5zZXRTdHlsZSxcbiAgICAgICAgICAgICAgYXJnczogW2ldXG4gICAgICAgICAgICB9XTtcbiAgICAgICAgICAgIHQuZGVlcEVxdWFsKGUuY2VudGVyLCBpLmNlbnRlcikgfHwgby5wdXNoKHtcbiAgICAgICAgICAgICAgY29tbWFuZDogWnQuc2V0Q2VudGVyLFxuICAgICAgICAgICAgICBhcmdzOiBbaS5jZW50ZXJdXG4gICAgICAgICAgICB9KSwgdC5kZWVwRXF1YWwoZS56b29tLCBpLnpvb20pIHx8IG8ucHVzaCh7XG4gICAgICAgICAgICAgIGNvbW1hbmQ6IFp0LnNldFpvb20sXG4gICAgICAgICAgICAgIGFyZ3M6IFtpLnpvb21dXG4gICAgICAgICAgICB9KSwgdC5kZWVwRXF1YWwoZS5iZWFyaW5nLCBpLmJlYXJpbmcpIHx8IG8ucHVzaCh7XG4gICAgICAgICAgICAgIGNvbW1hbmQ6IFp0LnNldEJlYXJpbmcsXG4gICAgICAgICAgICAgIGFyZ3M6IFtpLmJlYXJpbmddXG4gICAgICAgICAgICB9KSwgdC5kZWVwRXF1YWwoZS5waXRjaCwgaS5waXRjaCkgfHwgby5wdXNoKHtcbiAgICAgICAgICAgICAgY29tbWFuZDogWnQuc2V0UGl0Y2gsXG4gICAgICAgICAgICAgIGFyZ3M6IFtpLnBpdGNoXVxuICAgICAgICAgICAgfSksIHQuZGVlcEVxdWFsKGUuc3ByaXRlLCBpLnNwcml0ZSkgfHwgby5wdXNoKHtcbiAgICAgICAgICAgICAgY29tbWFuZDogWnQuc2V0U3ByaXRlLFxuICAgICAgICAgICAgICBhcmdzOiBbaS5zcHJpdGVdXG4gICAgICAgICAgICB9KSwgdC5kZWVwRXF1YWwoZS5nbHlwaHMsIGkuZ2x5cGhzKSB8fCBvLnB1c2goe1xuICAgICAgICAgICAgICBjb21tYW5kOiBadC5zZXRHbHlwaHMsXG4gICAgICAgICAgICAgIGFyZ3M6IFtpLmdseXBoc11cbiAgICAgICAgICAgIH0pLCB0LmRlZXBFcXVhbChlLnRyYW5zaXRpb24sIGkudHJhbnNpdGlvbikgfHwgby5wdXNoKHtcbiAgICAgICAgICAgICAgY29tbWFuZDogWnQuc2V0VHJhbnNpdGlvbixcbiAgICAgICAgICAgICAgYXJnczogW2kudHJhbnNpdGlvbl1cbiAgICAgICAgICAgIH0pLCB0LmRlZXBFcXVhbChlLmxpZ2h0LCBpLmxpZ2h0KSB8fCBvLnB1c2goe1xuICAgICAgICAgICAgICBjb21tYW5kOiBadC5zZXRMaWdodCxcbiAgICAgICAgICAgICAgYXJnczogW2kubGlnaHRdXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHZhciByID0ge30sXG4gICAgICAgICAgICAgICAgYSA9IFtdO1xuICAgICAgICAgICAgIWZ1bmN0aW9uIChlLCBpLCBvLCByKSB7XG4gICAgICAgICAgICAgIHZhciBhO1xuXG4gICAgICAgICAgICAgIGZvciAoYSBpbiBpID0gaSB8fCB7fSwgZSA9IGUgfHwge30pIHtcbiAgICAgICAgICAgICAgICBlLmhhc093blByb3BlcnR5KGEpICYmIChpLmhhc093blByb3BlcnR5KGEpIHx8IGp0KGEsIG8sIHIpKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGZvciAoYSBpbiBpKSB7XG4gICAgICAgICAgICAgICAgaS5oYXNPd25Qcm9wZXJ0eShhKSAmJiAoZS5oYXNPd25Qcm9wZXJ0eShhKSA/IHQuZGVlcEVxdWFsKGVbYV0sIGlbYV0pIHx8IChcImdlb2pzb25cIiA9PT0gZVthXS50eXBlICYmIFwiZ2VvanNvblwiID09PSBpW2FdLnR5cGUgJiYgR3QoZSwgaSwgYSkgPyBvLnB1c2goe1xuICAgICAgICAgICAgICAgICAgY29tbWFuZDogWnQuc2V0R2VvSlNPTlNvdXJjZURhdGEsXG4gICAgICAgICAgICAgICAgICBhcmdzOiBbYSwgaVthXS5kYXRhXVxuICAgICAgICAgICAgICAgIH0pIDogVnQoYSwgaSwgbywgcikpIDogcXQoYSwgaSwgbykpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KGUuc291cmNlcywgaS5zb3VyY2VzLCBhLCByKTtcbiAgICAgICAgICAgIHZhciBuID0gW107XG4gICAgICAgICAgICBlLmxheWVycyAmJiBlLmxheWVycy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgIHJbdC5zb3VyY2VdID8gby5wdXNoKHtcbiAgICAgICAgICAgICAgICBjb21tYW5kOiBadC5yZW1vdmVMYXllcixcbiAgICAgICAgICAgICAgICBhcmdzOiBbdC5pZF1cbiAgICAgICAgICAgICAgfSkgOiBuLnB1c2godCk7XG4gICAgICAgICAgICB9KSwgbyA9IG8uY29uY2F0KGEpLCBmdW5jdGlvbiAoZSwgaSwgbykge1xuICAgICAgICAgICAgICBpID0gaSB8fCBbXTtcblxuICAgICAgICAgICAgICB2YXIgcixcbiAgICAgICAgICAgICAgICAgIGEsXG4gICAgICAgICAgICAgICAgICBuLFxuICAgICAgICAgICAgICAgICAgcyxcbiAgICAgICAgICAgICAgICAgIGwsXG4gICAgICAgICAgICAgICAgICBjLFxuICAgICAgICAgICAgICAgICAgdSxcbiAgICAgICAgICAgICAgICAgIGggPSAoZSA9IGUgfHwgW10pLm1hcChYdCksXG4gICAgICAgICAgICAgICAgICBwID0gaS5tYXAoWHQpLFxuICAgICAgICAgICAgICAgICAgZCA9IGUucmVkdWNlKEh0LCB7fSksXG4gICAgICAgICAgICAgICAgICBfID0gaS5yZWR1Y2UoSHQsIHt9KSxcbiAgICAgICAgICAgICAgICAgIGYgPSBoLnNsaWNlKCksXG4gICAgICAgICAgICAgICAgICBtID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgICAgICAgICAgICBmb3IgKHIgPSAwLCBhID0gMDsgciA8IGgubGVuZ3RoOyByKyspIHtcbiAgICAgICAgICAgICAgICBfLmhhc093blByb3BlcnR5KG4gPSBoW3JdKSA/IGErKyA6IChvLnB1c2goe1xuICAgICAgICAgICAgICAgICAgY29tbWFuZDogWnQucmVtb3ZlTGF5ZXIsXG4gICAgICAgICAgICAgICAgICBhcmdzOiBbbl1cbiAgICAgICAgICAgICAgICB9KSwgZi5zcGxpY2UoZi5pbmRleE9mKG4sIGEpLCAxKSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBmb3IgKHIgPSAwLCBhID0gMDsgciA8IHAubGVuZ3RoOyByKyspIHtcbiAgICAgICAgICAgICAgICBmW2YubGVuZ3RoIC0gMSAtIHJdICE9PSAobiA9IHBbcC5sZW5ndGggLSAxIC0gcl0pICYmIChkLmhhc093blByb3BlcnR5KG4pID8gKG8ucHVzaCh7XG4gICAgICAgICAgICAgICAgICBjb21tYW5kOiBadC5yZW1vdmVMYXllcixcbiAgICAgICAgICAgICAgICAgIGFyZ3M6IFtuXVxuICAgICAgICAgICAgICAgIH0pLCBmLnNwbGljZShmLmxhc3RJbmRleE9mKG4sIGYubGVuZ3RoIC0gYSksIDEpKSA6IGErKywgby5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IFp0LmFkZExheWVyLFxuICAgICAgICAgICAgICAgICAgYXJnczogW19bbl0sIGMgPSBmW2YubGVuZ3RoIC0gcl1dXG4gICAgICAgICAgICAgICAgfSksIGYuc3BsaWNlKGYubGVuZ3RoIC0gciwgMCwgbiksIG1bbl0gPSAhMCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBmb3IgKHIgPSAwOyByIDwgcC5sZW5ndGg7IHIrKykge1xuICAgICAgICAgICAgICAgIGlmIChzID0gZFtuID0gcFtyXV0sIGwgPSBfW25dLCAhbVtuXSAmJiAhdC5kZWVwRXF1YWwocywgbCkpIGlmICh0LmRlZXBFcXVhbChzLnNvdXJjZSwgbC5zb3VyY2UpICYmIHQuZGVlcEVxdWFsKHNbXCJzb3VyY2UtbGF5ZXJcIl0sIGxbXCJzb3VyY2UtbGF5ZXJcIl0pICYmIHQuZGVlcEVxdWFsKHMudHlwZSwgbC50eXBlKSkge1xuICAgICAgICAgICAgICAgICAgZm9yICh1IGluIFd0KHMubGF5b3V0LCBsLmxheW91dCwgbywgbiwgbnVsbCwgWnQuc2V0TGF5b3V0UHJvcGVydHkpLCBXdChzLnBhaW50LCBsLnBhaW50LCBvLCBuLCBudWxsLCBadC5zZXRQYWludFByb3BlcnR5KSwgdC5kZWVwRXF1YWwocy5maWx0ZXIsIGwuZmlsdGVyKSB8fCBvLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBadC5zZXRGaWx0ZXIsXG4gICAgICAgICAgICAgICAgICAgIGFyZ3M6IFtuLCBsLmZpbHRlcl1cbiAgICAgICAgICAgICAgICAgIH0pLCB0LmRlZXBFcXVhbChzLm1pbnpvb20sIGwubWluem9vbSkgJiYgdC5kZWVwRXF1YWwocy5tYXh6b29tLCBsLm1heHpvb20pIHx8IG8ucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IFp0LnNldExheWVyWm9vbVJhbmdlLFxuICAgICAgICAgICAgICAgICAgICBhcmdzOiBbbiwgbC5taW56b29tLCBsLm1heHpvb21dXG4gICAgICAgICAgICAgICAgICB9KSwgcykge1xuICAgICAgICAgICAgICAgICAgICBzLmhhc093blByb3BlcnR5KHUpICYmIFwibGF5b3V0XCIgIT09IHUgJiYgXCJwYWludFwiICE9PSB1ICYmIFwiZmlsdGVyXCIgIT09IHUgJiYgXCJtZXRhZGF0YVwiICE9PSB1ICYmIFwibWluem9vbVwiICE9PSB1ICYmIFwibWF4em9vbVwiICE9PSB1ICYmICgwID09PSB1LmluZGV4T2YoXCJwYWludC5cIikgPyBXdChzW3VdLCBsW3VdLCBvLCBuLCB1LnNsaWNlKDYpLCBadC5zZXRQYWludFByb3BlcnR5KSA6IHQuZGVlcEVxdWFsKHNbdV0sIGxbdV0pIHx8IG8ucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogWnQuc2V0TGF5ZXJQcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBbbiwgdSwgbFt1XV1cbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBmb3IgKHUgaW4gbCkge1xuICAgICAgICAgICAgICAgICAgICBsLmhhc093blByb3BlcnR5KHUpICYmICFzLmhhc093blByb3BlcnR5KHUpICYmIFwibGF5b3V0XCIgIT09IHUgJiYgXCJwYWludFwiICE9PSB1ICYmIFwiZmlsdGVyXCIgIT09IHUgJiYgXCJtZXRhZGF0YVwiICE9PSB1ICYmIFwibWluem9vbVwiICE9PSB1ICYmIFwibWF4em9vbVwiICE9PSB1ICYmICgwID09PSB1LmluZGV4T2YoXCJwYWludC5cIikgPyBXdChzW3VdLCBsW3VdLCBvLCBuLCB1LnNsaWNlKDYpLCBadC5zZXRQYWludFByb3BlcnR5KSA6IHQuZGVlcEVxdWFsKHNbdV0sIGxbdV0pIHx8IG8ucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogWnQuc2V0TGF5ZXJQcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBbbiwgdSwgbFt1XV1cbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBvLnB1c2goe1xuICAgICAgICAgICAgICAgICAgY29tbWFuZDogWnQucmVtb3ZlTGF5ZXIsXG4gICAgICAgICAgICAgICAgICBhcmdzOiBbbl1cbiAgICAgICAgICAgICAgICB9KSwgYyA9IGZbZi5sYXN0SW5kZXhPZihuKSArIDFdLCBvLnB1c2goe1xuICAgICAgICAgICAgICAgICAgY29tbWFuZDogWnQuYWRkTGF5ZXIsXG4gICAgICAgICAgICAgICAgICBhcmdzOiBbbCwgY11cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfShuLCBpLmxheWVycywgbyk7XG4gICAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFwiVW5hYmxlIHRvIGNvbXB1dGUgc3R5bGUgZGlmZjpcIiwgdCksIG8gPSBbe1xuICAgICAgICAgICAgICBjb21tYW5kOiBadC5zZXRTdHlsZSxcbiAgICAgICAgICAgICAgYXJnczogW2ldXG4gICAgICAgICAgICB9XTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbztcbiAgICAgICAgfSh0aGlzLnNlcmlhbGl6ZSgpLCBlKS5maWx0ZXIoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICByZXR1cm4gISh0LmNvbW1hbmQgaW4gWmUpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoMCA9PT0gby5sZW5ndGgpIHJldHVybiAhMTtcbiAgICAgICAgdmFyIHIgPSBvLmZpbHRlcihmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHJldHVybiAhKHQuY29tbWFuZCBpbiBOZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoci5sZW5ndGggPiAwKSB0aHJvdyBuZXcgRXJyb3IoXCJVbmltcGxlbWVudGVkOiBcIiArIHIubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgcmV0dXJuIHQuY29tbWFuZDtcbiAgICAgICAgfSkuam9pbihcIiwgXCIpICsgXCIuXCIpO1xuICAgICAgICByZXR1cm4gby5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgXCJzZXRUcmFuc2l0aW9uXCIgIT09IHQuY29tbWFuZCAmJiBpW3QuY29tbWFuZF0uYXBwbHkoaSwgdC5hcmdzKTtcbiAgICAgICAgfSksIHRoaXMuc3R5bGVzaGVldCA9IGUsICEwO1xuICAgICAgfSwgaS5wcm90b3R5cGUuYWRkSW1hZ2UgPSBmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgICBpZiAodGhpcy5nZXRJbWFnZShlKSkgcmV0dXJuIHRoaXMuZmlyZShuZXcgdC5FcnJvckV2ZW50KG5ldyBFcnJvcihcIkFuIGltYWdlIHdpdGggdGhpcyBuYW1lIGFscmVhZHkgZXhpc3RzLlwiKSkpO1xuICAgICAgICB0aGlzLmltYWdlTWFuYWdlci5hZGRJbWFnZShlLCBpKSwgdGhpcy5fYWZ0ZXJJbWFnZVVwZGF0ZWQoZSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS51cGRhdGVJbWFnZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHRoaXMuaW1hZ2VNYW5hZ2VyLnVwZGF0ZUltYWdlKHQsIGUpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuZ2V0SW1hZ2UgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbWFnZU1hbmFnZXIuZ2V0SW1hZ2UodCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5yZW1vdmVJbWFnZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmICghdGhpcy5nZXRJbWFnZShlKSkgcmV0dXJuIHRoaXMuZmlyZShuZXcgdC5FcnJvckV2ZW50KG5ldyBFcnJvcihcIk5vIGltYWdlIHdpdGggdGhpcyBuYW1lIGV4aXN0cy5cIikpKTtcbiAgICAgICAgdGhpcy5pbWFnZU1hbmFnZXIucmVtb3ZlSW1hZ2UoZSksIHRoaXMuX2FmdGVySW1hZ2VVcGRhdGVkKGUpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuX2FmdGVySW1hZ2VVcGRhdGVkID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdGhpcy5fYXZhaWxhYmxlSW1hZ2VzID0gdGhpcy5pbWFnZU1hbmFnZXIubGlzdEltYWdlcygpLCB0aGlzLl9jaGFuZ2VkSW1hZ2VzW2VdID0gITAsIHRoaXMuX2NoYW5nZWQgPSAhMCwgdGhpcy5kaXNwYXRjaGVyLmJyb2FkY2FzdChcInNldEltYWdlc1wiLCB0aGlzLl9hdmFpbGFibGVJbWFnZXMpLCB0aGlzLmZpcmUobmV3IHQuRXZlbnQoXCJkYXRhXCIsIHtcbiAgICAgICAgICBkYXRhVHlwZTogXCJzdHlsZVwiXG4gICAgICAgIH0pKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmxpc3RJbWFnZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jaGVja0xvYWRlZCgpLCB0aGlzLmltYWdlTWFuYWdlci5saXN0SW1hZ2VzKCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5hZGRTb3VyY2UgPSBmdW5jdGlvbiAoZSwgaSwgbykge1xuICAgICAgICB2YXIgciA9IHRoaXM7XG4gICAgICAgIGlmICh2b2lkIDAgPT09IG8gJiYgKG8gPSB7fSksIHRoaXMuX2NoZWNrTG9hZGVkKCksIHZvaWQgMCAhPT0gdGhpcy5zb3VyY2VDYWNoZXNbZV0pIHRocm93IG5ldyBFcnJvcihcIlRoZXJlIGlzIGFscmVhZHkgYSBzb3VyY2Ugd2l0aCB0aGlzIElEXCIpO1xuICAgICAgICBpZiAoIWkudHlwZSkgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHR5cGUgcHJvcGVydHkgbXVzdCBiZSBkZWZpbmVkLCBidXQgb25seSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgd2VyZSBnaXZlbjogXCIgKyBPYmplY3Qua2V5cyhpKS5qb2luKFwiLCBcIikgKyBcIi5cIik7XG5cbiAgICAgICAgaWYgKCEoW1widmVjdG9yXCIsIFwicmFzdGVyXCIsIFwiZ2VvanNvblwiLCBcInZpZGVvXCIsIFwiaW1hZ2VcIl0uaW5kZXhPZihpLnR5cGUpID49IDAgJiYgdGhpcy5fdmFsaWRhdGUodC52YWxpZGF0ZVN0eWxlLnNvdXJjZSwgXCJzb3VyY2VzLlwiICsgZSwgaSwgbnVsbCwgbykpKSB7XG4gICAgICAgICAgdGhpcy5tYXAgJiYgdGhpcy5tYXAuX2NvbGxlY3RSZXNvdXJjZVRpbWluZyAmJiAoaS5jb2xsZWN0UmVzb3VyY2VUaW1pbmcgPSAhMCk7XG4gICAgICAgICAgdmFyIGEgPSB0aGlzLnNvdXJjZUNhY2hlc1tlXSA9IG5ldyBEdChlLCBpLCB0aGlzLmRpc3BhdGNoZXIpO1xuICAgICAgICAgIGEuc3R5bGUgPSB0aGlzLCBhLnNldEV2ZW50ZWRQYXJlbnQodGhpcywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgaXNTb3VyY2VMb2FkZWQ6IHIubG9hZGVkKCksXG4gICAgICAgICAgICAgIHNvdXJjZTogYS5zZXJpYWxpemUoKSxcbiAgICAgICAgICAgICAgc291cmNlSWQ6IGVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSksIGEub25BZGQodGhpcy5tYXApLCB0aGlzLl9jaGFuZ2VkID0gITA7XG4gICAgICAgIH1cbiAgICAgIH0sIGkucHJvdG90eXBlLnJlbW92ZVNvdXJjZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmICh0aGlzLl9jaGVja0xvYWRlZCgpLCB2b2lkIDAgPT09IHRoaXMuc291cmNlQ2FjaGVzW2VdKSB0aHJvdyBuZXcgRXJyb3IoXCJUaGVyZSBpcyBubyBzb3VyY2Ugd2l0aCB0aGlzIElEXCIpO1xuXG4gICAgICAgIGZvciAodmFyIGkgaW4gdGhpcy5fbGF5ZXJzKSB7XG4gICAgICAgICAgaWYgKHRoaXMuX2xheWVyc1tpXS5zb3VyY2UgPT09IGUpIHJldHVybiB0aGlzLmZpcmUobmV3IHQuRXJyb3JFdmVudChuZXcgRXJyb3IoJ1NvdXJjZSBcIicgKyBlICsgJ1wiIGNhbm5vdCBiZSByZW1vdmVkIHdoaWxlIGxheWVyIFwiJyArIGkgKyAnXCIgaXMgdXNpbmcgaXQuJykpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBvID0gdGhpcy5zb3VyY2VDYWNoZXNbZV07XG4gICAgICAgIGRlbGV0ZSB0aGlzLnNvdXJjZUNhY2hlc1tlXSwgZGVsZXRlIHRoaXMuX3VwZGF0ZWRTb3VyY2VzW2VdLCBvLmZpcmUobmV3IHQuRXZlbnQoXCJkYXRhXCIsIHtcbiAgICAgICAgICBzb3VyY2VEYXRhVHlwZTogXCJtZXRhZGF0YVwiLFxuICAgICAgICAgIGRhdGFUeXBlOiBcInNvdXJjZVwiLFxuICAgICAgICAgIHNvdXJjZUlkOiBlXG4gICAgICAgIH0pKSwgby5zZXRFdmVudGVkUGFyZW50KG51bGwpLCBvLmNsZWFyVGlsZXMoKSwgby5vblJlbW92ZSAmJiBvLm9uUmVtb3ZlKHRoaXMubWFwKSwgdGhpcy5fY2hhbmdlZCA9ICEwO1xuICAgICAgfSwgaS5wcm90b3R5cGUuc2V0R2VvSlNPTlNvdXJjZURhdGEgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICB0aGlzLl9jaGVja0xvYWRlZCgpLCB0aGlzLnNvdXJjZUNhY2hlc1t0XS5nZXRTb3VyY2UoKS5zZXREYXRhKGUpLCB0aGlzLl9jaGFuZ2VkID0gITA7XG4gICAgICB9LCBpLnByb3RvdHlwZS5nZXRTb3VyY2UgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2VDYWNoZXNbdF0gJiYgdGhpcy5zb3VyY2VDYWNoZXNbdF0uZ2V0U291cmNlKCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5hZGRMYXllciA9IGZ1bmN0aW9uIChlLCBpLCBvKSB7XG4gICAgICAgIHZvaWQgMCA9PT0gbyAmJiAobyA9IHt9KSwgdGhpcy5fY2hlY2tMb2FkZWQoKTtcbiAgICAgICAgdmFyIHIgPSBlLmlkO1xuICAgICAgICBpZiAodGhpcy5nZXRMYXllcihyKSkgdGhpcy5maXJlKG5ldyB0LkVycm9yRXZlbnQobmV3IEVycm9yKCdMYXllciB3aXRoIGlkIFwiJyArIHIgKyAnXCIgYWxyZWFkeSBleGlzdHMgb24gdGhpcyBtYXAnKSkpO2Vsc2Uge1xuICAgICAgICAgIHZhciBhO1xuXG4gICAgICAgICAgaWYgKFwiY3VzdG9tXCIgPT09IGUudHlwZSkge1xuICAgICAgICAgICAgaWYgKFVlKHRoaXMsIHQudmFsaWRhdGVDdXN0b21TdHlsZUxheWVyKGUpKSkgcmV0dXJuO1xuICAgICAgICAgICAgYSA9IHQuY3JlYXRlU3R5bGVMYXllcihlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKFwib2JqZWN0XCIgPT0gdHlwZW9mIGUuc291cmNlICYmICh0aGlzLmFkZFNvdXJjZShyLCBlLnNvdXJjZSksIGUgPSB0LmNsb25lJDEoZSksIGUgPSB0LmV4dGVuZChlLCB7XG4gICAgICAgICAgICAgIHNvdXJjZTogclxuICAgICAgICAgICAgfSkpLCB0aGlzLl92YWxpZGF0ZSh0LnZhbGlkYXRlU3R5bGUubGF5ZXIsIFwibGF5ZXJzLlwiICsgciwgZSwge1xuICAgICAgICAgICAgICBhcnJheUluZGV4OiAtMVxuICAgICAgICAgICAgfSwgbykpIHJldHVybjtcbiAgICAgICAgICAgIGEgPSB0LmNyZWF0ZVN0eWxlTGF5ZXIoZSksIHRoaXMuX3ZhbGlkYXRlTGF5ZXIoYSksIGEuc2V0RXZlbnRlZFBhcmVudCh0aGlzLCB7XG4gICAgICAgICAgICAgIGxheWVyOiB7XG4gICAgICAgICAgICAgICAgaWQ6IHJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksIHRoaXMuX3NlcmlhbGl6ZWRMYXllcnNbYS5pZF0gPSBhLnNlcmlhbGl6ZSgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBuID0gaSA/IHRoaXMuX29yZGVyLmluZGV4T2YoaSkgOiB0aGlzLl9vcmRlci5sZW5ndGg7XG4gICAgICAgICAgaWYgKGkgJiYgLTEgPT09IG4pIHRoaXMuZmlyZShuZXcgdC5FcnJvckV2ZW50KG5ldyBFcnJvcignTGF5ZXIgd2l0aCBpZCBcIicgKyBpICsgJ1wiIGRvZXMgbm90IGV4aXN0IG9uIHRoaXMgbWFwLicpKSk7ZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fb3JkZXIuc3BsaWNlKG4sIDAsIHIpLCB0aGlzLl9sYXllck9yZGVyQ2hhbmdlZCA9ICEwLCB0aGlzLl9sYXllcnNbcl0gPSBhLCB0aGlzLl9yZW1vdmVkTGF5ZXJzW3JdICYmIGEuc291cmNlICYmIFwiY3VzdG9tXCIgIT09IGEudHlwZSkge1xuICAgICAgICAgICAgICB2YXIgcyA9IHRoaXMuX3JlbW92ZWRMYXllcnNbcl07XG4gICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9yZW1vdmVkTGF5ZXJzW3JdLCBzLnR5cGUgIT09IGEudHlwZSA/IHRoaXMuX3VwZGF0ZWRTb3VyY2VzW2Euc291cmNlXSA9IFwiY2xlYXJcIiA6ICh0aGlzLl91cGRhdGVkU291cmNlc1thLnNvdXJjZV0gPSBcInJlbG9hZFwiLCB0aGlzLnNvdXJjZUNhY2hlc1thLnNvdXJjZV0ucGF1c2UoKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUxheWVyKGEpLCBhLm9uQWRkICYmIGEub25BZGQodGhpcy5tYXApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgaS5wcm90b3R5cGUubW92ZUxheWVyID0gZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NoZWNrTG9hZGVkKCksIHRoaXMuX2NoYW5nZWQgPSAhMCwgdGhpcy5fbGF5ZXJzW2VdKSB7XG4gICAgICAgICAgaWYgKGUgIT09IGkpIHtcbiAgICAgICAgICAgIHZhciBvID0gdGhpcy5fb3JkZXIuaW5kZXhPZihlKTtcblxuICAgICAgICAgICAgdGhpcy5fb3JkZXIuc3BsaWNlKG8sIDEpO1xuXG4gICAgICAgICAgICB2YXIgciA9IGkgPyB0aGlzLl9vcmRlci5pbmRleE9mKGkpIDogdGhpcy5fb3JkZXIubGVuZ3RoO1xuICAgICAgICAgICAgaSAmJiAtMSA9PT0gciA/IHRoaXMuZmlyZShuZXcgdC5FcnJvckV2ZW50KG5ldyBFcnJvcignTGF5ZXIgd2l0aCBpZCBcIicgKyBpICsgJ1wiIGRvZXMgbm90IGV4aXN0IG9uIHRoaXMgbWFwLicpKSkgOiAodGhpcy5fb3JkZXIuc3BsaWNlKHIsIDAsIGUpLCB0aGlzLl9sYXllck9yZGVyQ2hhbmdlZCA9ICEwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB0aGlzLmZpcmUobmV3IHQuRXJyb3JFdmVudChuZXcgRXJyb3IoXCJUaGUgbGF5ZXIgJ1wiICsgZSArIFwiJyBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWFwJ3Mgc3R5bGUgYW5kIGNhbm5vdCBiZSBtb3ZlZC5cIikpKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnJlbW92ZUxheWVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcblxuICAgICAgICB2YXIgaSA9IHRoaXMuX2xheWVyc1tlXTtcblxuICAgICAgICBpZiAoaSkge1xuICAgICAgICAgIGkuc2V0RXZlbnRlZFBhcmVudChudWxsKTtcblxuICAgICAgICAgIHZhciBvID0gdGhpcy5fb3JkZXIuaW5kZXhPZihlKTtcblxuICAgICAgICAgIHRoaXMuX29yZGVyLnNwbGljZShvLCAxKSwgdGhpcy5fbGF5ZXJPcmRlckNoYW5nZWQgPSAhMCwgdGhpcy5fY2hhbmdlZCA9ICEwLCB0aGlzLl9yZW1vdmVkTGF5ZXJzW2VdID0gaSwgZGVsZXRlIHRoaXMuX2xheWVyc1tlXSwgZGVsZXRlIHRoaXMuX3NlcmlhbGl6ZWRMYXllcnNbZV0sIGRlbGV0ZSB0aGlzLl91cGRhdGVkTGF5ZXJzW2VdLCBkZWxldGUgdGhpcy5fdXBkYXRlZFBhaW50UHJvcHNbZV0sIGkub25SZW1vdmUgJiYgaS5vblJlbW92ZSh0aGlzLm1hcCk7XG4gICAgICAgIH0gZWxzZSB0aGlzLmZpcmUobmV3IHQuRXJyb3JFdmVudChuZXcgRXJyb3IoXCJUaGUgbGF5ZXIgJ1wiICsgZSArIFwiJyBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWFwJ3Mgc3R5bGUgYW5kIGNhbm5vdCBiZSByZW1vdmVkLlwiKSkpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuZ2V0TGF5ZXIgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGF5ZXJzW3RdO1xuICAgICAgfSwgaS5wcm90b3R5cGUuaGFzTGF5ZXIgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdCBpbiB0aGlzLl9sYXllcnM7XG4gICAgICB9LCBpLnByb3RvdHlwZS5zZXRMYXllclpvb21SYW5nZSA9IGZ1bmN0aW9uIChlLCBpLCBvKSB7XG4gICAgICAgIHRoaXMuX2NoZWNrTG9hZGVkKCk7XG5cbiAgICAgICAgdmFyIHIgPSB0aGlzLmdldExheWVyKGUpO1xuICAgICAgICByID8gci5taW56b29tID09PSBpICYmIHIubWF4em9vbSA9PT0gbyB8fCAobnVsbCAhPSBpICYmIChyLm1pbnpvb20gPSBpKSwgbnVsbCAhPSBvICYmIChyLm1heHpvb20gPSBvKSwgdGhpcy5fdXBkYXRlTGF5ZXIocikpIDogdGhpcy5maXJlKG5ldyB0LkVycm9yRXZlbnQobmV3IEVycm9yKFwiVGhlIGxheWVyICdcIiArIGUgKyBcIicgZG9lcyBub3QgZXhpc3QgaW4gdGhlIG1hcCdzIHN0eWxlIGFuZCBjYW5ub3QgaGF2ZSB6b29tIGV4dGVudC5cIikpKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnNldEZpbHRlciA9IGZ1bmN0aW9uIChlLCBpLCBvKSB7XG4gICAgICAgIHZvaWQgMCA9PT0gbyAmJiAobyA9IHt9KSwgdGhpcy5fY2hlY2tMb2FkZWQoKTtcbiAgICAgICAgdmFyIHIgPSB0aGlzLmdldExheWVyKGUpO1xuXG4gICAgICAgIGlmIChyKSB7XG4gICAgICAgICAgaWYgKCF0LmRlZXBFcXVhbChyLmZpbHRlciwgaSkpIHJldHVybiBudWxsID09IGkgPyAoci5maWx0ZXIgPSB2b2lkIDAsIHZvaWQgdGhpcy5fdXBkYXRlTGF5ZXIocikpIDogdm9pZCAodGhpcy5fdmFsaWRhdGUodC52YWxpZGF0ZVN0eWxlLmZpbHRlciwgXCJsYXllcnMuXCIgKyByLmlkICsgXCIuZmlsdGVyXCIsIGksIG51bGwsIG8pIHx8IChyLmZpbHRlciA9IHQuY2xvbmUkMShpKSwgdGhpcy5fdXBkYXRlTGF5ZXIocikpKTtcbiAgICAgICAgfSBlbHNlIHRoaXMuZmlyZShuZXcgdC5FcnJvckV2ZW50KG5ldyBFcnJvcihcIlRoZSBsYXllciAnXCIgKyBlICsgXCInIGRvZXMgbm90IGV4aXN0IGluIHRoZSBtYXAncyBzdHlsZSBhbmQgY2Fubm90IGJlIGZpbHRlcmVkLlwiKSkpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuZ2V0RmlsdGVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIHQuY2xvbmUkMSh0aGlzLmdldExheWVyKGUpLmZpbHRlcik7XG4gICAgICB9LCBpLnByb3RvdHlwZS5zZXRMYXlvdXRQcm9wZXJ0eSA9IGZ1bmN0aW9uIChlLCBpLCBvLCByKSB7XG4gICAgICAgIHZvaWQgMCA9PT0gciAmJiAociA9IHt9KSwgdGhpcy5fY2hlY2tMb2FkZWQoKTtcbiAgICAgICAgdmFyIGEgPSB0aGlzLmdldExheWVyKGUpO1xuICAgICAgICBhID8gdC5kZWVwRXF1YWwoYS5nZXRMYXlvdXRQcm9wZXJ0eShpKSwgbykgfHwgKGEuc2V0TGF5b3V0UHJvcGVydHkoaSwgbywgciksIHRoaXMuX3VwZGF0ZUxheWVyKGEpKSA6IHRoaXMuZmlyZShuZXcgdC5FcnJvckV2ZW50KG5ldyBFcnJvcihcIlRoZSBsYXllciAnXCIgKyBlICsgXCInIGRvZXMgbm90IGV4aXN0IGluIHRoZSBtYXAncyBzdHlsZSBhbmQgY2Fubm90IGJlIHN0eWxlZC5cIikpKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmdldExheW91dFByb3BlcnR5ID0gZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgICAgdmFyIG8gPSB0aGlzLmdldExheWVyKGUpO1xuICAgICAgICBpZiAobykgcmV0dXJuIG8uZ2V0TGF5b3V0UHJvcGVydHkoaSk7XG4gICAgICAgIHRoaXMuZmlyZShuZXcgdC5FcnJvckV2ZW50KG5ldyBFcnJvcihcIlRoZSBsYXllciAnXCIgKyBlICsgXCInIGRvZXMgbm90IGV4aXN0IGluIHRoZSBtYXAncyBzdHlsZS5cIikpKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnNldFBhaW50UHJvcGVydHkgPSBmdW5jdGlvbiAoZSwgaSwgbywgcikge1xuICAgICAgICB2b2lkIDAgPT09IHIgJiYgKHIgPSB7fSksIHRoaXMuX2NoZWNrTG9hZGVkKCk7XG4gICAgICAgIHZhciBhID0gdGhpcy5nZXRMYXllcihlKTtcbiAgICAgICAgYSA/IHQuZGVlcEVxdWFsKGEuZ2V0UGFpbnRQcm9wZXJ0eShpKSwgbykgfHwgKGEuc2V0UGFpbnRQcm9wZXJ0eShpLCBvLCByKSAmJiB0aGlzLl91cGRhdGVMYXllcihhKSwgdGhpcy5fY2hhbmdlZCA9ICEwLCB0aGlzLl91cGRhdGVkUGFpbnRQcm9wc1tlXSA9ICEwKSA6IHRoaXMuZmlyZShuZXcgdC5FcnJvckV2ZW50KG5ldyBFcnJvcihcIlRoZSBsYXllciAnXCIgKyBlICsgXCInIGRvZXMgbm90IGV4aXN0IGluIHRoZSBtYXAncyBzdHlsZSBhbmQgY2Fubm90IGJlIHN0eWxlZC5cIikpKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmdldFBhaW50UHJvcGVydHkgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRMYXllcih0KS5nZXRQYWludFByb3BlcnR5KGUpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuc2V0RmVhdHVyZVN0YXRlID0gZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcblxuICAgICAgICB2YXIgbyA9IGUuc291cmNlLFxuICAgICAgICAgICAgciA9IGUuc291cmNlTGF5ZXIsXG4gICAgICAgICAgICBhID0gdGhpcy5zb3VyY2VDYWNoZXNbb107XG5cbiAgICAgICAgaWYgKHZvaWQgMCAhPT0gYSkge1xuICAgICAgICAgIHZhciBuID0gYS5nZXRTb3VyY2UoKS50eXBlO1xuICAgICAgICAgIFwiZ2VvanNvblwiID09PSBuICYmIHIgPyB0aGlzLmZpcmUobmV3IHQuRXJyb3JFdmVudChuZXcgRXJyb3IoXCJHZW9KU09OIHNvdXJjZXMgY2Fubm90IGhhdmUgYSBzb3VyY2VMYXllciBwYXJhbWV0ZXIuXCIpKSkgOiBcInZlY3RvclwiICE9PSBuIHx8IHIgPyAodm9pZCAwID09PSBlLmlkICYmIHRoaXMuZmlyZShuZXcgdC5FcnJvckV2ZW50KG5ldyBFcnJvcihcIlRoZSBmZWF0dXJlIGlkIHBhcmFtZXRlciBtdXN0IGJlIHByb3ZpZGVkLlwiKSkpLCBhLnNldEZlYXR1cmVTdGF0ZShyLCBlLmlkLCBpKSkgOiB0aGlzLmZpcmUobmV3IHQuRXJyb3JFdmVudChuZXcgRXJyb3IoXCJUaGUgc291cmNlTGF5ZXIgcGFyYW1ldGVyIG11c3QgYmUgcHJvdmlkZWQgZm9yIHZlY3RvciBzb3VyY2UgdHlwZXMuXCIpKSk7XG4gICAgICAgIH0gZWxzZSB0aGlzLmZpcmUobmV3IHQuRXJyb3JFdmVudChuZXcgRXJyb3IoXCJUaGUgc291cmNlICdcIiArIG8gKyBcIicgZG9lcyBub3QgZXhpc3QgaW4gdGhlIG1hcCdzIHN0eWxlLlwiKSkpO1xuICAgICAgfSwgaS5wcm90b3R5cGUucmVtb3ZlRmVhdHVyZVN0YXRlID0gZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcblxuICAgICAgICB2YXIgbyA9IGUuc291cmNlLFxuICAgICAgICAgICAgciA9IHRoaXMuc291cmNlQ2FjaGVzW29dO1xuXG4gICAgICAgIGlmICh2b2lkIDAgIT09IHIpIHtcbiAgICAgICAgICB2YXIgYSA9IHIuZ2V0U291cmNlKCkudHlwZSxcbiAgICAgICAgICAgICAgbiA9IFwidmVjdG9yXCIgPT09IGEgPyBlLnNvdXJjZUxheWVyIDogdm9pZCAwO1xuICAgICAgICAgIFwidmVjdG9yXCIgIT09IGEgfHwgbiA/IGkgJiYgXCJzdHJpbmdcIiAhPSB0eXBlb2YgZS5pZCAmJiBcIm51bWJlclwiICE9IHR5cGVvZiBlLmlkID8gdGhpcy5maXJlKG5ldyB0LkVycm9yRXZlbnQobmV3IEVycm9yKFwiQSBmZWF0dXJlIGlkIGlzIHJlcXVpcmVkIHRvIHJlbW92ZSBpdHMgc3BlY2lmaWMgc3RhdGUgcHJvcGVydHkuXCIpKSkgOiByLnJlbW92ZUZlYXR1cmVTdGF0ZShuLCBlLmlkLCBpKSA6IHRoaXMuZmlyZShuZXcgdC5FcnJvckV2ZW50KG5ldyBFcnJvcihcIlRoZSBzb3VyY2VMYXllciBwYXJhbWV0ZXIgbXVzdCBiZSBwcm92aWRlZCBmb3IgdmVjdG9yIHNvdXJjZSB0eXBlcy5cIikpKTtcbiAgICAgICAgfSBlbHNlIHRoaXMuZmlyZShuZXcgdC5FcnJvckV2ZW50KG5ldyBFcnJvcihcIlRoZSBzb3VyY2UgJ1wiICsgbyArIFwiJyBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWFwJ3Mgc3R5bGUuXCIpKSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5nZXRGZWF0dXJlU3RhdGUgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB0aGlzLl9jaGVja0xvYWRlZCgpO1xuXG4gICAgICAgIHZhciBpID0gZS5zb3VyY2UsXG4gICAgICAgICAgICBvID0gZS5zb3VyY2VMYXllcixcbiAgICAgICAgICAgIHIgPSB0aGlzLnNvdXJjZUNhY2hlc1tpXTtcblxuICAgICAgICBpZiAodm9pZCAwICE9PSByKSB7XG4gICAgICAgICAgaWYgKFwidmVjdG9yXCIgIT09IHIuZ2V0U291cmNlKCkudHlwZSB8fCBvKSByZXR1cm4gdm9pZCAwID09PSBlLmlkICYmIHRoaXMuZmlyZShuZXcgdC5FcnJvckV2ZW50KG5ldyBFcnJvcihcIlRoZSBmZWF0dXJlIGlkIHBhcmFtZXRlciBtdXN0IGJlIHByb3ZpZGVkLlwiKSkpLCByLmdldEZlYXR1cmVTdGF0ZShvLCBlLmlkKTtcbiAgICAgICAgICB0aGlzLmZpcmUobmV3IHQuRXJyb3JFdmVudChuZXcgRXJyb3IoXCJUaGUgc291cmNlTGF5ZXIgcGFyYW1ldGVyIG11c3QgYmUgcHJvdmlkZWQgZm9yIHZlY3RvciBzb3VyY2UgdHlwZXMuXCIpKSk7XG4gICAgICAgIH0gZWxzZSB0aGlzLmZpcmUobmV3IHQuRXJyb3JFdmVudChuZXcgRXJyb3IoXCJUaGUgc291cmNlICdcIiArIGkgKyBcIicgZG9lcyBub3QgZXhpc3QgaW4gdGhlIG1hcCdzIHN0eWxlLlwiKSkpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuZ2V0VHJhbnNpdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHQuZXh0ZW5kKHtcbiAgICAgICAgICBkdXJhdGlvbjogMzAwLFxuICAgICAgICAgIGRlbGF5OiAwXG4gICAgICAgIH0sIHRoaXMuc3R5bGVzaGVldCAmJiB0aGlzLnN0eWxlc2hlZXQudHJhbnNpdGlvbik7XG4gICAgICB9LCBpLnByb3RvdHlwZS5zZXJpYWxpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0LmZpbHRlck9iamVjdCh7XG4gICAgICAgICAgdmVyc2lvbjogdGhpcy5zdHlsZXNoZWV0LnZlcnNpb24sXG4gICAgICAgICAgbmFtZTogdGhpcy5zdHlsZXNoZWV0Lm5hbWUsXG4gICAgICAgICAgbWV0YWRhdGE6IHRoaXMuc3R5bGVzaGVldC5tZXRhZGF0YSxcbiAgICAgICAgICBsaWdodDogdGhpcy5zdHlsZXNoZWV0LmxpZ2h0LFxuICAgICAgICAgIGNlbnRlcjogdGhpcy5zdHlsZXNoZWV0LmNlbnRlcixcbiAgICAgICAgICB6b29tOiB0aGlzLnN0eWxlc2hlZXQuem9vbSxcbiAgICAgICAgICBiZWFyaW5nOiB0aGlzLnN0eWxlc2hlZXQuYmVhcmluZyxcbiAgICAgICAgICBwaXRjaDogdGhpcy5zdHlsZXNoZWV0LnBpdGNoLFxuICAgICAgICAgIHNwcml0ZTogdGhpcy5zdHlsZXNoZWV0LnNwcml0ZSxcbiAgICAgICAgICBnbHlwaHM6IHRoaXMuc3R5bGVzaGVldC5nbHlwaHMsXG4gICAgICAgICAgdHJhbnNpdGlvbjogdGhpcy5zdHlsZXNoZWV0LnRyYW5zaXRpb24sXG4gICAgICAgICAgc291cmNlczogdC5tYXBPYmplY3QodGhpcy5zb3VyY2VDYWNoZXMsIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICByZXR1cm4gdC5zZXJpYWxpemUoKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBsYXllcnM6IHRoaXMuX3NlcmlhbGl6ZUxheWVycyh0aGlzLl9vcmRlcilcbiAgICAgICAgfSwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICByZXR1cm4gdm9pZCAwICE9PSB0O1xuICAgICAgICB9KTtcbiAgICAgIH0sIGkucHJvdG90eXBlLl91cGRhdGVMYXllciA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZWRMYXllcnNbdC5pZF0gPSAhMCwgdC5zb3VyY2UgJiYgIXRoaXMuX3VwZGF0ZWRTb3VyY2VzW3Quc291cmNlXSAmJiBcInJhc3RlclwiICE9PSB0aGlzLnNvdXJjZUNhY2hlc1t0LnNvdXJjZV0uZ2V0U291cmNlKCkudHlwZSAmJiAodGhpcy5fdXBkYXRlZFNvdXJjZXNbdC5zb3VyY2VdID0gXCJyZWxvYWRcIiwgdGhpcy5zb3VyY2VDYWNoZXNbdC5zb3VyY2VdLnBhdXNlKCkpLCB0aGlzLl9jaGFuZ2VkID0gITA7XG4gICAgICB9LCBpLnByb3RvdHlwZS5fZmxhdHRlbkFuZFNvcnRSZW5kZXJlZEZlYXR1cmVzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgZm9yICh2YXIgZSA9IHRoaXMsIGkgPSBmdW5jdGlvbiBpKHQpIHtcbiAgICAgICAgICByZXR1cm4gXCJmaWxsLWV4dHJ1c2lvblwiID09PSBlLl9sYXllcnNbdF0udHlwZTtcbiAgICAgICAgfSwgbyA9IHt9LCByID0gW10sIGEgPSB0aGlzLl9vcmRlci5sZW5ndGggLSAxOyBhID49IDA7IGEtLSkge1xuICAgICAgICAgIHZhciBuID0gdGhpcy5fb3JkZXJbYV07XG5cbiAgICAgICAgICBpZiAoaShuKSkge1xuICAgICAgICAgICAgb1tuXSA9IGE7XG5cbiAgICAgICAgICAgIGZvciAodmFyIHMgPSAwLCBsID0gdDsgcyA8IGwubGVuZ3RoOyBzICs9IDEpIHtcbiAgICAgICAgICAgICAgdmFyIGMgPSBsW3NdW25dO1xuICAgICAgICAgICAgICBpZiAoYykgZm9yICh2YXIgdSA9IDAsIGggPSBjOyB1IDwgaC5sZW5ndGg7IHUgKz0gMSkge1xuICAgICAgICAgICAgICAgIHIucHVzaChoW3VdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHIuc29ydChmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgIHJldHVybiBlLmludGVyc2VjdGlvblogLSB0LmludGVyc2VjdGlvblo7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZvciAodmFyIHAgPSBbXSwgZCA9IHRoaXMuX29yZGVyLmxlbmd0aCAtIDE7IGQgPj0gMDsgZC0tKSB7XG4gICAgICAgICAgdmFyIF8gPSB0aGlzLl9vcmRlcltkXTtcbiAgICAgICAgICBpZiAoaShfKSkgZm9yICh2YXIgZiA9IHIubGVuZ3RoIC0gMTsgZiA+PSAwOyBmLS0pIHtcbiAgICAgICAgICAgIHZhciBtID0gcltmXS5mZWF0dXJlO1xuICAgICAgICAgICAgaWYgKG9bbS5sYXllci5pZF0gPCBkKSBicmVhaztcbiAgICAgICAgICAgIHAucHVzaChtKSwgci5wb3AoKTtcbiAgICAgICAgICB9IGVsc2UgZm9yICh2YXIgZyA9IDAsIHYgPSB0OyBnIDwgdi5sZW5ndGg7IGcgKz0gMSkge1xuICAgICAgICAgICAgdmFyIHkgPSB2W2ddW19dO1xuICAgICAgICAgICAgaWYgKHkpIGZvciAodmFyIHggPSAwLCBiID0geTsgeCA8IGIubGVuZ3RoOyB4ICs9IDEpIHtcbiAgICAgICAgICAgICAgcC5wdXNoKGJbeF0uZmVhdHVyZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHA7XG4gICAgICB9LCBpLnByb3RvdHlwZS5xdWVyeVJlbmRlcmVkRmVhdHVyZXMgPSBmdW5jdGlvbiAoZSwgaSwgbykge1xuICAgICAgICBpICYmIGkuZmlsdGVyICYmIHRoaXMuX3ZhbGlkYXRlKHQudmFsaWRhdGVTdHlsZS5maWx0ZXIsIFwicXVlcnlSZW5kZXJlZEZlYXR1cmVzLmZpbHRlclwiLCBpLmZpbHRlciwgbnVsbCwgaSk7XG4gICAgICAgIHZhciByID0ge307XG5cbiAgICAgICAgaWYgKGkgJiYgaS5sYXllcnMpIHtcbiAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoaS5sYXllcnMpKSByZXR1cm4gdGhpcy5maXJlKG5ldyB0LkVycm9yRXZlbnQobmV3IEVycm9yKFwicGFyYW1ldGVycy5sYXllcnMgbXVzdCBiZSBhbiBBcnJheS5cIikpKSwgW107XG5cbiAgICAgICAgICBmb3IgKHZhciBhID0gMCwgbiA9IGkubGF5ZXJzOyBhIDwgbi5sZW5ndGg7IGEgKz0gMSkge1xuICAgICAgICAgICAgdmFyIHMgPSBuW2FdLFxuICAgICAgICAgICAgICAgIGwgPSB0aGlzLl9sYXllcnNbc107XG4gICAgICAgICAgICBpZiAoIWwpIHJldHVybiB0aGlzLmZpcmUobmV3IHQuRXJyb3JFdmVudChuZXcgRXJyb3IoXCJUaGUgbGF5ZXIgJ1wiICsgcyArIFwiJyBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWFwJ3Mgc3R5bGUgYW5kIGNhbm5vdCBiZSBxdWVyaWVkIGZvciBmZWF0dXJlcy5cIikpKSwgW107XG4gICAgICAgICAgICByW2wuc291cmNlXSA9ICEwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjID0gW107XG5cbiAgICAgICAgZm9yICh2YXIgdSBpbiBpLmF2YWlsYWJsZUltYWdlcyA9IHRoaXMuX2F2YWlsYWJsZUltYWdlcywgdGhpcy5zb3VyY2VDYWNoZXMpIHtcbiAgICAgICAgICBpLmxheWVycyAmJiAhclt1XSB8fCBjLnB1c2goTyh0aGlzLnNvdXJjZUNhY2hlc1t1XSwgdGhpcy5fbGF5ZXJzLCB0aGlzLl9zZXJpYWxpemVkTGF5ZXJzLCBlLCBpLCBvKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5wbGFjZW1lbnQgJiYgYy5wdXNoKGZ1bmN0aW9uICh0LCBlLCBpLCBvLCByLCBhLCBuKSB7XG4gICAgICAgICAgZm9yICh2YXIgcyA9IHt9LCBsID0gYS5xdWVyeVJlbmRlcmVkU3ltYm9scyhvKSwgYyA9IFtdLCB1ID0gMCwgaCA9IE9iamVjdC5rZXlzKGwpLm1hcChOdW1iZXIpOyB1IDwgaC5sZW5ndGg7IHUgKz0gMSkge1xuICAgICAgICAgICAgYy5wdXNoKG5baFt1XV0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGMuc29ydChGKTtcblxuICAgICAgICAgIGZvciAodmFyIHAgPSBmdW5jdGlvbiBwKCkge1xuICAgICAgICAgICAgdmFyIGkgPSBfW2RdLFxuICAgICAgICAgICAgICAgIG8gPSBpLmZlYXR1cmVJbmRleC5sb29rdXBTeW1ib2xGZWF0dXJlcyhsW2kuYnVja2V0SW5zdGFuY2VJZF0sIGUsIGkuYnVja2V0SW5kZXgsIGkuc291cmNlTGF5ZXJJbmRleCwgci5maWx0ZXIsIHIubGF5ZXJzLCByLmF2YWlsYWJsZUltYWdlcywgdCk7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGEgaW4gbykge1xuICAgICAgICAgICAgICB2YXIgbiA9IHNbYV0gPSBzW2FdIHx8IFtdLFxuICAgICAgICAgICAgICAgICAgYyA9IG9bYV07XG4gICAgICAgICAgICAgIGMuc29ydChmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgICAgICAgIHZhciBvID0gaS5mZWF0dXJlU29ydE9yZGVyO1xuXG4gICAgICAgICAgICAgICAgaWYgKG8pIHtcbiAgICAgICAgICAgICAgICAgIHZhciByID0gby5pbmRleE9mKHQuZmVhdHVyZUluZGV4KTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBvLmluZGV4T2YoZS5mZWF0dXJlSW5kZXgpIC0gcjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZS5mZWF0dXJlSW5kZXggLSB0LmZlYXR1cmVJbmRleDtcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgZm9yICh2YXIgdSA9IDAsIGggPSBjOyB1IDwgaC5sZW5ndGg7IHUgKz0gMSkge1xuICAgICAgICAgICAgICAgIG4ucHVzaChoW3VdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIGQgPSAwLCBfID0gYzsgZCA8IF8ubGVuZ3RoOyBkICs9IDEpIHtcbiAgICAgICAgICAgIHAoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgZiA9IGZ1bmN0aW9uIGYoZSkge1xuICAgICAgICAgICAgc1tlXS5mb3JFYWNoKGZ1bmN0aW9uIChvKSB7XG4gICAgICAgICAgICAgIHZhciByID0gby5mZWF0dXJlLFxuICAgICAgICAgICAgICAgICAgYSA9IGlbdFtlXS5zb3VyY2VdLmdldEZlYXR1cmVTdGF0ZShyLmxheWVyW1wic291cmNlLWxheWVyXCJdLCByLmlkKTtcbiAgICAgICAgICAgICAgci5zb3VyY2UgPSByLmxheWVyLnNvdXJjZSwgci5sYXllcltcInNvdXJjZS1sYXllclwiXSAmJiAoci5zb3VyY2VMYXllciA9IHIubGF5ZXJbXCJzb3VyY2UtbGF5ZXJcIl0pLCByLnN0YXRlID0gYTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBmb3IgKHZhciBtIGluIHMpIHtcbiAgICAgICAgICAgIGYobSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHM7XG4gICAgICAgIH0odGhpcy5fbGF5ZXJzLCB0aGlzLl9zZXJpYWxpemVkTGF5ZXJzLCB0aGlzLnNvdXJjZUNhY2hlcywgZSwgaSwgdGhpcy5wbGFjZW1lbnQuY29sbGlzaW9uSW5kZXgsIHRoaXMucGxhY2VtZW50LnJldGFpbmVkUXVlcnlEYXRhKSksIHRoaXMuX2ZsYXR0ZW5BbmRTb3J0UmVuZGVyZWRGZWF0dXJlcyhjKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnF1ZXJ5U291cmNlRmVhdHVyZXMgPSBmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgICBpICYmIGkuZmlsdGVyICYmIHRoaXMuX3ZhbGlkYXRlKHQudmFsaWRhdGVTdHlsZS5maWx0ZXIsIFwicXVlcnlTb3VyY2VGZWF0dXJlcy5maWx0ZXJcIiwgaS5maWx0ZXIsIG51bGwsIGkpO1xuICAgICAgICB2YXIgbyA9IHRoaXMuc291cmNlQ2FjaGVzW2VdO1xuICAgICAgICByZXR1cm4gbyA/IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IHQuZ2V0UmVuZGVyYWJsZUlkcygpLm1hcChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIHQuZ2V0VGlsZUJ5SUQoZSk7XG4gICAgICAgICAgfSksIG8gPSBbXSwgciA9IHt9LCBhID0gMDsgYSA8IGkubGVuZ3RoOyBhKyspIHtcbiAgICAgICAgICAgIHZhciBuID0gaVthXSxcbiAgICAgICAgICAgICAgICBzID0gbi50aWxlSUQuY2Fub25pY2FsLmtleTtcbiAgICAgICAgICAgIHJbc10gfHwgKHJbc10gPSAhMCwgbi5xdWVyeVNvdXJjZUZlYXR1cmVzKG8sIGUpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbztcbiAgICAgICAgfShvLCBpKSA6IFtdO1xuICAgICAgfSwgaS5wcm90b3R5cGUuYWRkU291cmNlVHlwZSA9IGZ1bmN0aW9uICh0LCBlLCBvKSB7XG4gICAgICAgIHJldHVybiBpLmdldFNvdXJjZVR5cGUodCkgPyBvKG5ldyBFcnJvcignQSBzb3VyY2UgdHlwZSBjYWxsZWQgXCInICsgdCArICdcIiBhbHJlYWR5IGV4aXN0cy4nKSkgOiAoaS5zZXRTb3VyY2VUeXBlKHQsIGUpLCBlLndvcmtlclNvdXJjZVVSTCA/IHZvaWQgdGhpcy5kaXNwYXRjaGVyLmJyb2FkY2FzdChcImxvYWRXb3JrZXJTb3VyY2VcIiwge1xuICAgICAgICAgIG5hbWU6IHQsXG4gICAgICAgICAgdXJsOiBlLndvcmtlclNvdXJjZVVSTFxuICAgICAgICB9LCBvKSA6IG8obnVsbCwgbnVsbCkpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuZ2V0TGlnaHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpZ2h0LmdldExpZ2h0KCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5zZXRMaWdodCA9IGZ1bmN0aW9uIChlLCBpKSB7XG4gICAgICAgIHZvaWQgMCA9PT0gaSAmJiAoaSA9IHt9KSwgdGhpcy5fY2hlY2tMb2FkZWQoKTtcbiAgICAgICAgdmFyIG8gPSB0aGlzLmxpZ2h0LmdldExpZ2h0KCksXG4gICAgICAgICAgICByID0gITE7XG5cbiAgICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgICAgaWYgKCF0LmRlZXBFcXVhbChlW2FdLCBvW2FdKSkge1xuICAgICAgICAgICAgciA9ICEwO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHIpIHtcbiAgICAgICAgICB2YXIgbiA9IHtcbiAgICAgICAgICAgIG5vdzogdC5icm93c2VyLm5vdygpLFxuICAgICAgICAgICAgdHJhbnNpdGlvbjogdC5leHRlbmQoe1xuICAgICAgICAgICAgICBkdXJhdGlvbjogMzAwLFxuICAgICAgICAgICAgICBkZWxheTogMFxuICAgICAgICAgICAgfSwgdGhpcy5zdHlsZXNoZWV0LnRyYW5zaXRpb24pXG4gICAgICAgICAgfTtcbiAgICAgICAgICB0aGlzLmxpZ2h0LnNldExpZ2h0KGUsIGkpLCB0aGlzLmxpZ2h0LnVwZGF0ZVRyYW5zaXRpb25zKG4pO1xuICAgICAgICB9XG4gICAgICB9LCBpLnByb3RvdHlwZS5fdmFsaWRhdGUgPSBmdW5jdGlvbiAoZSwgaSwgbywgciwgYSkge1xuICAgICAgICByZXR1cm4gdm9pZCAwID09PSBhICYmIChhID0ge30pLCAoIWEgfHwgITEgIT09IGEudmFsaWRhdGUpICYmIFVlKHRoaXMsIGUuY2FsbCh0LnZhbGlkYXRlU3R5bGUsIHQuZXh0ZW5kKHtcbiAgICAgICAgICBrZXk6IGksXG4gICAgICAgICAgc3R5bGU6IHRoaXMuc2VyaWFsaXplKCksXG4gICAgICAgICAgdmFsdWU6IG8sXG4gICAgICAgICAgc3R5bGVTcGVjOiB0LnN0eWxlU3BlY1xuICAgICAgICB9LCByKSkpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuX3JlbW92ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm9yICh2YXIgZSBpbiB0aGlzLl9yZXF1ZXN0ICYmICh0aGlzLl9yZXF1ZXN0LmNhbmNlbCgpLCB0aGlzLl9yZXF1ZXN0ID0gbnVsbCksIHRoaXMuX3Nwcml0ZVJlcXVlc3QgJiYgKHRoaXMuX3Nwcml0ZVJlcXVlc3QuY2FuY2VsKCksIHRoaXMuX3Nwcml0ZVJlcXVlc3QgPSBudWxsKSwgdC5ldmVudGVkLm9mZihcInBsdWdpblN0YXRlQ2hhbmdlXCIsIHRoaXMuX3J0bFRleHRQbHVnaW5DYWxsYmFjayksIHRoaXMuX2xheWVycykge1xuICAgICAgICAgIHRoaXMuX2xheWVyc1tlXS5zZXRFdmVudGVkUGFyZW50KG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgaSBpbiB0aGlzLnNvdXJjZUNhY2hlcykge1xuICAgICAgICAgIHRoaXMuc291cmNlQ2FjaGVzW2ldLmNsZWFyVGlsZXMoKSwgdGhpcy5zb3VyY2VDYWNoZXNbaV0uc2V0RXZlbnRlZFBhcmVudChudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW1hZ2VNYW5hZ2VyLnNldEV2ZW50ZWRQYXJlbnQobnVsbCksIHRoaXMuc2V0RXZlbnRlZFBhcmVudChudWxsKSwgdGhpcy5kaXNwYXRjaGVyLnJlbW92ZSgpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuX2NsZWFyU291cmNlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdGhpcy5zb3VyY2VDYWNoZXNbdF0uY2xlYXJUaWxlcygpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuX3JlbG9hZFNvdXJjZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHRoaXMuc291cmNlQ2FjaGVzW3RdLnJlc3VtZSgpLCB0aGlzLnNvdXJjZUNhY2hlc1t0XS5yZWxvYWQoKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLl91cGRhdGVTb3VyY2VzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgZm9yICh2YXIgZSBpbiB0aGlzLnNvdXJjZUNhY2hlcykge1xuICAgICAgICAgIHRoaXMuc291cmNlQ2FjaGVzW2VdLnVwZGF0ZSh0KTtcbiAgICAgICAgfVxuICAgICAgfSwgaS5wcm90b3R5cGUuX2dlbmVyYXRlQ29sbGlzaW9uQm94ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvciAodmFyIHQgaW4gdGhpcy5zb3VyY2VDYWNoZXMpIHtcbiAgICAgICAgICB0aGlzLl9yZWxvYWRTb3VyY2UodCk7XG4gICAgICAgIH1cbiAgICAgIH0sIGkucHJvdG90eXBlLl91cGRhdGVQbGFjZW1lbnQgPSBmdW5jdGlvbiAoZSwgaSwgbywgciwgYSkge1xuICAgICAgICB2b2lkIDAgPT09IGEgJiYgKGEgPSAhMSk7XG5cbiAgICAgICAgZm9yICh2YXIgbiA9ICExLCBzID0gITEsIGwgPSB7fSwgYyA9IDAsIHUgPSB0aGlzLl9vcmRlcjsgYyA8IHUubGVuZ3RoOyBjICs9IDEpIHtcbiAgICAgICAgICB2YXIgaCA9IHRoaXMuX2xheWVyc1t1W2NdXTtcblxuICAgICAgICAgIGlmIChcInN5bWJvbFwiID09PSBoLnR5cGUpIHtcbiAgICAgICAgICAgIGlmICghbFtoLnNvdXJjZV0pIHtcbiAgICAgICAgICAgICAgdmFyIHAgPSB0aGlzLnNvdXJjZUNhY2hlc1toLnNvdXJjZV07XG4gICAgICAgICAgICAgIGxbaC5zb3VyY2VdID0gcC5nZXRSZW5kZXJhYmxlSWRzKCEwKS5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcC5nZXRUaWxlQnlJRCh0KTtcbiAgICAgICAgICAgICAgfSkuc29ydChmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLnRpbGVJRC5vdmVyc2NhbGVkWiAtIHQudGlsZUlELm92ZXJzY2FsZWRaIHx8ICh0LnRpbGVJRC5pc0xlc3NUaGFuKGUudGlsZUlEKSA/IC0xIDogMSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgZCA9IHRoaXMuY3Jvc3NUaWxlU3ltYm9sSW5kZXguYWRkTGF5ZXIoaCwgbFtoLnNvdXJjZV0sIGUuY2VudGVyLmxuZyk7XG4gICAgICAgICAgICBuID0gbiB8fCBkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNyb3NzVGlsZVN5bWJvbEluZGV4LnBydW5lVW51c2VkTGF5ZXJzKHRoaXMuX29yZGVyKSwgKChhID0gYSB8fCB0aGlzLl9sYXllck9yZGVyQ2hhbmdlZCB8fCAwID09PSBvKSB8fCAhdGhpcy5wYXVzZWFibGVQbGFjZW1lbnQgfHwgdGhpcy5wYXVzZWFibGVQbGFjZW1lbnQuaXNEb25lKCkgJiYgIXRoaXMucGxhY2VtZW50LnN0aWxsUmVjZW50KHQuYnJvd3Nlci5ub3coKSwgZS56b29tKSkgJiYgKHRoaXMucGF1c2VhYmxlUGxhY2VtZW50ID0gbmV3IExlKGUsIHRoaXMuX29yZGVyLCBhLCBpLCBvLCByLCB0aGlzLnBsYWNlbWVudCksIHRoaXMuX2xheWVyT3JkZXJDaGFuZ2VkID0gITEpLCB0aGlzLnBhdXNlYWJsZVBsYWNlbWVudC5pc0RvbmUoKSA/IHRoaXMucGxhY2VtZW50LnNldFN0YWxlKCkgOiAodGhpcy5wYXVzZWFibGVQbGFjZW1lbnQuY29udGludWVQbGFjZW1lbnQodGhpcy5fb3JkZXIsIHRoaXMuX2xheWVycywgbCksIHRoaXMucGF1c2VhYmxlUGxhY2VtZW50LmlzRG9uZSgpICYmICh0aGlzLnBsYWNlbWVudCA9IHRoaXMucGF1c2VhYmxlUGxhY2VtZW50LmNvbW1pdCh0LmJyb3dzZXIubm93KCkpLCBzID0gITApLCBuICYmIHRoaXMucGF1c2VhYmxlUGxhY2VtZW50LnBsYWNlbWVudC5zZXRTdGFsZSgpKSwgcyB8fCBuKSBmb3IgKHZhciBfID0gMCwgZiA9IHRoaXMuX29yZGVyOyBfIDwgZi5sZW5ndGg7IF8gKz0gMSkge1xuICAgICAgICAgIHZhciBtID0gdGhpcy5fbGF5ZXJzW2ZbX11dO1xuICAgICAgICAgIFwic3ltYm9sXCIgPT09IG0udHlwZSAmJiB0aGlzLnBsYWNlbWVudC51cGRhdGVMYXllck9wYWNpdGllcyhtLCBsW20uc291cmNlXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICF0aGlzLnBhdXNlYWJsZVBsYWNlbWVudC5pc0RvbmUoKSB8fCB0aGlzLnBsYWNlbWVudC5oYXNUcmFuc2l0aW9ucyh0LmJyb3dzZXIubm93KCkpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuX3JlbGVhc2VTeW1ib2xGYWRlVGlsZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvciAodmFyIHQgaW4gdGhpcy5zb3VyY2VDYWNoZXMpIHtcbiAgICAgICAgICB0aGlzLnNvdXJjZUNhY2hlc1t0XS5yZWxlYXNlU3ltYm9sRmFkZVRpbGVzKCk7XG4gICAgICAgIH1cbiAgICAgIH0sIGkucHJvdG90eXBlLmdldEltYWdlcyA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICAgIHRoaXMuaW1hZ2VNYW5hZ2VyLmdldEltYWdlcyhlLmljb25zLCBpKSwgdGhpcy5fdXBkYXRlVGlsZXNGb3JDaGFuZ2VkSW1hZ2VzKCk7XG4gICAgICAgIHZhciBvID0gdGhpcy5zb3VyY2VDYWNoZXNbZS5zb3VyY2VdO1xuICAgICAgICBvICYmIG8uc2V0RGVwZW5kZW5jaWVzKGUudGlsZUlELmtleSwgZS50eXBlLCBlLmljb25zKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmdldEdseXBocyA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICAgIHRoaXMuZ2x5cGhNYW5hZ2VyLmdldEdseXBocyhlLnN0YWNrcywgaSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5nZXRSZXNvdXJjZSA9IGZ1bmN0aW9uIChlLCBpLCBvKSB7XG4gICAgICAgIHJldHVybiB0Lm1ha2VSZXF1ZXN0KGksIG8pO1xuICAgICAgfSwgaTtcbiAgICB9KHQuRXZlbnRlZCk7XG5cbiAgICBqZS5nZXRTb3VyY2VUeXBlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiBrW3RdO1xuICAgIH0sIGplLnNldFNvdXJjZVR5cGUgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAga1t0XSA9IGU7XG4gICAgfSwgamUucmVnaXN0ZXJGb3JQbHVnaW5TdGF0ZUNoYW5nZSA9IHQucmVnaXN0ZXJGb3JQbHVnaW5TdGF0ZUNoYW5nZTtcblxuICAgIHZhciBWZSA9IHQuY3JlYXRlTGF5b3V0KFt7XG4gICAgICBuYW1lOiBcImFfcG9zXCIsXG4gICAgICB0eXBlOiBcIkludDE2XCIsXG4gICAgICBjb21wb25lbnRzOiAyXG4gICAgfV0pLFxuICAgICAgICBHZSA9IGdpKFwiI2lmZGVmIEdMX0VTXFxucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XFxuI2Vsc2VcXG4jaWYgIWRlZmluZWQobG93cClcXG4jZGVmaW5lIGxvd3BcXG4jZW5kaWZcXG4jaWYgIWRlZmluZWQobWVkaXVtcClcXG4jZGVmaW5lIG1lZGl1bXBcXG4jZW5kaWZcXG4jaWYgIWRlZmluZWQoaGlnaHApXFxuI2RlZmluZSBoaWdocFxcbiNlbmRpZlxcbiNlbmRpZlwiLCBcIiNpZmRlZiBHTF9FU1xcbnByZWNpc2lvbiBoaWdocCBmbG9hdDtcXG4jZWxzZVxcbiNpZiAhZGVmaW5lZChsb3dwKVxcbiNkZWZpbmUgbG93cFxcbiNlbmRpZlxcbiNpZiAhZGVmaW5lZChtZWRpdW1wKVxcbiNkZWZpbmUgbWVkaXVtcFxcbiNlbmRpZlxcbiNpZiAhZGVmaW5lZChoaWdocClcXG4jZGVmaW5lIGhpZ2hwXFxuI2VuZGlmXFxuI2VuZGlmXFxudmVjMiB1bnBhY2tfZmxvYXQoY29uc3QgZmxvYXQgcGFja2VkVmFsdWUpIHtpbnQgcGFja2VkSW50VmFsdWU9aW50KHBhY2tlZFZhbHVlKTtpbnQgdjA9cGFja2VkSW50VmFsdWUvMjU2O3JldHVybiB2ZWMyKHYwLHBhY2tlZEludFZhbHVlLXYwKjI1Nik7fXZlYzIgdW5wYWNrX29wYWNpdHkoY29uc3QgZmxvYXQgcGFja2VkT3BhY2l0eSkge2ludCBpbnRPcGFjaXR5PWludChwYWNrZWRPcGFjaXR5KS8yO3JldHVybiB2ZWMyKGZsb2F0KGludE9wYWNpdHkpLzEyNy4wLG1vZChwYWNrZWRPcGFjaXR5LDIuMCkpO312ZWM0IGRlY29kZV9jb2xvcihjb25zdCB2ZWMyIGVuY29kZWRDb2xvcikge3JldHVybiB2ZWM0KHVucGFja19mbG9hdChlbmNvZGVkQ29sb3JbMF0pLzI1NS4wLHVucGFja19mbG9hdChlbmNvZGVkQ29sb3JbMV0pLzI1NS4wXFxuKTt9ZmxvYXQgdW5wYWNrX21peF92ZWMyKGNvbnN0IHZlYzIgcGFja2VkVmFsdWUsY29uc3QgZmxvYXQgdCkge3JldHVybiBtaXgocGFja2VkVmFsdWVbMF0scGFja2VkVmFsdWVbMV0sdCk7fXZlYzQgdW5wYWNrX21peF9jb2xvcihjb25zdCB2ZWM0IHBhY2tlZENvbG9ycyxjb25zdCBmbG9hdCB0KSB7dmVjNCBtaW5Db2xvcj1kZWNvZGVfY29sb3IodmVjMihwYWNrZWRDb2xvcnNbMF0scGFja2VkQ29sb3JzWzFdKSk7dmVjNCBtYXhDb2xvcj1kZWNvZGVfY29sb3IodmVjMihwYWNrZWRDb2xvcnNbMl0scGFja2VkQ29sb3JzWzNdKSk7cmV0dXJuIG1peChtaW5Db2xvcixtYXhDb2xvcix0KTt9dmVjMiBnZXRfcGF0dGVybl9wb3MoY29uc3QgdmVjMiBwaXhlbF9jb29yZF91cHBlcixjb25zdCB2ZWMyIHBpeGVsX2Nvb3JkX2xvd2VyLGNvbnN0IHZlYzIgcGF0dGVybl9zaXplLGNvbnN0IGZsb2F0IHRpbGVfdW5pdHNfdG9fcGl4ZWxzLGNvbnN0IHZlYzIgcG9zKSB7dmVjMiBvZmZzZXQ9bW9kKG1vZChtb2QocGl4ZWxfY29vcmRfdXBwZXIscGF0dGVybl9zaXplKSoyNTYuMCxwYXR0ZXJuX3NpemUpKjI1Ni4wK3BpeGVsX2Nvb3JkX2xvd2VyLHBhdHRlcm5fc2l6ZSk7cmV0dXJuICh0aWxlX3VuaXRzX3RvX3BpeGVscypwb3Mrb2Zmc2V0KS9wYXR0ZXJuX3NpemU7fVwiKSxcbiAgICAgICAgV2UgPSBnaShcInVuaWZvcm0gdmVjNCB1X2NvbG9yO3VuaWZvcm0gZmxvYXQgdV9vcGFjaXR5O3ZvaWQgbWFpbigpIHtnbF9GcmFnQ29sb3I9dV9jb2xvcip1X29wYWNpdHk7XFxuI2lmZGVmIE9WRVJEUkFXX0lOU1BFQ1RPUlxcbmdsX0ZyYWdDb2xvcj12ZWM0KDEuMCk7XFxuI2VuZGlmXFxufVwiLCBcImF0dHJpYnV0ZSB2ZWMyIGFfcG9zO3VuaWZvcm0gbWF0NCB1X21hdHJpeDt2b2lkIG1haW4oKSB7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcywwLDEpO31cIiksXG4gICAgICAgIFhlID0gZ2koXCJ1bmlmb3JtIHZlYzIgdV9wYXR0ZXJuX3RsX2E7dW5pZm9ybSB2ZWMyIHVfcGF0dGVybl9icl9hO3VuaWZvcm0gdmVjMiB1X3BhdHRlcm5fdGxfYjt1bmlmb3JtIHZlYzIgdV9wYXR0ZXJuX2JyX2I7dW5pZm9ybSB2ZWMyIHVfdGV4c2l6ZTt1bmlmb3JtIGZsb2F0IHVfbWl4O3VuaWZvcm0gZmxvYXQgdV9vcGFjaXR5O3VuaWZvcm0gc2FtcGxlcjJEIHVfaW1hZ2U7dmFyeWluZyB2ZWMyIHZfcG9zX2E7dmFyeWluZyB2ZWMyIHZfcG9zX2I7dm9pZCBtYWluKCkge3ZlYzIgaW1hZ2Vjb29yZD1tb2Qodl9wb3NfYSwxLjApO3ZlYzIgcG9zPW1peCh1X3BhdHRlcm5fdGxfYS91X3RleHNpemUsdV9wYXR0ZXJuX2JyX2EvdV90ZXhzaXplLGltYWdlY29vcmQpO3ZlYzQgY29sb3IxPXRleHR1cmUyRCh1X2ltYWdlLHBvcyk7dmVjMiBpbWFnZWNvb3JkX2I9bW9kKHZfcG9zX2IsMS4wKTt2ZWMyIHBvczI9bWl4KHVfcGF0dGVybl90bF9iL3VfdGV4c2l6ZSx1X3BhdHRlcm5fYnJfYi91X3RleHNpemUsaW1hZ2Vjb29yZF9iKTt2ZWM0IGNvbG9yMj10ZXh0dXJlMkQodV9pbWFnZSxwb3MyKTtnbF9GcmFnQ29sb3I9bWl4KGNvbG9yMSxjb2xvcjIsdV9taXgpKnVfb3BhY2l0eTtcXG4jaWZkZWYgT1ZFUkRSQVdfSU5TUEVDVE9SXFxuZ2xfRnJhZ0NvbG9yPXZlYzQoMS4wKTtcXG4jZW5kaWZcXG59XCIsIFwidW5pZm9ybSBtYXQ0IHVfbWF0cml4O3VuaWZvcm0gdmVjMiB1X3BhdHRlcm5fc2l6ZV9hO3VuaWZvcm0gdmVjMiB1X3BhdHRlcm5fc2l6ZV9iO3VuaWZvcm0gdmVjMiB1X3BpeGVsX2Nvb3JkX3VwcGVyO3VuaWZvcm0gdmVjMiB1X3BpeGVsX2Nvb3JkX2xvd2VyO3VuaWZvcm0gZmxvYXQgdV9zY2FsZV9hO3VuaWZvcm0gZmxvYXQgdV9zY2FsZV9iO3VuaWZvcm0gZmxvYXQgdV90aWxlX3VuaXRzX3RvX3BpeGVsczthdHRyaWJ1dGUgdmVjMiBhX3Bvczt2YXJ5aW5nIHZlYzIgdl9wb3NfYTt2YXJ5aW5nIHZlYzIgdl9wb3NfYjt2b2lkIG1haW4oKSB7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcywwLDEpO3ZfcG9zX2E9Z2V0X3BhdHRlcm5fcG9zKHVfcGl4ZWxfY29vcmRfdXBwZXIsdV9waXhlbF9jb29yZF9sb3dlcix1X3NjYWxlX2EqdV9wYXR0ZXJuX3NpemVfYSx1X3RpbGVfdW5pdHNfdG9fcGl4ZWxzLGFfcG9zKTt2X3Bvc19iPWdldF9wYXR0ZXJuX3Bvcyh1X3BpeGVsX2Nvb3JkX3VwcGVyLHVfcGl4ZWxfY29vcmRfbG93ZXIsdV9zY2FsZV9iKnVfcGF0dGVybl9zaXplX2IsdV90aWxlX3VuaXRzX3RvX3BpeGVscyxhX3Bvcyk7fVwiKSxcbiAgICAgICAgSGUgPSBnaShcInZhcnlpbmcgdmVjMyB2X2RhdGE7XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBoaWdocCB2ZWM0IGNvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBtZWRpdW1wIGZsb2F0IHJhZGl1c1xcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBibHVyXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGhpZ2hwIHZlYzQgc3Ryb2tlX2NvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBtZWRpdW1wIGZsb2F0IHN0cm9rZV93aWR0aFxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBzdHJva2Vfb3BhY2l0eVxcbnZvaWQgbWFpbigpIHtcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBoaWdocCB2ZWM0IGNvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbWVkaXVtcCBmbG9hdCByYWRpdXNcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IGJsdXJcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBoaWdocCB2ZWM0IHN0cm9rZV9jb2xvclxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIG1lZGl1bXAgZmxvYXQgc3Ryb2tlX3dpZHRoXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBzdHJva2Vfb3BhY2l0eVxcbnZlYzIgZXh0cnVkZT12X2RhdGEueHk7ZmxvYXQgZXh0cnVkZV9sZW5ndGg9bGVuZ3RoKGV4dHJ1ZGUpO2xvd3AgZmxvYXQgYW50aWFsaWFzYmx1cj12X2RhdGEuejtmbG9hdCBhbnRpYWxpYXNlZF9ibHVyPS1tYXgoYmx1cixhbnRpYWxpYXNibHVyKTtmbG9hdCBvcGFjaXR5X3Q9c21vb3Roc3RlcCgwLjAsYW50aWFsaWFzZWRfYmx1cixleHRydWRlX2xlbmd0aC0xLjApO2Zsb2F0IGNvbG9yX3Q9c3Ryb2tlX3dpZHRoIDwgMC4wMSA/IDAuMCA6IHNtb290aHN0ZXAoYW50aWFsaWFzZWRfYmx1ciwwLjAsZXh0cnVkZV9sZW5ndGgtcmFkaXVzLyhyYWRpdXMrc3Ryb2tlX3dpZHRoKSk7Z2xfRnJhZ0NvbG9yPW9wYWNpdHlfdCptaXgoY29sb3Iqb3BhY2l0eSxzdHJva2VfY29sb3Iqc3Ryb2tlX29wYWNpdHksY29sb3JfdCk7XFxuI2lmZGVmIE9WRVJEUkFXX0lOU1BFQ1RPUlxcbmdsX0ZyYWdDb2xvcj12ZWM0KDEuMCk7XFxuI2VuZGlmXFxufVwiLCBcInVuaWZvcm0gbWF0NCB1X21hdHJpeDt1bmlmb3JtIGJvb2wgdV9zY2FsZV93aXRoX21hcDt1bmlmb3JtIGJvb2wgdV9waXRjaF93aXRoX21hcDt1bmlmb3JtIHZlYzIgdV9leHRydWRlX3NjYWxlO3VuaWZvcm0gbG93cCBmbG9hdCB1X2RldmljZV9waXhlbF9yYXRpbzt1bmlmb3JtIGhpZ2hwIGZsb2F0IHVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZTthdHRyaWJ1dGUgdmVjMiBhX3Bvczt2YXJ5aW5nIHZlYzMgdl9kYXRhO1xcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgaGlnaHAgdmVjNCBjb2xvclxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbWVkaXVtcCBmbG9hdCByYWRpdXNcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgYmx1clxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvcGFjaXR5XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBoaWdocCB2ZWM0IHN0cm9rZV9jb2xvclxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbWVkaXVtcCBmbG9hdCBzdHJva2Vfd2lkdGhcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgc3Ryb2tlX29wYWNpdHlcXG52b2lkIG1haW4odm9pZCkge1xcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGhpZ2hwIHZlYzQgY29sb3JcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBtZWRpdW1wIGZsb2F0IHJhZGl1c1xcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgYmx1clxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgb3BhY2l0eVxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGhpZ2hwIHZlYzQgc3Ryb2tlX2NvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbWVkaXVtcCBmbG9hdCBzdHJva2Vfd2lkdGhcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IHN0cm9rZV9vcGFjaXR5XFxudmVjMiBleHRydWRlPXZlYzIobW9kKGFfcG9zLDIuMCkqMi4wLTEuMCk7dmVjMiBjaXJjbGVfY2VudGVyPWZsb29yKGFfcG9zKjAuNSk7aWYgKHVfcGl0Y2hfd2l0aF9tYXApIHt2ZWMyIGNvcm5lcl9wb3NpdGlvbj1jaXJjbGVfY2VudGVyO2lmICh1X3NjYWxlX3dpdGhfbWFwKSB7Y29ybmVyX3Bvc2l0aW9uKz1leHRydWRlKihyYWRpdXMrc3Ryb2tlX3dpZHRoKSp1X2V4dHJ1ZGVfc2NhbGU7fSBlbHNlIHt2ZWM0IHByb2plY3RlZF9jZW50ZXI9dV9tYXRyaXgqdmVjNChjaXJjbGVfY2VudGVyLDAsMSk7Y29ybmVyX3Bvc2l0aW9uKz1leHRydWRlKihyYWRpdXMrc3Ryb2tlX3dpZHRoKSp1X2V4dHJ1ZGVfc2NhbGUqKHByb2plY3RlZF9jZW50ZXIudy91X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UpO31nbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGNvcm5lcl9wb3NpdGlvbiwwLDEpO30gZWxzZSB7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChjaXJjbGVfY2VudGVyLDAsMSk7aWYgKHVfc2NhbGVfd2l0aF9tYXApIHtnbF9Qb3NpdGlvbi54eSs9ZXh0cnVkZSoocmFkaXVzK3N0cm9rZV93aWR0aCkqdV9leHRydWRlX3NjYWxlKnVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZTt9IGVsc2Uge2dsX1Bvc2l0aW9uLnh5Kz1leHRydWRlKihyYWRpdXMrc3Ryb2tlX3dpZHRoKSp1X2V4dHJ1ZGVfc2NhbGUqZ2xfUG9zaXRpb24udzt9fWxvd3AgZmxvYXQgYW50aWFsaWFzYmx1cj0xLjAvdV9kZXZpY2VfcGl4ZWxfcmF0aW8vKHJhZGl1cytzdHJva2Vfd2lkdGgpO3ZfZGF0YT12ZWMzKGV4dHJ1ZGUueCxleHRydWRlLnksYW50aWFsaWFzYmx1cik7fVwiKSxcbiAgICAgICAgS2UgPSBnaShcInZvaWQgbWFpbigpIHtnbF9GcmFnQ29sb3I9dmVjNCgxLjApO31cIiwgXCJhdHRyaWJ1dGUgdmVjMiBhX3Bvczt1bmlmb3JtIG1hdDQgdV9tYXRyaXg7dm9pZCBtYWluKCkge2dsX1Bvc2l0aW9uPXVfbWF0cml4KnZlYzQoYV9wb3MsMCwxKTt9XCIpLFxuICAgICAgICBZZSA9IGdpKFwidW5pZm9ybSBoaWdocCBmbG9hdCB1X2ludGVuc2l0eTt2YXJ5aW5nIHZlYzIgdl9leHRydWRlO1xcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgaGlnaHAgZmxvYXQgd2VpZ2h0XFxuI2RlZmluZSBHQVVTU19DT0VGIDAuMzk4OTQyMjgwNDAxNDMyN1xcbnZvaWQgbWFpbigpIHtcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBoaWdocCBmbG9hdCB3ZWlnaHRcXG5mbG9hdCBkPS0wLjUqMy4wKjMuMCpkb3Qodl9leHRydWRlLHZfZXh0cnVkZSk7ZmxvYXQgdmFsPXdlaWdodCp1X2ludGVuc2l0eSpHQVVTU19DT0VGKmV4cChkKTtnbF9GcmFnQ29sb3I9dmVjNCh2YWwsMS4wLDEuMCwxLjApO1xcbiNpZmRlZiBPVkVSRFJBV19JTlNQRUNUT1JcXG5nbF9GcmFnQ29sb3I9dmVjNCgxLjApO1xcbiNlbmRpZlxcbn1cIiwgXCJ1bmlmb3JtIG1hdDQgdV9tYXRyaXg7dW5pZm9ybSBmbG9hdCB1X2V4dHJ1ZGVfc2NhbGU7dW5pZm9ybSBmbG9hdCB1X29wYWNpdHk7dW5pZm9ybSBmbG9hdCB1X2ludGVuc2l0eTthdHRyaWJ1dGUgdmVjMiBhX3Bvczt2YXJ5aW5nIHZlYzIgdl9leHRydWRlO1xcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgaGlnaHAgZmxvYXQgd2VpZ2h0XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBtZWRpdW1wIGZsb2F0IHJhZGl1c1xcbmNvbnN0IGhpZ2hwIGZsb2F0IFpFUk89MS4wLzI1NS4wLzE2LjA7XFxuI2RlZmluZSBHQVVTU19DT0VGIDAuMzk4OTQyMjgwNDAxNDMyN1xcbnZvaWQgbWFpbih2b2lkKSB7XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgaGlnaHAgZmxvYXQgd2VpZ2h0XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbWVkaXVtcCBmbG9hdCByYWRpdXNcXG52ZWMyIHVuc2NhbGVkX2V4dHJ1ZGU9dmVjMihtb2QoYV9wb3MsMi4wKSoyLjAtMS4wKTtmbG9hdCBTPXNxcnQoLTIuMCpsb2coWkVSTy93ZWlnaHQvdV9pbnRlbnNpdHkvR0FVU1NfQ09FRikpLzMuMDt2X2V4dHJ1ZGU9Uyp1bnNjYWxlZF9leHRydWRlO3ZlYzIgZXh0cnVkZT12X2V4dHJ1ZGUqcmFkaXVzKnVfZXh0cnVkZV9zY2FsZTt2ZWM0IHBvcz12ZWM0KGZsb29yKGFfcG9zKjAuNSkrZXh0cnVkZSwwLDEpO2dsX1Bvc2l0aW9uPXVfbWF0cml4KnBvczt9XCIpLFxuICAgICAgICBKZSA9IGdpKFwidW5pZm9ybSBzYW1wbGVyMkQgdV9pbWFnZTt1bmlmb3JtIHNhbXBsZXIyRCB1X2NvbG9yX3JhbXA7dW5pZm9ybSBmbG9hdCB1X29wYWNpdHk7dmFyeWluZyB2ZWMyIHZfcG9zO3ZvaWQgbWFpbigpIHtmbG9hdCB0PXRleHR1cmUyRCh1X2ltYWdlLHZfcG9zKS5yO3ZlYzQgY29sb3I9dGV4dHVyZTJEKHVfY29sb3JfcmFtcCx2ZWMyKHQsMC41KSk7Z2xfRnJhZ0NvbG9yPWNvbG9yKnVfb3BhY2l0eTtcXG4jaWZkZWYgT1ZFUkRSQVdfSU5TUEVDVE9SXFxuZ2xfRnJhZ0NvbG9yPXZlYzQoMC4wKTtcXG4jZW5kaWZcXG59XCIsIFwidW5pZm9ybSBtYXQ0IHVfbWF0cml4O3VuaWZvcm0gdmVjMiB1X3dvcmxkO2F0dHJpYnV0ZSB2ZWMyIGFfcG9zO3ZhcnlpbmcgdmVjMiB2X3Bvczt2b2lkIG1haW4oKSB7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3Bvcyp1X3dvcmxkLDAsMSk7dl9wb3MueD1hX3Bvcy54O3ZfcG9zLnk9MS4wLWFfcG9zLnk7fVwiKSxcbiAgICAgICAgUWUgPSBnaShcInZhcnlpbmcgZmxvYXQgdl9wbGFjZWQ7dmFyeWluZyBmbG9hdCB2X25vdFVzZWQ7dm9pZCBtYWluKCkge2Zsb2F0IGFscGhhPTAuNTtnbF9GcmFnQ29sb3I9dmVjNCgxLjAsMC4wLDAuMCwxLjApKmFscGhhO2lmICh2X3BsYWNlZCA+IDAuNSkge2dsX0ZyYWdDb2xvcj12ZWM0KDAuMCwwLjAsMS4wLDAuNSkqYWxwaGE7fWlmICh2X25vdFVzZWQgPiAwLjUpIHtnbF9GcmFnQ29sb3IqPS4xO319XCIsIFwiYXR0cmlidXRlIHZlYzIgYV9wb3M7YXR0cmlidXRlIHZlYzIgYV9hbmNob3JfcG9zO2F0dHJpYnV0ZSB2ZWMyIGFfZXh0cnVkZTthdHRyaWJ1dGUgdmVjMiBhX3BsYWNlZDthdHRyaWJ1dGUgdmVjMiBhX3NoaWZ0O3VuaWZvcm0gbWF0NCB1X21hdHJpeDt1bmlmb3JtIHZlYzIgdV9leHRydWRlX3NjYWxlO3VuaWZvcm0gZmxvYXQgdV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlO3ZhcnlpbmcgZmxvYXQgdl9wbGFjZWQ7dmFyeWluZyBmbG9hdCB2X25vdFVzZWQ7dm9pZCBtYWluKCkge3ZlYzQgcHJvamVjdGVkUG9pbnQ9dV9tYXRyaXgqdmVjNChhX2FuY2hvcl9wb3MsMCwxKTtoaWdocCBmbG9hdCBjYW1lcmFfdG9fYW5jaG9yX2Rpc3RhbmNlPXByb2plY3RlZFBvaW50Lnc7aGlnaHAgZmxvYXQgY29sbGlzaW9uX3BlcnNwZWN0aXZlX3JhdGlvPWNsYW1wKDAuNSswLjUqKHVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZS9jYW1lcmFfdG9fYW5jaG9yX2Rpc3RhbmNlKSwwLjAsNC4wKTtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGFfcG9zLDAuMCwxLjApO2dsX1Bvc2l0aW9uLnh5Kz0oYV9leHRydWRlK2Ffc2hpZnQpKnVfZXh0cnVkZV9zY2FsZSpnbF9Qb3NpdGlvbi53KmNvbGxpc2lvbl9wZXJzcGVjdGl2ZV9yYXRpbzt2X3BsYWNlZD1hX3BsYWNlZC54O3Zfbm90VXNlZD1hX3BsYWNlZC55O31cIiksXG4gICAgICAgICRlID0gZ2koXCJ2YXJ5aW5nIGZsb2F0IHZfcmFkaXVzO3ZhcnlpbmcgdmVjMiB2X2V4dHJ1ZGU7dmFyeWluZyBmbG9hdCB2X3BlcnNwZWN0aXZlX3JhdGlvO3ZhcnlpbmcgZmxvYXQgdl9jb2xsaXNpb247dm9pZCBtYWluKCkge2Zsb2F0IGFscGhhPTAuNSptaW4odl9wZXJzcGVjdGl2ZV9yYXRpbywxLjApO2Zsb2F0IHN0cm9rZV9yYWRpdXM9MC45Km1heCh2X3BlcnNwZWN0aXZlX3JhdGlvLDEuMCk7ZmxvYXQgZGlzdGFuY2VfdG9fY2VudGVyPWxlbmd0aCh2X2V4dHJ1ZGUpO2Zsb2F0IGRpc3RhbmNlX3RvX2VkZ2U9YWJzKGRpc3RhbmNlX3RvX2NlbnRlci12X3JhZGl1cyk7ZmxvYXQgb3BhY2l0eV90PXNtb290aHN0ZXAoLXN0cm9rZV9yYWRpdXMsMC4wLC1kaXN0YW5jZV90b19lZGdlKTt2ZWM0IGNvbG9yPW1peCh2ZWM0KDAuMCwwLjAsMS4wLDAuNSksdmVjNCgxLjAsMC4wLDAuMCwxLjApLHZfY29sbGlzaW9uKTtnbF9GcmFnQ29sb3I9Y29sb3IqYWxwaGEqb3BhY2l0eV90O31cIiwgXCJhdHRyaWJ1dGUgdmVjMiBhX3BvczthdHRyaWJ1dGUgZmxvYXQgYV9yYWRpdXM7YXR0cmlidXRlIHZlYzIgYV9mbGFnczt1bmlmb3JtIG1hdDQgdV9tYXRyaXg7dW5pZm9ybSBtYXQ0IHVfaW52X21hdHJpeDt1bmlmb3JtIHZlYzIgdV92aWV3cG9ydF9zaXplO3VuaWZvcm0gZmxvYXQgdV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlO3ZhcnlpbmcgZmxvYXQgdl9yYWRpdXM7dmFyeWluZyB2ZWMyIHZfZXh0cnVkZTt2YXJ5aW5nIGZsb2F0IHZfcGVyc3BlY3RpdmVfcmF0aW87dmFyeWluZyBmbG9hdCB2X2NvbGxpc2lvbjt2ZWMzIHRvVGlsZVBvc2l0aW9uKHZlYzIgc2NyZWVuUG9zKSB7dmVjNCByYXlTdGFydD11X2ludl9tYXRyaXgqdmVjNChzY3JlZW5Qb3MsLTEuMCwxLjApO3ZlYzQgcmF5RW5kICA9dV9pbnZfbWF0cml4KnZlYzQoc2NyZWVuUG9zLCAxLjAsMS4wKTtyYXlTdGFydC54eXovPXJheVN0YXJ0Lnc7cmF5RW5kLnh5eiAgLz1yYXlFbmQudztoaWdocCBmbG9hdCB0PSgwLjAtcmF5U3RhcnQueikvKHJheUVuZC56LXJheVN0YXJ0LnopO3JldHVybiBtaXgocmF5U3RhcnQueHl6LHJheUVuZC54eXosdCk7fXZvaWQgbWFpbigpIHt2ZWMyIHF1YWRDZW50ZXJQb3M9YV9wb3M7ZmxvYXQgcmFkaXVzPWFfcmFkaXVzO2Zsb2F0IGNvbGxpc2lvbj1hX2ZsYWdzLng7ZmxvYXQgdmVydGV4SWR4PWFfZmxhZ3MueTt2ZWMyIHF1YWRWZXJ0ZXhPZmZzZXQ9dmVjMihtaXgoLTEuMCwxLjAsZmxvYXQodmVydGV4SWR4ID49Mi4wKSksbWl4KC0xLjAsMS4wLGZsb2F0KHZlcnRleElkeCA+PTEuMCAmJiB2ZXJ0ZXhJZHggPD0yLjApKSk7dmVjMiBxdWFkVmVydGV4RXh0ZW50PXF1YWRWZXJ0ZXhPZmZzZXQqcmFkaXVzO3ZlYzMgdGlsZVBvcz10b1RpbGVQb3NpdGlvbihxdWFkQ2VudGVyUG9zKTt2ZWM0IGNsaXBQb3M9dV9tYXRyaXgqdmVjNCh0aWxlUG9zLDEuMCk7aGlnaHAgZmxvYXQgY2FtZXJhX3RvX2FuY2hvcl9kaXN0YW5jZT1jbGlwUG9zLnc7aGlnaHAgZmxvYXQgY29sbGlzaW9uX3BlcnNwZWN0aXZlX3JhdGlvPWNsYW1wKDAuNSswLjUqKHVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZS9jYW1lcmFfdG9fYW5jaG9yX2Rpc3RhbmNlKSwwLjAsNC4wKTtmbG9hdCBwYWRkaW5nX2ZhY3Rvcj0xLjI7dl9yYWRpdXM9cmFkaXVzO3ZfZXh0cnVkZT1xdWFkVmVydGV4RXh0ZW50KnBhZGRpbmdfZmFjdG9yO3ZfcGVyc3BlY3RpdmVfcmF0aW89Y29sbGlzaW9uX3BlcnNwZWN0aXZlX3JhdGlvO3ZfY29sbGlzaW9uPWNvbGxpc2lvbjtnbF9Qb3NpdGlvbj12ZWM0KGNsaXBQb3MueHl6L2NsaXBQb3MudywxLjApK3ZlYzQocXVhZFZlcnRleEV4dGVudCpwYWRkaW5nX2ZhY3Rvci91X3ZpZXdwb3J0X3NpemUqMi4wLDAuMCwwLjApO31cIiksXG4gICAgICAgIHRpID0gZ2koXCJ1bmlmb3JtIGhpZ2hwIHZlYzQgdV9jb2xvcjt1bmlmb3JtIHNhbXBsZXIyRCB1X292ZXJsYXk7dmFyeWluZyB2ZWMyIHZfdXY7dm9pZCBtYWluKCkge3ZlYzQgb3ZlcmxheV9jb2xvcj10ZXh0dXJlMkQodV9vdmVybGF5LHZfdXYpO2dsX0ZyYWdDb2xvcj1taXgodV9jb2xvcixvdmVybGF5X2NvbG9yLG92ZXJsYXlfY29sb3IuYSk7fVwiLCBcImF0dHJpYnV0ZSB2ZWMyIGFfcG9zO3ZhcnlpbmcgdmVjMiB2X3V2O3VuaWZvcm0gbWF0NCB1X21hdHJpeDt1bmlmb3JtIGZsb2F0IHVfb3ZlcmxheV9zY2FsZTt2b2lkIG1haW4oKSB7dl91dj1hX3Bvcy84MTkyLjA7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3Bvcyp1X292ZXJsYXlfc2NhbGUsMCwxKTt9XCIpLFxuICAgICAgICBlaSA9IGdpKFwiI3ByYWdtYSBtYXBib3g6IGRlZmluZSBoaWdocCB2ZWM0IGNvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG52b2lkIG1haW4oKSB7XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgaGlnaHAgdmVjNCBjb2xvclxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgb3BhY2l0eVxcbmdsX0ZyYWdDb2xvcj1jb2xvcipvcGFjaXR5O1xcbiNpZmRlZiBPVkVSRFJBV19JTlNQRUNUT1JcXG5nbF9GcmFnQ29sb3I9dmVjNCgxLjApO1xcbiNlbmRpZlxcbn1cIiwgXCJhdHRyaWJ1dGUgdmVjMiBhX3Bvczt1bmlmb3JtIG1hdDQgdV9tYXRyaXg7XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBoaWdocCB2ZWM0IGNvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG52b2lkIG1haW4oKSB7XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgaGlnaHAgdmVjNCBjb2xvclxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgb3BhY2l0eVxcbmdsX1Bvc2l0aW9uPXVfbWF0cml4KnZlYzQoYV9wb3MsMCwxKTt9XCIpLFxuICAgICAgICBpaSA9IGdpKFwidmFyeWluZyB2ZWMyIHZfcG9zO1xcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgaGlnaHAgdmVjNCBvdXRsaW5lX2NvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG52b2lkIG1haW4oKSB7XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgaGlnaHAgdmVjNCBvdXRsaW5lX2NvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBvcGFjaXR5XFxuZmxvYXQgZGlzdD1sZW5ndGgodl9wb3MtZ2xfRnJhZ0Nvb3JkLnh5KTtmbG9hdCBhbHBoYT0xLjAtc21vb3Roc3RlcCgwLjAsMS4wLGRpc3QpO2dsX0ZyYWdDb2xvcj1vdXRsaW5lX2NvbG9yKihhbHBoYSpvcGFjaXR5KTtcXG4jaWZkZWYgT1ZFUkRSQVdfSU5TUEVDVE9SXFxuZ2xfRnJhZ0NvbG9yPXZlYzQoMS4wKTtcXG4jZW5kaWZcXG59XCIsIFwiYXR0cmlidXRlIHZlYzIgYV9wb3M7dW5pZm9ybSBtYXQ0IHVfbWF0cml4O3VuaWZvcm0gdmVjMiB1X3dvcmxkO3ZhcnlpbmcgdmVjMiB2X3BvcztcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGhpZ2hwIHZlYzQgb3V0bGluZV9jb2xvclxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvcGFjaXR5XFxudm9pZCBtYWluKCkge1xcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGhpZ2hwIHZlYzQgb3V0bGluZV9jb2xvclxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgb3BhY2l0eVxcbmdsX1Bvc2l0aW9uPXVfbWF0cml4KnZlYzQoYV9wb3MsMCwxKTt2X3Bvcz0oZ2xfUG9zaXRpb24ueHkvZ2xfUG9zaXRpb24udysxLjApLzIuMCp1X3dvcmxkO31cIiksXG4gICAgICAgIG9pID0gZ2koXCJ1bmlmb3JtIHZlYzIgdV90ZXhzaXplO3VuaWZvcm0gc2FtcGxlcjJEIHVfaW1hZ2U7dW5pZm9ybSBmbG9hdCB1X2ZhZGU7dmFyeWluZyB2ZWMyIHZfcG9zX2E7dmFyeWluZyB2ZWMyIHZfcG9zX2I7dmFyeWluZyB2ZWMyIHZfcG9zO1xcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvcGFjaXR5XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIHZlYzQgcGF0dGVybl9mcm9tXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIHZlYzQgcGF0dGVybl90b1xcbnZvaWQgbWFpbigpIHtcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBtZWRpdW1wIHZlYzQgcGF0dGVybl9mcm9tXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbWVkaXVtcCB2ZWM0IHBhdHRlcm5fdG9cXG52ZWMyIHBhdHRlcm5fdGxfYT1wYXR0ZXJuX2Zyb20ueHk7dmVjMiBwYXR0ZXJuX2JyX2E9cGF0dGVybl9mcm9tLnp3O3ZlYzIgcGF0dGVybl90bF9iPXBhdHRlcm5fdG8ueHk7dmVjMiBwYXR0ZXJuX2JyX2I9cGF0dGVybl90by56dzt2ZWMyIGltYWdlY29vcmQ9bW9kKHZfcG9zX2EsMS4wKTt2ZWMyIHBvcz1taXgocGF0dGVybl90bF9hL3VfdGV4c2l6ZSxwYXR0ZXJuX2JyX2EvdV90ZXhzaXplLGltYWdlY29vcmQpO3ZlYzQgY29sb3IxPXRleHR1cmUyRCh1X2ltYWdlLHBvcyk7dmVjMiBpbWFnZWNvb3JkX2I9bW9kKHZfcG9zX2IsMS4wKTt2ZWMyIHBvczI9bWl4KHBhdHRlcm5fdGxfYi91X3RleHNpemUscGF0dGVybl9icl9iL3VfdGV4c2l6ZSxpbWFnZWNvb3JkX2IpO3ZlYzQgY29sb3IyPXRleHR1cmUyRCh1X2ltYWdlLHBvczIpO2Zsb2F0IGRpc3Q9bGVuZ3RoKHZfcG9zLWdsX0ZyYWdDb29yZC54eSk7ZmxvYXQgYWxwaGE9MS4wLXNtb290aHN0ZXAoMC4wLDEuMCxkaXN0KTtnbF9GcmFnQ29sb3I9bWl4KGNvbG9yMSxjb2xvcjIsdV9mYWRlKSphbHBoYSpvcGFjaXR5O1xcbiNpZmRlZiBPVkVSRFJBV19JTlNQRUNUT1JcXG5nbF9GcmFnQ29sb3I9dmVjNCgxLjApO1xcbiNlbmRpZlxcbn1cIiwgXCJ1bmlmb3JtIG1hdDQgdV9tYXRyaXg7dW5pZm9ybSB2ZWMyIHVfd29ybGQ7dW5pZm9ybSB2ZWMyIHVfcGl4ZWxfY29vcmRfdXBwZXI7dW5pZm9ybSB2ZWMyIHVfcGl4ZWxfY29vcmRfbG93ZXI7dW5pZm9ybSB2ZWMzIHVfc2NhbGU7YXR0cmlidXRlIHZlYzIgYV9wb3M7dmFyeWluZyB2ZWMyIHZfcG9zX2E7dmFyeWluZyB2ZWMyIHZfcG9zX2I7dmFyeWluZyB2ZWMyIHZfcG9zO1xcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvcGFjaXR5XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIHZlYzQgcGF0dGVybl9mcm9tXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIHZlYzQgcGF0dGVybl90b1xcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBwaXhlbF9yYXRpb19mcm9tXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IHBpeGVsX3JhdGlvX3RvXFxudm9pZCBtYWluKCkge1xcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgb3BhY2l0eVxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIG1lZGl1bXAgdmVjNCBwYXR0ZXJuX2Zyb21cXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBtZWRpdW1wIHZlYzQgcGF0dGVybl90b1xcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgcGl4ZWxfcmF0aW9fZnJvbVxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgcGl4ZWxfcmF0aW9fdG9cXG52ZWMyIHBhdHRlcm5fdGxfYT1wYXR0ZXJuX2Zyb20ueHk7dmVjMiBwYXR0ZXJuX2JyX2E9cGF0dGVybl9mcm9tLnp3O3ZlYzIgcGF0dGVybl90bF9iPXBhdHRlcm5fdG8ueHk7dmVjMiBwYXR0ZXJuX2JyX2I9cGF0dGVybl90by56dztmbG9hdCB0aWxlUmF0aW89dV9zY2FsZS54O2Zsb2F0IGZyb21TY2FsZT11X3NjYWxlLnk7ZmxvYXQgdG9TY2FsZT11X3NjYWxlLno7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcywwLDEpO3ZlYzIgZGlzcGxheV9zaXplX2E9KHBhdHRlcm5fYnJfYS1wYXR0ZXJuX3RsX2EpL3BpeGVsX3JhdGlvX2Zyb207dmVjMiBkaXNwbGF5X3NpemVfYj0ocGF0dGVybl9icl9iLXBhdHRlcm5fdGxfYikvcGl4ZWxfcmF0aW9fdG87dl9wb3NfYT1nZXRfcGF0dGVybl9wb3ModV9waXhlbF9jb29yZF91cHBlcix1X3BpeGVsX2Nvb3JkX2xvd2VyLGZyb21TY2FsZSpkaXNwbGF5X3NpemVfYSx0aWxlUmF0aW8sYV9wb3MpO3ZfcG9zX2I9Z2V0X3BhdHRlcm5fcG9zKHVfcGl4ZWxfY29vcmRfdXBwZXIsdV9waXhlbF9jb29yZF9sb3dlcix0b1NjYWxlKmRpc3BsYXlfc2l6ZV9iLHRpbGVSYXRpbyxhX3Bvcyk7dl9wb3M9KGdsX1Bvc2l0aW9uLnh5L2dsX1Bvc2l0aW9uLncrMS4wKS8yLjAqdV93b3JsZDt9XCIpLFxuICAgICAgICByaSA9IGdpKFwidW5pZm9ybSB2ZWMyIHVfdGV4c2l6ZTt1bmlmb3JtIGZsb2F0IHVfZmFkZTt1bmlmb3JtIHNhbXBsZXIyRCB1X2ltYWdlO3ZhcnlpbmcgdmVjMiB2X3Bvc19hO3ZhcnlpbmcgdmVjMiB2X3Bvc19iO1xcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvcGFjaXR5XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIHZlYzQgcGF0dGVybl9mcm9tXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIHZlYzQgcGF0dGVybl90b1xcbnZvaWQgbWFpbigpIHtcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBtZWRpdW1wIHZlYzQgcGF0dGVybl9mcm9tXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbWVkaXVtcCB2ZWM0IHBhdHRlcm5fdG9cXG52ZWMyIHBhdHRlcm5fdGxfYT1wYXR0ZXJuX2Zyb20ueHk7dmVjMiBwYXR0ZXJuX2JyX2E9cGF0dGVybl9mcm9tLnp3O3ZlYzIgcGF0dGVybl90bF9iPXBhdHRlcm5fdG8ueHk7dmVjMiBwYXR0ZXJuX2JyX2I9cGF0dGVybl90by56dzt2ZWMyIGltYWdlY29vcmQ9bW9kKHZfcG9zX2EsMS4wKTt2ZWMyIHBvcz1taXgocGF0dGVybl90bF9hL3VfdGV4c2l6ZSxwYXR0ZXJuX2JyX2EvdV90ZXhzaXplLGltYWdlY29vcmQpO3ZlYzQgY29sb3IxPXRleHR1cmUyRCh1X2ltYWdlLHBvcyk7dmVjMiBpbWFnZWNvb3JkX2I9bW9kKHZfcG9zX2IsMS4wKTt2ZWMyIHBvczI9bWl4KHBhdHRlcm5fdGxfYi91X3RleHNpemUscGF0dGVybl9icl9iL3VfdGV4c2l6ZSxpbWFnZWNvb3JkX2IpO3ZlYzQgY29sb3IyPXRleHR1cmUyRCh1X2ltYWdlLHBvczIpO2dsX0ZyYWdDb2xvcj1taXgoY29sb3IxLGNvbG9yMix1X2ZhZGUpKm9wYWNpdHk7XFxuI2lmZGVmIE9WRVJEUkFXX0lOU1BFQ1RPUlxcbmdsX0ZyYWdDb2xvcj12ZWM0KDEuMCk7XFxuI2VuZGlmXFxufVwiLCBcInVuaWZvcm0gbWF0NCB1X21hdHJpeDt1bmlmb3JtIHZlYzIgdV9waXhlbF9jb29yZF91cHBlcjt1bmlmb3JtIHZlYzIgdV9waXhlbF9jb29yZF9sb3dlcjt1bmlmb3JtIHZlYzMgdV9zY2FsZTthdHRyaWJ1dGUgdmVjMiBhX3Bvczt2YXJ5aW5nIHZlYzIgdl9wb3NfYTt2YXJ5aW5nIHZlYzIgdl9wb3NfYjtcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgb3BhY2l0eVxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCB2ZWM0IHBhdHRlcm5fZnJvbVxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCB2ZWM0IHBhdHRlcm5fdG9cXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgcGl4ZWxfcmF0aW9fZnJvbVxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBwaXhlbF9yYXRpb190b1xcbnZvaWQgbWFpbigpIHtcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBtZWRpdW1wIHZlYzQgcGF0dGVybl9mcm9tXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbWVkaXVtcCB2ZWM0IHBhdHRlcm5fdG9cXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IHBpeGVsX3JhdGlvX2Zyb21cXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IHBpeGVsX3JhdGlvX3RvXFxudmVjMiBwYXR0ZXJuX3RsX2E9cGF0dGVybl9mcm9tLnh5O3ZlYzIgcGF0dGVybl9icl9hPXBhdHRlcm5fZnJvbS56dzt2ZWMyIHBhdHRlcm5fdGxfYj1wYXR0ZXJuX3RvLnh5O3ZlYzIgcGF0dGVybl9icl9iPXBhdHRlcm5fdG8uenc7ZmxvYXQgdGlsZVpvb21SYXRpbz11X3NjYWxlLng7ZmxvYXQgZnJvbVNjYWxlPXVfc2NhbGUueTtmbG9hdCB0b1NjYWxlPXVfc2NhbGUuejt2ZWMyIGRpc3BsYXlfc2l6ZV9hPShwYXR0ZXJuX2JyX2EtcGF0dGVybl90bF9hKS9waXhlbF9yYXRpb19mcm9tO3ZlYzIgZGlzcGxheV9zaXplX2I9KHBhdHRlcm5fYnJfYi1wYXR0ZXJuX3RsX2IpL3BpeGVsX3JhdGlvX3RvO2dsX1Bvc2l0aW9uPXVfbWF0cml4KnZlYzQoYV9wb3MsMCwxKTt2X3Bvc19hPWdldF9wYXR0ZXJuX3Bvcyh1X3BpeGVsX2Nvb3JkX3VwcGVyLHVfcGl4ZWxfY29vcmRfbG93ZXIsZnJvbVNjYWxlKmRpc3BsYXlfc2l6ZV9hLHRpbGVab29tUmF0aW8sYV9wb3MpO3ZfcG9zX2I9Z2V0X3BhdHRlcm5fcG9zKHVfcGl4ZWxfY29vcmRfdXBwZXIsdV9waXhlbF9jb29yZF9sb3dlcix0b1NjYWxlKmRpc3BsYXlfc2l6ZV9iLHRpbGVab29tUmF0aW8sYV9wb3MpO31cIiksXG4gICAgICAgIGFpID0gZ2koXCJ2YXJ5aW5nIHZlYzQgdl9jb2xvcjt2b2lkIG1haW4oKSB7Z2xfRnJhZ0NvbG9yPXZfY29sb3I7XFxuI2lmZGVmIE9WRVJEUkFXX0lOU1BFQ1RPUlxcbmdsX0ZyYWdDb2xvcj12ZWM0KDEuMCk7XFxuI2VuZGlmXFxufVwiLCBcInVuaWZvcm0gbWF0NCB1X21hdHJpeDt1bmlmb3JtIHZlYzMgdV9saWdodGNvbG9yO3VuaWZvcm0gbG93cCB2ZWMzIHVfbGlnaHRwb3M7dW5pZm9ybSBsb3dwIGZsb2F0IHVfbGlnaHRpbnRlbnNpdHk7dW5pZm9ybSBmbG9hdCB1X3ZlcnRpY2FsX2dyYWRpZW50O3VuaWZvcm0gbG93cCBmbG9hdCB1X29wYWNpdHk7YXR0cmlidXRlIHZlYzIgYV9wb3M7YXR0cmlidXRlIHZlYzQgYV9ub3JtYWxfZWQ7dmFyeWluZyB2ZWM0IHZfY29sb3I7XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBoaWdocCBmbG9hdCBiYXNlXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBoaWdocCBmbG9hdCBoZWlnaHRcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGhpZ2hwIHZlYzQgY29sb3JcXG52b2lkIG1haW4oKSB7XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgaGlnaHAgZmxvYXQgYmFzZVxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGhpZ2hwIGZsb2F0IGhlaWdodFxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGhpZ2hwIHZlYzQgY29sb3JcXG52ZWMzIG5vcm1hbD1hX25vcm1hbF9lZC54eXo7YmFzZT1tYXgoMC4wLGJhc2UpO2hlaWdodD1tYXgoMC4wLGhlaWdodCk7ZmxvYXQgdD1tb2Qobm9ybWFsLngsMi4wKTtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGFfcG9zLHQgPiAwLjAgPyBoZWlnaHQgOiBiYXNlLDEpO2Zsb2F0IGNvbG9ydmFsdWU9Y29sb3IuciowLjIxMjYrY29sb3IuZyowLjcxNTIrY29sb3IuYiowLjA3MjI7dl9jb2xvcj12ZWM0KDAuMCwwLjAsMC4wLDEuMCk7dmVjNCBhbWJpZW50bGlnaHQ9dmVjNCgwLjAzLDAuMDMsMC4wMywxLjApO2NvbG9yKz1hbWJpZW50bGlnaHQ7ZmxvYXQgZGlyZWN0aW9uYWw9Y2xhbXAoZG90KG5vcm1hbC8xNjM4NC4wLHVfbGlnaHRwb3MpLDAuMCwxLjApO2RpcmVjdGlvbmFsPW1peCgoMS4wLXVfbGlnaHRpbnRlbnNpdHkpLG1heCgoMS4wLWNvbG9ydmFsdWUrdV9saWdodGludGVuc2l0eSksMS4wKSxkaXJlY3Rpb25hbCk7aWYgKG5vcm1hbC55ICE9MC4wKSB7ZGlyZWN0aW9uYWwqPSgoMS4wLXVfdmVydGljYWxfZ3JhZGllbnQpKyh1X3ZlcnRpY2FsX2dyYWRpZW50KmNsYW1wKCh0K2Jhc2UpKnBvdyhoZWlnaHQvMTUwLjAsMC41KSxtaXgoMC43LDAuOTgsMS4wLXVfbGlnaHRpbnRlbnNpdHkpLDEuMCkpKTt9dl9jb2xvci5yKz1jbGFtcChjb2xvci5yKmRpcmVjdGlvbmFsKnVfbGlnaHRjb2xvci5yLG1peCgwLjAsMC4zLDEuMC11X2xpZ2h0Y29sb3IuciksMS4wKTt2X2NvbG9yLmcrPWNsYW1wKGNvbG9yLmcqZGlyZWN0aW9uYWwqdV9saWdodGNvbG9yLmcsbWl4KDAuMCwwLjMsMS4wLXVfbGlnaHRjb2xvci5nKSwxLjApO3ZfY29sb3IuYis9Y2xhbXAoY29sb3IuYipkaXJlY3Rpb25hbCp1X2xpZ2h0Y29sb3IuYixtaXgoMC4wLDAuMywxLjAtdV9saWdodGNvbG9yLmIpLDEuMCk7dl9jb2xvcio9dV9vcGFjaXR5O31cIiksXG4gICAgICAgIG5pID0gZ2koXCJ1bmlmb3JtIHZlYzIgdV90ZXhzaXplO3VuaWZvcm0gZmxvYXQgdV9mYWRlO3VuaWZvcm0gc2FtcGxlcjJEIHVfaW1hZ2U7dmFyeWluZyB2ZWMyIHZfcG9zX2E7dmFyeWluZyB2ZWMyIHZfcG9zX2I7dmFyeWluZyB2ZWM0IHZfbGlnaHRpbmc7XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IGJhc2VcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgaGVpZ2h0XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIHZlYzQgcGF0dGVybl9mcm9tXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIHZlYzQgcGF0dGVybl90b1xcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBwaXhlbF9yYXRpb19mcm9tXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IHBpeGVsX3JhdGlvX3RvXFxudm9pZCBtYWluKCkge1xcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgYmFzZVxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgaGVpZ2h0XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbWVkaXVtcCB2ZWM0IHBhdHRlcm5fZnJvbVxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIG1lZGl1bXAgdmVjNCBwYXR0ZXJuX3RvXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBwaXhlbF9yYXRpb19mcm9tXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBwaXhlbF9yYXRpb190b1xcbnZlYzIgcGF0dGVybl90bF9hPXBhdHRlcm5fZnJvbS54eTt2ZWMyIHBhdHRlcm5fYnJfYT1wYXR0ZXJuX2Zyb20uenc7dmVjMiBwYXR0ZXJuX3RsX2I9cGF0dGVybl90by54eTt2ZWMyIHBhdHRlcm5fYnJfYj1wYXR0ZXJuX3RvLnp3O3ZlYzIgaW1hZ2Vjb29yZD1tb2Qodl9wb3NfYSwxLjApO3ZlYzIgcG9zPW1peChwYXR0ZXJuX3RsX2EvdV90ZXhzaXplLHBhdHRlcm5fYnJfYS91X3RleHNpemUsaW1hZ2Vjb29yZCk7dmVjNCBjb2xvcjE9dGV4dHVyZTJEKHVfaW1hZ2UscG9zKTt2ZWMyIGltYWdlY29vcmRfYj1tb2Qodl9wb3NfYiwxLjApO3ZlYzIgcG9zMj1taXgocGF0dGVybl90bF9iL3VfdGV4c2l6ZSxwYXR0ZXJuX2JyX2IvdV90ZXhzaXplLGltYWdlY29vcmRfYik7dmVjNCBjb2xvcjI9dGV4dHVyZTJEKHVfaW1hZ2UscG9zMik7dmVjNCBtaXhlZENvbG9yPW1peChjb2xvcjEsY29sb3IyLHVfZmFkZSk7Z2xfRnJhZ0NvbG9yPW1peGVkQ29sb3Iqdl9saWdodGluZztcXG4jaWZkZWYgT1ZFUkRSQVdfSU5TUEVDVE9SXFxuZ2xfRnJhZ0NvbG9yPXZlYzQoMS4wKTtcXG4jZW5kaWZcXG59XCIsIFwidW5pZm9ybSBtYXQ0IHVfbWF0cml4O3VuaWZvcm0gdmVjMiB1X3BpeGVsX2Nvb3JkX3VwcGVyO3VuaWZvcm0gdmVjMiB1X3BpeGVsX2Nvb3JkX2xvd2VyO3VuaWZvcm0gZmxvYXQgdV9oZWlnaHRfZmFjdG9yO3VuaWZvcm0gdmVjMyB1X3NjYWxlO3VuaWZvcm0gZmxvYXQgdV92ZXJ0aWNhbF9ncmFkaWVudDt1bmlmb3JtIGxvd3AgZmxvYXQgdV9vcGFjaXR5O3VuaWZvcm0gdmVjMyB1X2xpZ2h0Y29sb3I7dW5pZm9ybSBsb3dwIHZlYzMgdV9saWdodHBvczt1bmlmb3JtIGxvd3AgZmxvYXQgdV9saWdodGludGVuc2l0eTthdHRyaWJ1dGUgdmVjMiBhX3BvczthdHRyaWJ1dGUgdmVjNCBhX25vcm1hbF9lZDt2YXJ5aW5nIHZlYzIgdl9wb3NfYTt2YXJ5aW5nIHZlYzIgdl9wb3NfYjt2YXJ5aW5nIHZlYzQgdl9saWdodGluZztcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgYmFzZVxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBoZWlnaHRcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgdmVjNCBwYXR0ZXJuX2Zyb21cXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgdmVjNCBwYXR0ZXJuX3RvXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IHBpeGVsX3JhdGlvX2Zyb21cXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgcGl4ZWxfcmF0aW9fdG9cXG52b2lkIG1haW4oKSB7XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBiYXNlXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBoZWlnaHRcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBtZWRpdW1wIHZlYzQgcGF0dGVybl9mcm9tXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbWVkaXVtcCB2ZWM0IHBhdHRlcm5fdG9cXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IHBpeGVsX3JhdGlvX2Zyb21cXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IHBpeGVsX3JhdGlvX3RvXFxudmVjMiBwYXR0ZXJuX3RsX2E9cGF0dGVybl9mcm9tLnh5O3ZlYzIgcGF0dGVybl9icl9hPXBhdHRlcm5fZnJvbS56dzt2ZWMyIHBhdHRlcm5fdGxfYj1wYXR0ZXJuX3RvLnh5O3ZlYzIgcGF0dGVybl9icl9iPXBhdHRlcm5fdG8uenc7ZmxvYXQgdGlsZVJhdGlvPXVfc2NhbGUueDtmbG9hdCBmcm9tU2NhbGU9dV9zY2FsZS55O2Zsb2F0IHRvU2NhbGU9dV9zY2FsZS56O3ZlYzMgbm9ybWFsPWFfbm9ybWFsX2VkLnh5ejtmbG9hdCBlZGdlZGlzdGFuY2U9YV9ub3JtYWxfZWQudzt2ZWMyIGRpc3BsYXlfc2l6ZV9hPShwYXR0ZXJuX2JyX2EtcGF0dGVybl90bF9hKS9waXhlbF9yYXRpb19mcm9tO3ZlYzIgZGlzcGxheV9zaXplX2I9KHBhdHRlcm5fYnJfYi1wYXR0ZXJuX3RsX2IpL3BpeGVsX3JhdGlvX3RvO2Jhc2U9bWF4KDAuMCxiYXNlKTtoZWlnaHQ9bWF4KDAuMCxoZWlnaHQpO2Zsb2F0IHQ9bW9kKG5vcm1hbC54LDIuMCk7ZmxvYXQgej10ID4gMC4wID8gaGVpZ2h0IDogYmFzZTtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGFfcG9zLHosMSk7dmVjMiBwb3M9bm9ybWFsLng9PTEuMCAmJiBub3JtYWwueT09MC4wICYmIG5vcm1hbC56PT0xNjM4NC4wXFxuPyBhX3Bvc1xcbjogdmVjMihlZGdlZGlzdGFuY2Useip1X2hlaWdodF9mYWN0b3IpO3ZfcG9zX2E9Z2V0X3BhdHRlcm5fcG9zKHVfcGl4ZWxfY29vcmRfdXBwZXIsdV9waXhlbF9jb29yZF9sb3dlcixmcm9tU2NhbGUqZGlzcGxheV9zaXplX2EsdGlsZVJhdGlvLHBvcyk7dl9wb3NfYj1nZXRfcGF0dGVybl9wb3ModV9waXhlbF9jb29yZF91cHBlcix1X3BpeGVsX2Nvb3JkX2xvd2VyLHRvU2NhbGUqZGlzcGxheV9zaXplX2IsdGlsZVJhdGlvLHBvcyk7dl9saWdodGluZz12ZWM0KDAuMCwwLjAsMC4wLDEuMCk7ZmxvYXQgZGlyZWN0aW9uYWw9Y2xhbXAoZG90KG5vcm1hbC8xNjM4My4wLHVfbGlnaHRwb3MpLDAuMCwxLjApO2RpcmVjdGlvbmFsPW1peCgoMS4wLXVfbGlnaHRpbnRlbnNpdHkpLG1heCgoMC41K3VfbGlnaHRpbnRlbnNpdHkpLDEuMCksZGlyZWN0aW9uYWwpO2lmIChub3JtYWwueSAhPTAuMCkge2RpcmVjdGlvbmFsKj0oKDEuMC11X3ZlcnRpY2FsX2dyYWRpZW50KSsodV92ZXJ0aWNhbF9ncmFkaWVudCpjbGFtcCgodCtiYXNlKSpwb3coaGVpZ2h0LzE1MC4wLDAuNSksbWl4KDAuNywwLjk4LDEuMC11X2xpZ2h0aW50ZW5zaXR5KSwxLjApKSk7fXZfbGlnaHRpbmcucmdiKz1jbGFtcChkaXJlY3Rpb25hbCp1X2xpZ2h0Y29sb3IsbWl4KHZlYzMoMC4wKSx2ZWMzKDAuMyksMS4wLXVfbGlnaHRjb2xvciksdmVjMygxLjApKTt2X2xpZ2h0aW5nKj11X29wYWNpdHk7fVwiKSxcbiAgICAgICAgc2kgPSBnaShcIiNpZmRlZiBHTF9FU1xcbnByZWNpc2lvbiBoaWdocCBmbG9hdDtcXG4jZW5kaWZcXG51bmlmb3JtIHNhbXBsZXIyRCB1X2ltYWdlO3ZhcnlpbmcgdmVjMiB2X3Bvczt1bmlmb3JtIHZlYzIgdV9kaW1lbnNpb247dW5pZm9ybSBmbG9hdCB1X3pvb207dW5pZm9ybSB2ZWM0IHVfdW5wYWNrO2Zsb2F0IGdldEVsZXZhdGlvbih2ZWMyIGNvb3JkLGZsb2F0IGJpYXMpIHt2ZWM0IGRhdGE9dGV4dHVyZTJEKHVfaW1hZ2UsY29vcmQpKjI1NS4wO2RhdGEuYT0tMS4wO3JldHVybiBkb3QoZGF0YSx1X3VucGFjaykvNC4wO312b2lkIG1haW4oKSB7dmVjMiBlcHNpbG9uPTEuMC91X2RpbWVuc2lvbjtmbG9hdCBhPWdldEVsZXZhdGlvbih2X3Bvcyt2ZWMyKC1lcHNpbG9uLngsLWVwc2lsb24ueSksMC4wKTtmbG9hdCBiPWdldEVsZXZhdGlvbih2X3Bvcyt2ZWMyKDAsLWVwc2lsb24ueSksMC4wKTtmbG9hdCBjPWdldEVsZXZhdGlvbih2X3Bvcyt2ZWMyKGVwc2lsb24ueCwtZXBzaWxvbi55KSwwLjApO2Zsb2F0IGQ9Z2V0RWxldmF0aW9uKHZfcG9zK3ZlYzIoLWVwc2lsb24ueCwwKSwwLjApO2Zsb2F0IGU9Z2V0RWxldmF0aW9uKHZfcG9zLDAuMCk7ZmxvYXQgZj1nZXRFbGV2YXRpb24odl9wb3MrdmVjMihlcHNpbG9uLngsMCksMC4wKTtmbG9hdCBnPWdldEVsZXZhdGlvbih2X3Bvcyt2ZWMyKC1lcHNpbG9uLngsZXBzaWxvbi55KSwwLjApO2Zsb2F0IGg9Z2V0RWxldmF0aW9uKHZfcG9zK3ZlYzIoMCxlcHNpbG9uLnkpLDAuMCk7ZmxvYXQgaT1nZXRFbGV2YXRpb24odl9wb3MrdmVjMihlcHNpbG9uLngsZXBzaWxvbi55KSwwLjApO2Zsb2F0IGV4YWdnZXJhdGlvbkZhY3Rvcj11X3pvb20gPCAyLjAgPyAwLjQgOiB1X3pvb20gPCA0LjUgPyAwLjM1IDogMC4zO2Zsb2F0IGV4YWdnZXJhdGlvbj11X3pvb20gPCAxNS4wID8gKHVfem9vbS0xNS4wKSpleGFnZ2VyYXRpb25GYWN0b3IgOiAwLjA7dmVjMiBkZXJpdj12ZWMyKChjK2YrZitpKS0oYStkK2QrZyksKGcraCtoK2kpLShhK2IrYitjKSkvcG93KDIuMCxleGFnZ2VyYXRpb24rKDE5LjI1NjItdV96b29tKSk7Z2xfRnJhZ0NvbG9yPWNsYW1wKHZlYzQoZGVyaXYueC8yLjArMC41LGRlcml2LnkvMi4wKzAuNSwxLjAsMS4wKSwwLjAsMS4wKTtcXG4jaWZkZWYgT1ZFUkRSQVdfSU5TUEVDVE9SXFxuZ2xfRnJhZ0NvbG9yPXZlYzQoMS4wKTtcXG4jZW5kaWZcXG59XCIsIFwidW5pZm9ybSBtYXQ0IHVfbWF0cml4O3VuaWZvcm0gdmVjMiB1X2RpbWVuc2lvbjthdHRyaWJ1dGUgdmVjMiBhX3BvczthdHRyaWJ1dGUgdmVjMiBhX3RleHR1cmVfcG9zO3ZhcnlpbmcgdmVjMiB2X3Bvczt2b2lkIG1haW4oKSB7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcywwLDEpO2hpZ2hwIHZlYzIgZXBzaWxvbj0xLjAvdV9kaW1lbnNpb247ZmxvYXQgc2NhbGU9KHVfZGltZW5zaW9uLngtMi4wKS91X2RpbWVuc2lvbi54O3ZfcG9zPShhX3RleHR1cmVfcG9zLzgxOTIuMCkqc2NhbGUrZXBzaWxvbjt9XCIpLFxuICAgICAgICBsaSA9IGdpKFwidW5pZm9ybSBzYW1wbGVyMkQgdV9pbWFnZTt2YXJ5aW5nIHZlYzIgdl9wb3M7dW5pZm9ybSB2ZWMyIHVfbGF0cmFuZ2U7dW5pZm9ybSB2ZWMyIHVfbGlnaHQ7dW5pZm9ybSB2ZWM0IHVfc2hhZG93O3VuaWZvcm0gdmVjNCB1X2hpZ2hsaWdodDt1bmlmb3JtIHZlYzQgdV9hY2NlbnQ7XFxuI2RlZmluZSBQSSAzLjE0MTU5MjY1MzU4OTc5M1xcbnZvaWQgbWFpbigpIHt2ZWM0IHBpeGVsPXRleHR1cmUyRCh1X2ltYWdlLHZfcG9zKTt2ZWMyIGRlcml2PSgocGl4ZWwucmcqMi4wKS0xLjApO2Zsb2F0IHNjYWxlRmFjdG9yPWNvcyhyYWRpYW5zKCh1X2xhdHJhbmdlWzBdLXVfbGF0cmFuZ2VbMV0pKigxLjAtdl9wb3MueSkrdV9sYXRyYW5nZVsxXSkpO2Zsb2F0IHNsb3BlPWF0YW4oMS4yNSpsZW5ndGgoZGVyaXYpL3NjYWxlRmFjdG9yKTtmbG9hdCBhc3BlY3Q9ZGVyaXYueCAhPTAuMCA/IGF0YW4oZGVyaXYueSwtZGVyaXYueCkgOiBQSS8yLjAqKGRlcml2LnkgPiAwLjAgPyAxLjAgOi0xLjApO2Zsb2F0IGludGVuc2l0eT11X2xpZ2h0Lng7ZmxvYXQgYXppbXV0aD11X2xpZ2h0LnkrUEk7ZmxvYXQgYmFzZT0xLjg3NS1pbnRlbnNpdHkqMS43NTtmbG9hdCBtYXhWYWx1ZT0wLjUqUEk7ZmxvYXQgc2NhbGVkU2xvcGU9aW50ZW5zaXR5ICE9MC41ID8gKChwb3coYmFzZSxzbG9wZSktMS4wKS8ocG93KGJhc2UsbWF4VmFsdWUpLTEuMCkpKm1heFZhbHVlIDogc2xvcGU7ZmxvYXQgYWNjZW50PWNvcyhzY2FsZWRTbG9wZSk7dmVjNCBhY2NlbnRfY29sb3I9KDEuMC1hY2NlbnQpKnVfYWNjZW50KmNsYW1wKGludGVuc2l0eSoyLjAsMC4wLDEuMCk7ZmxvYXQgc2hhZGU9YWJzKG1vZCgoYXNwZWN0K2F6aW11dGgpL1BJKzAuNSwyLjApLTEuMCk7dmVjNCBzaGFkZV9jb2xvcj1taXgodV9zaGFkb3csdV9oaWdobGlnaHQsc2hhZGUpKnNpbihzY2FsZWRTbG9wZSkqY2xhbXAoaW50ZW5zaXR5KjIuMCwwLjAsMS4wKTtnbF9GcmFnQ29sb3I9YWNjZW50X2NvbG9yKigxLjAtc2hhZGVfY29sb3IuYSkrc2hhZGVfY29sb3I7XFxuI2lmZGVmIE9WRVJEUkFXX0lOU1BFQ1RPUlxcbmdsX0ZyYWdDb2xvcj12ZWM0KDEuMCk7XFxuI2VuZGlmXFxufVwiLCBcInVuaWZvcm0gbWF0NCB1X21hdHJpeDthdHRyaWJ1dGUgdmVjMiBhX3BvczthdHRyaWJ1dGUgdmVjMiBhX3RleHR1cmVfcG9zO3ZhcnlpbmcgdmVjMiB2X3Bvczt2b2lkIG1haW4oKSB7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcywwLDEpO3ZfcG9zPWFfdGV4dHVyZV9wb3MvODE5Mi4wO31cIiksXG4gICAgICAgIGNpID0gZ2koXCJ1bmlmb3JtIGxvd3AgZmxvYXQgdV9kZXZpY2VfcGl4ZWxfcmF0aW87dmFyeWluZyB2ZWMyIHZfd2lkdGgyO3ZhcnlpbmcgdmVjMiB2X25vcm1hbDt2YXJ5aW5nIGZsb2F0IHZfZ2FtbWFfc2NhbGU7XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBoaWdocCB2ZWM0IGNvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IGJsdXJcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgb3BhY2l0eVxcbnZvaWQgbWFpbigpIHtcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBoaWdocCB2ZWM0IGNvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBibHVyXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBvcGFjaXR5XFxuZmxvYXQgZGlzdD1sZW5ndGgodl9ub3JtYWwpKnZfd2lkdGgyLnM7ZmxvYXQgYmx1cjI9KGJsdXIrMS4wL3VfZGV2aWNlX3BpeGVsX3JhdGlvKSp2X2dhbW1hX3NjYWxlO2Zsb2F0IGFscGhhPWNsYW1wKG1pbihkaXN0LSh2X3dpZHRoMi50LWJsdXIyKSx2X3dpZHRoMi5zLWRpc3QpL2JsdXIyLDAuMCwxLjApO2dsX0ZyYWdDb2xvcj1jb2xvciooYWxwaGEqb3BhY2l0eSk7XFxuI2lmZGVmIE9WRVJEUkFXX0lOU1BFQ1RPUlxcbmdsX0ZyYWdDb2xvcj12ZWM0KDEuMCk7XFxuI2VuZGlmXFxufVwiLCBcIlxcbiNkZWZpbmUgc2NhbGUgMC4wMTU4NzMwMTZcXG5hdHRyaWJ1dGUgdmVjMiBhX3Bvc19ub3JtYWw7YXR0cmlidXRlIHZlYzQgYV9kYXRhO3VuaWZvcm0gbWF0NCB1X21hdHJpeDt1bmlmb3JtIG1lZGl1bXAgZmxvYXQgdV9yYXRpbzt1bmlmb3JtIHZlYzIgdV91bml0c190b19waXhlbHM7dW5pZm9ybSBsb3dwIGZsb2F0IHVfZGV2aWNlX3BpeGVsX3JhdGlvO3ZhcnlpbmcgdmVjMiB2X25vcm1hbDt2YXJ5aW5nIHZlYzIgdl93aWR0aDI7dmFyeWluZyBmbG9hdCB2X2dhbW1hX3NjYWxlO3ZhcnlpbmcgaGlnaHAgZmxvYXQgdl9saW5lc29mYXI7XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBoaWdocCB2ZWM0IGNvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IGJsdXJcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgb3BhY2l0eVxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbWVkaXVtcCBmbG9hdCBnYXB3aWR0aFxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvZmZzZXRcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIG1lZGl1bXAgZmxvYXQgd2lkdGhcXG52b2lkIG1haW4oKSB7XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgaGlnaHAgdmVjNCBjb2xvclxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgYmx1clxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgb3BhY2l0eVxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIG1lZGl1bXAgZmxvYXQgZ2Fwd2lkdGhcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IG9mZnNldFxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIG1lZGl1bXAgZmxvYXQgd2lkdGhcXG5mbG9hdCBBTlRJQUxJQVNJTkc9MS4wL3VfZGV2aWNlX3BpeGVsX3JhdGlvLzIuMDt2ZWMyIGFfZXh0cnVkZT1hX2RhdGEueHktMTI4LjA7ZmxvYXQgYV9kaXJlY3Rpb249bW9kKGFfZGF0YS56LDQuMCktMS4wO3ZfbGluZXNvZmFyPShmbG9vcihhX2RhdGEuei80LjApK2FfZGF0YS53KjY0LjApKjIuMDt2ZWMyIHBvcz1mbG9vcihhX3Bvc19ub3JtYWwqMC41KTttZWRpdW1wIHZlYzIgbm9ybWFsPWFfcG9zX25vcm1hbC0yLjAqcG9zO25vcm1hbC55PW5vcm1hbC55KjIuMC0xLjA7dl9ub3JtYWw9bm9ybWFsO2dhcHdpZHRoPWdhcHdpZHRoLzIuMDtmbG9hdCBoYWxmd2lkdGg9d2lkdGgvMi4wO29mZnNldD0tMS4wKm9mZnNldDtmbG9hdCBpbnNldD1nYXB3aWR0aCsoZ2Fwd2lkdGggPiAwLjAgPyBBTlRJQUxJQVNJTkcgOiAwLjApO2Zsb2F0IG91dHNldD1nYXB3aWR0aCtoYWxmd2lkdGgqKGdhcHdpZHRoID4gMC4wID8gMi4wIDogMS4wKSsoaGFsZndpZHRoPT0wLjAgPyAwLjAgOiBBTlRJQUxJQVNJTkcpO21lZGl1bXAgdmVjMiBkaXN0PW91dHNldCphX2V4dHJ1ZGUqc2NhbGU7bWVkaXVtcCBmbG9hdCB1PTAuNSphX2RpcmVjdGlvbjttZWRpdW1wIGZsb2F0IHQ9MS4wLWFicyh1KTttZWRpdW1wIHZlYzIgb2Zmc2V0Mj1vZmZzZXQqYV9leHRydWRlKnNjYWxlKm5vcm1hbC55Km1hdDIodCwtdSx1LHQpO3ZlYzQgcHJvamVjdGVkX2V4dHJ1ZGU9dV9tYXRyaXgqdmVjNChkaXN0L3VfcmF0aW8sMC4wLDAuMCk7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChwb3Mrb2Zmc2V0Mi91X3JhdGlvLDAuMCwxLjApK3Byb2plY3RlZF9leHRydWRlO2Zsb2F0IGV4dHJ1ZGVfbGVuZ3RoX3dpdGhvdXRfcGVyc3BlY3RpdmU9bGVuZ3RoKGRpc3QpO2Zsb2F0IGV4dHJ1ZGVfbGVuZ3RoX3dpdGhfcGVyc3BlY3RpdmU9bGVuZ3RoKHByb2plY3RlZF9leHRydWRlLnh5L2dsX1Bvc2l0aW9uLncqdV91bml0c190b19waXhlbHMpO3ZfZ2FtbWFfc2NhbGU9ZXh0cnVkZV9sZW5ndGhfd2l0aG91dF9wZXJzcGVjdGl2ZS9leHRydWRlX2xlbmd0aF93aXRoX3BlcnNwZWN0aXZlO3Zfd2lkdGgyPXZlYzIob3V0c2V0LGluc2V0KTt9XCIpLFxuICAgICAgICB1aSA9IGdpKFwidW5pZm9ybSBsb3dwIGZsb2F0IHVfZGV2aWNlX3BpeGVsX3JhdGlvO3VuaWZvcm0gc2FtcGxlcjJEIHVfaW1hZ2U7dmFyeWluZyB2ZWMyIHZfd2lkdGgyO3ZhcnlpbmcgdmVjMiB2X25vcm1hbDt2YXJ5aW5nIGZsb2F0IHZfZ2FtbWFfc2NhbGU7dmFyeWluZyBoaWdocCB2ZWMyIHZfdXY7XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IGJsdXJcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgb3BhY2l0eVxcbnZvaWQgbWFpbigpIHtcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IGJsdXJcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG5mbG9hdCBkaXN0PWxlbmd0aCh2X25vcm1hbCkqdl93aWR0aDIucztmbG9hdCBibHVyMj0oYmx1cisxLjAvdV9kZXZpY2VfcGl4ZWxfcmF0aW8pKnZfZ2FtbWFfc2NhbGU7ZmxvYXQgYWxwaGE9Y2xhbXAobWluKGRpc3QtKHZfd2lkdGgyLnQtYmx1cjIpLHZfd2lkdGgyLnMtZGlzdCkvYmx1cjIsMC4wLDEuMCk7dmVjNCBjb2xvcj10ZXh0dXJlMkQodV9pbWFnZSx2X3V2KTtnbF9GcmFnQ29sb3I9Y29sb3IqKGFscGhhKm9wYWNpdHkpO1xcbiNpZmRlZiBPVkVSRFJBV19JTlNQRUNUT1JcXG5nbF9GcmFnQ29sb3I9dmVjNCgxLjApO1xcbiNlbmRpZlxcbn1cIiwgXCJcXG4jZGVmaW5lIHNjYWxlIDAuMDE1ODczMDE2XFxuYXR0cmlidXRlIHZlYzIgYV9wb3Nfbm9ybWFsO2F0dHJpYnV0ZSB2ZWM0IGFfZGF0YTthdHRyaWJ1dGUgZmxvYXQgYV91dl94O2F0dHJpYnV0ZSBmbG9hdCBhX3NwbGl0X2luZGV4O3VuaWZvcm0gbWF0NCB1X21hdHJpeDt1bmlmb3JtIG1lZGl1bXAgZmxvYXQgdV9yYXRpbzt1bmlmb3JtIGxvd3AgZmxvYXQgdV9kZXZpY2VfcGl4ZWxfcmF0aW87dW5pZm9ybSB2ZWMyIHVfdW5pdHNfdG9fcGl4ZWxzO3VuaWZvcm0gZmxvYXQgdV9pbWFnZV9oZWlnaHQ7dmFyeWluZyB2ZWMyIHZfbm9ybWFsO3ZhcnlpbmcgdmVjMiB2X3dpZHRoMjt2YXJ5aW5nIGZsb2F0IHZfZ2FtbWFfc2NhbGU7dmFyeWluZyBoaWdocCB2ZWMyIHZfdXY7XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IGJsdXJcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgb3BhY2l0eVxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbWVkaXVtcCBmbG9hdCBnYXB3aWR0aFxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvZmZzZXRcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIG1lZGl1bXAgZmxvYXQgd2lkdGhcXG52b2lkIG1haW4oKSB7XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBibHVyXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBvcGFjaXR5XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbWVkaXVtcCBmbG9hdCBnYXB3aWR0aFxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgb2Zmc2V0XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbWVkaXVtcCBmbG9hdCB3aWR0aFxcbmZsb2F0IEFOVElBTElBU0lORz0xLjAvdV9kZXZpY2VfcGl4ZWxfcmF0aW8vMi4wO3ZlYzIgYV9leHRydWRlPWFfZGF0YS54eS0xMjguMDtmbG9hdCBhX2RpcmVjdGlvbj1tb2QoYV9kYXRhLnosNC4wKS0xLjA7aGlnaHAgZmxvYXQgdGV4ZWxfaGVpZ2h0PTEuMC91X2ltYWdlX2hlaWdodDtoaWdocCBmbG9hdCBoYWxmX3RleGVsX2hlaWdodD0wLjUqdGV4ZWxfaGVpZ2h0O3ZfdXY9dmVjMihhX3V2X3gsYV9zcGxpdF9pbmRleCp0ZXhlbF9oZWlnaHQtaGFsZl90ZXhlbF9oZWlnaHQpO3ZlYzIgcG9zPWZsb29yKGFfcG9zX25vcm1hbCowLjUpO21lZGl1bXAgdmVjMiBub3JtYWw9YV9wb3Nfbm9ybWFsLTIuMCpwb3M7bm9ybWFsLnk9bm9ybWFsLnkqMi4wLTEuMDt2X25vcm1hbD1ub3JtYWw7Z2Fwd2lkdGg9Z2Fwd2lkdGgvMi4wO2Zsb2F0IGhhbGZ3aWR0aD13aWR0aC8yLjA7b2Zmc2V0PS0xLjAqb2Zmc2V0O2Zsb2F0IGluc2V0PWdhcHdpZHRoKyhnYXB3aWR0aCA+IDAuMCA/IEFOVElBTElBU0lORyA6IDAuMCk7ZmxvYXQgb3V0c2V0PWdhcHdpZHRoK2hhbGZ3aWR0aCooZ2Fwd2lkdGggPiAwLjAgPyAyLjAgOiAxLjApKyhoYWxmd2lkdGg9PTAuMCA/IDAuMCA6IEFOVElBTElBU0lORyk7bWVkaXVtcCB2ZWMyIGRpc3Q9b3V0c2V0KmFfZXh0cnVkZSpzY2FsZTttZWRpdW1wIGZsb2F0IHU9MC41KmFfZGlyZWN0aW9uO21lZGl1bXAgZmxvYXQgdD0xLjAtYWJzKHUpO21lZGl1bXAgdmVjMiBvZmZzZXQyPW9mZnNldCphX2V4dHJ1ZGUqc2NhbGUqbm9ybWFsLnkqbWF0Mih0LC11LHUsdCk7dmVjNCBwcm9qZWN0ZWRfZXh0cnVkZT11X21hdHJpeCp2ZWM0KGRpc3QvdV9yYXRpbywwLjAsMC4wKTtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KHBvcytvZmZzZXQyL3VfcmF0aW8sMC4wLDEuMCkrcHJvamVjdGVkX2V4dHJ1ZGU7ZmxvYXQgZXh0cnVkZV9sZW5ndGhfd2l0aG91dF9wZXJzcGVjdGl2ZT1sZW5ndGgoZGlzdCk7ZmxvYXQgZXh0cnVkZV9sZW5ndGhfd2l0aF9wZXJzcGVjdGl2ZT1sZW5ndGgocHJvamVjdGVkX2V4dHJ1ZGUueHkvZ2xfUG9zaXRpb24udyp1X3VuaXRzX3RvX3BpeGVscyk7dl9nYW1tYV9zY2FsZT1leHRydWRlX2xlbmd0aF93aXRob3V0X3BlcnNwZWN0aXZlL2V4dHJ1ZGVfbGVuZ3RoX3dpdGhfcGVyc3BlY3RpdmU7dl93aWR0aDI9dmVjMihvdXRzZXQsaW5zZXQpO31cIiksXG4gICAgICAgIGhpID0gZ2koXCJ1bmlmb3JtIGxvd3AgZmxvYXQgdV9kZXZpY2VfcGl4ZWxfcmF0aW87dW5pZm9ybSB2ZWMyIHVfdGV4c2l6ZTt1bmlmb3JtIGZsb2F0IHVfZmFkZTt1bmlmb3JtIG1lZGl1bXAgdmVjMyB1X3NjYWxlO3VuaWZvcm0gc2FtcGxlcjJEIHVfaW1hZ2U7dmFyeWluZyB2ZWMyIHZfbm9ybWFsO3ZhcnlpbmcgdmVjMiB2X3dpZHRoMjt2YXJ5aW5nIGZsb2F0IHZfbGluZXNvZmFyO3ZhcnlpbmcgZmxvYXQgdl9nYW1tYV9zY2FsZTt2YXJ5aW5nIGZsb2F0IHZfd2lkdGg7XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIHZlYzQgcGF0dGVybl9mcm9tXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIHZlYzQgcGF0dGVybl90b1xcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBwaXhlbF9yYXRpb19mcm9tXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IHBpeGVsX3JhdGlvX3RvXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IGJsdXJcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgb3BhY2l0eVxcbnZvaWQgbWFpbigpIHtcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBtZWRpdW1wIHZlYzQgcGF0dGVybl9mcm9tXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbWVkaXVtcCB2ZWM0IHBhdHRlcm5fdG9cXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IHBpeGVsX3JhdGlvX2Zyb21cXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IHBpeGVsX3JhdGlvX3RvXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBibHVyXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBvcGFjaXR5XFxudmVjMiBwYXR0ZXJuX3RsX2E9cGF0dGVybl9mcm9tLnh5O3ZlYzIgcGF0dGVybl9icl9hPXBhdHRlcm5fZnJvbS56dzt2ZWMyIHBhdHRlcm5fdGxfYj1wYXR0ZXJuX3RvLnh5O3ZlYzIgcGF0dGVybl9icl9iPXBhdHRlcm5fdG8uenc7ZmxvYXQgdGlsZVpvb21SYXRpbz11X3NjYWxlLng7ZmxvYXQgZnJvbVNjYWxlPXVfc2NhbGUueTtmbG9hdCB0b1NjYWxlPXVfc2NhbGUuejt2ZWMyIGRpc3BsYXlfc2l6ZV9hPShwYXR0ZXJuX2JyX2EtcGF0dGVybl90bF9hKS9waXhlbF9yYXRpb19mcm9tO3ZlYzIgZGlzcGxheV9zaXplX2I9KHBhdHRlcm5fYnJfYi1wYXR0ZXJuX3RsX2IpL3BpeGVsX3JhdGlvX3RvO3ZlYzIgcGF0dGVybl9zaXplX2E9dmVjMihkaXNwbGF5X3NpemVfYS54KmZyb21TY2FsZS90aWxlWm9vbVJhdGlvLGRpc3BsYXlfc2l6ZV9hLnkpO3ZlYzIgcGF0dGVybl9zaXplX2I9dmVjMihkaXNwbGF5X3NpemVfYi54KnRvU2NhbGUvdGlsZVpvb21SYXRpbyxkaXNwbGF5X3NpemVfYi55KTtmbG9hdCBhc3BlY3RfYT1kaXNwbGF5X3NpemVfYS55L3Zfd2lkdGg7ZmxvYXQgYXNwZWN0X2I9ZGlzcGxheV9zaXplX2IueS92X3dpZHRoO2Zsb2F0IGRpc3Q9bGVuZ3RoKHZfbm9ybWFsKSp2X3dpZHRoMi5zO2Zsb2F0IGJsdXIyPShibHVyKzEuMC91X2RldmljZV9waXhlbF9yYXRpbykqdl9nYW1tYV9zY2FsZTtmbG9hdCBhbHBoYT1jbGFtcChtaW4oZGlzdC0odl93aWR0aDIudC1ibHVyMiksdl93aWR0aDIucy1kaXN0KS9ibHVyMiwwLjAsMS4wKTtmbG9hdCB4X2E9bW9kKHZfbGluZXNvZmFyL3BhdHRlcm5fc2l6ZV9hLngqYXNwZWN0X2EsMS4wKTtmbG9hdCB4X2I9bW9kKHZfbGluZXNvZmFyL3BhdHRlcm5fc2l6ZV9iLngqYXNwZWN0X2IsMS4wKTtmbG9hdCB5PTAuNSp2X25vcm1hbC55KzAuNTt2ZWMyIHRleGVsX3NpemU9MS4wL3VfdGV4c2l6ZTt2ZWMyIHBvc19hPW1peChwYXR0ZXJuX3RsX2EqdGV4ZWxfc2l6ZS10ZXhlbF9zaXplLHBhdHRlcm5fYnJfYSp0ZXhlbF9zaXplK3RleGVsX3NpemUsdmVjMih4X2EseSkpO3ZlYzIgcG9zX2I9bWl4KHBhdHRlcm5fdGxfYip0ZXhlbF9zaXplLXRleGVsX3NpemUscGF0dGVybl9icl9iKnRleGVsX3NpemUrdGV4ZWxfc2l6ZSx2ZWMyKHhfYix5KSk7dmVjNCBjb2xvcj1taXgodGV4dHVyZTJEKHVfaW1hZ2UscG9zX2EpLHRleHR1cmUyRCh1X2ltYWdlLHBvc19iKSx1X2ZhZGUpO2dsX0ZyYWdDb2xvcj1jb2xvciphbHBoYSpvcGFjaXR5O1xcbiNpZmRlZiBPVkVSRFJBV19JTlNQRUNUT1JcXG5nbF9GcmFnQ29sb3I9dmVjNCgxLjApO1xcbiNlbmRpZlxcbn1cIiwgXCJcXG4jZGVmaW5lIHNjYWxlIDAuMDE1ODczMDE2XFxuI2RlZmluZSBMSU5FX0RJU1RBTkNFX1NDQUxFIDIuMFxcbmF0dHJpYnV0ZSB2ZWMyIGFfcG9zX25vcm1hbDthdHRyaWJ1dGUgdmVjNCBhX2RhdGE7dW5pZm9ybSBtYXQ0IHVfbWF0cml4O3VuaWZvcm0gdmVjMiB1X3VuaXRzX3RvX3BpeGVsczt1bmlmb3JtIG1lZGl1bXAgZmxvYXQgdV9yYXRpbzt1bmlmb3JtIGxvd3AgZmxvYXQgdV9kZXZpY2VfcGl4ZWxfcmF0aW87dmFyeWluZyB2ZWMyIHZfbm9ybWFsO3ZhcnlpbmcgdmVjMiB2X3dpZHRoMjt2YXJ5aW5nIGZsb2F0IHZfbGluZXNvZmFyO3ZhcnlpbmcgZmxvYXQgdl9nYW1tYV9zY2FsZTt2YXJ5aW5nIGZsb2F0IHZfd2lkdGg7XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IGJsdXJcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgb3BhY2l0eVxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvZmZzZXRcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIG1lZGl1bXAgZmxvYXQgZ2Fwd2lkdGhcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIG1lZGl1bXAgZmxvYXQgd2lkdGhcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgZmxvb3J3aWR0aFxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCB2ZWM0IHBhdHRlcm5fZnJvbVxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCB2ZWM0IHBhdHRlcm5fdG9cXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgcGl4ZWxfcmF0aW9fZnJvbVxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBwaXhlbF9yYXRpb190b1xcbnZvaWQgbWFpbigpIHtcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IGJsdXJcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IG9mZnNldFxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIG1lZGl1bXAgZmxvYXQgZ2Fwd2lkdGhcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBtZWRpdW1wIGZsb2F0IHdpZHRoXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBmbG9vcndpZHRoXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbWVkaXVtcCB2ZWM0IHBhdHRlcm5fZnJvbVxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIG1lZGl1bXAgdmVjNCBwYXR0ZXJuX3RvXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBwaXhlbF9yYXRpb19mcm9tXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBwaXhlbF9yYXRpb190b1xcbmZsb2F0IEFOVElBTElBU0lORz0xLjAvdV9kZXZpY2VfcGl4ZWxfcmF0aW8vMi4wO3ZlYzIgYV9leHRydWRlPWFfZGF0YS54eS0xMjguMDtmbG9hdCBhX2RpcmVjdGlvbj1tb2QoYV9kYXRhLnosNC4wKS0xLjA7ZmxvYXQgYV9saW5lc29mYXI9KGZsb29yKGFfZGF0YS56LzQuMCkrYV9kYXRhLncqNjQuMCkqTElORV9ESVNUQU5DRV9TQ0FMRTt2ZWMyIHBvcz1mbG9vcihhX3Bvc19ub3JtYWwqMC41KTttZWRpdW1wIHZlYzIgbm9ybWFsPWFfcG9zX25vcm1hbC0yLjAqcG9zO25vcm1hbC55PW5vcm1hbC55KjIuMC0xLjA7dl9ub3JtYWw9bm9ybWFsO2dhcHdpZHRoPWdhcHdpZHRoLzIuMDtmbG9hdCBoYWxmd2lkdGg9d2lkdGgvMi4wO29mZnNldD0tMS4wKm9mZnNldDtmbG9hdCBpbnNldD1nYXB3aWR0aCsoZ2Fwd2lkdGggPiAwLjAgPyBBTlRJQUxJQVNJTkcgOiAwLjApO2Zsb2F0IG91dHNldD1nYXB3aWR0aCtoYWxmd2lkdGgqKGdhcHdpZHRoID4gMC4wID8gMi4wIDogMS4wKSsoaGFsZndpZHRoPT0wLjAgPyAwLjAgOiBBTlRJQUxJQVNJTkcpO21lZGl1bXAgdmVjMiBkaXN0PW91dHNldCphX2V4dHJ1ZGUqc2NhbGU7bWVkaXVtcCBmbG9hdCB1PTAuNSphX2RpcmVjdGlvbjttZWRpdW1wIGZsb2F0IHQ9MS4wLWFicyh1KTttZWRpdW1wIHZlYzIgb2Zmc2V0Mj1vZmZzZXQqYV9leHRydWRlKnNjYWxlKm5vcm1hbC55Km1hdDIodCwtdSx1LHQpO3ZlYzQgcHJvamVjdGVkX2V4dHJ1ZGU9dV9tYXRyaXgqdmVjNChkaXN0L3VfcmF0aW8sMC4wLDAuMCk7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChwb3Mrb2Zmc2V0Mi91X3JhdGlvLDAuMCwxLjApK3Byb2plY3RlZF9leHRydWRlO2Zsb2F0IGV4dHJ1ZGVfbGVuZ3RoX3dpdGhvdXRfcGVyc3BlY3RpdmU9bGVuZ3RoKGRpc3QpO2Zsb2F0IGV4dHJ1ZGVfbGVuZ3RoX3dpdGhfcGVyc3BlY3RpdmU9bGVuZ3RoKHByb2plY3RlZF9leHRydWRlLnh5L2dsX1Bvc2l0aW9uLncqdV91bml0c190b19waXhlbHMpO3ZfZ2FtbWFfc2NhbGU9ZXh0cnVkZV9sZW5ndGhfd2l0aG91dF9wZXJzcGVjdGl2ZS9leHRydWRlX2xlbmd0aF93aXRoX3BlcnNwZWN0aXZlO3ZfbGluZXNvZmFyPWFfbGluZXNvZmFyO3Zfd2lkdGgyPXZlYzIob3V0c2V0LGluc2V0KTt2X3dpZHRoPWZsb29yd2lkdGg7fVwiKSxcbiAgICAgICAgcGkgPSBnaShcInVuaWZvcm0gbG93cCBmbG9hdCB1X2RldmljZV9waXhlbF9yYXRpbzt1bmlmb3JtIHNhbXBsZXIyRCB1X2ltYWdlO3VuaWZvcm0gZmxvYXQgdV9zZGZnYW1tYTt1bmlmb3JtIGZsb2F0IHVfbWl4O3ZhcnlpbmcgdmVjMiB2X25vcm1hbDt2YXJ5aW5nIHZlYzIgdl93aWR0aDI7dmFyeWluZyB2ZWMyIHZfdGV4X2E7dmFyeWluZyB2ZWMyIHZfdGV4X2I7dmFyeWluZyBmbG9hdCB2X2dhbW1hX3NjYWxlO1xcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgaGlnaHAgdmVjNCBjb2xvclxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBibHVyXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIG1lZGl1bXAgZmxvYXQgd2lkdGhcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgZmxvb3J3aWR0aFxcbnZvaWQgbWFpbigpIHtcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBoaWdocCB2ZWM0IGNvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBibHVyXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBvcGFjaXR5XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbWVkaXVtcCBmbG9hdCB3aWR0aFxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgZmxvb3J3aWR0aFxcbmZsb2F0IGRpc3Q9bGVuZ3RoKHZfbm9ybWFsKSp2X3dpZHRoMi5zO2Zsb2F0IGJsdXIyPShibHVyKzEuMC91X2RldmljZV9waXhlbF9yYXRpbykqdl9nYW1tYV9zY2FsZTtmbG9hdCBhbHBoYT1jbGFtcChtaW4oZGlzdC0odl93aWR0aDIudC1ibHVyMiksdl93aWR0aDIucy1kaXN0KS9ibHVyMiwwLjAsMS4wKTtmbG9hdCBzZGZkaXN0X2E9dGV4dHVyZTJEKHVfaW1hZ2Usdl90ZXhfYSkuYTtmbG9hdCBzZGZkaXN0X2I9dGV4dHVyZTJEKHVfaW1hZ2Usdl90ZXhfYikuYTtmbG9hdCBzZGZkaXN0PW1peChzZGZkaXN0X2Esc2RmZGlzdF9iLHVfbWl4KTthbHBoYSo9c21vb3Roc3RlcCgwLjUtdV9zZGZnYW1tYS9mbG9vcndpZHRoLDAuNSt1X3NkZmdhbW1hL2Zsb29yd2lkdGgsc2RmZGlzdCk7Z2xfRnJhZ0NvbG9yPWNvbG9yKihhbHBoYSpvcGFjaXR5KTtcXG4jaWZkZWYgT1ZFUkRSQVdfSU5TUEVDVE9SXFxuZ2xfRnJhZ0NvbG9yPXZlYzQoMS4wKTtcXG4jZW5kaWZcXG59XCIsIFwiXFxuI2RlZmluZSBzY2FsZSAwLjAxNTg3MzAxNlxcbiNkZWZpbmUgTElORV9ESVNUQU5DRV9TQ0FMRSAyLjBcXG5hdHRyaWJ1dGUgdmVjMiBhX3Bvc19ub3JtYWw7YXR0cmlidXRlIHZlYzQgYV9kYXRhO3VuaWZvcm0gbWF0NCB1X21hdHJpeDt1bmlmb3JtIG1lZGl1bXAgZmxvYXQgdV9yYXRpbzt1bmlmb3JtIGxvd3AgZmxvYXQgdV9kZXZpY2VfcGl4ZWxfcmF0aW87dW5pZm9ybSB2ZWMyIHVfcGF0dGVybnNjYWxlX2E7dW5pZm9ybSBmbG9hdCB1X3RleF95X2E7dW5pZm9ybSB2ZWMyIHVfcGF0dGVybnNjYWxlX2I7dW5pZm9ybSBmbG9hdCB1X3RleF95X2I7dW5pZm9ybSB2ZWMyIHVfdW5pdHNfdG9fcGl4ZWxzO3ZhcnlpbmcgdmVjMiB2X25vcm1hbDt2YXJ5aW5nIHZlYzIgdl93aWR0aDI7dmFyeWluZyB2ZWMyIHZfdGV4X2E7dmFyeWluZyB2ZWMyIHZfdGV4X2I7dmFyeWluZyBmbG9hdCB2X2dhbW1hX3NjYWxlO1xcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgaGlnaHAgdmVjNCBjb2xvclxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBibHVyXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIG1lZGl1bXAgZmxvYXQgZ2Fwd2lkdGhcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgb2Zmc2V0XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBtZWRpdW1wIGZsb2F0IHdpZHRoXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IGZsb29yd2lkdGhcXG52b2lkIG1haW4oKSB7XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgaGlnaHAgdmVjNCBjb2xvclxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgYmx1clxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgb3BhY2l0eVxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIG1lZGl1bXAgZmxvYXQgZ2Fwd2lkdGhcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IG9mZnNldFxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIG1lZGl1bXAgZmxvYXQgd2lkdGhcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IGZsb29yd2lkdGhcXG5mbG9hdCBBTlRJQUxJQVNJTkc9MS4wL3VfZGV2aWNlX3BpeGVsX3JhdGlvLzIuMDt2ZWMyIGFfZXh0cnVkZT1hX2RhdGEueHktMTI4LjA7ZmxvYXQgYV9kaXJlY3Rpb249bW9kKGFfZGF0YS56LDQuMCktMS4wO2Zsb2F0IGFfbGluZXNvZmFyPShmbG9vcihhX2RhdGEuei80LjApK2FfZGF0YS53KjY0LjApKkxJTkVfRElTVEFOQ0VfU0NBTEU7dmVjMiBwb3M9Zmxvb3IoYV9wb3Nfbm9ybWFsKjAuNSk7bWVkaXVtcCB2ZWMyIG5vcm1hbD1hX3Bvc19ub3JtYWwtMi4wKnBvcztub3JtYWwueT1ub3JtYWwueSoyLjAtMS4wO3Zfbm9ybWFsPW5vcm1hbDtnYXB3aWR0aD1nYXB3aWR0aC8yLjA7ZmxvYXQgaGFsZndpZHRoPXdpZHRoLzIuMDtvZmZzZXQ9LTEuMCpvZmZzZXQ7ZmxvYXQgaW5zZXQ9Z2Fwd2lkdGgrKGdhcHdpZHRoID4gMC4wID8gQU5USUFMSUFTSU5HIDogMC4wKTtmbG9hdCBvdXRzZXQ9Z2Fwd2lkdGgraGFsZndpZHRoKihnYXB3aWR0aCA+IDAuMCA/IDIuMCA6IDEuMCkrKGhhbGZ3aWR0aD09MC4wID8gMC4wIDogQU5USUFMSUFTSU5HKTttZWRpdW1wIHZlYzIgZGlzdD1vdXRzZXQqYV9leHRydWRlKnNjYWxlO21lZGl1bXAgZmxvYXQgdT0wLjUqYV9kaXJlY3Rpb247bWVkaXVtcCBmbG9hdCB0PTEuMC1hYnModSk7bWVkaXVtcCB2ZWMyIG9mZnNldDI9b2Zmc2V0KmFfZXh0cnVkZSpzY2FsZSpub3JtYWwueSptYXQyKHQsLXUsdSx0KTt2ZWM0IHByb2plY3RlZF9leHRydWRlPXVfbWF0cml4KnZlYzQoZGlzdC91X3JhdGlvLDAuMCwwLjApO2dsX1Bvc2l0aW9uPXVfbWF0cml4KnZlYzQocG9zK29mZnNldDIvdV9yYXRpbywwLjAsMS4wKStwcm9qZWN0ZWRfZXh0cnVkZTtmbG9hdCBleHRydWRlX2xlbmd0aF93aXRob3V0X3BlcnNwZWN0aXZlPWxlbmd0aChkaXN0KTtmbG9hdCBleHRydWRlX2xlbmd0aF93aXRoX3BlcnNwZWN0aXZlPWxlbmd0aChwcm9qZWN0ZWRfZXh0cnVkZS54eS9nbF9Qb3NpdGlvbi53KnVfdW5pdHNfdG9fcGl4ZWxzKTt2X2dhbW1hX3NjYWxlPWV4dHJ1ZGVfbGVuZ3RoX3dpdGhvdXRfcGVyc3BlY3RpdmUvZXh0cnVkZV9sZW5ndGhfd2l0aF9wZXJzcGVjdGl2ZTt2X3RleF9hPXZlYzIoYV9saW5lc29mYXIqdV9wYXR0ZXJuc2NhbGVfYS54L2Zsb29yd2lkdGgsbm9ybWFsLnkqdV9wYXR0ZXJuc2NhbGVfYS55K3VfdGV4X3lfYSk7dl90ZXhfYj12ZWMyKGFfbGluZXNvZmFyKnVfcGF0dGVybnNjYWxlX2IueC9mbG9vcndpZHRoLG5vcm1hbC55KnVfcGF0dGVybnNjYWxlX2IueSt1X3RleF95X2IpO3Zfd2lkdGgyPXZlYzIob3V0c2V0LGluc2V0KTt9XCIpLFxuICAgICAgICBkaSA9IGdpKFwidW5pZm9ybSBmbG9hdCB1X2ZhZGVfdDt1bmlmb3JtIGZsb2F0IHVfb3BhY2l0eTt1bmlmb3JtIHNhbXBsZXIyRCB1X2ltYWdlMDt1bmlmb3JtIHNhbXBsZXIyRCB1X2ltYWdlMTt2YXJ5aW5nIHZlYzIgdl9wb3MwO3ZhcnlpbmcgdmVjMiB2X3BvczE7dW5pZm9ybSBmbG9hdCB1X2JyaWdodG5lc3NfbG93O3VuaWZvcm0gZmxvYXQgdV9icmlnaHRuZXNzX2hpZ2g7dW5pZm9ybSBmbG9hdCB1X3NhdHVyYXRpb25fZmFjdG9yO3VuaWZvcm0gZmxvYXQgdV9jb250cmFzdF9mYWN0b3I7dW5pZm9ybSB2ZWMzIHVfc3Bpbl93ZWlnaHRzO3ZvaWQgbWFpbigpIHt2ZWM0IGNvbG9yMD10ZXh0dXJlMkQodV9pbWFnZTAsdl9wb3MwKTt2ZWM0IGNvbG9yMT10ZXh0dXJlMkQodV9pbWFnZTEsdl9wb3MxKTtpZiAoY29sb3IwLmEgPiAwLjApIHtjb2xvcjAucmdiPWNvbG9yMC5yZ2IvY29sb3IwLmE7fWlmIChjb2xvcjEuYSA+IDAuMCkge2NvbG9yMS5yZ2I9Y29sb3IxLnJnYi9jb2xvcjEuYTt9dmVjNCBjb2xvcj1taXgoY29sb3IwLGNvbG9yMSx1X2ZhZGVfdCk7Y29sb3IuYSo9dV9vcGFjaXR5O3ZlYzMgcmdiPWNvbG9yLnJnYjtyZ2I9dmVjMyhkb3QocmdiLHVfc3Bpbl93ZWlnaHRzLnh5eiksZG90KHJnYix1X3NwaW5fd2VpZ2h0cy56eHkpLGRvdChyZ2IsdV9zcGluX3dlaWdodHMueXp4KSk7ZmxvYXQgYXZlcmFnZT0oY29sb3Iucitjb2xvci5nK2NvbG9yLmIpLzMuMDtyZ2IrPShhdmVyYWdlLXJnYikqdV9zYXR1cmF0aW9uX2ZhY3RvcjtyZ2I9KHJnYi0wLjUpKnVfY29udHJhc3RfZmFjdG9yKzAuNTt2ZWMzIHVfaGlnaF92ZWM9dmVjMyh1X2JyaWdodG5lc3NfbG93LHVfYnJpZ2h0bmVzc19sb3csdV9icmlnaHRuZXNzX2xvdyk7dmVjMyB1X2xvd192ZWM9dmVjMyh1X2JyaWdodG5lc3NfaGlnaCx1X2JyaWdodG5lc3NfaGlnaCx1X2JyaWdodG5lc3NfaGlnaCk7Z2xfRnJhZ0NvbG9yPXZlYzQobWl4KHVfaGlnaF92ZWMsdV9sb3dfdmVjLHJnYikqY29sb3IuYSxjb2xvci5hKTtcXG4jaWZkZWYgT1ZFUkRSQVdfSU5TUEVDVE9SXFxuZ2xfRnJhZ0NvbG9yPXZlYzQoMS4wKTtcXG4jZW5kaWZcXG59XCIsIFwidW5pZm9ybSBtYXQ0IHVfbWF0cml4O3VuaWZvcm0gdmVjMiB1X3RsX3BhcmVudDt1bmlmb3JtIGZsb2F0IHVfc2NhbGVfcGFyZW50O3VuaWZvcm0gZmxvYXQgdV9idWZmZXJfc2NhbGU7YXR0cmlidXRlIHZlYzIgYV9wb3M7YXR0cmlidXRlIHZlYzIgYV90ZXh0dXJlX3Bvczt2YXJ5aW5nIHZlYzIgdl9wb3MwO3ZhcnlpbmcgdmVjMiB2X3BvczE7dm9pZCBtYWluKCkge2dsX1Bvc2l0aW9uPXVfbWF0cml4KnZlYzQoYV9wb3MsMCwxKTt2X3BvczA9KCgoYV90ZXh0dXJlX3Bvcy84MTkyLjApLTAuNSkvdV9idWZmZXJfc2NhbGUgKSswLjU7dl9wb3MxPSh2X3BvczAqdV9zY2FsZV9wYXJlbnQpK3VfdGxfcGFyZW50O31cIiksXG4gICAgICAgIF9pID0gZ2koXCJ1bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmU7dmFyeWluZyB2ZWMyIHZfdGV4O3ZhcnlpbmcgZmxvYXQgdl9mYWRlX29wYWNpdHk7XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG52b2lkIG1haW4oKSB7XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBvcGFjaXR5XFxubG93cCBmbG9hdCBhbHBoYT1vcGFjaXR5KnZfZmFkZV9vcGFjaXR5O2dsX0ZyYWdDb2xvcj10ZXh0dXJlMkQodV90ZXh0dXJlLHZfdGV4KSphbHBoYTtcXG4jaWZkZWYgT1ZFUkRSQVdfSU5TUEVDVE9SXFxuZ2xfRnJhZ0NvbG9yPXZlYzQoMS4wKTtcXG4jZW5kaWZcXG59XCIsIFwiY29uc3QgZmxvYXQgUEk9My4xNDE1OTI2NTM1ODk3OTM7YXR0cmlidXRlIHZlYzQgYV9wb3Nfb2Zmc2V0O2F0dHJpYnV0ZSB2ZWM0IGFfZGF0YTthdHRyaWJ1dGUgdmVjNCBhX3BpeGVsb2Zmc2V0O2F0dHJpYnV0ZSB2ZWMzIGFfcHJvamVjdGVkX3BvczthdHRyaWJ1dGUgZmxvYXQgYV9mYWRlX29wYWNpdHk7dW5pZm9ybSBib29sIHVfaXNfc2l6ZV96b29tX2NvbnN0YW50O3VuaWZvcm0gYm9vbCB1X2lzX3NpemVfZmVhdHVyZV9jb25zdGFudDt1bmlmb3JtIGhpZ2hwIGZsb2F0IHVfc2l6ZV90O3VuaWZvcm0gaGlnaHAgZmxvYXQgdV9zaXplO3VuaWZvcm0gaGlnaHAgZmxvYXQgdV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlO3VuaWZvcm0gaGlnaHAgZmxvYXQgdV9waXRjaDt1bmlmb3JtIGJvb2wgdV9yb3RhdGVfc3ltYm9sO3VuaWZvcm0gaGlnaHAgZmxvYXQgdV9hc3BlY3RfcmF0aW87dW5pZm9ybSBmbG9hdCB1X2ZhZGVfY2hhbmdlO3VuaWZvcm0gbWF0NCB1X21hdHJpeDt1bmlmb3JtIG1hdDQgdV9sYWJlbF9wbGFuZV9tYXRyaXg7dW5pZm9ybSBtYXQ0IHVfY29vcmRfbWF0cml4O3VuaWZvcm0gYm9vbCB1X2lzX3RleHQ7dW5pZm9ybSBib29sIHVfcGl0Y2hfd2l0aF9tYXA7dW5pZm9ybSB2ZWMyIHVfdGV4c2l6ZTt2YXJ5aW5nIHZlYzIgdl90ZXg7dmFyeWluZyBmbG9hdCB2X2ZhZGVfb3BhY2l0eTtcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgb3BhY2l0eVxcbnZvaWQgbWFpbigpIHtcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG52ZWMyIGFfcG9zPWFfcG9zX29mZnNldC54eTt2ZWMyIGFfb2Zmc2V0PWFfcG9zX29mZnNldC56dzt2ZWMyIGFfdGV4PWFfZGF0YS54eTt2ZWMyIGFfc2l6ZT1hX2RhdGEuenc7ZmxvYXQgYV9zaXplX21pbj1mbG9vcihhX3NpemVbMF0qMC41KTt2ZWMyIGFfcHhvZmZzZXQ9YV9waXhlbG9mZnNldC54eTt2ZWMyIGFfbWluRm9udFNjYWxlPWFfcGl4ZWxvZmZzZXQuencvMjU2LjA7aGlnaHAgZmxvYXQgc2VnbWVudF9hbmdsZT0tYV9wcm9qZWN0ZWRfcG9zWzJdO2Zsb2F0IHNpemU7aWYgKCF1X2lzX3NpemVfem9vbV9jb25zdGFudCAmJiAhdV9pc19zaXplX2ZlYXR1cmVfY29uc3RhbnQpIHtzaXplPW1peChhX3NpemVfbWluLGFfc2l6ZVsxXSx1X3NpemVfdCkvMTI4LjA7fSBlbHNlIGlmICh1X2lzX3NpemVfem9vbV9jb25zdGFudCAmJiAhdV9pc19zaXplX2ZlYXR1cmVfY29uc3RhbnQpIHtzaXplPWFfc2l6ZV9taW4vMTI4LjA7fSBlbHNlIHtzaXplPXVfc2l6ZTt9dmVjNCBwcm9qZWN0ZWRQb2ludD11X21hdHJpeCp2ZWM0KGFfcG9zLDAsMSk7aGlnaHAgZmxvYXQgY2FtZXJhX3RvX2FuY2hvcl9kaXN0YW5jZT1wcm9qZWN0ZWRQb2ludC53O2hpZ2hwIGZsb2F0IGRpc3RhbmNlX3JhdGlvPXVfcGl0Y2hfd2l0aF9tYXAgP1xcbmNhbWVyYV90b19hbmNob3JfZGlzdGFuY2UvdV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlIDpcXG51X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UvY2FtZXJhX3RvX2FuY2hvcl9kaXN0YW5jZTtoaWdocCBmbG9hdCBwZXJzcGVjdGl2ZV9yYXRpbz1jbGFtcCgwLjUrMC41KmRpc3RhbmNlX3JhdGlvLDAuMCw0LjApO3NpemUqPXBlcnNwZWN0aXZlX3JhdGlvO2Zsb2F0IGZvbnRTY2FsZT11X2lzX3RleHQgPyBzaXplLzI0LjAgOiBzaXplO2hpZ2hwIGZsb2F0IHN5bWJvbF9yb3RhdGlvbj0wLjA7aWYgKHVfcm90YXRlX3N5bWJvbCkge3ZlYzQgb2Zmc2V0UHJvamVjdGVkUG9pbnQ9dV9tYXRyaXgqdmVjNChhX3Bvcyt2ZWMyKDEsMCksMCwxKTt2ZWMyIGE9cHJvamVjdGVkUG9pbnQueHkvcHJvamVjdGVkUG9pbnQudzt2ZWMyIGI9b2Zmc2V0UHJvamVjdGVkUG9pbnQueHkvb2Zmc2V0UHJvamVjdGVkUG9pbnQudztzeW1ib2xfcm90YXRpb249YXRhbigoYi55LWEueSkvdV9hc3BlY3RfcmF0aW8sYi54LWEueCk7fWhpZ2hwIGZsb2F0IGFuZ2xlX3Npbj1zaW4oc2VnbWVudF9hbmdsZStzeW1ib2xfcm90YXRpb24pO2hpZ2hwIGZsb2F0IGFuZ2xlX2Nvcz1jb3Moc2VnbWVudF9hbmdsZStzeW1ib2xfcm90YXRpb24pO21hdDIgcm90YXRpb25fbWF0cml4PW1hdDIoYW5nbGVfY29zLC0xLjAqYW5nbGVfc2luLGFuZ2xlX3NpbixhbmdsZV9jb3MpO3ZlYzQgcHJvamVjdGVkX3Bvcz11X2xhYmVsX3BsYW5lX21hdHJpeCp2ZWM0KGFfcHJvamVjdGVkX3Bvcy54eSwwLjAsMS4wKTtnbF9Qb3NpdGlvbj11X2Nvb3JkX21hdHJpeCp2ZWM0KHByb2plY3RlZF9wb3MueHkvcHJvamVjdGVkX3Bvcy53K3JvdGF0aW9uX21hdHJpeCooYV9vZmZzZXQvMzIuMCptYXgoYV9taW5Gb250U2NhbGUsZm9udFNjYWxlKSthX3B4b2Zmc2V0LzE2LjApLDAuMCwxLjApO3ZfdGV4PWFfdGV4L3VfdGV4c2l6ZTt2ZWMyIGZhZGVfb3BhY2l0eT11bnBhY2tfb3BhY2l0eShhX2ZhZGVfb3BhY2l0eSk7ZmxvYXQgZmFkZV9jaGFuZ2U9ZmFkZV9vcGFjaXR5WzFdID4gMC41ID8gdV9mYWRlX2NoYW5nZSA6LXVfZmFkZV9jaGFuZ2U7dl9mYWRlX29wYWNpdHk9bWF4KDAuMCxtaW4oMS4wLGZhZGVfb3BhY2l0eVswXStmYWRlX2NoYW5nZSkpO31cIiksXG4gICAgICAgIGZpID0gZ2koXCIjZGVmaW5lIFNERl9QWCA4LjBcXG51bmlmb3JtIGJvb2wgdV9pc19oYWxvO3VuaWZvcm0gc2FtcGxlcjJEIHVfdGV4dHVyZTt1bmlmb3JtIGhpZ2hwIGZsb2F0IHVfZ2FtbWFfc2NhbGU7dW5pZm9ybSBsb3dwIGZsb2F0IHVfZGV2aWNlX3BpeGVsX3JhdGlvO3VuaWZvcm0gYm9vbCB1X2lzX3RleHQ7dmFyeWluZyB2ZWMyIHZfZGF0YTA7dmFyeWluZyB2ZWMzIHZfZGF0YTE7XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBoaWdocCB2ZWM0IGZpbGxfY29sb3JcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGhpZ2hwIHZlYzQgaGFsb19jb2xvclxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvcGFjaXR5XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IGhhbG9fd2lkdGhcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgaGFsb19ibHVyXFxudm9pZCBtYWluKCkge1xcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGhpZ2hwIHZlYzQgZmlsbF9jb2xvclxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGhpZ2hwIHZlYzQgaGFsb19jb2xvclxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgb3BhY2l0eVxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgaGFsb193aWR0aFxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgaGFsb19ibHVyXFxuZmxvYXQgRURHRV9HQU1NQT0wLjEwNS91X2RldmljZV9waXhlbF9yYXRpbzt2ZWMyIHRleD12X2RhdGEwLnh5O2Zsb2F0IGdhbW1hX3NjYWxlPXZfZGF0YTEueDtmbG9hdCBzaXplPXZfZGF0YTEueTtmbG9hdCBmYWRlX29wYWNpdHk9dl9kYXRhMVsyXTtmbG9hdCBmb250U2NhbGU9dV9pc190ZXh0ID8gc2l6ZS8yNC4wIDogc2l6ZTtsb3dwIHZlYzQgY29sb3I9ZmlsbF9jb2xvcjtoaWdocCBmbG9hdCBnYW1tYT1FREdFX0dBTU1BLyhmb250U2NhbGUqdV9nYW1tYV9zY2FsZSk7bG93cCBmbG9hdCBidWZmPSgyNTYuMC02NC4wKS8yNTYuMDtpZiAodV9pc19oYWxvKSB7Y29sb3I9aGFsb19jb2xvcjtnYW1tYT0oaGFsb19ibHVyKjEuMTkvU0RGX1BYK0VER0VfR0FNTUEpLyhmb250U2NhbGUqdV9nYW1tYV9zY2FsZSk7YnVmZj0oNi4wLWhhbG9fd2lkdGgvZm9udFNjYWxlKS9TREZfUFg7fWxvd3AgZmxvYXQgZGlzdD10ZXh0dXJlMkQodV90ZXh0dXJlLHRleCkuYTtoaWdocCBmbG9hdCBnYW1tYV9zY2FsZWQ9Z2FtbWEqZ2FtbWFfc2NhbGU7aGlnaHAgZmxvYXQgYWxwaGE9c21vb3Roc3RlcChidWZmLWdhbW1hX3NjYWxlZCxidWZmK2dhbW1hX3NjYWxlZCxkaXN0KTtnbF9GcmFnQ29sb3I9Y29sb3IqKGFscGhhKm9wYWNpdHkqZmFkZV9vcGFjaXR5KTtcXG4jaWZkZWYgT1ZFUkRSQVdfSU5TUEVDVE9SXFxuZ2xfRnJhZ0NvbG9yPXZlYzQoMS4wKTtcXG4jZW5kaWZcXG59XCIsIFwiY29uc3QgZmxvYXQgUEk9My4xNDE1OTI2NTM1ODk3OTM7YXR0cmlidXRlIHZlYzQgYV9wb3Nfb2Zmc2V0O2F0dHJpYnV0ZSB2ZWM0IGFfZGF0YTthdHRyaWJ1dGUgdmVjNCBhX3BpeGVsb2Zmc2V0O2F0dHJpYnV0ZSB2ZWMzIGFfcHJvamVjdGVkX3BvczthdHRyaWJ1dGUgZmxvYXQgYV9mYWRlX29wYWNpdHk7dW5pZm9ybSBib29sIHVfaXNfc2l6ZV96b29tX2NvbnN0YW50O3VuaWZvcm0gYm9vbCB1X2lzX3NpemVfZmVhdHVyZV9jb25zdGFudDt1bmlmb3JtIGhpZ2hwIGZsb2F0IHVfc2l6ZV90O3VuaWZvcm0gaGlnaHAgZmxvYXQgdV9zaXplO3VuaWZvcm0gbWF0NCB1X21hdHJpeDt1bmlmb3JtIG1hdDQgdV9sYWJlbF9wbGFuZV9tYXRyaXg7dW5pZm9ybSBtYXQ0IHVfY29vcmRfbWF0cml4O3VuaWZvcm0gYm9vbCB1X2lzX3RleHQ7dW5pZm9ybSBib29sIHVfcGl0Y2hfd2l0aF9tYXA7dW5pZm9ybSBoaWdocCBmbG9hdCB1X3BpdGNoO3VuaWZvcm0gYm9vbCB1X3JvdGF0ZV9zeW1ib2w7dW5pZm9ybSBoaWdocCBmbG9hdCB1X2FzcGVjdF9yYXRpbzt1bmlmb3JtIGhpZ2hwIGZsb2F0IHVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZTt1bmlmb3JtIGZsb2F0IHVfZmFkZV9jaGFuZ2U7dW5pZm9ybSB2ZWMyIHVfdGV4c2l6ZTt2YXJ5aW5nIHZlYzIgdl9kYXRhMDt2YXJ5aW5nIHZlYzMgdl9kYXRhMTtcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGhpZ2hwIHZlYzQgZmlsbF9jb2xvclxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgaGlnaHAgdmVjNCBoYWxvX2NvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgaGFsb193aWR0aFxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBoYWxvX2JsdXJcXG52b2lkIG1haW4oKSB7XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgaGlnaHAgdmVjNCBmaWxsX2NvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgaGlnaHAgdmVjNCBoYWxvX2NvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBvcGFjaXR5XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBoYWxvX3dpZHRoXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBoYWxvX2JsdXJcXG52ZWMyIGFfcG9zPWFfcG9zX29mZnNldC54eTt2ZWMyIGFfb2Zmc2V0PWFfcG9zX29mZnNldC56dzt2ZWMyIGFfdGV4PWFfZGF0YS54eTt2ZWMyIGFfc2l6ZT1hX2RhdGEuenc7ZmxvYXQgYV9zaXplX21pbj1mbG9vcihhX3NpemVbMF0qMC41KTt2ZWMyIGFfcHhvZmZzZXQ9YV9waXhlbG9mZnNldC54eTtoaWdocCBmbG9hdCBzZWdtZW50X2FuZ2xlPS1hX3Byb2plY3RlZF9wb3NbMl07ZmxvYXQgc2l6ZTtpZiAoIXVfaXNfc2l6ZV96b29tX2NvbnN0YW50ICYmICF1X2lzX3NpemVfZmVhdHVyZV9jb25zdGFudCkge3NpemU9bWl4KGFfc2l6ZV9taW4sYV9zaXplWzFdLHVfc2l6ZV90KS8xMjguMDt9IGVsc2UgaWYgKHVfaXNfc2l6ZV96b29tX2NvbnN0YW50ICYmICF1X2lzX3NpemVfZmVhdHVyZV9jb25zdGFudCkge3NpemU9YV9zaXplX21pbi8xMjguMDt9IGVsc2Uge3NpemU9dV9zaXplO312ZWM0IHByb2plY3RlZFBvaW50PXVfbWF0cml4KnZlYzQoYV9wb3MsMCwxKTtoaWdocCBmbG9hdCBjYW1lcmFfdG9fYW5jaG9yX2Rpc3RhbmNlPXByb2plY3RlZFBvaW50Lnc7aGlnaHAgZmxvYXQgZGlzdGFuY2VfcmF0aW89dV9waXRjaF93aXRoX21hcCA/XFxuY2FtZXJhX3RvX2FuY2hvcl9kaXN0YW5jZS91X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UgOlxcbnVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZS9jYW1lcmFfdG9fYW5jaG9yX2Rpc3RhbmNlO2hpZ2hwIGZsb2F0IHBlcnNwZWN0aXZlX3JhdGlvPWNsYW1wKDAuNSswLjUqZGlzdGFuY2VfcmF0aW8sMC4wLDQuMCk7c2l6ZSo9cGVyc3BlY3RpdmVfcmF0aW87ZmxvYXQgZm9udFNjYWxlPXVfaXNfdGV4dCA/IHNpemUvMjQuMCA6IHNpemU7aGlnaHAgZmxvYXQgc3ltYm9sX3JvdGF0aW9uPTAuMDtpZiAodV9yb3RhdGVfc3ltYm9sKSB7dmVjNCBvZmZzZXRQcm9qZWN0ZWRQb2ludD11X21hdHJpeCp2ZWM0KGFfcG9zK3ZlYzIoMSwwKSwwLDEpO3ZlYzIgYT1wcm9qZWN0ZWRQb2ludC54eS9wcm9qZWN0ZWRQb2ludC53O3ZlYzIgYj1vZmZzZXRQcm9qZWN0ZWRQb2ludC54eS9vZmZzZXRQcm9qZWN0ZWRQb2ludC53O3N5bWJvbF9yb3RhdGlvbj1hdGFuKChiLnktYS55KS91X2FzcGVjdF9yYXRpbyxiLngtYS54KTt9aGlnaHAgZmxvYXQgYW5nbGVfc2luPXNpbihzZWdtZW50X2FuZ2xlK3N5bWJvbF9yb3RhdGlvbik7aGlnaHAgZmxvYXQgYW5nbGVfY29zPWNvcyhzZWdtZW50X2FuZ2xlK3N5bWJvbF9yb3RhdGlvbik7bWF0MiByb3RhdGlvbl9tYXRyaXg9bWF0MihhbmdsZV9jb3MsLTEuMCphbmdsZV9zaW4sYW5nbGVfc2luLGFuZ2xlX2Nvcyk7dmVjNCBwcm9qZWN0ZWRfcG9zPXVfbGFiZWxfcGxhbmVfbWF0cml4KnZlYzQoYV9wcm9qZWN0ZWRfcG9zLnh5LDAuMCwxLjApO2dsX1Bvc2l0aW9uPXVfY29vcmRfbWF0cml4KnZlYzQocHJvamVjdGVkX3Bvcy54eS9wcm9qZWN0ZWRfcG9zLncrcm90YXRpb25fbWF0cml4KihhX29mZnNldC8zMi4wKmZvbnRTY2FsZSthX3B4b2Zmc2V0KSwwLjAsMS4wKTtmbG9hdCBnYW1tYV9zY2FsZT1nbF9Qb3NpdGlvbi53O3ZlYzIgZmFkZV9vcGFjaXR5PXVucGFja19vcGFjaXR5KGFfZmFkZV9vcGFjaXR5KTtmbG9hdCBmYWRlX2NoYW5nZT1mYWRlX29wYWNpdHlbMV0gPiAwLjUgPyB1X2ZhZGVfY2hhbmdlIDotdV9mYWRlX2NoYW5nZTtmbG9hdCBpbnRlcnBvbGF0ZWRfZmFkZV9vcGFjaXR5PW1heCgwLjAsbWluKDEuMCxmYWRlX29wYWNpdHlbMF0rZmFkZV9jaGFuZ2UpKTt2X2RhdGEwPWFfdGV4L3VfdGV4c2l6ZTt2X2RhdGExPXZlYzMoZ2FtbWFfc2NhbGUsc2l6ZSxpbnRlcnBvbGF0ZWRfZmFkZV9vcGFjaXR5KTt9XCIpLFxuICAgICAgICBtaSA9IGdpKFwiI2RlZmluZSBTREZfUFggOC4wXFxuI2RlZmluZSBTREYgMS4wXFxuI2RlZmluZSBJQ09OIDAuMFxcbnVuaWZvcm0gYm9vbCB1X2lzX2hhbG87dW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlO3VuaWZvcm0gc2FtcGxlcjJEIHVfdGV4dHVyZV9pY29uO3VuaWZvcm0gaGlnaHAgZmxvYXQgdV9nYW1tYV9zY2FsZTt1bmlmb3JtIGxvd3AgZmxvYXQgdV9kZXZpY2VfcGl4ZWxfcmF0aW87dmFyeWluZyB2ZWM0IHZfZGF0YTA7dmFyeWluZyB2ZWM0IHZfZGF0YTE7XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBoaWdocCB2ZWM0IGZpbGxfY29sb3JcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGhpZ2hwIHZlYzQgaGFsb19jb2xvclxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvcGFjaXR5XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IGhhbG9fd2lkdGhcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgaGFsb19ibHVyXFxudm9pZCBtYWluKCkge1xcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGhpZ2hwIHZlYzQgZmlsbF9jb2xvclxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGhpZ2hwIHZlYzQgaGFsb19jb2xvclxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgb3BhY2l0eVxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgaGFsb193aWR0aFxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgaGFsb19ibHVyXFxuZmxvYXQgZmFkZV9vcGFjaXR5PXZfZGF0YTFbMl07aWYgKHZfZGF0YTEudz09SUNPTikge3ZlYzIgdGV4X2ljb249dl9kYXRhMC56dztsb3dwIGZsb2F0IGFscGhhPW9wYWNpdHkqZmFkZV9vcGFjaXR5O2dsX0ZyYWdDb2xvcj10ZXh0dXJlMkQodV90ZXh0dXJlX2ljb24sdGV4X2ljb24pKmFscGhhO1xcbiNpZmRlZiBPVkVSRFJBV19JTlNQRUNUT1JcXG5nbF9GcmFnQ29sb3I9dmVjNCgxLjApO1xcbiNlbmRpZlxcbnJldHVybjt9dmVjMiB0ZXg9dl9kYXRhMC54eTtmbG9hdCBFREdFX0dBTU1BPTAuMTA1L3VfZGV2aWNlX3BpeGVsX3JhdGlvO2Zsb2F0IGdhbW1hX3NjYWxlPXZfZGF0YTEueDtmbG9hdCBzaXplPXZfZGF0YTEueTtmbG9hdCBmb250U2NhbGU9c2l6ZS8yNC4wO2xvd3AgdmVjNCBjb2xvcj1maWxsX2NvbG9yO2hpZ2hwIGZsb2F0IGdhbW1hPUVER0VfR0FNTUEvKGZvbnRTY2FsZSp1X2dhbW1hX3NjYWxlKTtsb3dwIGZsb2F0IGJ1ZmY9KDI1Ni4wLTY0LjApLzI1Ni4wO2lmICh1X2lzX2hhbG8pIHtjb2xvcj1oYWxvX2NvbG9yO2dhbW1hPShoYWxvX2JsdXIqMS4xOS9TREZfUFgrRURHRV9HQU1NQSkvKGZvbnRTY2FsZSp1X2dhbW1hX3NjYWxlKTtidWZmPSg2LjAtaGFsb193aWR0aC9mb250U2NhbGUpL1NERl9QWDt9bG93cCBmbG9hdCBkaXN0PXRleHR1cmUyRCh1X3RleHR1cmUsdGV4KS5hO2hpZ2hwIGZsb2F0IGdhbW1hX3NjYWxlZD1nYW1tYSpnYW1tYV9zY2FsZTtoaWdocCBmbG9hdCBhbHBoYT1zbW9vdGhzdGVwKGJ1ZmYtZ2FtbWFfc2NhbGVkLGJ1ZmYrZ2FtbWFfc2NhbGVkLGRpc3QpO2dsX0ZyYWdDb2xvcj1jb2xvciooYWxwaGEqb3BhY2l0eSpmYWRlX29wYWNpdHkpO1xcbiNpZmRlZiBPVkVSRFJBV19JTlNQRUNUT1JcXG5nbF9GcmFnQ29sb3I9dmVjNCgxLjApO1xcbiNlbmRpZlxcbn1cIiwgXCJjb25zdCBmbG9hdCBQST0zLjE0MTU5MjY1MzU4OTc5MzthdHRyaWJ1dGUgdmVjNCBhX3Bvc19vZmZzZXQ7YXR0cmlidXRlIHZlYzQgYV9kYXRhO2F0dHJpYnV0ZSB2ZWMzIGFfcHJvamVjdGVkX3BvczthdHRyaWJ1dGUgZmxvYXQgYV9mYWRlX29wYWNpdHk7dW5pZm9ybSBib29sIHVfaXNfc2l6ZV96b29tX2NvbnN0YW50O3VuaWZvcm0gYm9vbCB1X2lzX3NpemVfZmVhdHVyZV9jb25zdGFudDt1bmlmb3JtIGhpZ2hwIGZsb2F0IHVfc2l6ZV90O3VuaWZvcm0gaGlnaHAgZmxvYXQgdV9zaXplO3VuaWZvcm0gbWF0NCB1X21hdHJpeDt1bmlmb3JtIG1hdDQgdV9sYWJlbF9wbGFuZV9tYXRyaXg7dW5pZm9ybSBtYXQ0IHVfY29vcmRfbWF0cml4O3VuaWZvcm0gYm9vbCB1X2lzX3RleHQ7dW5pZm9ybSBib29sIHVfcGl0Y2hfd2l0aF9tYXA7dW5pZm9ybSBoaWdocCBmbG9hdCB1X3BpdGNoO3VuaWZvcm0gYm9vbCB1X3JvdGF0ZV9zeW1ib2w7dW5pZm9ybSBoaWdocCBmbG9hdCB1X2FzcGVjdF9yYXRpbzt1bmlmb3JtIGhpZ2hwIGZsb2F0IHVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZTt1bmlmb3JtIGZsb2F0IHVfZmFkZV9jaGFuZ2U7dW5pZm9ybSB2ZWMyIHVfdGV4c2l6ZTt1bmlmb3JtIHZlYzIgdV90ZXhzaXplX2ljb247dmFyeWluZyB2ZWM0IHZfZGF0YTA7dmFyeWluZyB2ZWM0IHZfZGF0YTE7XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBoaWdocCB2ZWM0IGZpbGxfY29sb3JcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGhpZ2hwIHZlYzQgaGFsb19jb2xvclxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvcGFjaXR5XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IGhhbG9fd2lkdGhcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgaGFsb19ibHVyXFxudm9pZCBtYWluKCkge1xcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGhpZ2hwIHZlYzQgZmlsbF9jb2xvclxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGhpZ2hwIHZlYzQgaGFsb19jb2xvclxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgb3BhY2l0eVxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgaGFsb193aWR0aFxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgaGFsb19ibHVyXFxudmVjMiBhX3Bvcz1hX3Bvc19vZmZzZXQueHk7dmVjMiBhX29mZnNldD1hX3Bvc19vZmZzZXQuenc7dmVjMiBhX3RleD1hX2RhdGEueHk7dmVjMiBhX3NpemU9YV9kYXRhLnp3O2Zsb2F0IGFfc2l6ZV9taW49Zmxvb3IoYV9zaXplWzBdKjAuNSk7ZmxvYXQgaXNfc2RmPWFfc2l6ZVswXS0yLjAqYV9zaXplX21pbjtoaWdocCBmbG9hdCBzZWdtZW50X2FuZ2xlPS1hX3Byb2plY3RlZF9wb3NbMl07ZmxvYXQgc2l6ZTtpZiAoIXVfaXNfc2l6ZV96b29tX2NvbnN0YW50ICYmICF1X2lzX3NpemVfZmVhdHVyZV9jb25zdGFudCkge3NpemU9bWl4KGFfc2l6ZV9taW4sYV9zaXplWzFdLHVfc2l6ZV90KS8xMjguMDt9IGVsc2UgaWYgKHVfaXNfc2l6ZV96b29tX2NvbnN0YW50ICYmICF1X2lzX3NpemVfZmVhdHVyZV9jb25zdGFudCkge3NpemU9YV9zaXplX21pbi8xMjguMDt9IGVsc2Uge3NpemU9dV9zaXplO312ZWM0IHByb2plY3RlZFBvaW50PXVfbWF0cml4KnZlYzQoYV9wb3MsMCwxKTtoaWdocCBmbG9hdCBjYW1lcmFfdG9fYW5jaG9yX2Rpc3RhbmNlPXByb2plY3RlZFBvaW50Lnc7aGlnaHAgZmxvYXQgZGlzdGFuY2VfcmF0aW89dV9waXRjaF93aXRoX21hcCA/XFxuY2FtZXJhX3RvX2FuY2hvcl9kaXN0YW5jZS91X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UgOlxcbnVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZS9jYW1lcmFfdG9fYW5jaG9yX2Rpc3RhbmNlO2hpZ2hwIGZsb2F0IHBlcnNwZWN0aXZlX3JhdGlvPWNsYW1wKDAuNSswLjUqZGlzdGFuY2VfcmF0aW8sMC4wLDQuMCk7c2l6ZSo9cGVyc3BlY3RpdmVfcmF0aW87ZmxvYXQgZm9udFNjYWxlPXNpemUvMjQuMDtoaWdocCBmbG9hdCBzeW1ib2xfcm90YXRpb249MC4wO2lmICh1X3JvdGF0ZV9zeW1ib2wpIHt2ZWM0IG9mZnNldFByb2plY3RlZFBvaW50PXVfbWF0cml4KnZlYzQoYV9wb3MrdmVjMigxLDApLDAsMSk7dmVjMiBhPXByb2plY3RlZFBvaW50Lnh5L3Byb2plY3RlZFBvaW50Lnc7dmVjMiBiPW9mZnNldFByb2plY3RlZFBvaW50Lnh5L29mZnNldFByb2plY3RlZFBvaW50Lnc7c3ltYm9sX3JvdGF0aW9uPWF0YW4oKGIueS1hLnkpL3VfYXNwZWN0X3JhdGlvLGIueC1hLngpO31oaWdocCBmbG9hdCBhbmdsZV9zaW49c2luKHNlZ21lbnRfYW5nbGUrc3ltYm9sX3JvdGF0aW9uKTtoaWdocCBmbG9hdCBhbmdsZV9jb3M9Y29zKHNlZ21lbnRfYW5nbGUrc3ltYm9sX3JvdGF0aW9uKTttYXQyIHJvdGF0aW9uX21hdHJpeD1tYXQyKGFuZ2xlX2NvcywtMS4wKmFuZ2xlX3NpbixhbmdsZV9zaW4sYW5nbGVfY29zKTt2ZWM0IHByb2plY3RlZF9wb3M9dV9sYWJlbF9wbGFuZV9tYXRyaXgqdmVjNChhX3Byb2plY3RlZF9wb3MueHksMC4wLDEuMCk7Z2xfUG9zaXRpb249dV9jb29yZF9tYXRyaXgqdmVjNChwcm9qZWN0ZWRfcG9zLnh5L3Byb2plY3RlZF9wb3Mudytyb3RhdGlvbl9tYXRyaXgqKGFfb2Zmc2V0LzMyLjAqZm9udFNjYWxlKSwwLjAsMS4wKTtmbG9hdCBnYW1tYV9zY2FsZT1nbF9Qb3NpdGlvbi53O3ZlYzIgZmFkZV9vcGFjaXR5PXVucGFja19vcGFjaXR5KGFfZmFkZV9vcGFjaXR5KTtmbG9hdCBmYWRlX2NoYW5nZT1mYWRlX29wYWNpdHlbMV0gPiAwLjUgPyB1X2ZhZGVfY2hhbmdlIDotdV9mYWRlX2NoYW5nZTtmbG9hdCBpbnRlcnBvbGF0ZWRfZmFkZV9vcGFjaXR5PW1heCgwLjAsbWluKDEuMCxmYWRlX29wYWNpdHlbMF0rZmFkZV9jaGFuZ2UpKTt2X2RhdGEwLnh5PWFfdGV4L3VfdGV4c2l6ZTt2X2RhdGEwLnp3PWFfdGV4L3VfdGV4c2l6ZV9pY29uO3ZfZGF0YTE9dmVjNChnYW1tYV9zY2FsZSxzaXplLGludGVycG9sYXRlZF9mYWRlX29wYWNpdHksaXNfc2RmKTt9XCIpO1xuXG4gICAgZnVuY3Rpb24gZ2kodCwgZSkge1xuICAgICAgdmFyIGkgPSAvI3ByYWdtYSBtYXBib3g6IChbXFx3XSspIChbXFx3XSspIChbXFx3XSspIChbXFx3XSspL2csXG4gICAgICAgICAgbyA9IGUubWF0Y2goL2F0dHJpYnV0ZSAoW1xcd10rKSAoW1xcd10rKS9nKSxcbiAgICAgICAgICByID0gdC5tYXRjaCgvdW5pZm9ybSAoW1xcd10rKSAoW1xcd10rKShbXFxzXSopKFtcXHddKikvZyksXG4gICAgICAgICAgYSA9IGUubWF0Y2goL3VuaWZvcm0gKFtcXHddKykgKFtcXHddKykoW1xcc10qKShbXFx3XSopL2cpLFxuICAgICAgICAgIG4gPSBhID8gYS5jb25jYXQocikgOiByLFxuICAgICAgICAgIHMgPSB7fTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZyYWdtZW50U291cmNlOiB0ID0gdC5yZXBsYWNlKGksIGZ1bmN0aW9uICh0LCBlLCBpLCBvLCByKSB7XG4gICAgICAgICAgcmV0dXJuIHNbcl0gPSAhMCwgXCJkZWZpbmVcIiA9PT0gZSA/IFwiXFxuI2lmbmRlZiBIQVNfVU5JRk9STV91X1wiICsgciArIFwiXFxudmFyeWluZyBcIiArIGkgKyBcIiBcIiArIG8gKyBcIiBcIiArIHIgKyBcIjtcXG4jZWxzZVxcbnVuaWZvcm0gXCIgKyBpICsgXCIgXCIgKyBvICsgXCIgdV9cIiArIHIgKyBcIjtcXG4jZW5kaWZcXG5cIiA6IFwiXFxuI2lmZGVmIEhBU19VTklGT1JNX3VfXCIgKyByICsgXCJcXG4gICAgXCIgKyBpICsgXCIgXCIgKyBvICsgXCIgXCIgKyByICsgXCIgPSB1X1wiICsgciArIFwiO1xcbiNlbmRpZlxcblwiO1xuICAgICAgICB9KSxcbiAgICAgICAgdmVydGV4U291cmNlOiBlID0gZS5yZXBsYWNlKGksIGZ1bmN0aW9uICh0LCBlLCBpLCBvLCByKSB7XG4gICAgICAgICAgdmFyIGEgPSBcImZsb2F0XCIgPT09IG8gPyBcInZlYzJcIiA6IFwidmVjNFwiLFxuICAgICAgICAgICAgICBuID0gci5tYXRjaCgvY29sb3IvKSA/IFwiY29sb3JcIiA6IGE7XG4gICAgICAgICAgcmV0dXJuIHNbcl0gPyBcImRlZmluZVwiID09PSBlID8gXCJcXG4jaWZuZGVmIEhBU19VTklGT1JNX3VfXCIgKyByICsgXCJcXG51bmlmb3JtIGxvd3AgZmxvYXQgdV9cIiArIHIgKyBcIl90O1xcbmF0dHJpYnV0ZSBcIiArIGkgKyBcIiBcIiArIGEgKyBcIiBhX1wiICsgciArIFwiO1xcbnZhcnlpbmcgXCIgKyBpICsgXCIgXCIgKyBvICsgXCIgXCIgKyByICsgXCI7XFxuI2Vsc2VcXG51bmlmb3JtIFwiICsgaSArIFwiIFwiICsgbyArIFwiIHVfXCIgKyByICsgXCI7XFxuI2VuZGlmXFxuXCIgOiBcInZlYzRcIiA9PT0gbiA/IFwiXFxuI2lmbmRlZiBIQVNfVU5JRk9STV91X1wiICsgciArIFwiXFxuICAgIFwiICsgciArIFwiID0gYV9cIiArIHIgKyBcIjtcXG4jZWxzZVxcbiAgICBcIiArIGkgKyBcIiBcIiArIG8gKyBcIiBcIiArIHIgKyBcIiA9IHVfXCIgKyByICsgXCI7XFxuI2VuZGlmXFxuXCIgOiBcIlxcbiNpZm5kZWYgSEFTX1VOSUZPUk1fdV9cIiArIHIgKyBcIlxcbiAgICBcIiArIHIgKyBcIiA9IHVucGFja19taXhfXCIgKyBuICsgXCIoYV9cIiArIHIgKyBcIiwgdV9cIiArIHIgKyBcIl90KTtcXG4jZWxzZVxcbiAgICBcIiArIGkgKyBcIiBcIiArIG8gKyBcIiBcIiArIHIgKyBcIiA9IHVfXCIgKyByICsgXCI7XFxuI2VuZGlmXFxuXCIgOiBcImRlZmluZVwiID09PSBlID8gXCJcXG4jaWZuZGVmIEhBU19VTklGT1JNX3VfXCIgKyByICsgXCJcXG51bmlmb3JtIGxvd3AgZmxvYXQgdV9cIiArIHIgKyBcIl90O1xcbmF0dHJpYnV0ZSBcIiArIGkgKyBcIiBcIiArIGEgKyBcIiBhX1wiICsgciArIFwiO1xcbiNlbHNlXFxudW5pZm9ybSBcIiArIGkgKyBcIiBcIiArIG8gKyBcIiB1X1wiICsgciArIFwiO1xcbiNlbmRpZlxcblwiIDogXCJ2ZWM0XCIgPT09IG4gPyBcIlxcbiNpZm5kZWYgSEFTX1VOSUZPUk1fdV9cIiArIHIgKyBcIlxcbiAgICBcIiArIGkgKyBcIiBcIiArIG8gKyBcIiBcIiArIHIgKyBcIiA9IGFfXCIgKyByICsgXCI7XFxuI2Vsc2VcXG4gICAgXCIgKyBpICsgXCIgXCIgKyBvICsgXCIgXCIgKyByICsgXCIgPSB1X1wiICsgciArIFwiO1xcbiNlbmRpZlxcblwiIDogXCJcXG4jaWZuZGVmIEhBU19VTklGT1JNX3VfXCIgKyByICsgXCJcXG4gICAgXCIgKyBpICsgXCIgXCIgKyBvICsgXCIgXCIgKyByICsgXCIgPSB1bnBhY2tfbWl4X1wiICsgbiArIFwiKGFfXCIgKyByICsgXCIsIHVfXCIgKyByICsgXCJfdCk7XFxuI2Vsc2VcXG4gICAgXCIgKyBpICsgXCIgXCIgKyBvICsgXCIgXCIgKyByICsgXCIgPSB1X1wiICsgciArIFwiO1xcbiNlbmRpZlxcblwiO1xuICAgICAgICB9KSxcbiAgICAgICAgc3RhdGljQXR0cmlidXRlczogbyxcbiAgICAgICAgc3RhdGljVW5pZm9ybXM6IG5cbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIHZpID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICBwcmVsdWRlOiBHZSxcbiAgICAgIGJhY2tncm91bmQ6IFdlLFxuICAgICAgYmFja2dyb3VuZFBhdHRlcm46IFhlLFxuICAgICAgY2lyY2xlOiBIZSxcbiAgICAgIGNsaXBwaW5nTWFzazogS2UsXG4gICAgICBoZWF0bWFwOiBZZSxcbiAgICAgIGhlYXRtYXBUZXh0dXJlOiBKZSxcbiAgICAgIGNvbGxpc2lvbkJveDogUWUsXG4gICAgICBjb2xsaXNpb25DaXJjbGU6ICRlLFxuICAgICAgZGVidWc6IHRpLFxuICAgICAgZmlsbDogZWksXG4gICAgICBmaWxsT3V0bGluZTogaWksXG4gICAgICBmaWxsT3V0bGluZVBhdHRlcm46IG9pLFxuICAgICAgZmlsbFBhdHRlcm46IHJpLFxuICAgICAgZmlsbEV4dHJ1c2lvbjogYWksXG4gICAgICBmaWxsRXh0cnVzaW9uUGF0dGVybjogbmksXG4gICAgICBoaWxsc2hhZGVQcmVwYXJlOiBzaSxcbiAgICAgIGhpbGxzaGFkZTogbGksXG4gICAgICBsaW5lOiBjaSxcbiAgICAgIGxpbmVHcmFkaWVudDogdWksXG4gICAgICBsaW5lUGF0dGVybjogaGksXG4gICAgICBsaW5lU0RGOiBwaSxcbiAgICAgIHJhc3RlcjogZGksXG4gICAgICBzeW1ib2xJY29uOiBfaSxcbiAgICAgIHN5bWJvbFNERjogZmksXG4gICAgICBzeW1ib2xUZXh0QW5kSWNvbjogbWlcbiAgICB9KSxcbiAgICAgICAgeWkgPSBmdW5jdGlvbiB5aSgpIHtcbiAgICAgIHRoaXMuYm91bmRQcm9ncmFtID0gbnVsbCwgdGhpcy5ib3VuZExheW91dFZlcnRleEJ1ZmZlciA9IG51bGwsIHRoaXMuYm91bmRQYWludFZlcnRleEJ1ZmZlcnMgPSBbXSwgdGhpcy5ib3VuZEluZGV4QnVmZmVyID0gbnVsbCwgdGhpcy5ib3VuZFZlcnRleE9mZnNldCA9IG51bGwsIHRoaXMuYm91bmREeW5hbWljVmVydGV4QnVmZmVyID0gbnVsbCwgdGhpcy52YW8gPSBudWxsO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiB4aSh0KSB7XG4gICAgICBmb3IgKHZhciBlID0gW10sIGkgPSAwOyBpIDwgdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAobnVsbCAhPT0gdFtpXSkge1xuICAgICAgICAgIHZhciBvID0gdFtpXS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgZS5wdXNoKG8ucG9wKCkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlO1xuICAgIH1cblxuICAgIHlpLnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24gKHQsIGUsIGksIG8sIHIsIGEsIG4sIHMpIHtcbiAgICAgIHRoaXMuY29udGV4dCA9IHQ7XG5cbiAgICAgIGZvciAodmFyIGwgPSB0aGlzLmJvdW5kUGFpbnRWZXJ0ZXhCdWZmZXJzLmxlbmd0aCAhPT0gby5sZW5ndGgsIGMgPSAwOyAhbCAmJiBjIDwgby5sZW5ndGg7IGMrKykge1xuICAgICAgICB0aGlzLmJvdW5kUGFpbnRWZXJ0ZXhCdWZmZXJzW2NdICE9PSBvW2NdICYmIChsID0gITApO1xuICAgICAgfVxuXG4gICAgICB0LmV4dFZlcnRleEFycmF5T2JqZWN0ICYmIHRoaXMudmFvICYmIHRoaXMuYm91bmRQcm9ncmFtID09PSBlICYmIHRoaXMuYm91bmRMYXlvdXRWZXJ0ZXhCdWZmZXIgPT09IGkgJiYgIWwgJiYgdGhpcy5ib3VuZEluZGV4QnVmZmVyID09PSByICYmIHRoaXMuYm91bmRWZXJ0ZXhPZmZzZXQgPT09IGEgJiYgdGhpcy5ib3VuZER5bmFtaWNWZXJ0ZXhCdWZmZXIgPT09IG4gJiYgdGhpcy5ib3VuZER5bmFtaWNWZXJ0ZXhCdWZmZXIyID09PSBzID8gKHQuYmluZFZlcnRleEFycmF5T0VTLnNldCh0aGlzLnZhbyksIG4gJiYgbi5iaW5kKCksIHIgJiYgci5keW5hbWljRHJhdyAmJiByLmJpbmQoKSwgcyAmJiBzLmJpbmQoKSkgOiB0aGlzLmZyZXNoQmluZChlLCBpLCBvLCByLCBhLCBuLCBzKTtcbiAgICB9LCB5aS5wcm90b3R5cGUuZnJlc2hCaW5kID0gZnVuY3Rpb24gKHQsIGUsIGksIG8sIHIsIGEsIG4pIHtcbiAgICAgIHZhciBzLFxuICAgICAgICAgIGwgPSB0Lm51bUF0dHJpYnV0ZXMsXG4gICAgICAgICAgYyA9IHRoaXMuY29udGV4dCxcbiAgICAgICAgICB1ID0gYy5nbDtcbiAgICAgIGlmIChjLmV4dFZlcnRleEFycmF5T2JqZWN0KSB0aGlzLnZhbyAmJiB0aGlzLmRlc3Ryb3koKSwgdGhpcy52YW8gPSBjLmV4dFZlcnRleEFycmF5T2JqZWN0LmNyZWF0ZVZlcnRleEFycmF5T0VTKCksIGMuYmluZFZlcnRleEFycmF5T0VTLnNldCh0aGlzLnZhbyksIHMgPSAwLCB0aGlzLmJvdW5kUHJvZ3JhbSA9IHQsIHRoaXMuYm91bmRMYXlvdXRWZXJ0ZXhCdWZmZXIgPSBlLCB0aGlzLmJvdW5kUGFpbnRWZXJ0ZXhCdWZmZXJzID0gaSwgdGhpcy5ib3VuZEluZGV4QnVmZmVyID0gbywgdGhpcy5ib3VuZFZlcnRleE9mZnNldCA9IHIsIHRoaXMuYm91bmREeW5hbWljVmVydGV4QnVmZmVyID0gYSwgdGhpcy5ib3VuZER5bmFtaWNWZXJ0ZXhCdWZmZXIyID0gbjtlbHNlIHtcbiAgICAgICAgcyA9IGMuY3VycmVudE51bUF0dHJpYnV0ZXMgfHwgMDtcblxuICAgICAgICBmb3IgKHZhciBoID0gbDsgaCA8IHM7IGgrKykge1xuICAgICAgICAgIHUuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlLmVuYWJsZUF0dHJpYnV0ZXModSwgdCk7XG5cbiAgICAgIGZvciAodmFyIHAgPSAwLCBkID0gaTsgcCA8IGQubGVuZ3RoOyBwICs9IDEpIHtcbiAgICAgICAgZFtwXS5lbmFibGVBdHRyaWJ1dGVzKHUsIHQpO1xuICAgICAgfVxuXG4gICAgICBhICYmIGEuZW5hYmxlQXR0cmlidXRlcyh1LCB0KSwgbiAmJiBuLmVuYWJsZUF0dHJpYnV0ZXModSwgdCksIGUuYmluZCgpLCBlLnNldFZlcnRleEF0dHJpYlBvaW50ZXJzKHUsIHQsIHIpO1xuXG4gICAgICBmb3IgKHZhciBfID0gMCwgZiA9IGk7IF8gPCBmLmxlbmd0aDsgXyArPSAxKSB7XG4gICAgICAgIHZhciBtID0gZltfXTtcbiAgICAgICAgbS5iaW5kKCksIG0uc2V0VmVydGV4QXR0cmliUG9pbnRlcnModSwgdCwgcik7XG4gICAgICB9XG5cbiAgICAgIGEgJiYgKGEuYmluZCgpLCBhLnNldFZlcnRleEF0dHJpYlBvaW50ZXJzKHUsIHQsIHIpKSwgbyAmJiBvLmJpbmQoKSwgbiAmJiAobi5iaW5kKCksIG4uc2V0VmVydGV4QXR0cmliUG9pbnRlcnModSwgdCwgcikpLCBjLmN1cnJlbnROdW1BdHRyaWJ1dGVzID0gbDtcbiAgICB9LCB5aS5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMudmFvICYmICh0aGlzLmNvbnRleHQuZXh0VmVydGV4QXJyYXlPYmplY3QuZGVsZXRlVmVydGV4QXJyYXlPRVModGhpcy52YW8pLCB0aGlzLnZhbyA9IG51bGwpO1xuICAgIH07XG5cbiAgICB2YXIgYmkgPSBmdW5jdGlvbiBiaSh0LCBlLCBpLCBvLCByLCBhKSB7XG4gICAgICB2YXIgbiA9IHQuZ2w7XG4gICAgICB0aGlzLnByb2dyYW0gPSBuLmNyZWF0ZVByb2dyYW0oKTtcblxuICAgICAgZm9yICh2YXIgcyA9IHhpKGkuc3RhdGljQXR0cmlidXRlcyksIGwgPSBvID8gby5nZXRCaW5kZXJBdHRyaWJ1dGVzKCkgOiBbXSwgYyA9IHMuY29uY2F0KGwpLCB1ID0gaS5zdGF0aWNVbmlmb3JtcyA/IHhpKGkuc3RhdGljVW5pZm9ybXMpIDogW10sIGggPSBvID8gby5nZXRCaW5kZXJVbmlmb3JtcygpIDogW10sIHAgPSBbXSwgZCA9IDAsIF8gPSB1LmNvbmNhdChoKTsgZCA8IF8ubGVuZ3RoOyBkICs9IDEpIHtcbiAgICAgICAgdmFyIGYgPSBfW2RdO1xuICAgICAgICBwLmluZGV4T2YoZikgPCAwICYmIHAucHVzaChmKTtcbiAgICAgIH1cblxuICAgICAgdmFyIG0gPSBvID8gby5kZWZpbmVzKCkgOiBbXTtcbiAgICAgIGEgJiYgbS5wdXNoKFwiI2RlZmluZSBPVkVSRFJBV19JTlNQRUNUT1I7XCIpO1xuICAgICAgdmFyIGcgPSBtLmNvbmNhdChHZS5mcmFnbWVudFNvdXJjZSwgaS5mcmFnbWVudFNvdXJjZSkuam9pbihcIlxcblwiKSxcbiAgICAgICAgICB2ID0gbS5jb25jYXQoR2UudmVydGV4U291cmNlLCBpLnZlcnRleFNvdXJjZSkuam9pbihcIlxcblwiKSxcbiAgICAgICAgICB5ID0gbi5jcmVhdGVTaGFkZXIobi5GUkFHTUVOVF9TSEFERVIpO1xuICAgICAgaWYgKG4uaXNDb250ZXh0TG9zdCgpKSB0aGlzLmZhaWxlZFRvQ3JlYXRlID0gITA7ZWxzZSB7XG4gICAgICAgIG4uc2hhZGVyU291cmNlKHksIGcpLCBuLmNvbXBpbGVTaGFkZXIoeSksIG4uYXR0YWNoU2hhZGVyKHRoaXMucHJvZ3JhbSwgeSk7XG4gICAgICAgIHZhciB4ID0gbi5jcmVhdGVTaGFkZXIobi5WRVJURVhfU0hBREVSKTtcbiAgICAgICAgaWYgKG4uaXNDb250ZXh0TG9zdCgpKSB0aGlzLmZhaWxlZFRvQ3JlYXRlID0gITA7ZWxzZSB7XG4gICAgICAgICAgbi5zaGFkZXJTb3VyY2UoeCwgdiksIG4uY29tcGlsZVNoYWRlcih4KSwgbi5hdHRhY2hTaGFkZXIodGhpcy5wcm9ncmFtLCB4KSwgdGhpcy5hdHRyaWJ1dGVzID0ge307XG4gICAgICAgICAgdmFyIGIgPSB7fTtcbiAgICAgICAgICB0aGlzLm51bUF0dHJpYnV0ZXMgPSBjLmxlbmd0aDtcblxuICAgICAgICAgIGZvciAodmFyIHcgPSAwOyB3IDwgdGhpcy5udW1BdHRyaWJ1dGVzOyB3KyspIHtcbiAgICAgICAgICAgIGNbd10gJiYgKG4uYmluZEF0dHJpYkxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgdywgY1t3XSksIHRoaXMuYXR0cmlidXRlc1tjW3ddXSA9IHcpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG4ubGlua1Byb2dyYW0odGhpcy5wcm9ncmFtKSwgbi5kZWxldGVTaGFkZXIoeCksIG4uZGVsZXRlU2hhZGVyKHkpO1xuXG4gICAgICAgICAgZm9yICh2YXIgVCA9IDA7IFQgPCBwLmxlbmd0aDsgVCsrKSB7XG4gICAgICAgICAgICB2YXIgRSA9IHBbVF07XG5cbiAgICAgICAgICAgIGlmIChFICYmICFiW0VdKSB7XG4gICAgICAgICAgICAgIHZhciBJID0gbi5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5wcm9ncmFtLCBFKTtcbiAgICAgICAgICAgICAgSSAmJiAoYltFXSA9IEkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuZml4ZWRVbmlmb3JtcyA9IHIodCwgYiksIHRoaXMuYmluZGVyVW5pZm9ybXMgPSBvID8gby5nZXRVbmlmb3Jtcyh0LCBiKSA6IFtdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHdpKHQsIGUsIGkpIHtcbiAgICAgIHZhciBvID0gMSAvIHBlKGksIDEsIGUudHJhbnNmb3JtLnRpbGVab29tKSxcbiAgICAgICAgICByID0gTWF0aC5wb3coMiwgaS50aWxlSUQub3ZlcnNjYWxlZFopLFxuICAgICAgICAgIGEgPSBpLnRpbGVTaXplICogTWF0aC5wb3coMiwgZS50cmFuc2Zvcm0udGlsZVpvb20pIC8gcixcbiAgICAgICAgICBuID0gYSAqIChpLnRpbGVJRC5jYW5vbmljYWwueCArIGkudGlsZUlELndyYXAgKiByKSxcbiAgICAgICAgICBzID0gYSAqIGkudGlsZUlELmNhbm9uaWNhbC55O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdV9pbWFnZTogMCxcbiAgICAgICAgdV90ZXhzaXplOiBpLmltYWdlQXRsYXNUZXh0dXJlLnNpemUsXG4gICAgICAgIHVfc2NhbGU6IFtvLCB0LmZyb21TY2FsZSwgdC50b1NjYWxlXSxcbiAgICAgICAgdV9mYWRlOiB0LnQsXG4gICAgICAgIHVfcGl4ZWxfY29vcmRfdXBwZXI6IFtuID4+IDE2LCBzID4+IDE2XSxcbiAgICAgICAgdV9waXhlbF9jb29yZF9sb3dlcjogWzY1NTM1ICYgbiwgNjU1MzUgJiBzXVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBiaS5wcm90b3R5cGUuZHJhdyA9IGZ1bmN0aW9uICh0LCBlLCBpLCBvLCByLCBhLCBuLCBzLCBsLCBjLCB1LCBoLCBwLCBkLCBfLCBmKSB7XG4gICAgICB2YXIgbSxcbiAgICAgICAgICBnID0gdC5nbDtcblxuICAgICAgaWYgKCF0aGlzLmZhaWxlZFRvQ3JlYXRlKSB7XG4gICAgICAgIGZvciAodmFyIHYgaW4gdC5wcm9ncmFtLnNldCh0aGlzLnByb2dyYW0pLCB0LnNldERlcHRoTW9kZShpKSwgdC5zZXRTdGVuY2lsTW9kZShvKSwgdC5zZXRDb2xvck1vZGUociksIHQuc2V0Q3VsbEZhY2UoYSksIHRoaXMuZml4ZWRVbmlmb3Jtcykge1xuICAgICAgICAgIHRoaXMuZml4ZWRVbmlmb3Jtc1t2XS5zZXQoblt2XSk7XG4gICAgICAgIH1cblxuICAgICAgICBkICYmIGQuc2V0VW5pZm9ybXModCwgdGhpcy5iaW5kZXJVbmlmb3JtcywgaCwge1xuICAgICAgICAgIHpvb206IHBcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZm9yICh2YXIgeSA9IChtID0ge30sIG1bZy5MSU5FU10gPSAyLCBtW2cuVFJJQU5HTEVTXSA9IDMsIG1bZy5MSU5FX1NUUklQXSA9IDEsIG0pW2VdLCB4ID0gMCwgYiA9IHUuZ2V0KCk7IHggPCBiLmxlbmd0aDsgeCArPSAxKSB7XG4gICAgICAgICAgdmFyIHcgPSBiW3hdLFxuICAgICAgICAgICAgICBUID0gdy52YW9zIHx8ICh3LnZhb3MgPSB7fSk7XG4gICAgICAgICAgKFRbc10gfHwgKFRbc10gPSBuZXcgeWkoKSkpLmJpbmQodCwgdGhpcywgbCwgZCA/IGQuZ2V0UGFpbnRWZXJ0ZXhCdWZmZXJzKCkgOiBbXSwgYywgdy52ZXJ0ZXhPZmZzZXQsIF8sIGYpLCBnLmRyYXdFbGVtZW50cyhlLCB3LnByaW1pdGl2ZUxlbmd0aCAqIHksIGcuVU5TSUdORURfU0hPUlQsIHcucHJpbWl0aXZlT2Zmc2V0ICogeSAqIDIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciBUaSA9IGZ1bmN0aW9uIFRpKGUsIGksIG8sIHIpIHtcbiAgICAgIHZhciBhID0gaS5zdHlsZS5saWdodCxcbiAgICAgICAgICBuID0gYS5wcm9wZXJ0aWVzLmdldChcInBvc2l0aW9uXCIpLFxuICAgICAgICAgIHMgPSBbbi54LCBuLnksIG4uel0sXG4gICAgICAgICAgbCA9IHQuY3JlYXRlJDEoKTtcbiAgICAgIFwidmlld3BvcnRcIiA9PT0gYS5wcm9wZXJ0aWVzLmdldChcImFuY2hvclwiKSAmJiB0LmZyb21Sb3RhdGlvbihsLCAtaS50cmFuc2Zvcm0uYW5nbGUpLCB0LnRyYW5zZm9ybU1hdDMocywgcywgbCk7XG4gICAgICB2YXIgYyA9IGEucHJvcGVydGllcy5nZXQoXCJjb2xvclwiKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVfbWF0cml4OiBlLFxuICAgICAgICB1X2xpZ2h0cG9zOiBzLFxuICAgICAgICB1X2xpZ2h0aW50ZW5zaXR5OiBhLnByb3BlcnRpZXMuZ2V0KFwiaW50ZW5zaXR5XCIpLFxuICAgICAgICB1X2xpZ2h0Y29sb3I6IFtjLnIsIGMuZywgYy5iXSxcbiAgICAgICAgdV92ZXJ0aWNhbF9ncmFkaWVudDogK28sXG4gICAgICAgIHVfb3BhY2l0eTogclxuICAgICAgfTtcbiAgICB9LFxuICAgICAgICBFaSA9IGZ1bmN0aW9uIEVpKGUsIGksIG8sIHIsIGEsIG4sIHMpIHtcbiAgICAgIHJldHVybiB0LmV4dGVuZChUaShlLCBpLCBvLCByKSwgd2kobiwgaSwgcyksIHtcbiAgICAgICAgdV9oZWlnaHRfZmFjdG9yOiAtTWF0aC5wb3coMiwgYS5vdmVyc2NhbGVkWikgLyBzLnRpbGVTaXplIC8gOFxuICAgICAgfSk7XG4gICAgfSxcbiAgICAgICAgSWkgPSBmdW5jdGlvbiBJaSh0KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB1X21hdHJpeDogdFxuICAgICAgfTtcbiAgICB9LFxuICAgICAgICBQaSA9IGZ1bmN0aW9uIFBpKGUsIGksIG8sIHIpIHtcbiAgICAgIHJldHVybiB0LmV4dGVuZChJaShlKSwgd2kobywgaSwgcikpO1xuICAgIH0sXG4gICAgICAgIFNpID0gZnVuY3Rpb24gU2kodCwgZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdV9tYXRyaXg6IHQsXG4gICAgICAgIHVfd29ybGQ6IGVcbiAgICAgIH07XG4gICAgfSxcbiAgICAgICAgQ2kgPSBmdW5jdGlvbiBDaShlLCBpLCBvLCByLCBhKSB7XG4gICAgICByZXR1cm4gdC5leHRlbmQoUGkoZSwgaSwgbywgciksIHtcbiAgICAgICAgdV93b3JsZDogYVxuICAgICAgfSk7XG4gICAgfSxcbiAgICAgICAgemkgPSBmdW5jdGlvbiB6aShlLCBpLCBvLCByKSB7XG4gICAgICB2YXIgYSxcbiAgICAgICAgICBuLFxuICAgICAgICAgIHMgPSBlLnRyYW5zZm9ybTtcblxuICAgICAgaWYgKFwibWFwXCIgPT09IHIucGFpbnQuZ2V0KFwiY2lyY2xlLXBpdGNoLWFsaWdubWVudFwiKSkge1xuICAgICAgICB2YXIgbCA9IHBlKG8sIDEsIHMuem9vbSk7XG4gICAgICAgIGEgPSAhMCwgbiA9IFtsLCBsXTtcbiAgICAgIH0gZWxzZSBhID0gITEsIG4gPSBzLnBpeGVsc1RvR0xVbml0cztcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlOiBzLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UsXG4gICAgICAgIHVfc2NhbGVfd2l0aF9tYXA6ICsoXCJtYXBcIiA9PT0gci5wYWludC5nZXQoXCJjaXJjbGUtcGl0Y2gtc2NhbGVcIikpLFxuICAgICAgICB1X21hdHJpeDogZS50cmFuc2xhdGVQb3NNYXRyaXgoaS5wb3NNYXRyaXgsIG8sIHIucGFpbnQuZ2V0KFwiY2lyY2xlLXRyYW5zbGF0ZVwiKSwgci5wYWludC5nZXQoXCJjaXJjbGUtdHJhbnNsYXRlLWFuY2hvclwiKSksXG4gICAgICAgIHVfcGl0Y2hfd2l0aF9tYXA6ICthLFxuICAgICAgICB1X2RldmljZV9waXhlbF9yYXRpbzogdC5icm93c2VyLmRldmljZVBpeGVsUmF0aW8sXG4gICAgICAgIHVfZXh0cnVkZV9zY2FsZTogblxuICAgICAgfTtcbiAgICB9LFxuICAgICAgICBEaSA9IGZ1bmN0aW9uIERpKHQsIGUsIGkpIHtcbiAgICAgIHZhciBvID0gcGUoaSwgMSwgZS56b29tKSxcbiAgICAgICAgICByID0gTWF0aC5wb3coMiwgZS56b29tIC0gaS50aWxlSUQub3ZlcnNjYWxlZFopLFxuICAgICAgICAgIGEgPSBpLnRpbGVJRC5vdmVyc2NhbGVGYWN0b3IoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVfbWF0cml4OiB0LFxuICAgICAgICB1X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2U6IGUuY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSxcbiAgICAgICAgdV9waXhlbHNfdG9fdGlsZV91bml0czogbyxcbiAgICAgICAgdV9leHRydWRlX3NjYWxlOiBbZS5waXhlbHNUb0dMVW5pdHNbMF0gLyAobyAqIHIpLCBlLnBpeGVsc1RvR0xVbml0c1sxXSAvIChvICogcildLFxuICAgICAgICB1X292ZXJzY2FsZV9mYWN0b3I6IGFcbiAgICAgIH07XG4gICAgfSxcbiAgICAgICAgQWkgPSBmdW5jdGlvbiBBaSh0LCBlLCBpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB1X21hdHJpeDogdCxcbiAgICAgICAgdV9pbnZfbWF0cml4OiBlLFxuICAgICAgICB1X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2U6IGkuY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSxcbiAgICAgICAgdV92aWV3cG9ydF9zaXplOiBbaS53aWR0aCwgaS5oZWlnaHRdXG4gICAgICB9O1xuICAgIH0sXG4gICAgICAgIE1pID0gZnVuY3Rpb24gTWkodCwgZSwgaSkge1xuICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gaSAmJiAoaSA9IDEpLCB7XG4gICAgICAgIHVfbWF0cml4OiB0LFxuICAgICAgICB1X2NvbG9yOiBlLFxuICAgICAgICB1X292ZXJsYXk6IDAsXG4gICAgICAgIHVfb3ZlcmxheV9zY2FsZTogaVxuICAgICAgfTtcbiAgICB9LFxuICAgICAgICBMaSA9IGZ1bmN0aW9uIExpKHQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVfbWF0cml4OiB0XG4gICAgICB9O1xuICAgIH0sXG4gICAgICAgIFJpID0gZnVuY3Rpb24gUmkodCwgZSwgaSwgbykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdV9tYXRyaXg6IHQsXG4gICAgICAgIHVfZXh0cnVkZV9zY2FsZTogcGUoZSwgMSwgaSksXG4gICAgICAgIHVfaW50ZW5zaXR5OiBvXG4gICAgICB9O1xuICAgIH0sXG4gICAgICAgIGtpID0gZnVuY3Rpb24ga2koZSwgaSwgbykge1xuICAgICAgdmFyIHIgPSBlLnRyYW5zZm9ybTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVfbWF0cml4OiBOaShlLCBpLCBvKSxcbiAgICAgICAgdV9yYXRpbzogMSAvIHBlKGksIDEsIHIuem9vbSksXG4gICAgICAgIHVfZGV2aWNlX3BpeGVsX3JhdGlvOiB0LmJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgICAgdV91bml0c190b19waXhlbHM6IFsxIC8gci5waXhlbHNUb0dMVW5pdHNbMF0sIDEgLyByLnBpeGVsc1RvR0xVbml0c1sxXV1cbiAgICAgIH07XG4gICAgfSxcbiAgICAgICAgQmkgPSBmdW5jdGlvbiBCaShlLCBpLCBvLCByKSB7XG4gICAgICByZXR1cm4gdC5leHRlbmQoa2koZSwgaSwgbyksIHtcbiAgICAgICAgdV9pbWFnZTogMCxcbiAgICAgICAgdV9pbWFnZV9oZWlnaHQ6IHJcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgICAgIE9pID0gZnVuY3Rpb24gT2koZSwgaSwgbywgcikge1xuICAgICAgdmFyIGEgPSBlLnRyYW5zZm9ybSxcbiAgICAgICAgICBuID0gVWkoaSwgYSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB1X21hdHJpeDogTmkoZSwgaSwgbyksXG4gICAgICAgIHVfdGV4c2l6ZTogaS5pbWFnZUF0bGFzVGV4dHVyZS5zaXplLFxuICAgICAgICB1X3JhdGlvOiAxIC8gcGUoaSwgMSwgYS56b29tKSxcbiAgICAgICAgdV9kZXZpY2VfcGl4ZWxfcmF0aW86IHQuYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvLFxuICAgICAgICB1X2ltYWdlOiAwLFxuICAgICAgICB1X3NjYWxlOiBbbiwgci5mcm9tU2NhbGUsIHIudG9TY2FsZV0sXG4gICAgICAgIHVfZmFkZTogci50LFxuICAgICAgICB1X3VuaXRzX3RvX3BpeGVsczogWzEgLyBhLnBpeGVsc1RvR0xVbml0c1swXSwgMSAvIGEucGl4ZWxzVG9HTFVuaXRzWzFdXVxuICAgICAgfTtcbiAgICB9LFxuICAgICAgICBGaSA9IGZ1bmN0aW9uIEZpKGUsIGksIG8sIHIsIGEpIHtcbiAgICAgIHZhciBuID0gZS5saW5lQXRsYXMsXG4gICAgICAgICAgcyA9IFVpKGksIGUudHJhbnNmb3JtKSxcbiAgICAgICAgICBsID0gXCJyb3VuZFwiID09PSBvLmxheW91dC5nZXQoXCJsaW5lLWNhcFwiKSxcbiAgICAgICAgICBjID0gbi5nZXREYXNoKHIuZnJvbSwgbCksXG4gICAgICAgICAgdSA9IG4uZ2V0RGFzaChyLnRvLCBsKSxcbiAgICAgICAgICBoID0gYy53aWR0aCAqIGEuZnJvbVNjYWxlLFxuICAgICAgICAgIHAgPSB1LndpZHRoICogYS50b1NjYWxlO1xuICAgICAgcmV0dXJuIHQuZXh0ZW5kKGtpKGUsIGksIG8pLCB7XG4gICAgICAgIHVfcGF0dGVybnNjYWxlX2E6IFtzIC8gaCwgLWMuaGVpZ2h0IC8gMl0sXG4gICAgICAgIHVfcGF0dGVybnNjYWxlX2I6IFtzIC8gcCwgLXUuaGVpZ2h0IC8gMl0sXG4gICAgICAgIHVfc2RmZ2FtbWE6IG4ud2lkdGggLyAoMjU2ICogTWF0aC5taW4oaCwgcCkgKiB0LmJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbykgLyAyLFxuICAgICAgICB1X2ltYWdlOiAwLFxuICAgICAgICB1X3RleF95X2E6IGMueSxcbiAgICAgICAgdV90ZXhfeV9iOiB1LnksXG4gICAgICAgIHVfbWl4OiBhLnRcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBVaSh0LCBlKSB7XG4gICAgICByZXR1cm4gMSAvIHBlKHQsIDEsIGUudGlsZVpvb20pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIE5pKHQsIGUsIGkpIHtcbiAgICAgIHJldHVybiB0LnRyYW5zbGF0ZVBvc01hdHJpeChlLnRpbGVJRC5wb3NNYXRyaXgsIGUsIGkucGFpbnQuZ2V0KFwibGluZS10cmFuc2xhdGVcIiksIGkucGFpbnQuZ2V0KFwibGluZS10cmFuc2xhdGUtYW5jaG9yXCIpKTtcbiAgICB9XG5cbiAgICB2YXIgWmkgPSBmdW5jdGlvbiBaaSh0LCBlLCBpLCBvLCByKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB1X21hdHJpeDogdCxcbiAgICAgICAgdV90bF9wYXJlbnQ6IGUsXG4gICAgICAgIHVfc2NhbGVfcGFyZW50OiBpLFxuICAgICAgICB1X2J1ZmZlcl9zY2FsZTogMSxcbiAgICAgICAgdV9mYWRlX3Q6IG8ubWl4LFxuICAgICAgICB1X29wYWNpdHk6IG8ub3BhY2l0eSAqIHIucGFpbnQuZ2V0KFwicmFzdGVyLW9wYWNpdHlcIiksXG4gICAgICAgIHVfaW1hZ2UwOiAwLFxuICAgICAgICB1X2ltYWdlMTogMSxcbiAgICAgICAgdV9icmlnaHRuZXNzX2xvdzogci5wYWludC5nZXQoXCJyYXN0ZXItYnJpZ2h0bmVzcy1taW5cIiksXG4gICAgICAgIHVfYnJpZ2h0bmVzc19oaWdoOiByLnBhaW50LmdldChcInJhc3Rlci1icmlnaHRuZXNzLW1heFwiKSxcbiAgICAgICAgdV9zYXR1cmF0aW9uX2ZhY3RvcjogKG4gPSByLnBhaW50LmdldChcInJhc3Rlci1zYXR1cmF0aW9uXCIpLCBuID4gMCA/IDEgLSAxIC8gKDEuMDAxIC0gbikgOiAtbiksXG4gICAgICAgIHVfY29udHJhc3RfZmFjdG9yOiAoYSA9IHIucGFpbnQuZ2V0KFwicmFzdGVyLWNvbnRyYXN0XCIpLCBhID4gMCA/IDEgLyAoMSAtIGEpIDogMSArIGEpLFxuICAgICAgICB1X3NwaW5fd2VpZ2h0czogcWkoci5wYWludC5nZXQoXCJyYXN0ZXItaHVlLXJvdGF0ZVwiKSlcbiAgICAgIH07XG4gICAgICB2YXIgYSwgbjtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gcWkodCkge1xuICAgICAgdCAqPSBNYXRoLlBJIC8gMTgwO1xuICAgICAgdmFyIGUgPSBNYXRoLnNpbih0KSxcbiAgICAgICAgICBpID0gTWF0aC5jb3ModCk7XG4gICAgICByZXR1cm4gWygyICogaSArIDEpIC8gMywgKC1NYXRoLnNxcnQoMykgKiBlIC0gaSArIDEpIC8gMywgKE1hdGguc3FydCgzKSAqIGUgLSBpICsgMSkgLyAzXTtcbiAgICB9XG5cbiAgICB2YXIgamksXG4gICAgICAgIFZpID0gZnVuY3Rpb24gVmkodCwgZSwgaSwgbywgciwgYSwgbiwgcywgbCwgYykge1xuICAgICAgdmFyIHUgPSByLnRyYW5zZm9ybTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVfaXNfc2l6ZV96b29tX2NvbnN0YW50OiArKFwiY29uc3RhbnRcIiA9PT0gdCB8fCBcInNvdXJjZVwiID09PSB0KSxcbiAgICAgICAgdV9pc19zaXplX2ZlYXR1cmVfY29uc3RhbnQ6ICsoXCJjb25zdGFudFwiID09PSB0IHx8IFwiY2FtZXJhXCIgPT09IHQpLFxuICAgICAgICB1X3NpemVfdDogZSA/IGUudVNpemVUIDogMCxcbiAgICAgICAgdV9zaXplOiBlID8gZS51U2l6ZSA6IDAsXG4gICAgICAgIHVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZTogdS5jYW1lcmFUb0NlbnRlckRpc3RhbmNlLFxuICAgICAgICB1X3BpdGNoOiB1LnBpdGNoIC8gMzYwICogMiAqIE1hdGguUEksXG4gICAgICAgIHVfcm90YXRlX3N5bWJvbDogK2ksXG4gICAgICAgIHVfYXNwZWN0X3JhdGlvOiB1LndpZHRoIC8gdS5oZWlnaHQsXG4gICAgICAgIHVfZmFkZV9jaGFuZ2U6IHIub3B0aW9ucy5mYWRlRHVyYXRpb24gPyByLnN5bWJvbEZhZGVDaGFuZ2UgOiAxLFxuICAgICAgICB1X21hdHJpeDogYSxcbiAgICAgICAgdV9sYWJlbF9wbGFuZV9tYXRyaXg6IG4sXG4gICAgICAgIHVfY29vcmRfbWF0cml4OiBzLFxuICAgICAgICB1X2lzX3RleHQ6ICtsLFxuICAgICAgICB1X3BpdGNoX3dpdGhfbWFwOiArbyxcbiAgICAgICAgdV90ZXhzaXplOiBjLFxuICAgICAgICB1X3RleHR1cmU6IDBcbiAgICAgIH07XG4gICAgfSxcbiAgICAgICAgR2kgPSBmdW5jdGlvbiBHaShlLCBpLCBvLCByLCBhLCBuLCBzLCBsLCBjLCB1LCBoKSB7XG4gICAgICB2YXIgcCA9IGEudHJhbnNmb3JtO1xuICAgICAgcmV0dXJuIHQuZXh0ZW5kKFZpKGUsIGksIG8sIHIsIGEsIG4sIHMsIGwsIGMsIHUpLCB7XG4gICAgICAgIHVfZ2FtbWFfc2NhbGU6IHIgPyBNYXRoLmNvcyhwLl9waXRjaCkgKiBwLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UgOiAxLFxuICAgICAgICB1X2RldmljZV9waXhlbF9yYXRpbzogdC5icm93c2VyLmRldmljZVBpeGVsUmF0aW8sXG4gICAgICAgIHVfaXNfaGFsbzogK2hcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgICAgIFdpID0gZnVuY3Rpb24gV2koZSwgaSwgbywgciwgYSwgbiwgcywgbCwgYywgdSkge1xuICAgICAgcmV0dXJuIHQuZXh0ZW5kKEdpKGUsIGksIG8sIHIsIGEsIG4sIHMsIGwsICEwLCBjLCAhMCksIHtcbiAgICAgICAgdV90ZXhzaXplX2ljb246IHUsXG4gICAgICAgIHVfdGV4dHVyZV9pY29uOiAxXG4gICAgICB9KTtcbiAgICB9LFxuICAgICAgICBYaSA9IGZ1bmN0aW9uIFhpKHQsIGUsIGkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVfbWF0cml4OiB0LFxuICAgICAgICB1X29wYWNpdHk6IGUsXG4gICAgICAgIHVfY29sb3I6IGlcbiAgICAgIH07XG4gICAgfSxcbiAgICAgICAgSGkgPSBmdW5jdGlvbiBIaShlLCBpLCBvLCByLCBhLCBuKSB7XG4gICAgICByZXR1cm4gdC5leHRlbmQoZnVuY3Rpb24gKHQsIGUsIGksIG8pIHtcbiAgICAgICAgdmFyIHIgPSBpLmltYWdlTWFuYWdlci5nZXRQYXR0ZXJuKHQuZnJvbS50b1N0cmluZygpKSxcbiAgICAgICAgICAgIGEgPSBpLmltYWdlTWFuYWdlci5nZXRQYXR0ZXJuKHQudG8udG9TdHJpbmcoKSksXG4gICAgICAgICAgICBuID0gaS5pbWFnZU1hbmFnZXIuZ2V0UGl4ZWxTaXplKCksXG4gICAgICAgICAgICBzID0gbi53aWR0aCxcbiAgICAgICAgICAgIGwgPSBuLmhlaWdodCxcbiAgICAgICAgICAgIGMgPSBNYXRoLnBvdygyLCBvLnRpbGVJRC5vdmVyc2NhbGVkWiksXG4gICAgICAgICAgICB1ID0gby50aWxlU2l6ZSAqIE1hdGgucG93KDIsIGkudHJhbnNmb3JtLnRpbGVab29tKSAvIGMsXG4gICAgICAgICAgICBoID0gdSAqIChvLnRpbGVJRC5jYW5vbmljYWwueCArIG8udGlsZUlELndyYXAgKiBjKSxcbiAgICAgICAgICAgIHAgPSB1ICogby50aWxlSUQuY2Fub25pY2FsLnk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdV9pbWFnZTogMCxcbiAgICAgICAgICB1X3BhdHRlcm5fdGxfYTogci50bCxcbiAgICAgICAgICB1X3BhdHRlcm5fYnJfYTogci5icixcbiAgICAgICAgICB1X3BhdHRlcm5fdGxfYjogYS50bCxcbiAgICAgICAgICB1X3BhdHRlcm5fYnJfYjogYS5icixcbiAgICAgICAgICB1X3RleHNpemU6IFtzLCBsXSxcbiAgICAgICAgICB1X21peDogZS50LFxuICAgICAgICAgIHVfcGF0dGVybl9zaXplX2E6IHIuZGlzcGxheVNpemUsXG4gICAgICAgICAgdV9wYXR0ZXJuX3NpemVfYjogYS5kaXNwbGF5U2l6ZSxcbiAgICAgICAgICB1X3NjYWxlX2E6IGUuZnJvbVNjYWxlLFxuICAgICAgICAgIHVfc2NhbGVfYjogZS50b1NjYWxlLFxuICAgICAgICAgIHVfdGlsZV91bml0c190b19waXhlbHM6IDEgLyBwZShvLCAxLCBpLnRyYW5zZm9ybS50aWxlWm9vbSksXG4gICAgICAgICAgdV9waXhlbF9jb29yZF91cHBlcjogW2ggPj4gMTYsIHAgPj4gMTZdLFxuICAgICAgICAgIHVfcGl4ZWxfY29vcmRfbG93ZXI6IFs2NTUzNSAmIGgsIDY1NTM1ICYgcF1cbiAgICAgICAgfTtcbiAgICAgIH0ociwgbiwgbywgYSksIHtcbiAgICAgICAgdV9tYXRyaXg6IGUsXG4gICAgICAgIHVfb3BhY2l0eTogaVxuICAgICAgfSk7XG4gICAgfSxcbiAgICAgICAgS2kgPSB7XG4gICAgICBmaWxsRXh0cnVzaW9uOiBmdW5jdGlvbiBmaWxsRXh0cnVzaW9uKGUsIGkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1X21hdHJpeDogbmV3IHQuVW5pZm9ybU1hdHJpeDRmKGUsIGkudV9tYXRyaXgpLFxuICAgICAgICAgIHVfbGlnaHRwb3M6IG5ldyB0LlVuaWZvcm0zZihlLCBpLnVfbGlnaHRwb3MpLFxuICAgICAgICAgIHVfbGlnaHRpbnRlbnNpdHk6IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfbGlnaHRpbnRlbnNpdHkpLFxuICAgICAgICAgIHVfbGlnaHRjb2xvcjogbmV3IHQuVW5pZm9ybTNmKGUsIGkudV9saWdodGNvbG9yKSxcbiAgICAgICAgICB1X3ZlcnRpY2FsX2dyYWRpZW50OiBuZXcgdC5Vbmlmb3JtMWYoZSwgaS51X3ZlcnRpY2FsX2dyYWRpZW50KSxcbiAgICAgICAgICB1X29wYWNpdHk6IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfb3BhY2l0eSlcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBmaWxsRXh0cnVzaW9uUGF0dGVybjogZnVuY3Rpb24gZmlsbEV4dHJ1c2lvblBhdHRlcm4oZSwgaSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVfbWF0cml4OiBuZXcgdC5Vbmlmb3JtTWF0cml4NGYoZSwgaS51X21hdHJpeCksXG4gICAgICAgICAgdV9saWdodHBvczogbmV3IHQuVW5pZm9ybTNmKGUsIGkudV9saWdodHBvcyksXG4gICAgICAgICAgdV9saWdodGludGVuc2l0eTogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9saWdodGludGVuc2l0eSksXG4gICAgICAgICAgdV9saWdodGNvbG9yOiBuZXcgdC5Vbmlmb3JtM2YoZSwgaS51X2xpZ2h0Y29sb3IpLFxuICAgICAgICAgIHVfdmVydGljYWxfZ3JhZGllbnQ6IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfdmVydGljYWxfZ3JhZGllbnQpLFxuICAgICAgICAgIHVfaGVpZ2h0X2ZhY3RvcjogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9oZWlnaHRfZmFjdG9yKSxcbiAgICAgICAgICB1X2ltYWdlOiBuZXcgdC5Vbmlmb3JtMWkoZSwgaS51X2ltYWdlKSxcbiAgICAgICAgICB1X3RleHNpemU6IG5ldyB0LlVuaWZvcm0yZihlLCBpLnVfdGV4c2l6ZSksXG4gICAgICAgICAgdV9waXhlbF9jb29yZF91cHBlcjogbmV3IHQuVW5pZm9ybTJmKGUsIGkudV9waXhlbF9jb29yZF91cHBlciksXG4gICAgICAgICAgdV9waXhlbF9jb29yZF9sb3dlcjogbmV3IHQuVW5pZm9ybTJmKGUsIGkudV9waXhlbF9jb29yZF9sb3dlciksXG4gICAgICAgICAgdV9zY2FsZTogbmV3IHQuVW5pZm9ybTNmKGUsIGkudV9zY2FsZSksXG4gICAgICAgICAgdV9mYWRlOiBuZXcgdC5Vbmlmb3JtMWYoZSwgaS51X2ZhZGUpLFxuICAgICAgICAgIHVfb3BhY2l0eTogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9vcGFjaXR5KVxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIGZpbGw6IGZ1bmN0aW9uIGZpbGwoZSwgaSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVfbWF0cml4OiBuZXcgdC5Vbmlmb3JtTWF0cml4NGYoZSwgaS51X21hdHJpeClcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBmaWxsUGF0dGVybjogZnVuY3Rpb24gZmlsbFBhdHRlcm4oZSwgaSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVfbWF0cml4OiBuZXcgdC5Vbmlmb3JtTWF0cml4NGYoZSwgaS51X21hdHJpeCksXG4gICAgICAgICAgdV9pbWFnZTogbmV3IHQuVW5pZm9ybTFpKGUsIGkudV9pbWFnZSksXG4gICAgICAgICAgdV90ZXhzaXplOiBuZXcgdC5Vbmlmb3JtMmYoZSwgaS51X3RleHNpemUpLFxuICAgICAgICAgIHVfcGl4ZWxfY29vcmRfdXBwZXI6IG5ldyB0LlVuaWZvcm0yZihlLCBpLnVfcGl4ZWxfY29vcmRfdXBwZXIpLFxuICAgICAgICAgIHVfcGl4ZWxfY29vcmRfbG93ZXI6IG5ldyB0LlVuaWZvcm0yZihlLCBpLnVfcGl4ZWxfY29vcmRfbG93ZXIpLFxuICAgICAgICAgIHVfc2NhbGU6IG5ldyB0LlVuaWZvcm0zZihlLCBpLnVfc2NhbGUpLFxuICAgICAgICAgIHVfZmFkZTogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9mYWRlKVxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIGZpbGxPdXRsaW5lOiBmdW5jdGlvbiBmaWxsT3V0bGluZShlLCBpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdV9tYXRyaXg6IG5ldyB0LlVuaWZvcm1NYXRyaXg0ZihlLCBpLnVfbWF0cml4KSxcbiAgICAgICAgICB1X3dvcmxkOiBuZXcgdC5Vbmlmb3JtMmYoZSwgaS51X3dvcmxkKVxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIGZpbGxPdXRsaW5lUGF0dGVybjogZnVuY3Rpb24gZmlsbE91dGxpbmVQYXR0ZXJuKGUsIGkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1X21hdHJpeDogbmV3IHQuVW5pZm9ybU1hdHJpeDRmKGUsIGkudV9tYXRyaXgpLFxuICAgICAgICAgIHVfd29ybGQ6IG5ldyB0LlVuaWZvcm0yZihlLCBpLnVfd29ybGQpLFxuICAgICAgICAgIHVfaW1hZ2U6IG5ldyB0LlVuaWZvcm0xaShlLCBpLnVfaW1hZ2UpLFxuICAgICAgICAgIHVfdGV4c2l6ZTogbmV3IHQuVW5pZm9ybTJmKGUsIGkudV90ZXhzaXplKSxcbiAgICAgICAgICB1X3BpeGVsX2Nvb3JkX3VwcGVyOiBuZXcgdC5Vbmlmb3JtMmYoZSwgaS51X3BpeGVsX2Nvb3JkX3VwcGVyKSxcbiAgICAgICAgICB1X3BpeGVsX2Nvb3JkX2xvd2VyOiBuZXcgdC5Vbmlmb3JtMmYoZSwgaS51X3BpeGVsX2Nvb3JkX2xvd2VyKSxcbiAgICAgICAgICB1X3NjYWxlOiBuZXcgdC5Vbmlmb3JtM2YoZSwgaS51X3NjYWxlKSxcbiAgICAgICAgICB1X2ZhZGU6IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfZmFkZSlcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBjaXJjbGU6IGZ1bmN0aW9uIGNpcmNsZShlLCBpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlOiBuZXcgdC5Vbmlmb3JtMWYoZSwgaS51X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UpLFxuICAgICAgICAgIHVfc2NhbGVfd2l0aF9tYXA6IG5ldyB0LlVuaWZvcm0xaShlLCBpLnVfc2NhbGVfd2l0aF9tYXApLFxuICAgICAgICAgIHVfcGl0Y2hfd2l0aF9tYXA6IG5ldyB0LlVuaWZvcm0xaShlLCBpLnVfcGl0Y2hfd2l0aF9tYXApLFxuICAgICAgICAgIHVfZXh0cnVkZV9zY2FsZTogbmV3IHQuVW5pZm9ybTJmKGUsIGkudV9leHRydWRlX3NjYWxlKSxcbiAgICAgICAgICB1X2RldmljZV9waXhlbF9yYXRpbzogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9kZXZpY2VfcGl4ZWxfcmF0aW8pLFxuICAgICAgICAgIHVfbWF0cml4OiBuZXcgdC5Vbmlmb3JtTWF0cml4NGYoZSwgaS51X21hdHJpeClcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBjb2xsaXNpb25Cb3g6IGZ1bmN0aW9uIGNvbGxpc2lvbkJveChlLCBpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdV9tYXRyaXg6IG5ldyB0LlVuaWZvcm1NYXRyaXg0ZihlLCBpLnVfbWF0cml4KSxcbiAgICAgICAgICB1X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2U6IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSksXG4gICAgICAgICAgdV9waXhlbHNfdG9fdGlsZV91bml0czogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9waXhlbHNfdG9fdGlsZV91bml0cyksXG4gICAgICAgICAgdV9leHRydWRlX3NjYWxlOiBuZXcgdC5Vbmlmb3JtMmYoZSwgaS51X2V4dHJ1ZGVfc2NhbGUpLFxuICAgICAgICAgIHVfb3ZlcnNjYWxlX2ZhY3RvcjogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9vdmVyc2NhbGVfZmFjdG9yKVxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIGNvbGxpc2lvbkNpcmNsZTogZnVuY3Rpb24gY29sbGlzaW9uQ2lyY2xlKGUsIGkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1X21hdHJpeDogbmV3IHQuVW5pZm9ybU1hdHJpeDRmKGUsIGkudV9tYXRyaXgpLFxuICAgICAgICAgIHVfaW52X21hdHJpeDogbmV3IHQuVW5pZm9ybU1hdHJpeDRmKGUsIGkudV9pbnZfbWF0cml4KSxcbiAgICAgICAgICB1X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2U6IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSksXG4gICAgICAgICAgdV92aWV3cG9ydF9zaXplOiBuZXcgdC5Vbmlmb3JtMmYoZSwgaS51X3ZpZXdwb3J0X3NpemUpXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAgZGVidWc6IGZ1bmN0aW9uIGRlYnVnKGUsIGkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1X2NvbG9yOiBuZXcgdC5Vbmlmb3JtQ29sb3IoZSwgaS51X2NvbG9yKSxcbiAgICAgICAgICB1X21hdHJpeDogbmV3IHQuVW5pZm9ybU1hdHJpeDRmKGUsIGkudV9tYXRyaXgpLFxuICAgICAgICAgIHVfb3ZlcmxheTogbmV3IHQuVW5pZm9ybTFpKGUsIGkudV9vdmVybGF5KSxcbiAgICAgICAgICB1X292ZXJsYXlfc2NhbGU6IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfb3ZlcmxheV9zY2FsZSlcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBjbGlwcGluZ01hc2s6IGZ1bmN0aW9uIGNsaXBwaW5nTWFzayhlLCBpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdV9tYXRyaXg6IG5ldyB0LlVuaWZvcm1NYXRyaXg0ZihlLCBpLnVfbWF0cml4KVxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIGhlYXRtYXA6IGZ1bmN0aW9uIGhlYXRtYXAoZSwgaSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVfZXh0cnVkZV9zY2FsZTogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9leHRydWRlX3NjYWxlKSxcbiAgICAgICAgICB1X2ludGVuc2l0eTogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9pbnRlbnNpdHkpLFxuICAgICAgICAgIHVfbWF0cml4OiBuZXcgdC5Vbmlmb3JtTWF0cml4NGYoZSwgaS51X21hdHJpeClcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBoZWF0bWFwVGV4dHVyZTogZnVuY3Rpb24gaGVhdG1hcFRleHR1cmUoZSwgaSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVfbWF0cml4OiBuZXcgdC5Vbmlmb3JtTWF0cml4NGYoZSwgaS51X21hdHJpeCksXG4gICAgICAgICAgdV93b3JsZDogbmV3IHQuVW5pZm9ybTJmKGUsIGkudV93b3JsZCksXG4gICAgICAgICAgdV9pbWFnZTogbmV3IHQuVW5pZm9ybTFpKGUsIGkudV9pbWFnZSksXG4gICAgICAgICAgdV9jb2xvcl9yYW1wOiBuZXcgdC5Vbmlmb3JtMWkoZSwgaS51X2NvbG9yX3JhbXApLFxuICAgICAgICAgIHVfb3BhY2l0eTogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9vcGFjaXR5KVxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIGhpbGxzaGFkZTogZnVuY3Rpb24gaGlsbHNoYWRlKGUsIGkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1X21hdHJpeDogbmV3IHQuVW5pZm9ybU1hdHJpeDRmKGUsIGkudV9tYXRyaXgpLFxuICAgICAgICAgIHVfaW1hZ2U6IG5ldyB0LlVuaWZvcm0xaShlLCBpLnVfaW1hZ2UpLFxuICAgICAgICAgIHVfbGF0cmFuZ2U6IG5ldyB0LlVuaWZvcm0yZihlLCBpLnVfbGF0cmFuZ2UpLFxuICAgICAgICAgIHVfbGlnaHQ6IG5ldyB0LlVuaWZvcm0yZihlLCBpLnVfbGlnaHQpLFxuICAgICAgICAgIHVfc2hhZG93OiBuZXcgdC5Vbmlmb3JtQ29sb3IoZSwgaS51X3NoYWRvdyksXG4gICAgICAgICAgdV9oaWdobGlnaHQ6IG5ldyB0LlVuaWZvcm1Db2xvcihlLCBpLnVfaGlnaGxpZ2h0KSxcbiAgICAgICAgICB1X2FjY2VudDogbmV3IHQuVW5pZm9ybUNvbG9yKGUsIGkudV9hY2NlbnQpXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAgaGlsbHNoYWRlUHJlcGFyZTogZnVuY3Rpb24gaGlsbHNoYWRlUHJlcGFyZShlLCBpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdV9tYXRyaXg6IG5ldyB0LlVuaWZvcm1NYXRyaXg0ZihlLCBpLnVfbWF0cml4KSxcbiAgICAgICAgICB1X2ltYWdlOiBuZXcgdC5Vbmlmb3JtMWkoZSwgaS51X2ltYWdlKSxcbiAgICAgICAgICB1X2RpbWVuc2lvbjogbmV3IHQuVW5pZm9ybTJmKGUsIGkudV9kaW1lbnNpb24pLFxuICAgICAgICAgIHVfem9vbTogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV96b29tKSxcbiAgICAgICAgICB1X3VucGFjazogbmV3IHQuVW5pZm9ybTRmKGUsIGkudV91bnBhY2spXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAgbGluZTogZnVuY3Rpb24gbGluZShlLCBpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdV9tYXRyaXg6IG5ldyB0LlVuaWZvcm1NYXRyaXg0ZihlLCBpLnVfbWF0cml4KSxcbiAgICAgICAgICB1X3JhdGlvOiBuZXcgdC5Vbmlmb3JtMWYoZSwgaS51X3JhdGlvKSxcbiAgICAgICAgICB1X2RldmljZV9waXhlbF9yYXRpbzogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9kZXZpY2VfcGl4ZWxfcmF0aW8pLFxuICAgICAgICAgIHVfdW5pdHNfdG9fcGl4ZWxzOiBuZXcgdC5Vbmlmb3JtMmYoZSwgaS51X3VuaXRzX3RvX3BpeGVscylcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBsaW5lR3JhZGllbnQ6IGZ1bmN0aW9uIGxpbmVHcmFkaWVudChlLCBpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdV9tYXRyaXg6IG5ldyB0LlVuaWZvcm1NYXRyaXg0ZihlLCBpLnVfbWF0cml4KSxcbiAgICAgICAgICB1X3JhdGlvOiBuZXcgdC5Vbmlmb3JtMWYoZSwgaS51X3JhdGlvKSxcbiAgICAgICAgICB1X2RldmljZV9waXhlbF9yYXRpbzogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9kZXZpY2VfcGl4ZWxfcmF0aW8pLFxuICAgICAgICAgIHVfdW5pdHNfdG9fcGl4ZWxzOiBuZXcgdC5Vbmlmb3JtMmYoZSwgaS51X3VuaXRzX3RvX3BpeGVscyksXG4gICAgICAgICAgdV9pbWFnZTogbmV3IHQuVW5pZm9ybTFpKGUsIGkudV9pbWFnZSksXG4gICAgICAgICAgdV9pbWFnZV9oZWlnaHQ6IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfaW1hZ2VfaGVpZ2h0KVxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIGxpbmVQYXR0ZXJuOiBmdW5jdGlvbiBsaW5lUGF0dGVybihlLCBpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdV9tYXRyaXg6IG5ldyB0LlVuaWZvcm1NYXRyaXg0ZihlLCBpLnVfbWF0cml4KSxcbiAgICAgICAgICB1X3RleHNpemU6IG5ldyB0LlVuaWZvcm0yZihlLCBpLnVfdGV4c2l6ZSksXG4gICAgICAgICAgdV9yYXRpbzogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9yYXRpbyksXG4gICAgICAgICAgdV9kZXZpY2VfcGl4ZWxfcmF0aW86IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfZGV2aWNlX3BpeGVsX3JhdGlvKSxcbiAgICAgICAgICB1X2ltYWdlOiBuZXcgdC5Vbmlmb3JtMWkoZSwgaS51X2ltYWdlKSxcbiAgICAgICAgICB1X3VuaXRzX3RvX3BpeGVsczogbmV3IHQuVW5pZm9ybTJmKGUsIGkudV91bml0c190b19waXhlbHMpLFxuICAgICAgICAgIHVfc2NhbGU6IG5ldyB0LlVuaWZvcm0zZihlLCBpLnVfc2NhbGUpLFxuICAgICAgICAgIHVfZmFkZTogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9mYWRlKVxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIGxpbmVTREY6IGZ1bmN0aW9uIGxpbmVTREYoZSwgaSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVfbWF0cml4OiBuZXcgdC5Vbmlmb3JtTWF0cml4NGYoZSwgaS51X21hdHJpeCksXG4gICAgICAgICAgdV9yYXRpbzogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9yYXRpbyksXG4gICAgICAgICAgdV9kZXZpY2VfcGl4ZWxfcmF0aW86IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfZGV2aWNlX3BpeGVsX3JhdGlvKSxcbiAgICAgICAgICB1X3VuaXRzX3RvX3BpeGVsczogbmV3IHQuVW5pZm9ybTJmKGUsIGkudV91bml0c190b19waXhlbHMpLFxuICAgICAgICAgIHVfcGF0dGVybnNjYWxlX2E6IG5ldyB0LlVuaWZvcm0yZihlLCBpLnVfcGF0dGVybnNjYWxlX2EpLFxuICAgICAgICAgIHVfcGF0dGVybnNjYWxlX2I6IG5ldyB0LlVuaWZvcm0yZihlLCBpLnVfcGF0dGVybnNjYWxlX2IpLFxuICAgICAgICAgIHVfc2RmZ2FtbWE6IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfc2RmZ2FtbWEpLFxuICAgICAgICAgIHVfaW1hZ2U6IG5ldyB0LlVuaWZvcm0xaShlLCBpLnVfaW1hZ2UpLFxuICAgICAgICAgIHVfdGV4X3lfYTogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV90ZXhfeV9hKSxcbiAgICAgICAgICB1X3RleF95X2I6IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfdGV4X3lfYiksXG4gICAgICAgICAgdV9taXg6IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfbWl4KVxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIHJhc3RlcjogZnVuY3Rpb24gcmFzdGVyKGUsIGkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1X21hdHJpeDogbmV3IHQuVW5pZm9ybU1hdHJpeDRmKGUsIGkudV9tYXRyaXgpLFxuICAgICAgICAgIHVfdGxfcGFyZW50OiBuZXcgdC5Vbmlmb3JtMmYoZSwgaS51X3RsX3BhcmVudCksXG4gICAgICAgICAgdV9zY2FsZV9wYXJlbnQ6IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfc2NhbGVfcGFyZW50KSxcbiAgICAgICAgICB1X2J1ZmZlcl9zY2FsZTogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9idWZmZXJfc2NhbGUpLFxuICAgICAgICAgIHVfZmFkZV90OiBuZXcgdC5Vbmlmb3JtMWYoZSwgaS51X2ZhZGVfdCksXG4gICAgICAgICAgdV9vcGFjaXR5OiBuZXcgdC5Vbmlmb3JtMWYoZSwgaS51X29wYWNpdHkpLFxuICAgICAgICAgIHVfaW1hZ2UwOiBuZXcgdC5Vbmlmb3JtMWkoZSwgaS51X2ltYWdlMCksXG4gICAgICAgICAgdV9pbWFnZTE6IG5ldyB0LlVuaWZvcm0xaShlLCBpLnVfaW1hZ2UxKSxcbiAgICAgICAgICB1X2JyaWdodG5lc3NfbG93OiBuZXcgdC5Vbmlmb3JtMWYoZSwgaS51X2JyaWdodG5lc3NfbG93KSxcbiAgICAgICAgICB1X2JyaWdodG5lc3NfaGlnaDogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9icmlnaHRuZXNzX2hpZ2gpLFxuICAgICAgICAgIHVfc2F0dXJhdGlvbl9mYWN0b3I6IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfc2F0dXJhdGlvbl9mYWN0b3IpLFxuICAgICAgICAgIHVfY29udHJhc3RfZmFjdG9yOiBuZXcgdC5Vbmlmb3JtMWYoZSwgaS51X2NvbnRyYXN0X2ZhY3RvciksXG4gICAgICAgICAgdV9zcGluX3dlaWdodHM6IG5ldyB0LlVuaWZvcm0zZihlLCBpLnVfc3Bpbl93ZWlnaHRzKVxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIHN5bWJvbEljb246IGZ1bmN0aW9uIHN5bWJvbEljb24oZSwgaSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVfaXNfc2l6ZV96b29tX2NvbnN0YW50OiBuZXcgdC5Vbmlmb3JtMWkoZSwgaS51X2lzX3NpemVfem9vbV9jb25zdGFudCksXG4gICAgICAgICAgdV9pc19zaXplX2ZlYXR1cmVfY29uc3RhbnQ6IG5ldyB0LlVuaWZvcm0xaShlLCBpLnVfaXNfc2l6ZV9mZWF0dXJlX2NvbnN0YW50KSxcbiAgICAgICAgICB1X3NpemVfdDogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9zaXplX3QpLFxuICAgICAgICAgIHVfc2l6ZTogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9zaXplKSxcbiAgICAgICAgICB1X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2U6IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSksXG4gICAgICAgICAgdV9waXRjaDogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9waXRjaCksXG4gICAgICAgICAgdV9yb3RhdGVfc3ltYm9sOiBuZXcgdC5Vbmlmb3JtMWkoZSwgaS51X3JvdGF0ZV9zeW1ib2wpLFxuICAgICAgICAgIHVfYXNwZWN0X3JhdGlvOiBuZXcgdC5Vbmlmb3JtMWYoZSwgaS51X2FzcGVjdF9yYXRpbyksXG4gICAgICAgICAgdV9mYWRlX2NoYW5nZTogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9mYWRlX2NoYW5nZSksXG4gICAgICAgICAgdV9tYXRyaXg6IG5ldyB0LlVuaWZvcm1NYXRyaXg0ZihlLCBpLnVfbWF0cml4KSxcbiAgICAgICAgICB1X2xhYmVsX3BsYW5lX21hdHJpeDogbmV3IHQuVW5pZm9ybU1hdHJpeDRmKGUsIGkudV9sYWJlbF9wbGFuZV9tYXRyaXgpLFxuICAgICAgICAgIHVfY29vcmRfbWF0cml4OiBuZXcgdC5Vbmlmb3JtTWF0cml4NGYoZSwgaS51X2Nvb3JkX21hdHJpeCksXG4gICAgICAgICAgdV9pc190ZXh0OiBuZXcgdC5Vbmlmb3JtMWkoZSwgaS51X2lzX3RleHQpLFxuICAgICAgICAgIHVfcGl0Y2hfd2l0aF9tYXA6IG5ldyB0LlVuaWZvcm0xaShlLCBpLnVfcGl0Y2hfd2l0aF9tYXApLFxuICAgICAgICAgIHVfdGV4c2l6ZTogbmV3IHQuVW5pZm9ybTJmKGUsIGkudV90ZXhzaXplKSxcbiAgICAgICAgICB1X3RleHR1cmU6IG5ldyB0LlVuaWZvcm0xaShlLCBpLnVfdGV4dHVyZSlcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBzeW1ib2xTREY6IGZ1bmN0aW9uIHN5bWJvbFNERihlLCBpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdV9pc19zaXplX3pvb21fY29uc3RhbnQ6IG5ldyB0LlVuaWZvcm0xaShlLCBpLnVfaXNfc2l6ZV96b29tX2NvbnN0YW50KSxcbiAgICAgICAgICB1X2lzX3NpemVfZmVhdHVyZV9jb25zdGFudDogbmV3IHQuVW5pZm9ybTFpKGUsIGkudV9pc19zaXplX2ZlYXR1cmVfY29uc3RhbnQpLFxuICAgICAgICAgIHVfc2l6ZV90OiBuZXcgdC5Vbmlmb3JtMWYoZSwgaS51X3NpemVfdCksXG4gICAgICAgICAgdV9zaXplOiBuZXcgdC5Vbmlmb3JtMWYoZSwgaS51X3NpemUpLFxuICAgICAgICAgIHVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZTogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlKSxcbiAgICAgICAgICB1X3BpdGNoOiBuZXcgdC5Vbmlmb3JtMWYoZSwgaS51X3BpdGNoKSxcbiAgICAgICAgICB1X3JvdGF0ZV9zeW1ib2w6IG5ldyB0LlVuaWZvcm0xaShlLCBpLnVfcm90YXRlX3N5bWJvbCksXG4gICAgICAgICAgdV9hc3BlY3RfcmF0aW86IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfYXNwZWN0X3JhdGlvKSxcbiAgICAgICAgICB1X2ZhZGVfY2hhbmdlOiBuZXcgdC5Vbmlmb3JtMWYoZSwgaS51X2ZhZGVfY2hhbmdlKSxcbiAgICAgICAgICB1X21hdHJpeDogbmV3IHQuVW5pZm9ybU1hdHJpeDRmKGUsIGkudV9tYXRyaXgpLFxuICAgICAgICAgIHVfbGFiZWxfcGxhbmVfbWF0cml4OiBuZXcgdC5Vbmlmb3JtTWF0cml4NGYoZSwgaS51X2xhYmVsX3BsYW5lX21hdHJpeCksXG4gICAgICAgICAgdV9jb29yZF9tYXRyaXg6IG5ldyB0LlVuaWZvcm1NYXRyaXg0ZihlLCBpLnVfY29vcmRfbWF0cml4KSxcbiAgICAgICAgICB1X2lzX3RleHQ6IG5ldyB0LlVuaWZvcm0xaShlLCBpLnVfaXNfdGV4dCksXG4gICAgICAgICAgdV9waXRjaF93aXRoX21hcDogbmV3IHQuVW5pZm9ybTFpKGUsIGkudV9waXRjaF93aXRoX21hcCksXG4gICAgICAgICAgdV90ZXhzaXplOiBuZXcgdC5Vbmlmb3JtMmYoZSwgaS51X3RleHNpemUpLFxuICAgICAgICAgIHVfdGV4dHVyZTogbmV3IHQuVW5pZm9ybTFpKGUsIGkudV90ZXh0dXJlKSxcbiAgICAgICAgICB1X2dhbW1hX3NjYWxlOiBuZXcgdC5Vbmlmb3JtMWYoZSwgaS51X2dhbW1hX3NjYWxlKSxcbiAgICAgICAgICB1X2RldmljZV9waXhlbF9yYXRpbzogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9kZXZpY2VfcGl4ZWxfcmF0aW8pLFxuICAgICAgICAgIHVfaXNfaGFsbzogbmV3IHQuVW5pZm9ybTFpKGUsIGkudV9pc19oYWxvKVxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIHN5bWJvbFRleHRBbmRJY29uOiBmdW5jdGlvbiBzeW1ib2xUZXh0QW5kSWNvbihlLCBpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdV9pc19zaXplX3pvb21fY29uc3RhbnQ6IG5ldyB0LlVuaWZvcm0xaShlLCBpLnVfaXNfc2l6ZV96b29tX2NvbnN0YW50KSxcbiAgICAgICAgICB1X2lzX3NpemVfZmVhdHVyZV9jb25zdGFudDogbmV3IHQuVW5pZm9ybTFpKGUsIGkudV9pc19zaXplX2ZlYXR1cmVfY29uc3RhbnQpLFxuICAgICAgICAgIHVfc2l6ZV90OiBuZXcgdC5Vbmlmb3JtMWYoZSwgaS51X3NpemVfdCksXG4gICAgICAgICAgdV9zaXplOiBuZXcgdC5Vbmlmb3JtMWYoZSwgaS51X3NpemUpLFxuICAgICAgICAgIHVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZTogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlKSxcbiAgICAgICAgICB1X3BpdGNoOiBuZXcgdC5Vbmlmb3JtMWYoZSwgaS51X3BpdGNoKSxcbiAgICAgICAgICB1X3JvdGF0ZV9zeW1ib2w6IG5ldyB0LlVuaWZvcm0xaShlLCBpLnVfcm90YXRlX3N5bWJvbCksXG4gICAgICAgICAgdV9hc3BlY3RfcmF0aW86IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfYXNwZWN0X3JhdGlvKSxcbiAgICAgICAgICB1X2ZhZGVfY2hhbmdlOiBuZXcgdC5Vbmlmb3JtMWYoZSwgaS51X2ZhZGVfY2hhbmdlKSxcbiAgICAgICAgICB1X21hdHJpeDogbmV3IHQuVW5pZm9ybU1hdHJpeDRmKGUsIGkudV9tYXRyaXgpLFxuICAgICAgICAgIHVfbGFiZWxfcGxhbmVfbWF0cml4OiBuZXcgdC5Vbmlmb3JtTWF0cml4NGYoZSwgaS51X2xhYmVsX3BsYW5lX21hdHJpeCksXG4gICAgICAgICAgdV9jb29yZF9tYXRyaXg6IG5ldyB0LlVuaWZvcm1NYXRyaXg0ZihlLCBpLnVfY29vcmRfbWF0cml4KSxcbiAgICAgICAgICB1X2lzX3RleHQ6IG5ldyB0LlVuaWZvcm0xaShlLCBpLnVfaXNfdGV4dCksXG4gICAgICAgICAgdV9waXRjaF93aXRoX21hcDogbmV3IHQuVW5pZm9ybTFpKGUsIGkudV9waXRjaF93aXRoX21hcCksXG4gICAgICAgICAgdV90ZXhzaXplOiBuZXcgdC5Vbmlmb3JtMmYoZSwgaS51X3RleHNpemUpLFxuICAgICAgICAgIHVfdGV4c2l6ZV9pY29uOiBuZXcgdC5Vbmlmb3JtMmYoZSwgaS51X3RleHNpemVfaWNvbiksXG4gICAgICAgICAgdV90ZXh0dXJlOiBuZXcgdC5Vbmlmb3JtMWkoZSwgaS51X3RleHR1cmUpLFxuICAgICAgICAgIHVfdGV4dHVyZV9pY29uOiBuZXcgdC5Vbmlmb3JtMWkoZSwgaS51X3RleHR1cmVfaWNvbiksXG4gICAgICAgICAgdV9nYW1tYV9zY2FsZTogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9nYW1tYV9zY2FsZSksXG4gICAgICAgICAgdV9kZXZpY2VfcGl4ZWxfcmF0aW86IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfZGV2aWNlX3BpeGVsX3JhdGlvKSxcbiAgICAgICAgICB1X2lzX2hhbG86IG5ldyB0LlVuaWZvcm0xaShlLCBpLnVfaXNfaGFsbylcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBiYWNrZ3JvdW5kOiBmdW5jdGlvbiBiYWNrZ3JvdW5kKGUsIGkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1X21hdHJpeDogbmV3IHQuVW5pZm9ybU1hdHJpeDRmKGUsIGkudV9tYXRyaXgpLFxuICAgICAgICAgIHVfb3BhY2l0eTogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9vcGFjaXR5KSxcbiAgICAgICAgICB1X2NvbG9yOiBuZXcgdC5Vbmlmb3JtQ29sb3IoZSwgaS51X2NvbG9yKVxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIGJhY2tncm91bmRQYXR0ZXJuOiBmdW5jdGlvbiBiYWNrZ3JvdW5kUGF0dGVybihlLCBpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdV9tYXRyaXg6IG5ldyB0LlVuaWZvcm1NYXRyaXg0ZihlLCBpLnVfbWF0cml4KSxcbiAgICAgICAgICB1X29wYWNpdHk6IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfb3BhY2l0eSksXG4gICAgICAgICAgdV9pbWFnZTogbmV3IHQuVW5pZm9ybTFpKGUsIGkudV9pbWFnZSksXG4gICAgICAgICAgdV9wYXR0ZXJuX3RsX2E6IG5ldyB0LlVuaWZvcm0yZihlLCBpLnVfcGF0dGVybl90bF9hKSxcbiAgICAgICAgICB1X3BhdHRlcm5fYnJfYTogbmV3IHQuVW5pZm9ybTJmKGUsIGkudV9wYXR0ZXJuX2JyX2EpLFxuICAgICAgICAgIHVfcGF0dGVybl90bF9iOiBuZXcgdC5Vbmlmb3JtMmYoZSwgaS51X3BhdHRlcm5fdGxfYiksXG4gICAgICAgICAgdV9wYXR0ZXJuX2JyX2I6IG5ldyB0LlVuaWZvcm0yZihlLCBpLnVfcGF0dGVybl9icl9iKSxcbiAgICAgICAgICB1X3RleHNpemU6IG5ldyB0LlVuaWZvcm0yZihlLCBpLnVfdGV4c2l6ZSksXG4gICAgICAgICAgdV9taXg6IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfbWl4KSxcbiAgICAgICAgICB1X3BhdHRlcm5fc2l6ZV9hOiBuZXcgdC5Vbmlmb3JtMmYoZSwgaS51X3BhdHRlcm5fc2l6ZV9hKSxcbiAgICAgICAgICB1X3BhdHRlcm5fc2l6ZV9iOiBuZXcgdC5Vbmlmb3JtMmYoZSwgaS51X3BhdHRlcm5fc2l6ZV9iKSxcbiAgICAgICAgICB1X3NjYWxlX2E6IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfc2NhbGVfYSksXG4gICAgICAgICAgdV9zY2FsZV9iOiBuZXcgdC5Vbmlmb3JtMWYoZSwgaS51X3NjYWxlX2IpLFxuICAgICAgICAgIHVfcGl4ZWxfY29vcmRfdXBwZXI6IG5ldyB0LlVuaWZvcm0yZihlLCBpLnVfcGl4ZWxfY29vcmRfdXBwZXIpLFxuICAgICAgICAgIHVfcGl4ZWxfY29vcmRfbG93ZXI6IG5ldyB0LlVuaWZvcm0yZihlLCBpLnVfcGl4ZWxfY29vcmRfbG93ZXIpLFxuICAgICAgICAgIHVfdGlsZV91bml0c190b19waXhlbHM6IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfdGlsZV91bml0c190b19waXhlbHMpXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIFlpKGUsIGksIG8sIHIsIGEsIG4sIHMpIHtcbiAgICAgIGZvciAodmFyIGwgPSBlLmNvbnRleHQsIGMgPSBsLmdsLCB1ID0gZS51c2VQcm9ncmFtKFwiY29sbGlzaW9uQm94XCIpLCBoID0gW10sIHAgPSAwLCBkID0gMCwgXyA9IDA7IF8gPCByLmxlbmd0aDsgXysrKSB7XG4gICAgICAgIHZhciBmID0gcltfXSxcbiAgICAgICAgICAgIG0gPSBpLmdldFRpbGUoZiksXG4gICAgICAgICAgICBnID0gbS5nZXRCdWNrZXQobyk7XG5cbiAgICAgICAgaWYgKGcpIHtcbiAgICAgICAgICB2YXIgdiA9IGYucG9zTWF0cml4O1xuICAgICAgICAgIDAgPT09IGFbMF0gJiYgMCA9PT0gYVsxXSB8fCAodiA9IGUudHJhbnNsYXRlUG9zTWF0cml4KGYucG9zTWF0cml4LCBtLCBhLCBuKSk7XG4gICAgICAgICAgdmFyIHkgPSBzID8gZy50ZXh0Q29sbGlzaW9uQm94IDogZy5pY29uQ29sbGlzaW9uQm94LFxuICAgICAgICAgICAgICB4ID0gZy5jb2xsaXNpb25DaXJjbGVBcnJheTtcblxuICAgICAgICAgIGlmICh4Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHZhciBiID0gdC5jcmVhdGUoKSxcbiAgICAgICAgICAgICAgICB3ID0gdjtcbiAgICAgICAgICAgIHQubXVsKGIsIGcucGxhY2VtZW50SW52UHJvak1hdHJpeCwgZS50cmFuc2Zvcm0uZ2xDb29yZE1hdHJpeCksIHQubXVsKGIsIGIsIGcucGxhY2VtZW50Vmlld3BvcnRNYXRyaXgpLCBoLnB1c2goe1xuICAgICAgICAgICAgICBjaXJjbGVBcnJheTogeCxcbiAgICAgICAgICAgICAgY2lyY2xlT2Zmc2V0OiBkLFxuICAgICAgICAgICAgICB0cmFuc2Zvcm06IHcsXG4gICAgICAgICAgICAgIGludlRyYW5zZm9ybTogYlxuICAgICAgICAgICAgfSksIGQgPSBwICs9IHgubGVuZ3RoIC8gNDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB5ICYmIHUuZHJhdyhsLCBjLkxJTkVTLCBJdC5kaXNhYmxlZCwgUHQuZGlzYWJsZWQsIGUuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpLCBDdC5kaXNhYmxlZCwgRGkodiwgZS50cmFuc2Zvcm0sIG0pLCBvLmlkLCB5LmxheW91dFZlcnRleEJ1ZmZlciwgeS5pbmRleEJ1ZmZlciwgeS5zZWdtZW50cywgbnVsbCwgZS50cmFuc2Zvcm0uem9vbSwgbnVsbCwgbnVsbCwgeS5jb2xsaXNpb25WZXJ0ZXhCdWZmZXIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzICYmIGgubGVuZ3RoKSB7XG4gICAgICAgIHZhciBUID0gZS51c2VQcm9ncmFtKFwiY29sbGlzaW9uQ2lyY2xlXCIpLFxuICAgICAgICAgICAgRSA9IG5ldyB0LlN0cnVjdEFycmF5TGF5b3V0MmYxZjJpMTYoKTtcbiAgICAgICAgRS5yZXNpemUoNCAqIHApLCBFLl90cmltKCk7XG5cbiAgICAgICAgZm9yICh2YXIgSSA9IDAsIFAgPSAwLCBTID0gaDsgUCA8IFMubGVuZ3RoOyBQICs9IDEpIHtcbiAgICAgICAgICBmb3IgKHZhciBDID0gU1tQXSwgeiA9IDA7IHogPCBDLmNpcmNsZUFycmF5Lmxlbmd0aCAvIDQ7IHorKykge1xuICAgICAgICAgICAgdmFyIEQgPSA0ICogeixcbiAgICAgICAgICAgICAgICBBID0gQy5jaXJjbGVBcnJheVtEICsgMF0sXG4gICAgICAgICAgICAgICAgTSA9IEMuY2lyY2xlQXJyYXlbRCArIDFdLFxuICAgICAgICAgICAgICAgIEwgPSBDLmNpcmNsZUFycmF5W0QgKyAyXSxcbiAgICAgICAgICAgICAgICBSID0gQy5jaXJjbGVBcnJheVtEICsgM107XG4gICAgICAgICAgICBFLmVtcGxhY2UoSSsrLCBBLCBNLCBMLCBSLCAwKSwgRS5lbXBsYWNlKEkrKywgQSwgTSwgTCwgUiwgMSksIEUuZW1wbGFjZShJKyssIEEsIE0sIEwsIFIsIDIpLCBFLmVtcGxhY2UoSSsrLCBBLCBNLCBMLCBSLCAzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAoIWppIHx8IGppLmxlbmd0aCA8IDIgKiBwKSAmJiAoamkgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIHZhciBpID0gMiAqIGUsXG4gICAgICAgICAgICAgIG8gPSBuZXcgdC5TdHJ1Y3RBcnJheUxheW91dDN1aTYoKTtcbiAgICAgICAgICBvLnJlc2l6ZShpKSwgby5fdHJpbSgpO1xuXG4gICAgICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCBpOyByKyspIHtcbiAgICAgICAgICAgIHZhciBhID0gNiAqIHI7XG4gICAgICAgICAgICBvLnVpbnQxNlthICsgMF0gPSA0ICogciArIDAsIG8udWludDE2W2EgKyAxXSA9IDQgKiByICsgMSwgby51aW50MTZbYSArIDJdID0gNCAqIHIgKyAyLCBvLnVpbnQxNlthICsgM10gPSA0ICogciArIDIsIG8udWludDE2W2EgKyA0XSA9IDQgKiByICsgMywgby51aW50MTZbYSArIDVdID0gNCAqIHIgKyAwO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBvO1xuICAgICAgICB9KHApKTtcblxuICAgICAgICBmb3IgKHZhciBrID0gbC5jcmVhdGVJbmRleEJ1ZmZlcihqaSwgITApLCBCID0gbC5jcmVhdGVWZXJ0ZXhCdWZmZXIoRSwgdC5jb2xsaXNpb25DaXJjbGVMYXlvdXQubWVtYmVycywgITApLCBPID0gMCwgRiA9IGg7IE8gPCBGLmxlbmd0aDsgTyArPSAxKSB7XG4gICAgICAgICAgdmFyIFUgPSBGW09dLFxuICAgICAgICAgICAgICBOID0gQWkoVS50cmFuc2Zvcm0sIFUuaW52VHJhbnNmb3JtLCBlLnRyYW5zZm9ybSk7XG4gICAgICAgICAgVC5kcmF3KGwsIGMuVFJJQU5HTEVTLCBJdC5kaXNhYmxlZCwgUHQuZGlzYWJsZWQsIGUuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpLCBDdC5kaXNhYmxlZCwgTiwgby5pZCwgQiwgaywgdC5TZWdtZW50VmVjdG9yLnNpbXBsZVNlZ21lbnQoMCwgMiAqIFUuY2lyY2xlT2Zmc2V0LCBVLmNpcmNsZUFycmF5Lmxlbmd0aCwgVS5jaXJjbGVBcnJheS5sZW5ndGggLyAyKSwgbnVsbCwgZS50cmFuc2Zvcm0uem9vbSwgbnVsbCwgbnVsbCwgbnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICBCLmRlc3Ryb3koKSwgay5kZXN0cm95KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIEppID0gdC5pZGVudGl0eShuZXcgRmxvYXQzMkFycmF5KDE2KSk7XG5cbiAgICBmdW5jdGlvbiBRaShlLCBpLCBvLCByLCBhLCBuKSB7XG4gICAgICB2YXIgcyA9IHQuZ2V0QW5jaG9yQWxpZ25tZW50KGUpLFxuICAgICAgICAgIGwgPSAtKHMuaG9yaXpvbnRhbEFsaWduIC0gLjUpICogaSxcbiAgICAgICAgICBjID0gLShzLnZlcnRpY2FsQWxpZ24gLSAuNSkgKiBvLFxuICAgICAgICAgIHUgPSB0LmV2YWx1YXRlVmFyaWFibGVPZmZzZXQoZSwgcik7XG4gICAgICByZXR1cm4gbmV3IHQuUG9pbnQoKGwgLyBhICsgdVswXSkgKiBuLCAoYyAvIGEgKyB1WzFdKSAqIG4pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uICRpKGUsIGksIG8sIHIsIGEsIG4sIHMsIGwsIGMsIHUsIGgpIHtcbiAgICAgIHZhciBwID0gZS50ZXh0LnBsYWNlZFN5bWJvbEFycmF5LFxuICAgICAgICAgIGQgPSBlLnRleHQuZHluYW1pY0xheW91dFZlcnRleEFycmF5LFxuICAgICAgICAgIF8gPSBlLmljb24uZHluYW1pY0xheW91dFZlcnRleEFycmF5LFxuICAgICAgICAgIGYgPSB7fTtcbiAgICAgIGQuY2xlYXIoKTtcblxuICAgICAgZm9yICh2YXIgbSA9IDA7IG0gPCBwLmxlbmd0aDsgbSsrKSB7XG4gICAgICAgIHZhciBnID0gcC5nZXQobSksXG4gICAgICAgICAgICB2ID0gZy5oaWRkZW4gfHwgIWcuY3Jvc3NUaWxlSUQgfHwgZS5hbGxvd1ZlcnRpY2FsUGxhY2VtZW50ICYmICFnLnBsYWNlZE9yaWVudGF0aW9uID8gbnVsbCA6IHJbZy5jcm9zc1RpbGVJRF07XG5cbiAgICAgICAgaWYgKHYpIHtcbiAgICAgICAgICB2YXIgeSA9IG5ldyB0LlBvaW50KGcuYW5jaG9yWCwgZy5hbmNob3JZKSxcbiAgICAgICAgICAgICAgeCA9ICR0KHksIG8gPyBsIDogcyksXG4gICAgICAgICAgICAgIGIgPSB0ZShuLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UsIHguc2lnbmVkRGlzdGFuY2VGcm9tQ2FtZXJhKSxcbiAgICAgICAgICAgICAgdyA9IGEuZXZhbHVhdGVTaXplRm9yRmVhdHVyZShlLnRleHRTaXplRGF0YSwgdSwgZykgKiBiIC8gdC5PTkVfRU07XG4gICAgICAgICAgbyAmJiAodyAqPSBlLnRpbGVQaXhlbFJhdGlvIC8gYyk7XG5cbiAgICAgICAgICBmb3IgKHZhciBUID0gUWkodi5hbmNob3IsIHYud2lkdGgsIHYuaGVpZ2h0LCB2LnRleHRPZmZzZXQsIHYudGV4dEJveFNjYWxlLCB3KSwgRSA9IG8gPyAkdCh5LmFkZChUKSwgcykucG9pbnQgOiB4LnBvaW50LmFkZChpID8gVC5yb3RhdGUoLW4uYW5nbGUpIDogVCksIEkgPSBlLmFsbG93VmVydGljYWxQbGFjZW1lbnQgJiYgZy5wbGFjZWRPcmllbnRhdGlvbiA9PT0gdC5Xcml0aW5nTW9kZS52ZXJ0aWNhbCA/IE1hdGguUEkgLyAyIDogMCwgUCA9IDA7IFAgPCBnLm51bUdseXBoczsgUCsrKSB7XG4gICAgICAgICAgICB0LmFkZER5bmFtaWNBdHRyaWJ1dGVzKGQsIEUsIEkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGggJiYgZy5hc3NvY2lhdGVkSWNvbkluZGV4ID49IDAgJiYgKGZbZy5hc3NvY2lhdGVkSWNvbkluZGV4XSA9IHtcbiAgICAgICAgICAgIHNoaWZ0ZWRBbmNob3I6IEUsXG4gICAgICAgICAgICBhbmdsZTogSVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgY2UoZy5udW1HbHlwaHMsIGQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaCkge1xuICAgICAgICBfLmNsZWFyKCk7XG5cbiAgICAgICAgZm9yICh2YXIgUyA9IGUuaWNvbi5wbGFjZWRTeW1ib2xBcnJheSwgQyA9IDA7IEMgPCBTLmxlbmd0aDsgQysrKSB7XG4gICAgICAgICAgdmFyIHogPSBTLmdldChDKTtcbiAgICAgICAgICBpZiAoei5oaWRkZW4pIGNlKHoubnVtR2x5cGhzLCBfKTtlbHNlIHtcbiAgICAgICAgICAgIHZhciBEID0gZltDXTtcbiAgICAgICAgICAgIGlmIChEKSBmb3IgKHZhciBBID0gMDsgQSA8IHoubnVtR2x5cGhzOyBBKyspIHtcbiAgICAgICAgICAgICAgdC5hZGREeW5hbWljQXR0cmlidXRlcyhfLCBELnNoaWZ0ZWRBbmNob3IsIEQuYW5nbGUpO1xuICAgICAgICAgICAgfSBlbHNlIGNlKHoubnVtR2x5cGhzLCBfKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBlLmljb24uZHluYW1pY0xheW91dFZlcnRleEJ1ZmZlci51cGRhdGVEYXRhKF8pO1xuICAgICAgfVxuXG4gICAgICBlLnRleHQuZHluYW1pY0xheW91dFZlcnRleEJ1ZmZlci51cGRhdGVEYXRhKGQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvKHQsIGUsIGkpIHtcbiAgICAgIHJldHVybiBpLmljb25zSW5UZXh0ICYmIGUgPyBcInN5bWJvbFRleHRBbmRJY29uXCIgOiB0ID8gXCJzeW1ib2xTREZcIiA6IFwic3ltYm9sSWNvblwiO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVvKGUsIGksIG8sIHIsIGEsIG4sIHMsIGwsIGMsIHUsIGgsIHApIHtcbiAgICAgIGZvciAodmFyIGQgPSBlLmNvbnRleHQsIF8gPSBkLmdsLCBmID0gZS50cmFuc2Zvcm0sIG0gPSBcIm1hcFwiID09PSBsLCBnID0gXCJtYXBcIiA9PT0gYywgdiA9IG0gJiYgXCJwb2ludFwiICE9PSBvLmxheW91dC5nZXQoXCJzeW1ib2wtcGxhY2VtZW50XCIpLCB5ID0gbSAmJiAhZyAmJiAhdiwgeCA9IHZvaWQgMCAhPT0gby5sYXlvdXQuZ2V0KFwic3ltYm9sLXNvcnQta2V5XCIpLmNvbnN0YW50T3IoMSksIGIgPSAhMSwgdyA9IGUuZGVwdGhNb2RlRm9yU3VibGF5ZXIoMCwgSXQuUmVhZE9ubHkpLCBUID0gby5sYXlvdXQuZ2V0KFwidGV4dC12YXJpYWJsZS1hbmNob3JcIiksIEUgPSBbXSwgSSA9IDAsIFAgPSByOyBJIDwgUC5sZW5ndGg7IEkgKz0gMSkge1xuICAgICAgICB2YXIgUyA9IFBbSV0sXG4gICAgICAgICAgICBDID0gaS5nZXRUaWxlKFMpLFxuICAgICAgICAgICAgeiA9IEMuZ2V0QnVja2V0KG8pO1xuXG4gICAgICAgIGlmICh6KSB7XG4gICAgICAgICAgdmFyIEQgPSBhID8gei50ZXh0IDogei5pY29uO1xuXG4gICAgICAgICAgaWYgKEQgJiYgRC5zZWdtZW50cy5nZXQoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBBID0gRC5wcm9ncmFtQ29uZmlndXJhdGlvbnMuZ2V0KG8uaWQpLFxuICAgICAgICAgICAgICAgIE0gPSBhIHx8IHouc2RmSWNvbnMsXG4gICAgICAgICAgICAgICAgTCA9IGEgPyB6LnRleHRTaXplRGF0YSA6IHouaWNvblNpemVEYXRhLFxuICAgICAgICAgICAgICAgIFIgPSBnIHx8IDAgIT09IGYucGl0Y2gsXG4gICAgICAgICAgICAgICAgayA9IGUudXNlUHJvZ3JhbSh0byhNLCBhLCB6KSwgQSksXG4gICAgICAgICAgICAgICAgQiA9IHQuZXZhbHVhdGVTaXplRm9yWm9vbShMLCBmLnpvb20pLFxuICAgICAgICAgICAgICAgIE8gPSB2b2lkIDAsXG4gICAgICAgICAgICAgICAgRiA9IFswLCAwXSxcbiAgICAgICAgICAgICAgICBVID0gdm9pZCAwLFxuICAgICAgICAgICAgICAgIE4gPSB2b2lkIDAsXG4gICAgICAgICAgICAgICAgWiA9IG51bGwsXG4gICAgICAgICAgICAgICAgcSA9IHZvaWQgMDtcbiAgICAgICAgICAgIGlmIChhKSBVID0gQy5nbHlwaEF0bGFzVGV4dHVyZSwgTiA9IF8uTElORUFSLCBPID0gQy5nbHlwaEF0bGFzVGV4dHVyZS5zaXplLCB6Lmljb25zSW5UZXh0ICYmIChGID0gQy5pbWFnZUF0bGFzVGV4dHVyZS5zaXplLCBaID0gQy5pbWFnZUF0bGFzVGV4dHVyZSwgcSA9IFIgfHwgZS5vcHRpb25zLnJvdGF0aW5nIHx8IGUub3B0aW9ucy56b29taW5nIHx8IFwiY29tcG9zaXRlXCIgPT09IEwua2luZCB8fCBcImNhbWVyYVwiID09PSBMLmtpbmQgPyBfLkxJTkVBUiA6IF8uTkVBUkVTVCk7ZWxzZSB7XG4gICAgICAgICAgICAgIHZhciBqID0gMSAhPT0gby5sYXlvdXQuZ2V0KFwiaWNvbi1zaXplXCIpLmNvbnN0YW50T3IoMCkgfHwgei5pY29uc05lZWRMaW5lYXI7XG4gICAgICAgICAgICAgIFUgPSBDLmltYWdlQXRsYXNUZXh0dXJlLCBOID0gTSB8fCBlLm9wdGlvbnMucm90YXRpbmcgfHwgZS5vcHRpb25zLnpvb21pbmcgfHwgaiB8fCBSID8gXy5MSU5FQVIgOiBfLk5FQVJFU1QsIE8gPSBDLmltYWdlQXRsYXNUZXh0dXJlLnNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgViA9IHBlKEMsIDEsIGUudHJhbnNmb3JtLnpvb20pLFxuICAgICAgICAgICAgICAgIEcgPSBKdChTLnBvc01hdHJpeCwgZywgbSwgZS50cmFuc2Zvcm0sIFYpLFxuICAgICAgICAgICAgICAgIFcgPSBRdChTLnBvc01hdHJpeCwgZywgbSwgZS50cmFuc2Zvcm0sIFYpLFxuICAgICAgICAgICAgICAgIFggPSBUICYmIHouaGFzVGV4dERhdGEoKSxcbiAgICAgICAgICAgICAgICBIID0gXCJub25lXCIgIT09IG8ubGF5b3V0LmdldChcImljb24tdGV4dC1maXRcIikgJiYgWCAmJiB6Lmhhc0ljb25EYXRhKCk7XG4gICAgICAgICAgICB2ICYmIGllKHosIFMucG9zTWF0cml4LCBlLCBhLCBHLCBXLCBnLCB1KTtcbiAgICAgICAgICAgIHZhciBLID0gZS50cmFuc2xhdGVQb3NNYXRyaXgoUy5wb3NNYXRyaXgsIEMsIG4sIHMpLFxuICAgICAgICAgICAgICAgIFkgPSB2IHx8IGEgJiYgVCB8fCBIID8gSmkgOiBHLFxuICAgICAgICAgICAgICAgIEogPSBlLnRyYW5zbGF0ZVBvc01hdHJpeChXLCBDLCBuLCBzLCAhMCksXG4gICAgICAgICAgICAgICAgUSA9IE0gJiYgMCAhPT0gby5wYWludC5nZXQoYSA/IFwidGV4dC1oYWxvLXdpZHRoXCIgOiBcImljb24taGFsby13aWR0aFwiKS5jb25zdGFudE9yKDEpLFxuICAgICAgICAgICAgICAgICQgPSB7XG4gICAgICAgICAgICAgIHByb2dyYW06IGssXG4gICAgICAgICAgICAgIGJ1ZmZlcnM6IEQsXG4gICAgICAgICAgICAgIHVuaWZvcm1WYWx1ZXM6IE0gPyB6Lmljb25zSW5UZXh0ID8gV2koTC5raW5kLCBCLCB5LCBnLCBlLCBLLCBZLCBKLCBPLCBGKSA6IEdpKEwua2luZCwgQiwgeSwgZywgZSwgSywgWSwgSiwgYSwgTywgITApIDogVmkoTC5raW5kLCBCLCB5LCBnLCBlLCBLLCBZLCBKLCBhLCBPKSxcbiAgICAgICAgICAgICAgYXRsYXNUZXh0dXJlOiBVLFxuICAgICAgICAgICAgICBhdGxhc1RleHR1cmVJY29uOiBaLFxuICAgICAgICAgICAgICBhdGxhc0ludGVycG9sYXRpb246IE4sXG4gICAgICAgICAgICAgIGF0bGFzSW50ZXJwb2xhdGlvbkljb246IHEsXG4gICAgICAgICAgICAgIGlzU0RGOiBNLFxuICAgICAgICAgICAgICBoYXNIYWxvOiBRXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAoeCAmJiB6LmNhbk92ZXJsYXApIHtcbiAgICAgICAgICAgICAgYiA9ICEwO1xuXG4gICAgICAgICAgICAgIGZvciAodmFyIHR0ID0gMCwgZXQgPSBELnNlZ21lbnRzLmdldCgpOyB0dCA8IGV0Lmxlbmd0aDsgdHQgKz0gMSkge1xuICAgICAgICAgICAgICAgIHZhciBpdCA9IGV0W3R0XTtcbiAgICAgICAgICAgICAgICBFLnB1c2goe1xuICAgICAgICAgICAgICAgICAgc2VnbWVudHM6IG5ldyB0LlNlZ21lbnRWZWN0b3IoW2l0XSksXG4gICAgICAgICAgICAgICAgICBzb3J0S2V5OiBpdC5zb3J0S2V5LFxuICAgICAgICAgICAgICAgICAgc3RhdGU6ICRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIEUucHVzaCh7XG4gICAgICAgICAgICAgIHNlZ21lbnRzOiBELnNlZ21lbnRzLFxuICAgICAgICAgICAgICBzb3J0S2V5OiAwLFxuICAgICAgICAgICAgICBzdGF0ZTogJFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGIgJiYgRS5zb3J0KGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0LnNvcnRLZXkgLSBlLnNvcnRLZXk7XG4gICAgICB9KTtcblxuICAgICAgZm9yICh2YXIgb3QgPSAwLCBydCA9IEU7IG90IDwgcnQubGVuZ3RoOyBvdCArPSAxKSB7XG4gICAgICAgIHZhciBhdCA9IHJ0W290XSxcbiAgICAgICAgICAgIG50ID0gYXQuc3RhdGU7XG5cbiAgICAgICAgaWYgKGQuYWN0aXZlVGV4dHVyZS5zZXQoXy5URVhUVVJFMCksIG50LmF0bGFzVGV4dHVyZS5iaW5kKG50LmF0bGFzSW50ZXJwb2xhdGlvbiwgXy5DTEFNUF9UT19FREdFKSwgbnQuYXRsYXNUZXh0dXJlSWNvbiAmJiAoZC5hY3RpdmVUZXh0dXJlLnNldChfLlRFWFRVUkUxKSwgbnQuYXRsYXNUZXh0dXJlSWNvbiAmJiBudC5hdGxhc1RleHR1cmVJY29uLmJpbmQobnQuYXRsYXNJbnRlcnBvbGF0aW9uSWNvbiwgXy5DTEFNUF9UT19FREdFKSksIG50LmlzU0RGKSB7XG4gICAgICAgICAgdmFyIHN0ID0gbnQudW5pZm9ybVZhbHVlcztcbiAgICAgICAgICBudC5oYXNIYWxvICYmIChzdC51X2lzX2hhbG8gPSAxLCBpbyhudC5idWZmZXJzLCBhdC5zZWdtZW50cywgbywgZSwgbnQucHJvZ3JhbSwgdywgaCwgcCwgc3QpKSwgc3QudV9pc19oYWxvID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlvKG50LmJ1ZmZlcnMsIGF0LnNlZ21lbnRzLCBvLCBlLCBudC5wcm9ncmFtLCB3LCBoLCBwLCBudC51bmlmb3JtVmFsdWVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbyh0LCBlLCBpLCBvLCByLCBhLCBuLCBzLCBsKSB7XG4gICAgICB2YXIgYyA9IG8uY29udGV4dDtcbiAgICAgIHIuZHJhdyhjLCBjLmdsLlRSSUFOR0xFUywgYSwgbiwgcywgQ3QuZGlzYWJsZWQsIGwsIGkuaWQsIHQubGF5b3V0VmVydGV4QnVmZmVyLCB0LmluZGV4QnVmZmVyLCBlLCBpLnBhaW50LCBvLnRyYW5zZm9ybS56b29tLCB0LnByb2dyYW1Db25maWd1cmF0aW9ucy5nZXQoaS5pZCksIHQuZHluYW1pY0xheW91dFZlcnRleEJ1ZmZlciwgdC5vcGFjaXR5VmVydGV4QnVmZmVyKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbyh0LCBlLCBpLCBvLCByLCBhLCBuKSB7XG4gICAgICB2YXIgcyxcbiAgICAgICAgICBsLFxuICAgICAgICAgIGMsXG4gICAgICAgICAgdSxcbiAgICAgICAgICBoLFxuICAgICAgICAgIHAgPSB0LmNvbnRleHQuZ2wsXG4gICAgICAgICAgZCA9IGkucGFpbnQuZ2V0KFwiZmlsbC1wYXR0ZXJuXCIpLFxuICAgICAgICAgIF8gPSBkICYmIGQuY29uc3RhbnRPcigxKSxcbiAgICAgICAgICBmID0gaS5nZXRDcm9zc2ZhZGVQYXJhbWV0ZXJzKCk7XG5cbiAgICAgIG4gPyAobCA9IF8gJiYgIWkuZ2V0UGFpbnRQcm9wZXJ0eShcImZpbGwtb3V0bGluZS1jb2xvclwiKSA/IFwiZmlsbE91dGxpbmVQYXR0ZXJuXCIgOiBcImZpbGxPdXRsaW5lXCIsIHMgPSBwLkxJTkVTKSA6IChsID0gXyA/IFwiZmlsbFBhdHRlcm5cIiA6IFwiZmlsbFwiLCBzID0gcC5UUklBTkdMRVMpO1xuXG4gICAgICBmb3IgKHZhciBtID0gMCwgZyA9IG87IG0gPCBnLmxlbmd0aDsgbSArPSAxKSB7XG4gICAgICAgIHZhciB2ID0gZ1ttXSxcbiAgICAgICAgICAgIHkgPSBlLmdldFRpbGUodik7XG5cbiAgICAgICAgaWYgKCFfIHx8IHkucGF0dGVybnNMb2FkZWQoKSkge1xuICAgICAgICAgIHZhciB4ID0geS5nZXRCdWNrZXQoaSk7XG5cbiAgICAgICAgICBpZiAoeCkge1xuICAgICAgICAgICAgdmFyIGIgPSB4LnByb2dyYW1Db25maWd1cmF0aW9ucy5nZXQoaS5pZCksXG4gICAgICAgICAgICAgICAgdyA9IHQudXNlUHJvZ3JhbShsLCBiKTtcbiAgICAgICAgICAgIF8gJiYgKHQuY29udGV4dC5hY3RpdmVUZXh0dXJlLnNldChwLlRFWFRVUkUwKSwgeS5pbWFnZUF0bGFzVGV4dHVyZS5iaW5kKHAuTElORUFSLCBwLkNMQU1QX1RPX0VER0UpLCBiLnVwZGF0ZVBhaW50QnVmZmVycyhmKSk7XG4gICAgICAgICAgICB2YXIgVCA9IGQuY29uc3RhbnRPcihudWxsKTtcblxuICAgICAgICAgICAgaWYgKFQgJiYgeS5pbWFnZUF0bGFzKSB7XG4gICAgICAgICAgICAgIHZhciBFID0geS5pbWFnZUF0bGFzLFxuICAgICAgICAgICAgICAgICAgSSA9IEUucGF0dGVyblBvc2l0aW9uc1tULnRvLnRvU3RyaW5nKCldLFxuICAgICAgICAgICAgICAgICAgUCA9IEUucGF0dGVyblBvc2l0aW9uc1tULmZyb20udG9TdHJpbmcoKV07XG4gICAgICAgICAgICAgIEkgJiYgUCAmJiBiLnNldENvbnN0YW50UGF0dGVyblBvc2l0aW9ucyhJLCBQKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIFMgPSB0LnRyYW5zbGF0ZVBvc01hdHJpeCh2LnBvc01hdHJpeCwgeSwgaS5wYWludC5nZXQoXCJmaWxsLXRyYW5zbGF0ZVwiKSwgaS5wYWludC5nZXQoXCJmaWxsLXRyYW5zbGF0ZS1hbmNob3JcIikpO1xuXG4gICAgICAgICAgICBpZiAobikge1xuICAgICAgICAgICAgICB1ID0geC5pbmRleEJ1ZmZlcjIsIGggPSB4LnNlZ21lbnRzMjtcbiAgICAgICAgICAgICAgdmFyIEMgPSBbcC5kcmF3aW5nQnVmZmVyV2lkdGgsIHAuZHJhd2luZ0J1ZmZlckhlaWdodF07XG4gICAgICAgICAgICAgIGMgPSBcImZpbGxPdXRsaW5lUGF0dGVyblwiID09PSBsICYmIF8gPyBDaShTLCB0LCBmLCB5LCBDKSA6IFNpKFMsIEMpO1xuICAgICAgICAgICAgfSBlbHNlIHUgPSB4LmluZGV4QnVmZmVyLCBoID0geC5zZWdtZW50cywgYyA9IF8gPyBQaShTLCB0LCBmLCB5KSA6IElpKFMpO1xuXG4gICAgICAgICAgICB3LmRyYXcodC5jb250ZXh0LCBzLCByLCB0LnN0ZW5jaWxNb2RlRm9yQ2xpcHBpbmcodiksIGEsIEN0LmRpc2FibGVkLCBjLCBpLmlkLCB4LmxheW91dFZlcnRleEJ1ZmZlciwgdSwgaCwgaS5wYWludCwgdC50cmFuc2Zvcm0uem9vbSwgYik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcm8odCwgZSwgaSwgbywgciwgYSwgbikge1xuICAgICAgZm9yICh2YXIgcyA9IHQuY29udGV4dCwgbCA9IHMuZ2wsIGMgPSBpLnBhaW50LmdldChcImZpbGwtZXh0cnVzaW9uLXBhdHRlcm5cIiksIHUgPSBjLmNvbnN0YW50T3IoMSksIGggPSBpLmdldENyb3NzZmFkZVBhcmFtZXRlcnMoKSwgcCA9IGkucGFpbnQuZ2V0KFwiZmlsbC1leHRydXNpb24tb3BhY2l0eVwiKSwgZCA9IDAsIF8gPSBvOyBkIDwgXy5sZW5ndGg7IGQgKz0gMSkge1xuICAgICAgICB2YXIgZiA9IF9bZF0sXG4gICAgICAgICAgICBtID0gZS5nZXRUaWxlKGYpLFxuICAgICAgICAgICAgZyA9IG0uZ2V0QnVja2V0KGkpO1xuXG4gICAgICAgIGlmIChnKSB7XG4gICAgICAgICAgdmFyIHYgPSBnLnByb2dyYW1Db25maWd1cmF0aW9ucy5nZXQoaS5pZCksXG4gICAgICAgICAgICAgIHkgPSB0LnVzZVByb2dyYW0odSA/IFwiZmlsbEV4dHJ1c2lvblBhdHRlcm5cIiA6IFwiZmlsbEV4dHJ1c2lvblwiLCB2KTtcbiAgICAgICAgICB1ICYmICh0LmNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQobC5URVhUVVJFMCksIG0uaW1hZ2VBdGxhc1RleHR1cmUuYmluZChsLkxJTkVBUiwgbC5DTEFNUF9UT19FREdFKSwgdi51cGRhdGVQYWludEJ1ZmZlcnMoaCkpO1xuICAgICAgICAgIHZhciB4ID0gYy5jb25zdGFudE9yKG51bGwpO1xuXG4gICAgICAgICAgaWYgKHggJiYgbS5pbWFnZUF0bGFzKSB7XG4gICAgICAgICAgICB2YXIgYiA9IG0uaW1hZ2VBdGxhcyxcbiAgICAgICAgICAgICAgICB3ID0gYi5wYXR0ZXJuUG9zaXRpb25zW3gudG8udG9TdHJpbmcoKV0sXG4gICAgICAgICAgICAgICAgVCA9IGIucGF0dGVyblBvc2l0aW9uc1t4LmZyb20udG9TdHJpbmcoKV07XG4gICAgICAgICAgICB3ICYmIFQgJiYgdi5zZXRDb25zdGFudFBhdHRlcm5Qb3NpdGlvbnModywgVCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIEUgPSB0LnRyYW5zbGF0ZVBvc01hdHJpeChmLnBvc01hdHJpeCwgbSwgaS5wYWludC5nZXQoXCJmaWxsLWV4dHJ1c2lvbi10cmFuc2xhdGVcIiksIGkucGFpbnQuZ2V0KFwiZmlsbC1leHRydXNpb24tdHJhbnNsYXRlLWFuY2hvclwiKSksXG4gICAgICAgICAgICAgIEkgPSBpLnBhaW50LmdldChcImZpbGwtZXh0cnVzaW9uLXZlcnRpY2FsLWdyYWRpZW50XCIpLFxuICAgICAgICAgICAgICBQID0gdSA/IEVpKEUsIHQsIEksIHAsIGYsIGgsIG0pIDogVGkoRSwgdCwgSSwgcCk7XG4gICAgICAgICAgeS5kcmF3KHMsIHMuZ2wuVFJJQU5HTEVTLCByLCBhLCBuLCBDdC5iYWNrQ0NXLCBQLCBpLmlkLCBnLmxheW91dFZlcnRleEJ1ZmZlciwgZy5pbmRleEJ1ZmZlciwgZy5zZWdtZW50cywgaS5wYWludCwgdC50cmFuc2Zvcm0uem9vbSwgdik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhbyhlLCBpLCBvLCByLCBhLCBuKSB7XG4gICAgICB2YXIgcyA9IGUuY29udGV4dCxcbiAgICAgICAgICBsID0gcy5nbCxcbiAgICAgICAgICBjID0gaS5mYm87XG5cbiAgICAgIGlmIChjKSB7XG4gICAgICAgIHZhciB1ID0gZS51c2VQcm9ncmFtKFwiaGlsbHNoYWRlXCIpO1xuICAgICAgICBzLmFjdGl2ZVRleHR1cmUuc2V0KGwuVEVYVFVSRTApLCBsLmJpbmRUZXh0dXJlKGwuVEVYVFVSRV8yRCwgYy5jb2xvckF0dGFjaG1lbnQuZ2V0KCkpO1xuXG4gICAgICAgIHZhciBoID0gZnVuY3Rpb24gKGUsIGksIG8pIHtcbiAgICAgICAgICB2YXIgciA9IG8ucGFpbnQuZ2V0KFwiaGlsbHNoYWRlLXNoYWRvdy1jb2xvclwiKSxcbiAgICAgICAgICAgICAgYSA9IG8ucGFpbnQuZ2V0KFwiaGlsbHNoYWRlLWhpZ2hsaWdodC1jb2xvclwiKSxcbiAgICAgICAgICAgICAgbiA9IG8ucGFpbnQuZ2V0KFwiaGlsbHNoYWRlLWFjY2VudC1jb2xvclwiKSxcbiAgICAgICAgICAgICAgcyA9IG8ucGFpbnQuZ2V0KFwiaGlsbHNoYWRlLWlsbHVtaW5hdGlvbi1kaXJlY3Rpb25cIikgKiAoTWF0aC5QSSAvIDE4MCk7XG4gICAgICAgICAgXCJ2aWV3cG9ydFwiID09PSBvLnBhaW50LmdldChcImhpbGxzaGFkZS1pbGx1bWluYXRpb24tYW5jaG9yXCIpICYmIChzIC09IGUudHJhbnNmb3JtLmFuZ2xlKTtcbiAgICAgICAgICB2YXIgbCxcbiAgICAgICAgICAgICAgYyxcbiAgICAgICAgICAgICAgdSxcbiAgICAgICAgICAgICAgaCA9ICFlLm9wdGlvbnMubW92aW5nO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB1X21hdHJpeDogZS50cmFuc2Zvcm0uY2FsY3VsYXRlUG9zTWF0cml4KGkudGlsZUlELnRvVW53cmFwcGVkKCksIGgpLFxuICAgICAgICAgICAgdV9pbWFnZTogMCxcbiAgICAgICAgICAgIHVfbGF0cmFuZ2U6IChsID0gaS50aWxlSUQsIGMgPSBNYXRoLnBvdygyLCBsLmNhbm9uaWNhbC56KSwgdSA9IGwuY2Fub25pY2FsLnksIFtuZXcgdC5NZXJjYXRvckNvb3JkaW5hdGUoMCwgdSAvIGMpLnRvTG5nTGF0KCkubGF0LCBuZXcgdC5NZXJjYXRvckNvb3JkaW5hdGUoMCwgKHUgKyAxKSAvIGMpLnRvTG5nTGF0KCkubGF0XSksXG4gICAgICAgICAgICB1X2xpZ2h0OiBbby5wYWludC5nZXQoXCJoaWxsc2hhZGUtZXhhZ2dlcmF0aW9uXCIpLCBzXSxcbiAgICAgICAgICAgIHVfc2hhZG93OiByLFxuICAgICAgICAgICAgdV9oaWdobGlnaHQ6IGEsXG4gICAgICAgICAgICB1X2FjY2VudDogblxuICAgICAgICAgIH07XG4gICAgICAgIH0oZSwgaSwgbyk7XG5cbiAgICAgICAgdS5kcmF3KHMsIGwuVFJJQU5HTEVTLCByLCBhLCBuLCBDdC5kaXNhYmxlZCwgaCwgby5pZCwgZS5yYXN0ZXJCb3VuZHNCdWZmZXIsIGUucXVhZFRyaWFuZ2xlSW5kZXhCdWZmZXIsIGUucmFzdGVyQm91bmRzU2VnbWVudHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG5vKGUsIGksIG8sIHIsIGEsIG4pIHtcbiAgICAgIHZhciBzID0gZS5jb250ZXh0LFxuICAgICAgICAgIGwgPSBzLmdsLFxuICAgICAgICAgIGMgPSBpLmRlbTtcblxuICAgICAgaWYgKGMgJiYgYy5kYXRhKSB7XG4gICAgICAgIHZhciB1ID0gYy5kaW0sXG4gICAgICAgICAgICBoID0gYy5zdHJpZGUsXG4gICAgICAgICAgICBwID0gYy5nZXRQaXhlbHMoKTtcblxuICAgICAgICBpZiAocy5hY3RpdmVUZXh0dXJlLnNldChsLlRFWFRVUkUxKSwgcy5waXhlbFN0b3JlVW5wYWNrUHJlbXVsdGlwbHlBbHBoYS5zZXQoITEpLCBpLmRlbVRleHR1cmUgPSBpLmRlbVRleHR1cmUgfHwgZS5nZXRUaWxlVGV4dHVyZShoKSwgaS5kZW1UZXh0dXJlKSB7XG4gICAgICAgICAgdmFyIGQgPSBpLmRlbVRleHR1cmU7XG4gICAgICAgICAgZC51cGRhdGUocCwge1xuICAgICAgICAgICAgcHJlbXVsdGlwbHk6ICExXG4gICAgICAgICAgfSksIGQuYmluZChsLk5FQVJFU1QsIGwuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgIH0gZWxzZSBpLmRlbVRleHR1cmUgPSBuZXcgdC5UZXh0dXJlKHMsIHAsIGwuUkdCQSwge1xuICAgICAgICAgIHByZW11bHRpcGx5OiAhMVxuICAgICAgICB9KSwgaS5kZW1UZXh0dXJlLmJpbmQobC5ORUFSRVNULCBsLkNMQU1QX1RPX0VER0UpO1xuXG4gICAgICAgIHMuYWN0aXZlVGV4dHVyZS5zZXQobC5URVhUVVJFMCk7XG4gICAgICAgIHZhciBfID0gaS5mYm87XG5cbiAgICAgICAgaWYgKCFfKSB7XG4gICAgICAgICAgdmFyIGYgPSBuZXcgdC5UZXh0dXJlKHMsIHtcbiAgICAgICAgICAgIHdpZHRoOiB1LFxuICAgICAgICAgICAgaGVpZ2h0OiB1LFxuICAgICAgICAgICAgZGF0YTogbnVsbFxuICAgICAgICAgIH0sIGwuUkdCQSk7XG4gICAgICAgICAgZi5iaW5kKGwuTElORUFSLCBsLkNMQU1QX1RPX0VER0UpLCAoXyA9IGkuZmJvID0gcy5jcmVhdGVGcmFtZWJ1ZmZlcih1LCB1LCAhMCkpLmNvbG9yQXR0YWNobWVudC5zZXQoZi50ZXh0dXJlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHMuYmluZEZyYW1lYnVmZmVyLnNldChfLmZyYW1lYnVmZmVyKSwgcy52aWV3cG9ydC5zZXQoWzAsIDAsIHUsIHVdKSwgZS51c2VQcm9ncmFtKFwiaGlsbHNoYWRlUHJlcGFyZVwiKS5kcmF3KHMsIGwuVFJJQU5HTEVTLCByLCBhLCBuLCBDdC5kaXNhYmxlZCwgZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgICAgICB2YXIgbyA9IGkuc3RyaWRlLFxuICAgICAgICAgICAgICByID0gdC5jcmVhdGUoKTtcbiAgICAgICAgICByZXR1cm4gdC5vcnRobyhyLCAwLCB0LkVYVEVOVCwgLXQuRVhURU5ULCAwLCAwLCAxKSwgdC50cmFuc2xhdGUociwgciwgWzAsIC10LkVYVEVOVCwgMF0pLCB7XG4gICAgICAgICAgICB1X21hdHJpeDogcixcbiAgICAgICAgICAgIHVfaW1hZ2U6IDEsXG4gICAgICAgICAgICB1X2RpbWVuc2lvbjogW28sIG9dLFxuICAgICAgICAgICAgdV96b29tOiBlLm92ZXJzY2FsZWRaLFxuICAgICAgICAgICAgdV91bnBhY2s6IGkuZ2V0VW5wYWNrVmVjdG9yKClcbiAgICAgICAgICB9O1xuICAgICAgICB9KGkudGlsZUlELCBjKSwgby5pZCwgZS5yYXN0ZXJCb3VuZHNCdWZmZXIsIGUucXVhZFRyaWFuZ2xlSW5kZXhCdWZmZXIsIGUucmFzdGVyQm91bmRzU2VnbWVudHMpLCBpLm5lZWRzSGlsbHNoYWRlUHJlcGFyZSA9ICExO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNvKGUsIGksIG8sIHIsIGEpIHtcbiAgICAgIHZhciBuID0gci5wYWludC5nZXQoXCJyYXN0ZXItZmFkZS1kdXJhdGlvblwiKTtcblxuICAgICAgaWYgKG4gPiAwKSB7XG4gICAgICAgIHZhciBzID0gdC5icm93c2VyLm5vdygpLFxuICAgICAgICAgICAgbCA9IChzIC0gZS50aW1lQWRkZWQpIC8gbixcbiAgICAgICAgICAgIGMgPSBpID8gKHMgLSBpLnRpbWVBZGRlZCkgLyBuIDogLTEsXG4gICAgICAgICAgICB1ID0gby5nZXRTb3VyY2UoKSxcbiAgICAgICAgICAgIGggPSBhLmNvdmVyaW5nWm9vbUxldmVsKHtcbiAgICAgICAgICB0aWxlU2l6ZTogdS50aWxlU2l6ZSxcbiAgICAgICAgICByb3VuZFpvb206IHUucm91bmRab29tXG4gICAgICAgIH0pLFxuICAgICAgICAgICAgcCA9ICFpIHx8IE1hdGguYWJzKGkudGlsZUlELm92ZXJzY2FsZWRaIC0gaCkgPiBNYXRoLmFicyhlLnRpbGVJRC5vdmVyc2NhbGVkWiAtIGgpLFxuICAgICAgICAgICAgZCA9IHAgJiYgZS5yZWZyZXNoZWRVcG9uRXhwaXJhdGlvbiA/IDEgOiB0LmNsYW1wKHAgPyBsIDogMSAtIGMsIDAsIDEpO1xuICAgICAgICByZXR1cm4gZS5yZWZyZXNoZWRVcG9uRXhwaXJhdGlvbiAmJiBsID49IDEgJiYgKGUucmVmcmVzaGVkVXBvbkV4cGlyYXRpb24gPSAhMSksIGkgPyB7XG4gICAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgICBtaXg6IDEgLSBkXG4gICAgICAgIH0gOiB7XG4gICAgICAgICAgb3BhY2l0eTogZCxcbiAgICAgICAgICBtaXg6IDBcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgbWl4OiAwXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBsbyA9IG5ldyB0LkNvbG9yKDEsIDAsIDAsIDEpLFxuICAgICAgICBjbyA9IG5ldyB0LkNvbG9yKDAsIDEsIDAsIDEpLFxuICAgICAgICB1byA9IG5ldyB0LkNvbG9yKDAsIDAsIDEsIDEpLFxuICAgICAgICBobyA9IG5ldyB0LkNvbG9yKDEsIDAsIDEsIDEpLFxuICAgICAgICBwbyA9IG5ldyB0LkNvbG9yKDAsIDEsIDEsIDEpO1xuXG4gICAgZnVuY3Rpb24gX28odCwgZSwgaSwgbykge1xuICAgICAgbW8odCwgMCwgZSArIGkgLyAyLCB0LnRyYW5zZm9ybS53aWR0aCwgaSwgbyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZm8odCwgZSwgaSwgbykge1xuICAgICAgbW8odCwgZSAtIGkgLyAyLCAwLCBpLCB0LnRyYW5zZm9ybS5oZWlnaHQsIG8pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vKGUsIGksIG8sIHIsIGEsIG4pIHtcbiAgICAgIHZhciBzID0gZS5jb250ZXh0LFxuICAgICAgICAgIGwgPSBzLmdsO1xuICAgICAgbC5lbmFibGUobC5TQ0lTU09SX1RFU1QpLCBsLnNjaXNzb3IoaSAqIHQuYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvLCBvICogdC5icm93c2VyLmRldmljZVBpeGVsUmF0aW8sIHIgKiB0LmJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbywgYSAqIHQuYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvKSwgcy5jbGVhcih7XG4gICAgICAgIGNvbG9yOiBuXG4gICAgICB9KSwgbC5kaXNhYmxlKGwuU0NJU1NPUl9URVNUKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnbyhlLCBpLCBvKSB7XG4gICAgICB2YXIgciA9IGUuY29udGV4dCxcbiAgICAgICAgICBhID0gci5nbCxcbiAgICAgICAgICBuID0gby5wb3NNYXRyaXgsXG4gICAgICAgICAgcyA9IGUudXNlUHJvZ3JhbShcImRlYnVnXCIpLFxuICAgICAgICAgIGwgPSBJdC5kaXNhYmxlZCxcbiAgICAgICAgICBjID0gUHQuZGlzYWJsZWQsXG4gICAgICAgICAgdSA9IGUuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpO1xuICAgICAgci5hY3RpdmVUZXh0dXJlLnNldChhLlRFWFRVUkUwKSwgZS5lbXB0eVRleHR1cmUuYmluZChhLkxJTkVBUiwgYS5DTEFNUF9UT19FREdFKSwgcy5kcmF3KHIsIGEuTElORV9TVFJJUCwgbCwgYywgdSwgQ3QuZGlzYWJsZWQsIE1pKG4sIHQuQ29sb3IucmVkKSwgXCIkZGVidWdcIiwgZS5kZWJ1Z0J1ZmZlciwgZS50aWxlQm9yZGVySW5kZXhCdWZmZXIsIGUuZGVidWdTZWdtZW50cyk7XG5cbiAgICAgIHZhciBoID0gaS5nZXRUaWxlQnlJRChvLmtleSkubGF0ZXN0UmF3VGlsZURhdGEsXG4gICAgICAgICAgcCA9IE1hdGguZmxvb3IoKGggJiYgaC5ieXRlTGVuZ3RoIHx8IDApIC8gMTAyNCksXG4gICAgICAgICAgZCA9IGkuZ2V0VGlsZShvKS50aWxlU2l6ZSxcbiAgICAgICAgICBfID0gNTEyIC8gTWF0aC5taW4oZCwgNTEyKSAqIChvLm92ZXJzY2FsZWRaIC8gZS50cmFuc2Zvcm0uem9vbSkgKiAuNSxcbiAgICAgICAgICBmID0gby5jYW5vbmljYWwudG9TdHJpbmcoKTtcblxuICAgICAgby5vdmVyc2NhbGVkWiAhPT0gby5jYW5vbmljYWwueiAmJiAoZiArPSBcIiA9PiBcIiArIG8ub3ZlcnNjYWxlZFopLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICB0LmluaXREZWJ1Z092ZXJsYXlDYW52YXMoKTtcbiAgICAgICAgdmFyIGkgPSB0LmRlYnVnT3ZlcmxheUNhbnZhcyxcbiAgICAgICAgICAgIG8gPSB0LmNvbnRleHQuZ2wsXG4gICAgICAgICAgICByID0gdC5kZWJ1Z092ZXJsYXlDYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgICAgICByLmNsZWFyUmVjdCgwLCAwLCBpLndpZHRoLCBpLmhlaWdodCksIHIuc2hhZG93Q29sb3IgPSBcIndoaXRlXCIsIHIuc2hhZG93Qmx1ciA9IDIsIHIubGluZVdpZHRoID0gMS41LCByLnN0cm9rZVN0eWxlID0gXCJ3aGl0ZVwiLCByLnRleHRCYXNlbGluZSA9IFwidG9wXCIsIHIuZm9udCA9IFwiYm9sZCAzNnB4IE9wZW4gU2Fucywgc2Fucy1zZXJpZlwiLCByLmZpbGxUZXh0KGUsIDUsIDUpLCByLnN0cm9rZVRleHQoZSwgNSwgNSksIHQuZGVidWdPdmVybGF5VGV4dHVyZS51cGRhdGUoaSksIHQuZGVidWdPdmVybGF5VGV4dHVyZS5iaW5kKG8uTElORUFSLCBvLkNMQU1QX1RPX0VER0UpO1xuICAgICAgfShlLCBmICsgXCIgXCIgKyBwICsgXCJrYlwiKSwgcy5kcmF3KHIsIGEuVFJJQU5HTEVTLCBsLCBjLCBTdC5hbHBoYUJsZW5kZWQsIEN0LmRpc2FibGVkLCBNaShuLCB0LkNvbG9yLnRyYW5zcGFyZW50LCBfKSwgXCIkZGVidWdcIiwgZS5kZWJ1Z0J1ZmZlciwgZS5xdWFkVHJpYW5nbGVJbmRleEJ1ZmZlciwgZS5kZWJ1Z1NlZ21lbnRzKTtcbiAgICB9XG5cbiAgICB2YXIgdm8gPSB7XG4gICAgICBzeW1ib2w6IGZ1bmN0aW9uIHN5bWJvbChlLCBpLCBvLCByLCBhKSB7XG4gICAgICAgIGlmIChcInRyYW5zbHVjZW50XCIgPT09IGUucmVuZGVyUGFzcykge1xuICAgICAgICAgIHZhciBuID0gUHQuZGlzYWJsZWQsXG4gICAgICAgICAgICAgIHMgPSBlLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKTtcbiAgICAgICAgICBvLmxheW91dC5nZXQoXCJ0ZXh0LXZhcmlhYmxlLWFuY2hvclwiKSAmJiBmdW5jdGlvbiAoZSwgaSwgbywgciwgYSwgbiwgcykge1xuICAgICAgICAgICAgZm9yICh2YXIgbCA9IGkudHJhbnNmb3JtLCBjID0gXCJtYXBcIiA9PT0gYSwgdSA9IFwibWFwXCIgPT09IG4sIGggPSAwLCBwID0gZTsgaCA8IHAubGVuZ3RoOyBoICs9IDEpIHtcbiAgICAgICAgICAgICAgdmFyIGQgPSBwW2hdLFxuICAgICAgICAgICAgICAgICAgXyA9IHIuZ2V0VGlsZShkKSxcbiAgICAgICAgICAgICAgICAgIGYgPSBfLmdldEJ1Y2tldChvKTtcblxuICAgICAgICAgICAgICBpZiAoZiAmJiBmLnRleHQgJiYgZi50ZXh0LnNlZ21lbnRzLmdldCgpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHZhciBtID0gdC5ldmFsdWF0ZVNpemVGb3Jab29tKGYudGV4dFNpemVEYXRhLCBsLnpvb20pLFxuICAgICAgICAgICAgICAgICAgICBnID0gcGUoXywgMSwgaS50cmFuc2Zvcm0uem9vbSksXG4gICAgICAgICAgICAgICAgICAgIHYgPSBKdChkLnBvc01hdHJpeCwgdSwgYywgaS50cmFuc2Zvcm0sIGcpLFxuICAgICAgICAgICAgICAgICAgICB5ID0gXCJub25lXCIgIT09IG8ubGF5b3V0LmdldChcImljb24tdGV4dC1maXRcIikgJiYgZi5oYXNJY29uRGF0YSgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKG0pIHtcbiAgICAgICAgICAgICAgICAgIHZhciB4ID0gTWF0aC5wb3coMiwgbC56b29tIC0gXy50aWxlSUQub3ZlcnNjYWxlZFopO1xuICAgICAgICAgICAgICAgICAgJGkoZiwgYywgdSwgcywgdC5zeW1ib2xTaXplLCBsLCB2LCBkLnBvc01hdHJpeCwgeCwgbSwgeSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfShyLCBlLCBvLCBpLCBvLmxheW91dC5nZXQoXCJ0ZXh0LXJvdGF0aW9uLWFsaWdubWVudFwiKSwgby5sYXlvdXQuZ2V0KFwidGV4dC1waXRjaC1hbGlnbm1lbnRcIiksIGEpLCAwICE9PSBvLnBhaW50LmdldChcImljb24tb3BhY2l0eVwiKS5jb25zdGFudE9yKDEpICYmIGVvKGUsIGksIG8sIHIsICExLCBvLnBhaW50LmdldChcImljb24tdHJhbnNsYXRlXCIpLCBvLnBhaW50LmdldChcImljb24tdHJhbnNsYXRlLWFuY2hvclwiKSwgby5sYXlvdXQuZ2V0KFwiaWNvbi1yb3RhdGlvbi1hbGlnbm1lbnRcIiksIG8ubGF5b3V0LmdldChcImljb24tcGl0Y2gtYWxpZ25tZW50XCIpLCBvLmxheW91dC5nZXQoXCJpY29uLWtlZXAtdXByaWdodFwiKSwgbiwgcyksIDAgIT09IG8ucGFpbnQuZ2V0KFwidGV4dC1vcGFjaXR5XCIpLmNvbnN0YW50T3IoMSkgJiYgZW8oZSwgaSwgbywgciwgITAsIG8ucGFpbnQuZ2V0KFwidGV4dC10cmFuc2xhdGVcIiksIG8ucGFpbnQuZ2V0KFwidGV4dC10cmFuc2xhdGUtYW5jaG9yXCIpLCBvLmxheW91dC5nZXQoXCJ0ZXh0LXJvdGF0aW9uLWFsaWdubWVudFwiKSwgby5sYXlvdXQuZ2V0KFwidGV4dC1waXRjaC1hbGlnbm1lbnRcIiksIG8ubGF5b3V0LmdldChcInRleHQta2VlcC11cHJpZ2h0XCIpLCBuLCBzKSwgaS5tYXAuc2hvd0NvbGxpc2lvbkJveGVzICYmIChZaShlLCBpLCBvLCByLCBvLnBhaW50LmdldChcInRleHQtdHJhbnNsYXRlXCIpLCBvLnBhaW50LmdldChcInRleHQtdHJhbnNsYXRlLWFuY2hvclwiKSwgITApLCBZaShlLCBpLCBvLCByLCBvLnBhaW50LmdldChcImljb24tdHJhbnNsYXRlXCIpLCBvLnBhaW50LmdldChcImljb24tdHJhbnNsYXRlLWFuY2hvclwiKSwgITEpKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGNpcmNsZTogZnVuY3Rpb24gY2lyY2xlKGUsIGksIG8sIHIpIHtcbiAgICAgICAgaWYgKFwidHJhbnNsdWNlbnRcIiA9PT0gZS5yZW5kZXJQYXNzKSB7XG4gICAgICAgICAgdmFyIGEgPSBvLnBhaW50LmdldChcImNpcmNsZS1vcGFjaXR5XCIpLFxuICAgICAgICAgICAgICBuID0gby5wYWludC5nZXQoXCJjaXJjbGUtc3Ryb2tlLXdpZHRoXCIpLFxuICAgICAgICAgICAgICBzID0gby5wYWludC5nZXQoXCJjaXJjbGUtc3Ryb2tlLW9wYWNpdHlcIiksXG4gICAgICAgICAgICAgIGwgPSB2b2lkIDAgIT09IG8ubGF5b3V0LmdldChcImNpcmNsZS1zb3J0LWtleVwiKS5jb25zdGFudE9yKDEpO1xuXG4gICAgICAgICAgaWYgKDAgIT09IGEuY29uc3RhbnRPcigxKSB8fCAwICE9PSBuLmNvbnN0YW50T3IoMSkgJiYgMCAhPT0gcy5jb25zdGFudE9yKDEpKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBjID0gZS5jb250ZXh0LCB1ID0gYy5nbCwgaCA9IGUuZGVwdGhNb2RlRm9yU3VibGF5ZXIoMCwgSXQuUmVhZE9ubHkpLCBwID0gUHQuZGlzYWJsZWQsIGQgPSBlLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKSwgXyA9IFtdLCBmID0gMDsgZiA8IHIubGVuZ3RoOyBmKyspIHtcbiAgICAgICAgICAgICAgdmFyIG0gPSByW2ZdLFxuICAgICAgICAgICAgICAgICAgZyA9IGkuZ2V0VGlsZShtKSxcbiAgICAgICAgICAgICAgICAgIHYgPSBnLmdldEJ1Y2tldChvKTtcblxuICAgICAgICAgICAgICBpZiAodikge1xuICAgICAgICAgICAgICAgIHZhciB5ID0gdi5wcm9ncmFtQ29uZmlndXJhdGlvbnMuZ2V0KG8uaWQpLFxuICAgICAgICAgICAgICAgICAgICB4ID0ge1xuICAgICAgICAgICAgICAgICAgcHJvZ3JhbUNvbmZpZ3VyYXRpb246IHksXG4gICAgICAgICAgICAgICAgICBwcm9ncmFtOiBlLnVzZVByb2dyYW0oXCJjaXJjbGVcIiwgeSksXG4gICAgICAgICAgICAgICAgICBsYXlvdXRWZXJ0ZXhCdWZmZXI6IHYubGF5b3V0VmVydGV4QnVmZmVyLFxuICAgICAgICAgICAgICAgICAgaW5kZXhCdWZmZXI6IHYuaW5kZXhCdWZmZXIsXG4gICAgICAgICAgICAgICAgICB1bmlmb3JtVmFsdWVzOiB6aShlLCBtLCBnLCBvKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKGwpIGZvciAodmFyIGIgPSAwLCB3ID0gdi5zZWdtZW50cy5nZXQoKTsgYiA8IHcubGVuZ3RoOyBiICs9IDEpIHtcbiAgICAgICAgICAgICAgICAgIHZhciBUID0gd1tiXTtcblxuICAgICAgICAgICAgICAgICAgXy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgc2VnbWVudHM6IG5ldyB0LlNlZ21lbnRWZWN0b3IoW1RdKSxcbiAgICAgICAgICAgICAgICAgICAgc29ydEtleTogVC5zb3J0S2V5LFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZTogeFxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIF8ucHVzaCh7XG4gICAgICAgICAgICAgICAgICBzZWdtZW50czogdi5zZWdtZW50cyxcbiAgICAgICAgICAgICAgICAgIHNvcnRLZXk6IDAsXG4gICAgICAgICAgICAgICAgICBzdGF0ZTogeFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGwgJiYgXy5zb3J0KGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0LnNvcnRLZXkgLSBlLnNvcnRLZXk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZm9yICh2YXIgRSA9IDAsIEkgPSBfOyBFIDwgSS5sZW5ndGg7IEUgKz0gMSkge1xuICAgICAgICAgICAgICB2YXIgUCA9IElbRV0sXG4gICAgICAgICAgICAgICAgICBTID0gUC5zdGF0ZTtcbiAgICAgICAgICAgICAgUy5wcm9ncmFtLmRyYXcoYywgdS5UUklBTkdMRVMsIGgsIHAsIGQsIEN0LmRpc2FibGVkLCBTLnVuaWZvcm1WYWx1ZXMsIG8uaWQsIFMubGF5b3V0VmVydGV4QnVmZmVyLCBTLmluZGV4QnVmZmVyLCBQLnNlZ21lbnRzLCBvLnBhaW50LCBlLnRyYW5zZm9ybS56b29tLCBTLnByb2dyYW1Db25maWd1cmF0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBoZWF0bWFwOiBmdW5jdGlvbiBoZWF0bWFwKGUsIGksIG8sIHIpIHtcbiAgICAgICAgaWYgKDAgIT09IG8ucGFpbnQuZ2V0KFwiaGVhdG1hcC1vcGFjaXR5XCIpKSBpZiAoXCJvZmZzY3JlZW5cIiA9PT0gZS5yZW5kZXJQYXNzKSB7XG4gICAgICAgICAgdmFyIGEgPSBlLmNvbnRleHQsXG4gICAgICAgICAgICAgIG4gPSBhLmdsLFxuICAgICAgICAgICAgICBzID0gUHQuZGlzYWJsZWQsXG4gICAgICAgICAgICAgIGwgPSBuZXcgU3QoW24uT05FLCBuLk9ORV0sIHQuQ29sb3IudHJhbnNwYXJlbnQsIFshMCwgITAsICEwLCAhMF0pO1xuICAgICAgICAgICFmdW5jdGlvbiAodCwgZSwgaSkge1xuICAgICAgICAgICAgdmFyIG8gPSB0LmdsO1xuICAgICAgICAgICAgdC5hY3RpdmVUZXh0dXJlLnNldChvLlRFWFRVUkUxKSwgdC52aWV3cG9ydC5zZXQoWzAsIDAsIGUud2lkdGggLyA0LCBlLmhlaWdodCAvIDRdKTtcbiAgICAgICAgICAgIHZhciByID0gaS5oZWF0bWFwRmJvO1xuICAgICAgICAgICAgaWYgKHIpIG8uYmluZFRleHR1cmUoby5URVhUVVJFXzJELCByLmNvbG9yQXR0YWNobWVudC5nZXQoKSksIHQuYmluZEZyYW1lYnVmZmVyLnNldChyLmZyYW1lYnVmZmVyKTtlbHNlIHtcbiAgICAgICAgICAgICAgdmFyIGEgPSBvLmNyZWF0ZVRleHR1cmUoKTtcbiAgICAgICAgICAgICAgby5iaW5kVGV4dHVyZShvLlRFWFRVUkVfMkQsIGEpLCBvLnRleFBhcmFtZXRlcmkoby5URVhUVVJFXzJELCBvLlRFWFRVUkVfV1JBUF9TLCBvLkNMQU1QX1RPX0VER0UpLCBvLnRleFBhcmFtZXRlcmkoby5URVhUVVJFXzJELCBvLlRFWFRVUkVfV1JBUF9ULCBvLkNMQU1QX1RPX0VER0UpLCBvLnRleFBhcmFtZXRlcmkoby5URVhUVVJFXzJELCBvLlRFWFRVUkVfTUlOX0ZJTFRFUiwgby5MSU5FQVIpLCBvLnRleFBhcmFtZXRlcmkoby5URVhUVVJFXzJELCBvLlRFWFRVUkVfTUFHX0ZJTFRFUiwgby5MSU5FQVIpLCByID0gaS5oZWF0bWFwRmJvID0gdC5jcmVhdGVGcmFtZWJ1ZmZlcihlLndpZHRoIC8gNCwgZS5oZWlnaHQgLyA0LCAhMSksIGZ1bmN0aW9uICh0LCBlLCBpLCBvKSB7XG4gICAgICAgICAgICAgICAgdmFyIHIgPSB0LmdsO1xuICAgICAgICAgICAgICAgIHIudGV4SW1hZ2UyRChyLlRFWFRVUkVfMkQsIDAsIHIuUkdCQSwgZS53aWR0aCAvIDQsIGUuaGVpZ2h0IC8gNCwgMCwgci5SR0JBLCB0LmV4dFJlbmRlclRvVGV4dHVyZUhhbGZGbG9hdCA/IHQuZXh0VGV4dHVyZUhhbGZGbG9hdC5IQUxGX0ZMT0FUX09FUyA6IHIuVU5TSUdORURfQllURSwgbnVsbCksIG8uY29sb3JBdHRhY2htZW50LnNldChpKTtcbiAgICAgICAgICAgICAgfSh0LCBlLCBhLCByKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KGEsIGUsIG8pLCBhLmNsZWFyKHtcbiAgICAgICAgICAgIGNvbG9yOiB0LkNvbG9yLnRyYW5zcGFyZW50XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBmb3IgKHZhciBjID0gMDsgYyA8IHIubGVuZ3RoOyBjKyspIHtcbiAgICAgICAgICAgIHZhciB1ID0gcltjXTtcblxuICAgICAgICAgICAgaWYgKCFpLmhhc1JlbmRlcmFibGVQYXJlbnQodSkpIHtcbiAgICAgICAgICAgICAgdmFyIGggPSBpLmdldFRpbGUodSksXG4gICAgICAgICAgICAgICAgICBwID0gaC5nZXRCdWNrZXQobyk7XG5cbiAgICAgICAgICAgICAgaWYgKHApIHtcbiAgICAgICAgICAgICAgICB2YXIgZCA9IHAucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLmdldChvLmlkKTtcbiAgICAgICAgICAgICAgICBlLnVzZVByb2dyYW0oXCJoZWF0bWFwXCIsIGQpLmRyYXcoYSwgbi5UUklBTkdMRVMsIEl0LmRpc2FibGVkLCBzLCBsLCBDdC5kaXNhYmxlZCwgUmkodS5wb3NNYXRyaXgsIGgsIGUudHJhbnNmb3JtLnpvb20sIG8ucGFpbnQuZ2V0KFwiaGVhdG1hcC1pbnRlbnNpdHlcIikpLCBvLmlkLCBwLmxheW91dFZlcnRleEJ1ZmZlciwgcC5pbmRleEJ1ZmZlciwgcC5zZWdtZW50cywgby5wYWludCwgZS50cmFuc2Zvcm0uem9vbSwgZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhLnZpZXdwb3J0LnNldChbMCwgMCwgZS53aWR0aCwgZS5oZWlnaHRdKTtcbiAgICAgICAgfSBlbHNlIFwidHJhbnNsdWNlbnRcIiA9PT0gZS5yZW5kZXJQYXNzICYmIChlLmNvbnRleHQuc2V0Q29sb3JNb2RlKGUuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpKSwgZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgICAgICB2YXIgbyA9IGUuY29udGV4dCxcbiAgICAgICAgICAgICAgciA9IG8uZ2wsXG4gICAgICAgICAgICAgIGEgPSBpLmhlYXRtYXBGYm87XG5cbiAgICAgICAgICBpZiAoYSkge1xuICAgICAgICAgICAgby5hY3RpdmVUZXh0dXJlLnNldChyLlRFWFRVUkUwKSwgci5iaW5kVGV4dHVyZShyLlRFWFRVUkVfMkQsIGEuY29sb3JBdHRhY2htZW50LmdldCgpKSwgby5hY3RpdmVUZXh0dXJlLnNldChyLlRFWFRVUkUxKTtcbiAgICAgICAgICAgIHZhciBuID0gaS5jb2xvclJhbXBUZXh0dXJlO1xuICAgICAgICAgICAgbiB8fCAobiA9IGkuY29sb3JSYW1wVGV4dHVyZSA9IG5ldyB0LlRleHR1cmUobywgaS5jb2xvclJhbXAsIHIuUkdCQSkpLCBuLmJpbmQoci5MSU5FQVIsIHIuQ0xBTVBfVE9fRURHRSksIGUudXNlUHJvZ3JhbShcImhlYXRtYXBUZXh0dXJlXCIpLmRyYXcobywgci5UUklBTkdMRVMsIEl0LmRpc2FibGVkLCBQdC5kaXNhYmxlZCwgZS5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCksIEN0LmRpc2FibGVkLCBmdW5jdGlvbiAoZSwgaSwgbywgcikge1xuICAgICAgICAgICAgICB2YXIgYSA9IHQuY3JlYXRlKCk7XG4gICAgICAgICAgICAgIHQub3J0aG8oYSwgMCwgZS53aWR0aCwgZS5oZWlnaHQsIDAsIDAsIDEpO1xuICAgICAgICAgICAgICB2YXIgbiA9IGUuY29udGV4dC5nbDtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1X21hdHJpeDogYSxcbiAgICAgICAgICAgICAgICB1X3dvcmxkOiBbbi5kcmF3aW5nQnVmZmVyV2lkdGgsIG4uZHJhd2luZ0J1ZmZlckhlaWdodF0sXG4gICAgICAgICAgICAgICAgdV9pbWFnZTogMCxcbiAgICAgICAgICAgICAgICB1X2NvbG9yX3JhbXA6IDEsXG4gICAgICAgICAgICAgICAgdV9vcGFjaXR5OiBpLnBhaW50LmdldChcImhlYXRtYXAtb3BhY2l0eVwiKVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfShlLCBpKSwgaS5pZCwgZS52aWV3cG9ydEJ1ZmZlciwgZS5xdWFkVHJpYW5nbGVJbmRleEJ1ZmZlciwgZS52aWV3cG9ydFNlZ21lbnRzLCBpLnBhaW50LCBlLnRyYW5zZm9ybS56b29tKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0oZSwgbykpO1xuICAgICAgfSxcbiAgICAgIGxpbmU6IGZ1bmN0aW9uIGxpbmUoZSwgaSwgbywgcikge1xuICAgICAgICBpZiAoXCJ0cmFuc2x1Y2VudFwiID09PSBlLnJlbmRlclBhc3MpIHtcbiAgICAgICAgICB2YXIgYSA9IG8ucGFpbnQuZ2V0KFwibGluZS1vcGFjaXR5XCIpLFxuICAgICAgICAgICAgICBuID0gby5wYWludC5nZXQoXCJsaW5lLXdpZHRoXCIpO1xuICAgICAgICAgIGlmICgwICE9PSBhLmNvbnN0YW50T3IoMSkgJiYgMCAhPT0gbi5jb25zdGFudE9yKDEpKSBmb3IgKHZhciBzID0gZS5kZXB0aE1vZGVGb3JTdWJsYXllcigwLCBJdC5SZWFkT25seSksIGwgPSBlLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKSwgYyA9IG8ucGFpbnQuZ2V0KFwibGluZS1kYXNoYXJyYXlcIiksIHUgPSBvLnBhaW50LmdldChcImxpbmUtcGF0dGVyblwiKSwgaCA9IHUuY29uc3RhbnRPcigxKSwgcCA9IG8ucGFpbnQuZ2V0KFwibGluZS1ncmFkaWVudFwiKSwgZCA9IG8uZ2V0Q3Jvc3NmYWRlUGFyYW1ldGVycygpLCBfID0gaCA/IFwibGluZVBhdHRlcm5cIiA6IGMgPyBcImxpbmVTREZcIiA6IHAgPyBcImxpbmVHcmFkaWVudFwiIDogXCJsaW5lXCIsIGYgPSBlLmNvbnRleHQsIG0gPSBmLmdsLCBnID0gITAsIHYgPSAwLCB5ID0gcjsgdiA8IHkubGVuZ3RoOyB2ICs9IDEpIHtcbiAgICAgICAgICAgIHZhciB4ID0geVt2XSxcbiAgICAgICAgICAgICAgICBiID0gaS5nZXRUaWxlKHgpO1xuXG4gICAgICAgICAgICBpZiAoIWggfHwgYi5wYXR0ZXJuc0xvYWRlZCgpKSB7XG4gICAgICAgICAgICAgIHZhciB3ID0gYi5nZXRCdWNrZXQobyk7XG5cbiAgICAgICAgICAgICAgaWYgKHcpIHtcbiAgICAgICAgICAgICAgICB2YXIgVCA9IHcucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLmdldChvLmlkKSxcbiAgICAgICAgICAgICAgICAgICAgRSA9IGUuY29udGV4dC5wcm9ncmFtLmdldCgpLFxuICAgICAgICAgICAgICAgICAgICBJID0gZS51c2VQcm9ncmFtKF8sIFQpLFxuICAgICAgICAgICAgICAgICAgICBQID0gZyB8fCBJLnByb2dyYW0gIT09IEUsXG4gICAgICAgICAgICAgICAgICAgIFMgPSB1LmNvbnN0YW50T3IobnVsbCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoUyAmJiBiLmltYWdlQXRsYXMpIHtcbiAgICAgICAgICAgICAgICAgIHZhciBDID0gYi5pbWFnZUF0bGFzLFxuICAgICAgICAgICAgICAgICAgICAgIHogPSBDLnBhdHRlcm5Qb3NpdGlvbnNbUy50by50b1N0cmluZygpXSxcbiAgICAgICAgICAgICAgICAgICAgICBEID0gQy5wYXR0ZXJuUG9zaXRpb25zW1MuZnJvbS50b1N0cmluZygpXTtcbiAgICAgICAgICAgICAgICAgIHogJiYgRCAmJiBULnNldENvbnN0YW50UGF0dGVyblBvc2l0aW9ucyh6LCBEKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgQSA9IGggPyBPaShlLCBiLCBvLCBkKSA6IGMgPyBGaShlLCBiLCBvLCBjLCBkKSA6IHAgPyBCaShlLCBiLCBvLCB3LmxpbmVDbGlwc0FycmF5Lmxlbmd0aCkgOiBraShlLCBiLCBvKTtcbiAgICAgICAgICAgICAgICBpZiAoaCkgZi5hY3RpdmVUZXh0dXJlLnNldChtLlRFWFRVUkUwKSwgYi5pbWFnZUF0bGFzVGV4dHVyZS5iaW5kKG0uTElORUFSLCBtLkNMQU1QX1RPX0VER0UpLCBULnVwZGF0ZVBhaW50QnVmZmVycyhkKTtlbHNlIGlmIChjICYmIChQIHx8IGUubGluZUF0bGFzLmRpcnR5KSkgZi5hY3RpdmVUZXh0dXJlLnNldChtLlRFWFRVUkUwKSwgZS5saW5lQXRsYXMuYmluZChmKTtlbHNlIGlmIChwKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgTSA9IHcuZ3JhZGllbnRzW28uaWRdLFxuICAgICAgICAgICAgICAgICAgICAgIEwgPSBNLnRleHR1cmU7XG5cbiAgICAgICAgICAgICAgICAgIGlmIChvLmdyYWRpZW50VmVyc2lvbiAhPT0gTS52ZXJzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBSID0gMjU2O1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChvLnN0ZXBJbnRlcnBvbGFudCkge1xuICAgICAgICAgICAgICAgICAgICAgIHZhciBrID0gaS5nZXRTb3VyY2UoKS5tYXh6b29tLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBCID0geC5jYW5vbmljYWwueiA9PT0gayA/IE1hdGguY2VpbCgxIDw8IGUudHJhbnNmb3JtLm1heFpvb20gLSB4LmNhbm9uaWNhbC56KSA6IDE7XG4gICAgICAgICAgICAgICAgICAgICAgUiA9IHQuY2xhbXAodC5uZXh0UG93ZXJPZlR3byh3Lm1heExpbmVMZW5ndGggLyB0LkVYVEVOVCAqIDEwMjQgKiBCKSwgMjU2LCBmLm1heFRleHR1cmVTaXplKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIE0uZ3JhZGllbnQgPSB0LnJlbmRlckNvbG9yUmFtcCh7XG4gICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogby5ncmFkaWVudEV4cHJlc3Npb24oKSxcbiAgICAgICAgICAgICAgICAgICAgICBldmFsdWF0aW9uS2V5OiBcImxpbmVQcm9ncmVzc1wiLFxuICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb246IFIsXG4gICAgICAgICAgICAgICAgICAgICAgaW1hZ2U6IE0uZ3JhZGllbnQgfHwgdm9pZCAwLFxuICAgICAgICAgICAgICAgICAgICAgIGNsaXBzOiB3LmxpbmVDbGlwc0FycmF5XG4gICAgICAgICAgICAgICAgICAgIH0pLCBNLnRleHR1cmUgPyBNLnRleHR1cmUudXBkYXRlKE0uZ3JhZGllbnQpIDogTS50ZXh0dXJlID0gbmV3IHQuVGV4dHVyZShmLCBNLmdyYWRpZW50LCBtLlJHQkEpLCBNLnZlcnNpb24gPSBvLmdyYWRpZW50VmVyc2lvbiwgTCA9IE0udGV4dHVyZTtcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgZi5hY3RpdmVUZXh0dXJlLnNldChtLlRFWFRVUkUwKSwgTC5iaW5kKG8uc3RlcEludGVycG9sYW50ID8gbS5ORUFSRVNUIDogbS5MSU5FQVIsIG0uQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEkuZHJhdyhmLCBtLlRSSUFOR0xFUywgcywgZS5zdGVuY2lsTW9kZUZvckNsaXBwaW5nKHgpLCBsLCBDdC5kaXNhYmxlZCwgQSwgby5pZCwgdy5sYXlvdXRWZXJ0ZXhCdWZmZXIsIHcuaW5kZXhCdWZmZXIsIHcuc2VnbWVudHMsIG8ucGFpbnQsIGUudHJhbnNmb3JtLnpvb20sIFQsIHcubGF5b3V0VmVydGV4QnVmZmVyMiksIGcgPSAhMTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGZpbGw6IGZ1bmN0aW9uIGZpbGwoZSwgaSwgbywgcikge1xuICAgICAgICB2YXIgYSA9IG8ucGFpbnQuZ2V0KFwiZmlsbC1jb2xvclwiKSxcbiAgICAgICAgICAgIG4gPSBvLnBhaW50LmdldChcImZpbGwtb3BhY2l0eVwiKTtcblxuICAgICAgICBpZiAoMCAhPT0gbi5jb25zdGFudE9yKDEpKSB7XG4gICAgICAgICAgdmFyIHMgPSBlLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKSxcbiAgICAgICAgICAgICAgbCA9IG8ucGFpbnQuZ2V0KFwiZmlsbC1wYXR0ZXJuXCIpLFxuICAgICAgICAgICAgICBjID0gZS5vcGFxdWVQYXNzRW5hYmxlZEZvckxheWVyKCkgJiYgIWwuY29uc3RhbnRPcigxKSAmJiAxID09PSBhLmNvbnN0YW50T3IodC5Db2xvci50cmFuc3BhcmVudCkuYSAmJiAxID09PSBuLmNvbnN0YW50T3IoMCkgPyBcIm9wYXF1ZVwiIDogXCJ0cmFuc2x1Y2VudFwiO1xuXG4gICAgICAgICAgaWYgKGUucmVuZGVyUGFzcyA9PT0gYykge1xuICAgICAgICAgICAgdmFyIHUgPSBlLmRlcHRoTW9kZUZvclN1YmxheWVyKDEsIFwib3BhcXVlXCIgPT09IGUucmVuZGVyUGFzcyA/IEl0LlJlYWRXcml0ZSA6IEl0LlJlYWRPbmx5KTtcbiAgICAgICAgICAgIG9vKGUsIGksIG8sIHIsIHUsIHMsICExKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoXCJ0cmFuc2x1Y2VudFwiID09PSBlLnJlbmRlclBhc3MgJiYgby5wYWludC5nZXQoXCJmaWxsLWFudGlhbGlhc1wiKSkge1xuICAgICAgICAgICAgdmFyIGggPSBlLmRlcHRoTW9kZUZvclN1YmxheWVyKG8uZ2V0UGFpbnRQcm9wZXJ0eShcImZpbGwtb3V0bGluZS1jb2xvclwiKSA/IDIgOiAwLCBJdC5SZWFkT25seSk7XG4gICAgICAgICAgICBvbyhlLCBpLCBvLCByLCBoLCBzLCAhMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJmaWxsLWV4dHJ1c2lvblwiOiBmdW5jdGlvbiBmaWxsRXh0cnVzaW9uKHQsIGUsIGksIG8pIHtcbiAgICAgICAgdmFyIHIgPSBpLnBhaW50LmdldChcImZpbGwtZXh0cnVzaW9uLW9wYWNpdHlcIik7XG5cbiAgICAgICAgaWYgKDAgIT09IHIgJiYgXCJ0cmFuc2x1Y2VudFwiID09PSB0LnJlbmRlclBhc3MpIHtcbiAgICAgICAgICB2YXIgYSA9IG5ldyBJdCh0LmNvbnRleHQuZ2wuTEVRVUFMLCBJdC5SZWFkV3JpdGUsIHQuZGVwdGhSYW5nZUZvcjNEKTtcbiAgICAgICAgICBpZiAoMSAhPT0gciB8fCBpLnBhaW50LmdldChcImZpbGwtZXh0cnVzaW9uLXBhdHRlcm5cIikuY29uc3RhbnRPcigxKSkgcm8odCwgZSwgaSwgbywgYSwgUHQuZGlzYWJsZWQsIFN0LmRpc2FibGVkKSwgcm8odCwgZSwgaSwgbywgYSwgdC5zdGVuY2lsTW9kZUZvcjNEKCksIHQuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpKTtlbHNlIHtcbiAgICAgICAgICAgIHZhciBuID0gdC5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCk7XG4gICAgICAgICAgICBybyh0LCBlLCBpLCBvLCBhLCBQdC5kaXNhYmxlZCwgbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgaGlsbHNoYWRlOiBmdW5jdGlvbiBoaWxsc2hhZGUodCwgZSwgaSwgbykge1xuICAgICAgICBpZiAoXCJvZmZzY3JlZW5cIiA9PT0gdC5yZW5kZXJQYXNzIHx8IFwidHJhbnNsdWNlbnRcIiA9PT0gdC5yZW5kZXJQYXNzKSB7XG4gICAgICAgICAgZm9yICh2YXIgciA9IHQuY29udGV4dCwgYSA9IHQuZGVwdGhNb2RlRm9yU3VibGF5ZXIoMCwgSXQuUmVhZE9ubHkpLCBuID0gdC5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCksIHMgPSBcInRyYW5zbHVjZW50XCIgPT09IHQucmVuZGVyUGFzcyA/IHQuc3RlbmNpbENvbmZpZ0Zvck92ZXJsYXAobykgOiBbe30sIG9dLCBsID0gc1swXSwgYyA9IDAsIHUgPSBzWzFdOyBjIDwgdS5sZW5ndGg7IGMgKz0gMSkge1xuICAgICAgICAgICAgdmFyIGggPSB1W2NdLFxuICAgICAgICAgICAgICAgIHAgPSBlLmdldFRpbGUoaCk7XG4gICAgICAgICAgICBwLm5lZWRzSGlsbHNoYWRlUHJlcGFyZSAmJiBcIm9mZnNjcmVlblwiID09PSB0LnJlbmRlclBhc3MgPyBubyh0LCBwLCBpLCBhLCBQdC5kaXNhYmxlZCwgbikgOiBcInRyYW5zbHVjZW50XCIgPT09IHQucmVuZGVyUGFzcyAmJiBhbyh0LCBwLCBpLCBhLCBsW2gub3ZlcnNjYWxlZFpdLCBuKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByLnZpZXdwb3J0LnNldChbMCwgMCwgdC53aWR0aCwgdC5oZWlnaHRdKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHJhc3RlcjogZnVuY3Rpb24gcmFzdGVyKHQsIGUsIGksIG8pIHtcbiAgICAgICAgaWYgKFwidHJhbnNsdWNlbnRcIiA9PT0gdC5yZW5kZXJQYXNzICYmIDAgIT09IGkucGFpbnQuZ2V0KFwicmFzdGVyLW9wYWNpdHlcIikgJiYgby5sZW5ndGgpIGZvciAodmFyIHIgPSB0LmNvbnRleHQsIGEgPSByLmdsLCBuID0gZS5nZXRTb3VyY2UoKSwgcyA9IHQudXNlUHJvZ3JhbShcInJhc3RlclwiKSwgbCA9IHQuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpLCBjID0gbiBpbnN0YW5jZW9mIE0gPyBbe30sIG9dIDogdC5zdGVuY2lsQ29uZmlnRm9yT3ZlcmxhcChvKSwgdSA9IGNbMF0sIGggPSBjWzFdLCBwID0gaFtoLmxlbmd0aCAtIDFdLm92ZXJzY2FsZWRaLCBkID0gIXQub3B0aW9ucy5tb3ZpbmcsIF8gPSAwLCBmID0gaDsgXyA8IGYubGVuZ3RoOyBfICs9IDEpIHtcbiAgICAgICAgICB2YXIgbSA9IGZbX10sXG4gICAgICAgICAgICAgIGcgPSB0LmRlcHRoTW9kZUZvclN1YmxheWVyKG0ub3ZlcnNjYWxlZFogLSBwLCAxID09PSBpLnBhaW50LmdldChcInJhc3Rlci1vcGFjaXR5XCIpID8gSXQuUmVhZFdyaXRlIDogSXQuUmVhZE9ubHksIGEuTEVTUyksXG4gICAgICAgICAgICAgIHYgPSBlLmdldFRpbGUobSksXG4gICAgICAgICAgICAgIHkgPSB0LnRyYW5zZm9ybS5jYWxjdWxhdGVQb3NNYXRyaXgobS50b1Vud3JhcHBlZCgpLCBkKTtcbiAgICAgICAgICB2LnJlZ2lzdGVyRmFkZUR1cmF0aW9uKGkucGFpbnQuZ2V0KFwicmFzdGVyLWZhZGUtZHVyYXRpb25cIikpO1xuICAgICAgICAgIHZhciB4ID0gZS5maW5kTG9hZGVkUGFyZW50KG0sIDApLFxuICAgICAgICAgICAgICBiID0gc28odiwgeCwgZSwgaSwgdC50cmFuc2Zvcm0pLFxuICAgICAgICAgICAgICB3ID0gdm9pZCAwLFxuICAgICAgICAgICAgICBUID0gdm9pZCAwLFxuICAgICAgICAgICAgICBFID0gXCJuZWFyZXN0XCIgPT09IGkucGFpbnQuZ2V0KFwicmFzdGVyLXJlc2FtcGxpbmdcIikgPyBhLk5FQVJFU1QgOiBhLkxJTkVBUjtcbiAgICAgICAgICByLmFjdGl2ZVRleHR1cmUuc2V0KGEuVEVYVFVSRTApLCB2LnRleHR1cmUuYmluZChFLCBhLkNMQU1QX1RPX0VER0UsIGEuTElORUFSX01JUE1BUF9ORUFSRVNUKSwgci5hY3RpdmVUZXh0dXJlLnNldChhLlRFWFRVUkUxKSwgeCA/ICh4LnRleHR1cmUuYmluZChFLCBhLkNMQU1QX1RPX0VER0UsIGEuTElORUFSX01JUE1BUF9ORUFSRVNUKSwgdyA9IE1hdGgucG93KDIsIHgudGlsZUlELm92ZXJzY2FsZWRaIC0gdi50aWxlSUQub3ZlcnNjYWxlZFopLCBUID0gW3YudGlsZUlELmNhbm9uaWNhbC54ICogdyAlIDEsIHYudGlsZUlELmNhbm9uaWNhbC55ICogdyAlIDFdKSA6IHYudGV4dHVyZS5iaW5kKEUsIGEuQ0xBTVBfVE9fRURHRSwgYS5MSU5FQVJfTUlQTUFQX05FQVJFU1QpO1xuICAgICAgICAgIHZhciBJID0gWmkoeSwgVCB8fCBbMCwgMF0sIHcgfHwgMSwgYiwgaSk7XG4gICAgICAgICAgbiBpbnN0YW5jZW9mIE0gPyBzLmRyYXcociwgYS5UUklBTkdMRVMsIGcsIFB0LmRpc2FibGVkLCBsLCBDdC5kaXNhYmxlZCwgSSwgaS5pZCwgbi5ib3VuZHNCdWZmZXIsIHQucXVhZFRyaWFuZ2xlSW5kZXhCdWZmZXIsIG4uYm91bmRzU2VnbWVudHMpIDogcy5kcmF3KHIsIGEuVFJJQU5HTEVTLCBnLCB1W20ub3ZlcnNjYWxlZFpdLCBsLCBDdC5kaXNhYmxlZCwgSSwgaS5pZCwgdC5yYXN0ZXJCb3VuZHNCdWZmZXIsIHQucXVhZFRyaWFuZ2xlSW5kZXhCdWZmZXIsIHQucmFzdGVyQm91bmRzU2VnbWVudHMpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgYmFja2dyb3VuZDogZnVuY3Rpb24gYmFja2dyb3VuZCh0LCBlLCBpKSB7XG4gICAgICAgIHZhciBvID0gaS5wYWludC5nZXQoXCJiYWNrZ3JvdW5kLWNvbG9yXCIpLFxuICAgICAgICAgICAgciA9IGkucGFpbnQuZ2V0KFwiYmFja2dyb3VuZC1vcGFjaXR5XCIpO1xuXG4gICAgICAgIGlmICgwICE9PSByKSB7XG4gICAgICAgICAgdmFyIGEgPSB0LmNvbnRleHQsXG4gICAgICAgICAgICAgIG4gPSBhLmdsLFxuICAgICAgICAgICAgICBzID0gdC50cmFuc2Zvcm0sXG4gICAgICAgICAgICAgIGwgPSBzLnRpbGVTaXplLFxuICAgICAgICAgICAgICBjID0gaS5wYWludC5nZXQoXCJiYWNrZ3JvdW5kLXBhdHRlcm5cIik7XG5cbiAgICAgICAgICBpZiAoIXQuaXNQYXR0ZXJuTWlzc2luZyhjKSkge1xuICAgICAgICAgICAgdmFyIHUgPSAhYyAmJiAxID09PSBvLmEgJiYgMSA9PT0gciAmJiB0Lm9wYXF1ZVBhc3NFbmFibGVkRm9yTGF5ZXIoKSA/IFwib3BhcXVlXCIgOiBcInRyYW5zbHVjZW50XCI7XG5cbiAgICAgICAgICAgIGlmICh0LnJlbmRlclBhc3MgPT09IHUpIHtcbiAgICAgICAgICAgICAgdmFyIGggPSBQdC5kaXNhYmxlZCxcbiAgICAgICAgICAgICAgICAgIHAgPSB0LmRlcHRoTW9kZUZvclN1YmxheWVyKDAsIFwib3BhcXVlXCIgPT09IHUgPyBJdC5SZWFkV3JpdGUgOiBJdC5SZWFkT25seSksXG4gICAgICAgICAgICAgICAgICBkID0gdC5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCksXG4gICAgICAgICAgICAgICAgICBfID0gdC51c2VQcm9ncmFtKGMgPyBcImJhY2tncm91bmRQYXR0ZXJuXCIgOiBcImJhY2tncm91bmRcIiksXG4gICAgICAgICAgICAgICAgICBmID0gcy5jb3ZlcmluZ1RpbGVzKHtcbiAgICAgICAgICAgICAgICB0aWxlU2l6ZTogbFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBjICYmIChhLmFjdGl2ZVRleHR1cmUuc2V0KG4uVEVYVFVSRTApLCB0LmltYWdlTWFuYWdlci5iaW5kKHQuY29udGV4dCkpO1xuXG4gICAgICAgICAgICAgIGZvciAodmFyIG0gPSBpLmdldENyb3NzZmFkZVBhcmFtZXRlcnMoKSwgZyA9IDAsIHYgPSBmOyBnIDwgdi5sZW5ndGg7IGcgKz0gMSkge1xuICAgICAgICAgICAgICAgIHZhciB5ID0gdltnXSxcbiAgICAgICAgICAgICAgICAgICAgeCA9IHQudHJhbnNmb3JtLmNhbGN1bGF0ZVBvc01hdHJpeCh5LnRvVW53cmFwcGVkKCkpLFxuICAgICAgICAgICAgICAgICAgICBiID0gYyA/IEhpKHgsIHIsIHQsIGMsIHtcbiAgICAgICAgICAgICAgICAgIHRpbGVJRDogeSxcbiAgICAgICAgICAgICAgICAgIHRpbGVTaXplOiBsXG4gICAgICAgICAgICAgICAgfSwgbSkgOiBYaSh4LCByLCBvKTtcblxuICAgICAgICAgICAgICAgIF8uZHJhdyhhLCBuLlRSSUFOR0xFUywgcCwgaCwgZCwgQ3QuZGlzYWJsZWQsIGIsIGkuaWQsIHQudGlsZUV4dGVudEJ1ZmZlciwgdC5xdWFkVHJpYW5nbGVJbmRleEJ1ZmZlciwgdC50aWxlRXh0ZW50U2VnbWVudHMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZGVidWc6IGZ1bmN0aW9uIGRlYnVnKHQsIGUsIGkpIHtcbiAgICAgICAgZm9yICh2YXIgbyA9IDA7IG8gPCBpLmxlbmd0aDsgbysrKSB7XG4gICAgICAgICAgZ28odCwgZSwgaVtvXSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBjdXN0b206IGZ1bmN0aW9uIGN1c3RvbSh0LCBlLCBpKSB7XG4gICAgICAgIHZhciBvID0gdC5jb250ZXh0LFxuICAgICAgICAgICAgciA9IGkuaW1wbGVtZW50YXRpb247XG5cbiAgICAgICAgaWYgKFwib2Zmc2NyZWVuXCIgPT09IHQucmVuZGVyUGFzcykge1xuICAgICAgICAgIHZhciBhID0gci5wcmVyZW5kZXI7XG4gICAgICAgICAgYSAmJiAodC5zZXRDdXN0b21MYXllckRlZmF1bHRzKCksIG8uc2V0Q29sb3JNb2RlKHQuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpKSwgYS5jYWxsKHIsIG8uZ2wsIHQudHJhbnNmb3JtLmN1c3RvbUxheWVyTWF0cml4KCkpLCBvLnNldERpcnR5KCksIHQuc2V0QmFzZVN0YXRlKCkpO1xuICAgICAgICB9IGVsc2UgaWYgKFwidHJhbnNsdWNlbnRcIiA9PT0gdC5yZW5kZXJQYXNzKSB7XG4gICAgICAgICAgdC5zZXRDdXN0b21MYXllckRlZmF1bHRzKCksIG8uc2V0Q29sb3JNb2RlKHQuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpKSwgby5zZXRTdGVuY2lsTW9kZShQdC5kaXNhYmxlZCk7XG4gICAgICAgICAgdmFyIG4gPSBcIjNkXCIgPT09IHIucmVuZGVyaW5nTW9kZSA/IG5ldyBJdCh0LmNvbnRleHQuZ2wuTEVRVUFMLCBJdC5SZWFkV3JpdGUsIHQuZGVwdGhSYW5nZUZvcjNEKSA6IHQuZGVwdGhNb2RlRm9yU3VibGF5ZXIoMCwgSXQuUmVhZE9ubHkpO1xuICAgICAgICAgIG8uc2V0RGVwdGhNb2RlKG4pLCByLnJlbmRlcihvLmdsLCB0LnRyYW5zZm9ybS5jdXN0b21MYXllck1hdHJpeCgpKSwgby5zZXREaXJ0eSgpLCB0LnNldEJhc2VTdGF0ZSgpLCBvLmJpbmRGcmFtZWJ1ZmZlci5zZXQobnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgICAgICB5byA9IGZ1bmN0aW9uIHlvKHQsIGUpIHtcbiAgICAgIHRoaXMuY29udGV4dCA9IG5ldyB6dCh0KSwgdGhpcy50cmFuc2Zvcm0gPSBlLCB0aGlzLl90aWxlVGV4dHVyZXMgPSB7fSwgdGhpcy5zZXR1cCgpLCB0aGlzLm51bVN1YmxheWVycyA9IER0Lm1heFVuZGVyem9vbWluZyArIER0Lm1heE92ZXJ6b29taW5nICsgMSwgdGhpcy5kZXB0aEVwc2lsb24gPSAxIC8gTWF0aC5wb3coMiwgMTYpLCB0aGlzLmNyb3NzVGlsZVN5bWJvbEluZGV4ID0gbmV3IEZlKCksIHRoaXMuZ3B1VGltZXJzID0ge307XG4gICAgfTtcblxuICAgIHlvLnByb3RvdHlwZS5yZXNpemUgPSBmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgaWYgKHRoaXMud2lkdGggPSBlICogdC5icm93c2VyLmRldmljZVBpeGVsUmF0aW8sIHRoaXMuaGVpZ2h0ID0gaSAqIHQuYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvLCB0aGlzLmNvbnRleHQudmlld3BvcnQuc2V0KFswLCAwLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodF0pLCB0aGlzLnN0eWxlKSBmb3IgKHZhciBvID0gMCwgciA9IHRoaXMuc3R5bGUuX29yZGVyOyBvIDwgci5sZW5ndGg7IG8gKz0gMSkge1xuICAgICAgICB0aGlzLnN0eWxlLl9sYXllcnNbcltvXV0ucmVzaXplKCk7XG4gICAgICB9XG4gICAgfSwgeW8ucHJvdG90eXBlLnNldHVwID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGUgPSB0aGlzLmNvbnRleHQsXG4gICAgICAgICAgaSA9IG5ldyB0LlN0cnVjdEFycmF5TGF5b3V0Mmk0KCk7XG4gICAgICBpLmVtcGxhY2VCYWNrKDAsIDApLCBpLmVtcGxhY2VCYWNrKHQuRVhURU5ULCAwKSwgaS5lbXBsYWNlQmFjaygwLCB0LkVYVEVOVCksIGkuZW1wbGFjZUJhY2sodC5FWFRFTlQsIHQuRVhURU5UKSwgdGhpcy50aWxlRXh0ZW50QnVmZmVyID0gZS5jcmVhdGVWZXJ0ZXhCdWZmZXIoaSwgVmUubWVtYmVycyksIHRoaXMudGlsZUV4dGVudFNlZ21lbnRzID0gdC5TZWdtZW50VmVjdG9yLnNpbXBsZVNlZ21lbnQoMCwgMCwgNCwgMik7XG4gICAgICB2YXIgbyA9IG5ldyB0LlN0cnVjdEFycmF5TGF5b3V0Mmk0KCk7XG4gICAgICBvLmVtcGxhY2VCYWNrKDAsIDApLCBvLmVtcGxhY2VCYWNrKHQuRVhURU5ULCAwKSwgby5lbXBsYWNlQmFjaygwLCB0LkVYVEVOVCksIG8uZW1wbGFjZUJhY2sodC5FWFRFTlQsIHQuRVhURU5UKSwgdGhpcy5kZWJ1Z0J1ZmZlciA9IGUuY3JlYXRlVmVydGV4QnVmZmVyKG8sIFZlLm1lbWJlcnMpLCB0aGlzLmRlYnVnU2VnbWVudHMgPSB0LlNlZ21lbnRWZWN0b3Iuc2ltcGxlU2VnbWVudCgwLCAwLCA0LCA1KTtcbiAgICAgIHZhciByID0gbmV3IHQuU3RydWN0QXJyYXlMYXlvdXQ0aTgoKTtcbiAgICAgIHIuZW1wbGFjZUJhY2soMCwgMCwgMCwgMCksIHIuZW1wbGFjZUJhY2sodC5FWFRFTlQsIDAsIHQuRVhURU5ULCAwKSwgci5lbXBsYWNlQmFjaygwLCB0LkVYVEVOVCwgMCwgdC5FWFRFTlQpLCByLmVtcGxhY2VCYWNrKHQuRVhURU5ULCB0LkVYVEVOVCwgdC5FWFRFTlQsIHQuRVhURU5UKSwgdGhpcy5yYXN0ZXJCb3VuZHNCdWZmZXIgPSBlLmNyZWF0ZVZlcnRleEJ1ZmZlcihyLCBBLm1lbWJlcnMpLCB0aGlzLnJhc3RlckJvdW5kc1NlZ21lbnRzID0gdC5TZWdtZW50VmVjdG9yLnNpbXBsZVNlZ21lbnQoMCwgMCwgNCwgMik7XG4gICAgICB2YXIgYSA9IG5ldyB0LlN0cnVjdEFycmF5TGF5b3V0Mmk0KCk7XG4gICAgICBhLmVtcGxhY2VCYWNrKDAsIDApLCBhLmVtcGxhY2VCYWNrKDEsIDApLCBhLmVtcGxhY2VCYWNrKDAsIDEpLCBhLmVtcGxhY2VCYWNrKDEsIDEpLCB0aGlzLnZpZXdwb3J0QnVmZmVyID0gZS5jcmVhdGVWZXJ0ZXhCdWZmZXIoYSwgVmUubWVtYmVycyksIHRoaXMudmlld3BvcnRTZWdtZW50cyA9IHQuU2VnbWVudFZlY3Rvci5zaW1wbGVTZWdtZW50KDAsIDAsIDQsIDIpO1xuICAgICAgdmFyIG4gPSBuZXcgdC5TdHJ1Y3RBcnJheUxheW91dDF1aTIoKTtcbiAgICAgIG4uZW1wbGFjZUJhY2soMCksIG4uZW1wbGFjZUJhY2soMSksIG4uZW1wbGFjZUJhY2soMyksIG4uZW1wbGFjZUJhY2soMiksIG4uZW1wbGFjZUJhY2soMCksIHRoaXMudGlsZUJvcmRlckluZGV4QnVmZmVyID0gZS5jcmVhdGVJbmRleEJ1ZmZlcihuKTtcbiAgICAgIHZhciBzID0gbmV3IHQuU3RydWN0QXJyYXlMYXlvdXQzdWk2KCk7XG4gICAgICBzLmVtcGxhY2VCYWNrKDAsIDEsIDIpLCBzLmVtcGxhY2VCYWNrKDIsIDEsIDMpLCB0aGlzLnF1YWRUcmlhbmdsZUluZGV4QnVmZmVyID0gZS5jcmVhdGVJbmRleEJ1ZmZlcihzKSwgdGhpcy5lbXB0eVRleHR1cmUgPSBuZXcgdC5UZXh0dXJlKGUsIHtcbiAgICAgICAgd2lkdGg6IDEsXG4gICAgICAgIGhlaWdodDogMSxcbiAgICAgICAgZGF0YTogbmV3IFVpbnQ4QXJyYXkoWzAsIDAsIDAsIDBdKVxuICAgICAgfSwgZS5nbC5SR0JBKTtcbiAgICAgIHZhciBsID0gdGhpcy5jb250ZXh0LmdsO1xuICAgICAgdGhpcy5zdGVuY2lsQ2xlYXJNb2RlID0gbmV3IFB0KHtcbiAgICAgICAgZnVuYzogbC5BTFdBWVMsXG4gICAgICAgIG1hc2s6IDBcbiAgICAgIH0sIDAsIDI1NSwgbC5aRVJPLCBsLlpFUk8sIGwuWkVSTyk7XG4gICAgfSwgeW8ucHJvdG90eXBlLmNsZWFyU3RlbmNpbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBlID0gdGhpcy5jb250ZXh0LFxuICAgICAgICAgIGkgPSBlLmdsO1xuICAgICAgdGhpcy5uZXh0U3RlbmNpbElEID0gMSwgdGhpcy5jdXJyZW50U3RlbmNpbFNvdXJjZSA9IHZvaWQgMDtcbiAgICAgIHZhciBvID0gdC5jcmVhdGUoKTtcbiAgICAgIHQub3J0aG8obywgMCwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQsIDAsIDAsIDEpLCB0LnNjYWxlKG8sIG8sIFtpLmRyYXdpbmdCdWZmZXJXaWR0aCwgaS5kcmF3aW5nQnVmZmVySGVpZ2h0LCAwXSksIHRoaXMudXNlUHJvZ3JhbShcImNsaXBwaW5nTWFza1wiKS5kcmF3KGUsIGkuVFJJQU5HTEVTLCBJdC5kaXNhYmxlZCwgdGhpcy5zdGVuY2lsQ2xlYXJNb2RlLCBTdC5kaXNhYmxlZCwgQ3QuZGlzYWJsZWQsIExpKG8pLCBcIiRjbGlwcGluZ1wiLCB0aGlzLnZpZXdwb3J0QnVmZmVyLCB0aGlzLnF1YWRUcmlhbmdsZUluZGV4QnVmZmVyLCB0aGlzLnZpZXdwb3J0U2VnbWVudHMpO1xuICAgIH0sIHlvLnByb3RvdHlwZS5fcmVuZGVyVGlsZUNsaXBwaW5nTWFza3MgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgaWYgKHRoaXMuY3VycmVudFN0ZW5jaWxTb3VyY2UgIT09IHQuc291cmNlICYmIHQuaXNUaWxlQ2xpcHBlZCgpICYmIGUgJiYgZS5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50U3RlbmNpbFNvdXJjZSA9IHQuc291cmNlO1xuICAgICAgICB2YXIgaSA9IHRoaXMuY29udGV4dCxcbiAgICAgICAgICAgIG8gPSBpLmdsO1xuICAgICAgICB0aGlzLm5leHRTdGVuY2lsSUQgKyBlLmxlbmd0aCA+IDI1NiAmJiB0aGlzLmNsZWFyU3RlbmNpbCgpLCBpLnNldENvbG9yTW9kZShTdC5kaXNhYmxlZCksIGkuc2V0RGVwdGhNb2RlKEl0LmRpc2FibGVkKTtcbiAgICAgICAgdmFyIHIgPSB0aGlzLnVzZVByb2dyYW0oXCJjbGlwcGluZ01hc2tcIik7XG4gICAgICAgIHRoaXMuX3RpbGVDbGlwcGluZ01hc2tJRHMgPSB7fTtcblxuICAgICAgICBmb3IgKHZhciBhID0gMCwgbiA9IGU7IGEgPCBuLmxlbmd0aDsgYSArPSAxKSB7XG4gICAgICAgICAgdmFyIHMgPSBuW2FdLFxuICAgICAgICAgICAgICBsID0gdGhpcy5fdGlsZUNsaXBwaW5nTWFza0lEc1tzLmtleV0gPSB0aGlzLm5leHRTdGVuY2lsSUQrKztcbiAgICAgICAgICByLmRyYXcoaSwgby5UUklBTkdMRVMsIEl0LmRpc2FibGVkLCBuZXcgUHQoe1xuICAgICAgICAgICAgZnVuYzogby5BTFdBWVMsXG4gICAgICAgICAgICBtYXNrOiAwXG4gICAgICAgICAgfSwgbCwgMjU1LCBvLktFRVAsIG8uS0VFUCwgby5SRVBMQUNFKSwgU3QuZGlzYWJsZWQsIEN0LmRpc2FibGVkLCBMaShzLnBvc01hdHJpeCksIFwiJGNsaXBwaW5nXCIsIHRoaXMudGlsZUV4dGVudEJ1ZmZlciwgdGhpcy5xdWFkVHJpYW5nbGVJbmRleEJ1ZmZlciwgdGhpcy50aWxlRXh0ZW50U2VnbWVudHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgeW8ucHJvdG90eXBlLnN0ZW5jaWxNb2RlRm9yM0QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLmN1cnJlbnRTdGVuY2lsU291cmNlID0gdm9pZCAwLCB0aGlzLm5leHRTdGVuY2lsSUQgKyAxID4gMjU2ICYmIHRoaXMuY2xlYXJTdGVuY2lsKCk7XG4gICAgICB2YXIgdCA9IHRoaXMubmV4dFN0ZW5jaWxJRCsrLFxuICAgICAgICAgIGUgPSB0aGlzLmNvbnRleHQuZ2w7XG4gICAgICByZXR1cm4gbmV3IFB0KHtcbiAgICAgICAgZnVuYzogZS5OT1RFUVVBTCxcbiAgICAgICAgbWFzazogMjU1XG4gICAgICB9LCB0LCAyNTUsIGUuS0VFUCwgZS5LRUVQLCBlLlJFUExBQ0UpO1xuICAgIH0sIHlvLnByb3RvdHlwZS5zdGVuY2lsTW9kZUZvckNsaXBwaW5nID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHZhciBlID0gdGhpcy5jb250ZXh0LmdsO1xuICAgICAgcmV0dXJuIG5ldyBQdCh7XG4gICAgICAgIGZ1bmM6IGUuRVFVQUwsXG4gICAgICAgIG1hc2s6IDI1NVxuICAgICAgfSwgdGhpcy5fdGlsZUNsaXBwaW5nTWFza0lEc1t0LmtleV0sIDAsIGUuS0VFUCwgZS5LRUVQLCBlLlJFUExBQ0UpO1xuICAgIH0sIHlvLnByb3RvdHlwZS5zdGVuY2lsQ29uZmlnRm9yT3ZlcmxhcCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2YXIgZSxcbiAgICAgICAgICBpID0gdGhpcy5jb250ZXh0LmdsLFxuICAgICAgICAgIG8gPSB0LnNvcnQoZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIGUub3ZlcnNjYWxlZFogLSB0Lm92ZXJzY2FsZWRaO1xuICAgICAgfSksXG4gICAgICAgICAgciA9IG9bby5sZW5ndGggLSAxXS5vdmVyc2NhbGVkWixcbiAgICAgICAgICBhID0gb1swXS5vdmVyc2NhbGVkWiAtIHIgKyAxO1xuXG4gICAgICBpZiAoYSA+IDEpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50U3RlbmNpbFNvdXJjZSA9IHZvaWQgMCwgdGhpcy5uZXh0U3RlbmNpbElEICsgYSA+IDI1NiAmJiB0aGlzLmNsZWFyU3RlbmNpbCgpO1xuXG4gICAgICAgIGZvciAodmFyIG4gPSB7fSwgcyA9IDA7IHMgPCBhOyBzKyspIHtcbiAgICAgICAgICBuW3MgKyByXSA9IG5ldyBQdCh7XG4gICAgICAgICAgICBmdW5jOiBpLkdFUVVBTCxcbiAgICAgICAgICAgIG1hc2s6IDI1NVxuICAgICAgICAgIH0sIHMgKyB0aGlzLm5leHRTdGVuY2lsSUQsIDI1NSwgaS5LRUVQLCBpLktFRVAsIGkuUkVQTEFDRSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5uZXh0U3RlbmNpbElEICs9IGEsIFtuLCBvXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFsoZSA9IHt9LCBlW3JdID0gUHQuZGlzYWJsZWQsIGUpLCBvXTtcbiAgICB9LCB5by5wcm90b3R5cGUuY29sb3JNb2RlRm9yUmVuZGVyUGFzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBlID0gdGhpcy5jb250ZXh0LmdsO1xuICAgICAgcmV0dXJuIHRoaXMuX3Nob3dPdmVyZHJhd0luc3BlY3RvciA/IG5ldyBTdChbZS5DT05TVEFOVF9DT0xPUiwgZS5PTkVdLCBuZXcgdC5Db2xvcigxIC8gOCwgMSAvIDgsIDEgLyA4LCAwKSwgWyEwLCAhMCwgITAsICEwXSkgOiBcIm9wYXF1ZVwiID09PSB0aGlzLnJlbmRlclBhc3MgPyBTdC51bmJsZW5kZWQgOiBTdC5hbHBoYUJsZW5kZWQ7XG4gICAgfSwgeW8ucHJvdG90eXBlLmRlcHRoTW9kZUZvclN1YmxheWVyID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcbiAgICAgIGlmICghdGhpcy5vcGFxdWVQYXNzRW5hYmxlZEZvckxheWVyKCkpIHJldHVybiBJdC5kaXNhYmxlZDtcbiAgICAgIHZhciBvID0gMSAtICgoMSArIHRoaXMuY3VycmVudExheWVyKSAqIHRoaXMubnVtU3VibGF5ZXJzICsgdCkgKiB0aGlzLmRlcHRoRXBzaWxvbjtcbiAgICAgIHJldHVybiBuZXcgSXQoaSB8fCB0aGlzLmNvbnRleHQuZ2wuTEVRVUFMLCBlLCBbbywgb10pO1xuICAgIH0sIHlvLnByb3RvdHlwZS5vcGFxdWVQYXNzRW5hYmxlZEZvckxheWVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY3VycmVudExheWVyIDwgdGhpcy5vcGFxdWVQYXNzQ3V0b2ZmO1xuICAgIH0sIHlvLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgdmFyIG8gPSB0aGlzO1xuICAgICAgdGhpcy5zdHlsZSA9IGUsIHRoaXMub3B0aW9ucyA9IGksIHRoaXMubGluZUF0bGFzID0gZS5saW5lQXRsYXMsIHRoaXMuaW1hZ2VNYW5hZ2VyID0gZS5pbWFnZU1hbmFnZXIsIHRoaXMuZ2x5cGhNYW5hZ2VyID0gZS5nbHlwaE1hbmFnZXIsIHRoaXMuc3ltYm9sRmFkZUNoYW5nZSA9IGUucGxhY2VtZW50LnN5bWJvbEZhZGVDaGFuZ2UodC5icm93c2VyLm5vdygpKSwgdGhpcy5pbWFnZU1hbmFnZXIuYmVnaW5GcmFtZSgpO1xuICAgICAgdmFyIHIgPSB0aGlzLnN0eWxlLl9vcmRlcixcbiAgICAgICAgICBhID0gdGhpcy5zdHlsZS5zb3VyY2VDYWNoZXM7XG5cbiAgICAgIGZvciAodmFyIG4gaW4gYSkge1xuICAgICAgICB2YXIgcyA9IGFbbl07XG4gICAgICAgIHMudXNlZCAmJiBzLnByZXBhcmUodGhpcy5jb250ZXh0KTtcbiAgICAgIH1cblxuICAgICAgdmFyIGwsXG4gICAgICAgICAgYyxcbiAgICAgICAgICB1ID0ge30sXG4gICAgICAgICAgaCA9IHt9LFxuICAgICAgICAgIHAgPSB7fTtcblxuICAgICAgZm9yICh2YXIgZCBpbiBhKSB7XG4gICAgICAgIHZhciBfID0gYVtkXTtcbiAgICAgICAgdVtkXSA9IF8uZ2V0VmlzaWJsZUNvb3JkaW5hdGVzKCksIGhbZF0gPSB1W2RdLnNsaWNlKCkucmV2ZXJzZSgpLCBwW2RdID0gXy5nZXRWaXNpYmxlQ29vcmRpbmF0ZXMoITApLnJldmVyc2UoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5vcGFxdWVQYXNzQ3V0b2ZmID0gMSAvIDA7XG5cbiAgICAgIGZvciAodmFyIGYgPSAwOyBmIDwgci5sZW5ndGg7IGYrKykge1xuICAgICAgICBpZiAodGhpcy5zdHlsZS5fbGF5ZXJzW3JbZl1dLmlzM0QoKSkge1xuICAgICAgICAgIHRoaXMub3BhcXVlUGFzc0N1dG9mZiA9IGY7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5yZW5kZXJQYXNzID0gXCJvZmZzY3JlZW5cIjtcblxuICAgICAgZm9yICh2YXIgbSA9IDAsIGcgPSByOyBtIDwgZy5sZW5ndGg7IG0gKz0gMSkge1xuICAgICAgICB2YXIgdiA9IHRoaXMuc3R5bGUuX2xheWVyc1tnW21dXTtcblxuICAgICAgICBpZiAodi5oYXNPZmZzY3JlZW5QYXNzKCkgJiYgIXYuaXNIaWRkZW4odGhpcy50cmFuc2Zvcm0uem9vbSkpIHtcbiAgICAgICAgICB2YXIgeSA9IGhbdi5zb3VyY2VdO1xuICAgICAgICAgIChcImN1c3RvbVwiID09PSB2LnR5cGUgfHwgeS5sZW5ndGgpICYmIHRoaXMucmVuZGVyTGF5ZXIodGhpcywgYVt2LnNvdXJjZV0sIHYsIHkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAodGhpcy5jb250ZXh0LmJpbmRGcmFtZWJ1ZmZlci5zZXQobnVsbCksIHRoaXMuY29udGV4dC5jbGVhcih7XG4gICAgICAgIGNvbG9yOiBpLnNob3dPdmVyZHJhd0luc3BlY3RvciA/IHQuQ29sb3IuYmxhY2sgOiB0LkNvbG9yLnRyYW5zcGFyZW50LFxuICAgICAgICBkZXB0aDogMVxuICAgICAgfSksIHRoaXMuY2xlYXJTdGVuY2lsKCksIHRoaXMuX3Nob3dPdmVyZHJhd0luc3BlY3RvciA9IGkuc2hvd092ZXJkcmF3SW5zcGVjdG9yLCB0aGlzLmRlcHRoUmFuZ2VGb3IzRCA9IFswLCAxIC0gKGUuX29yZGVyLmxlbmd0aCArIDIpICogdGhpcy5udW1TdWJsYXllcnMgKiB0aGlzLmRlcHRoRXBzaWxvbl0sIHRoaXMucmVuZGVyUGFzcyA9IFwib3BhcXVlXCIsIHRoaXMuY3VycmVudExheWVyID0gci5sZW5ndGggLSAxOyB0aGlzLmN1cnJlbnRMYXllciA+PSAwOyB0aGlzLmN1cnJlbnRMYXllci0tKSB7XG4gICAgICAgIHZhciB4ID0gdGhpcy5zdHlsZS5fbGF5ZXJzW3JbdGhpcy5jdXJyZW50TGF5ZXJdXSxcbiAgICAgICAgICAgIGIgPSBhW3guc291cmNlXSxcbiAgICAgICAgICAgIHcgPSB1W3guc291cmNlXTtcbiAgICAgICAgdGhpcy5fcmVuZGVyVGlsZUNsaXBwaW5nTWFza3MoeCwgdyksIHRoaXMucmVuZGVyTGF5ZXIodGhpcywgYiwgeCwgdyk7XG4gICAgICB9XG5cbiAgICAgIGZvciAodGhpcy5yZW5kZXJQYXNzID0gXCJ0cmFuc2x1Y2VudFwiLCB0aGlzLmN1cnJlbnRMYXllciA9IDA7IHRoaXMuY3VycmVudExheWVyIDwgci5sZW5ndGg7IHRoaXMuY3VycmVudExheWVyKyspIHtcbiAgICAgICAgdmFyIFQgPSB0aGlzLnN0eWxlLl9sYXllcnNbclt0aGlzLmN1cnJlbnRMYXllcl1dLFxuICAgICAgICAgICAgRSA9IGFbVC5zb3VyY2VdLFxuICAgICAgICAgICAgSSA9IChcInN5bWJvbFwiID09PSBULnR5cGUgPyBwIDogaClbVC5zb3VyY2VdO1xuICAgICAgICB0aGlzLl9yZW5kZXJUaWxlQ2xpcHBpbmdNYXNrcyhULCB1W1Quc291cmNlXSksIHRoaXMucmVuZGVyTGF5ZXIodGhpcywgRSwgVCwgSSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMub3B0aW9ucy5zaG93VGlsZUJvdW5kYXJpZXMgJiYgKHQudmFsdWVzKHRoaXMuc3R5bGUuX2xheWVycykuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICB0LnNvdXJjZSAmJiAhdC5pc0hpZGRlbihvLnRyYW5zZm9ybS56b29tKSAmJiAodC5zb3VyY2UgIT09IChjICYmIGMuaWQpICYmIChjID0gby5zdHlsZS5zb3VyY2VDYWNoZXNbdC5zb3VyY2VdKSwgKCFsIHx8IGwuZ2V0U291cmNlKCkubWF4em9vbSA8IGMuZ2V0U291cmNlKCkubWF4em9vbSkgJiYgKGwgPSBjKSk7XG4gICAgICB9KSwgbCAmJiB2by5kZWJ1Zyh0aGlzLCBsLCBsLmdldFZpc2libGVDb29yZGluYXRlcygpKSksIHRoaXMub3B0aW9ucy5zaG93UGFkZGluZyAmJiBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgZSA9IHQudHJhbnNmb3JtLnBhZGRpbmc7XG4gICAgICAgIF9vKHQsIHQudHJhbnNmb3JtLmhlaWdodCAtIChlLnRvcCB8fCAwKSwgMywgbG8pLCBfbyh0LCBlLmJvdHRvbSB8fCAwLCAzLCBjbyksIGZvKHQsIGUubGVmdCB8fCAwLCAzLCB1byksIGZvKHQsIHQudHJhbnNmb3JtLndpZHRoIC0gKGUucmlnaHQgfHwgMCksIDMsIGhvKTtcbiAgICAgICAgdmFyIGkgPSB0LnRyYW5zZm9ybS5jZW50ZXJQb2ludDtcbiAgICAgICAgIWZ1bmN0aW9uICh0LCBlLCBpLCBvKSB7XG4gICAgICAgICAgbW8odCwgZSAtIDEsIGkgLSAxMCwgMiwgMjAsIG8pLCBtbyh0LCBlIC0gMTAsIGkgLSAxLCAyMCwgMiwgbyk7XG4gICAgICAgIH0odCwgaS54LCB0LnRyYW5zZm9ybS5oZWlnaHQgLSBpLnksIHBvKTtcbiAgICAgIH0odGhpcyksIHRoaXMuY29udGV4dC5zZXREZWZhdWx0KCk7XG4gICAgfSwgeW8ucHJvdG90eXBlLnJlbmRlckxheWVyID0gZnVuY3Rpb24gKHQsIGUsIGksIG8pIHtcbiAgICAgIGkuaXNIaWRkZW4odGhpcy50cmFuc2Zvcm0uem9vbSkgfHwgKFwiYmFja2dyb3VuZFwiID09PSBpLnR5cGUgfHwgXCJjdXN0b21cIiA9PT0gaS50eXBlIHx8IG8ubGVuZ3RoKSAmJiAodGhpcy5pZCA9IGkuaWQsIHRoaXMuZ3B1VGltaW5nU3RhcnQoaSksIHZvW2kudHlwZV0odCwgZSwgaSwgbywgdGhpcy5zdHlsZS5wbGFjZW1lbnQudmFyaWFibGVPZmZzZXRzKSwgdGhpcy5ncHVUaW1pbmdFbmQoKSk7XG4gICAgfSwgeW8ucHJvdG90eXBlLmdwdVRpbWluZ1N0YXJ0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZ3B1VGltaW5nKSB7XG4gICAgICAgIHZhciBlID0gdGhpcy5jb250ZXh0LmV4dFRpbWVyUXVlcnksXG4gICAgICAgICAgICBpID0gdGhpcy5ncHVUaW1lcnNbdC5pZF07XG4gICAgICAgIGkgfHwgKGkgPSB0aGlzLmdwdVRpbWVyc1t0LmlkXSA9IHtcbiAgICAgICAgICBjYWxsczogMCxcbiAgICAgICAgICBjcHVUaW1lOiAwLFxuICAgICAgICAgIHF1ZXJ5OiBlLmNyZWF0ZVF1ZXJ5RVhUKClcbiAgICAgICAgfSksIGkuY2FsbHMrKywgZS5iZWdpblF1ZXJ5RVhUKGUuVElNRV9FTEFQU0VEX0VYVCwgaS5xdWVyeSk7XG4gICAgICB9XG4gICAgfSwgeW8ucHJvdG90eXBlLmdwdVRpbWluZ0VuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZ3B1VGltaW5nKSB7XG4gICAgICAgIHZhciB0ID0gdGhpcy5jb250ZXh0LmV4dFRpbWVyUXVlcnk7XG4gICAgICAgIHQuZW5kUXVlcnlFWFQodC5USU1FX0VMQVBTRURfRVhUKTtcbiAgICAgIH1cbiAgICB9LCB5by5wcm90b3R5cGUuY29sbGVjdEdwdVRpbWVycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0ID0gdGhpcy5ncHVUaW1lcnM7XG4gICAgICByZXR1cm4gdGhpcy5ncHVUaW1lcnMgPSB7fSwgdDtcbiAgICB9LCB5by5wcm90b3R5cGUucXVlcnlHcHVUaW1lcnMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGUgPSB7fTtcblxuICAgICAgZm9yICh2YXIgaSBpbiB0KSB7XG4gICAgICAgIHZhciBvID0gdFtpXSxcbiAgICAgICAgICAgIHIgPSB0aGlzLmNvbnRleHQuZXh0VGltZXJRdWVyeSxcbiAgICAgICAgICAgIGEgPSByLmdldFF1ZXJ5T2JqZWN0RVhUKG8ucXVlcnksIHIuUVVFUllfUkVTVUxUX0VYVCkgLyAxZTY7XG4gICAgICAgIHIuZGVsZXRlUXVlcnlFWFQoby5xdWVyeSksIGVbaV0gPSBhO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZTtcbiAgICB9LCB5by5wcm90b3R5cGUudHJhbnNsYXRlUG9zTWF0cml4ID0gZnVuY3Rpb24gKGUsIGksIG8sIHIsIGEpIHtcbiAgICAgIGlmICghb1swXSAmJiAhb1sxXSkgcmV0dXJuIGU7XG4gICAgICB2YXIgbiA9IGEgPyBcIm1hcFwiID09PSByID8gdGhpcy50cmFuc2Zvcm0uYW5nbGUgOiAwIDogXCJ2aWV3cG9ydFwiID09PSByID8gLXRoaXMudHJhbnNmb3JtLmFuZ2xlIDogMDtcblxuICAgICAgaWYgKG4pIHtcbiAgICAgICAgdmFyIHMgPSBNYXRoLnNpbihuKSxcbiAgICAgICAgICAgIGwgPSBNYXRoLmNvcyhuKTtcbiAgICAgICAgbyA9IFtvWzBdICogbCAtIG9bMV0gKiBzLCBvWzBdICogcyArIG9bMV0gKiBsXTtcbiAgICAgIH1cblxuICAgICAgdmFyIGMgPSBbYSA/IG9bMF0gOiBwZShpLCBvWzBdLCB0aGlzLnRyYW5zZm9ybS56b29tKSwgYSA/IG9bMV0gOiBwZShpLCBvWzFdLCB0aGlzLnRyYW5zZm9ybS56b29tKSwgMF0sXG4gICAgICAgICAgdSA9IG5ldyBGbG9hdDMyQXJyYXkoMTYpO1xuICAgICAgcmV0dXJuIHQudHJhbnNsYXRlKHUsIGUsIGMpLCB1O1xuICAgIH0sIHlvLnByb3RvdHlwZS5zYXZlVGlsZVRleHR1cmUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGUgPSB0aGlzLl90aWxlVGV4dHVyZXNbdC5zaXplWzBdXTtcbiAgICAgIGUgPyBlLnB1c2godCkgOiB0aGlzLl90aWxlVGV4dHVyZXNbdC5zaXplWzBdXSA9IFt0XTtcbiAgICB9LCB5by5wcm90b3R5cGUuZ2V0VGlsZVRleHR1cmUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGUgPSB0aGlzLl90aWxlVGV4dHVyZXNbdF07XG4gICAgICByZXR1cm4gZSAmJiBlLmxlbmd0aCA+IDAgPyBlLnBvcCgpIDogbnVsbDtcbiAgICB9LCB5by5wcm90b3R5cGUuaXNQYXR0ZXJuTWlzc2luZyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBpZiAoIXQpIHJldHVybiAhMTtcbiAgICAgIGlmICghdC5mcm9tIHx8ICF0LnRvKSByZXR1cm4gITA7XG4gICAgICB2YXIgZSA9IHRoaXMuaW1hZ2VNYW5hZ2VyLmdldFBhdHRlcm4odC5mcm9tLnRvU3RyaW5nKCkpLFxuICAgICAgICAgIGkgPSB0aGlzLmltYWdlTWFuYWdlci5nZXRQYXR0ZXJuKHQudG8udG9TdHJpbmcoKSk7XG4gICAgICByZXR1cm4gIWUgfHwgIWk7XG4gICAgfSwgeW8ucHJvdG90eXBlLnVzZVByb2dyYW0gPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgdGhpcy5jYWNoZSA9IHRoaXMuY2FjaGUgfHwge307XG4gICAgICB2YXIgaSA9IFwiXCIgKyB0ICsgKGUgPyBlLmNhY2hlS2V5IDogXCJcIikgKyAodGhpcy5fc2hvd092ZXJkcmF3SW5zcGVjdG9yID8gXCIvb3ZlcmRyYXdcIiA6IFwiXCIpO1xuICAgICAgcmV0dXJuIHRoaXMuY2FjaGVbaV0gfHwgKHRoaXMuY2FjaGVbaV0gPSBuZXcgYmkodGhpcy5jb250ZXh0LCB0LCB2aVt0XSwgZSwgS2lbdF0sIHRoaXMuX3Nob3dPdmVyZHJhd0luc3BlY3RvcikpLCB0aGlzLmNhY2hlW2ldO1xuICAgIH0sIHlvLnByb3RvdHlwZS5zZXRDdXN0b21MYXllckRlZmF1bHRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5jb250ZXh0LnVuYmluZFZBTygpLCB0aGlzLmNvbnRleHQuY3VsbEZhY2Uuc2V0RGVmYXVsdCgpLCB0aGlzLmNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXREZWZhdWx0KCksIHRoaXMuY29udGV4dC5waXhlbFN0b3JlVW5wYWNrLnNldERlZmF1bHQoKSwgdGhpcy5jb250ZXh0LnBpeGVsU3RvcmVVbnBhY2tQcmVtdWx0aXBseUFscGhhLnNldERlZmF1bHQoKSwgdGhpcy5jb250ZXh0LnBpeGVsU3RvcmVVbnBhY2tGbGlwWS5zZXREZWZhdWx0KCk7XG4gICAgfSwgeW8ucHJvdG90eXBlLnNldEJhc2VTdGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0ID0gdGhpcy5jb250ZXh0LmdsO1xuICAgICAgdGhpcy5jb250ZXh0LmN1bGxGYWNlLnNldCghMSksIHRoaXMuY29udGV4dC52aWV3cG9ydC5zZXQoWzAsIDAsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0XSksIHRoaXMuY29udGV4dC5ibGVuZEVxdWF0aW9uLnNldCh0LkZVTkNfQUREKTtcbiAgICB9LCB5by5wcm90b3R5cGUuaW5pdERlYnVnT3ZlcmxheUNhbnZhcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIG51bGwgPT0gdGhpcy5kZWJ1Z092ZXJsYXlDYW52YXMgJiYgKHRoaXMuZGVidWdPdmVybGF5Q2FudmFzID0gdC53aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKSwgdGhpcy5kZWJ1Z092ZXJsYXlDYW52YXMud2lkdGggPSA1MTIsIHRoaXMuZGVidWdPdmVybGF5Q2FudmFzLmhlaWdodCA9IDUxMiwgdGhpcy5kZWJ1Z092ZXJsYXlUZXh0dXJlID0gbmV3IHQuVGV4dHVyZSh0aGlzLmNvbnRleHQsIHRoaXMuZGVidWdPdmVybGF5Q2FudmFzLCB0aGlzLmNvbnRleHQuZ2wuUkdCQSkpO1xuICAgIH0sIHlvLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5lbXB0eVRleHR1cmUuZGVzdHJveSgpLCB0aGlzLmRlYnVnT3ZlcmxheVRleHR1cmUgJiYgdGhpcy5kZWJ1Z092ZXJsYXlUZXh0dXJlLmRlc3Ryb3koKTtcbiAgICB9O1xuXG4gICAgdmFyIHhvID0gZnVuY3Rpb24geG8odCwgZSkge1xuICAgICAgdGhpcy5wb2ludHMgPSB0LCB0aGlzLnBsYW5lcyA9IGU7XG4gICAgfTtcblxuICAgIHhvLmZyb21JbnZQcm9qZWN0aW9uTWF0cml4ID0gZnVuY3Rpb24gKGUsIGksIG8pIHtcbiAgICAgIHZhciByID0gTWF0aC5wb3coMiwgbyksXG4gICAgICAgICAgYSA9IFtbLTEsIDEsIC0xLCAxXSwgWzEsIDEsIC0xLCAxXSwgWzEsIC0xLCAtMSwgMV0sIFstMSwgLTEsIC0xLCAxXSwgWy0xLCAxLCAxLCAxXSwgWzEsIDEsIDEsIDFdLCBbMSwgLTEsIDEsIDFdLCBbLTEsIC0xLCAxLCAxXV0ubWFwKGZ1bmN0aW9uIChpKSB7XG4gICAgICAgIHJldHVybiB0LnRyYW5zZm9ybU1hdDQoW10sIGksIGUpO1xuICAgICAgfSkubWFwKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiB0LnNjYWxlJDEoW10sIGUsIDEgLyBlWzNdIC8gaSAqIHIpO1xuICAgICAgfSksXG4gICAgICAgICAgbiA9IFtbMCwgMSwgMl0sIFs2LCA1LCA0XSwgWzAsIDMsIDddLCBbMiwgMSwgNV0sIFszLCAyLCA2XSwgWzAsIDQsIDVdXS5tYXAoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIGkgPSB0LnN1YihbXSwgYVtlWzBdXSwgYVtlWzFdXSksXG4gICAgICAgICAgICBvID0gdC5zdWIoW10sIGFbZVsyXV0sIGFbZVsxXV0pLFxuICAgICAgICAgICAgciA9IHQubm9ybWFsaXplKFtdLCB0LmNyb3NzKFtdLCBpLCBvKSksXG4gICAgICAgICAgICBuID0gLXQuZG90KHIsIGFbZVsxXV0pO1xuICAgICAgICByZXR1cm4gci5jb25jYXQobik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuZXcgeG8oYSwgbik7XG4gICAgfTtcblxuICAgIHZhciBibyA9IGZ1bmN0aW9uIGJvKGUsIGkpIHtcbiAgICAgIHRoaXMubWluID0gZSwgdGhpcy5tYXggPSBpLCB0aGlzLmNlbnRlciA9IHQuc2NhbGUkMihbXSwgdC5hZGQoW10sIHRoaXMubWluLCB0aGlzLm1heCksIC41KTtcbiAgICB9O1xuXG4gICAgYm8ucHJvdG90eXBlLnF1YWRyYW50ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGZvciAodmFyIGkgPSBbZSAlIDIgPT0gMCwgZSA8IDJdLCBvID0gdC5jbG9uZSQyKHRoaXMubWluKSwgciA9IHQuY2xvbmUkMih0aGlzLm1heCksIGEgPSAwOyBhIDwgaS5sZW5ndGg7IGErKykge1xuICAgICAgICBvW2FdID0gaVthXSA/IHRoaXMubWluW2FdIDogdGhpcy5jZW50ZXJbYV0sIHJbYV0gPSBpW2FdID8gdGhpcy5jZW50ZXJbYV0gOiB0aGlzLm1heFthXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJbMl0gPSB0aGlzLm1heFsyXSwgbmV3IGJvKG8sIHIpO1xuICAgIH0sIGJvLnByb3RvdHlwZS5kaXN0YW5jZVggPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIE1hdGgubWF4KE1hdGgubWluKHRoaXMubWF4WzBdLCB0WzBdKSwgdGhpcy5taW5bMF0pIC0gdFswXTtcbiAgICB9LCBiby5wcm90b3R5cGUuZGlzdGFuY2VZID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiBNYXRoLm1heChNYXRoLm1pbih0aGlzLm1heFsxXSwgdFsxXSksIHRoaXMubWluWzFdKSAtIHRbMV07XG4gICAgfSwgYm8ucHJvdG90eXBlLmludGVyc2VjdHMgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgZm9yICh2YXIgaSA9IFtbdGhpcy5taW5bMF0sIHRoaXMubWluWzFdLCAwLCAxXSwgW3RoaXMubWF4WzBdLCB0aGlzLm1pblsxXSwgMCwgMV0sIFt0aGlzLm1heFswXSwgdGhpcy5tYXhbMV0sIDAsIDFdLCBbdGhpcy5taW5bMF0sIHRoaXMubWF4WzFdLCAwLCAxXV0sIG8gPSAhMCwgciA9IDA7IHIgPCBlLnBsYW5lcy5sZW5ndGg7IHIrKykge1xuICAgICAgICBmb3IgKHZhciBhID0gZS5wbGFuZXNbcl0sIG4gPSAwLCBzID0gMDsgcyA8IGkubGVuZ3RoOyBzKyspIHtcbiAgICAgICAgICBuICs9IHQuZG90JDEoYSwgaVtzXSkgPj0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgwID09PSBuKSByZXR1cm4gMDtcbiAgICAgICAgbiAhPT0gaS5sZW5ndGggJiYgKG8gPSAhMSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvKSByZXR1cm4gMjtcblxuICAgICAgZm9yICh2YXIgbCA9IDA7IGwgPCAzOyBsKyspIHtcbiAgICAgICAgZm9yICh2YXIgYyA9IE51bWJlci5NQVhfVkFMVUUsIHUgPSAtTnVtYmVyLk1BWF9WQUxVRSwgaCA9IDA7IGggPCBlLnBvaW50cy5sZW5ndGg7IGgrKykge1xuICAgICAgICAgIHZhciBwID0gZS5wb2ludHNbaF1bbF0gLSB0aGlzLm1pbltsXTtcbiAgICAgICAgICBjID0gTWF0aC5taW4oYywgcCksIHUgPSBNYXRoLm1heCh1LCBwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1IDwgMCB8fCBjID4gdGhpcy5tYXhbbF0gLSB0aGlzLm1pbltsXSkgcmV0dXJuIDA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAxO1xuICAgIH07XG5cbiAgICB2YXIgd28gPSBmdW5jdGlvbiB3byh0LCBlLCBpLCBvKSB7XG4gICAgICBpZiAodm9pZCAwID09PSB0ICYmICh0ID0gMCksIHZvaWQgMCA9PT0gZSAmJiAoZSA9IDApLCB2b2lkIDAgPT09IGkgJiYgKGkgPSAwKSwgdm9pZCAwID09PSBvICYmIChvID0gMCksIGlzTmFOKHQpIHx8IHQgPCAwIHx8IGlzTmFOKGUpIHx8IGUgPCAwIHx8IGlzTmFOKGkpIHx8IGkgPCAwIHx8IGlzTmFOKG8pIHx8IG8gPCAwKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHZhbHVlIGZvciBlZGdlLWluc2V0cywgdG9wLCBib3R0b20sIGxlZnQgYW5kIHJpZ2h0IG11c3QgYWxsIGJlIG51bWJlcnNcIik7XG4gICAgICB0aGlzLnRvcCA9IHQsIHRoaXMuYm90dG9tID0gZSwgdGhpcy5sZWZ0ID0gaSwgdGhpcy5yaWdodCA9IG87XG4gICAgfTtcblxuICAgIHdvLnByb3RvdHlwZS5pbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uIChlLCBpLCBvKSB7XG4gICAgICByZXR1cm4gbnVsbCAhPSBpLnRvcCAmJiBudWxsICE9IGUudG9wICYmICh0aGlzLnRvcCA9IHQubnVtYmVyKGUudG9wLCBpLnRvcCwgbykpLCBudWxsICE9IGkuYm90dG9tICYmIG51bGwgIT0gZS5ib3R0b20gJiYgKHRoaXMuYm90dG9tID0gdC5udW1iZXIoZS5ib3R0b20sIGkuYm90dG9tLCBvKSksIG51bGwgIT0gaS5sZWZ0ICYmIG51bGwgIT0gZS5sZWZ0ICYmICh0aGlzLmxlZnQgPSB0Lm51bWJlcihlLmxlZnQsIGkubGVmdCwgbykpLCBudWxsICE9IGkucmlnaHQgJiYgbnVsbCAhPSBlLnJpZ2h0ICYmICh0aGlzLnJpZ2h0ID0gdC5udW1iZXIoZS5yaWdodCwgaS5yaWdodCwgbykpLCB0aGlzO1xuICAgIH0sIHdvLnByb3RvdHlwZS5nZXRDZW50ZXIgPSBmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgdmFyIG8gPSB0LmNsYW1wKCh0aGlzLmxlZnQgKyBlIC0gdGhpcy5yaWdodCkgLyAyLCAwLCBlKSxcbiAgICAgICAgICByID0gdC5jbGFtcCgodGhpcy50b3AgKyBpIC0gdGhpcy5ib3R0b20pIC8gMiwgMCwgaSk7XG4gICAgICByZXR1cm4gbmV3IHQuUG9pbnQobywgcik7XG4gICAgfSwgd28ucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gdGhpcy50b3AgPT09IHQudG9wICYmIHRoaXMuYm90dG9tID09PSB0LmJvdHRvbSAmJiB0aGlzLmxlZnQgPT09IHQubGVmdCAmJiB0aGlzLnJpZ2h0ID09PSB0LnJpZ2h0O1xuICAgIH0sIHdvLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBuZXcgd28odGhpcy50b3AsIHRoaXMuYm90dG9tLCB0aGlzLmxlZnQsIHRoaXMucmlnaHQpO1xuICAgIH0sIHdvLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0b3A6IHRoaXMudG9wLFxuICAgICAgICBib3R0b206IHRoaXMuYm90dG9tLFxuICAgICAgICBsZWZ0OiB0aGlzLmxlZnQsXG4gICAgICAgIHJpZ2h0OiB0aGlzLnJpZ2h0XG4gICAgICB9O1xuICAgIH07XG5cbiAgICB2YXIgVG8gPSBmdW5jdGlvbiBUbyhlLCBpLCBvLCByLCBhKSB7XG4gICAgICB0aGlzLnRpbGVTaXplID0gNTEyLCB0aGlzLm1heFZhbGlkTGF0aXR1ZGUgPSA4NS4wNTExMjksIHRoaXMuX3JlbmRlcldvcmxkQ29waWVzID0gdm9pZCAwID09PSBhIHx8IGEsIHRoaXMuX21pblpvb20gPSBlIHx8IDAsIHRoaXMuX21heFpvb20gPSBpIHx8IDIyLCB0aGlzLl9taW5QaXRjaCA9IG51bGwgPT0gbyA/IDAgOiBvLCB0aGlzLl9tYXhQaXRjaCA9IG51bGwgPT0gciA/IDYwIDogciwgdGhpcy5zZXRNYXhCb3VuZHMoKSwgdGhpcy53aWR0aCA9IDAsIHRoaXMuaGVpZ2h0ID0gMCwgdGhpcy5fY2VudGVyID0gbmV3IHQuTG5nTGF0KDAsIDApLCB0aGlzLnpvb20gPSAwLCB0aGlzLmFuZ2xlID0gMCwgdGhpcy5fZm92ID0gLjY0MzUwMTEwODc5MzI4NDQsIHRoaXMuX3BpdGNoID0gMCwgdGhpcy5fdW5tb2RpZmllZCA9ICEwLCB0aGlzLl9lZGdlSW5zZXRzID0gbmV3IHdvKCksIHRoaXMuX3Bvc01hdHJpeENhY2hlID0ge30sIHRoaXMuX2FsaWduZWRQb3NNYXRyaXhDYWNoZSA9IHt9O1xuICAgIH0sXG4gICAgICAgIEVvID0ge1xuICAgICAgbWluWm9vbToge1xuICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICB9LFxuICAgICAgbWF4Wm9vbToge1xuICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICB9LFxuICAgICAgbWluUGl0Y2g6IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgfSxcbiAgICAgIG1heFBpdGNoOiB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgIH0sXG4gICAgICByZW5kZXJXb3JsZENvcGllczoge1xuICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICB9LFxuICAgICAgd29ybGRTaXplOiB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgIH0sXG4gICAgICBjZW50ZXJPZmZzZXQ6IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgfSxcbiAgICAgIHNpemU6IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgfSxcbiAgICAgIGJlYXJpbmc6IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgfSxcbiAgICAgIHBpdGNoOiB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgIH0sXG4gICAgICBmb3Y6IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgfSxcbiAgICAgIHpvb206IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgfSxcbiAgICAgIGNlbnRlcjoge1xuICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICB9LFxuICAgICAgcGFkZGluZzoge1xuICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICB9LFxuICAgICAgY2VudGVyUG9pbnQ6IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgfSxcbiAgICAgIHVubW9kaWZpZWQ6IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgfSxcbiAgICAgIHBvaW50OiB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgVG8ucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHQgPSBuZXcgVG8odGhpcy5fbWluWm9vbSwgdGhpcy5fbWF4Wm9vbSwgdGhpcy5fbWluUGl0Y2gsIHRoaXMubWF4UGl0Y2gsIHRoaXMuX3JlbmRlcldvcmxkQ29waWVzKTtcbiAgICAgIHJldHVybiB0LnRpbGVTaXplID0gdGhpcy50aWxlU2l6ZSwgdC5sYXRSYW5nZSA9IHRoaXMubGF0UmFuZ2UsIHQud2lkdGggPSB0aGlzLndpZHRoLCB0LmhlaWdodCA9IHRoaXMuaGVpZ2h0LCB0Ll9jZW50ZXIgPSB0aGlzLl9jZW50ZXIsIHQuem9vbSA9IHRoaXMuem9vbSwgdC5hbmdsZSA9IHRoaXMuYW5nbGUsIHQuX2ZvdiA9IHRoaXMuX2ZvdiwgdC5fcGl0Y2ggPSB0aGlzLl9waXRjaCwgdC5fdW5tb2RpZmllZCA9IHRoaXMuX3VubW9kaWZpZWQsIHQuX2VkZ2VJbnNldHMgPSB0aGlzLl9lZGdlSW5zZXRzLmNsb25lKCksIHQuX2NhbGNNYXRyaWNlcygpLCB0O1xuICAgIH0sIEVvLm1pblpvb20uZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX21pblpvb207XG4gICAgfSwgRW8ubWluWm9vbS5zZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdGhpcy5fbWluWm9vbSAhPT0gdCAmJiAodGhpcy5fbWluWm9vbSA9IHQsIHRoaXMuem9vbSA9IE1hdGgubWF4KHRoaXMuem9vbSwgdCkpO1xuICAgIH0sIEVvLm1heFpvb20uZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX21heFpvb207XG4gICAgfSwgRW8ubWF4Wm9vbS5zZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdGhpcy5fbWF4Wm9vbSAhPT0gdCAmJiAodGhpcy5fbWF4Wm9vbSA9IHQsIHRoaXMuem9vbSA9IE1hdGgubWluKHRoaXMuem9vbSwgdCkpO1xuICAgIH0sIEVvLm1pblBpdGNoLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9taW5QaXRjaDtcbiAgICB9LCBFby5taW5QaXRjaC5zZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdGhpcy5fbWluUGl0Y2ggIT09IHQgJiYgKHRoaXMuX21pblBpdGNoID0gdCwgdGhpcy5waXRjaCA9IE1hdGgubWF4KHRoaXMucGl0Y2gsIHQpKTtcbiAgICB9LCBFby5tYXhQaXRjaC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbWF4UGl0Y2g7XG4gICAgfSwgRW8ubWF4UGl0Y2guc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHRoaXMuX21heFBpdGNoICE9PSB0ICYmICh0aGlzLl9tYXhQaXRjaCA9IHQsIHRoaXMucGl0Y2ggPSBNYXRoLm1pbih0aGlzLnBpdGNoLCB0KSk7XG4gICAgfSwgRW8ucmVuZGVyV29ybGRDb3BpZXMuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlbmRlcldvcmxkQ29waWVzO1xuICAgIH0sIEVvLnJlbmRlcldvcmxkQ29waWVzLnNldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2b2lkIDAgPT09IHQgPyB0ID0gITAgOiBudWxsID09PSB0ICYmICh0ID0gITEpLCB0aGlzLl9yZW5kZXJXb3JsZENvcGllcyA9IHQ7XG4gICAgfSwgRW8ud29ybGRTaXplLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLnRpbGVTaXplICogdGhpcy5zY2FsZTtcbiAgICB9LCBFby5jZW50ZXJPZmZzZXQuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY2VudGVyUG9pbnQuX3N1Yih0aGlzLnNpemUuX2RpdigyKSk7XG4gICAgfSwgRW8uc2l6ZS5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbmV3IHQuUG9pbnQodGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpO1xuICAgIH0sIEVvLmJlYXJpbmcuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIC10aGlzLmFuZ2xlIC8gTWF0aC5QSSAqIDE4MDtcbiAgICB9LCBFby5iZWFyaW5nLnNldCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgaSA9IC10LndyYXAoZSwgLTE4MCwgMTgwKSAqIE1hdGguUEkgLyAxODA7XG4gICAgICB0aGlzLmFuZ2xlICE9PSBpICYmICh0aGlzLl91bm1vZGlmaWVkID0gITEsIHRoaXMuYW5nbGUgPSBpLCB0aGlzLl9jYWxjTWF0cmljZXMoKSwgdGhpcy5yb3RhdGlvbk1hdHJpeCA9IHQuY3JlYXRlJDIoKSwgdC5yb3RhdGUodGhpcy5yb3RhdGlvbk1hdHJpeCwgdGhpcy5yb3RhdGlvbk1hdHJpeCwgdGhpcy5hbmdsZSkpO1xuICAgIH0sIEVvLnBpdGNoLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9waXRjaCAvIE1hdGguUEkgKiAxODA7XG4gICAgfSwgRW8ucGl0Y2guc2V0ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBpID0gdC5jbGFtcChlLCB0aGlzLm1pblBpdGNoLCB0aGlzLm1heFBpdGNoKSAvIDE4MCAqIE1hdGguUEk7XG4gICAgICB0aGlzLl9waXRjaCAhPT0gaSAmJiAodGhpcy5fdW5tb2RpZmllZCA9ICExLCB0aGlzLl9waXRjaCA9IGksIHRoaXMuX2NhbGNNYXRyaWNlcygpKTtcbiAgICB9LCBFby5mb3YuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2ZvdiAvIE1hdGguUEkgKiAxODA7XG4gICAgfSwgRW8uZm92LnNldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0ID0gTWF0aC5tYXgoLjAxLCBNYXRoLm1pbig2MCwgdCkpLCB0aGlzLl9mb3YgIT09IHQgJiYgKHRoaXMuX3VubW9kaWZpZWQgPSAhMSwgdGhpcy5fZm92ID0gdCAvIDE4MCAqIE1hdGguUEksIHRoaXMuX2NhbGNNYXRyaWNlcygpKTtcbiAgICB9LCBFby56b29tLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl96b29tO1xuICAgIH0sIEVvLnpvb20uc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHZhciBlID0gTWF0aC5taW4oTWF0aC5tYXgodCwgdGhpcy5taW5ab29tKSwgdGhpcy5tYXhab29tKTtcbiAgICAgIHRoaXMuX3pvb20gIT09IGUgJiYgKHRoaXMuX3VubW9kaWZpZWQgPSAhMSwgdGhpcy5fem9vbSA9IGUsIHRoaXMuc2NhbGUgPSB0aGlzLnpvb21TY2FsZShlKSwgdGhpcy50aWxlWm9vbSA9IE1hdGguZmxvb3IoZSksIHRoaXMuem9vbUZyYWN0aW9uID0gZSAtIHRoaXMudGlsZVpvb20sIHRoaXMuX2NvbnN0cmFpbigpLCB0aGlzLl9jYWxjTWF0cmljZXMoKSk7XG4gICAgfSwgRW8uY2VudGVyLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9jZW50ZXI7XG4gICAgfSwgRW8uY2VudGVyLnNldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0LmxhdCA9PT0gdGhpcy5fY2VudGVyLmxhdCAmJiB0LmxuZyA9PT0gdGhpcy5fY2VudGVyLmxuZyB8fCAodGhpcy5fdW5tb2RpZmllZCA9ICExLCB0aGlzLl9jZW50ZXIgPSB0LCB0aGlzLl9jb25zdHJhaW4oKSwgdGhpcy5fY2FsY01hdHJpY2VzKCkpO1xuICAgIH0sIEVvLnBhZGRpbmcuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2VkZ2VJbnNldHMudG9KU09OKCk7XG4gICAgfSwgRW8ucGFkZGluZy5zZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdGhpcy5fZWRnZUluc2V0cy5lcXVhbHModCkgfHwgKHRoaXMuX3VubW9kaWZpZWQgPSAhMSwgdGhpcy5fZWRnZUluc2V0cy5pbnRlcnBvbGF0ZSh0aGlzLl9lZGdlSW5zZXRzLCB0LCAxKSwgdGhpcy5fY2FsY01hdHJpY2VzKCkpO1xuICAgIH0sIEVvLmNlbnRlclBvaW50LmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9lZGdlSW5zZXRzLmdldENlbnRlcih0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XG4gICAgfSwgVG8ucHJvdG90eXBlLmlzUGFkZGluZ0VxdWFsID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9lZGdlSW5zZXRzLmVxdWFscyh0KTtcbiAgICB9LCBUby5wcm90b3R5cGUuaW50ZXJwb2xhdGVQYWRkaW5nID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcbiAgICAgIHRoaXMuX3VubW9kaWZpZWQgPSAhMSwgdGhpcy5fZWRnZUluc2V0cy5pbnRlcnBvbGF0ZSh0LCBlLCBpKSwgdGhpcy5fY29uc3RyYWluKCksIHRoaXMuX2NhbGNNYXRyaWNlcygpO1xuICAgIH0sIFRvLnByb3RvdHlwZS5jb3ZlcmluZ1pvb21MZXZlbCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2YXIgZSA9ICh0LnJvdW5kWm9vbSA/IE1hdGgucm91bmQgOiBNYXRoLmZsb29yKSh0aGlzLnpvb20gKyB0aGlzLnNjYWxlWm9vbSh0aGlzLnRpbGVTaXplIC8gdC50aWxlU2l6ZSkpO1xuICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIGUpO1xuICAgIH0sIFRvLnByb3RvdHlwZS5nZXRWaXNpYmxlVW53cmFwcGVkQ29vcmRpbmF0ZXMgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIGkgPSBbbmV3IHQuVW53cmFwcGVkVGlsZUlEKDAsIGUpXTtcbiAgICAgIGlmICh0aGlzLl9yZW5kZXJXb3JsZENvcGllcykgZm9yICh2YXIgbyA9IHRoaXMucG9pbnRDb29yZGluYXRlKG5ldyB0LlBvaW50KDAsIDApKSwgciA9IHRoaXMucG9pbnRDb29yZGluYXRlKG5ldyB0LlBvaW50KHRoaXMud2lkdGgsIDApKSwgYSA9IHRoaXMucG9pbnRDb29yZGluYXRlKG5ldyB0LlBvaW50KHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KSksIG4gPSB0aGlzLnBvaW50Q29vcmRpbmF0ZShuZXcgdC5Qb2ludCgwLCB0aGlzLmhlaWdodCkpLCBzID0gTWF0aC5mbG9vcihNYXRoLm1pbihvLngsIHIueCwgYS54LCBuLngpKSwgbCA9IE1hdGguZmxvb3IoTWF0aC5tYXgoby54LCByLngsIGEueCwgbi54KSksIGMgPSBzIC0gMTsgYyA8PSBsICsgMTsgYysrKSB7XG4gICAgICAgIDAgIT09IGMgJiYgaS5wdXNoKG5ldyB0LlVud3JhcHBlZFRpbGVJRChjLCBlKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaTtcbiAgICB9LCBUby5wcm90b3R5cGUuY292ZXJpbmdUaWxlcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgaSA9IHRoaXMuY292ZXJpbmdab29tTGV2ZWwoZSksXG4gICAgICAgICAgbyA9IGk7XG4gICAgICBpZiAodm9pZCAwICE9PSBlLm1pbnpvb20gJiYgaSA8IGUubWluem9vbSkgcmV0dXJuIFtdO1xuICAgICAgdm9pZCAwICE9PSBlLm1heHpvb20gJiYgaSA+IGUubWF4em9vbSAmJiAoaSA9IGUubWF4em9vbSk7XG4gICAgICB2YXIgciA9IHQuTWVyY2F0b3JDb29yZGluYXRlLmZyb21MbmdMYXQodGhpcy5jZW50ZXIpLFxuICAgICAgICAgIGEgPSBNYXRoLnBvdygyLCBpKSxcbiAgICAgICAgICBuID0gW2EgKiByLngsIGEgKiByLnksIDBdLFxuICAgICAgICAgIHMgPSB4by5mcm9tSW52UHJvamVjdGlvbk1hdHJpeCh0aGlzLmludlByb2pNYXRyaXgsIHRoaXMud29ybGRTaXplLCBpKSxcbiAgICAgICAgICBsID0gZS5taW56b29tIHx8IDA7XG4gICAgICB0aGlzLnBpdGNoIDw9IDYwICYmIHRoaXMuX2VkZ2VJbnNldHMudG9wIDwgLjEgJiYgKGwgPSBpKTtcblxuICAgICAgdmFyIGMgPSBmdW5jdGlvbiBjKHQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhYWJiOiBuZXcgYm8oW3QgKiBhLCAwLCAwXSwgWyh0ICsgMSkgKiBhLCBhLCAwXSksXG4gICAgICAgICAgem9vbTogMCxcbiAgICAgICAgICB4OiAwLFxuICAgICAgICAgIHk6IDAsXG4gICAgICAgICAgd3JhcDogdCxcbiAgICAgICAgICBmdWxseVZpc2libGU6ICExXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAgICAgIHUgPSBbXSxcbiAgICAgICAgICBoID0gW10sXG4gICAgICAgICAgcCA9IGksXG4gICAgICAgICAgZCA9IGUucmVwYXJzZU92ZXJzY2FsZWQgPyBvIDogaTtcblxuICAgICAgaWYgKHRoaXMuX3JlbmRlcldvcmxkQ29waWVzKSBmb3IgKHZhciBfID0gMTsgXyA8PSAzOyBfKyspIHtcbiAgICAgICAgdS5wdXNoKGMoLV8pKSwgdS5wdXNoKGMoXykpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHUucHVzaChjKDApKTsgdS5sZW5ndGggPiAwOykge1xuICAgICAgICB2YXIgZiA9IHUucG9wKCksXG4gICAgICAgICAgICBtID0gZi54LFxuICAgICAgICAgICAgZyA9IGYueSxcbiAgICAgICAgICAgIHYgPSBmLmZ1bGx5VmlzaWJsZTtcblxuICAgICAgICBpZiAoIXYpIHtcbiAgICAgICAgICB2YXIgeSA9IGYuYWFiYi5pbnRlcnNlY3RzKHMpO1xuICAgICAgICAgIGlmICgwID09PSB5KSBjb250aW51ZTtcbiAgICAgICAgICB2ID0gMiA9PT0geTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB4ID0gZi5hYWJiLmRpc3RhbmNlWChuKSxcbiAgICAgICAgICAgIGIgPSBmLmFhYmIuZGlzdGFuY2VZKG4pLFxuICAgICAgICAgICAgdyA9IE1hdGgubWF4KE1hdGguYWJzKHgpLCBNYXRoLmFicyhiKSk7XG4gICAgICAgIGlmIChmLnpvb20gPT09IHAgfHwgdyA+IDMgKyAoMSA8PCBwIC0gZi56b29tKSAtIDIgJiYgZi56b29tID49IGwpIGgucHVzaCh7XG4gICAgICAgICAgdGlsZUlEOiBuZXcgdC5PdmVyc2NhbGVkVGlsZUlEKGYuem9vbSA9PT0gcCA/IGQgOiBmLnpvb20sIGYud3JhcCwgZi56b29tLCBtLCBnKSxcbiAgICAgICAgICBkaXN0YW5jZVNxOiB0LnNxckxlbihbblswXSAtIC41IC0gbSwgblsxXSAtIC41IC0gZ10pXG4gICAgICAgIH0pO2Vsc2UgZm9yICh2YXIgVCA9IDA7IFQgPCA0OyBUKyspIHtcbiAgICAgICAgICB2YXIgRSA9IChtIDw8IDEpICsgVCAlIDIsXG4gICAgICAgICAgICAgIEkgPSAoZyA8PCAxKSArIChUID4+IDEpO1xuICAgICAgICAgIHUucHVzaCh7XG4gICAgICAgICAgICBhYWJiOiBmLmFhYmIucXVhZHJhbnQoVCksXG4gICAgICAgICAgICB6b29tOiBmLnpvb20gKyAxLFxuICAgICAgICAgICAgeDogRSxcbiAgICAgICAgICAgIHk6IEksXG4gICAgICAgICAgICB3cmFwOiBmLndyYXAsXG4gICAgICAgICAgICBmdWxseVZpc2libGU6IHZcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gaC5zb3J0KGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0LmRpc3RhbmNlU3EgLSBlLmRpc3RhbmNlU3E7XG4gICAgICB9KS5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQudGlsZUlEO1xuICAgICAgfSk7XG4gICAgfSwgVG8ucHJvdG90eXBlLnJlc2l6ZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB0aGlzLndpZHRoID0gdCwgdGhpcy5oZWlnaHQgPSBlLCB0aGlzLnBpeGVsc1RvR0xVbml0cyA9IFsyIC8gdCwgLTIgLyBlXSwgdGhpcy5fY29uc3RyYWluKCksIHRoaXMuX2NhbGNNYXRyaWNlcygpO1xuICAgIH0sIEVvLnVubW9kaWZpZWQuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3VubW9kaWZpZWQ7XG4gICAgfSwgVG8ucHJvdG90eXBlLnpvb21TY2FsZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gTWF0aC5wb3coMiwgdCk7XG4gICAgfSwgVG8ucHJvdG90eXBlLnNjYWxlWm9vbSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gTWF0aC5sb2codCkgLyBNYXRoLkxOMjtcbiAgICB9LCBUby5wcm90b3R5cGUucHJvamVjdCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgaSA9IHQuY2xhbXAoZS5sYXQsIC10aGlzLm1heFZhbGlkTGF0aXR1ZGUsIHRoaXMubWF4VmFsaWRMYXRpdHVkZSk7XG4gICAgICByZXR1cm4gbmV3IHQuUG9pbnQodC5tZXJjYXRvclhmcm9tTG5nKGUubG5nKSAqIHRoaXMud29ybGRTaXplLCB0Lm1lcmNhdG9yWWZyb21MYXQoaSkgKiB0aGlzLndvcmxkU2l6ZSk7XG4gICAgfSwgVG8ucHJvdG90eXBlLnVucHJvamVjdCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gbmV3IHQuTWVyY2F0b3JDb29yZGluYXRlKGUueCAvIHRoaXMud29ybGRTaXplLCBlLnkgLyB0aGlzLndvcmxkU2l6ZSkudG9MbmdMYXQoKTtcbiAgICB9LCBFby5wb2ludC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9qZWN0KHRoaXMuY2VudGVyKTtcbiAgICB9LCBUby5wcm90b3R5cGUuc2V0TG9jYXRpb25BdFBvaW50ID0gZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgIHZhciBvID0gdGhpcy5wb2ludENvb3JkaW5hdGUoaSksXG4gICAgICAgICAgciA9IHRoaXMucG9pbnRDb29yZGluYXRlKHRoaXMuY2VudGVyUG9pbnQpLFxuICAgICAgICAgIGEgPSB0aGlzLmxvY2F0aW9uQ29vcmRpbmF0ZShlKSxcbiAgICAgICAgICBuID0gbmV3IHQuTWVyY2F0b3JDb29yZGluYXRlKGEueCAtIChvLnggLSByLngpLCBhLnkgLSAoby55IC0gci55KSk7XG4gICAgICB0aGlzLmNlbnRlciA9IHRoaXMuY29vcmRpbmF0ZUxvY2F0aW9uKG4pLCB0aGlzLl9yZW5kZXJXb3JsZENvcGllcyAmJiAodGhpcy5jZW50ZXIgPSB0aGlzLmNlbnRlci53cmFwKCkpO1xuICAgIH0sIFRvLnByb3RvdHlwZS5sb2NhdGlvblBvaW50ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvb3JkaW5hdGVQb2ludCh0aGlzLmxvY2F0aW9uQ29vcmRpbmF0ZSh0KSk7XG4gICAgfSwgVG8ucHJvdG90eXBlLnBvaW50TG9jYXRpb24gPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29vcmRpbmF0ZUxvY2F0aW9uKHRoaXMucG9pbnRDb29yZGluYXRlKHQpKTtcbiAgICB9LCBUby5wcm90b3R5cGUubG9jYXRpb25Db29yZGluYXRlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHJldHVybiB0Lk1lcmNhdG9yQ29vcmRpbmF0ZS5mcm9tTG5nTGF0KGUpO1xuICAgIH0sIFRvLnByb3RvdHlwZS5jb29yZGluYXRlTG9jYXRpb24gPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHQudG9MbmdMYXQoKTtcbiAgICB9LCBUby5wcm90b3R5cGUucG9pbnRDb29yZGluYXRlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBpID0gW2UueCwgZS55LCAwLCAxXSxcbiAgICAgICAgICBvID0gW2UueCwgZS55LCAxLCAxXTtcbiAgICAgIHQudHJhbnNmb3JtTWF0NChpLCBpLCB0aGlzLnBpeGVsTWF0cml4SW52ZXJzZSksIHQudHJhbnNmb3JtTWF0NChvLCBvLCB0aGlzLnBpeGVsTWF0cml4SW52ZXJzZSk7XG4gICAgICB2YXIgciA9IGlbM10sXG4gICAgICAgICAgYSA9IG9bM10sXG4gICAgICAgICAgbiA9IGlbMV0gLyByLFxuICAgICAgICAgIHMgPSBvWzFdIC8gYSxcbiAgICAgICAgICBsID0gaVsyXSAvIHIsXG4gICAgICAgICAgYyA9IG9bMl0gLyBhLFxuICAgICAgICAgIHUgPSBsID09PSBjID8gMCA6ICgwIC0gbCkgLyAoYyAtIGwpO1xuICAgICAgcmV0dXJuIG5ldyB0Lk1lcmNhdG9yQ29vcmRpbmF0ZSh0Lm51bWJlcihpWzBdIC8gciwgb1swXSAvIGEsIHUpIC8gdGhpcy53b3JsZFNpemUsIHQubnVtYmVyKG4sIHMsIHUpIC8gdGhpcy53b3JsZFNpemUpO1xuICAgIH0sIFRvLnByb3RvdHlwZS5jb29yZGluYXRlUG9pbnQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIGkgPSBbZS54ICogdGhpcy53b3JsZFNpemUsIGUueSAqIHRoaXMud29ybGRTaXplLCAwLCAxXTtcbiAgICAgIHJldHVybiB0LnRyYW5zZm9ybU1hdDQoaSwgaSwgdGhpcy5waXhlbE1hdHJpeCksIG5ldyB0LlBvaW50KGlbMF0gLyBpWzNdLCBpWzFdIC8gaVszXSk7XG4gICAgfSwgVG8ucHJvdG90eXBlLmdldEJvdW5kcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBuZXcgdC5MbmdMYXRCb3VuZHMoKS5leHRlbmQodGhpcy5wb2ludExvY2F0aW9uKG5ldyB0LlBvaW50KDAsIDApKSkuZXh0ZW5kKHRoaXMucG9pbnRMb2NhdGlvbihuZXcgdC5Qb2ludCh0aGlzLndpZHRoLCAwKSkpLmV4dGVuZCh0aGlzLnBvaW50TG9jYXRpb24obmV3IHQuUG9pbnQodGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpKSkuZXh0ZW5kKHRoaXMucG9pbnRMb2NhdGlvbihuZXcgdC5Qb2ludCgwLCB0aGlzLmhlaWdodCkpKTtcbiAgICB9LCBUby5wcm90b3R5cGUuZ2V0TWF4Qm91bmRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMubGF0UmFuZ2UgJiYgMiA9PT0gdGhpcy5sYXRSYW5nZS5sZW5ndGggJiYgdGhpcy5sbmdSYW5nZSAmJiAyID09PSB0aGlzLmxuZ1JhbmdlLmxlbmd0aCA/IG5ldyB0LkxuZ0xhdEJvdW5kcyhbdGhpcy5sbmdSYW5nZVswXSwgdGhpcy5sYXRSYW5nZVswXV0sIFt0aGlzLmxuZ1JhbmdlWzFdLCB0aGlzLmxhdFJhbmdlWzFdXSkgOiBudWxsO1xuICAgIH0sIFRvLnByb3RvdHlwZS5zZXRNYXhCb3VuZHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdCA/ICh0aGlzLmxuZ1JhbmdlID0gW3QuZ2V0V2VzdCgpLCB0LmdldEVhc3QoKV0sIHRoaXMubGF0UmFuZ2UgPSBbdC5nZXRTb3V0aCgpLCB0LmdldE5vcnRoKCldLCB0aGlzLl9jb25zdHJhaW4oKSkgOiAodGhpcy5sbmdSYW5nZSA9IG51bGwsIHRoaXMubGF0UmFuZ2UgPSBbLXRoaXMubWF4VmFsaWRMYXRpdHVkZSwgdGhpcy5tYXhWYWxpZExhdGl0dWRlXSk7XG4gICAgfSwgVG8ucHJvdG90eXBlLmNhbGN1bGF0ZVBvc01hdHJpeCA9IGZ1bmN0aW9uIChlLCBpKSB7XG4gICAgICB2b2lkIDAgPT09IGkgJiYgKGkgPSAhMSk7XG4gICAgICB2YXIgbyA9IGUua2V5LFxuICAgICAgICAgIHIgPSBpID8gdGhpcy5fYWxpZ25lZFBvc01hdHJpeENhY2hlIDogdGhpcy5fcG9zTWF0cml4Q2FjaGU7XG4gICAgICBpZiAocltvXSkgcmV0dXJuIHJbb107XG4gICAgICB2YXIgYSA9IGUuY2Fub25pY2FsLFxuICAgICAgICAgIG4gPSB0aGlzLndvcmxkU2l6ZSAvIHRoaXMuem9vbVNjYWxlKGEueiksXG4gICAgICAgICAgcyA9IGEueCArIE1hdGgucG93KDIsIGEueikgKiBlLndyYXAsXG4gICAgICAgICAgbCA9IHQuaWRlbnRpdHkobmV3IEZsb2F0NjRBcnJheSgxNikpO1xuICAgICAgcmV0dXJuIHQudHJhbnNsYXRlKGwsIGwsIFtzICogbiwgYS55ICogbiwgMF0pLCB0LnNjYWxlKGwsIGwsIFtuIC8gdC5FWFRFTlQsIG4gLyB0LkVYVEVOVCwgMV0pLCB0Lm11bHRpcGx5KGwsIGkgPyB0aGlzLmFsaWduZWRQcm9qTWF0cml4IDogdGhpcy5wcm9qTWF0cml4LCBsKSwgcltvXSA9IG5ldyBGbG9hdDMyQXJyYXkobCksIHJbb107XG4gICAgfSwgVG8ucHJvdG90eXBlLmN1c3RvbUxheWVyTWF0cml4ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMubWVyY2F0b3JNYXRyaXguc2xpY2UoKTtcbiAgICB9LCBUby5wcm90b3R5cGUuX2NvbnN0cmFpbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICh0aGlzLmNlbnRlciAmJiB0aGlzLndpZHRoICYmIHRoaXMuaGVpZ2h0ICYmICF0aGlzLl9jb25zdHJhaW5pbmcpIHtcbiAgICAgICAgdGhpcy5fY29uc3RyYWluaW5nID0gITA7XG4gICAgICAgIHZhciBlLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIG8sXG4gICAgICAgICAgICByLFxuICAgICAgICAgICAgYSA9IC05MCxcbiAgICAgICAgICAgIG4gPSA5MCxcbiAgICAgICAgICAgIHMgPSAtMTgwLFxuICAgICAgICAgICAgbCA9IDE4MCxcbiAgICAgICAgICAgIGMgPSB0aGlzLnNpemUsXG4gICAgICAgICAgICB1ID0gdGhpcy5fdW5tb2RpZmllZDtcblxuICAgICAgICBpZiAodGhpcy5sYXRSYW5nZSkge1xuICAgICAgICAgIHZhciBoID0gdGhpcy5sYXRSYW5nZTtcbiAgICAgICAgICBhID0gdC5tZXJjYXRvcllmcm9tTGF0KGhbMV0pICogdGhpcy53b3JsZFNpemUsIGUgPSAobiA9IHQubWVyY2F0b3JZZnJvbUxhdChoWzBdKSAqIHRoaXMud29ybGRTaXplKSAtIGEgPCBjLnkgPyBjLnkgLyAobiAtIGEpIDogMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmxuZ1JhbmdlKSB7XG4gICAgICAgICAgdmFyIHAgPSB0aGlzLmxuZ1JhbmdlO1xuICAgICAgICAgIHMgPSB0Lm1lcmNhdG9yWGZyb21MbmcocFswXSkgKiB0aGlzLndvcmxkU2l6ZSwgaSA9IChsID0gdC5tZXJjYXRvclhmcm9tTG5nKHBbMV0pICogdGhpcy53b3JsZFNpemUpIC0gcyA8IGMueCA/IGMueCAvIChsIC0gcykgOiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGQgPSB0aGlzLnBvaW50LFxuICAgICAgICAgICAgXyA9IE1hdGgubWF4KGkgfHwgMCwgZSB8fCAwKTtcblxuICAgICAgICBpZiAoXykgcmV0dXJuIHRoaXMuY2VudGVyID0gdGhpcy51bnByb2plY3QobmV3IHQuUG9pbnQoaSA/IChsICsgcykgLyAyIDogZC54LCBlID8gKG4gKyBhKSAvIDIgOiBkLnkpKSwgdGhpcy56b29tICs9IHRoaXMuc2NhbGVab29tKF8pLCB0aGlzLl91bm1vZGlmaWVkID0gdSwgdm9pZCAodGhpcy5fY29uc3RyYWluaW5nID0gITEpO1xuXG4gICAgICAgIGlmICh0aGlzLmxhdFJhbmdlKSB7XG4gICAgICAgICAgdmFyIGYgPSBkLnksXG4gICAgICAgICAgICAgIG0gPSBjLnkgLyAyO1xuICAgICAgICAgIGYgLSBtIDwgYSAmJiAociA9IGEgKyBtKSwgZiArIG0gPiBuICYmIChyID0gbiAtIG0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubG5nUmFuZ2UpIHtcbiAgICAgICAgICB2YXIgZyA9IGQueCxcbiAgICAgICAgICAgICAgdiA9IGMueCAvIDI7XG4gICAgICAgICAgZyAtIHYgPCBzICYmIChvID0gcyArIHYpLCBnICsgdiA+IGwgJiYgKG8gPSBsIC0gdik7XG4gICAgICAgIH1cblxuICAgICAgICB2b2lkIDAgPT09IG8gJiYgdm9pZCAwID09PSByIHx8ICh0aGlzLmNlbnRlciA9IHRoaXMudW5wcm9qZWN0KG5ldyB0LlBvaW50KHZvaWQgMCAhPT0gbyA/IG8gOiBkLngsIHZvaWQgMCAhPT0gciA/IHIgOiBkLnkpKSksIHRoaXMuX3VubW9kaWZpZWQgPSB1LCB0aGlzLl9jb25zdHJhaW5pbmcgPSAhMTtcbiAgICAgIH1cbiAgICB9LCBUby5wcm90b3R5cGUuX2NhbGNNYXRyaWNlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICh0aGlzLmhlaWdodCkge1xuICAgICAgICB2YXIgZSA9IHRoaXMuY2VudGVyT2Zmc2V0O1xuICAgICAgICB0aGlzLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UgPSAuNSAvIE1hdGgudGFuKHRoaXMuX2ZvdiAvIDIpICogdGhpcy5oZWlnaHQ7XG4gICAgICAgIHZhciBpID0gTWF0aC5QSSAvIDIgKyB0aGlzLl9waXRjaCxcbiAgICAgICAgICAgIG8gPSB0aGlzLl9mb3YgKiAoLjUgKyBlLnkgLyB0aGlzLmhlaWdodCksXG4gICAgICAgICAgICByID0gTWF0aC5zaW4obykgKiB0aGlzLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UgLyBNYXRoLnNpbih0LmNsYW1wKE1hdGguUEkgLSBpIC0gbywgLjAxLCBNYXRoLlBJIC0gLjAxKSksXG4gICAgICAgICAgICBhID0gdGhpcy5wb2ludCxcbiAgICAgICAgICAgIG4gPSBhLngsXG4gICAgICAgICAgICBzID0gYS55LFxuICAgICAgICAgICAgbCA9IDEuMDEgKiAoTWF0aC5jb3MoTWF0aC5QSSAvIDIgLSB0aGlzLl9waXRjaCkgKiByICsgdGhpcy5jYW1lcmFUb0NlbnRlckRpc3RhbmNlKSxcbiAgICAgICAgICAgIGMgPSB0aGlzLmhlaWdodCAvIDUwLFxuICAgICAgICAgICAgdSA9IG5ldyBGbG9hdDY0QXJyYXkoMTYpO1xuICAgICAgICB0LnBlcnNwZWN0aXZlKHUsIHRoaXMuX2ZvdiwgdGhpcy53aWR0aCAvIHRoaXMuaGVpZ2h0LCBjLCBsKSwgdVs4XSA9IDIgKiAtZS54IC8gdGhpcy53aWR0aCwgdVs5XSA9IDIgKiBlLnkgLyB0aGlzLmhlaWdodCwgdC5zY2FsZSh1LCB1LCBbMSwgLTEsIDFdKSwgdC50cmFuc2xhdGUodSwgdSwgWzAsIDAsIC10aGlzLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2VdKSwgdC5yb3RhdGVYKHUsIHUsIHRoaXMuX3BpdGNoKSwgdC5yb3RhdGVaKHUsIHUsIHRoaXMuYW5nbGUpLCB0LnRyYW5zbGF0ZSh1LCB1LCBbLW4sIC1zLCAwXSksIHRoaXMubWVyY2F0b3JNYXRyaXggPSB0LnNjYWxlKFtdLCB1LCBbdGhpcy53b3JsZFNpemUsIHRoaXMud29ybGRTaXplLCB0aGlzLndvcmxkU2l6ZV0pLCB0LnNjYWxlKHUsIHUsIFsxLCAxLCB0Lm1lcmNhdG9yWmZyb21BbHRpdHVkZSgxLCB0aGlzLmNlbnRlci5sYXQpICogdGhpcy53b3JsZFNpemUsIDFdKSwgdGhpcy5wcm9qTWF0cml4ID0gdSwgdGhpcy5pbnZQcm9qTWF0cml4ID0gdC5pbnZlcnQoW10sIHRoaXMucHJvak1hdHJpeCk7XG5cbiAgICAgICAgdmFyIGggPSB0aGlzLndpZHRoICUgMiAvIDIsXG4gICAgICAgICAgICBwID0gdGhpcy5oZWlnaHQgJSAyIC8gMixcbiAgICAgICAgICAgIGQgPSBNYXRoLmNvcyh0aGlzLmFuZ2xlKSxcbiAgICAgICAgICAgIF8gPSBNYXRoLnNpbih0aGlzLmFuZ2xlKSxcbiAgICAgICAgICAgIGYgPSBuIC0gTWF0aC5yb3VuZChuKSArIGQgKiBoICsgXyAqIHAsXG4gICAgICAgICAgICBtID0gcyAtIE1hdGgucm91bmQocykgKyBkICogcCArIF8gKiBoLFxuICAgICAgICAgICAgZyA9IG5ldyBGbG9hdDY0QXJyYXkodSk7XG5cbiAgICAgICAgaWYgKHQudHJhbnNsYXRlKGcsIGcsIFtmID4gLjUgPyBmIC0gMSA6IGYsIG0gPiAuNSA/IG0gLSAxIDogbSwgMF0pLCB0aGlzLmFsaWduZWRQcm9qTWF0cml4ID0gZywgdSA9IHQuY3JlYXRlKCksIHQuc2NhbGUodSwgdSwgW3RoaXMud2lkdGggLyAyLCAtdGhpcy5oZWlnaHQgLyAyLCAxXSksIHQudHJhbnNsYXRlKHUsIHUsIFsxLCAtMSwgMF0pLCB0aGlzLmxhYmVsUGxhbmVNYXRyaXggPSB1LCB1ID0gdC5jcmVhdGUoKSwgdC5zY2FsZSh1LCB1LCBbMSwgLTEsIDFdKSwgdC50cmFuc2xhdGUodSwgdSwgWy0xLCAtMSwgMF0pLCB0LnNjYWxlKHUsIHUsIFsyIC8gdGhpcy53aWR0aCwgMiAvIHRoaXMuaGVpZ2h0LCAxXSksIHRoaXMuZ2xDb29yZE1hdHJpeCA9IHUsIHRoaXMucGl4ZWxNYXRyaXggPSB0Lm11bHRpcGx5KG5ldyBGbG9hdDY0QXJyYXkoMTYpLCB0aGlzLmxhYmVsUGxhbmVNYXRyaXgsIHRoaXMucHJvak1hdHJpeCksICEodSA9IHQuaW52ZXJ0KG5ldyBGbG9hdDY0QXJyYXkoMTYpLCB0aGlzLnBpeGVsTWF0cml4KSkpIHRocm93IG5ldyBFcnJvcihcImZhaWxlZCB0byBpbnZlcnQgbWF0cml4XCIpO1xuICAgICAgICB0aGlzLnBpeGVsTWF0cml4SW52ZXJzZSA9IHUsIHRoaXMuX3Bvc01hdHJpeENhY2hlID0ge30sIHRoaXMuX2FsaWduZWRQb3NNYXRyaXhDYWNoZSA9IHt9O1xuICAgICAgfVxuICAgIH0sIFRvLnByb3RvdHlwZS5tYXhQaXRjaFNjYWxlRmFjdG9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCF0aGlzLnBpeGVsTWF0cml4SW52ZXJzZSkgcmV0dXJuIDE7XG4gICAgICB2YXIgZSA9IHRoaXMucG9pbnRDb29yZGluYXRlKG5ldyB0LlBvaW50KDAsIDApKSxcbiAgICAgICAgICBpID0gW2UueCAqIHRoaXMud29ybGRTaXplLCBlLnkgKiB0aGlzLndvcmxkU2l6ZSwgMCwgMV07XG4gICAgICByZXR1cm4gdC50cmFuc2Zvcm1NYXQ0KGksIGksIHRoaXMucGl4ZWxNYXRyaXgpWzNdIC8gdGhpcy5jYW1lcmFUb0NlbnRlckRpc3RhbmNlO1xuICAgIH0sIFRvLnByb3RvdHlwZS5nZXRDYW1lcmFQb2ludCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBlID0gTWF0aC50YW4odGhpcy5fcGl0Y2gpICogKHRoaXMuY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSB8fCAxKTtcbiAgICAgIHJldHVybiB0aGlzLmNlbnRlclBvaW50LmFkZChuZXcgdC5Qb2ludCgwLCBlKSk7XG4gICAgfSwgVG8ucHJvdG90eXBlLmdldENhbWVyYVF1ZXJ5R2VvbWV0cnkgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIGkgPSB0aGlzLmdldENhbWVyYVBvaW50KCk7XG4gICAgICBpZiAoMSA9PT0gZS5sZW5ndGgpIHJldHVybiBbZVswXSwgaV07XG5cbiAgICAgIGZvciAodmFyIG8gPSBpLngsIHIgPSBpLnksIGEgPSBpLngsIG4gPSBpLnksIHMgPSAwLCBsID0gZTsgcyA8IGwubGVuZ3RoOyBzICs9IDEpIHtcbiAgICAgICAgdmFyIGMgPSBsW3NdO1xuICAgICAgICBvID0gTWF0aC5taW4obywgYy54KSwgciA9IE1hdGgubWluKHIsIGMueSksIGEgPSBNYXRoLm1heChhLCBjLngpLCBuID0gTWF0aC5tYXgobiwgYy55KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFtuZXcgdC5Qb2ludChvLCByKSwgbmV3IHQuUG9pbnQoYSwgciksIG5ldyB0LlBvaW50KGEsIG4pLCBuZXcgdC5Qb2ludChvLCBuKSwgbmV3IHQuUG9pbnQobywgcildO1xuICAgIH0sIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFRvLnByb3RvdHlwZSwgRW8pO1xuXG4gICAgdmFyIElvID0gZnVuY3Rpb24gSW8oZSkge1xuICAgICAgdmFyIGksIG8sIHIsIF9hMztcblxuICAgICAgdGhpcy5faGFzaE5hbWUgPSBlICYmIGVuY29kZVVSSUNvbXBvbmVudChlKSwgdC5iaW5kQWxsKFtcIl9nZXRDdXJyZW50SGFzaFwiLCBcIl9vbkhhc2hDaGFuZ2VcIiwgXCJfdXBkYXRlSGFzaFwiXSwgdGhpcyksIHRoaXMuX3VwZGF0ZUhhc2ggPSAoaSA9IHRoaXMuX3VwZGF0ZUhhc2hVbnRocm90dGxlZC5iaW5kKHRoaXMpLCBvID0gITEsIHIgPSBudWxsLCBfYTMgPSBmdW5jdGlvbiBhKCkge1xuICAgICAgICByID0gbnVsbCwgbyAmJiAoaSgpLCByID0gc2V0VGltZW91dChfYTMsIDMwMCksIG8gPSAhMSk7XG4gICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBvID0gITAsIHIgfHwgX2EzKCksIHI7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgSW8ucHJvdG90eXBlLmFkZFRvID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHJldHVybiB0aGlzLl9tYXAgPSBlLCB0LndpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiaGFzaGNoYW5nZVwiLCB0aGlzLl9vbkhhc2hDaGFuZ2UsICExKSwgdGhpcy5fbWFwLm9uKFwibW92ZWVuZFwiLCB0aGlzLl91cGRhdGVIYXNoKSwgdGhpcztcbiAgICB9LCBJby5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHQud2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJoYXNoY2hhbmdlXCIsIHRoaXMuX29uSGFzaENoYW5nZSwgITEpLCB0aGlzLl9tYXAub2ZmKFwibW92ZWVuZFwiLCB0aGlzLl91cGRhdGVIYXNoKSwgY2xlYXJUaW1lb3V0KHRoaXMuX3VwZGF0ZUhhc2goKSksIGRlbGV0ZSB0aGlzLl9tYXAsIHRoaXM7XG4gICAgfSwgSW8ucHJvdG90eXBlLmdldEhhc2hTdHJpbmcgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIGkgPSB0aGlzLl9tYXAuZ2V0Q2VudGVyKCksXG4gICAgICAgICAgbyA9IE1hdGgucm91bmQoMTAwICogdGhpcy5fbWFwLmdldFpvb20oKSkgLyAxMDAsXG4gICAgICAgICAgciA9IE1hdGguY2VpbCgobyAqIE1hdGguTE4yICsgTWF0aC5sb2coNTEyIC8gMzYwIC8gLjUpKSAvIE1hdGguTE4xMCksXG4gICAgICAgICAgYSA9IE1hdGgucG93KDEwLCByKSxcbiAgICAgICAgICBuID0gTWF0aC5yb3VuZChpLmxuZyAqIGEpIC8gYSxcbiAgICAgICAgICBzID0gTWF0aC5yb3VuZChpLmxhdCAqIGEpIC8gYSxcbiAgICAgICAgICBsID0gdGhpcy5fbWFwLmdldEJlYXJpbmcoKSxcbiAgICAgICAgICBjID0gdGhpcy5fbWFwLmdldFBpdGNoKCksXG4gICAgICAgICAgdSA9IFwiXCI7XG5cbiAgICAgIGlmICh1ICs9IGUgPyBcIi9cIiArIG4gKyBcIi9cIiArIHMgKyBcIi9cIiArIG8gOiBvICsgXCIvXCIgKyBzICsgXCIvXCIgKyBuLCAobCB8fCBjKSAmJiAodSArPSBcIi9cIiArIE1hdGgucm91bmQoMTAgKiBsKSAvIDEwKSwgYyAmJiAodSArPSBcIi9cIiArIE1hdGgucm91bmQoYykpLCB0aGlzLl9oYXNoTmFtZSkge1xuICAgICAgICB2YXIgaCA9IHRoaXMuX2hhc2hOYW1lLFxuICAgICAgICAgICAgcCA9ICExLFxuICAgICAgICAgICAgZCA9IHQud2luZG93LmxvY2F0aW9uLmhhc2guc2xpY2UoMSkuc3BsaXQoXCImXCIpLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHZhciBlID0gdC5zcGxpdChcIj1cIilbMF07XG4gICAgICAgICAgcmV0dXJuIGUgPT09IGggPyAocCA9ICEwLCBlICsgXCI9XCIgKyB1KSA6IHQ7XG4gICAgICAgIH0pLmZpbHRlcihmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHJldHVybiB0O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHAgfHwgZC5wdXNoKGggKyBcIj1cIiArIHUpLCBcIiNcIiArIGQuam9pbihcIiZcIik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBcIiNcIiArIHU7XG4gICAgfSwgSW8ucHJvdG90eXBlLl9nZXRDdXJyZW50SGFzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBlLFxuICAgICAgICAgIGkgPSB0aGlzLFxuICAgICAgICAgIG8gPSB0LndpbmRvdy5sb2NhdGlvbi5oYXNoLnJlcGxhY2UoXCIjXCIsIFwiXCIpO1xuICAgICAgcmV0dXJuIHRoaXMuX2hhc2hOYW1lID8gKG8uc3BsaXQoXCImXCIpLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdC5zcGxpdChcIj1cIik7XG4gICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHRbMF0gPT09IGkuX2hhc2hOYW1lICYmIChlID0gdCk7XG4gICAgICB9KSwgKGUgJiYgZVsxXSB8fCBcIlwiKS5zcGxpdChcIi9cIikpIDogby5zcGxpdChcIi9cIik7XG4gICAgfSwgSW8ucHJvdG90eXBlLl9vbkhhc2hDaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdCA9IHRoaXMuX2dldEN1cnJlbnRIYXNoKCk7XG5cbiAgICAgIGlmICh0Lmxlbmd0aCA+PSAzICYmICF0LnNvbWUoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIGlzTmFOKHQpO1xuICAgICAgfSkpIHtcbiAgICAgICAgdmFyIGUgPSB0aGlzLl9tYXAuZHJhZ1JvdGF0ZS5pc0VuYWJsZWQoKSAmJiB0aGlzLl9tYXAudG91Y2hab29tUm90YXRlLmlzRW5hYmxlZCgpID8gKyh0WzNdIHx8IDApIDogdGhpcy5fbWFwLmdldEJlYXJpbmcoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hcC5qdW1wVG8oe1xuICAgICAgICAgIGNlbnRlcjogWyt0WzJdLCArdFsxXV0sXG4gICAgICAgICAgem9vbTogK3RbMF0sXG4gICAgICAgICAgYmVhcmluZzogZSxcbiAgICAgICAgICBwaXRjaDogKyh0WzRdIHx8IDApXG4gICAgICAgIH0pLCAhMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICExO1xuICAgIH0sIElvLnByb3RvdHlwZS5fdXBkYXRlSGFzaFVudGhyb3R0bGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGUgPSB0LndpbmRvdy5sb2NhdGlvbi5ocmVmLnJlcGxhY2UoLygjLispPyQvLCB0aGlzLmdldEhhc2hTdHJpbmcoKSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHQud2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKHQud2luZG93Lmhpc3Rvcnkuc3RhdGUsIG51bGwsIGUpO1xuICAgICAgfSBjYXRjaCAodCkge31cbiAgICB9O1xuXG4gICAgdmFyIFBvID0ge1xuICAgICAgbGluZWFyaXR5OiAuMyxcbiAgICAgIGVhc2luZzogdC5iZXppZXIoMCwgMCwgLjMsIDEpXG4gICAgfSxcbiAgICAgICAgU28gPSB0LmV4dGVuZCh7XG4gICAgICBkZWNlbGVyYXRpb246IDI1MDAsXG4gICAgICBtYXhTcGVlZDogMTQwMFxuICAgIH0sIFBvKSxcbiAgICAgICAgQ28gPSB0LmV4dGVuZCh7XG4gICAgICBkZWNlbGVyYXRpb246IDIwLFxuICAgICAgbWF4U3BlZWQ6IDE0MDBcbiAgICB9LCBQbyksXG4gICAgICAgIHpvID0gdC5leHRlbmQoe1xuICAgICAgZGVjZWxlcmF0aW9uOiAxZTMsXG4gICAgICBtYXhTcGVlZDogMzYwXG4gICAgfSwgUG8pLFxuICAgICAgICBEbyA9IHQuZXh0ZW5kKHtcbiAgICAgIGRlY2VsZXJhdGlvbjogMWUzLFxuICAgICAgbWF4U3BlZWQ6IDkwXG4gICAgfSwgUG8pLFxuICAgICAgICBBbyA9IGZ1bmN0aW9uIEFvKHQpIHtcbiAgICAgIHRoaXMuX21hcCA9IHQsIHRoaXMuY2xlYXIoKTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gTW8odCwgZSkge1xuICAgICAgKCF0LmR1cmF0aW9uIHx8IHQuZHVyYXRpb24gPCBlLmR1cmF0aW9uKSAmJiAodC5kdXJhdGlvbiA9IGUuZHVyYXRpb24sIHQuZWFzaW5nID0gZS5lYXNpbmcpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIExvKGUsIGksIG8pIHtcbiAgICAgIHZhciByID0gby5tYXhTcGVlZCxcbiAgICAgICAgICBhID0gby5saW5lYXJpdHksXG4gICAgICAgICAgbiA9IG8uZGVjZWxlcmF0aW9uLFxuICAgICAgICAgIHMgPSB0LmNsYW1wKGUgKiBhIC8gKGkgLyAxZTMpLCAtciwgciksXG4gICAgICAgICAgbCA9IE1hdGguYWJzKHMpIC8gKG4gKiBhKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVhc2luZzogby5lYXNpbmcsXG4gICAgICAgIGR1cmF0aW9uOiAxZTMgKiBsLFxuICAgICAgICBhbW91bnQ6IHMgKiAobCAvIDIpXG4gICAgICB9O1xuICAgIH1cblxuICAgIEFvLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuX2luZXJ0aWFCdWZmZXIgPSBbXTtcbiAgICB9LCBBby5wcm90b3R5cGUucmVjb3JkID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHRoaXMuX2RyYWluSW5lcnRpYUJ1ZmZlcigpLCB0aGlzLl9pbmVydGlhQnVmZmVyLnB1c2goe1xuICAgICAgICB0aW1lOiB0LmJyb3dzZXIubm93KCksXG4gICAgICAgIHNldHRpbmdzOiBlXG4gICAgICB9KTtcbiAgICB9LCBBby5wcm90b3R5cGUuX2RyYWluSW5lcnRpYUJ1ZmZlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIGUgPSB0aGlzLl9pbmVydGlhQnVmZmVyLCBpID0gdC5icm93c2VyLm5vdygpOyBlLmxlbmd0aCA+IDAgJiYgaSAtIGVbMF0udGltZSA+IDE2MDspIHtcbiAgICAgICAgZS5zaGlmdCgpO1xuICAgICAgfVxuICAgIH0sIEFvLnByb3RvdHlwZS5fb25Nb3ZlRW5kID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmICh0aGlzLl9kcmFpbkluZXJ0aWFCdWZmZXIoKSwgISh0aGlzLl9pbmVydGlhQnVmZmVyLmxlbmd0aCA8IDIpKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSB7XG4gICAgICAgICAgem9vbTogMCxcbiAgICAgICAgICBiZWFyaW5nOiAwLFxuICAgICAgICAgIHBpdGNoOiAwLFxuICAgICAgICAgIHBhbjogbmV3IHQuUG9pbnQoMCwgMCksXG4gICAgICAgICAgcGluY2hBcm91bmQ6IHZvaWQgMCxcbiAgICAgICAgICBhcm91bmQ6IHZvaWQgMFxuICAgICAgICB9LCBvID0gMCwgciA9IHRoaXMuX2luZXJ0aWFCdWZmZXI7IG8gPCByLmxlbmd0aDsgbyArPSAxKSB7XG4gICAgICAgICAgdmFyIGEgPSByW29dLnNldHRpbmdzO1xuICAgICAgICAgIGkuem9vbSArPSBhLnpvb21EZWx0YSB8fCAwLCBpLmJlYXJpbmcgKz0gYS5iZWFyaW5nRGVsdGEgfHwgMCwgaS5waXRjaCArPSBhLnBpdGNoRGVsdGEgfHwgMCwgYS5wYW5EZWx0YSAmJiBpLnBhbi5fYWRkKGEucGFuRGVsdGEpLCBhLmFyb3VuZCAmJiAoaS5hcm91bmQgPSBhLmFyb3VuZCksIGEucGluY2hBcm91bmQgJiYgKGkucGluY2hBcm91bmQgPSBhLnBpbmNoQXJvdW5kKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBuID0gdGhpcy5faW5lcnRpYUJ1ZmZlclt0aGlzLl9pbmVydGlhQnVmZmVyLmxlbmd0aCAtIDFdLnRpbWUgLSB0aGlzLl9pbmVydGlhQnVmZmVyWzBdLnRpbWUsXG4gICAgICAgICAgICBzID0ge307XG5cbiAgICAgICAgaWYgKGkucGFuLm1hZygpKSB7XG4gICAgICAgICAgdmFyIGwgPSBMbyhpLnBhbi5tYWcoKSwgbiwgdC5leHRlbmQoe30sIFNvLCBlIHx8IHt9KSk7XG4gICAgICAgICAgcy5vZmZzZXQgPSBpLnBhbi5tdWx0KGwuYW1vdW50IC8gaS5wYW4ubWFnKCkpLCBzLmNlbnRlciA9IHRoaXMuX21hcC50cmFuc2Zvcm0uY2VudGVyLCBNbyhzLCBsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpLnpvb20pIHtcbiAgICAgICAgICB2YXIgYyA9IExvKGkuem9vbSwgbiwgQ28pO1xuICAgICAgICAgIHMuem9vbSA9IHRoaXMuX21hcC50cmFuc2Zvcm0uem9vbSArIGMuYW1vdW50LCBNbyhzLCBjKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpLmJlYXJpbmcpIHtcbiAgICAgICAgICB2YXIgdSA9IExvKGkuYmVhcmluZywgbiwgem8pO1xuICAgICAgICAgIHMuYmVhcmluZyA9IHRoaXMuX21hcC50cmFuc2Zvcm0uYmVhcmluZyArIHQuY2xhbXAodS5hbW91bnQsIC0xNzksIDE3OSksIE1vKHMsIHUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGkucGl0Y2gpIHtcbiAgICAgICAgICB2YXIgaCA9IExvKGkucGl0Y2gsIG4sIERvKTtcbiAgICAgICAgICBzLnBpdGNoID0gdGhpcy5fbWFwLnRyYW5zZm9ybS5waXRjaCArIGguYW1vdW50LCBNbyhzLCBoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzLnpvb20gfHwgcy5iZWFyaW5nKSB7XG4gICAgICAgICAgdmFyIHAgPSB2b2lkIDAgPT09IGkucGluY2hBcm91bmQgPyBpLmFyb3VuZCA6IGkucGluY2hBcm91bmQ7XG4gICAgICAgICAgcy5hcm91bmQgPSBwID8gdGhpcy5fbWFwLnVucHJvamVjdChwKSA6IHRoaXMuX21hcC5nZXRDZW50ZXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmNsZWFyKCksIHQuZXh0ZW5kKHMsIHtcbiAgICAgICAgICBub01vdmVTdGFydDogITBcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciBSbyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBmdW5jdGlvbiBvKG8sIHIsIGEsIG4pIHtcbiAgICAgICAgdm9pZCAwID09PSBuICYmIChuID0ge30pO1xuICAgICAgICB2YXIgcyA9IGkubW91c2VQb3Moci5nZXRDYW52YXNDb250YWluZXIoKSwgYSksXG4gICAgICAgICAgICBsID0gci51bnByb2plY3Qocyk7XG4gICAgICAgIGUuY2FsbCh0aGlzLCBvLCB0LmV4dGVuZCh7XG4gICAgICAgICAgcG9pbnQ6IHMsXG4gICAgICAgICAgbG5nTGF0OiBsLFxuICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGFcbiAgICAgICAgfSwgbikpLCB0aGlzLl9kZWZhdWx0UHJldmVudGVkID0gITEsIHRoaXMudGFyZ2V0ID0gcjtcbiAgICAgIH1cblxuICAgICAgZSAmJiAoby5fX3Byb3RvX18gPSBlKSwgKG8ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShlICYmIGUucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBvO1xuICAgICAgdmFyIHIgPSB7XG4gICAgICAgIGRlZmF1bHRQcmV2ZW50ZWQ6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZXR1cm4gby5wcm90b3R5cGUucHJldmVudERlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRQcmV2ZW50ZWQgPSAhMDtcbiAgICAgIH0sIHIuZGVmYXVsdFByZXZlbnRlZC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0UHJldmVudGVkO1xuICAgICAgfSwgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoby5wcm90b3R5cGUsIHIpLCBvO1xuICAgIH0odC5FdmVudCksXG4gICAgICAgIGtvID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGZ1bmN0aW9uIG8obywgciwgYSkge1xuICAgICAgICB2YXIgbiA9IFwidG91Y2hlbmRcIiA9PT0gbyA/IGEuY2hhbmdlZFRvdWNoZXMgOiBhLnRvdWNoZXMsXG4gICAgICAgICAgICBzID0gaS50b3VjaFBvcyhyLmdldENhbnZhc0NvbnRhaW5lcigpLCBuKSxcbiAgICAgICAgICAgIGwgPSBzLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHJldHVybiByLnVucHJvamVjdCh0KTtcbiAgICAgICAgfSksXG4gICAgICAgICAgICBjID0gcy5yZWR1Y2UoZnVuY3Rpb24gKHQsIGUsIGksIG8pIHtcbiAgICAgICAgICByZXR1cm4gdC5hZGQoZS5kaXYoby5sZW5ndGgpKTtcbiAgICAgICAgfSwgbmV3IHQuUG9pbnQoMCwgMCkpLFxuICAgICAgICAgICAgdSA9IHIudW5wcm9qZWN0KGMpO1xuICAgICAgICBlLmNhbGwodGhpcywgbywge1xuICAgICAgICAgIHBvaW50czogcyxcbiAgICAgICAgICBwb2ludDogYyxcbiAgICAgICAgICBsbmdMYXRzOiBsLFxuICAgICAgICAgIGxuZ0xhdDogdSxcbiAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBhXG4gICAgICAgIH0pLCB0aGlzLl9kZWZhdWx0UHJldmVudGVkID0gITE7XG4gICAgICB9XG5cbiAgICAgIGUgJiYgKG8uX19wcm90b19fID0gZSksIChvLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoZSAmJiBlLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gbztcbiAgICAgIHZhciByID0ge1xuICAgICAgICBkZWZhdWx0UHJldmVudGVkOiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcmV0dXJuIG8ucHJvdG90eXBlLnByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9kZWZhdWx0UHJldmVudGVkID0gITA7XG4gICAgICB9LCByLmRlZmF1bHRQcmV2ZW50ZWQuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFByZXZlbnRlZDtcbiAgICAgIH0sIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG8ucHJvdG90eXBlLCByKSwgbztcbiAgICB9KHQuRXZlbnQpLFxuICAgICAgICBCbyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKGUsIGksIG8pIHtcbiAgICAgICAgdC5jYWxsKHRoaXMsIGUsIHtcbiAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBvXG4gICAgICAgIH0pLCB0aGlzLl9kZWZhdWx0UHJldmVudGVkID0gITE7XG4gICAgICB9XG5cbiAgICAgIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZTtcbiAgICAgIHZhciBpID0ge1xuICAgICAgICBkZWZhdWx0UHJldmVudGVkOiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcmV0dXJuIGUucHJvdG90eXBlLnByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9kZWZhdWx0UHJldmVudGVkID0gITA7XG4gICAgICB9LCBpLmRlZmF1bHRQcmV2ZW50ZWQuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFByZXZlbnRlZDtcbiAgICAgIH0sIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUucHJvdG90eXBlLCBpKSwgZTtcbiAgICB9KHQuRXZlbnQpLFxuICAgICAgICBPbyA9IGZ1bmN0aW9uIE9vKHQsIGUpIHtcbiAgICAgIHRoaXMuX21hcCA9IHQsIHRoaXMuX2NsaWNrVG9sZXJhbmNlID0gZS5jbGlja1RvbGVyYW5jZTtcbiAgICB9O1xuXG4gICAgT28ucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgZGVsZXRlIHRoaXMuX21vdXNlZG93blBvcztcbiAgICB9LCBPby5wcm90b3R5cGUud2hlZWwgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2ZpcmVQcmV2ZW50YWJsZShuZXcgQm8odC50eXBlLCB0aGlzLl9tYXAsIHQpKTtcbiAgICB9LCBPby5wcm90b3R5cGUubW91c2Vkb3duID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHJldHVybiB0aGlzLl9tb3VzZWRvd25Qb3MgPSBlLCB0aGlzLl9maXJlUHJldmVudGFibGUobmV3IFJvKHQudHlwZSwgdGhpcy5fbWFwLCB0KSk7XG4gICAgfSwgT28ucHJvdG90eXBlLm1vdXNldXAgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdGhpcy5fbWFwLmZpcmUobmV3IFJvKHQudHlwZSwgdGhpcy5fbWFwLCB0KSk7XG4gICAgfSwgT28ucHJvdG90eXBlLmNsaWNrID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHRoaXMuX21vdXNlZG93blBvcyAmJiB0aGlzLl9tb3VzZWRvd25Qb3MuZGlzdChlKSA+PSB0aGlzLl9jbGlja1RvbGVyYW5jZSB8fCB0aGlzLl9tYXAuZmlyZShuZXcgUm8odC50eXBlLCB0aGlzLl9tYXAsIHQpKTtcbiAgICB9LCBPby5wcm90b3R5cGUuZGJsY2xpY2sgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2ZpcmVQcmV2ZW50YWJsZShuZXcgUm8odC50eXBlLCB0aGlzLl9tYXAsIHQpKTtcbiAgICB9LCBPby5wcm90b3R5cGUubW91c2VvdmVyID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHRoaXMuX21hcC5maXJlKG5ldyBSbyh0LnR5cGUsIHRoaXMuX21hcCwgdCkpO1xuICAgIH0sIE9vLnByb3RvdHlwZS5tb3VzZW91dCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0aGlzLl9tYXAuZmlyZShuZXcgUm8odC50eXBlLCB0aGlzLl9tYXAsIHQpKTtcbiAgICB9LCBPby5wcm90b3R5cGUudG91Y2hzdGFydCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gdGhpcy5fZmlyZVByZXZlbnRhYmxlKG5ldyBrbyh0LnR5cGUsIHRoaXMuX21hcCwgdCkpO1xuICAgIH0sIE9vLnByb3RvdHlwZS50b3VjaG1vdmUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdGhpcy5fbWFwLmZpcmUobmV3IGtvKHQudHlwZSwgdGhpcy5fbWFwLCB0KSk7XG4gICAgfSwgT28ucHJvdG90eXBlLnRvdWNoZW5kID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHRoaXMuX21hcC5maXJlKG5ldyBrbyh0LnR5cGUsIHRoaXMuX21hcCwgdCkpO1xuICAgIH0sIE9vLnByb3RvdHlwZS50b3VjaGNhbmNlbCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0aGlzLl9tYXAuZmlyZShuZXcga28odC50eXBlLCB0aGlzLl9tYXAsIHQpKTtcbiAgICB9LCBPby5wcm90b3R5cGUuX2ZpcmVQcmV2ZW50YWJsZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBpZiAodGhpcy5fbWFwLmZpcmUodCksIHQuZGVmYXVsdFByZXZlbnRlZCkgcmV0dXJuIHt9O1xuICAgIH0sIE9vLnByb3RvdHlwZS5pc0VuYWJsZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gITA7XG4gICAgfSwgT28ucHJvdG90eXBlLmlzQWN0aXZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICExO1xuICAgIH0sIE9vLnByb3RvdHlwZS5lbmFibGUgPSBmdW5jdGlvbiAoKSB7fSwgT28ucHJvdG90eXBlLmRpc2FibGUgPSBmdW5jdGlvbiAoKSB7fTtcblxuICAgIHZhciBGbyA9IGZ1bmN0aW9uIEZvKHQpIHtcbiAgICAgIHRoaXMuX21hcCA9IHQ7XG4gICAgfTtcblxuICAgIEZvLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuX2RlbGF5Q29udGV4dE1lbnUgPSAhMSwgZGVsZXRlIHRoaXMuX2NvbnRleHRNZW51RXZlbnQ7XG4gICAgfSwgRm8ucHJvdG90eXBlLm1vdXNlbW92ZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0aGlzLl9tYXAuZmlyZShuZXcgUm8odC50eXBlLCB0aGlzLl9tYXAsIHQpKTtcbiAgICB9LCBGby5wcm90b3R5cGUubW91c2Vkb3duID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5fZGVsYXlDb250ZXh0TWVudSA9ICEwO1xuICAgIH0sIEZvLnByb3RvdHlwZS5tb3VzZXVwID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5fZGVsYXlDb250ZXh0TWVudSA9ICExLCB0aGlzLl9jb250ZXh0TWVudUV2ZW50ICYmICh0aGlzLl9tYXAuZmlyZShuZXcgUm8oXCJjb250ZXh0bWVudVwiLCB0aGlzLl9tYXAsIHRoaXMuX2NvbnRleHRNZW51RXZlbnQpKSwgZGVsZXRlIHRoaXMuX2NvbnRleHRNZW51RXZlbnQpO1xuICAgIH0sIEZvLnByb3RvdHlwZS5jb250ZXh0bWVudSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0aGlzLl9kZWxheUNvbnRleHRNZW51ID8gdGhpcy5fY29udGV4dE1lbnVFdmVudCA9IHQgOiB0aGlzLl9tYXAuZmlyZShuZXcgUm8odC50eXBlLCB0aGlzLl9tYXAsIHQpKSwgdGhpcy5fbWFwLmxpc3RlbnMoXCJjb250ZXh0bWVudVwiKSAmJiB0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfSwgRm8ucHJvdG90eXBlLmlzRW5hYmxlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhMDtcbiAgICB9LCBGby5wcm90b3R5cGUuaXNBY3RpdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gITE7XG4gICAgfSwgRm8ucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uICgpIHt9LCBGby5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uICgpIHt9O1xuXG4gICAgdmFyIFVvID0gZnVuY3Rpb24gVW8odCwgZSkge1xuICAgICAgdGhpcy5fbWFwID0gdCwgdGhpcy5fZWwgPSB0LmdldENhbnZhc0NvbnRhaW5lcigpLCB0aGlzLl9jb250YWluZXIgPSB0LmdldENvbnRhaW5lcigpLCB0aGlzLl9jbGlja1RvbGVyYW5jZSA9IGUuY2xpY2tUb2xlcmFuY2UgfHwgMTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gTm8odCwgZSkge1xuICAgICAgZm9yICh2YXIgaSA9IHt9LCBvID0gMDsgbyA8IHQubGVuZ3RoOyBvKyspIHtcbiAgICAgICAgaVt0W29dLmlkZW50aWZpZXJdID0gZVtvXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuXG4gICAgVW8ucHJvdG90eXBlLmlzRW5hYmxlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhIXRoaXMuX2VuYWJsZWQ7XG4gICAgfSwgVW8ucHJvdG90eXBlLmlzQWN0aXZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICEhdGhpcy5fYWN0aXZlO1xuICAgIH0sIFVvLnByb3RvdHlwZS5lbmFibGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLmlzRW5hYmxlZCgpIHx8ICh0aGlzLl9lbmFibGVkID0gITApO1xuICAgIH0sIFVvLnByb3RvdHlwZS5kaXNhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5pc0VuYWJsZWQoKSAmJiAodGhpcy5fZW5hYmxlZCA9ICExKTtcbiAgICB9LCBVby5wcm90b3R5cGUubW91c2Vkb3duID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHRoaXMuaXNFbmFibGVkKCkgJiYgdC5zaGlmdEtleSAmJiAwID09PSB0LmJ1dHRvbiAmJiAoaS5kaXNhYmxlRHJhZygpLCB0aGlzLl9zdGFydFBvcyA9IHRoaXMuX2xhc3RQb3MgPSBlLCB0aGlzLl9hY3RpdmUgPSAhMCk7XG4gICAgfSwgVW8ucHJvdG90eXBlLm1vdXNlbW92ZVdpbmRvdyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICBpZiAodGhpcy5fYWN0aXZlKSB7XG4gICAgICAgIHZhciBvID0gZTtcblxuICAgICAgICBpZiAoISh0aGlzLl9sYXN0UG9zLmVxdWFscyhvKSB8fCAhdGhpcy5fYm94ICYmIG8uZGlzdCh0aGlzLl9zdGFydFBvcykgPCB0aGlzLl9jbGlja1RvbGVyYW5jZSkpIHtcbiAgICAgICAgICB2YXIgciA9IHRoaXMuX3N0YXJ0UG9zO1xuICAgICAgICAgIHRoaXMuX2xhc3RQb3MgPSBvLCB0aGlzLl9ib3ggfHwgKHRoaXMuX2JveCA9IGkuY3JlYXRlKFwiZGl2XCIsIFwibWFwYm94Z2wtYm94em9vbVwiLCB0aGlzLl9jb250YWluZXIpLCB0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LmFkZChcIm1hcGJveGdsLWNyb3NzaGFpclwiKSwgdGhpcy5fZmlyZUV2ZW50KFwiYm94em9vbXN0YXJ0XCIsIHQpKTtcbiAgICAgICAgICB2YXIgYSA9IE1hdGgubWluKHIueCwgby54KSxcbiAgICAgICAgICAgICAgbiA9IE1hdGgubWF4KHIueCwgby54KSxcbiAgICAgICAgICAgICAgcyA9IE1hdGgubWluKHIueSwgby55KSxcbiAgICAgICAgICAgICAgbCA9IE1hdGgubWF4KHIueSwgby55KTtcbiAgICAgICAgICBpLnNldFRyYW5zZm9ybSh0aGlzLl9ib3gsIFwidHJhbnNsYXRlKFwiICsgYSArIFwicHgsXCIgKyBzICsgXCJweClcIiksIHRoaXMuX2JveC5zdHlsZS53aWR0aCA9IG4gLSBhICsgXCJweFwiLCB0aGlzLl9ib3guc3R5bGUuaGVpZ2h0ID0gbCAtIHMgKyBcInB4XCI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBVby5wcm90b3R5cGUubW91c2V1cFdpbmRvdyA9IGZ1bmN0aW9uIChlLCBvKSB7XG4gICAgICB2YXIgciA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLl9hY3RpdmUgJiYgMCA9PT0gZS5idXR0b24pIHtcbiAgICAgICAgdmFyIGEgPSB0aGlzLl9zdGFydFBvcyxcbiAgICAgICAgICAgIG4gPSBvO1xuICAgICAgICBpZiAodGhpcy5yZXNldCgpLCBpLnN1cHByZXNzQ2xpY2soKSwgYS54ICE9PSBuLnggfHwgYS55ICE9PSBuLnkpIHJldHVybiB0aGlzLl9tYXAuZmlyZShuZXcgdC5FdmVudChcImJveHpvb21lbmRcIiwge1xuICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGVcbiAgICAgICAgfSkpLCB7XG4gICAgICAgICAgY2FtZXJhQW5pbWF0aW9uOiBmdW5jdGlvbiBjYW1lcmFBbmltYXRpb24odCkge1xuICAgICAgICAgICAgcmV0dXJuIHQuZml0U2NyZWVuQ29vcmRpbmF0ZXMoYSwgbiwgci5fbWFwLmdldEJlYXJpbmcoKSwge1xuICAgICAgICAgICAgICBsaW5lYXI6ICEwXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5fZmlyZUV2ZW50KFwiYm94em9vbWNhbmNlbFwiLCBlKTtcbiAgICAgIH1cbiAgICB9LCBVby5wcm90b3R5cGUua2V5ZG93biA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0aGlzLl9hY3RpdmUgJiYgMjcgPT09IHQua2V5Q29kZSAmJiAodGhpcy5yZXNldCgpLCB0aGlzLl9maXJlRXZlbnQoXCJib3h6b29tY2FuY2VsXCIsIHQpKTtcbiAgICB9LCBVby5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLl9hY3RpdmUgPSAhMSwgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoXCJtYXBib3hnbC1jcm9zc2hhaXJcIiksIHRoaXMuX2JveCAmJiAoaS5yZW1vdmUodGhpcy5fYm94KSwgdGhpcy5fYm94ID0gbnVsbCksIGkuZW5hYmxlRHJhZygpLCBkZWxldGUgdGhpcy5fc3RhcnRQb3MsIGRlbGV0ZSB0aGlzLl9sYXN0UG9zO1xuICAgIH0sIFVvLnByb3RvdHlwZS5fZmlyZUV2ZW50ID0gZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9tYXAuZmlyZShuZXcgdC5FdmVudChlLCB7XG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGlcbiAgICAgIH0pKTtcbiAgICB9O1xuXG4gICAgdmFyIFpvID0gZnVuY3Rpb24gWm8odCkge1xuICAgICAgdGhpcy5yZXNldCgpLCB0aGlzLm51bVRvdWNoZXMgPSB0Lm51bVRvdWNoZXM7XG4gICAgfTtcblxuICAgIFpvLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLmNlbnRyb2lkLCBkZWxldGUgdGhpcy5zdGFydFRpbWUsIGRlbGV0ZSB0aGlzLnRvdWNoZXMsIHRoaXMuYWJvcnRlZCA9ICExO1xuICAgIH0sIFpvLnByb3RvdHlwZS50b3VjaHN0YXJ0ID0gZnVuY3Rpb24gKGUsIGksIG8pIHtcbiAgICAgICh0aGlzLmNlbnRyb2lkIHx8IG8ubGVuZ3RoID4gdGhpcy5udW1Ub3VjaGVzKSAmJiAodGhpcy5hYm9ydGVkID0gITApLCB0aGlzLmFib3J0ZWQgfHwgKHZvaWQgMCA9PT0gdGhpcy5zdGFydFRpbWUgJiYgKHRoaXMuc3RhcnRUaW1lID0gZS50aW1lU3RhbXApLCBvLmxlbmd0aCA9PT0gdGhpcy5udW1Ub3VjaGVzICYmICh0aGlzLmNlbnRyb2lkID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IG5ldyB0LlBvaW50KDAsIDApLCBvID0gMCwgciA9IGU7IG8gPCByLmxlbmd0aDsgbyArPSAxKSB7XG4gICAgICAgICAgaS5fYWRkKHJbb10pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGkuZGl2KGUubGVuZ3RoKTtcbiAgICAgIH0oaSksIHRoaXMudG91Y2hlcyA9IE5vKG8sIGkpKSk7XG4gICAgfSwgWm8ucHJvdG90eXBlLnRvdWNobW92ZSA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICBpZiAoIXRoaXMuYWJvcnRlZCAmJiB0aGlzLmNlbnRyb2lkKSB7XG4gICAgICAgIHZhciBvID0gTm8oaSwgZSk7XG5cbiAgICAgICAgZm9yICh2YXIgciBpbiB0aGlzLnRvdWNoZXMpIHtcbiAgICAgICAgICB2YXIgYSA9IG9bcl07XG4gICAgICAgICAgKCFhIHx8IGEuZGlzdCh0aGlzLnRvdWNoZXNbcl0pID4gMzApICYmICh0aGlzLmFib3J0ZWQgPSAhMCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBaby5wcm90b3R5cGUudG91Y2hlbmQgPSBmdW5jdGlvbiAodCwgZSwgaSkge1xuICAgICAgaWYgKCghdGhpcy5jZW50cm9pZCB8fCB0LnRpbWVTdGFtcCAtIHRoaXMuc3RhcnRUaW1lID4gNTAwKSAmJiAodGhpcy5hYm9ydGVkID0gITApLCAwID09PSBpLmxlbmd0aCkge1xuICAgICAgICB2YXIgbyA9ICF0aGlzLmFib3J0ZWQgJiYgdGhpcy5jZW50cm9pZDtcbiAgICAgICAgaWYgKHRoaXMucmVzZXQoKSwgbykgcmV0dXJuIG87XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciBxbyA9IGZ1bmN0aW9uIHFvKHQpIHtcbiAgICAgIHRoaXMuc2luZ2xlVGFwID0gbmV3IFpvKHQpLCB0aGlzLm51bVRhcHMgPSB0Lm51bVRhcHMsIHRoaXMucmVzZXQoKTtcbiAgICB9O1xuXG4gICAgcW8ucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5sYXN0VGltZSA9IDEgLyAwLCBkZWxldGUgdGhpcy5sYXN0VGFwLCB0aGlzLmNvdW50ID0gMCwgdGhpcy5zaW5nbGVUYXAucmVzZXQoKTtcbiAgICB9LCBxby5wcm90b3R5cGUudG91Y2hzdGFydCA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICB0aGlzLnNpbmdsZVRhcC50b3VjaHN0YXJ0KHQsIGUsIGkpO1xuICAgIH0sIHFvLnByb3RvdHlwZS50b3VjaG1vdmUgPSBmdW5jdGlvbiAodCwgZSwgaSkge1xuICAgICAgdGhpcy5zaW5nbGVUYXAudG91Y2htb3ZlKHQsIGUsIGkpO1xuICAgIH0sIHFvLnByb3RvdHlwZS50b3VjaGVuZCA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICB2YXIgbyA9IHRoaXMuc2luZ2xlVGFwLnRvdWNoZW5kKHQsIGUsIGkpO1xuXG4gICAgICBpZiAobykge1xuICAgICAgICB2YXIgciA9IHQudGltZVN0YW1wIC0gdGhpcy5sYXN0VGltZSA8IDUwMCxcbiAgICAgICAgICAgIGEgPSAhdGhpcy5sYXN0VGFwIHx8IHRoaXMubGFzdFRhcC5kaXN0KG8pIDwgMzA7XG4gICAgICAgIGlmIChyICYmIGEgfHwgdGhpcy5yZXNldCgpLCB0aGlzLmNvdW50KyssIHRoaXMubGFzdFRpbWUgPSB0LnRpbWVTdGFtcCwgdGhpcy5sYXN0VGFwID0gbywgdGhpcy5jb3VudCA9PT0gdGhpcy5udW1UYXBzKSByZXR1cm4gdGhpcy5yZXNldCgpLCBvO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgam8gPSBmdW5jdGlvbiBqbygpIHtcbiAgICAgIHRoaXMuX3pvb21JbiA9IG5ldyBxbyh7XG4gICAgICAgIG51bVRvdWNoZXM6IDEsXG4gICAgICAgIG51bVRhcHM6IDJcbiAgICAgIH0pLCB0aGlzLl96b29tT3V0ID0gbmV3IHFvKHtcbiAgICAgICAgbnVtVG91Y2hlczogMixcbiAgICAgICAgbnVtVGFwczogMVxuICAgICAgfSksIHRoaXMucmVzZXQoKTtcbiAgICB9O1xuXG4gICAgam8ucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5fYWN0aXZlID0gITEsIHRoaXMuX3pvb21Jbi5yZXNldCgpLCB0aGlzLl96b29tT3V0LnJlc2V0KCk7XG4gICAgfSwgam8ucHJvdG90eXBlLnRvdWNoc3RhcnQgPSBmdW5jdGlvbiAodCwgZSwgaSkge1xuICAgICAgdGhpcy5fem9vbUluLnRvdWNoc3RhcnQodCwgZSwgaSksIHRoaXMuX3pvb21PdXQudG91Y2hzdGFydCh0LCBlLCBpKTtcbiAgICB9LCBqby5wcm90b3R5cGUudG91Y2htb3ZlID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcbiAgICAgIHRoaXMuX3pvb21Jbi50b3VjaG1vdmUodCwgZSwgaSksIHRoaXMuX3pvb21PdXQudG91Y2htb3ZlKHQsIGUsIGkpO1xuICAgIH0sIGpvLnByb3RvdHlwZS50b3VjaGVuZCA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICB2YXIgbyA9IHRoaXMsXG4gICAgICAgICAgciA9IHRoaXMuX3pvb21Jbi50b3VjaGVuZCh0LCBlLCBpKSxcbiAgICAgICAgICBhID0gdGhpcy5fem9vbU91dC50b3VjaGVuZCh0LCBlLCBpKTtcblxuICAgICAgcmV0dXJuIHIgPyAodGhpcy5fYWN0aXZlID0gITAsIHQucHJldmVudERlZmF1bHQoKSwgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBvLnJlc2V0KCk7XG4gICAgICB9LCAwKSwge1xuICAgICAgICBjYW1lcmFBbmltYXRpb246IGZ1bmN0aW9uIGNhbWVyYUFuaW1hdGlvbihlKSB7XG4gICAgICAgICAgcmV0dXJuIGUuZWFzZVRvKHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiAzMDAsXG4gICAgICAgICAgICB6b29tOiBlLmdldFpvb20oKSArIDEsXG4gICAgICAgICAgICBhcm91bmQ6IGUudW5wcm9qZWN0KHIpXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogdFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KSA6IGEgPyAodGhpcy5fYWN0aXZlID0gITAsIHQucHJldmVudERlZmF1bHQoKSwgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBvLnJlc2V0KCk7XG4gICAgICB9LCAwKSwge1xuICAgICAgICBjYW1lcmFBbmltYXRpb246IGZ1bmN0aW9uIGNhbWVyYUFuaW1hdGlvbihlKSB7XG4gICAgICAgICAgcmV0dXJuIGUuZWFzZVRvKHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiAzMDAsXG4gICAgICAgICAgICB6b29tOiBlLmdldFpvb20oKSAtIDEsXG4gICAgICAgICAgICBhcm91bmQ6IGUudW5wcm9qZWN0KGEpXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogdFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KSA6IHZvaWQgMDtcbiAgICB9LCBqby5wcm90b3R5cGUudG91Y2hjYW5jZWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfSwgam8ucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuX2VuYWJsZWQgPSAhMDtcbiAgICB9LCBqby5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuX2VuYWJsZWQgPSAhMSwgdGhpcy5yZXNldCgpO1xuICAgIH0sIGpvLnByb3RvdHlwZS5pc0VuYWJsZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZW5hYmxlZDtcbiAgICB9LCBqby5wcm90b3R5cGUuaXNBY3RpdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYWN0aXZlO1xuICAgIH07XG5cbiAgICB2YXIgVm8gPSB7XG4gICAgICAwOiAxLFxuICAgICAgMjogMlxuICAgIH0sXG4gICAgICAgIEdvID0gZnVuY3Rpb24gR28odCkge1xuICAgICAgdGhpcy5yZXNldCgpLCB0aGlzLl9jbGlja1RvbGVyYW5jZSA9IHQuY2xpY2tUb2xlcmFuY2UgfHwgMTtcbiAgICB9O1xuXG4gICAgR28ucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5fYWN0aXZlID0gITEsIHRoaXMuX21vdmVkID0gITEsIGRlbGV0ZSB0aGlzLl9sYXN0UG9pbnQsIGRlbGV0ZSB0aGlzLl9ldmVudEJ1dHRvbjtcbiAgICB9LCBHby5wcm90b3R5cGUuX2NvcnJlY3RCdXR0b24gPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgcmV0dXJuICExO1xuICAgIH0sIEdvLnByb3RvdHlwZS5fbW92ZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfSwgR28ucHJvdG90eXBlLm1vdXNlZG93biA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICBpZiAoIXRoaXMuX2xhc3RQb2ludCkge1xuICAgICAgICB2YXIgbyA9IGkubW91c2VCdXR0b24odCk7XG4gICAgICAgIHRoaXMuX2NvcnJlY3RCdXR0b24odCwgbykgJiYgKHRoaXMuX2xhc3RQb2ludCA9IGUsIHRoaXMuX2V2ZW50QnV0dG9uID0gbyk7XG4gICAgICB9XG4gICAgfSwgR28ucHJvdG90eXBlLm1vdXNlbW92ZVdpbmRvdyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB2YXIgaSA9IHRoaXMuX2xhc3RQb2ludDtcbiAgICAgIGlmIChpKSBpZiAodC5wcmV2ZW50RGVmYXVsdCgpLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICB2YXIgaSA9IFZvW2VdO1xuICAgICAgICByZXR1cm4gdm9pZCAwID09PSB0LmJ1dHRvbnMgfHwgKHQuYnV0dG9ucyAmIGkpICE9PSBpO1xuICAgICAgfSh0LCB0aGlzLl9ldmVudEJ1dHRvbikpIHRoaXMucmVzZXQoKTtlbHNlIGlmICh0aGlzLl9tb3ZlZCB8fCAhKGUuZGlzdChpKSA8IHRoaXMuX2NsaWNrVG9sZXJhbmNlKSkgcmV0dXJuIHRoaXMuX21vdmVkID0gITAsIHRoaXMuX2xhc3RQb2ludCA9IGUsIHRoaXMuX21vdmUoaSwgZSk7XG4gICAgfSwgR28ucHJvdG90eXBlLm1vdXNldXBXaW5kb3cgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdGhpcy5fbGFzdFBvaW50ICYmIGkubW91c2VCdXR0b24odCkgPT09IHRoaXMuX2V2ZW50QnV0dG9uICYmICh0aGlzLl9tb3ZlZCAmJiBpLnN1cHByZXNzQ2xpY2soKSwgdGhpcy5yZXNldCgpKTtcbiAgICB9LCBHby5wcm90b3R5cGUuZW5hYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5fZW5hYmxlZCA9ICEwO1xuICAgIH0sIEdvLnByb3RvdHlwZS5kaXNhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5fZW5hYmxlZCA9ICExLCB0aGlzLnJlc2V0KCk7XG4gICAgfSwgR28ucHJvdG90eXBlLmlzRW5hYmxlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9lbmFibGVkO1xuICAgIH0sIEdvLnByb3RvdHlwZS5pc0FjdGl2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9hY3RpdmU7XG4gICAgfTtcblxuICAgIHZhciBXbyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLm1vdXNlZG93biA9IGZ1bmN0aW9uIChlLCBpKSB7XG4gICAgICAgIHQucHJvdG90eXBlLm1vdXNlZG93bi5jYWxsKHRoaXMsIGUsIGkpLCB0aGlzLl9sYXN0UG9pbnQgJiYgKHRoaXMuX2FjdGl2ZSA9ICEwKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLl9jb3JyZWN0QnV0dG9uID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIDAgPT09IGUgJiYgIXQuY3RybEtleTtcbiAgICAgIH0sIGUucHJvdG90eXBlLl9tb3ZlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhcm91bmQ6IGUsXG4gICAgICAgICAgcGFuRGVsdGE6IGUuc3ViKHQpXG4gICAgICAgIH07XG4gICAgICB9LCBlO1xuICAgIH0oR28pLFxuICAgICAgICBYbyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLl9jb3JyZWN0QnV0dG9uID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIDAgPT09IGUgJiYgdC5jdHJsS2V5IHx8IDIgPT09IGU7XG4gICAgICB9LCBlLnByb3RvdHlwZS5fbW92ZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHZhciBpID0gLjggKiAoZS54IC0gdC54KTtcbiAgICAgICAgaWYgKGkpIHJldHVybiB0aGlzLl9hY3RpdmUgPSAhMCwge1xuICAgICAgICAgIGJlYXJpbmdEZWx0YTogaVxuICAgICAgICB9O1xuICAgICAgfSwgZS5wcm90b3R5cGUuY29udGV4dG1lbnUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9LCBlO1xuICAgIH0oR28pLFxuICAgICAgICBIbyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLl9jb3JyZWN0QnV0dG9uID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIDAgPT09IGUgJiYgdC5jdHJsS2V5IHx8IDIgPT09IGU7XG4gICAgICB9LCBlLnByb3RvdHlwZS5fbW92ZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHZhciBpID0gLS41ICogKGUueSAtIHQueSk7XG4gICAgICAgIGlmIChpKSByZXR1cm4gdGhpcy5fYWN0aXZlID0gITAsIHtcbiAgICAgICAgICBwaXRjaERlbHRhOiBpXG4gICAgICAgIH07XG4gICAgICB9LCBlLnByb3RvdHlwZS5jb250ZXh0bWVudSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH0sIGU7XG4gICAgfShHbyksXG4gICAgICAgIEtvID0gZnVuY3Rpb24gS28odCkge1xuICAgICAgdGhpcy5fbWluVG91Y2hlcyA9IDEsIHRoaXMuX2NsaWNrVG9sZXJhbmNlID0gdC5jbGlja1RvbGVyYW5jZSB8fCAxLCB0aGlzLnJlc2V0KCk7XG4gICAgfTtcblxuICAgIEtvLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuX2FjdGl2ZSA9ICExLCB0aGlzLl90b3VjaGVzID0ge30sIHRoaXMuX3N1bSA9IG5ldyB0LlBvaW50KDAsIDApO1xuICAgIH0sIEtvLnByb3RvdHlwZS50b3VjaHN0YXJ0ID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9jYWxjdWxhdGVUcmFuc2Zvcm0odCwgZSwgaSk7XG4gICAgfSwgS28ucHJvdG90eXBlLnRvdWNobW92ZSA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICBpZiAodGhpcy5fYWN0aXZlICYmICEoaS5sZW5ndGggPCB0aGlzLl9taW5Ub3VjaGVzKSkgcmV0dXJuIHQucHJldmVudERlZmF1bHQoKSwgdGhpcy5fY2FsY3VsYXRlVHJhbnNmb3JtKHQsIGUsIGkpO1xuICAgIH0sIEtvLnByb3RvdHlwZS50b3VjaGVuZCA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICB0aGlzLl9jYWxjdWxhdGVUcmFuc2Zvcm0odCwgZSwgaSksIHRoaXMuX2FjdGl2ZSAmJiBpLmxlbmd0aCA8IHRoaXMuX21pblRvdWNoZXMgJiYgdGhpcy5yZXNldCgpO1xuICAgIH0sIEtvLnByb3RvdHlwZS50b3VjaGNhbmNlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9LCBLby5wcm90b3R5cGUuX2NhbGN1bGF0ZVRyYW5zZm9ybSA9IGZ1bmN0aW9uIChlLCBpLCBvKSB7XG4gICAgICBvLmxlbmd0aCA+IDAgJiYgKHRoaXMuX2FjdGl2ZSA9ICEwKTtcbiAgICAgIHZhciByID0gTm8obywgaSksXG4gICAgICAgICAgYSA9IG5ldyB0LlBvaW50KDAsIDApLFxuICAgICAgICAgIG4gPSBuZXcgdC5Qb2ludCgwLCAwKSxcbiAgICAgICAgICBzID0gMDtcblxuICAgICAgZm9yICh2YXIgbCBpbiByKSB7XG4gICAgICAgIHZhciBjID0gcltsXSxcbiAgICAgICAgICAgIHUgPSB0aGlzLl90b3VjaGVzW2xdO1xuICAgICAgICB1ICYmIChhLl9hZGQoYyksIG4uX2FkZChjLnN1Yih1KSksIHMrKywgcltsXSA9IGMpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fdG91Y2hlcyA9IHIsICEocyA8IHRoaXMuX21pblRvdWNoZXMpICYmIG4ubWFnKCkpIHtcbiAgICAgICAgdmFyIGggPSBuLmRpdihzKTtcbiAgICAgICAgaWYgKHRoaXMuX3N1bS5fYWRkKGgpLCAhKHRoaXMuX3N1bS5tYWcoKSA8IHRoaXMuX2NsaWNrVG9sZXJhbmNlKSkgcmV0dXJuIHtcbiAgICAgICAgICBhcm91bmQ6IGEuZGl2KHMpLFxuICAgICAgICAgIHBhbkRlbHRhOiBoXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSwgS28ucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuX2VuYWJsZWQgPSAhMDtcbiAgICB9LCBLby5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuX2VuYWJsZWQgPSAhMSwgdGhpcy5yZXNldCgpO1xuICAgIH0sIEtvLnByb3RvdHlwZS5pc0VuYWJsZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZW5hYmxlZDtcbiAgICB9LCBLby5wcm90b3R5cGUuaXNBY3RpdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYWN0aXZlO1xuICAgIH07XG5cbiAgICB2YXIgWW8gPSBmdW5jdGlvbiBZbygpIHtcbiAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gSm8odCwgZSwgaSkge1xuICAgICAgZm9yICh2YXIgbyA9IDA7IG8gPCB0Lmxlbmd0aDsgbysrKSB7XG4gICAgICAgIGlmICh0W29dLmlkZW50aWZpZXIgPT09IGkpIHJldHVybiBlW29dO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIFFvKHQsIGUpIHtcbiAgICAgIHJldHVybiBNYXRoLmxvZyh0IC8gZSkgLyBNYXRoLkxOMjtcbiAgICB9XG5cbiAgICBZby5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLl9hY3RpdmUgPSAhMSwgZGVsZXRlIHRoaXMuX2ZpcnN0VHdvVG91Y2hlcztcbiAgICB9LCBZby5wcm90b3R5cGUuX3N0YXJ0ID0gZnVuY3Rpb24gKHQpIHt9LCBZby5wcm90b3R5cGUuX21vdmUgPSBmdW5jdGlvbiAodCwgZSwgaSkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH0sIFlvLnByb3RvdHlwZS50b3VjaHN0YXJ0ID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcbiAgICAgIHRoaXMuX2ZpcnN0VHdvVG91Y2hlcyB8fCBpLmxlbmd0aCA8IDIgfHwgKHRoaXMuX2ZpcnN0VHdvVG91Y2hlcyA9IFtpWzBdLmlkZW50aWZpZXIsIGlbMV0uaWRlbnRpZmllcl0sIHRoaXMuX3N0YXJ0KFtlWzBdLCBlWzFdXSkpO1xuICAgIH0sIFlvLnByb3RvdHlwZS50b3VjaG1vdmUgPSBmdW5jdGlvbiAodCwgZSwgaSkge1xuICAgICAgaWYgKHRoaXMuX2ZpcnN0VHdvVG91Y2hlcykge1xuICAgICAgICB0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHZhciBvID0gdGhpcy5fZmlyc3RUd29Ub3VjaGVzLFxuICAgICAgICAgICAgciA9IG9bMV0sXG4gICAgICAgICAgICBhID0gSm8oaSwgZSwgb1swXSksXG4gICAgICAgICAgICBuID0gSm8oaSwgZSwgcik7XG5cbiAgICAgICAgaWYgKGEgJiYgbikge1xuICAgICAgICAgIHZhciBzID0gdGhpcy5fYXJvdW5kQ2VudGVyID8gbnVsbCA6IGEuYWRkKG4pLmRpdigyKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fbW92ZShbYSwgbl0sIHMsIHQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgWW8ucHJvdG90eXBlLnRvdWNoZW5kID0gZnVuY3Rpb24gKHQsIGUsIG8pIHtcbiAgICAgIGlmICh0aGlzLl9maXJzdFR3b1RvdWNoZXMpIHtcbiAgICAgICAgdmFyIHIgPSB0aGlzLl9maXJzdFR3b1RvdWNoZXMsXG4gICAgICAgICAgICBhID0gclsxXSxcbiAgICAgICAgICAgIG4gPSBKbyhvLCBlLCByWzBdKSxcbiAgICAgICAgICAgIHMgPSBKbyhvLCBlLCBhKTtcbiAgICAgICAgbiAmJiBzIHx8ICh0aGlzLl9hY3RpdmUgJiYgaS5zdXBwcmVzc0NsaWNrKCksIHRoaXMucmVzZXQoKSk7XG4gICAgICB9XG4gICAgfSwgWW8ucHJvdG90eXBlLnRvdWNoY2FuY2VsID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH0sIFlvLnByb3RvdHlwZS5lbmFibGUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdGhpcy5fZW5hYmxlZCA9ICEwLCB0aGlzLl9hcm91bmRDZW50ZXIgPSAhIXQgJiYgXCJjZW50ZXJcIiA9PT0gdC5hcm91bmQ7XG4gICAgfSwgWW8ucHJvdG90eXBlLmRpc2FibGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLl9lbmFibGVkID0gITEsIHRoaXMucmVzZXQoKTtcbiAgICB9LCBZby5wcm90b3R5cGUuaXNFbmFibGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2VuYWJsZWQ7XG4gICAgfSwgWW8ucHJvdG90eXBlLmlzQWN0aXZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgICB9O1xuXG4gICAgdmFyICRvID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHQucHJvdG90eXBlLnJlc2V0LmNhbGwodGhpcyksIGRlbGV0ZSB0aGlzLl9kaXN0YW5jZSwgZGVsZXRlIHRoaXMuX3N0YXJ0RGlzdGFuY2U7XG4gICAgICB9LCBlLnByb3RvdHlwZS5fc3RhcnQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB0aGlzLl9zdGFydERpc3RhbmNlID0gdGhpcy5fZGlzdGFuY2UgPSB0WzBdLmRpc3QodFsxXSk7XG4gICAgICB9LCBlLnByb3RvdHlwZS5fbW92ZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHZhciBpID0gdGhpcy5fZGlzdGFuY2U7XG4gICAgICAgIGlmICh0aGlzLl9kaXN0YW5jZSA9IHRbMF0uZGlzdCh0WzFdKSwgdGhpcy5fYWN0aXZlIHx8ICEoTWF0aC5hYnMoUW8odGhpcy5fZGlzdGFuY2UsIHRoaXMuX3N0YXJ0RGlzdGFuY2UpKSA8IC4xKSkgcmV0dXJuIHRoaXMuX2FjdGl2ZSA9ICEwLCB7XG4gICAgICAgICAgem9vbURlbHRhOiBRbyh0aGlzLl9kaXN0YW5jZSwgaSksXG4gICAgICAgICAgcGluY2hBcm91bmQ6IGVcbiAgICAgICAgfTtcbiAgICAgIH0sIGU7XG4gICAgfShZbyk7XG5cbiAgICBmdW5jdGlvbiB0cih0LCBlKSB7XG4gICAgICByZXR1cm4gMTgwICogdC5hbmdsZVdpdGgoZSkgLyBNYXRoLlBJO1xuICAgIH1cblxuICAgIHZhciBlciA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0LnByb3RvdHlwZS5yZXNldC5jYWxsKHRoaXMpLCBkZWxldGUgdGhpcy5fbWluRGlhbWV0ZXIsIGRlbGV0ZSB0aGlzLl9zdGFydFZlY3RvciwgZGVsZXRlIHRoaXMuX3ZlY3RvcjtcbiAgICAgIH0sIGUucHJvdG90eXBlLl9zdGFydCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHRoaXMuX3N0YXJ0VmVjdG9yID0gdGhpcy5fdmVjdG9yID0gdFswXS5zdWIodFsxXSksIHRoaXMuX21pbkRpYW1ldGVyID0gdFswXS5kaXN0KHRbMV0pO1xuICAgICAgfSwgZS5wcm90b3R5cGUuX21vdmUgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICB2YXIgaSA9IHRoaXMuX3ZlY3RvcjtcbiAgICAgICAgaWYgKHRoaXMuX3ZlY3RvciA9IHRbMF0uc3ViKHRbMV0pLCB0aGlzLl9hY3RpdmUgfHwgIXRoaXMuX2lzQmVsb3dUaHJlc2hvbGQodGhpcy5fdmVjdG9yKSkgcmV0dXJuIHRoaXMuX2FjdGl2ZSA9ICEwLCB7XG4gICAgICAgICAgYmVhcmluZ0RlbHRhOiB0cih0aGlzLl92ZWN0b3IsIGkpLFxuICAgICAgICAgIHBpbmNoQXJvdW5kOiBlXG4gICAgICAgIH07XG4gICAgICB9LCBlLnByb3RvdHlwZS5faXNCZWxvd1RocmVzaG9sZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHRoaXMuX21pbkRpYW1ldGVyID0gTWF0aC5taW4odGhpcy5fbWluRGlhbWV0ZXIsIHQubWFnKCkpO1xuICAgICAgICB2YXIgZSA9IDI1IC8gKE1hdGguUEkgKiB0aGlzLl9taW5EaWFtZXRlcikgKiAzNjAsXG4gICAgICAgICAgICBpID0gdHIodCwgdGhpcy5fc3RhcnRWZWN0b3IpO1xuICAgICAgICByZXR1cm4gTWF0aC5hYnMoaSkgPCBlO1xuICAgICAgfSwgZTtcbiAgICB9KFlvKTtcblxuICAgIGZ1bmN0aW9uIGlyKHQpIHtcbiAgICAgIHJldHVybiBNYXRoLmFicyh0LnkpID4gTWF0aC5hYnModC54KTtcbiAgICB9XG5cbiAgICB2YXIgb3IgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdC5wcm90b3R5cGUucmVzZXQuY2FsbCh0aGlzKSwgdGhpcy5fdmFsaWQgPSB2b2lkIDAsIGRlbGV0ZSB0aGlzLl9maXJzdE1vdmUsIGRlbGV0ZSB0aGlzLl9sYXN0UG9pbnRzO1xuICAgICAgfSwgZS5wcm90b3R5cGUuX3N0YXJ0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdGhpcy5fbGFzdFBvaW50cyA9IHQsIGlyKHRbMF0uc3ViKHRbMV0pKSAmJiAodGhpcy5fdmFsaWQgPSAhMSk7XG4gICAgICB9LCBlLnByb3RvdHlwZS5fbW92ZSA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICAgIHZhciBvID0gdFswXS5zdWIodGhpcy5fbGFzdFBvaW50c1swXSksXG4gICAgICAgICAgICByID0gdFsxXS5zdWIodGhpcy5fbGFzdFBvaW50c1sxXSk7XG4gICAgICAgIGlmICh0aGlzLl92YWxpZCA9IHRoaXMuZ2VzdHVyZUJlZ2luc1ZlcnRpY2FsbHkobywgciwgaS50aW1lU3RhbXApLCB0aGlzLl92YWxpZCkgcmV0dXJuIHRoaXMuX2xhc3RQb2ludHMgPSB0LCB0aGlzLl9hY3RpdmUgPSAhMCwge1xuICAgICAgICAgIHBpdGNoRGVsdGE6IChvLnkgKyByLnkpIC8gMiAqIC0uNVxuICAgICAgICB9O1xuICAgICAgfSwgZS5wcm90b3R5cGUuZ2VzdHVyZUJlZ2luc1ZlcnRpY2FsbHkgPSBmdW5jdGlvbiAodCwgZSwgaSkge1xuICAgICAgICBpZiAodm9pZCAwICE9PSB0aGlzLl92YWxpZCkgcmV0dXJuIHRoaXMuX3ZhbGlkO1xuICAgICAgICB2YXIgbyA9IHQubWFnKCkgPj0gMixcbiAgICAgICAgICAgIHIgPSBlLm1hZygpID49IDI7XG5cbiAgICAgICAgaWYgKG8gfHwgcikge1xuICAgICAgICAgIGlmICghbyB8fCAhcikgcmV0dXJuIHZvaWQgMCA9PT0gdGhpcy5fZmlyc3RNb3ZlICYmICh0aGlzLl9maXJzdE1vdmUgPSBpKSwgaSAtIHRoaXMuX2ZpcnN0TW92ZSA8IDEwMCAmJiB2b2lkIDA7XG4gICAgICAgICAgdmFyIGEgPSB0LnkgPiAwID09IGUueSA+IDA7XG4gICAgICAgICAgcmV0dXJuIGlyKHQpICYmIGlyKGUpICYmIGE7XG4gICAgICAgIH1cbiAgICAgIH0sIGU7XG4gICAgfShZbyksXG4gICAgICAgIHJyID0ge1xuICAgICAgcGFuU3RlcDogMTAwLFxuICAgICAgYmVhcmluZ1N0ZXA6IDE1LFxuICAgICAgcGl0Y2hTdGVwOiAxMFxuICAgIH0sXG4gICAgICAgIGFyID0gZnVuY3Rpb24gYXIoKSB7XG4gICAgICB2YXIgdCA9IHJyO1xuICAgICAgdGhpcy5fcGFuU3RlcCA9IHQucGFuU3RlcCwgdGhpcy5fYmVhcmluZ1N0ZXAgPSB0LmJlYXJpbmdTdGVwLCB0aGlzLl9waXRjaFN0ZXAgPSB0LnBpdGNoU3RlcCwgdGhpcy5fcm90YXRpb25EaXNhYmxlZCA9ICExO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBucih0KSB7XG4gICAgICByZXR1cm4gdCAqICgyIC0gdCk7XG4gICAgfVxuXG4gICAgYXIucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5fYWN0aXZlID0gITE7XG4gICAgfSwgYXIucHJvdG90eXBlLmtleWRvd24gPSBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGUgPSB0aGlzO1xuXG4gICAgICBpZiAoISh0LmFsdEtleSB8fCB0LmN0cmxLZXkgfHwgdC5tZXRhS2V5KSkge1xuICAgICAgICB2YXIgaSA9IDAsXG4gICAgICAgICAgICBvID0gMCxcbiAgICAgICAgICAgIHIgPSAwLFxuICAgICAgICAgICAgYSA9IDAsXG4gICAgICAgICAgICBuID0gMDtcblxuICAgICAgICBzd2l0Y2ggKHQua2V5Q29kZSkge1xuICAgICAgICAgIGNhc2UgNjE6XG4gICAgICAgICAgY2FzZSAxMDc6XG4gICAgICAgICAgY2FzZSAxNzE6XG4gICAgICAgICAgY2FzZSAxODc6XG4gICAgICAgICAgICBpID0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAxODk6XG4gICAgICAgICAgY2FzZSAxMDk6XG4gICAgICAgICAgY2FzZSAxNzM6XG4gICAgICAgICAgICBpID0gLTE7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMzc6XG4gICAgICAgICAgICB0LnNoaWZ0S2V5ID8gbyA9IC0xIDogKHQucHJldmVudERlZmF1bHQoKSwgYSA9IC0xKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAzOTpcbiAgICAgICAgICAgIHQuc2hpZnRLZXkgPyBvID0gMSA6ICh0LnByZXZlbnREZWZhdWx0KCksIGEgPSAxKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAzODpcbiAgICAgICAgICAgIHQuc2hpZnRLZXkgPyByID0gMSA6ICh0LnByZXZlbnREZWZhdWx0KCksIG4gPSAtMSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgNDA6XG4gICAgICAgICAgICB0LnNoaWZ0S2V5ID8gciA9IC0xIDogKHQucHJldmVudERlZmF1bHQoKSwgbiA9IDEpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3JvdGF0aW9uRGlzYWJsZWQgJiYgKG8gPSAwLCByID0gMCksIHtcbiAgICAgICAgICBjYW1lcmFBbmltYXRpb246IGZ1bmN0aW9uIGNhbWVyYUFuaW1hdGlvbihzKSB7XG4gICAgICAgICAgICB2YXIgbCA9IHMuZ2V0Wm9vbSgpO1xuICAgICAgICAgICAgcy5lYXNlVG8oe1xuICAgICAgICAgICAgICBkdXJhdGlvbjogMzAwLFxuICAgICAgICAgICAgICBlYXNlSWQ6IFwia2V5Ym9hcmRIYW5kbGVyXCIsXG4gICAgICAgICAgICAgIGVhc2luZzogbnIsXG4gICAgICAgICAgICAgIHpvb206IGkgPyBNYXRoLnJvdW5kKGwpICsgaSAqICh0LnNoaWZ0S2V5ID8gMiA6IDEpIDogbCxcbiAgICAgICAgICAgICAgYmVhcmluZzogcy5nZXRCZWFyaW5nKCkgKyBvICogZS5fYmVhcmluZ1N0ZXAsXG4gICAgICAgICAgICAgIHBpdGNoOiBzLmdldFBpdGNoKCkgKyByICogZS5fcGl0Y2hTdGVwLFxuICAgICAgICAgICAgICBvZmZzZXQ6IFstYSAqIGUuX3BhblN0ZXAsIC1uICogZS5fcGFuU3RlcF0sXG4gICAgICAgICAgICAgIGNlbnRlcjogcy5nZXRDZW50ZXIoKVxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiB0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSwgYXIucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuX2VuYWJsZWQgPSAhMDtcbiAgICB9LCBhci5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuX2VuYWJsZWQgPSAhMSwgdGhpcy5yZXNldCgpO1xuICAgIH0sIGFyLnByb3RvdHlwZS5pc0VuYWJsZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZW5hYmxlZDtcbiAgICB9LCBhci5wcm90b3R5cGUuaXNBY3RpdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYWN0aXZlO1xuICAgIH0sIGFyLnByb3RvdHlwZS5kaXNhYmxlUm90YXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLl9yb3RhdGlvbkRpc2FibGVkID0gITA7XG4gICAgfSwgYXIucHJvdG90eXBlLmVuYWJsZVJvdGF0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5fcm90YXRpb25EaXNhYmxlZCA9ICExO1xuICAgIH07XG5cbiAgICB2YXIgc3IgPSBmdW5jdGlvbiBzcihlLCBpKSB7XG4gICAgICB0aGlzLl9tYXAgPSBlLCB0aGlzLl9lbCA9IGUuZ2V0Q2FudmFzQ29udGFpbmVyKCksIHRoaXMuX2hhbmRsZXIgPSBpLCB0aGlzLl9kZWx0YSA9IDAsIHRoaXMuX2RlZmF1bHRab29tUmF0ZSA9IC4wMSwgdGhpcy5fd2hlZWxab29tUmF0ZSA9IDEgLyA0NTAsIHQuYmluZEFsbChbXCJfb25UaW1lb3V0XCJdLCB0aGlzKTtcbiAgICB9O1xuXG4gICAgc3IucHJvdG90eXBlLnNldFpvb21SYXRlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHRoaXMuX2RlZmF1bHRab29tUmF0ZSA9IHQ7XG4gICAgfSwgc3IucHJvdG90eXBlLnNldFdoZWVsWm9vbVJhdGUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdGhpcy5fd2hlZWxab29tUmF0ZSA9IHQ7XG4gICAgfSwgc3IucHJvdG90eXBlLmlzRW5hYmxlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhIXRoaXMuX2VuYWJsZWQ7XG4gICAgfSwgc3IucHJvdG90eXBlLmlzQWN0aXZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICEhdGhpcy5fYWN0aXZlIHx8IHZvaWQgMCAhPT0gdGhpcy5fZmluaXNoVGltZW91dDtcbiAgICB9LCBzci5wcm90b3R5cGUuaXNab29taW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICEhdGhpcy5fem9vbWluZztcbiAgICB9LCBzci5wcm90b3R5cGUuZW5hYmxlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHRoaXMuaXNFbmFibGVkKCkgfHwgKHRoaXMuX2VuYWJsZWQgPSAhMCwgdGhpcy5fYXJvdW5kQ2VudGVyID0gdCAmJiBcImNlbnRlclwiID09PSB0LmFyb3VuZCk7XG4gICAgfSwgc3IucHJvdG90eXBlLmRpc2FibGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLmlzRW5hYmxlZCgpICYmICh0aGlzLl9lbmFibGVkID0gITEpO1xuICAgIH0sIHNyLnByb3RvdHlwZS53aGVlbCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAodGhpcy5pc0VuYWJsZWQoKSkge1xuICAgICAgICB2YXIgaSA9IGUuZGVsdGFNb2RlID09PSB0LndpbmRvdy5XaGVlbEV2ZW50LkRPTV9ERUxUQV9MSU5FID8gNDAgKiBlLmRlbHRhWSA6IGUuZGVsdGFZLFxuICAgICAgICAgICAgbyA9IHQuYnJvd3Nlci5ub3coKSxcbiAgICAgICAgICAgIHIgPSBvIC0gKHRoaXMuX2xhc3RXaGVlbEV2ZW50VGltZSB8fCAwKTtcbiAgICAgICAgdGhpcy5fbGFzdFdoZWVsRXZlbnRUaW1lID0gbywgMCAhPT0gaSAmJiBpICUgNC4wMDAyNDQxNDA2MjUgPT0gMCA/IHRoaXMuX3R5cGUgPSBcIndoZWVsXCIgOiAwICE9PSBpICYmIE1hdGguYWJzKGkpIDwgNCA/IHRoaXMuX3R5cGUgPSBcInRyYWNrcGFkXCIgOiByID4gNDAwID8gKHRoaXMuX3R5cGUgPSBudWxsLCB0aGlzLl9sYXN0VmFsdWUgPSBpLCB0aGlzLl90aW1lb3V0ID0gc2V0VGltZW91dCh0aGlzLl9vblRpbWVvdXQsIDQwLCBlKSkgOiB0aGlzLl90eXBlIHx8ICh0aGlzLl90eXBlID0gTWF0aC5hYnMociAqIGkpIDwgMjAwID8gXCJ0cmFja3BhZFwiIDogXCJ3aGVlbFwiLCB0aGlzLl90aW1lb3V0ICYmIChjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCksIHRoaXMuX3RpbWVvdXQgPSBudWxsLCBpICs9IHRoaXMuX2xhc3RWYWx1ZSkpLCBlLnNoaWZ0S2V5ICYmIGkgJiYgKGkgLz0gNCksIHRoaXMuX3R5cGUgJiYgKHRoaXMuX2xhc3RXaGVlbEV2ZW50ID0gZSwgdGhpcy5fZGVsdGEgLT0gaSwgdGhpcy5fYWN0aXZlIHx8IHRoaXMuX3N0YXJ0KGUpKSwgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH0sIHNyLnByb3RvdHlwZS5fb25UaW1lb3V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHRoaXMuX3R5cGUgPSBcIndoZWVsXCIsIHRoaXMuX2RlbHRhIC09IHRoaXMuX2xhc3RWYWx1ZSwgdGhpcy5fYWN0aXZlIHx8IHRoaXMuX3N0YXJ0KHQpO1xuICAgIH0sIHNyLnByb3RvdHlwZS5fc3RhcnQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKHRoaXMuX2RlbHRhKSB7XG4gICAgICAgIHRoaXMuX2ZyYW1lSWQgJiYgKHRoaXMuX2ZyYW1lSWQgPSBudWxsKSwgdGhpcy5fYWN0aXZlID0gITAsIHRoaXMuaXNab29taW5nKCkgfHwgKHRoaXMuX3pvb21pbmcgPSAhMCksIHRoaXMuX2ZpbmlzaFRpbWVvdXQgJiYgKGNsZWFyVGltZW91dCh0aGlzLl9maW5pc2hUaW1lb3V0KSwgZGVsZXRlIHRoaXMuX2ZpbmlzaFRpbWVvdXQpO1xuICAgICAgICB2YXIgbyA9IGkubW91c2VQb3ModGhpcy5fZWwsIGUpO1xuICAgICAgICB0aGlzLl9hcm91bmQgPSB0LkxuZ0xhdC5jb252ZXJ0KHRoaXMuX2Fyb3VuZENlbnRlciA/IHRoaXMuX21hcC5nZXRDZW50ZXIoKSA6IHRoaXMuX21hcC51bnByb2plY3QobykpLCB0aGlzLl9hcm91bmRQb2ludCA9IHRoaXMuX21hcC50cmFuc2Zvcm0ubG9jYXRpb25Qb2ludCh0aGlzLl9hcm91bmQpLCB0aGlzLl9mcmFtZUlkIHx8ICh0aGlzLl9mcmFtZUlkID0gITAsIHRoaXMuX2hhbmRsZXIuX3RyaWdnZXJSZW5kZXJGcmFtZSgpKTtcbiAgICAgIH1cbiAgICB9LCBzci5wcm90b3R5cGUucmVuZGVyRnJhbWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgZSA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLl9mcmFtZUlkICYmICh0aGlzLl9mcmFtZUlkID0gbnVsbCwgdGhpcy5pc0FjdGl2ZSgpKSkge1xuICAgICAgICB2YXIgaSA9IHRoaXMuX21hcC50cmFuc2Zvcm07XG5cbiAgICAgICAgaWYgKDAgIT09IHRoaXMuX2RlbHRhKSB7XG4gICAgICAgICAgdmFyIG8gPSBcIndoZWVsXCIgPT09IHRoaXMuX3R5cGUgJiYgTWF0aC5hYnModGhpcy5fZGVsdGEpID4gNC4wMDAyNDQxNDA2MjUgPyB0aGlzLl93aGVlbFpvb21SYXRlIDogdGhpcy5fZGVmYXVsdFpvb21SYXRlLFxuICAgICAgICAgICAgICByID0gMiAvICgxICsgTWF0aC5leHAoLU1hdGguYWJzKHRoaXMuX2RlbHRhICogbykpKTtcbiAgICAgICAgICB0aGlzLl9kZWx0YSA8IDAgJiYgMCAhPT0gciAmJiAociA9IDEgLyByKTtcbiAgICAgICAgICB2YXIgYSA9IFwibnVtYmVyXCIgPT0gdHlwZW9mIHRoaXMuX3RhcmdldFpvb20gPyBpLnpvb21TY2FsZSh0aGlzLl90YXJnZXRab29tKSA6IGkuc2NhbGU7XG4gICAgICAgICAgdGhpcy5fdGFyZ2V0Wm9vbSA9IE1hdGgubWluKGkubWF4Wm9vbSwgTWF0aC5tYXgoaS5taW5ab29tLCBpLnNjYWxlWm9vbShhICogcikpKSwgXCJ3aGVlbFwiID09PSB0aGlzLl90eXBlICYmICh0aGlzLl9zdGFydFpvb20gPSBpLnpvb20sIHRoaXMuX2Vhc2luZyA9IHRoaXMuX3Ntb290aE91dEVhc2luZygyMDApKSwgdGhpcy5fZGVsdGEgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG4sXG4gICAgICAgICAgICBzID0gXCJudW1iZXJcIiA9PSB0eXBlb2YgdGhpcy5fdGFyZ2V0Wm9vbSA/IHRoaXMuX3RhcmdldFpvb20gOiBpLnpvb20sXG4gICAgICAgICAgICBsID0gdGhpcy5fc3RhcnRab29tLFxuICAgICAgICAgICAgYyA9IHRoaXMuX2Vhc2luZyxcbiAgICAgICAgICAgIHUgPSAhMTtcblxuICAgICAgICBpZiAoXCJ3aGVlbFwiID09PSB0aGlzLl90eXBlICYmIGwgJiYgYykge1xuICAgICAgICAgIHZhciBoID0gTWF0aC5taW4oKHQuYnJvd3Nlci5ub3coKSAtIHRoaXMuX2xhc3RXaGVlbEV2ZW50VGltZSkgLyAyMDAsIDEpLFxuICAgICAgICAgICAgICBwID0gYyhoKTtcbiAgICAgICAgICBuID0gdC5udW1iZXIobCwgcywgcCksIGggPCAxID8gdGhpcy5fZnJhbWVJZCB8fCAodGhpcy5fZnJhbWVJZCA9ICEwKSA6IHUgPSAhMDtcbiAgICAgICAgfSBlbHNlIG4gPSBzLCB1ID0gITA7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZSA9ICEwLCB1ICYmICh0aGlzLl9hY3RpdmUgPSAhMSwgdGhpcy5fZmluaXNoVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGUuX3pvb21pbmcgPSAhMSwgZS5faGFuZGxlci5fdHJpZ2dlclJlbmRlckZyYW1lKCksIGRlbGV0ZSBlLl90YXJnZXRab29tLCBkZWxldGUgZS5fZmluaXNoVGltZW91dDtcbiAgICAgICAgfSwgMjAwKSksIHtcbiAgICAgICAgICBub0luZXJ0aWE6ICEwLFxuICAgICAgICAgIG5lZWRzUmVuZGVyRnJhbWU6ICF1LFxuICAgICAgICAgIHpvb21EZWx0YTogbiAtIGkuem9vbSxcbiAgICAgICAgICBhcm91bmQ6IHRoaXMuX2Fyb3VuZFBvaW50LFxuICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IHRoaXMuX2xhc3RXaGVlbEV2ZW50XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSwgc3IucHJvdG90eXBlLl9zbW9vdGhPdXRFYXNpbmcgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIGkgPSB0LmVhc2U7XG5cbiAgICAgIGlmICh0aGlzLl9wcmV2RWFzZSkge1xuICAgICAgICB2YXIgbyA9IHRoaXMuX3ByZXZFYXNlLFxuICAgICAgICAgICAgciA9ICh0LmJyb3dzZXIubm93KCkgLSBvLnN0YXJ0KSAvIG8uZHVyYXRpb24sXG4gICAgICAgICAgICBhID0gby5lYXNpbmcociArIC4wMSkgLSBvLmVhc2luZyhyKSxcbiAgICAgICAgICAgIG4gPSAuMjcgLyBNYXRoLnNxcnQoYSAqIGEgKyAxZS00KSAqIC4wMSxcbiAgICAgICAgICAgIHMgPSBNYXRoLnNxcnQoLjA3MjkgLSBuICogbik7XG4gICAgICAgIGkgPSB0LmJlemllcihuLCBzLCAuMjUsIDEpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5fcHJldkVhc2UgPSB7XG4gICAgICAgIHN0YXJ0OiB0LmJyb3dzZXIubm93KCksXG4gICAgICAgIGR1cmF0aW9uOiBlLFxuICAgICAgICBlYXNpbmc6IGlcbiAgICAgIH0sIGk7XG4gICAgfSwgc3IucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5fYWN0aXZlID0gITE7XG4gICAgfTtcblxuICAgIHZhciBsciA9IGZ1bmN0aW9uIGxyKHQsIGUpIHtcbiAgICAgIHRoaXMuX2NsaWNrWm9vbSA9IHQsIHRoaXMuX3RhcFpvb20gPSBlO1xuICAgIH07XG5cbiAgICBsci5wcm90b3R5cGUuZW5hYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5fY2xpY2tab29tLmVuYWJsZSgpLCB0aGlzLl90YXBab29tLmVuYWJsZSgpO1xuICAgIH0sIGxyLnByb3RvdHlwZS5kaXNhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5fY2xpY2tab29tLmRpc2FibGUoKSwgdGhpcy5fdGFwWm9vbS5kaXNhYmxlKCk7XG4gICAgfSwgbHIucHJvdG90eXBlLmlzRW5hYmxlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9jbGlja1pvb20uaXNFbmFibGVkKCkgJiYgdGhpcy5fdGFwWm9vbS5pc0VuYWJsZWQoKTtcbiAgICB9LCBsci5wcm90b3R5cGUuaXNBY3RpdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY2xpY2tab29tLmlzQWN0aXZlKCkgfHwgdGhpcy5fdGFwWm9vbS5pc0FjdGl2ZSgpO1xuICAgIH07XG5cbiAgICB2YXIgY3IgPSBmdW5jdGlvbiBjcigpIHtcbiAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9O1xuXG4gICAgY3IucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5fYWN0aXZlID0gITE7XG4gICAgfSwgY3IucHJvdG90eXBlLmRibGNsaWNrID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHJldHVybiB0LnByZXZlbnREZWZhdWx0KCksIHtcbiAgICAgICAgY2FtZXJhQW5pbWF0aW9uOiBmdW5jdGlvbiBjYW1lcmFBbmltYXRpb24oaSkge1xuICAgICAgICAgIGkuZWFzZVRvKHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiAzMDAsXG4gICAgICAgICAgICB6b29tOiBpLmdldFpvb20oKSArICh0LnNoaWZ0S2V5ID8gLTEgOiAxKSxcbiAgICAgICAgICAgIGFyb3VuZDogaS51bnByb2plY3QoZSlcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiB0XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSwgY3IucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuX2VuYWJsZWQgPSAhMDtcbiAgICB9LCBjci5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuX2VuYWJsZWQgPSAhMSwgdGhpcy5yZXNldCgpO1xuICAgIH0sIGNyLnByb3RvdHlwZS5pc0VuYWJsZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZW5hYmxlZDtcbiAgICB9LCBjci5wcm90b3R5cGUuaXNBY3RpdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYWN0aXZlO1xuICAgIH07XG5cbiAgICB2YXIgdXIgPSBmdW5jdGlvbiB1cigpIHtcbiAgICAgIHRoaXMuX3RhcCA9IG5ldyBxbyh7XG4gICAgICAgIG51bVRvdWNoZXM6IDEsXG4gICAgICAgIG51bVRhcHM6IDFcbiAgICAgIH0pLCB0aGlzLnJlc2V0KCk7XG4gICAgfTtcblxuICAgIHVyLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuX2FjdGl2ZSA9ICExLCBkZWxldGUgdGhpcy5fc3dpcGVQb2ludCwgZGVsZXRlIHRoaXMuX3N3aXBlVG91Y2gsIGRlbGV0ZSB0aGlzLl90YXBUaW1lLCB0aGlzLl90YXAucmVzZXQoKTtcbiAgICB9LCB1ci5wcm90b3R5cGUudG91Y2hzdGFydCA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICB0aGlzLl9zd2lwZVBvaW50IHx8ICh0aGlzLl90YXBUaW1lICYmIHQudGltZVN0YW1wIC0gdGhpcy5fdGFwVGltZSA+IDUwMCAmJiB0aGlzLnJlc2V0KCksIHRoaXMuX3RhcFRpbWUgPyBpLmxlbmd0aCA+IDAgJiYgKHRoaXMuX3N3aXBlUG9pbnQgPSBlWzBdLCB0aGlzLl9zd2lwZVRvdWNoID0gaVswXS5pZGVudGlmaWVyKSA6IHRoaXMuX3RhcC50b3VjaHN0YXJ0KHQsIGUsIGkpKTtcbiAgICB9LCB1ci5wcm90b3R5cGUudG91Y2htb3ZlID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcbiAgICAgIGlmICh0aGlzLl90YXBUaW1lKSB7XG4gICAgICAgIGlmICh0aGlzLl9zd2lwZVBvaW50KSB7XG4gICAgICAgICAgaWYgKGlbMF0uaWRlbnRpZmllciAhPT0gdGhpcy5fc3dpcGVUb3VjaCkgcmV0dXJuO1xuICAgICAgICAgIHZhciBvID0gZVswXSxcbiAgICAgICAgICAgICAgciA9IG8ueSAtIHRoaXMuX3N3aXBlUG9pbnQueTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fc3dpcGVQb2ludCA9IG8sIHQucHJldmVudERlZmF1bHQoKSwgdGhpcy5fYWN0aXZlID0gITAsIHtcbiAgICAgICAgICAgIHpvb21EZWx0YTogciAvIDEyOFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB0aGlzLl90YXAudG91Y2htb3ZlKHQsIGUsIGkpO1xuICAgIH0sIHVyLnByb3RvdHlwZS50b3VjaGVuZCA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICB0aGlzLl90YXBUaW1lID8gdGhpcy5fc3dpcGVQb2ludCAmJiAwID09PSBpLmxlbmd0aCAmJiB0aGlzLnJlc2V0KCkgOiB0aGlzLl90YXAudG91Y2hlbmQodCwgZSwgaSkgJiYgKHRoaXMuX3RhcFRpbWUgPSB0LnRpbWVTdGFtcCk7XG4gICAgfSwgdXIucHJvdG90eXBlLnRvdWNoY2FuY2VsID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH0sIHVyLnByb3RvdHlwZS5lbmFibGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLl9lbmFibGVkID0gITA7XG4gICAgfSwgdXIucHJvdG90eXBlLmRpc2FibGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLl9lbmFibGVkID0gITEsIHRoaXMucmVzZXQoKTtcbiAgICB9LCB1ci5wcm90b3R5cGUuaXNFbmFibGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2VuYWJsZWQ7XG4gICAgfSwgdXIucHJvdG90eXBlLmlzQWN0aXZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgICB9O1xuXG4gICAgdmFyIGhyID0gZnVuY3Rpb24gaHIodCwgZSwgaSkge1xuICAgICAgdGhpcy5fZWwgPSB0LCB0aGlzLl9tb3VzZVBhbiA9IGUsIHRoaXMuX3RvdWNoUGFuID0gaTtcbiAgICB9O1xuXG4gICAgaHIucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0aGlzLl9pbmVydGlhT3B0aW9ucyA9IHQgfHwge30sIHRoaXMuX21vdXNlUGFuLmVuYWJsZSgpLCB0aGlzLl90b3VjaFBhbi5lbmFibGUoKSwgdGhpcy5fZWwuY2xhc3NMaXN0LmFkZChcIm1hcGJveGdsLXRvdWNoLWRyYWctcGFuXCIpO1xuICAgIH0sIGhyLnByb3RvdHlwZS5kaXNhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5fbW91c2VQYW4uZGlzYWJsZSgpLCB0aGlzLl90b3VjaFBhbi5kaXNhYmxlKCksIHRoaXMuX2VsLmNsYXNzTGlzdC5yZW1vdmUoXCJtYXBib3hnbC10b3VjaC1kcmFnLXBhblwiKTtcbiAgICB9LCBoci5wcm90b3R5cGUuaXNFbmFibGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX21vdXNlUGFuLmlzRW5hYmxlZCgpICYmIHRoaXMuX3RvdWNoUGFuLmlzRW5hYmxlZCgpO1xuICAgIH0sIGhyLnByb3RvdHlwZS5pc0FjdGl2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9tb3VzZVBhbi5pc0FjdGl2ZSgpIHx8IHRoaXMuX3RvdWNoUGFuLmlzQWN0aXZlKCk7XG4gICAgfTtcblxuICAgIHZhciBwciA9IGZ1bmN0aW9uIHByKHQsIGUsIGkpIHtcbiAgICAgIHRoaXMuX3BpdGNoV2l0aFJvdGF0ZSA9IHQucGl0Y2hXaXRoUm90YXRlLCB0aGlzLl9tb3VzZVJvdGF0ZSA9IGUsIHRoaXMuX21vdXNlUGl0Y2ggPSBpO1xuICAgIH07XG5cbiAgICBwci5wcm90b3R5cGUuZW5hYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5fbW91c2VSb3RhdGUuZW5hYmxlKCksIHRoaXMuX3BpdGNoV2l0aFJvdGF0ZSAmJiB0aGlzLl9tb3VzZVBpdGNoLmVuYWJsZSgpO1xuICAgIH0sIHByLnByb3RvdHlwZS5kaXNhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5fbW91c2VSb3RhdGUuZGlzYWJsZSgpLCB0aGlzLl9tb3VzZVBpdGNoLmRpc2FibGUoKTtcbiAgICB9LCBwci5wcm90b3R5cGUuaXNFbmFibGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX21vdXNlUm90YXRlLmlzRW5hYmxlZCgpICYmICghdGhpcy5fcGl0Y2hXaXRoUm90YXRlIHx8IHRoaXMuX21vdXNlUGl0Y2guaXNFbmFibGVkKCkpO1xuICAgIH0sIHByLnByb3RvdHlwZS5pc0FjdGl2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9tb3VzZVJvdGF0ZS5pc0FjdGl2ZSgpIHx8IHRoaXMuX21vdXNlUGl0Y2guaXNBY3RpdmUoKTtcbiAgICB9O1xuXG4gICAgdmFyIGRyID0gZnVuY3Rpb24gZHIodCwgZSwgaSwgbykge1xuICAgICAgdGhpcy5fZWwgPSB0LCB0aGlzLl90b3VjaFpvb20gPSBlLCB0aGlzLl90b3VjaFJvdGF0ZSA9IGksIHRoaXMuX3RhcERyYWdab29tID0gbywgdGhpcy5fcm90YXRpb25EaXNhYmxlZCA9ICExLCB0aGlzLl9lbmFibGVkID0gITA7XG4gICAgfTtcblxuICAgIGRyLnByb3RvdHlwZS5lbmFibGUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdGhpcy5fdG91Y2hab29tLmVuYWJsZSh0KSwgdGhpcy5fcm90YXRpb25EaXNhYmxlZCB8fCB0aGlzLl90b3VjaFJvdGF0ZS5lbmFibGUodCksIHRoaXMuX3RhcERyYWdab29tLmVuYWJsZSgpLCB0aGlzLl9lbC5jbGFzc0xpc3QuYWRkKFwibWFwYm94Z2wtdG91Y2gtem9vbS1yb3RhdGVcIik7XG4gICAgfSwgZHIucHJvdG90eXBlLmRpc2FibGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLl90b3VjaFpvb20uZGlzYWJsZSgpLCB0aGlzLl90b3VjaFJvdGF0ZS5kaXNhYmxlKCksIHRoaXMuX3RhcERyYWdab29tLmRpc2FibGUoKSwgdGhpcy5fZWwuY2xhc3NMaXN0LnJlbW92ZShcIm1hcGJveGdsLXRvdWNoLXpvb20tcm90YXRlXCIpO1xuICAgIH0sIGRyLnByb3RvdHlwZS5pc0VuYWJsZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdG91Y2hab29tLmlzRW5hYmxlZCgpICYmICh0aGlzLl9yb3RhdGlvbkRpc2FibGVkIHx8IHRoaXMuX3RvdWNoUm90YXRlLmlzRW5hYmxlZCgpKSAmJiB0aGlzLl90YXBEcmFnWm9vbS5pc0VuYWJsZWQoKTtcbiAgICB9LCBkci5wcm90b3R5cGUuaXNBY3RpdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdG91Y2hab29tLmlzQWN0aXZlKCkgfHwgdGhpcy5fdG91Y2hSb3RhdGUuaXNBY3RpdmUoKSB8fCB0aGlzLl90YXBEcmFnWm9vbS5pc0FjdGl2ZSgpO1xuICAgIH0sIGRyLnByb3RvdHlwZS5kaXNhYmxlUm90YXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLl9yb3RhdGlvbkRpc2FibGVkID0gITAsIHRoaXMuX3RvdWNoUm90YXRlLmRpc2FibGUoKTtcbiAgICB9LCBkci5wcm90b3R5cGUuZW5hYmxlUm90YXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLl9yb3RhdGlvbkRpc2FibGVkID0gITEsIHRoaXMuX3RvdWNoWm9vbS5pc0VuYWJsZWQoKSAmJiB0aGlzLl90b3VjaFJvdGF0ZS5lbmFibGUoKTtcbiAgICB9O1xuXG4gICAgdmFyIF9yID0gZnVuY3Rpb24gX3IodCkge1xuICAgICAgcmV0dXJuIHQuem9vbSB8fCB0LmRyYWcgfHwgdC5waXRjaCB8fCB0LnJvdGF0ZTtcbiAgICB9LFxuICAgICAgICBmciA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGU7XG4gICAgfSh0LkV2ZW50KTtcblxuICAgIGZ1bmN0aW9uIG1yKHQpIHtcbiAgICAgIHJldHVybiB0LnBhbkRlbHRhICYmIHQucGFuRGVsdGEubWFnKCkgfHwgdC56b29tRGVsdGEgfHwgdC5iZWFyaW5nRGVsdGEgfHwgdC5waXRjaERlbHRhO1xuICAgIH1cblxuICAgIHZhciBnciA9IGZ1bmN0aW9uIGdyKGUsIG8pIHtcbiAgICAgIHRoaXMuX21hcCA9IGUsIHRoaXMuX2VsID0gdGhpcy5fbWFwLmdldENhbnZhc0NvbnRhaW5lcigpLCB0aGlzLl9oYW5kbGVycyA9IFtdLCB0aGlzLl9oYW5kbGVyc0J5SWQgPSB7fSwgdGhpcy5fY2hhbmdlcyA9IFtdLCB0aGlzLl9pbmVydGlhID0gbmV3IEFvKGUpLCB0aGlzLl9iZWFyaW5nU25hcCA9IG8uYmVhcmluZ1NuYXAsIHRoaXMuX3ByZXZpb3VzQWN0aXZlSGFuZGxlcnMgPSB7fSwgdGhpcy5fZXZlbnRzSW5Qcm9ncmVzcyA9IHt9LCB0aGlzLl9hZGREZWZhdWx0SGFuZGxlcnMobyksIHQuYmluZEFsbChbXCJoYW5kbGVFdmVudFwiLCBcImhhbmRsZVdpbmRvd0V2ZW50XCJdLCB0aGlzKTtcbiAgICAgIHZhciByID0gdGhpcy5fZWw7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMgPSBbW3IsIFwidG91Y2hzdGFydFwiLCB7XG4gICAgICAgIHBhc3NpdmU6ICEwXG4gICAgICB9XSwgW3IsIFwidG91Y2htb3ZlXCIsIHtcbiAgICAgICAgcGFzc2l2ZTogITFcbiAgICAgIH1dLCBbciwgXCJ0b3VjaGVuZFwiLCB2b2lkIDBdLCBbciwgXCJ0b3VjaGNhbmNlbFwiLCB2b2lkIDBdLCBbciwgXCJtb3VzZWRvd25cIiwgdm9pZCAwXSwgW3IsIFwibW91c2Vtb3ZlXCIsIHZvaWQgMF0sIFtyLCBcIm1vdXNldXBcIiwgdm9pZCAwXSwgW3Qud2luZG93LmRvY3VtZW50LCBcIm1vdXNlbW92ZVwiLCB7XG4gICAgICAgIGNhcHR1cmU6ICEwXG4gICAgICB9XSwgW3Qud2luZG93LmRvY3VtZW50LCBcIm1vdXNldXBcIiwgdm9pZCAwXSwgW3IsIFwibW91c2VvdmVyXCIsIHZvaWQgMF0sIFtyLCBcIm1vdXNlb3V0XCIsIHZvaWQgMF0sIFtyLCBcImRibGNsaWNrXCIsIHZvaWQgMF0sIFtyLCBcImNsaWNrXCIsIHZvaWQgMF0sIFtyLCBcImtleWRvd25cIiwge1xuICAgICAgICBjYXB0dXJlOiAhMVxuICAgICAgfV0sIFtyLCBcImtleXVwXCIsIHZvaWQgMF0sIFtyLCBcIndoZWVsXCIsIHtcbiAgICAgICAgcGFzc2l2ZTogITFcbiAgICAgIH1dLCBbciwgXCJjb250ZXh0bWVudVwiLCB2b2lkIDBdLCBbdC53aW5kb3csIFwiYmx1clwiLCB2b2lkIDBdXTtcblxuICAgICAgZm9yICh2YXIgYSA9IDAsIG4gPSB0aGlzLl9saXN0ZW5lcnM7IGEgPCBuLmxlbmd0aDsgYSArPSAxKSB7XG4gICAgICAgIHZhciBzID0gblthXSxcbiAgICAgICAgICAgIGwgPSBzWzBdO1xuICAgICAgICBpLmFkZEV2ZW50TGlzdGVuZXIobCwgc1sxXSwgbCA9PT0gdC53aW5kb3cuZG9jdW1lbnQgPyB0aGlzLmhhbmRsZVdpbmRvd0V2ZW50IDogdGhpcy5oYW5kbGVFdmVudCwgc1syXSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGdyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgZm9yICh2YXIgZSA9IDAsIG8gPSB0aGlzLl9saXN0ZW5lcnM7IGUgPCBvLmxlbmd0aDsgZSArPSAxKSB7XG4gICAgICAgIHZhciByID0gb1tlXSxcbiAgICAgICAgICAgIGEgPSByWzBdO1xuICAgICAgICBpLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSwgclsxXSwgYSA9PT0gdC53aW5kb3cuZG9jdW1lbnQgPyB0aGlzLmhhbmRsZVdpbmRvd0V2ZW50IDogdGhpcy5oYW5kbGVFdmVudCwgclsyXSk7XG4gICAgICB9XG4gICAgfSwgZ3IucHJvdG90eXBlLl9hZGREZWZhdWx0SGFuZGxlcnMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGUgPSB0aGlzLl9tYXAsXG4gICAgICAgICAgaSA9IGUuZ2V0Q2FudmFzQ29udGFpbmVyKCk7XG5cbiAgICAgIHRoaXMuX2FkZChcIm1hcEV2ZW50XCIsIG5ldyBPbyhlLCB0KSk7XG5cbiAgICAgIHZhciBvID0gZS5ib3hab29tID0gbmV3IFVvKGUsIHQpO1xuXG4gICAgICB0aGlzLl9hZGQoXCJib3hab29tXCIsIG8pO1xuXG4gICAgICB2YXIgciA9IG5ldyBqbygpLFxuICAgICAgICAgIGEgPSBuZXcgY3IoKTtcbiAgICAgIGUuZG91YmxlQ2xpY2tab29tID0gbmV3IGxyKGEsIHIpLCB0aGlzLl9hZGQoXCJ0YXBab29tXCIsIHIpLCB0aGlzLl9hZGQoXCJjbGlja1pvb21cIiwgYSk7XG4gICAgICB2YXIgbiA9IG5ldyB1cigpO1xuXG4gICAgICB0aGlzLl9hZGQoXCJ0YXBEcmFnWm9vbVwiLCBuKTtcblxuICAgICAgdmFyIHMgPSBlLnRvdWNoUGl0Y2ggPSBuZXcgb3IoKTtcblxuICAgICAgdGhpcy5fYWRkKFwidG91Y2hQaXRjaFwiLCBzKTtcblxuICAgICAgdmFyIGwgPSBuZXcgWG8odCksXG4gICAgICAgICAgYyA9IG5ldyBIbyh0KTtcbiAgICAgIGUuZHJhZ1JvdGF0ZSA9IG5ldyBwcih0LCBsLCBjKSwgdGhpcy5fYWRkKFwibW91c2VSb3RhdGVcIiwgbCwgW1wibW91c2VQaXRjaFwiXSksIHRoaXMuX2FkZChcIm1vdXNlUGl0Y2hcIiwgYywgW1wibW91c2VSb3RhdGVcIl0pO1xuICAgICAgdmFyIHUgPSBuZXcgV28odCksXG4gICAgICAgICAgaCA9IG5ldyBLbyh0KTtcbiAgICAgIGUuZHJhZ1BhbiA9IG5ldyBocihpLCB1LCBoKSwgdGhpcy5fYWRkKFwibW91c2VQYW5cIiwgdSksIHRoaXMuX2FkZChcInRvdWNoUGFuXCIsIGgsIFtcInRvdWNoWm9vbVwiLCBcInRvdWNoUm90YXRlXCJdKTtcbiAgICAgIHZhciBwID0gbmV3IGVyKCksXG4gICAgICAgICAgZCA9IG5ldyAkbygpO1xuICAgICAgZS50b3VjaFpvb21Sb3RhdGUgPSBuZXcgZHIoaSwgZCwgcCwgbiksIHRoaXMuX2FkZChcInRvdWNoUm90YXRlXCIsIHAsIFtcInRvdWNoUGFuXCIsIFwidG91Y2hab29tXCJdKSwgdGhpcy5fYWRkKFwidG91Y2hab29tXCIsIGQsIFtcInRvdWNoUGFuXCIsIFwidG91Y2hSb3RhdGVcIl0pO1xuXG4gICAgICB2YXIgXyA9IGUuc2Nyb2xsWm9vbSA9IG5ldyBzcihlLCB0aGlzKTtcblxuICAgICAgdGhpcy5fYWRkKFwic2Nyb2xsWm9vbVwiLCBfLCBbXCJtb3VzZVBhblwiXSk7XG5cbiAgICAgIHZhciBmID0gZS5rZXlib2FyZCA9IG5ldyBhcigpO1xuICAgICAgdGhpcy5fYWRkKFwia2V5Ym9hcmRcIiwgZiksIHRoaXMuX2FkZChcImJsb2NrYWJsZU1hcEV2ZW50XCIsIG5ldyBGbyhlKSk7XG5cbiAgICAgIGZvciAodmFyIG0gPSAwLCBnID0gW1wiYm94Wm9vbVwiLCBcImRvdWJsZUNsaWNrWm9vbVwiLCBcInRhcERyYWdab29tXCIsIFwidG91Y2hQaXRjaFwiLCBcImRyYWdSb3RhdGVcIiwgXCJkcmFnUGFuXCIsIFwidG91Y2hab29tUm90YXRlXCIsIFwic2Nyb2xsWm9vbVwiLCBcImtleWJvYXJkXCJdOyBtIDwgZy5sZW5ndGg7IG0gKz0gMSkge1xuICAgICAgICB2YXIgdiA9IGdbbV07XG4gICAgICAgIHQuaW50ZXJhY3RpdmUgJiYgdFt2XSAmJiBlW3ZdLmVuYWJsZSh0W3ZdKTtcbiAgICAgIH1cbiAgICB9LCBnci5wcm90b3R5cGUuX2FkZCA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICB0aGlzLl9oYW5kbGVycy5wdXNoKHtcbiAgICAgICAgaGFuZGxlck5hbWU6IHQsXG4gICAgICAgIGhhbmRsZXI6IGUsXG4gICAgICAgIGFsbG93ZWQ6IGlcbiAgICAgIH0pLCB0aGlzLl9oYW5kbGVyc0J5SWRbdF0gPSBlO1xuICAgIH0sIGdyLnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGlmICghdGhpcy5fdXBkYXRpbmdDYW1lcmEpIHtcbiAgICAgICAgZm9yICh2YXIgZSA9IDAsIGkgPSB0aGlzLl9oYW5kbGVyczsgZSA8IGkubGVuZ3RoOyBlICs9IDEpIHtcbiAgICAgICAgICBpW2VdLmhhbmRsZXIucmVzZXQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2luZXJ0aWEuY2xlYXIoKSwgdGhpcy5fZmlyZUV2ZW50cyh7fSwge30sIHQpLCB0aGlzLl9jaGFuZ2VzID0gW107XG4gICAgICB9XG4gICAgfSwgZ3IucHJvdG90eXBlLmlzQWN0aXZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgZm9yICh2YXIgdCA9IDAsIGUgPSB0aGlzLl9oYW5kbGVyczsgdCA8IGUubGVuZ3RoOyB0ICs9IDEpIHtcbiAgICAgICAgaWYgKGVbdF0uaGFuZGxlci5pc0FjdGl2ZSgpKSByZXR1cm4gITA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAhMTtcbiAgICB9LCBnci5wcm90b3R5cGUuaXNab29taW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICEhdGhpcy5fZXZlbnRzSW5Qcm9ncmVzcy56b29tIHx8IHRoaXMuX21hcC5zY3JvbGxab29tLmlzWm9vbWluZygpO1xuICAgIH0sIGdyLnByb3RvdHlwZS5pc1JvdGF0aW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICEhdGhpcy5fZXZlbnRzSW5Qcm9ncmVzcy5yb3RhdGU7XG4gICAgfSwgZ3IucHJvdG90eXBlLmlzTW92aW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIEJvb2xlYW4oX3IodGhpcy5fZXZlbnRzSW5Qcm9ncmVzcykpIHx8IHRoaXMuaXNab29taW5nKCk7XG4gICAgfSwgZ3IucHJvdG90eXBlLl9ibG9ja2VkQnlBY3RpdmUgPSBmdW5jdGlvbiAodCwgZSwgaSkge1xuICAgICAgZm9yICh2YXIgbyBpbiB0KSB7XG4gICAgICAgIGlmIChvICE9PSBpICYmICghZSB8fCBlLmluZGV4T2YobykgPCAwKSkgcmV0dXJuICEwO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gITE7XG4gICAgfSwgZ3IucHJvdG90eXBlLmhhbmRsZVdpbmRvd0V2ZW50ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHRoaXMuaGFuZGxlRXZlbnQodCwgdC50eXBlICsgXCJXaW5kb3dcIik7XG4gICAgfSwgZ3IucHJvdG90eXBlLl9nZXRNYXBUb3VjaGVzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZvciAodmFyIGUgPSBbXSwgaSA9IDAsIG8gPSB0OyBpIDwgby5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB2YXIgciA9IG9baV07XG4gICAgICAgIHRoaXMuX2VsLmNvbnRhaW5zKHIudGFyZ2V0KSAmJiBlLnB1c2gocik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlO1xuICAgIH0sIGdyLnByb3RvdHlwZS5oYW5kbGVFdmVudCA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICBpZiAoXCJibHVyXCIgIT09IHQudHlwZSkge1xuICAgICAgICB0aGlzLl91cGRhdGluZ0NhbWVyYSA9ICEwO1xuXG4gICAgICAgIGZvciAodmFyIG8gPSBcInJlbmRlckZyYW1lXCIgPT09IHQudHlwZSA/IHZvaWQgMCA6IHQsIHIgPSB7XG4gICAgICAgICAgbmVlZHNSZW5kZXJGcmFtZTogITFcbiAgICAgICAgfSwgYSA9IHt9LCBuID0ge30sIHMgPSB0LnRvdWNoZXMgPyB0aGlzLl9nZXRNYXBUb3VjaGVzKHQudG91Y2hlcykgOiB2b2lkIDAsIGwgPSBzID8gaS50b3VjaFBvcyh0aGlzLl9lbCwgcykgOiBpLm1vdXNlUG9zKHRoaXMuX2VsLCB0KSwgYyA9IDAsIHUgPSB0aGlzLl9oYW5kbGVyczsgYyA8IHUubGVuZ3RoOyBjICs9IDEpIHtcbiAgICAgICAgICB2YXIgaCA9IHVbY10sXG4gICAgICAgICAgICAgIHAgPSBoLmhhbmRsZXJOYW1lLFxuICAgICAgICAgICAgICBkID0gaC5oYW5kbGVyLFxuICAgICAgICAgICAgICBfID0gaC5hbGxvd2VkO1xuXG4gICAgICAgICAgaWYgKGQuaXNFbmFibGVkKCkpIHtcbiAgICAgICAgICAgIHZhciBmID0gdm9pZCAwO1xuICAgICAgICAgICAgdGhpcy5fYmxvY2tlZEJ5QWN0aXZlKG4sIF8sIHApID8gZC5yZXNldCgpIDogZFtlIHx8IHQudHlwZV0gJiYgKGYgPSBkW2UgfHwgdC50eXBlXSh0LCBsLCBzKSwgdGhpcy5tZXJnZUhhbmRsZXJSZXN1bHQociwgYSwgZiwgcCwgbyksIGYgJiYgZi5uZWVkc1JlbmRlckZyYW1lICYmIHRoaXMuX3RyaWdnZXJSZW5kZXJGcmFtZSgpKSwgKGYgfHwgZC5pc0FjdGl2ZSgpKSAmJiAobltwXSA9IGQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBtID0ge307XG5cbiAgICAgICAgZm9yICh2YXIgZyBpbiB0aGlzLl9wcmV2aW91c0FjdGl2ZUhhbmRsZXJzKSB7XG4gICAgICAgICAgbltnXSB8fCAobVtnXSA9IG8pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcHJldmlvdXNBY3RpdmVIYW5kbGVycyA9IG4sIChPYmplY3Qua2V5cyhtKS5sZW5ndGggfHwgbXIocikpICYmICh0aGlzLl9jaGFuZ2VzLnB1c2goW3IsIGEsIG1dKSwgdGhpcy5fdHJpZ2dlclJlbmRlckZyYW1lKCkpLCAoT2JqZWN0LmtleXMobikubGVuZ3RoIHx8IG1yKHIpKSAmJiB0aGlzLl9tYXAuX3N0b3AoITApLCB0aGlzLl91cGRhdGluZ0NhbWVyYSA9ICExO1xuICAgICAgICB2YXIgdiA9IHIuY2FtZXJhQW5pbWF0aW9uO1xuICAgICAgICB2ICYmICh0aGlzLl9pbmVydGlhLmNsZWFyKCksIHRoaXMuX2ZpcmVFdmVudHMoe30sIHt9LCAhMCksIHRoaXMuX2NoYW5nZXMgPSBbXSwgdih0aGlzLl9tYXApKTtcbiAgICAgIH0gZWxzZSB0aGlzLnN0b3AoITApO1xuICAgIH0sIGdyLnByb3RvdHlwZS5tZXJnZUhhbmRsZXJSZXN1bHQgPSBmdW5jdGlvbiAoZSwgaSwgbywgciwgYSkge1xuICAgICAgaWYgKG8pIHtcbiAgICAgICAgdC5leHRlbmQoZSwgbyk7XG4gICAgICAgIHZhciBuID0ge1xuICAgICAgICAgIGhhbmRsZXJOYW1lOiByLFxuICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IG8ub3JpZ2luYWxFdmVudCB8fCBhXG4gICAgICAgIH07XG4gICAgICAgIHZvaWQgMCAhPT0gby56b29tRGVsdGEgJiYgKGkuem9vbSA9IG4pLCB2b2lkIDAgIT09IG8ucGFuRGVsdGEgJiYgKGkuZHJhZyA9IG4pLCB2b2lkIDAgIT09IG8ucGl0Y2hEZWx0YSAmJiAoaS5waXRjaCA9IG4pLCB2b2lkIDAgIT09IG8uYmVhcmluZ0RlbHRhICYmIChpLnJvdGF0ZSA9IG4pO1xuICAgICAgfVxuICAgIH0sIGdyLnByb3RvdHlwZS5fYXBwbHlDaGFuZ2VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgZm9yICh2YXIgZSA9IHt9LCBpID0ge30sIG8gPSB7fSwgciA9IDAsIGEgPSB0aGlzLl9jaGFuZ2VzOyByIDwgYS5sZW5ndGg7IHIgKz0gMSkge1xuICAgICAgICB2YXIgbiA9IGFbcl0sXG4gICAgICAgICAgICBzID0gblswXSxcbiAgICAgICAgICAgIGwgPSBuWzFdLFxuICAgICAgICAgICAgYyA9IG5bMl07XG4gICAgICAgIHMucGFuRGVsdGEgJiYgKGUucGFuRGVsdGEgPSAoZS5wYW5EZWx0YSB8fCBuZXcgdC5Qb2ludCgwLCAwKSkuX2FkZChzLnBhbkRlbHRhKSksIHMuem9vbURlbHRhICYmIChlLnpvb21EZWx0YSA9IChlLnpvb21EZWx0YSB8fCAwKSArIHMuem9vbURlbHRhKSwgcy5iZWFyaW5nRGVsdGEgJiYgKGUuYmVhcmluZ0RlbHRhID0gKGUuYmVhcmluZ0RlbHRhIHx8IDApICsgcy5iZWFyaW5nRGVsdGEpLCBzLnBpdGNoRGVsdGEgJiYgKGUucGl0Y2hEZWx0YSA9IChlLnBpdGNoRGVsdGEgfHwgMCkgKyBzLnBpdGNoRGVsdGEpLCB2b2lkIDAgIT09IHMuYXJvdW5kICYmIChlLmFyb3VuZCA9IHMuYXJvdW5kKSwgdm9pZCAwICE9PSBzLnBpbmNoQXJvdW5kICYmIChlLnBpbmNoQXJvdW5kID0gcy5waW5jaEFyb3VuZCksIHMubm9JbmVydGlhICYmIChlLm5vSW5lcnRpYSA9IHMubm9JbmVydGlhKSwgdC5leHRlbmQoaSwgbCksIHQuZXh0ZW5kKG8sIGMpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl91cGRhdGVNYXBUcmFuc2Zvcm0oZSwgaSwgbyksIHRoaXMuX2NoYW5nZXMgPSBbXTtcbiAgICB9LCBnci5wcm90b3R5cGUuX3VwZGF0ZU1hcFRyYW5zZm9ybSA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICB2YXIgbyA9IHRoaXMuX21hcCxcbiAgICAgICAgICByID0gby50cmFuc2Zvcm07XG4gICAgICBpZiAoIW1yKHQpKSByZXR1cm4gdGhpcy5fZmlyZUV2ZW50cyhlLCBpLCAhMCk7XG4gICAgICB2YXIgYSA9IHQucGFuRGVsdGEsXG4gICAgICAgICAgbiA9IHQuem9vbURlbHRhLFxuICAgICAgICAgIHMgPSB0LmJlYXJpbmdEZWx0YSxcbiAgICAgICAgICBsID0gdC5waXRjaERlbHRhLFxuICAgICAgICAgIGMgPSB0LmFyb3VuZCxcbiAgICAgICAgICB1ID0gdC5waW5jaEFyb3VuZDtcbiAgICAgIHZvaWQgMCAhPT0gdSAmJiAoYyA9IHUpLCBvLl9zdG9wKCEwKSwgYyA9IGMgfHwgby50cmFuc2Zvcm0uY2VudGVyUG9pbnQ7XG4gICAgICB2YXIgaCA9IHIucG9pbnRMb2NhdGlvbihhID8gYy5zdWIoYSkgOiBjKTtcbiAgICAgIHMgJiYgKHIuYmVhcmluZyArPSBzKSwgbCAmJiAoci5waXRjaCArPSBsKSwgbiAmJiAoci56b29tICs9IG4pLCByLnNldExvY2F0aW9uQXRQb2ludChoLCBjKSwgdGhpcy5fbWFwLl91cGRhdGUoKSwgdC5ub0luZXJ0aWEgfHwgdGhpcy5faW5lcnRpYS5yZWNvcmQodCksIHRoaXMuX2ZpcmVFdmVudHMoZSwgaSwgITApO1xuICAgIH0sIGdyLnByb3RvdHlwZS5fZmlyZUV2ZW50cyA9IGZ1bmN0aW9uIChlLCBpLCBvKSB7XG4gICAgICB2YXIgciA9IHRoaXMsXG4gICAgICAgICAgYSA9IF9yKHRoaXMuX2V2ZW50c0luUHJvZ3Jlc3MpLFxuICAgICAgICAgIG4gPSBfcihlKSxcbiAgICAgICAgICBzID0ge307XG5cbiAgICAgIGZvciAodmFyIGwgaW4gZSkge1xuICAgICAgICB0aGlzLl9ldmVudHNJblByb2dyZXNzW2xdIHx8IChzW2wgKyBcInN0YXJ0XCJdID0gZVtsXS5vcmlnaW5hbEV2ZW50KSwgdGhpcy5fZXZlbnRzSW5Qcm9ncmVzc1tsXSA9IGVbbF07XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGMgaW4gIWEgJiYgbiAmJiB0aGlzLl9maXJlRXZlbnQoXCJtb3Zlc3RhcnRcIiwgbi5vcmlnaW5hbEV2ZW50KSwgcykge1xuICAgICAgICB0aGlzLl9maXJlRXZlbnQoYywgc1tjXSk7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIHUgaW4gbiAmJiB0aGlzLl9maXJlRXZlbnQoXCJtb3ZlXCIsIG4ub3JpZ2luYWxFdmVudCksIGUpIHtcbiAgICAgICAgdGhpcy5fZmlyZUV2ZW50KHUsIGVbdV0ub3JpZ2luYWxFdmVudCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBoLFxuICAgICAgICAgIHAgPSB7fTtcblxuICAgICAgZm9yICh2YXIgZCBpbiB0aGlzLl9ldmVudHNJblByb2dyZXNzKSB7XG4gICAgICAgIHZhciBfID0gdGhpcy5fZXZlbnRzSW5Qcm9ncmVzc1tkXSxcbiAgICAgICAgICAgIGYgPSBfLmhhbmRsZXJOYW1lLFxuICAgICAgICAgICAgbSA9IF8ub3JpZ2luYWxFdmVudDtcbiAgICAgICAgdGhpcy5faGFuZGxlcnNCeUlkW2ZdLmlzQWN0aXZlKCkgfHwgKGRlbGV0ZSB0aGlzLl9ldmVudHNJblByb2dyZXNzW2RdLCBwW2QgKyBcImVuZFwiXSA9IGggPSBpW2ZdIHx8IG0pO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBnIGluIHApIHtcbiAgICAgICAgdGhpcy5fZmlyZUV2ZW50KGcsIHBbZ10pO1xuICAgICAgfVxuXG4gICAgICB2YXIgdiA9IF9yKHRoaXMuX2V2ZW50c0luUHJvZ3Jlc3MpO1xuXG4gICAgICBpZiAobyAmJiAoYSB8fCBuKSAmJiAhdikge1xuICAgICAgICB0aGlzLl91cGRhdGluZ0NhbWVyYSA9ICEwO1xuXG4gICAgICAgIHZhciB5ID0gdGhpcy5faW5lcnRpYS5fb25Nb3ZlRW5kKHRoaXMuX21hcC5kcmFnUGFuLl9pbmVydGlhT3B0aW9ucyksXG4gICAgICAgICAgICB4ID0gZnVuY3Rpb24geCh0KSB7XG4gICAgICAgICAgcmV0dXJuIDAgIT09IHQgJiYgLXIuX2JlYXJpbmdTbmFwIDwgdCAmJiB0IDwgci5fYmVhcmluZ1NuYXA7XG4gICAgICAgIH07XG5cbiAgICAgICAgeSA/ICh4KHkuYmVhcmluZyB8fCB0aGlzLl9tYXAuZ2V0QmVhcmluZygpKSAmJiAoeS5iZWFyaW5nID0gMCksIHRoaXMuX21hcC5lYXNlVG8oeSwge1xuICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGhcbiAgICAgICAgfSkpIDogKHRoaXMuX21hcC5maXJlKG5ldyB0LkV2ZW50KFwibW92ZWVuZFwiLCB7XG4gICAgICAgICAgb3JpZ2luYWxFdmVudDogaFxuICAgICAgICB9KSksIHgodGhpcy5fbWFwLmdldEJlYXJpbmcoKSkgJiYgdGhpcy5fbWFwLnJlc2V0Tm9ydGgoKSksIHRoaXMuX3VwZGF0aW5nQ2FtZXJhID0gITE7XG4gICAgICB9XG4gICAgfSwgZ3IucHJvdG90eXBlLl9maXJlRXZlbnQgPSBmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgdGhpcy5fbWFwLmZpcmUobmV3IHQuRXZlbnQoZSwgaSA/IHtcbiAgICAgICAgb3JpZ2luYWxFdmVudDogaVxuICAgICAgfSA6IHt9KSk7XG4gICAgfSwgZ3IucHJvdG90eXBlLl9yZXF1ZXN0RnJhbWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdCA9IHRoaXM7XG4gICAgICByZXR1cm4gdGhpcy5fbWFwLnRyaWdnZXJSZXBhaW50KCksIHRoaXMuX21hcC5fcmVuZGVyVGFza1F1ZXVlLmFkZChmdW5jdGlvbiAoZSkge1xuICAgICAgICBkZWxldGUgdC5fZnJhbWVJZCwgdC5oYW5kbGVFdmVudChuZXcgZnIoXCJyZW5kZXJGcmFtZVwiLCB7XG4gICAgICAgICAgdGltZVN0YW1wOiBlXG4gICAgICAgIH0pKSwgdC5fYXBwbHlDaGFuZ2VzKCk7XG4gICAgICB9KTtcbiAgICB9LCBnci5wcm90b3R5cGUuX3RyaWdnZXJSZW5kZXJGcmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZvaWQgMCA9PT0gdGhpcy5fZnJhbWVJZCAmJiAodGhpcy5fZnJhbWVJZCA9IHRoaXMuX3JlcXVlc3RGcmFtZSgpKTtcbiAgICB9O1xuXG4gICAgdmFyIHZyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGZ1bmN0aW9uIGkoaSwgbykge1xuICAgICAgICBlLmNhbGwodGhpcyksIHRoaXMuX21vdmluZyA9ICExLCB0aGlzLl96b29taW5nID0gITEsIHRoaXMudHJhbnNmb3JtID0gaSwgdGhpcy5fYmVhcmluZ1NuYXAgPSBvLmJlYXJpbmdTbmFwLCB0LmJpbmRBbGwoW1wiX3JlbmRlckZyYW1lQ2FsbGJhY2tcIl0sIHRoaXMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZSAmJiAoaS5fX3Byb3RvX18gPSBlKSwgKGkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShlICYmIGUucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBpLCBpLnByb3RvdHlwZS5nZXRDZW50ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgdC5MbmdMYXQodGhpcy50cmFuc2Zvcm0uY2VudGVyLmxuZywgdGhpcy50cmFuc2Zvcm0uY2VudGVyLmxhdCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5zZXRDZW50ZXIgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5qdW1wVG8oe1xuICAgICAgICAgIGNlbnRlcjogdFxuICAgICAgICB9LCBlKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnBhbkJ5ID0gZnVuY3Rpb24gKGUsIGksIG8pIHtcbiAgICAgICAgcmV0dXJuIGUgPSB0LlBvaW50LmNvbnZlcnQoZSkubXVsdCgtMSksIHRoaXMucGFuVG8odGhpcy50cmFuc2Zvcm0uY2VudGVyLCB0LmV4dGVuZCh7XG4gICAgICAgICAgb2Zmc2V0OiBlXG4gICAgICAgIH0sIGkpLCBvKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnBhblRvID0gZnVuY3Rpb24gKGUsIGksIG8pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWFzZVRvKHQuZXh0ZW5kKHtcbiAgICAgICAgICBjZW50ZXI6IGVcbiAgICAgICAgfSwgaSksIG8pO1xuICAgICAgfSwgaS5wcm90b3R5cGUuZ2V0Wm9vbSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtLnpvb207XG4gICAgICB9LCBpLnByb3RvdHlwZS5zZXRab29tID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuanVtcFRvKHtcbiAgICAgICAgICB6b29tOiB0XG4gICAgICAgIH0sIGUpLCB0aGlzO1xuICAgICAgfSwgaS5wcm90b3R5cGUuem9vbVRvID0gZnVuY3Rpb24gKGUsIGksIG8pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWFzZVRvKHQuZXh0ZW5kKHtcbiAgICAgICAgICB6b29tOiBlXG4gICAgICAgIH0sIGkpLCBvKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnpvb21JbiA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnpvb21Ubyh0aGlzLmdldFpvb20oKSArIDEsIHQsIGUpLCB0aGlzO1xuICAgICAgfSwgaS5wcm90b3R5cGUuem9vbU91dCA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnpvb21Ubyh0aGlzLmdldFpvb20oKSAtIDEsIHQsIGUpLCB0aGlzO1xuICAgICAgfSwgaS5wcm90b3R5cGUuZ2V0QmVhcmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtLmJlYXJpbmc7XG4gICAgICB9LCBpLnByb3RvdHlwZS5zZXRCZWFyaW5nID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuanVtcFRvKHtcbiAgICAgICAgICBiZWFyaW5nOiB0XG4gICAgICAgIH0sIGUpLCB0aGlzO1xuICAgICAgfSwgaS5wcm90b3R5cGUuZ2V0UGFkZGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtLnBhZGRpbmc7XG4gICAgICB9LCBpLnByb3RvdHlwZS5zZXRQYWRkaW5nID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuanVtcFRvKHtcbiAgICAgICAgICBwYWRkaW5nOiB0XG4gICAgICAgIH0sIGUpLCB0aGlzO1xuICAgICAgfSwgaS5wcm90b3R5cGUucm90YXRlVG8gPSBmdW5jdGlvbiAoZSwgaSwgbykge1xuICAgICAgICByZXR1cm4gdGhpcy5lYXNlVG8odC5leHRlbmQoe1xuICAgICAgICAgIGJlYXJpbmc6IGVcbiAgICAgICAgfSwgaSksIG8pO1xuICAgICAgfSwgaS5wcm90b3R5cGUucmVzZXROb3J0aCA9IGZ1bmN0aW9uIChlLCBpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvdGF0ZVRvKDAsIHQuZXh0ZW5kKHtcbiAgICAgICAgICBkdXJhdGlvbjogMWUzXG4gICAgICAgIH0sIGUpLCBpKSwgdGhpcztcbiAgICAgIH0sIGkucHJvdG90eXBlLnJlc2V0Tm9ydGhQaXRjaCA9IGZ1bmN0aW9uIChlLCBpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVhc2VUbyh0LmV4dGVuZCh7XG4gICAgICAgICAgYmVhcmluZzogMCxcbiAgICAgICAgICBwaXRjaDogMCxcbiAgICAgICAgICBkdXJhdGlvbjogMWUzXG4gICAgICAgIH0sIGUpLCBpKSwgdGhpcztcbiAgICAgIH0sIGkucHJvdG90eXBlLnNuYXBUb05vcnRoID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguYWJzKHRoaXMuZ2V0QmVhcmluZygpKSA8IHRoaXMuX2JlYXJpbmdTbmFwID8gdGhpcy5yZXNldE5vcnRoKHQsIGUpIDogdGhpcztcbiAgICAgIH0sIGkucHJvdG90eXBlLmdldFBpdGNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0ucGl0Y2g7XG4gICAgICB9LCBpLnByb3RvdHlwZS5zZXRQaXRjaCA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmp1bXBUbyh7XG4gICAgICAgICAgcGl0Y2g6IHRcbiAgICAgICAgfSwgZSksIHRoaXM7XG4gICAgICB9LCBpLnByb3RvdHlwZS5jYW1lcmFGb3JCb3VuZHMgPSBmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgICBlID0gdC5MbmdMYXRCb3VuZHMuY29udmVydChlKTtcbiAgICAgICAgdmFyIG8gPSBpICYmIGkuYmVhcmluZyB8fCAwO1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FtZXJhRm9yQm94QW5kQmVhcmluZyhlLmdldE5vcnRoV2VzdCgpLCBlLmdldFNvdXRoRWFzdCgpLCBvLCBpKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLl9jYW1lcmFGb3JCb3hBbmRCZWFyaW5nID0gZnVuY3Rpb24gKGUsIGksIG8sIHIpIHtcbiAgICAgICAgdmFyIGEgPSB7XG4gICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgIGJvdHRvbTogMCxcbiAgICAgICAgICByaWdodDogMCxcbiAgICAgICAgICBsZWZ0OiAwXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKFwibnVtYmVyXCIgPT0gdHlwZW9mIChyID0gdC5leHRlbmQoe1xuICAgICAgICAgIHBhZGRpbmc6IGEsXG4gICAgICAgICAgb2Zmc2V0OiBbMCwgMF0sXG4gICAgICAgICAgbWF4Wm9vbTogdGhpcy50cmFuc2Zvcm0ubWF4Wm9vbVxuICAgICAgICB9LCByKSkucGFkZGluZykge1xuICAgICAgICAgIHZhciBuID0gci5wYWRkaW5nO1xuICAgICAgICAgIHIucGFkZGluZyA9IHtcbiAgICAgICAgICAgIHRvcDogbixcbiAgICAgICAgICAgIGJvdHRvbTogbixcbiAgICAgICAgICAgIHJpZ2h0OiBuLFxuICAgICAgICAgICAgbGVmdDogblxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByLnBhZGRpbmcgPSB0LmV4dGVuZChhLCByLnBhZGRpbmcpO1xuXG4gICAgICAgIHZhciBzID0gdGhpcy50cmFuc2Zvcm0sXG4gICAgICAgICAgICBsID0gcy5wYWRkaW5nLFxuICAgICAgICAgICAgYyA9IHMucHJvamVjdCh0LkxuZ0xhdC5jb252ZXJ0KGUpKSxcbiAgICAgICAgICAgIHUgPSBzLnByb2plY3QodC5MbmdMYXQuY29udmVydChpKSksXG4gICAgICAgICAgICBoID0gYy5yb3RhdGUoLW8gKiBNYXRoLlBJIC8gMTgwKSxcbiAgICAgICAgICAgIHAgPSB1LnJvdGF0ZSgtbyAqIE1hdGguUEkgLyAxODApLFxuICAgICAgICAgICAgZCA9IG5ldyB0LlBvaW50KE1hdGgubWF4KGgueCwgcC54KSwgTWF0aC5tYXgoaC55LCBwLnkpKSxcbiAgICAgICAgICAgIF8gPSBuZXcgdC5Qb2ludChNYXRoLm1pbihoLngsIHAueCksIE1hdGgubWluKGgueSwgcC55KSksXG4gICAgICAgICAgICBmID0gZC5zdWIoXyksXG4gICAgICAgICAgICBtID0gKHMud2lkdGggLSAobC5sZWZ0ICsgbC5yaWdodCArIHIucGFkZGluZy5sZWZ0ICsgci5wYWRkaW5nLnJpZ2h0KSkgLyBmLngsXG4gICAgICAgICAgICBnID0gKHMuaGVpZ2h0IC0gKGwudG9wICsgbC5ib3R0b20gKyByLnBhZGRpbmcudG9wICsgci5wYWRkaW5nLmJvdHRvbSkpIC8gZi55O1xuXG4gICAgICAgIGlmICghKGcgPCAwIHx8IG0gPCAwKSkge1xuICAgICAgICAgIHZhciB2ID0gTWF0aC5taW4ocy5zY2FsZVpvb20ocy5zY2FsZSAqIE1hdGgubWluKG0sIGcpKSwgci5tYXhab29tKSxcbiAgICAgICAgICAgICAgeSA9IFwibnVtYmVyXCIgPT0gdHlwZW9mIHIub2Zmc2V0LnggPyBuZXcgdC5Qb2ludChyLm9mZnNldC54LCByLm9mZnNldC55KSA6IHQuUG9pbnQuY29udmVydChyLm9mZnNldCksXG4gICAgICAgICAgICAgIHggPSBuZXcgdC5Qb2ludCgoci5wYWRkaW5nLmxlZnQgLSByLnBhZGRpbmcucmlnaHQpIC8gMiwgKHIucGFkZGluZy50b3AgLSByLnBhZGRpbmcuYm90dG9tKSAvIDIpLnJvdGF0ZShvICogTWF0aC5QSSAvIDE4MCksXG4gICAgICAgICAgICAgIGIgPSB5LmFkZCh4KS5tdWx0KHMuc2NhbGUgLyBzLnpvb21TY2FsZSh2KSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNlbnRlcjogcy51bnByb2plY3QoYy5hZGQodSkuZGl2KDIpLnN1YihiKSksXG4gICAgICAgICAgICB6b29tOiB2LFxuICAgICAgICAgICAgYmVhcmluZzogb1xuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICB0Lndhcm5PbmNlKFwiTWFwIGNhbm5vdCBmaXQgd2l0aGluIGNhbnZhcyB3aXRoIHRoZSBnaXZlbiBib3VuZHMsIHBhZGRpbmcsIGFuZC9vciBvZmZzZXQuXCIpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuZml0Qm91bmRzID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpdEludGVybmFsKHRoaXMuY2FtZXJhRm9yQm91bmRzKHQsIGUpLCBlLCBpKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmZpdFNjcmVlbkNvb3JkaW5hdGVzID0gZnVuY3Rpb24gKGUsIGksIG8sIHIsIGEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpdEludGVybmFsKHRoaXMuX2NhbWVyYUZvckJveEFuZEJlYXJpbmcodGhpcy50cmFuc2Zvcm0ucG9pbnRMb2NhdGlvbih0LlBvaW50LmNvbnZlcnQoZSkpLCB0aGlzLnRyYW5zZm9ybS5wb2ludExvY2F0aW9uKHQuUG9pbnQuY29udmVydChpKSksIG8sIHIpLCByLCBhKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLl9maXRJbnRlcm5hbCA9IGZ1bmN0aW9uIChlLCBpLCBvKSB7XG4gICAgICAgIHJldHVybiBlID8gKGRlbGV0ZSAoaSA9IHQuZXh0ZW5kKGUsIGkpKS5wYWRkaW5nLCBpLmxpbmVhciA/IHRoaXMuZWFzZVRvKGksIG8pIDogdGhpcy5mbHlUbyhpLCBvKSkgOiB0aGlzO1xuICAgICAgfSwgaS5wcm90b3R5cGUuanVtcFRvID0gZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgICAgdGhpcy5zdG9wKCk7XG4gICAgICAgIHZhciBvID0gdGhpcy50cmFuc2Zvcm0sXG4gICAgICAgICAgICByID0gITEsXG4gICAgICAgICAgICBhID0gITEsXG4gICAgICAgICAgICBuID0gITE7XG4gICAgICAgIHJldHVybiBcInpvb21cIiBpbiBlICYmIG8uem9vbSAhPT0gK2Uuem9vbSAmJiAociA9ICEwLCBvLnpvb20gPSArZS56b29tKSwgdm9pZCAwICE9PSBlLmNlbnRlciAmJiAoby5jZW50ZXIgPSB0LkxuZ0xhdC5jb252ZXJ0KGUuY2VudGVyKSksIFwiYmVhcmluZ1wiIGluIGUgJiYgby5iZWFyaW5nICE9PSArZS5iZWFyaW5nICYmIChhID0gITAsIG8uYmVhcmluZyA9ICtlLmJlYXJpbmcpLCBcInBpdGNoXCIgaW4gZSAmJiBvLnBpdGNoICE9PSArZS5waXRjaCAmJiAobiA9ICEwLCBvLnBpdGNoID0gK2UucGl0Y2gpLCBudWxsID09IGUucGFkZGluZyB8fCBvLmlzUGFkZGluZ0VxdWFsKGUucGFkZGluZykgfHwgKG8ucGFkZGluZyA9IGUucGFkZGluZyksIHRoaXMuZmlyZShuZXcgdC5FdmVudChcIm1vdmVzdGFydFwiLCBpKSkuZmlyZShuZXcgdC5FdmVudChcIm1vdmVcIiwgaSkpLCByICYmIHRoaXMuZmlyZShuZXcgdC5FdmVudChcInpvb21zdGFydFwiLCBpKSkuZmlyZShuZXcgdC5FdmVudChcInpvb21cIiwgaSkpLmZpcmUobmV3IHQuRXZlbnQoXCJ6b29tZW5kXCIsIGkpKSwgYSAmJiB0aGlzLmZpcmUobmV3IHQuRXZlbnQoXCJyb3RhdGVzdGFydFwiLCBpKSkuZmlyZShuZXcgdC5FdmVudChcInJvdGF0ZVwiLCBpKSkuZmlyZShuZXcgdC5FdmVudChcInJvdGF0ZWVuZFwiLCBpKSksIG4gJiYgdGhpcy5maXJlKG5ldyB0LkV2ZW50KFwicGl0Y2hzdGFydFwiLCBpKSkuZmlyZShuZXcgdC5FdmVudChcInBpdGNoXCIsIGkpKS5maXJlKG5ldyB0LkV2ZW50KFwicGl0Y2hlbmRcIiwgaSkpLCB0aGlzLmZpcmUobmV3IHQuRXZlbnQoXCJtb3ZlZW5kXCIsIGkpKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmVhc2VUbyA9IGZ1bmN0aW9uIChlLCBpKSB7XG4gICAgICAgIHZhciBvID0gdGhpcztcbiAgICAgICAgdGhpcy5fc3RvcCghMSwgZS5lYXNlSWQpLCAoITEgPT09IChlID0gdC5leHRlbmQoe1xuICAgICAgICAgIG9mZnNldDogWzAsIDBdLFxuICAgICAgICAgIGR1cmF0aW9uOiA1MDAsXG4gICAgICAgICAgZWFzaW5nOiB0LmVhc2VcbiAgICAgICAgfSwgZSkpLmFuaW1hdGUgfHwgIWUuZXNzZW50aWFsICYmIHQuYnJvd3Nlci5wcmVmZXJzUmVkdWNlZE1vdGlvbikgJiYgKGUuZHVyYXRpb24gPSAwKTtcblxuICAgICAgICB2YXIgciA9IHRoaXMudHJhbnNmb3JtLFxuICAgICAgICAgICAgYSA9IHRoaXMuZ2V0Wm9vbSgpLFxuICAgICAgICAgICAgbiA9IHRoaXMuZ2V0QmVhcmluZygpLFxuICAgICAgICAgICAgcyA9IHRoaXMuZ2V0UGl0Y2goKSxcbiAgICAgICAgICAgIGwgPSB0aGlzLmdldFBhZGRpbmcoKSxcbiAgICAgICAgICAgIGMgPSBcInpvb21cIiBpbiBlID8gK2Uuem9vbSA6IGEsXG4gICAgICAgICAgICB1ID0gXCJiZWFyaW5nXCIgaW4gZSA/IHRoaXMuX25vcm1hbGl6ZUJlYXJpbmcoZS5iZWFyaW5nLCBuKSA6IG4sXG4gICAgICAgICAgICBoID0gXCJwaXRjaFwiIGluIGUgPyArZS5waXRjaCA6IHMsXG4gICAgICAgICAgICBwID0gXCJwYWRkaW5nXCIgaW4gZSA/IGUucGFkZGluZyA6IHIucGFkZGluZyxcbiAgICAgICAgICAgIGQgPSB0LlBvaW50LmNvbnZlcnQoZS5vZmZzZXQpLFxuICAgICAgICAgICAgXyA9IHIuY2VudGVyUG9pbnQuYWRkKGQpLFxuICAgICAgICAgICAgZiA9IHIucG9pbnRMb2NhdGlvbihfKSxcbiAgICAgICAgICAgIG0gPSB0LkxuZ0xhdC5jb252ZXJ0KGUuY2VudGVyIHx8IGYpO1xuXG4gICAgICAgIHRoaXMuX25vcm1hbGl6ZUNlbnRlcihtKTtcblxuICAgICAgICB2YXIgZyxcbiAgICAgICAgICAgIHYsXG4gICAgICAgICAgICB5ID0gci5wcm9qZWN0KGYpLFxuICAgICAgICAgICAgeCA9IHIucHJvamVjdChtKS5zdWIoeSksXG4gICAgICAgICAgICBiID0gci56b29tU2NhbGUoYyAtIGEpO1xuICAgICAgICBlLmFyb3VuZCAmJiAoZyA9IHQuTG5nTGF0LmNvbnZlcnQoZS5hcm91bmQpLCB2ID0gci5sb2NhdGlvblBvaW50KGcpKTtcbiAgICAgICAgdmFyIHcgPSB7XG4gICAgICAgICAgbW92aW5nOiB0aGlzLl9tb3ZpbmcsXG4gICAgICAgICAgem9vbWluZzogdGhpcy5fem9vbWluZyxcbiAgICAgICAgICByb3RhdGluZzogdGhpcy5fcm90YXRpbmcsXG4gICAgICAgICAgcGl0Y2hpbmc6IHRoaXMuX3BpdGNoaW5nXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLl96b29taW5nID0gdGhpcy5fem9vbWluZyB8fCBjICE9PSBhLCB0aGlzLl9yb3RhdGluZyA9IHRoaXMuX3JvdGF0aW5nIHx8IG4gIT09IHUsIHRoaXMuX3BpdGNoaW5nID0gdGhpcy5fcGl0Y2hpbmcgfHwgaCAhPT0gcywgdGhpcy5fcGFkZGluZyA9ICFyLmlzUGFkZGluZ0VxdWFsKHApLCB0aGlzLl9lYXNlSWQgPSBlLmVhc2VJZCwgdGhpcy5fcHJlcGFyZUVhc2UoaSwgZS5ub01vdmVTdGFydCwgdyksIHRoaXMuX2Vhc2UoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICBpZiAoby5fem9vbWluZyAmJiAoci56b29tID0gdC5udW1iZXIoYSwgYywgZSkpLCBvLl9yb3RhdGluZyAmJiAoci5iZWFyaW5nID0gdC5udW1iZXIobiwgdSwgZSkpLCBvLl9waXRjaGluZyAmJiAoci5waXRjaCA9IHQubnVtYmVyKHMsIGgsIGUpKSwgby5fcGFkZGluZyAmJiAoci5pbnRlcnBvbGF0ZVBhZGRpbmcobCwgcCwgZSksIF8gPSByLmNlbnRlclBvaW50LmFkZChkKSksIGcpIHIuc2V0TG9jYXRpb25BdFBvaW50KGcsIHYpO2Vsc2Uge1xuICAgICAgICAgICAgdmFyIGYgPSByLnpvb21TY2FsZShyLnpvb20gLSBhKSxcbiAgICAgICAgICAgICAgICBtID0gYyA+IGEgPyBNYXRoLm1pbigyLCBiKSA6IE1hdGgubWF4KC41LCBiKSxcbiAgICAgICAgICAgICAgICB3ID0gTWF0aC5wb3cobSwgMSAtIGUpLFxuICAgICAgICAgICAgICAgIFQgPSByLnVucHJvamVjdCh5LmFkZCh4Lm11bHQoZSAqIHcpKS5tdWx0KGYpKTtcbiAgICAgICAgICAgIHIuc2V0TG9jYXRpb25BdFBvaW50KHIucmVuZGVyV29ybGRDb3BpZXMgPyBULndyYXAoKSA6IFQsIF8pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG8uX2ZpcmVNb3ZlRXZlbnRzKGkpO1xuICAgICAgICB9LCBmdW5jdGlvbiAodCkge1xuICAgICAgICAgIG8uX2FmdGVyRWFzZShpLCB0KTtcbiAgICAgICAgfSwgZSksIHRoaXM7XG4gICAgICB9LCBpLnByb3RvdHlwZS5fcHJlcGFyZUVhc2UgPSBmdW5jdGlvbiAoZSwgaSwgbykge1xuICAgICAgICB2b2lkIDAgPT09IG8gJiYgKG8gPSB7fSksIHRoaXMuX21vdmluZyA9ICEwLCBpIHx8IG8ubW92aW5nIHx8IHRoaXMuZmlyZShuZXcgdC5FdmVudChcIm1vdmVzdGFydFwiLCBlKSksIHRoaXMuX3pvb21pbmcgJiYgIW8uem9vbWluZyAmJiB0aGlzLmZpcmUobmV3IHQuRXZlbnQoXCJ6b29tc3RhcnRcIiwgZSkpLCB0aGlzLl9yb3RhdGluZyAmJiAhby5yb3RhdGluZyAmJiB0aGlzLmZpcmUobmV3IHQuRXZlbnQoXCJyb3RhdGVzdGFydFwiLCBlKSksIHRoaXMuX3BpdGNoaW5nICYmICFvLnBpdGNoaW5nICYmIHRoaXMuZmlyZShuZXcgdC5FdmVudChcInBpdGNoc3RhcnRcIiwgZSkpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuX2ZpcmVNb3ZlRXZlbnRzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdGhpcy5maXJlKG5ldyB0LkV2ZW50KFwibW92ZVwiLCBlKSksIHRoaXMuX3pvb21pbmcgJiYgdGhpcy5maXJlKG5ldyB0LkV2ZW50KFwiem9vbVwiLCBlKSksIHRoaXMuX3JvdGF0aW5nICYmIHRoaXMuZmlyZShuZXcgdC5FdmVudChcInJvdGF0ZVwiLCBlKSksIHRoaXMuX3BpdGNoaW5nICYmIHRoaXMuZmlyZShuZXcgdC5FdmVudChcInBpdGNoXCIsIGUpKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLl9hZnRlckVhc2UgPSBmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgICBpZiAoIXRoaXMuX2Vhc2VJZCB8fCAhaSB8fCB0aGlzLl9lYXNlSWQgIT09IGkpIHtcbiAgICAgICAgICBkZWxldGUgdGhpcy5fZWFzZUlkO1xuICAgICAgICAgIHZhciBvID0gdGhpcy5fem9vbWluZyxcbiAgICAgICAgICAgICAgciA9IHRoaXMuX3JvdGF0aW5nLFxuICAgICAgICAgICAgICBhID0gdGhpcy5fcGl0Y2hpbmc7XG4gICAgICAgICAgdGhpcy5fbW92aW5nID0gITEsIHRoaXMuX3pvb21pbmcgPSAhMSwgdGhpcy5fcm90YXRpbmcgPSAhMSwgdGhpcy5fcGl0Y2hpbmcgPSAhMSwgdGhpcy5fcGFkZGluZyA9ICExLCBvICYmIHRoaXMuZmlyZShuZXcgdC5FdmVudChcInpvb21lbmRcIiwgZSkpLCByICYmIHRoaXMuZmlyZShuZXcgdC5FdmVudChcInJvdGF0ZWVuZFwiLCBlKSksIGEgJiYgdGhpcy5maXJlKG5ldyB0LkV2ZW50KFwicGl0Y2hlbmRcIiwgZSkpLCB0aGlzLmZpcmUobmV3IHQuRXZlbnQoXCJtb3ZlZW5kXCIsIGUpKTtcbiAgICAgICAgfVxuICAgICAgfSwgaS5wcm90b3R5cGUuZmx5VG8gPSBmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgICB2YXIgbyA9IHRoaXM7XG5cbiAgICAgICAgaWYgKCFlLmVzc2VudGlhbCAmJiB0LmJyb3dzZXIucHJlZmVyc1JlZHVjZWRNb3Rpb24pIHtcbiAgICAgICAgICB2YXIgciA9IHQucGljayhlLCBbXCJjZW50ZXJcIiwgXCJ6b29tXCIsIFwiYmVhcmluZ1wiLCBcInBpdGNoXCIsIFwiYXJvdW5kXCJdKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5qdW1wVG8ociwgaSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN0b3AoKSwgZSA9IHQuZXh0ZW5kKHtcbiAgICAgICAgICBvZmZzZXQ6IFswLCAwXSxcbiAgICAgICAgICBzcGVlZDogMS4yLFxuICAgICAgICAgIGN1cnZlOiAxLjQyLFxuICAgICAgICAgIGVhc2luZzogdC5lYXNlXG4gICAgICAgIH0sIGUpO1xuXG4gICAgICAgIHZhciBhID0gdGhpcy50cmFuc2Zvcm0sXG4gICAgICAgICAgICBuID0gdGhpcy5nZXRab29tKCksXG4gICAgICAgICAgICBzID0gdGhpcy5nZXRCZWFyaW5nKCksXG4gICAgICAgICAgICBsID0gdGhpcy5nZXRQaXRjaCgpLFxuICAgICAgICAgICAgYyA9IHRoaXMuZ2V0UGFkZGluZygpLFxuICAgICAgICAgICAgdSA9IFwiem9vbVwiIGluIGUgPyB0LmNsYW1wKCtlLnpvb20sIGEubWluWm9vbSwgYS5tYXhab29tKSA6IG4sXG4gICAgICAgICAgICBoID0gXCJiZWFyaW5nXCIgaW4gZSA/IHRoaXMuX25vcm1hbGl6ZUJlYXJpbmcoZS5iZWFyaW5nLCBzKSA6IHMsXG4gICAgICAgICAgICBwID0gXCJwaXRjaFwiIGluIGUgPyArZS5waXRjaCA6IGwsXG4gICAgICAgICAgICBkID0gXCJwYWRkaW5nXCIgaW4gZSA/IGUucGFkZGluZyA6IGEucGFkZGluZyxcbiAgICAgICAgICAgIF8gPSBhLnpvb21TY2FsZSh1IC0gbiksXG4gICAgICAgICAgICBmID0gdC5Qb2ludC5jb252ZXJ0KGUub2Zmc2V0KSxcbiAgICAgICAgICAgIG0gPSBhLmNlbnRlclBvaW50LmFkZChmKSxcbiAgICAgICAgICAgIGcgPSBhLnBvaW50TG9jYXRpb24obSksXG4gICAgICAgICAgICB2ID0gdC5MbmdMYXQuY29udmVydChlLmNlbnRlciB8fCBnKTtcblxuICAgICAgICB0aGlzLl9ub3JtYWxpemVDZW50ZXIodik7XG5cbiAgICAgICAgdmFyIHkgPSBhLnByb2plY3QoZyksXG4gICAgICAgICAgICB4ID0gYS5wcm9qZWN0KHYpLnN1Yih5KSxcbiAgICAgICAgICAgIGIgPSBlLmN1cnZlLFxuICAgICAgICAgICAgdyA9IE1hdGgubWF4KGEud2lkdGgsIGEuaGVpZ2h0KSxcbiAgICAgICAgICAgIFQgPSB3IC8gXyxcbiAgICAgICAgICAgIEUgPSB4Lm1hZygpO1xuXG4gICAgICAgIGlmIChcIm1pblpvb21cIiBpbiBlKSB7XG4gICAgICAgICAgdmFyIEkgPSB0LmNsYW1wKE1hdGgubWluKGUubWluWm9vbSwgbiwgdSksIGEubWluWm9vbSwgYS5tYXhab29tKSxcbiAgICAgICAgICAgICAgUCA9IHcgLyBhLnpvb21TY2FsZShJIC0gbik7XG4gICAgICAgICAgYiA9IE1hdGguc3FydChQIC8gRSAqIDIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIFMgPSBiICogYjtcblxuICAgICAgICBmdW5jdGlvbiBDKHQpIHtcbiAgICAgICAgICB2YXIgZSA9IChUICogVCAtIHcgKiB3ICsgKHQgPyAtMSA6IDEpICogUyAqIFMgKiBFICogRSkgLyAoMiAqICh0ID8gVCA6IHcpICogUyAqIEUpO1xuICAgICAgICAgIHJldHVybiBNYXRoLmxvZyhNYXRoLnNxcnQoZSAqIGUgKyAxKSAtIGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24geih0KSB7XG4gICAgICAgICAgcmV0dXJuIChNYXRoLmV4cCh0KSAtIE1hdGguZXhwKC10KSkgLyAyO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gRCh0KSB7XG4gICAgICAgICAgcmV0dXJuIChNYXRoLmV4cCh0KSArIE1hdGguZXhwKC10KSkgLyAyO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIEEgPSBDKDApLFxuICAgICAgICAgICAgTSA9IGZ1bmN0aW9uIE0odCkge1xuICAgICAgICAgIHJldHVybiBEKEEpIC8gRChBICsgYiAqIHQpO1xuICAgICAgICB9LFxuICAgICAgICAgICAgTCA9IGZ1bmN0aW9uIEwodCkge1xuICAgICAgICAgIHJldHVybiB3ICogKChEKEEpICogKHooZSA9IEEgKyBiICogdCkgLyBEKGUpKSAtIHooQSkpIC8gUykgLyBFO1xuICAgICAgICAgIHZhciBlO1xuICAgICAgICB9LFxuICAgICAgICAgICAgUiA9IChDKDEpIC0gQSkgLyBiO1xuXG4gICAgICAgIGlmIChNYXRoLmFicyhFKSA8IDFlLTYgfHwgIWlzRmluaXRlKFIpKSB7XG4gICAgICAgICAgaWYgKE1hdGguYWJzKHcgLSBUKSA8IDFlLTYpIHJldHVybiB0aGlzLmVhc2VUbyhlLCBpKTtcbiAgICAgICAgICB2YXIgayA9IFQgPCB3ID8gLTEgOiAxO1xuICAgICAgICAgIFIgPSBNYXRoLmFicyhNYXRoLmxvZyhUIC8gdykpIC8gYiwgTCA9IGZ1bmN0aW9uIEwoKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICB9LCBNID0gZnVuY3Rpb24gTSh0KSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5leHAoayAqIGIgKiB0KTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGUuZHVyYXRpb24gPSBcImR1cmF0aW9uXCIgaW4gZSA/ICtlLmR1cmF0aW9uIDogMWUzICogUiAvIChcInNjcmVlblNwZWVkXCIgaW4gZSA/ICtlLnNjcmVlblNwZWVkIC8gYiA6ICtlLnNwZWVkKSwgZS5tYXhEdXJhdGlvbiAmJiBlLmR1cmF0aW9uID4gZS5tYXhEdXJhdGlvbiAmJiAoZS5kdXJhdGlvbiA9IDApLCB0aGlzLl96b29taW5nID0gITAsIHRoaXMuX3JvdGF0aW5nID0gcyAhPT0gaCwgdGhpcy5fcGl0Y2hpbmcgPSBwICE9PSBsLCB0aGlzLl9wYWRkaW5nID0gIWEuaXNQYWRkaW5nRXF1YWwoZCksIHRoaXMuX3ByZXBhcmVFYXNlKGksICExKSwgdGhpcy5fZWFzZShmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIHZhciByID0gZSAqIFIsXG4gICAgICAgICAgICAgIF8gPSAxIC8gTShyKTtcblxuICAgICAgICAgIGEuem9vbSA9IDEgPT09IGUgPyB1IDogbiArIGEuc2NhbGVab29tKF8pLCBvLl9yb3RhdGluZyAmJiAoYS5iZWFyaW5nID0gdC5udW1iZXIocywgaCwgZSkpLCBvLl9waXRjaGluZyAmJiAoYS5waXRjaCA9IHQubnVtYmVyKGwsIHAsIGUpKSwgby5fcGFkZGluZyAmJiAoYS5pbnRlcnBvbGF0ZVBhZGRpbmcoYywgZCwgZSksIG0gPSBhLmNlbnRlclBvaW50LmFkZChmKSk7XG4gICAgICAgICAgdmFyIGcgPSAxID09PSBlID8gdiA6IGEudW5wcm9qZWN0KHkuYWRkKHgubXVsdChMKHIpKSkubXVsdChfKSk7XG4gICAgICAgICAgYS5zZXRMb2NhdGlvbkF0UG9pbnQoYS5yZW5kZXJXb3JsZENvcGllcyA/IGcud3JhcCgpIDogZywgbSksIG8uX2ZpcmVNb3ZlRXZlbnRzKGkpO1xuICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIG8uX2FmdGVyRWFzZShpKTtcbiAgICAgICAgfSwgZSksIHRoaXM7XG4gICAgICB9LCBpLnByb3RvdHlwZS5pc0Vhc2luZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZWFzZUZyYW1lSWQ7XG4gICAgICB9LCBpLnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RvcCgpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuX3N0b3AgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICBpZiAodGhpcy5fZWFzZUZyYW1lSWQgJiYgKHRoaXMuX2NhbmNlbFJlbmRlckZyYW1lKHRoaXMuX2Vhc2VGcmFtZUlkKSwgZGVsZXRlIHRoaXMuX2Vhc2VGcmFtZUlkLCBkZWxldGUgdGhpcy5fb25FYXNlRnJhbWUpLCB0aGlzLl9vbkVhc2VFbmQpIHtcbiAgICAgICAgICB2YXIgaSA9IHRoaXMuX29uRWFzZUVuZDtcbiAgICAgICAgICBkZWxldGUgdGhpcy5fb25FYXNlRW5kLCBpLmNhbGwodGhpcywgZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXQpIHtcbiAgICAgICAgICB2YXIgbyA9IHRoaXMuaGFuZGxlcnM7XG4gICAgICAgICAgbyAmJiBvLnN0b3AoITEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LCBpLnByb3RvdHlwZS5fZWFzZSA9IGZ1bmN0aW9uIChlLCBpLCBvKSB7XG4gICAgICAgICExID09PSBvLmFuaW1hdGUgfHwgMCA9PT0gby5kdXJhdGlvbiA/IChlKDEpLCBpKCkpIDogKHRoaXMuX2Vhc2VTdGFydCA9IHQuYnJvd3Nlci5ub3coKSwgdGhpcy5fZWFzZU9wdGlvbnMgPSBvLCB0aGlzLl9vbkVhc2VGcmFtZSA9IGUsIHRoaXMuX29uRWFzZUVuZCA9IGksIHRoaXMuX2Vhc2VGcmFtZUlkID0gdGhpcy5fcmVxdWVzdFJlbmRlckZyYW1lKHRoaXMuX3JlbmRlckZyYW1lQ2FsbGJhY2spKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLl9yZW5kZXJGcmFtZUNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZSA9IE1hdGgubWluKCh0LmJyb3dzZXIubm93KCkgLSB0aGlzLl9lYXNlU3RhcnQpIC8gdGhpcy5fZWFzZU9wdGlvbnMuZHVyYXRpb24sIDEpO1xuICAgICAgICB0aGlzLl9vbkVhc2VGcmFtZSh0aGlzLl9lYXNlT3B0aW9ucy5lYXNpbmcoZSkpLCBlIDwgMSA/IHRoaXMuX2Vhc2VGcmFtZUlkID0gdGhpcy5fcmVxdWVzdFJlbmRlckZyYW1lKHRoaXMuX3JlbmRlckZyYW1lQ2FsbGJhY2spIDogdGhpcy5zdG9wKCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5fbm9ybWFsaXplQmVhcmluZyA9IGZ1bmN0aW9uIChlLCBpKSB7XG4gICAgICAgIGUgPSB0LndyYXAoZSwgLTE4MCwgMTgwKTtcbiAgICAgICAgdmFyIG8gPSBNYXRoLmFicyhlIC0gaSk7XG4gICAgICAgIHJldHVybiBNYXRoLmFicyhlIC0gMzYwIC0gaSkgPCBvICYmIChlIC09IDM2MCksIE1hdGguYWJzKGUgKyAzNjAgLSBpKSA8IG8gJiYgKGUgKz0gMzYwKSwgZTtcbiAgICAgIH0sIGkucHJvdG90eXBlLl9ub3JtYWxpemVDZW50ZXIgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgZSA9IHRoaXMudHJhbnNmb3JtO1xuXG4gICAgICAgIGlmIChlLnJlbmRlcldvcmxkQ29waWVzICYmICFlLmxuZ1JhbmdlKSB7XG4gICAgICAgICAgdmFyIGkgPSB0LmxuZyAtIGUuY2VudGVyLmxuZztcbiAgICAgICAgICB0LmxuZyArPSBpID4gMTgwID8gLTM2MCA6IGkgPCAtMTgwID8gMzYwIDogMDtcbiAgICAgICAgfVxuICAgICAgfSwgaTtcbiAgICB9KHQuRXZlbnRlZCksXG4gICAgICAgIHlyID0gZnVuY3Rpb24geXIoZSkge1xuICAgICAgdm9pZCAwID09PSBlICYmIChlID0ge30pLCB0aGlzLm9wdGlvbnMgPSBlLCB0LmJpbmRBbGwoW1wiX3RvZ2dsZUF0dHJpYnV0aW9uXCIsIFwiX3VwZGF0ZUVkaXRMaW5rXCIsIFwiX3VwZGF0ZURhdGFcIiwgXCJfdXBkYXRlQ29tcGFjdFwiXSwgdGhpcyk7XG4gICAgfTtcblxuICAgIHlyLnByb3RvdHlwZS5nZXREZWZhdWx0UG9zaXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gXCJib3R0b20tcmlnaHRcIjtcbiAgICB9LCB5ci5wcm90b3R5cGUub25BZGQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGUgPSB0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLmNvbXBhY3Q7XG4gICAgICByZXR1cm4gdGhpcy5fbWFwID0gdCwgdGhpcy5fY29udGFpbmVyID0gaS5jcmVhdGUoXCJkaXZcIiwgXCJtYXBib3hnbC1jdHJsIG1hcGJveGdsLWN0cmwtYXR0cmliXCIpLCB0aGlzLl9jb21wYWN0QnV0dG9uID0gaS5jcmVhdGUoXCJidXR0b25cIiwgXCJtYXBib3hnbC1jdHJsLWF0dHJpYi1idXR0b25cIiwgdGhpcy5fY29udGFpbmVyKSwgdGhpcy5fY29tcGFjdEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5fdG9nZ2xlQXR0cmlidXRpb24pLCB0aGlzLl9zZXRFbGVtZW50VGl0bGUodGhpcy5fY29tcGFjdEJ1dHRvbiwgXCJUb2dnbGVBdHRyaWJ1dGlvblwiKSwgdGhpcy5faW5uZXJDb250YWluZXIgPSBpLmNyZWF0ZShcImRpdlwiLCBcIm1hcGJveGdsLWN0cmwtYXR0cmliLWlubmVyXCIsIHRoaXMuX2NvbnRhaW5lciksIHRoaXMuX2lubmVyQ29udGFpbmVyLnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJsaXN0XCIpLCBlICYmIHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwibWFwYm94Z2wtY29tcGFjdFwiKSwgdGhpcy5fdXBkYXRlQXR0cmlidXRpb25zKCksIHRoaXMuX3VwZGF0ZUVkaXRMaW5rKCksIHRoaXMuX21hcC5vbihcInN0eWxlZGF0YVwiLCB0aGlzLl91cGRhdGVEYXRhKSwgdGhpcy5fbWFwLm9uKFwic291cmNlZGF0YVwiLCB0aGlzLl91cGRhdGVEYXRhKSwgdGhpcy5fbWFwLm9uKFwibW92ZWVuZFwiLCB0aGlzLl91cGRhdGVFZGl0TGluayksIHZvaWQgMCA9PT0gZSAmJiAodGhpcy5fbWFwLm9uKFwicmVzaXplXCIsIHRoaXMuX3VwZGF0ZUNvbXBhY3QpLCB0aGlzLl91cGRhdGVDb21wYWN0KCkpLCB0aGlzLl9jb250YWluZXI7XG4gICAgfSwgeXIucHJvdG90eXBlLm9uUmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgaS5yZW1vdmUodGhpcy5fY29udGFpbmVyKSwgdGhpcy5fbWFwLm9mZihcInN0eWxlZGF0YVwiLCB0aGlzLl91cGRhdGVEYXRhKSwgdGhpcy5fbWFwLm9mZihcInNvdXJjZWRhdGFcIiwgdGhpcy5fdXBkYXRlRGF0YSksIHRoaXMuX21hcC5vZmYoXCJtb3ZlZW5kXCIsIHRoaXMuX3VwZGF0ZUVkaXRMaW5rKSwgdGhpcy5fbWFwLm9mZihcInJlc2l6ZVwiLCB0aGlzLl91cGRhdGVDb21wYWN0KSwgdGhpcy5fbWFwID0gdm9pZCAwLCB0aGlzLl9hdHRyaWJIVE1MID0gdm9pZCAwO1xuICAgIH0sIHlyLnByb3RvdHlwZS5fc2V0RWxlbWVudFRpdGxlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHZhciBpID0gdGhpcy5fbWFwLl9nZXRVSVN0cmluZyhcIkF0dHJpYnV0aW9uQ29udHJvbC5cIiArIGUpO1xuXG4gICAgICB0LnRpdGxlID0gaSwgdC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIGkpO1xuICAgIH0sIHlyLnByb3RvdHlwZS5fdG9nZ2xlQXR0cmlidXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LmNvbnRhaW5zKFwibWFwYm94Z2wtY29tcGFjdC1zaG93XCIpID8gKHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKFwibWFwYm94Z2wtY29tcGFjdC1zaG93XCIpLCB0aGlzLl9jb21wYWN0QnV0dG9uLnNldEF0dHJpYnV0ZShcImFyaWEtcHJlc3NlZFwiLCBcImZhbHNlXCIpKSA6ICh0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LmFkZChcIm1hcGJveGdsLWNvbXBhY3Qtc2hvd1wiKSwgdGhpcy5fY29tcGFjdEJ1dHRvbi5zZXRBdHRyaWJ1dGUoXCJhcmlhLXByZXNzZWRcIiwgXCJ0cnVlXCIpKTtcbiAgICB9LCB5ci5wcm90b3R5cGUuX3VwZGF0ZUVkaXRMaW5rID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGUgPSB0aGlzLl9lZGl0TGluaztcbiAgICAgIGUgfHwgKGUgPSB0aGlzLl9lZGl0TGluayA9IHRoaXMuX2NvbnRhaW5lci5xdWVyeVNlbGVjdG9yKFwiLm1hcGJveC1pbXByb3ZlLW1hcFwiKSk7XG4gICAgICB2YXIgaSA9IFt7XG4gICAgICAgIGtleTogXCJvd25lclwiLFxuICAgICAgICB2YWx1ZTogdGhpcy5zdHlsZU93bmVyXG4gICAgICB9LCB7XG4gICAgICAgIGtleTogXCJpZFwiLFxuICAgICAgICB2YWx1ZTogdGhpcy5zdHlsZUlkXG4gICAgICB9LCB7XG4gICAgICAgIGtleTogXCJhY2Nlc3NfdG9rZW5cIixcbiAgICAgICAgdmFsdWU6IHRoaXMuX21hcC5fcmVxdWVzdE1hbmFnZXIuX2N1c3RvbUFjY2Vzc1Rva2VuIHx8IHQuY29uZmlnLkFDQ0VTU19UT0tFTlxuICAgICAgfV07XG5cbiAgICAgIGlmIChlKSB7XG4gICAgICAgIHZhciBvID0gaS5yZWR1Y2UoZnVuY3Rpb24gKHQsIGUsIG8pIHtcbiAgICAgICAgICByZXR1cm4gZS52YWx1ZSAmJiAodCArPSBlLmtleSArIFwiPVwiICsgZS52YWx1ZSArIChvIDwgaS5sZW5ndGggLSAxID8gXCImXCIgOiBcIlwiKSksIHQ7XG4gICAgICAgIH0sIFwiP1wiKTtcbiAgICAgICAgZS5ocmVmID0gdC5jb25maWcuRkVFREJBQ0tfVVJMICsgXCIvXCIgKyBvICsgKHRoaXMuX21hcC5faGFzaCA/IHRoaXMuX21hcC5faGFzaC5nZXRIYXNoU3RyaW5nKCEwKSA6IFwiXCIpLCBlLnJlbCA9IFwibm9vcGVuZXIgbm9mb2xsb3dcIiwgdGhpcy5fc2V0RWxlbWVudFRpdGxlKGUsIFwiTWFwRmVlZGJhY2tcIik7XG4gICAgICB9XG4gICAgfSwgeXIucHJvdG90eXBlLl91cGRhdGVEYXRhID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICF0IHx8IFwibWV0YWRhdGFcIiAhPT0gdC5zb3VyY2VEYXRhVHlwZSAmJiBcInZpc2liaWxpdHlcIiAhPT0gdC5zb3VyY2VEYXRhVHlwZSAmJiBcInN0eWxlXCIgIT09IHQuZGF0YVR5cGUgfHwgKHRoaXMuX3VwZGF0ZUF0dHJpYnV0aW9ucygpLCB0aGlzLl91cGRhdGVFZGl0TGluaygpKTtcbiAgICB9LCB5ci5wcm90b3R5cGUuX3VwZGF0ZUF0dHJpYnV0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICh0aGlzLl9tYXAuc3R5bGUpIHtcbiAgICAgICAgdmFyIHQgPSBbXTtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmN1c3RvbUF0dHJpYnV0aW9uICYmIChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucy5jdXN0b21BdHRyaWJ1dGlvbikgPyB0ID0gdC5jb25jYXQodGhpcy5vcHRpb25zLmN1c3RvbUF0dHJpYnV0aW9uLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHJldHVybiBcInN0cmluZ1wiICE9IHR5cGVvZiB0ID8gXCJcIiA6IHQ7XG4gICAgICAgIH0pKSA6IFwic3RyaW5nXCIgPT0gdHlwZW9mIHRoaXMub3B0aW9ucy5jdXN0b21BdHRyaWJ1dGlvbiAmJiB0LnB1c2godGhpcy5vcHRpb25zLmN1c3RvbUF0dHJpYnV0aW9uKSksIHRoaXMuX21hcC5zdHlsZS5zdHlsZXNoZWV0KSB7XG4gICAgICAgICAgdmFyIGUgPSB0aGlzLl9tYXAuc3R5bGUuc3R5bGVzaGVldDtcbiAgICAgICAgICB0aGlzLnN0eWxlT3duZXIgPSBlLm93bmVyLCB0aGlzLnN0eWxlSWQgPSBlLmlkO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGkgPSB0aGlzLl9tYXAuc3R5bGUuc291cmNlQ2FjaGVzO1xuXG4gICAgICAgIGZvciAodmFyIG8gaW4gaSkge1xuICAgICAgICAgIHZhciByID0gaVtvXTtcblxuICAgICAgICAgIGlmIChyLnVzZWQpIHtcbiAgICAgICAgICAgIHZhciBhID0gci5nZXRTb3VyY2UoKTtcbiAgICAgICAgICAgIGEuYXR0cmlidXRpb24gJiYgdC5pbmRleE9mKGEuYXR0cmlidXRpb24pIDwgMCAmJiB0LnB1c2goYS5hdHRyaWJ1dGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdC5zb3J0KGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgcmV0dXJuIHQubGVuZ3RoIC0gZS5sZW5ndGg7XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgbiA9ICh0ID0gdC5maWx0ZXIoZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgICAgICBmb3IgKHZhciBvID0gaSArIDE7IG8gPCB0Lmxlbmd0aDsgbysrKSB7XG4gICAgICAgICAgICBpZiAodFtvXS5pbmRleE9mKGUpID49IDApIHJldHVybiAhMTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgIH0pKS5qb2luKFwiIHwgXCIpO1xuICAgICAgICBuICE9PSB0aGlzLl9hdHRyaWJIVE1MICYmICh0aGlzLl9hdHRyaWJIVE1MID0gbiwgdC5sZW5ndGggPyAodGhpcy5faW5uZXJDb250YWluZXIuaW5uZXJIVE1MID0gbiwgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoXCJtYXBib3hnbC1hdHRyaWItZW1wdHlcIikpIDogdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJtYXBib3hnbC1hdHRyaWItZW1wdHlcIiksIHRoaXMuX2VkaXRMaW5rID0gbnVsbCk7XG4gICAgICB9XG4gICAgfSwgeXIucHJvdG90eXBlLl91cGRhdGVDb21wYWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5fbWFwLmdldENhbnZhc0NvbnRhaW5lcigpLm9mZnNldFdpZHRoIDw9IDY0MCA/IHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwibWFwYm94Z2wtY29tcGFjdFwiKSA6IHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKFwibWFwYm94Z2wtY29tcGFjdFwiLCBcIm1hcGJveGdsLWNvbXBhY3Qtc2hvd1wiKTtcbiAgICB9O1xuXG4gICAgdmFyIHhyID0gZnVuY3Rpb24geHIoKSB7XG4gICAgICB0LmJpbmRBbGwoW1wiX3VwZGF0ZUxvZ29cIl0sIHRoaXMpLCB0LmJpbmRBbGwoW1wiX3VwZGF0ZUNvbXBhY3RcIl0sIHRoaXMpO1xuICAgIH07XG5cbiAgICB4ci5wcm90b3R5cGUub25BZGQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdGhpcy5fbWFwID0gdCwgdGhpcy5fY29udGFpbmVyID0gaS5jcmVhdGUoXCJkaXZcIiwgXCJtYXBib3hnbC1jdHJsXCIpO1xuICAgICAgdmFyIGUgPSBpLmNyZWF0ZShcImFcIiwgXCJtYXBib3hnbC1jdHJsLWxvZ29cIik7XG4gICAgICByZXR1cm4gZS50YXJnZXQgPSBcIl9ibGFua1wiLCBlLnJlbCA9IFwibm9vcGVuZXIgbm9mb2xsb3dcIiwgZS5ocmVmID0gXCJodHRwczovL3d3dy5tYXBib3guY29tL1wiLCBlLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgdGhpcy5fbWFwLl9nZXRVSVN0cmluZyhcIkxvZ29Db250cm9sLlRpdGxlXCIpKSwgZS5zZXRBdHRyaWJ1dGUoXCJyZWxcIiwgXCJub29wZW5lciBub2ZvbGxvd1wiKSwgdGhpcy5fY29udGFpbmVyLmFwcGVuZENoaWxkKGUpLCB0aGlzLl9jb250YWluZXIuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiLCB0aGlzLl9tYXAub24oXCJzb3VyY2VkYXRhXCIsIHRoaXMuX3VwZGF0ZUxvZ28pLCB0aGlzLl91cGRhdGVMb2dvKCksIHRoaXMuX21hcC5vbihcInJlc2l6ZVwiLCB0aGlzLl91cGRhdGVDb21wYWN0KSwgdGhpcy5fdXBkYXRlQ29tcGFjdCgpLCB0aGlzLl9jb250YWluZXI7XG4gICAgfSwgeHIucHJvdG90eXBlLm9uUmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgaS5yZW1vdmUodGhpcy5fY29udGFpbmVyKSwgdGhpcy5fbWFwLm9mZihcInNvdXJjZWRhdGFcIiwgdGhpcy5fdXBkYXRlTG9nbyksIHRoaXMuX21hcC5vZmYoXCJyZXNpemVcIiwgdGhpcy5fdXBkYXRlQ29tcGFjdCk7XG4gICAgfSwgeHIucHJvdG90eXBlLmdldERlZmF1bHRQb3NpdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBcImJvdHRvbS1sZWZ0XCI7XG4gICAgfSwgeHIucHJvdG90eXBlLl91cGRhdGVMb2dvID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHQgJiYgXCJtZXRhZGF0YVwiICE9PSB0LnNvdXJjZURhdGFUeXBlIHx8ICh0aGlzLl9jb250YWluZXIuc3R5bGUuZGlzcGxheSA9IHRoaXMuX2xvZ29SZXF1aXJlZCgpID8gXCJibG9ja1wiIDogXCJub25lXCIpO1xuICAgIH0sIHhyLnByb3RvdHlwZS5fbG9nb1JlcXVpcmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHRoaXMuX21hcC5zdHlsZSkge1xuICAgICAgICB2YXIgdCA9IHRoaXMuX21hcC5zdHlsZS5zb3VyY2VDYWNoZXM7XG5cbiAgICAgICAgZm9yICh2YXIgZSBpbiB0KSB7XG4gICAgICAgICAgaWYgKHRbZV0uZ2V0U291cmNlKCkubWFwYm94X2xvZ28pIHJldHVybiAhMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhMTtcbiAgICAgIH1cbiAgICB9LCB4ci5wcm90b3R5cGUuX3VwZGF0ZUNvbXBhY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdCA9IHRoaXMuX2NvbnRhaW5lci5jaGlsZHJlbjtcblxuICAgICAgaWYgKHQubGVuZ3RoKSB7XG4gICAgICAgIHZhciBlID0gdFswXTtcbiAgICAgICAgdGhpcy5fbWFwLmdldENhbnZhc0NvbnRhaW5lcigpLm9mZnNldFdpZHRoIDwgMjUwID8gZS5jbGFzc0xpc3QuYWRkKFwibWFwYm94Z2wtY29tcGFjdFwiKSA6IGUuY2xhc3NMaXN0LnJlbW92ZShcIm1hcGJveGdsLWNvbXBhY3RcIik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciBiciA9IGZ1bmN0aW9uIGJyKCkge1xuICAgICAgdGhpcy5fcXVldWUgPSBbXSwgdGhpcy5faWQgPSAwLCB0aGlzLl9jbGVhcmVkID0gITEsIHRoaXMuX2N1cnJlbnRseVJ1bm5pbmcgPSAhMTtcbiAgICB9O1xuXG4gICAgYnIucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2YXIgZSA9ICsrdGhpcy5faWQ7XG4gICAgICByZXR1cm4gdGhpcy5fcXVldWUucHVzaCh7XG4gICAgICAgIGNhbGxiYWNrOiB0LFxuICAgICAgICBpZDogZSxcbiAgICAgICAgY2FuY2VsbGVkOiAhMVxuICAgICAgfSksIGU7XG4gICAgfSwgYnIucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmb3IgKHZhciBlID0gdGhpcy5fY3VycmVudGx5UnVubmluZywgaSA9IDAsIG8gPSBlID8gdGhpcy5fcXVldWUuY29uY2F0KGUpIDogdGhpcy5fcXVldWU7IGkgPCBvLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciByID0gb1tpXTtcbiAgICAgICAgaWYgKHIuaWQgPT09IHQpIHJldHVybiB2b2lkIChyLmNhbmNlbGxlZCA9ICEwKTtcbiAgICAgIH1cbiAgICB9LCBici5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHZvaWQgMCA9PT0gdCAmJiAodCA9IDApO1xuICAgICAgdmFyIGUgPSB0aGlzLl9jdXJyZW50bHlSdW5uaW5nID0gdGhpcy5fcXVldWU7XG4gICAgICB0aGlzLl9xdWV1ZSA9IFtdO1xuXG4gICAgICBmb3IgKHZhciBpID0gMCwgbyA9IGU7IGkgPCBvLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciByID0gb1tpXTtcbiAgICAgICAgaWYgKCFyLmNhbmNlbGxlZCAmJiAoci5jYWxsYmFjayh0KSwgdGhpcy5fY2xlYXJlZCkpIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9jbGVhcmVkID0gITEsIHRoaXMuX2N1cnJlbnRseVJ1bm5pbmcgPSAhMTtcbiAgICB9LCBici5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLl9jdXJyZW50bHlSdW5uaW5nICYmICh0aGlzLl9jbGVhcmVkID0gITApLCB0aGlzLl9xdWV1ZSA9IFtdO1xuICAgIH07XG5cbiAgICB2YXIgd3IgPSB7XG4gICAgICBcIkF0dHJpYnV0aW9uQ29udHJvbC5Ub2dnbGVBdHRyaWJ1dGlvblwiOiBcIlRvZ2dsZSBhdHRyaWJ1dGlvblwiLFxuICAgICAgXCJBdHRyaWJ1dGlvbkNvbnRyb2wuTWFwRmVlZGJhY2tcIjogXCJNYXAgZmVlZGJhY2tcIixcbiAgICAgIFwiRnVsbHNjcmVlbkNvbnRyb2wuRW50ZXJcIjogXCJFbnRlciBmdWxsc2NyZWVuXCIsXG4gICAgICBcIkZ1bGxzY3JlZW5Db250cm9sLkV4aXRcIjogXCJFeGl0IGZ1bGxzY3JlZW5cIixcbiAgICAgIFwiR2VvbG9jYXRlQ29udHJvbC5GaW5kTXlMb2NhdGlvblwiOiBcIkZpbmQgbXkgbG9jYXRpb25cIixcbiAgICAgIFwiR2VvbG9jYXRlQ29udHJvbC5Mb2NhdGlvbk5vdEF2YWlsYWJsZVwiOiBcIkxvY2F0aW9uIG5vdCBhdmFpbGFibGVcIixcbiAgICAgIFwiTG9nb0NvbnRyb2wuVGl0bGVcIjogXCJNYXBib3ggbG9nb1wiLFxuICAgICAgXCJOYXZpZ2F0aW9uQ29udHJvbC5SZXNldEJlYXJpbmdcIjogXCJSZXNldCBiZWFyaW5nIHRvIG5vcnRoXCIsXG4gICAgICBcIk5hdmlnYXRpb25Db250cm9sLlpvb21JblwiOiBcIlpvb20gaW5cIixcbiAgICAgIFwiTmF2aWdhdGlvbkNvbnRyb2wuWm9vbU91dFwiOiBcIlpvb20gb3V0XCIsXG4gICAgICBcIlNjYWxlQ29udHJvbC5GZWV0XCI6IFwiZnRcIixcbiAgICAgIFwiU2NhbGVDb250cm9sLk1ldGVyc1wiOiBcIm1cIixcbiAgICAgIFwiU2NhbGVDb250cm9sLktpbG9tZXRlcnNcIjogXCJrbVwiLFxuICAgICAgXCJTY2FsZUNvbnRyb2wuTWlsZXNcIjogXCJtaVwiLFxuICAgICAgXCJTY2FsZUNvbnRyb2wuTmF1dGljYWxNaWxlc1wiOiBcIm5tXCJcbiAgICB9LFxuICAgICAgICBUciA9IHQud2luZG93LkhUTUxJbWFnZUVsZW1lbnQsXG4gICAgICAgIEVyID0gdC53aW5kb3cuSFRNTEVsZW1lbnQsXG4gICAgICAgIElyID0gdC53aW5kb3cuSW1hZ2VCaXRtYXAsXG4gICAgICAgIFByID0ge1xuICAgICAgY2VudGVyOiBbMCwgMF0sXG4gICAgICB6b29tOiAwLFxuICAgICAgYmVhcmluZzogMCxcbiAgICAgIHBpdGNoOiAwLFxuICAgICAgbWluWm9vbTogLTIsXG4gICAgICBtYXhab29tOiAyMixcbiAgICAgIG1pblBpdGNoOiAwLFxuICAgICAgbWF4UGl0Y2g6IDYwLFxuICAgICAgaW50ZXJhY3RpdmU6ICEwLFxuICAgICAgc2Nyb2xsWm9vbTogITAsXG4gICAgICBib3hab29tOiAhMCxcbiAgICAgIGRyYWdSb3RhdGU6ICEwLFxuICAgICAgZHJhZ1BhbjogITAsXG4gICAgICBrZXlib2FyZDogITAsXG4gICAgICBkb3VibGVDbGlja1pvb206ICEwLFxuICAgICAgdG91Y2hab29tUm90YXRlOiAhMCxcbiAgICAgIHRvdWNoUGl0Y2g6ICEwLFxuICAgICAgYmVhcmluZ1NuYXA6IDcsXG4gICAgICBjbGlja1RvbGVyYW5jZTogMyxcbiAgICAgIHBpdGNoV2l0aFJvdGF0ZTogITAsXG4gICAgICBoYXNoOiAhMSxcbiAgICAgIGF0dHJpYnV0aW9uQ29udHJvbDogITAsXG4gICAgICBmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0OiAhMSxcbiAgICAgIHByZXNlcnZlRHJhd2luZ0J1ZmZlcjogITEsXG4gICAgICB0cmFja1Jlc2l6ZTogITAsXG4gICAgICByZW5kZXJXb3JsZENvcGllczogITAsXG4gICAgICByZWZyZXNoRXhwaXJlZFRpbGVzOiAhMCxcbiAgICAgIG1heFRpbGVDYWNoZVNpemU6IG51bGwsXG4gICAgICBsb2NhbElkZW9ncmFwaEZvbnRGYW1pbHk6IFwic2Fucy1zZXJpZlwiLFxuICAgICAgdHJhbnNmb3JtUmVxdWVzdDogbnVsbCxcbiAgICAgIGFjY2Vzc1Rva2VuOiBudWxsLFxuICAgICAgZmFkZUR1cmF0aW9uOiAzMDAsXG4gICAgICBjcm9zc1NvdXJjZUNvbGxpc2lvbnM6ICEwXG4gICAgfSxcbiAgICAgICAgU3IgPSBmdW5jdGlvbiAobykge1xuICAgICAgZnVuY3Rpb24gcihlKSB7XG4gICAgICAgIHZhciBpID0gdGhpcztcbiAgICAgICAgaWYgKG51bGwgIT0gKGUgPSB0LmV4dGVuZCh7fSwgUHIsIGUpKS5taW5ab29tICYmIG51bGwgIT0gZS5tYXhab29tICYmIGUubWluWm9vbSA+IGUubWF4Wm9vbSkgdGhyb3cgbmV3IEVycm9yKFwibWF4Wm9vbSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBtaW5ab29tXCIpO1xuICAgICAgICBpZiAobnVsbCAhPSBlLm1pblBpdGNoICYmIG51bGwgIT0gZS5tYXhQaXRjaCAmJiBlLm1pblBpdGNoID4gZS5tYXhQaXRjaCkgdGhyb3cgbmV3IEVycm9yKFwibWF4UGl0Y2ggbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gbWluUGl0Y2hcIik7XG4gICAgICAgIGlmIChudWxsICE9IGUubWluUGl0Y2ggJiYgZS5taW5QaXRjaCA8IDApIHRocm93IG5ldyBFcnJvcihcIm1pblBpdGNoIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDBcIik7XG4gICAgICAgIGlmIChudWxsICE9IGUubWF4UGl0Y2ggJiYgZS5tYXhQaXRjaCA+IDYwKSB0aHJvdyBuZXcgRXJyb3IoXCJtYXhQaXRjaCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA2MFwiKTtcbiAgICAgICAgdmFyIHIgPSBuZXcgVG8oZS5taW5ab29tLCBlLm1heFpvb20sIGUubWluUGl0Y2gsIGUubWF4UGl0Y2gsIGUucmVuZGVyV29ybGRDb3BpZXMpO1xuXG4gICAgICAgIGlmIChvLmNhbGwodGhpcywgciwgZSksIHRoaXMuX2ludGVyYWN0aXZlID0gZS5pbnRlcmFjdGl2ZSwgdGhpcy5fbWF4VGlsZUNhY2hlU2l6ZSA9IGUubWF4VGlsZUNhY2hlU2l6ZSwgdGhpcy5fZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCA9IGUuZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCwgdGhpcy5fcHJlc2VydmVEcmF3aW5nQnVmZmVyID0gZS5wcmVzZXJ2ZURyYXdpbmdCdWZmZXIsIHRoaXMuX2FudGlhbGlhcyA9IGUuYW50aWFsaWFzLCB0aGlzLl90cmFja1Jlc2l6ZSA9IGUudHJhY2tSZXNpemUsIHRoaXMuX2JlYXJpbmdTbmFwID0gZS5iZWFyaW5nU25hcCwgdGhpcy5fcmVmcmVzaEV4cGlyZWRUaWxlcyA9IGUucmVmcmVzaEV4cGlyZWRUaWxlcywgdGhpcy5fZmFkZUR1cmF0aW9uID0gZS5mYWRlRHVyYXRpb24sIHRoaXMuX2Nyb3NzU291cmNlQ29sbGlzaW9ucyA9IGUuY3Jvc3NTb3VyY2VDb2xsaXNpb25zLCB0aGlzLl9jcm9zc0ZhZGluZ0ZhY3RvciA9IDEsIHRoaXMuX2NvbGxlY3RSZXNvdXJjZVRpbWluZyA9IGUuY29sbGVjdFJlc291cmNlVGltaW5nLCB0aGlzLl9yZW5kZXJUYXNrUXVldWUgPSBuZXcgYnIoKSwgdGhpcy5fY29udHJvbHMgPSBbXSwgdGhpcy5fbWFwSWQgPSB0LnVuaXF1ZUlkKCksIHRoaXMuX2xvY2FsZSA9IHQuZXh0ZW5kKHt9LCB3ciwgZS5sb2NhbGUpLCB0aGlzLl9jbGlja1RvbGVyYW5jZSA9IGUuY2xpY2tUb2xlcmFuY2UsIHRoaXMuX3JlcXVlc3RNYW5hZ2VyID0gbmV3IHQuUmVxdWVzdE1hbmFnZXIoZS50cmFuc2Zvcm1SZXF1ZXN0LCBlLmFjY2Vzc1Rva2VuKSwgXCJzdHJpbmdcIiA9PSB0eXBlb2YgZS5jb250YWluZXIpIHtcbiAgICAgICAgICBpZiAodGhpcy5fY29udGFpbmVyID0gdC53aW5kb3cuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZS5jb250YWluZXIpLCAhdGhpcy5fY29udGFpbmVyKSB0aHJvdyBuZXcgRXJyb3IoXCJDb250YWluZXIgJ1wiICsgZS5jb250YWluZXIgKyBcIicgbm90IGZvdW5kLlwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIShlLmNvbnRhaW5lciBpbnN0YW5jZW9mIEVyKSkgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCB0eXBlOiAnY29udGFpbmVyJyBtdXN0IGJlIGEgU3RyaW5nIG9yIEhUTUxFbGVtZW50LlwiKTtcbiAgICAgICAgICB0aGlzLl9jb250YWluZXIgPSBlLmNvbnRhaW5lcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlLm1heEJvdW5kcyAmJiB0aGlzLnNldE1heEJvdW5kcyhlLm1heEJvdW5kcyksIHQuYmluZEFsbChbXCJfb25XaW5kb3dPbmxpbmVcIiwgXCJfb25XaW5kb3dSZXNpemVcIiwgXCJfb25NYXBTY3JvbGxcIiwgXCJfY29udGV4dExvc3RcIiwgXCJfY29udGV4dFJlc3RvcmVkXCJdLCB0aGlzKSwgdGhpcy5fc2V0dXBDb250YWluZXIoKSwgdGhpcy5fc2V0dXBQYWludGVyKCksIHZvaWQgMCA9PT0gdGhpcy5wYWludGVyKSB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBXZWJHTC5cIik7XG4gICAgICAgIHRoaXMub24oXCJtb3ZlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gaS5fdXBkYXRlKCExKTtcbiAgICAgICAgfSksIHRoaXMub24oXCJtb3ZlZW5kXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gaS5fdXBkYXRlKCExKTtcbiAgICAgICAgfSksIHRoaXMub24oXCJ6b29tXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gaS5fdXBkYXRlKCEwKTtcbiAgICAgICAgfSksIHZvaWQgMCAhPT0gdC53aW5kb3cgJiYgKHQud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJvbmxpbmVcIiwgdGhpcy5fb25XaW5kb3dPbmxpbmUsICExKSwgdC53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB0aGlzLl9vbldpbmRvd1Jlc2l6ZSwgITEpLCB0LndpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwib3JpZW50YXRpb25jaGFuZ2VcIiwgdGhpcy5fb25XaW5kb3dSZXNpemUsICExKSksIHRoaXMuaGFuZGxlcnMgPSBuZXcgZ3IodGhpcywgZSksIHRoaXMuX2hhc2ggPSBlLmhhc2ggJiYgbmV3IElvKFwic3RyaW5nXCIgPT0gdHlwZW9mIGUuaGFzaCAmJiBlLmhhc2ggfHwgdm9pZCAwKS5hZGRUbyh0aGlzKSwgdGhpcy5faGFzaCAmJiB0aGlzLl9oYXNoLl9vbkhhc2hDaGFuZ2UoKSB8fCAodGhpcy5qdW1wVG8oe1xuICAgICAgICAgIGNlbnRlcjogZS5jZW50ZXIsXG4gICAgICAgICAgem9vbTogZS56b29tLFxuICAgICAgICAgIGJlYXJpbmc6IGUuYmVhcmluZyxcbiAgICAgICAgICBwaXRjaDogZS5waXRjaFxuICAgICAgICB9KSwgZS5ib3VuZHMgJiYgKHRoaXMucmVzaXplKCksIHRoaXMuZml0Qm91bmRzKGUuYm91bmRzLCB0LmV4dGVuZCh7fSwgZS5maXRCb3VuZHNPcHRpb25zLCB7XG4gICAgICAgICAgZHVyYXRpb246IDBcbiAgICAgICAgfSkpKSksIHRoaXMucmVzaXplKCksIHRoaXMuX2xvY2FsSWRlb2dyYXBoRm9udEZhbWlseSA9IGUubG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5LCBlLnN0eWxlICYmIHRoaXMuc2V0U3R5bGUoZS5zdHlsZSwge1xuICAgICAgICAgIGxvY2FsSWRlb2dyYXBoRm9udEZhbWlseTogZS5sb2NhbElkZW9ncmFwaEZvbnRGYW1pbHlcbiAgICAgICAgfSksIGUuYXR0cmlidXRpb25Db250cm9sICYmIHRoaXMuYWRkQ29udHJvbChuZXcgeXIoe1xuICAgICAgICAgIGN1c3RvbUF0dHJpYnV0aW9uOiBlLmN1c3RvbUF0dHJpYnV0aW9uXG4gICAgICAgIH0pKSwgdGhpcy5hZGRDb250cm9sKG5ldyB4cigpLCBlLmxvZ29Qb3NpdGlvbiksIHRoaXMub24oXCJzdHlsZS5sb2FkXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpLnRyYW5zZm9ybS51bm1vZGlmaWVkICYmIGkuanVtcFRvKGkuc3R5bGUuc3R5bGVzaGVldCk7XG4gICAgICAgIH0pLCB0aGlzLm9uKFwiZGF0YVwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIGkuX3VwZGF0ZShcInN0eWxlXCIgPT09IGUuZGF0YVR5cGUpLCBpLmZpcmUobmV3IHQuRXZlbnQoZS5kYXRhVHlwZSArIFwiZGF0YVwiLCBlKSk7XG4gICAgICAgIH0pLCB0aGlzLm9uKFwiZGF0YWxvYWRpbmdcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICBpLmZpcmUobmV3IHQuRXZlbnQoZS5kYXRhVHlwZSArIFwiZGF0YWxvYWRpbmdcIiwgZSkpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgbyAmJiAoci5fX3Byb3RvX18gPSBvKSwgKHIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShvICYmIG8ucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSByO1xuICAgICAgdmFyIGEgPSB7XG4gICAgICAgIHNob3dUaWxlQm91bmRhcmllczoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgc2hvd1BhZGRpbmc6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH0sXG4gICAgICAgIHNob3dDb2xsaXNpb25Cb3hlczoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgc2hvd092ZXJkcmF3SW5zcGVjdG9yOiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9LFxuICAgICAgICByZXBhaW50OiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9LFxuICAgICAgICB2ZXJ0aWNlczoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJldHVybiByLnByb3RvdHlwZS5fZ2V0TWFwSWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXBJZDtcbiAgICAgIH0sIHIucHJvdG90eXBlLmFkZENvbnRyb2wgPSBmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgICBpZiAodm9pZCAwID09PSBpICYmIChpID0gZS5nZXREZWZhdWx0UG9zaXRpb24gPyBlLmdldERlZmF1bHRQb3NpdGlvbigpIDogXCJ0b3AtcmlnaHRcIiksICFlIHx8ICFlLm9uQWRkKSByZXR1cm4gdGhpcy5maXJlKG5ldyB0LkVycm9yRXZlbnQobmV3IEVycm9yKFwiSW52YWxpZCBhcmd1bWVudCB0byBtYXAuYWRkQ29udHJvbCgpLiBBcmd1bWVudCBtdXN0IGJlIGEgY29udHJvbCB3aXRoIG9uQWRkIGFuZCBvblJlbW92ZSBtZXRob2RzLlwiKSkpO1xuICAgICAgICB2YXIgbyA9IGUub25BZGQodGhpcyk7XG5cbiAgICAgICAgdGhpcy5fY29udHJvbHMucHVzaChlKTtcblxuICAgICAgICB2YXIgciA9IHRoaXMuX2NvbnRyb2xQb3NpdGlvbnNbaV07XG4gICAgICAgIHJldHVybiAtMSAhPT0gaS5pbmRleE9mKFwiYm90dG9tXCIpID8gci5pbnNlcnRCZWZvcmUobywgci5maXJzdENoaWxkKSA6IHIuYXBwZW5kQ2hpbGQobyksIHRoaXM7XG4gICAgICB9LCByLnByb3RvdHlwZS5yZW1vdmVDb250cm9sID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKCFlIHx8ICFlLm9uUmVtb3ZlKSByZXR1cm4gdGhpcy5maXJlKG5ldyB0LkVycm9yRXZlbnQobmV3IEVycm9yKFwiSW52YWxpZCBhcmd1bWVudCB0byBtYXAucmVtb3ZlQ29udHJvbCgpLiBBcmd1bWVudCBtdXN0IGJlIGEgY29udHJvbCB3aXRoIG9uQWRkIGFuZCBvblJlbW92ZSBtZXRob2RzLlwiKSkpO1xuXG4gICAgICAgIHZhciBpID0gdGhpcy5fY29udHJvbHMuaW5kZXhPZihlKTtcblxuICAgICAgICByZXR1cm4gaSA+IC0xICYmIHRoaXMuX2NvbnRyb2xzLnNwbGljZShpLCAxKSwgZS5vblJlbW92ZSh0aGlzKSwgdGhpcztcbiAgICAgIH0sIHIucHJvdG90eXBlLmhhc0NvbnRyb2wgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29udHJvbHMuaW5kZXhPZih0KSA+IC0xO1xuICAgICAgfSwgci5wcm90b3R5cGUucmVzaXplID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIGkgPSB0aGlzLl9jb250YWluZXJEaW1lbnNpb25zKCksXG4gICAgICAgICAgICBvID0gaVswXSxcbiAgICAgICAgICAgIHIgPSBpWzFdO1xuXG4gICAgICAgIHRoaXMuX3Jlc2l6ZUNhbnZhcyhvLCByKSwgdGhpcy50cmFuc2Zvcm0ucmVzaXplKG8sIHIpLCB0aGlzLnBhaW50ZXIucmVzaXplKG8sIHIpO1xuICAgICAgICB2YXIgYSA9ICF0aGlzLl9tb3Zpbmc7XG4gICAgICAgIHJldHVybiBhICYmICh0aGlzLnN0b3AoKSwgdGhpcy5maXJlKG5ldyB0LkV2ZW50KFwibW92ZXN0YXJ0XCIsIGUpKS5maXJlKG5ldyB0LkV2ZW50KFwibW92ZVwiLCBlKSkpLCB0aGlzLmZpcmUobmV3IHQuRXZlbnQoXCJyZXNpemVcIiwgZSkpLCBhICYmIHRoaXMuZmlyZShuZXcgdC5FdmVudChcIm1vdmVlbmRcIiwgZSkpLCB0aGlzO1xuICAgICAgfSwgci5wcm90b3R5cGUuZ2V0Qm91bmRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0uZ2V0Qm91bmRzKCk7XG4gICAgICB9LCByLnByb3RvdHlwZS5nZXRNYXhCb3VuZHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybS5nZXRNYXhCb3VuZHMoKTtcbiAgICAgIH0sIHIucHJvdG90eXBlLnNldE1heEJvdW5kcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybS5zZXRNYXhCb3VuZHModC5MbmdMYXRCb3VuZHMuY29udmVydChlKSksIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgfSwgci5wcm90b3R5cGUuc2V0TWluWm9vbSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGlmICgodCA9IG51bGwgPT0gdCA/IC0yIDogdCkgPj0gLTIgJiYgdCA8PSB0aGlzLnRyYW5zZm9ybS5tYXhab29tKSByZXR1cm4gdGhpcy50cmFuc2Zvcm0ubWluWm9vbSA9IHQsIHRoaXMuX3VwZGF0ZSgpLCB0aGlzLmdldFpvb20oKSA8IHQgJiYgdGhpcy5zZXRab29tKHQpLCB0aGlzO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJtaW5ab29tIG11c3QgYmUgYmV0d2VlbiAtMiBhbmQgdGhlIGN1cnJlbnQgbWF4Wm9vbSwgaW5jbHVzaXZlXCIpO1xuICAgICAgfSwgci5wcm90b3R5cGUuZ2V0TWluWm9vbSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtLm1pblpvb207XG4gICAgICB9LCByLnByb3RvdHlwZS5zZXRNYXhab29tID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgaWYgKCh0ID0gbnVsbCA9PSB0ID8gMjIgOiB0KSA+PSB0aGlzLnRyYW5zZm9ybS5taW5ab29tKSByZXR1cm4gdGhpcy50cmFuc2Zvcm0ubWF4Wm9vbSA9IHQsIHRoaXMuX3VwZGF0ZSgpLCB0aGlzLmdldFpvb20oKSA+IHQgJiYgdGhpcy5zZXRab29tKHQpLCB0aGlzO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJtYXhab29tIG11c3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IG1pblpvb21cIik7XG4gICAgICB9LCByLnByb3RvdHlwZS5nZXRNYXhab29tID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0ubWF4Wm9vbTtcbiAgICAgIH0sIHIucHJvdG90eXBlLnNldE1pblBpdGNoID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgaWYgKCh0ID0gbnVsbCA9PSB0ID8gMCA6IHQpIDwgMCkgdGhyb3cgbmV3IEVycm9yKFwibWluUGl0Y2ggbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMFwiKTtcbiAgICAgICAgaWYgKHQgPj0gMCAmJiB0IDw9IHRoaXMudHJhbnNmb3JtLm1heFBpdGNoKSByZXR1cm4gdGhpcy50cmFuc2Zvcm0ubWluUGl0Y2ggPSB0LCB0aGlzLl91cGRhdGUoKSwgdGhpcy5nZXRQaXRjaCgpIDwgdCAmJiB0aGlzLnNldFBpdGNoKHQpLCB0aGlzO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJtaW5QaXRjaCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgdGhlIGN1cnJlbnQgbWF4UGl0Y2gsIGluY2x1c2l2ZVwiKTtcbiAgICAgIH0sIHIucHJvdG90eXBlLmdldE1pblBpdGNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0ubWluUGl0Y2g7XG4gICAgICB9LCByLnByb3RvdHlwZS5zZXRNYXhQaXRjaCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGlmICgodCA9IG51bGwgPT0gdCA/IDYwIDogdCkgPiA2MCkgdGhyb3cgbmV3IEVycm9yKFwibWF4UGl0Y2ggbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gNjBcIik7XG4gICAgICAgIGlmICh0ID49IHRoaXMudHJhbnNmb3JtLm1pblBpdGNoKSByZXR1cm4gdGhpcy50cmFuc2Zvcm0ubWF4UGl0Y2ggPSB0LCB0aGlzLl91cGRhdGUoKSwgdGhpcy5nZXRQaXRjaCgpID4gdCAmJiB0aGlzLnNldFBpdGNoKHQpLCB0aGlzO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJtYXhQaXRjaCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCBtaW5QaXRjaFwiKTtcbiAgICAgIH0sIHIucHJvdG90eXBlLmdldE1heFBpdGNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0ubWF4UGl0Y2g7XG4gICAgICB9LCByLnByb3RvdHlwZS5nZXRSZW5kZXJXb3JsZENvcGllcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtLnJlbmRlcldvcmxkQ29waWVzO1xuICAgICAgfSwgci5wcm90b3R5cGUuc2V0UmVuZGVyV29ybGRDb3BpZXMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0ucmVuZGVyV29ybGRDb3BpZXMgPSB0LCB0aGlzLl91cGRhdGUoKTtcbiAgICAgIH0sIHIucHJvdG90eXBlLnByb2plY3QgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0ubG9jYXRpb25Qb2ludCh0LkxuZ0xhdC5jb252ZXJ0KGUpKTtcbiAgICAgIH0sIHIucHJvdG90eXBlLnVucHJvamVjdCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybS5wb2ludExvY2F0aW9uKHQuUG9pbnQuY29udmVydChlKSk7XG4gICAgICB9LCByLnByb3RvdHlwZS5pc01vdmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21vdmluZyB8fCB0aGlzLmhhbmRsZXJzLmlzTW92aW5nKCk7XG4gICAgICB9LCByLnByb3RvdHlwZS5pc1pvb21pbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl96b29taW5nIHx8IHRoaXMuaGFuZGxlcnMuaXNab29taW5nKCk7XG4gICAgICB9LCByLnByb3RvdHlwZS5pc1JvdGF0aW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm90YXRpbmcgfHwgdGhpcy5oYW5kbGVycy5pc1JvdGF0aW5nKCk7XG4gICAgICB9LCByLnByb3RvdHlwZS5fY3JlYXRlRGVsZWdhdGVkTGlzdGVuZXIgPSBmdW5jdGlvbiAodCwgZSwgaSkge1xuICAgICAgICB2YXIgbyxcbiAgICAgICAgICAgIHIgPSB0aGlzO1xuXG4gICAgICAgIGlmIChcIm1vdXNlZW50ZXJcIiA9PT0gdCB8fCBcIm1vdXNlb3ZlclwiID09PSB0KSB7XG4gICAgICAgICAgdmFyIGEgPSAhMTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGF5ZXI6IGUsXG4gICAgICAgICAgICBsaXN0ZW5lcjogaSxcbiAgICAgICAgICAgIGRlbGVnYXRlczoge1xuICAgICAgICAgICAgICBtb3VzZW1vdmU6IGZ1bmN0aW9uIG1vdXNlbW92ZShvKSB7XG4gICAgICAgICAgICAgICAgdmFyIG4gPSByLmdldExheWVyKGUpID8gci5xdWVyeVJlbmRlcmVkRmVhdHVyZXMoby5wb2ludCwge1xuICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbZV1cbiAgICAgICAgICAgICAgICB9KSA6IFtdO1xuICAgICAgICAgICAgICAgIG4ubGVuZ3RoID8gYSB8fCAoYSA9ICEwLCBpLmNhbGwociwgbmV3IFJvKHQsIHIsIG8ub3JpZ2luYWxFdmVudCwge1xuICAgICAgICAgICAgICAgICAgZmVhdHVyZXM6IG5cbiAgICAgICAgICAgICAgICB9KSkpIDogYSA9ICExO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24gbW91c2VvdXQoKSB7XG4gICAgICAgICAgICAgICAgYSA9ICExO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcIm1vdXNlbGVhdmVcIiA9PT0gdCB8fCBcIm1vdXNlb3V0XCIgPT09IHQpIHtcbiAgICAgICAgICB2YXIgbiA9ICExO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsYXllcjogZSxcbiAgICAgICAgICAgIGxpc3RlbmVyOiBpLFxuICAgICAgICAgICAgZGVsZWdhdGVzOiB7XG4gICAgICAgICAgICAgIG1vdXNlbW92ZTogZnVuY3Rpb24gbW91c2Vtb3ZlKG8pIHtcbiAgICAgICAgICAgICAgICAoci5nZXRMYXllcihlKSA/IHIucXVlcnlSZW5kZXJlZEZlYXR1cmVzKG8ucG9pbnQsIHtcbiAgICAgICAgICAgICAgICAgIGxheWVyczogW2VdXG4gICAgICAgICAgICAgICAgfSkgOiBbXSkubGVuZ3RoID8gbiA9ICEwIDogbiAmJiAobiA9ICExLCBpLmNhbGwociwgbmV3IFJvKHQsIHIsIG8ub3JpZ2luYWxFdmVudCkpKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uIG1vdXNlb3V0KGUpIHtcbiAgICAgICAgICAgICAgICBuICYmIChuID0gITEsIGkuY2FsbChyLCBuZXcgUm8odCwgciwgZS5vcmlnaW5hbEV2ZW50KSkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbGF5ZXI6IGUsXG4gICAgICAgICAgbGlzdGVuZXI6IGksXG4gICAgICAgICAgZGVsZWdhdGVzOiAobyA9IHt9LCBvW3RdID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgIHZhciBvID0gci5nZXRMYXllcihlKSA/IHIucXVlcnlSZW5kZXJlZEZlYXR1cmVzKHQucG9pbnQsIHtcbiAgICAgICAgICAgICAgbGF5ZXJzOiBbZV1cbiAgICAgICAgICAgIH0pIDogW107XG4gICAgICAgICAgICBvLmxlbmd0aCAmJiAodC5mZWF0dXJlcyA9IG8sIGkuY2FsbChyLCB0KSwgZGVsZXRlIHQuZmVhdHVyZXMpO1xuICAgICAgICAgIH0sIG8pXG4gICAgICAgIH07XG4gICAgICB9LCByLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICAgIGlmICh2b2lkIDAgPT09IGkpIHJldHVybiBvLnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsIHQsIGUpO1xuXG4gICAgICAgIHZhciByID0gdGhpcy5fY3JlYXRlRGVsZWdhdGVkTGlzdGVuZXIodCwgZSwgaSk7XG5cbiAgICAgICAgZm9yICh2YXIgYSBpbiB0aGlzLl9kZWxlZ2F0ZWRMaXN0ZW5lcnMgPSB0aGlzLl9kZWxlZ2F0ZWRMaXN0ZW5lcnMgfHwge30sIHRoaXMuX2RlbGVnYXRlZExpc3RlbmVyc1t0XSA9IHRoaXMuX2RlbGVnYXRlZExpc3RlbmVyc1t0XSB8fCBbXSwgdGhpcy5fZGVsZWdhdGVkTGlzdGVuZXJzW3RdLnB1c2gociksIHIuZGVsZWdhdGVzKSB7XG4gICAgICAgICAgdGhpcy5vbihhLCByLmRlbGVnYXRlc1thXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sIHIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbiAodCwgZSwgaSkge1xuICAgICAgICBpZiAodm9pZCAwID09PSBpKSByZXR1cm4gby5wcm90b3R5cGUub25jZS5jYWxsKHRoaXMsIHQsIGUpO1xuXG4gICAgICAgIHZhciByID0gdGhpcy5fY3JlYXRlRGVsZWdhdGVkTGlzdGVuZXIodCwgZSwgaSk7XG5cbiAgICAgICAgZm9yICh2YXIgYSBpbiByLmRlbGVnYXRlcykge1xuICAgICAgICAgIHRoaXMub25jZShhLCByLmRlbGVnYXRlc1thXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sIHIucHJvdG90eXBlLm9mZiA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICAgIHZhciByID0gdGhpcztcbiAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gaSA/IG8ucHJvdG90eXBlLm9mZi5jYWxsKHRoaXMsIHQsIGUpIDogKHRoaXMuX2RlbGVnYXRlZExpc3RlbmVycyAmJiB0aGlzLl9kZWxlZ2F0ZWRMaXN0ZW5lcnNbdF0gJiYgZnVuY3Rpb24gKG8pIHtcbiAgICAgICAgICBmb3IgKHZhciBhID0gb1t0XSwgbiA9IDA7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgICB2YXIgcyA9IGFbbl07XG5cbiAgICAgICAgICAgIGlmIChzLmxheWVyID09PSBlICYmIHMubGlzdGVuZXIgPT09IGkpIHtcbiAgICAgICAgICAgICAgZm9yICh2YXIgbCBpbiBzLmRlbGVnYXRlcykge1xuICAgICAgICAgICAgICAgIHIub2ZmKGwsIHMuZGVsZWdhdGVzW2xdKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiBhLnNwbGljZShuLCAxKSwgcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0odGhpcy5fZGVsZWdhdGVkTGlzdGVuZXJzKSwgdGhpcyk7XG4gICAgICB9LCByLnByb3RvdHlwZS5xdWVyeVJlbmRlcmVkRmVhdHVyZXMgPSBmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgICBpZiAoIXRoaXMuc3R5bGUpIHJldHVybiBbXTtcbiAgICAgICAgdmFyIG87XG4gICAgICAgIGlmICh2b2lkIDAgIT09IGkgfHwgdm9pZCAwID09PSBlIHx8IGUgaW5zdGFuY2VvZiB0LlBvaW50IHx8IEFycmF5LmlzQXJyYXkoZSkgfHwgKGkgPSBlLCBlID0gdm9pZCAwKSwgaSA9IGkgfHwge30sIChlID0gZSB8fCBbWzAsIDBdLCBbdGhpcy50cmFuc2Zvcm0ud2lkdGgsIHRoaXMudHJhbnNmb3JtLmhlaWdodF1dKSBpbnN0YW5jZW9mIHQuUG9pbnQgfHwgXCJudW1iZXJcIiA9PSB0eXBlb2YgZVswXSkgbyA9IFt0LlBvaW50LmNvbnZlcnQoZSldO2Vsc2Uge1xuICAgICAgICAgIHZhciByID0gdC5Qb2ludC5jb252ZXJ0KGVbMF0pLFxuICAgICAgICAgICAgICBhID0gdC5Qb2ludC5jb252ZXJ0KGVbMV0pO1xuICAgICAgICAgIG8gPSBbciwgbmV3IHQuUG9pbnQoYS54LCByLnkpLCBhLCBuZXcgdC5Qb2ludChyLngsIGEueSksIHJdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLnF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhvLCBpLCB0aGlzLnRyYW5zZm9ybSk7XG4gICAgICB9LCByLnByb3RvdHlwZS5xdWVyeVNvdXJjZUZlYXR1cmVzID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUucXVlcnlTb3VyY2VGZWF0dXJlcyh0LCBlKTtcbiAgICAgIH0sIHIucHJvdG90eXBlLnNldFN0eWxlID0gZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgICAgcmV0dXJuICExICE9PSAoaSA9IHQuZXh0ZW5kKHt9LCB7XG4gICAgICAgICAgbG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5OiB0aGlzLl9sb2NhbElkZW9ncmFwaEZvbnRGYW1pbHlcbiAgICAgICAgfSwgaSkpLmRpZmYgJiYgaS5sb2NhbElkZW9ncmFwaEZvbnRGYW1pbHkgPT09IHRoaXMuX2xvY2FsSWRlb2dyYXBoRm9udEZhbWlseSAmJiB0aGlzLnN0eWxlICYmIGUgPyAodGhpcy5fZGlmZlN0eWxlKGUsIGkpLCB0aGlzKSA6ICh0aGlzLl9sb2NhbElkZW9ncmFwaEZvbnRGYW1pbHkgPSBpLmxvY2FsSWRlb2dyYXBoRm9udEZhbWlseSwgdGhpcy5fdXBkYXRlU3R5bGUoZSwgaSkpO1xuICAgICAgfSwgci5wcm90b3R5cGUuX2dldFVJU3RyaW5nID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdmFyIGUgPSB0aGlzLl9sb2NhbGVbdF07XG4gICAgICAgIGlmIChudWxsID09IGUpIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgVUkgc3RyaW5nICdcIiArIHQgKyBcIidcIik7XG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSwgci5wcm90b3R5cGUuX3VwZGF0ZVN0eWxlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUgJiYgKHRoaXMuc3R5bGUuc2V0RXZlbnRlZFBhcmVudChudWxsKSwgdGhpcy5zdHlsZS5fcmVtb3ZlKCkpLCB0ID8gKHRoaXMuc3R5bGUgPSBuZXcgamUodGhpcywgZSB8fCB7fSksIHRoaXMuc3R5bGUuc2V0RXZlbnRlZFBhcmVudCh0aGlzLCB7XG4gICAgICAgICAgc3R5bGU6IHRoaXMuc3R5bGVcbiAgICAgICAgfSksIFwic3RyaW5nXCIgPT0gdHlwZW9mIHQgPyB0aGlzLnN0eWxlLmxvYWRVUkwodCkgOiB0aGlzLnN0eWxlLmxvYWRKU09OKHQpLCB0aGlzKSA6IChkZWxldGUgdGhpcy5zdHlsZSwgdGhpcyk7XG4gICAgICB9LCByLnByb3RvdHlwZS5fbGF6eUluaXRFbXB0eVN0eWxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnN0eWxlIHx8ICh0aGlzLnN0eWxlID0gbmV3IGplKHRoaXMsIHt9KSwgdGhpcy5zdHlsZS5zZXRFdmVudGVkUGFyZW50KHRoaXMsIHtcbiAgICAgICAgICBzdHlsZTogdGhpcy5zdHlsZVxuICAgICAgICB9KSwgdGhpcy5zdHlsZS5sb2FkRW1wdHkoKSk7XG4gICAgICB9LCByLnByb3RvdHlwZS5fZGlmZlN0eWxlID0gZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgICAgdmFyIG8gPSB0aGlzO1xuXG4gICAgICAgIGlmIChcInN0cmluZ1wiID09IHR5cGVvZiBlKSB7XG4gICAgICAgICAgdmFyIHIgPSB0aGlzLl9yZXF1ZXN0TWFuYWdlci5ub3JtYWxpemVTdHlsZVVSTChlKSxcbiAgICAgICAgICAgICAgYSA9IHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnRyYW5zZm9ybVJlcXVlc3QociwgdC5SZXNvdXJjZVR5cGUuU3R5bGUpO1xuXG4gICAgICAgICAgdC5nZXRKU09OKGEsIGZ1bmN0aW9uIChlLCByKSB7XG4gICAgICAgICAgICBlID8gby5maXJlKG5ldyB0LkVycm9yRXZlbnQoZSkpIDogciAmJiBvLl91cGRhdGVEaWZmKHIsIGkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgXCJvYmplY3RcIiA9PSB0eXBlb2YgZSAmJiB0aGlzLl91cGRhdGVEaWZmKGUsIGkpO1xuICAgICAgfSwgci5wcm90b3R5cGUuX3VwZGF0ZURpZmYgPSBmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMuc3R5bGUuc2V0U3RhdGUoZSkgJiYgdGhpcy5fdXBkYXRlKCEwKTtcbiAgICAgICAgfSBjYXRjaCAobykge1xuICAgICAgICAgIHQud2Fybk9uY2UoXCJVbmFibGUgdG8gcGVyZm9ybSBzdHlsZSBkaWZmOiBcIiArIChvLm1lc3NhZ2UgfHwgby5lcnJvciB8fCBvKSArIFwiLiAgUmVidWlsZGluZyB0aGUgc3R5bGUgZnJvbSBzY3JhdGNoLlwiKSwgdGhpcy5fdXBkYXRlU3R5bGUoZSwgaSk7XG4gICAgICAgIH1cbiAgICAgIH0sIHIucHJvdG90eXBlLmdldFN0eWxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5zdHlsZSkgcmV0dXJuIHRoaXMuc3R5bGUuc2VyaWFsaXplKCk7XG4gICAgICB9LCByLnByb3RvdHlwZS5pc1N0eWxlTG9hZGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZSA/IHRoaXMuc3R5bGUubG9hZGVkKCkgOiB0Lndhcm5PbmNlKFwiVGhlcmUgaXMgbm8gc3R5bGUgYWRkZWQgdG8gdGhlIG1hcC5cIik7XG4gICAgICB9LCByLnByb3RvdHlwZS5hZGRTb3VyY2UgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGF6eUluaXRFbXB0eVN0eWxlKCksIHRoaXMuc3R5bGUuYWRkU291cmNlKHQsIGUpLCB0aGlzLl91cGRhdGUoITApO1xuICAgICAgfSwgci5wcm90b3R5cGUuaXNTb3VyY2VMb2FkZWQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgaSA9IHRoaXMuc3R5bGUgJiYgdGhpcy5zdHlsZS5zb3VyY2VDYWNoZXNbZV07XG4gICAgICAgIGlmICh2b2lkIDAgIT09IGkpIHJldHVybiBpLmxvYWRlZCgpO1xuICAgICAgICB0aGlzLmZpcmUobmV3IHQuRXJyb3JFdmVudChuZXcgRXJyb3IoXCJUaGVyZSBpcyBubyBzb3VyY2Ugd2l0aCBJRCAnXCIgKyBlICsgXCInXCIpKSk7XG4gICAgICB9LCByLnByb3RvdHlwZS5hcmVUaWxlc0xvYWRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHQgPSB0aGlzLnN0eWxlICYmIHRoaXMuc3R5bGUuc291cmNlQ2FjaGVzO1xuXG4gICAgICAgIGZvciAodmFyIGUgaW4gdCkge1xuICAgICAgICAgIHZhciBpID0gdFtlXS5fdGlsZXM7XG5cbiAgICAgICAgICBmb3IgKHZhciBvIGluIGkpIHtcbiAgICAgICAgICAgIHZhciByID0gaVtvXTtcbiAgICAgICAgICAgIGlmIChcImxvYWRlZFwiICE9PSByLnN0YXRlICYmIFwiZXJyb3JlZFwiICE9PSByLnN0YXRlKSByZXR1cm4gITE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICEwO1xuICAgICAgfSwgci5wcm90b3R5cGUuYWRkU291cmNlVHlwZSA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYXp5SW5pdEVtcHR5U3R5bGUoKSwgdGhpcy5zdHlsZS5hZGRTb3VyY2VUeXBlKHQsIGUsIGkpO1xuICAgICAgfSwgci5wcm90b3R5cGUucmVtb3ZlU291cmNlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUucmVtb3ZlU291cmNlKHQpLCB0aGlzLl91cGRhdGUoITApO1xuICAgICAgfSwgci5wcm90b3R5cGUuZ2V0U291cmNlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuZ2V0U291cmNlKHQpO1xuICAgICAgfSwgci5wcm90b3R5cGUuYWRkSW1hZ2UgPSBmdW5jdGlvbiAoZSwgaSwgbykge1xuICAgICAgICB2b2lkIDAgPT09IG8gJiYgKG8gPSB7fSk7XG4gICAgICAgIHZhciByID0gby5waXhlbFJhdGlvO1xuICAgICAgICB2b2lkIDAgPT09IHIgJiYgKHIgPSAxKTtcbiAgICAgICAgdmFyIGEgPSBvLnNkZjtcbiAgICAgICAgdm9pZCAwID09PSBhICYmIChhID0gITEpO1xuICAgICAgICB2YXIgbiA9IG8uc3RyZXRjaFgsXG4gICAgICAgICAgICBzID0gby5zdHJldGNoWSxcbiAgICAgICAgICAgIGwgPSBvLmNvbnRlbnQ7XG5cbiAgICAgICAgaWYgKHRoaXMuX2xhenlJbml0RW1wdHlTdHlsZSgpLCBpIGluc3RhbmNlb2YgVHIgfHwgSXIgJiYgaSBpbnN0YW5jZW9mIElyKSB7XG4gICAgICAgICAgdmFyIGMgPSB0LmJyb3dzZXIuZ2V0SW1hZ2VEYXRhKGkpO1xuICAgICAgICAgIHRoaXMuc3R5bGUuYWRkSW1hZ2UoZSwge1xuICAgICAgICAgICAgZGF0YTogbmV3IHQuUkdCQUltYWdlKHtcbiAgICAgICAgICAgICAgd2lkdGg6IGMud2lkdGgsXG4gICAgICAgICAgICAgIGhlaWdodDogYy5oZWlnaHRcbiAgICAgICAgICAgIH0sIGMuZGF0YSksXG4gICAgICAgICAgICBwaXhlbFJhdGlvOiByLFxuICAgICAgICAgICAgc3RyZXRjaFg6IG4sXG4gICAgICAgICAgICBzdHJldGNoWTogcyxcbiAgICAgICAgICAgIGNvbnRlbnQ6IGwsXG4gICAgICAgICAgICBzZGY6IGEsXG4gICAgICAgICAgICB2ZXJzaW9uOiAwXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHZvaWQgMCA9PT0gaS53aWR0aCB8fCB2b2lkIDAgPT09IGkuaGVpZ2h0KSByZXR1cm4gdGhpcy5maXJlKG5ldyB0LkVycm9yRXZlbnQobmV3IEVycm9yKFwiSW52YWxpZCBhcmd1bWVudHMgdG8gbWFwLmFkZEltYWdlKCkuIFRoZSBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhbiBgSFRNTEltYWdlRWxlbWVudGAsIGBJbWFnZURhdGFgLCBgSW1hZ2VCaXRtYXBgLCBvciBvYmplY3Qgd2l0aCBgd2lkdGhgLCBgaGVpZ2h0YCwgYW5kIGBkYXRhYCBwcm9wZXJ0aWVzIHdpdGggdGhlIHNhbWUgZm9ybWF0IGFzIGBJbWFnZURhdGFgXCIpKSk7XG4gICAgICAgICAgdmFyIHUgPSBpO1xuICAgICAgICAgIHRoaXMuc3R5bGUuYWRkSW1hZ2UoZSwge1xuICAgICAgICAgICAgZGF0YTogbmV3IHQuUkdCQUltYWdlKHtcbiAgICAgICAgICAgICAgd2lkdGg6IGkud2lkdGgsXG4gICAgICAgICAgICAgIGhlaWdodDogaS5oZWlnaHRcbiAgICAgICAgICAgIH0sIG5ldyBVaW50OEFycmF5KGkuZGF0YSkpLFxuICAgICAgICAgICAgcGl4ZWxSYXRpbzogcixcbiAgICAgICAgICAgIHN0cmV0Y2hYOiBuLFxuICAgICAgICAgICAgc3RyZXRjaFk6IHMsXG4gICAgICAgICAgICBjb250ZW50OiBsLFxuICAgICAgICAgICAgc2RmOiBhLFxuICAgICAgICAgICAgdmVyc2lvbjogMCxcbiAgICAgICAgICAgIHVzZXJJbWFnZTogdVxuICAgICAgICAgIH0pLCB1Lm9uQWRkICYmIHUub25BZGQodGhpcywgZSk7XG4gICAgICAgIH1cbiAgICAgIH0sIHIucHJvdG90eXBlLnVwZGF0ZUltYWdlID0gZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgICAgdmFyIG8gPSB0aGlzLnN0eWxlLmdldEltYWdlKGUpO1xuICAgICAgICBpZiAoIW8pIHJldHVybiB0aGlzLmZpcmUobmV3IHQuRXJyb3JFdmVudChuZXcgRXJyb3IoXCJUaGUgbWFwIGhhcyBubyBpbWFnZSB3aXRoIHRoYXQgaWQuIElmIHlvdSBhcmUgYWRkaW5nIGEgbmV3IGltYWdlIHVzZSBgbWFwLmFkZEltYWdlKC4uLilgIGluc3RlYWQuXCIpKSk7XG4gICAgICAgIHZhciByID0gaSBpbnN0YW5jZW9mIFRyIHx8IElyICYmIGkgaW5zdGFuY2VvZiBJciA/IHQuYnJvd3Nlci5nZXRJbWFnZURhdGEoaSkgOiBpLFxuICAgICAgICAgICAgYSA9IHIud2lkdGgsXG4gICAgICAgICAgICBuID0gci5oZWlnaHQsXG4gICAgICAgICAgICBzID0gci5kYXRhO1xuICAgICAgICByZXR1cm4gdm9pZCAwID09PSBhIHx8IHZvaWQgMCA9PT0gbiA/IHRoaXMuZmlyZShuZXcgdC5FcnJvckV2ZW50KG5ldyBFcnJvcihcIkludmFsaWQgYXJndW1lbnRzIHRvIG1hcC51cGRhdGVJbWFnZSgpLiBUaGUgc2Vjb25kIGFyZ3VtZW50IG11c3QgYmUgYW4gYEhUTUxJbWFnZUVsZW1lbnRgLCBgSW1hZ2VEYXRhYCwgYEltYWdlQml0bWFwYCwgb3Igb2JqZWN0IHdpdGggYHdpZHRoYCwgYGhlaWdodGAsIGFuZCBgZGF0YWAgcHJvcGVydGllcyB3aXRoIHRoZSBzYW1lIGZvcm1hdCBhcyBgSW1hZ2VEYXRhYFwiKSkpIDogYSAhPT0gby5kYXRhLndpZHRoIHx8IG4gIT09IG8uZGF0YS5oZWlnaHQgPyB0aGlzLmZpcmUobmV3IHQuRXJyb3JFdmVudChuZXcgRXJyb3IoXCJUaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgdXBkYXRlZCBpbWFnZSBtdXN0IGJlIHRoYXQgc2FtZSBhcyB0aGUgcHJldmlvdXMgdmVyc2lvbiBvZiB0aGUgaW1hZ2VcIikpKSA6IChvLmRhdGEucmVwbGFjZShzLCAhKGkgaW5zdGFuY2VvZiBUciB8fCBJciAmJiBpIGluc3RhbmNlb2YgSXIpKSwgdm9pZCB0aGlzLnN0eWxlLnVwZGF0ZUltYWdlKGUsIG8pKTtcbiAgICAgIH0sIHIucHJvdG90eXBlLmhhc0ltYWdlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIGUgPyAhIXRoaXMuc3R5bGUuZ2V0SW1hZ2UoZSkgOiAodGhpcy5maXJlKG5ldyB0LkVycm9yRXZlbnQobmV3IEVycm9yKFwiTWlzc2luZyByZXF1aXJlZCBpbWFnZSBpZFwiKSkpLCAhMSk7XG4gICAgICB9LCByLnByb3RvdHlwZS5yZW1vdmVJbWFnZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHRoaXMuc3R5bGUucmVtb3ZlSW1hZ2UodCk7XG4gICAgICB9LCByLnByb3RvdHlwZS5sb2FkSW1hZ2UgPSBmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgICB0LmdldEltYWdlKHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnRyYW5zZm9ybVJlcXVlc3QoZSwgdC5SZXNvdXJjZVR5cGUuSW1hZ2UpLCBpKTtcbiAgICAgIH0sIHIucHJvdG90eXBlLmxpc3RJbWFnZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLmxpc3RJbWFnZXMoKTtcbiAgICAgIH0sIHIucHJvdG90eXBlLmFkZExheWVyID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhenlJbml0RW1wdHlTdHlsZSgpLCB0aGlzLnN0eWxlLmFkZExheWVyKHQsIGUpLCB0aGlzLl91cGRhdGUoITApO1xuICAgICAgfSwgci5wcm90b3R5cGUubW92ZUxheWVyID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUubW92ZUxheWVyKHQsIGUpLCB0aGlzLl91cGRhdGUoITApO1xuICAgICAgfSwgci5wcm90b3R5cGUucmVtb3ZlTGF5ZXIgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5yZW1vdmVMYXllcih0KSwgdGhpcy5fdXBkYXRlKCEwKTtcbiAgICAgIH0sIHIucHJvdG90eXBlLmdldExheWVyID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuZ2V0TGF5ZXIodCk7XG4gICAgICB9LCByLnByb3RvdHlwZS5zZXRMYXllclpvb21SYW5nZSA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLnNldExheWVyWm9vbVJhbmdlKHQsIGUsIGkpLCB0aGlzLl91cGRhdGUoITApO1xuICAgICAgfSwgci5wcm90b3R5cGUuc2V0RmlsdGVyID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcbiAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gaSAmJiAoaSA9IHt9KSwgdGhpcy5zdHlsZS5zZXRGaWx0ZXIodCwgZSwgaSksIHRoaXMuX3VwZGF0ZSghMCk7XG4gICAgICB9LCByLnByb3RvdHlwZS5nZXRGaWx0ZXIgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5nZXRGaWx0ZXIodCk7XG4gICAgICB9LCByLnByb3RvdHlwZS5zZXRQYWludFByb3BlcnR5ID0gZnVuY3Rpb24gKHQsIGUsIGksIG8pIHtcbiAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gbyAmJiAobyA9IHt9KSwgdGhpcy5zdHlsZS5zZXRQYWludFByb3BlcnR5KHQsIGUsIGksIG8pLCB0aGlzLl91cGRhdGUoITApO1xuICAgICAgfSwgci5wcm90b3R5cGUuZ2V0UGFpbnRQcm9wZXJ0eSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLmdldFBhaW50UHJvcGVydHkodCwgZSk7XG4gICAgICB9LCByLnByb3RvdHlwZS5zZXRMYXlvdXRQcm9wZXJ0eSA9IGZ1bmN0aW9uICh0LCBlLCBpLCBvKSB7XG4gICAgICAgIHJldHVybiB2b2lkIDAgPT09IG8gJiYgKG8gPSB7fSksIHRoaXMuc3R5bGUuc2V0TGF5b3V0UHJvcGVydHkodCwgZSwgaSwgbyksIHRoaXMuX3VwZGF0ZSghMCk7XG4gICAgICB9LCByLnByb3RvdHlwZS5nZXRMYXlvdXRQcm9wZXJ0eSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLmdldExheW91dFByb3BlcnR5KHQsIGUpO1xuICAgICAgfSwgci5wcm90b3R5cGUuc2V0TGlnaHQgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gdm9pZCAwID09PSBlICYmIChlID0ge30pLCB0aGlzLl9sYXp5SW5pdEVtcHR5U3R5bGUoKSwgdGhpcy5zdHlsZS5zZXRMaWdodCh0LCBlKSwgdGhpcy5fdXBkYXRlKCEwKTtcbiAgICAgIH0sIHIucHJvdG90eXBlLmdldExpZ2h0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5nZXRMaWdodCgpO1xuICAgICAgfSwgci5wcm90b3R5cGUuc2V0RmVhdHVyZVN0YXRlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuc2V0RmVhdHVyZVN0YXRlKHQsIGUpLCB0aGlzLl91cGRhdGUoKTtcbiAgICAgIH0sIHIucHJvdG90eXBlLnJlbW92ZUZlYXR1cmVTdGF0ZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLnJlbW92ZUZlYXR1cmVTdGF0ZSh0LCBlKSwgdGhpcy5fdXBkYXRlKCk7XG4gICAgICB9LCByLnByb3RvdHlwZS5nZXRGZWF0dXJlU3RhdGUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5nZXRGZWF0dXJlU3RhdGUodCk7XG4gICAgICB9LCByLnByb3RvdHlwZS5nZXRDb250YWluZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250YWluZXI7XG4gICAgICB9LCByLnByb3RvdHlwZS5nZXRDYW52YXNDb250YWluZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYW52YXNDb250YWluZXI7XG4gICAgICB9LCByLnByb3RvdHlwZS5nZXRDYW52YXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYW52YXM7XG4gICAgICB9LCByLnByb3RvdHlwZS5fY29udGFpbmVyRGltZW5zaW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHQgPSAwLFxuICAgICAgICAgICAgZSA9IDA7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250YWluZXIgJiYgKHQgPSB0aGlzLl9jb250YWluZXIuY2xpZW50V2lkdGggfHwgNDAwLCBlID0gdGhpcy5fY29udGFpbmVyLmNsaWVudEhlaWdodCB8fCAzMDApLCBbdCwgZV07XG4gICAgICB9LCByLnByb3RvdHlwZS5fZGV0ZWN0TWlzc2luZ0NTUyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgXCJyZ2IoMjUwLCAxMjgsIDExNClcIiAhPT0gdC53aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLl9taXNzaW5nQ1NTQ2FuYXJ5KS5nZXRQcm9wZXJ0eVZhbHVlKFwiYmFja2dyb3VuZC1jb2xvclwiKSAmJiB0Lndhcm5PbmNlKFwiVGhpcyBwYWdlIGFwcGVhcnMgdG8gYmUgbWlzc2luZyBDU1MgZGVjbGFyYXRpb25zIGZvciBNYXBib3ggR0wgSlMsIHdoaWNoIG1heSBjYXVzZSB0aGUgbWFwIHRvIGRpc3BsYXkgaW5jb3JyZWN0bHkuIFBsZWFzZSBlbnN1cmUgeW91ciBwYWdlIGluY2x1ZGVzIG1hcGJveC1nbC5jc3MsIGFzIGRlc2NyaWJlZCBpbiBodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9hcGkvLlwiKTtcbiAgICAgIH0sIHIucHJvdG90eXBlLl9zZXR1cENvbnRhaW5lciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHQgPSB0aGlzLl9jb250YWluZXI7XG4gICAgICAgIHQuY2xhc3NMaXN0LmFkZChcIm1hcGJveGdsLW1hcFwiKSwgKHRoaXMuX21pc3NpbmdDU1NDYW5hcnkgPSBpLmNyZWF0ZShcImRpdlwiLCBcIm1hcGJveGdsLWNhbmFyeVwiLCB0KSkuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCIsIHRoaXMuX2RldGVjdE1pc3NpbmdDU1MoKTtcbiAgICAgICAgdmFyIGUgPSB0aGlzLl9jYW52YXNDb250YWluZXIgPSBpLmNyZWF0ZShcImRpdlwiLCBcIm1hcGJveGdsLWNhbnZhcy1jb250YWluZXJcIiwgdCk7XG4gICAgICAgIHRoaXMuX2ludGVyYWN0aXZlICYmIGUuY2xhc3NMaXN0LmFkZChcIm1hcGJveGdsLWludGVyYWN0aXZlXCIpLCB0aGlzLl9jYW52YXMgPSBpLmNyZWF0ZShcImNhbnZhc1wiLCBcIm1hcGJveGdsLWNhbnZhc1wiLCBlKSwgdGhpcy5fY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoXCJ3ZWJnbGNvbnRleHRsb3N0XCIsIHRoaXMuX2NvbnRleHRMb3N0LCAhMSksIHRoaXMuX2NhbnZhcy5hZGRFdmVudExpc3RlbmVyKFwid2ViZ2xjb250ZXh0cmVzdG9yZWRcIiwgdGhpcy5fY29udGV4dFJlc3RvcmVkLCAhMSksIHRoaXMuX2NhbnZhcy5zZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiLCBcIjBcIiksIHRoaXMuX2NhbnZhcy5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIFwiTWFwXCIpLCB0aGlzLl9jYW52YXMuc2V0QXR0cmlidXRlKFwicm9sZVwiLCBcInJlZ2lvblwiKTtcblxuICAgICAgICB2YXIgbyA9IHRoaXMuX2NvbnRhaW5lckRpbWVuc2lvbnMoKTtcblxuICAgICAgICB0aGlzLl9yZXNpemVDYW52YXMob1swXSwgb1sxXSk7XG5cbiAgICAgICAgdmFyIHIgPSB0aGlzLl9jb250cm9sQ29udGFpbmVyID0gaS5jcmVhdGUoXCJkaXZcIiwgXCJtYXBib3hnbC1jb250cm9sLWNvbnRhaW5lclwiLCB0KSxcbiAgICAgICAgICAgIGEgPSB0aGlzLl9jb250cm9sUG9zaXRpb25zID0ge307XG4gICAgICAgIFtcInRvcC1sZWZ0XCIsIFwidG9wLXJpZ2h0XCIsIFwiYm90dG9tLWxlZnRcIiwgXCJib3R0b20tcmlnaHRcIl0uZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICAgIGFbdF0gPSBpLmNyZWF0ZShcImRpdlwiLCBcIm1hcGJveGdsLWN0cmwtXCIgKyB0LCByKTtcbiAgICAgICAgfSksIHRoaXMuX2NvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHRoaXMuX29uTWFwU2Nyb2xsLCAhMSk7XG4gICAgICB9LCByLnByb3RvdHlwZS5fcmVzaXplQ2FudmFzID0gZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgICAgdmFyIG8gPSB0LmJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxO1xuICAgICAgICB0aGlzLl9jYW52YXMud2lkdGggPSBvICogZSwgdGhpcy5fY2FudmFzLmhlaWdodCA9IG8gKiBpLCB0aGlzLl9jYW52YXMuc3R5bGUud2lkdGggPSBlICsgXCJweFwiLCB0aGlzLl9jYW52YXMuc3R5bGUuaGVpZ2h0ID0gaSArIFwicHhcIjtcbiAgICAgIH0sIHIucHJvdG90eXBlLl9zZXR1cFBhaW50ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpID0gdC5leHRlbmQoe30sIGUud2ViR0xDb250ZXh0QXR0cmlidXRlcywge1xuICAgICAgICAgIGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ6IHRoaXMuX2ZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQsXG4gICAgICAgICAgcHJlc2VydmVEcmF3aW5nQnVmZmVyOiB0aGlzLl9wcmVzZXJ2ZURyYXdpbmdCdWZmZXIsXG4gICAgICAgICAgYW50aWFsaWFzOiB0aGlzLl9hbnRpYWxpYXMgfHwgITFcbiAgICAgICAgfSksXG4gICAgICAgICAgICBvID0gdGhpcy5fY2FudmFzLmdldENvbnRleHQoXCJ3ZWJnbFwiLCBpKSB8fCB0aGlzLl9jYW52YXMuZ2V0Q29udGV4dChcImV4cGVyaW1lbnRhbC13ZWJnbFwiLCBpKTtcblxuICAgICAgICBvID8gKHRoaXMucGFpbnRlciA9IG5ldyB5byhvLCB0aGlzLnRyYW5zZm9ybSksIHQud2VicFN1cHBvcnRlZC50ZXN0U3VwcG9ydChvKSkgOiB0aGlzLmZpcmUobmV3IHQuRXJyb3JFdmVudChuZXcgRXJyb3IoXCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBXZWJHTFwiKSkpO1xuICAgICAgfSwgci5wcm90b3R5cGUuX2NvbnRleHRMb3N0ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpLCB0aGlzLl9mcmFtZSAmJiAodGhpcy5fZnJhbWUuY2FuY2VsKCksIHRoaXMuX2ZyYW1lID0gbnVsbCksIHRoaXMuZmlyZShuZXcgdC5FdmVudChcIndlYmdsY29udGV4dGxvc3RcIiwge1xuICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGVcbiAgICAgICAgfSkpO1xuICAgICAgfSwgci5wcm90b3R5cGUuX2NvbnRleHRSZXN0b3JlZCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHRoaXMuX3NldHVwUGFpbnRlcigpLCB0aGlzLnJlc2l6ZSgpLCB0aGlzLl91cGRhdGUoKSwgdGhpcy5maXJlKG5ldyB0LkV2ZW50KFwid2ViZ2xjb250ZXh0cmVzdG9yZWRcIiwge1xuICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGVcbiAgICAgICAgfSkpO1xuICAgICAgfSwgci5wcm90b3R5cGUuX29uTWFwU2Nyb2xsID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgaWYgKHQudGFyZ2V0ID09PSB0aGlzLl9jb250YWluZXIpIHJldHVybiB0aGlzLl9jb250YWluZXIuc2Nyb2xsVG9wID0gMCwgdGhpcy5fY29udGFpbmVyLnNjcm9sbExlZnQgPSAwLCAhMTtcbiAgICAgIH0sIHIucHJvdG90eXBlLmxvYWRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLl9zdHlsZURpcnR5ICYmICF0aGlzLl9zb3VyY2VzRGlydHkgJiYgISF0aGlzLnN0eWxlICYmIHRoaXMuc3R5bGUubG9hZGVkKCk7XG4gICAgICB9LCByLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUgPyAodGhpcy5fc3R5bGVEaXJ0eSA9IHRoaXMuX3N0eWxlRGlydHkgfHwgdCwgdGhpcy5fc291cmNlc0RpcnR5ID0gITAsIHRoaXMudHJpZ2dlclJlcGFpbnQoKSwgdGhpcykgOiB0aGlzO1xuICAgICAgfSwgci5wcm90b3R5cGUuX3JlcXVlc3RSZW5kZXJGcmFtZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGUoKSwgdGhpcy5fcmVuZGVyVGFza1F1ZXVlLmFkZCh0KTtcbiAgICAgIH0sIHIucHJvdG90eXBlLl9jYW5jZWxSZW5kZXJGcmFtZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHRoaXMuX3JlbmRlclRhc2tRdWV1ZS5yZW1vdmUodCk7XG4gICAgICB9LCByLnByb3RvdHlwZS5fcmVuZGVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBvID0gdGhpcyxcbiAgICAgICAgICAgIHIgPSAwLFxuICAgICAgICAgICAgYSA9IHRoaXMucGFpbnRlci5jb250ZXh0LmV4dFRpbWVyUXVlcnk7XG5cbiAgICAgICAgaWYgKHRoaXMubGlzdGVucyhcImdwdS10aW1pbmctZnJhbWVcIikgJiYgKGkgPSBhLmNyZWF0ZVF1ZXJ5RVhUKCksIGEuYmVnaW5RdWVyeUVYVChhLlRJTUVfRUxBUFNFRF9FWFQsIGkpLCByID0gdC5icm93c2VyLm5vdygpKSwgdGhpcy5wYWludGVyLmNvbnRleHQuc2V0RGlydHkoKSwgdGhpcy5wYWludGVyLnNldEJhc2VTdGF0ZSgpLCB0aGlzLl9yZW5kZXJUYXNrUXVldWUucnVuKGUpLCAhdGhpcy5fcmVtb3ZlZCkge1xuICAgICAgICAgIHZhciBuID0gITE7XG5cbiAgICAgICAgICBpZiAodGhpcy5zdHlsZSAmJiB0aGlzLl9zdHlsZURpcnR5KSB7XG4gICAgICAgICAgICB0aGlzLl9zdHlsZURpcnR5ID0gITE7XG4gICAgICAgICAgICB2YXIgcyA9IHRoaXMudHJhbnNmb3JtLnpvb20sXG4gICAgICAgICAgICAgICAgbCA9IHQuYnJvd3Nlci5ub3coKTtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUuem9vbUhpc3RvcnkudXBkYXRlKHMsIGwpO1xuICAgICAgICAgICAgdmFyIGMgPSBuZXcgdC5FdmFsdWF0aW9uUGFyYW1ldGVycyhzLCB7XG4gICAgICAgICAgICAgIG5vdzogbCxcbiAgICAgICAgICAgICAgZmFkZUR1cmF0aW9uOiB0aGlzLl9mYWRlRHVyYXRpb24sXG4gICAgICAgICAgICAgIHpvb21IaXN0b3J5OiB0aGlzLnN0eWxlLnpvb21IaXN0b3J5LFxuICAgICAgICAgICAgICB0cmFuc2l0aW9uOiB0aGlzLnN0eWxlLmdldFRyYW5zaXRpb24oKVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgdSA9IGMuY3Jvc3NGYWRpbmdGYWN0b3IoKTtcbiAgICAgICAgICAgIDEgPT09IHUgJiYgdSA9PT0gdGhpcy5fY3Jvc3NGYWRpbmdGYWN0b3IgfHwgKG4gPSAhMCwgdGhpcy5fY3Jvc3NGYWRpbmdGYWN0b3IgPSB1KSwgdGhpcy5zdHlsZS51cGRhdGUoYyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRoaXMuc3R5bGUgJiYgdGhpcy5fc291cmNlc0RpcnR5ICYmICh0aGlzLl9zb3VyY2VzRGlydHkgPSAhMSwgdGhpcy5zdHlsZS5fdXBkYXRlU291cmNlcyh0aGlzLnRyYW5zZm9ybSkpLCB0aGlzLl9wbGFjZW1lbnREaXJ0eSA9IHRoaXMuc3R5bGUgJiYgdGhpcy5zdHlsZS5fdXBkYXRlUGxhY2VtZW50KHRoaXMucGFpbnRlci50cmFuc2Zvcm0sIHRoaXMuc2hvd0NvbGxpc2lvbkJveGVzLCB0aGlzLl9mYWRlRHVyYXRpb24sIHRoaXMuX2Nyb3NzU291cmNlQ29sbGlzaW9ucyksIHRoaXMucGFpbnRlci5yZW5kZXIodGhpcy5zdHlsZSwge1xuICAgICAgICAgICAgc2hvd1RpbGVCb3VuZGFyaWVzOiB0aGlzLnNob3dUaWxlQm91bmRhcmllcyxcbiAgICAgICAgICAgIHNob3dPdmVyZHJhd0luc3BlY3RvcjogdGhpcy5fc2hvd092ZXJkcmF3SW5zcGVjdG9yLFxuICAgICAgICAgICAgcm90YXRpbmc6IHRoaXMuaXNSb3RhdGluZygpLFxuICAgICAgICAgICAgem9vbWluZzogdGhpcy5pc1pvb21pbmcoKSxcbiAgICAgICAgICAgIG1vdmluZzogdGhpcy5pc01vdmluZygpLFxuICAgICAgICAgICAgZmFkZUR1cmF0aW9uOiB0aGlzLl9mYWRlRHVyYXRpb24sXG4gICAgICAgICAgICBzaG93UGFkZGluZzogdGhpcy5zaG93UGFkZGluZyxcbiAgICAgICAgICAgIGdwdVRpbWluZzogISF0aGlzLmxpc3RlbnMoXCJncHUtdGltaW5nLWxheWVyXCIpXG4gICAgICAgICAgfSksIHRoaXMuZmlyZShuZXcgdC5FdmVudChcInJlbmRlclwiKSksIHRoaXMubG9hZGVkKCkgJiYgIXRoaXMuX2xvYWRlZCAmJiAodGhpcy5fbG9hZGVkID0gITAsIHRoaXMuZmlyZShuZXcgdC5FdmVudChcImxvYWRcIikpKSwgdGhpcy5zdHlsZSAmJiAodGhpcy5zdHlsZS5oYXNUcmFuc2l0aW9ucygpIHx8IG4pICYmICh0aGlzLl9zdHlsZURpcnR5ID0gITApLCB0aGlzLnN0eWxlICYmICF0aGlzLl9wbGFjZW1lbnREaXJ0eSAmJiB0aGlzLnN0eWxlLl9yZWxlYXNlU3ltYm9sRmFkZVRpbGVzKCksIHRoaXMubGlzdGVucyhcImdwdS10aW1pbmctZnJhbWVcIikpIHtcbiAgICAgICAgICAgIHZhciBoID0gdC5icm93c2VyLm5vdygpIC0gcjtcbiAgICAgICAgICAgIGEuZW5kUXVlcnlFWFQoYS5USU1FX0VMQVBTRURfRVhULCBpKSwgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHZhciBlID0gYS5nZXRRdWVyeU9iamVjdEVYVChpLCBhLlFVRVJZX1JFU1VMVF9FWFQpIC8gMWU2O1xuICAgICAgICAgICAgICBhLmRlbGV0ZVF1ZXJ5RVhUKGkpLCBvLmZpcmUobmV3IHQuRXZlbnQoXCJncHUtdGltaW5nLWZyYW1lXCIsIHtcbiAgICAgICAgICAgICAgICBjcHVUaW1lOiBoLFxuICAgICAgICAgICAgICAgIGdwdVRpbWU6IGVcbiAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfSwgNTApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0aGlzLmxpc3RlbnMoXCJncHUtdGltaW5nLWxheWVyXCIpKSB7XG4gICAgICAgICAgICB2YXIgcCA9IHRoaXMucGFpbnRlci5jb2xsZWN0R3B1VGltZXJzKCk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgdmFyIGUgPSBvLnBhaW50ZXIucXVlcnlHcHVUaW1lcnMocCk7XG4gICAgICAgICAgICAgIG8uZmlyZShuZXcgdC5FdmVudChcImdwdS10aW1pbmctbGF5ZXJcIiwge1xuICAgICAgICAgICAgICAgIGxheWVyVGltZXM6IGVcbiAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfSwgNTApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBkID0gdGhpcy5fc291cmNlc0RpcnR5IHx8IHRoaXMuX3N0eWxlRGlydHkgfHwgdGhpcy5fcGxhY2VtZW50RGlydHk7XG4gICAgICAgICAgcmV0dXJuIGQgfHwgdGhpcy5fcmVwYWludCA/IHRoaXMudHJpZ2dlclJlcGFpbnQoKSA6ICF0aGlzLmlzTW92aW5nKCkgJiYgdGhpcy5sb2FkZWQoKSAmJiB0aGlzLmZpcmUobmV3IHQuRXZlbnQoXCJpZGxlXCIpKSwgIXRoaXMuX2xvYWRlZCB8fCB0aGlzLl9mdWxseUxvYWRlZCB8fCBkIHx8ICh0aGlzLl9mdWxseUxvYWRlZCA9ICEwKSwgdGhpcztcbiAgICAgICAgfVxuICAgICAgfSwgci5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9oYXNoICYmIHRoaXMuX2hhc2gucmVtb3ZlKCk7XG5cbiAgICAgICAgZm9yICh2YXIgZSA9IDAsIGkgPSB0aGlzLl9jb250cm9sczsgZSA8IGkubGVuZ3RoOyBlICs9IDEpIHtcbiAgICAgICAgICBpW2VdLm9uUmVtb3ZlKHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY29udHJvbHMgPSBbXSwgdGhpcy5fZnJhbWUgJiYgKHRoaXMuX2ZyYW1lLmNhbmNlbCgpLCB0aGlzLl9mcmFtZSA9IG51bGwpLCB0aGlzLl9yZW5kZXJUYXNrUXVldWUuY2xlYXIoKSwgdGhpcy5wYWludGVyLmRlc3Ryb3koKSwgdGhpcy5oYW5kbGVycy5kZXN0cm95KCksIGRlbGV0ZSB0aGlzLmhhbmRsZXJzLCB0aGlzLnNldFN0eWxlKG51bGwpLCB2b2lkIDAgIT09IHQud2luZG93ICYmICh0LndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHRoaXMuX29uV2luZG93UmVzaXplLCAhMSksIHQud2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJvcmllbnRhdGlvbmNoYW5nZVwiLCB0aGlzLl9vbldpbmRvd1Jlc2l6ZSwgITEpLCB0LndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwib25saW5lXCIsIHRoaXMuX29uV2luZG93T25saW5lLCAhMSkpO1xuICAgICAgICB2YXIgbyA9IHRoaXMucGFpbnRlci5jb250ZXh0LmdsLmdldEV4dGVuc2lvbihcIldFQkdMX2xvc2VfY29udGV4dFwiKTtcbiAgICAgICAgbyAmJiBvLmxvc2VDb250ZXh0KCksIENyKHRoaXMuX2NhbnZhc0NvbnRhaW5lciksIENyKHRoaXMuX2NvbnRyb2xDb250YWluZXIpLCBDcih0aGlzLl9taXNzaW5nQ1NTQ2FuYXJ5KSwgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoXCJtYXBib3hnbC1tYXBcIiksIHRoaXMuX3JlbW92ZWQgPSAhMCwgdGhpcy5maXJlKG5ldyB0LkV2ZW50KFwicmVtb3ZlXCIpKTtcbiAgICAgIH0sIHIucHJvdG90eXBlLnRyaWdnZXJSZXBhaW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZSA9IHRoaXM7XG4gICAgICAgIHRoaXMuc3R5bGUgJiYgIXRoaXMuX2ZyYW1lICYmICh0aGlzLl9mcmFtZSA9IHQuYnJvd3Nlci5mcmFtZShmdW5jdGlvbiAodCkge1xuICAgICAgICAgIGUuX2ZyYW1lID0gbnVsbCwgZS5fcmVuZGVyKHQpO1xuICAgICAgICB9KSk7XG4gICAgICB9LCByLnByb3RvdHlwZS5fb25XaW5kb3dPbmxpbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgfSwgci5wcm90b3R5cGUuX29uV2luZG93UmVzaXplID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdGhpcy5fdHJhY2tSZXNpemUgJiYgdGhpcy5yZXNpemUoe1xuICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IHRcbiAgICAgICAgfSkuX3VwZGF0ZSgpO1xuICAgICAgfSwgYS5zaG93VGlsZUJvdW5kYXJpZXMuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9zaG93VGlsZUJvdW5kYXJpZXM7XG4gICAgICB9LCBhLnNob3dUaWxlQm91bmRhcmllcy5zZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB0aGlzLl9zaG93VGlsZUJvdW5kYXJpZXMgIT09IHQgJiYgKHRoaXMuX3Nob3dUaWxlQm91bmRhcmllcyA9IHQsIHRoaXMuX3VwZGF0ZSgpKTtcbiAgICAgIH0sIGEuc2hvd1BhZGRpbmcuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9zaG93UGFkZGluZztcbiAgICAgIH0sIGEuc2hvd1BhZGRpbmcuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdGhpcy5fc2hvd1BhZGRpbmcgIT09IHQgJiYgKHRoaXMuX3Nob3dQYWRkaW5nID0gdCwgdGhpcy5fdXBkYXRlKCkpO1xuICAgICAgfSwgYS5zaG93Q29sbGlzaW9uQm94ZXMuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9zaG93Q29sbGlzaW9uQm94ZXM7XG4gICAgICB9LCBhLnNob3dDb2xsaXNpb25Cb3hlcy5zZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB0aGlzLl9zaG93Q29sbGlzaW9uQm94ZXMgIT09IHQgJiYgKHRoaXMuX3Nob3dDb2xsaXNpb25Cb3hlcyA9IHQsIHQgPyB0aGlzLnN0eWxlLl9nZW5lcmF0ZUNvbGxpc2lvbkJveGVzKCkgOiB0aGlzLl91cGRhdGUoKSk7XG4gICAgICB9LCBhLnNob3dPdmVyZHJhd0luc3BlY3Rvci5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX3Nob3dPdmVyZHJhd0luc3BlY3RvcjtcbiAgICAgIH0sIGEuc2hvd092ZXJkcmF3SW5zcGVjdG9yLnNldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHRoaXMuX3Nob3dPdmVyZHJhd0luc3BlY3RvciAhPT0gdCAmJiAodGhpcy5fc2hvd092ZXJkcmF3SW5zcGVjdG9yID0gdCwgdGhpcy5fdXBkYXRlKCkpO1xuICAgICAgfSwgYS5yZXBhaW50LmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fcmVwYWludDtcbiAgICAgIH0sIGEucmVwYWludC5zZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB0aGlzLl9yZXBhaW50ICE9PSB0ICYmICh0aGlzLl9yZXBhaW50ID0gdCwgdGhpcy50cmlnZ2VyUmVwYWludCgpKTtcbiAgICAgIH0sIGEudmVydGljZXMuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl92ZXJ0aWNlcztcbiAgICAgIH0sIGEudmVydGljZXMuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdGhpcy5fdmVydGljZXMgPSB0LCB0aGlzLl91cGRhdGUoKTtcbiAgICAgIH0sIHIucHJvdG90eXBlLl9zZXRDYWNoZUxpbWl0cyA9IGZ1bmN0aW9uIChlLCBpKSB7XG4gICAgICAgIHQuc2V0Q2FjaGVMaW1pdHMoZSwgaSk7XG4gICAgICB9LCBhLnZlcnNpb24uZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdC52ZXJzaW9uO1xuICAgICAgfSwgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoci5wcm90b3R5cGUsIGEpLCByO1xuICAgIH0odnIpO1xuXG4gICAgZnVuY3Rpb24gQ3IodCkge1xuICAgICAgdC5wYXJlbnROb2RlICYmIHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KTtcbiAgICB9XG5cbiAgICB2YXIgenIgPSB7XG4gICAgICBzaG93Q29tcGFzczogITAsXG4gICAgICBzaG93Wm9vbTogITAsXG4gICAgICB2aXN1YWxpemVQaXRjaDogITFcbiAgICB9LFxuICAgICAgICBEciA9IGZ1bmN0aW9uIERyKGUpIHtcbiAgICAgIHZhciBvID0gdGhpcztcbiAgICAgIHRoaXMub3B0aW9ucyA9IHQuZXh0ZW5kKHt9LCB6ciwgZSksIHRoaXMuX2NvbnRhaW5lciA9IGkuY3JlYXRlKFwiZGl2XCIsIFwibWFwYm94Z2wtY3RybCBtYXBib3hnbC1jdHJsLWdyb3VwXCIpLCB0aGlzLl9jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9KSwgdGhpcy5vcHRpb25zLnNob3dab29tICYmICh0LmJpbmRBbGwoW1wiX3NldEJ1dHRvblRpdGxlXCIsIFwiX3VwZGF0ZVpvb21CdXR0b25zXCJdLCB0aGlzKSwgdGhpcy5fem9vbUluQnV0dG9uID0gdGhpcy5fY3JlYXRlQnV0dG9uKFwibWFwYm94Z2wtY3RybC16b29tLWluXCIsIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiBvLl9tYXAuem9vbUluKHt9LCB7XG4gICAgICAgICAgb3JpZ2luYWxFdmVudDogdFxuICAgICAgICB9KTtcbiAgICAgIH0pLCBpLmNyZWF0ZShcInNwYW5cIiwgXCJtYXBib3hnbC1jdHJsLWljb25cIiwgdGhpcy5fem9vbUluQnV0dG9uKS5zZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiLCAhMCksIHRoaXMuX3pvb21PdXRCdXR0b24gPSB0aGlzLl9jcmVhdGVCdXR0b24oXCJtYXBib3hnbC1jdHJsLXpvb20tb3V0XCIsIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiBvLl9tYXAuem9vbU91dCh7fSwge1xuICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IHRcbiAgICAgICAgfSk7XG4gICAgICB9KSwgaS5jcmVhdGUoXCJzcGFuXCIsIFwibWFwYm94Z2wtY3RybC1pY29uXCIsIHRoaXMuX3pvb21PdXRCdXR0b24pLnNldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIsICEwKSksIHRoaXMub3B0aW9ucy5zaG93Q29tcGFzcyAmJiAodC5iaW5kQWxsKFtcIl9yb3RhdGVDb21wYXNzQXJyb3dcIl0sIHRoaXMpLCB0aGlzLl9jb21wYXNzID0gdGhpcy5fY3JlYXRlQnV0dG9uKFwibWFwYm94Z2wtY3RybC1jb21wYXNzXCIsIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIG8ub3B0aW9ucy52aXN1YWxpemVQaXRjaCA/IG8uX21hcC5yZXNldE5vcnRoUGl0Y2goe30sIHtcbiAgICAgICAgICBvcmlnaW5hbEV2ZW50OiB0XG4gICAgICAgIH0pIDogby5fbWFwLnJlc2V0Tm9ydGgoe30sIHtcbiAgICAgICAgICBvcmlnaW5hbEV2ZW50OiB0XG4gICAgICAgIH0pO1xuICAgICAgfSksIHRoaXMuX2NvbXBhc3NJY29uID0gaS5jcmVhdGUoXCJzcGFuXCIsIFwibWFwYm94Z2wtY3RybC1pY29uXCIsIHRoaXMuX2NvbXBhc3MpLCB0aGlzLl9jb21wYXNzSWNvbi5zZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiLCAhMCkpO1xuICAgIH07XG5cbiAgICBEci5wcm90b3R5cGUuX3VwZGF0ZVpvb21CdXR0b25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHQgPSB0aGlzLl9tYXAuZ2V0Wm9vbSgpLFxuICAgICAgICAgIGUgPSB0ID09PSB0aGlzLl9tYXAuZ2V0TWF4Wm9vbSgpLFxuICAgICAgICAgIGkgPSB0ID09PSB0aGlzLl9tYXAuZ2V0TWluWm9vbSgpO1xuXG4gICAgICB0aGlzLl96b29tSW5CdXR0b24uZGlzYWJsZWQgPSBlLCB0aGlzLl96b29tT3V0QnV0dG9uLmRpc2FibGVkID0gaSwgdGhpcy5fem9vbUluQnV0dG9uLnNldEF0dHJpYnV0ZShcImFyaWEtZGlzYWJsZWRcIiwgZS50b1N0cmluZygpKSwgdGhpcy5fem9vbU91dEJ1dHRvbi5zZXRBdHRyaWJ1dGUoXCJhcmlhLWRpc2FibGVkXCIsIGkudG9TdHJpbmcoKSk7XG4gICAgfSwgRHIucHJvdG90eXBlLl9yb3RhdGVDb21wYXNzQXJyb3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdCA9IHRoaXMub3B0aW9ucy52aXN1YWxpemVQaXRjaCA/IFwic2NhbGUoXCIgKyAxIC8gTWF0aC5wb3coTWF0aC5jb3ModGhpcy5fbWFwLnRyYW5zZm9ybS5waXRjaCAqIChNYXRoLlBJIC8gMTgwKSksIC41KSArIFwiKSByb3RhdGVYKFwiICsgdGhpcy5fbWFwLnRyYW5zZm9ybS5waXRjaCArIFwiZGVnKSByb3RhdGVaKFwiICsgdGhpcy5fbWFwLnRyYW5zZm9ybS5hbmdsZSAqICgxODAgLyBNYXRoLlBJKSArIFwiZGVnKVwiIDogXCJyb3RhdGUoXCIgKyB0aGlzLl9tYXAudHJhbnNmb3JtLmFuZ2xlICogKDE4MCAvIE1hdGguUEkpICsgXCJkZWcpXCI7XG4gICAgICB0aGlzLl9jb21wYXNzSWNvbi5zdHlsZS50cmFuc2Zvcm0gPSB0O1xuICAgIH0sIERyLnByb3RvdHlwZS5vbkFkZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gdGhpcy5fbWFwID0gdCwgdGhpcy5vcHRpb25zLnNob3dab29tICYmICh0aGlzLl9zZXRCdXR0b25UaXRsZSh0aGlzLl96b29tSW5CdXR0b24sIFwiWm9vbUluXCIpLCB0aGlzLl9zZXRCdXR0b25UaXRsZSh0aGlzLl96b29tT3V0QnV0dG9uLCBcIlpvb21PdXRcIiksIHRoaXMuX21hcC5vbihcInpvb21cIiwgdGhpcy5fdXBkYXRlWm9vbUJ1dHRvbnMpLCB0aGlzLl91cGRhdGVab29tQnV0dG9ucygpKSwgdGhpcy5vcHRpb25zLnNob3dDb21wYXNzICYmICh0aGlzLl9zZXRCdXR0b25UaXRsZSh0aGlzLl9jb21wYXNzLCBcIlJlc2V0QmVhcmluZ1wiKSwgdGhpcy5vcHRpb25zLnZpc3VhbGl6ZVBpdGNoICYmIHRoaXMuX21hcC5vbihcInBpdGNoXCIsIHRoaXMuX3JvdGF0ZUNvbXBhc3NBcnJvdyksIHRoaXMuX21hcC5vbihcInJvdGF0ZVwiLCB0aGlzLl9yb3RhdGVDb21wYXNzQXJyb3cpLCB0aGlzLl9yb3RhdGVDb21wYXNzQXJyb3coKSwgdGhpcy5faGFuZGxlciA9IG5ldyBBcih0aGlzLl9tYXAsIHRoaXMuX2NvbXBhc3MsIHRoaXMub3B0aW9ucy52aXN1YWxpemVQaXRjaCkpLCB0aGlzLl9jb250YWluZXI7XG4gICAgfSwgRHIucHJvdG90eXBlLm9uUmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgaS5yZW1vdmUodGhpcy5fY29udGFpbmVyKSwgdGhpcy5vcHRpb25zLnNob3dab29tICYmIHRoaXMuX21hcC5vZmYoXCJ6b29tXCIsIHRoaXMuX3VwZGF0ZVpvb21CdXR0b25zKSwgdGhpcy5vcHRpb25zLnNob3dDb21wYXNzICYmICh0aGlzLm9wdGlvbnMudmlzdWFsaXplUGl0Y2ggJiYgdGhpcy5fbWFwLm9mZihcInBpdGNoXCIsIHRoaXMuX3JvdGF0ZUNvbXBhc3NBcnJvdyksIHRoaXMuX21hcC5vZmYoXCJyb3RhdGVcIiwgdGhpcy5fcm90YXRlQ29tcGFzc0Fycm93KSwgdGhpcy5faGFuZGxlci5vZmYoKSwgZGVsZXRlIHRoaXMuX2hhbmRsZXIpLCBkZWxldGUgdGhpcy5fbWFwO1xuICAgIH0sIERyLnByb3RvdHlwZS5fY3JlYXRlQnV0dG9uID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHZhciBvID0gaS5jcmVhdGUoXCJidXR0b25cIiwgdCwgdGhpcy5fY29udGFpbmVyKTtcbiAgICAgIHJldHVybiBvLnR5cGUgPSBcImJ1dHRvblwiLCBvLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBlKSwgbztcbiAgICB9LCBEci5wcm90b3R5cGUuX3NldEJ1dHRvblRpdGxlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHZhciBpID0gdGhpcy5fbWFwLl9nZXRVSVN0cmluZyhcIk5hdmlnYXRpb25Db250cm9sLlwiICsgZSk7XG5cbiAgICAgIHQudGl0bGUgPSBpLCB0LnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgaSk7XG4gICAgfTtcblxuICAgIHZhciBBciA9IGZ1bmN0aW9uIEFyKGUsIG8sIHIpIHtcbiAgICAgIHZvaWQgMCA9PT0gciAmJiAociA9ICExKSwgdGhpcy5fY2xpY2tUb2xlcmFuY2UgPSAxMCwgdGhpcy5lbGVtZW50ID0gbywgdGhpcy5tb3VzZVJvdGF0ZSA9IG5ldyBYbyh7XG4gICAgICAgIGNsaWNrVG9sZXJhbmNlOiBlLmRyYWdSb3RhdGUuX21vdXNlUm90YXRlLl9jbGlja1RvbGVyYW5jZVxuICAgICAgfSksIHRoaXMubWFwID0gZSwgciAmJiAodGhpcy5tb3VzZVBpdGNoID0gbmV3IEhvKHtcbiAgICAgICAgY2xpY2tUb2xlcmFuY2U6IGUuZHJhZ1JvdGF0ZS5fbW91c2VQaXRjaC5fY2xpY2tUb2xlcmFuY2VcbiAgICAgIH0pKSwgdC5iaW5kQWxsKFtcIm1vdXNlZG93blwiLCBcIm1vdXNlbW92ZVwiLCBcIm1vdXNldXBcIiwgXCJ0b3VjaHN0YXJ0XCIsIFwidG91Y2htb3ZlXCIsIFwidG91Y2hlbmRcIiwgXCJyZXNldFwiXSwgdGhpcyksIGkuYWRkRXZlbnRMaXN0ZW5lcihvLCBcIm1vdXNlZG93blwiLCB0aGlzLm1vdXNlZG93biksIGkuYWRkRXZlbnRMaXN0ZW5lcihvLCBcInRvdWNoc3RhcnRcIiwgdGhpcy50b3VjaHN0YXJ0LCB7XG4gICAgICAgIHBhc3NpdmU6ICExXG4gICAgICB9KSwgaS5hZGRFdmVudExpc3RlbmVyKG8sIFwidG91Y2htb3ZlXCIsIHRoaXMudG91Y2htb3ZlKSwgaS5hZGRFdmVudExpc3RlbmVyKG8sIFwidG91Y2hlbmRcIiwgdGhpcy50b3VjaGVuZCksIGkuYWRkRXZlbnRMaXN0ZW5lcihvLCBcInRvdWNoY2FuY2VsXCIsIHRoaXMucmVzZXQpO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBNcihlLCBpLCBvKSB7XG4gICAgICBpZiAoZSA9IG5ldyB0LkxuZ0xhdChlLmxuZywgZS5sYXQpLCBpKSB7XG4gICAgICAgIHZhciByID0gbmV3IHQuTG5nTGF0KGUubG5nIC0gMzYwLCBlLmxhdCksXG4gICAgICAgICAgICBhID0gbmV3IHQuTG5nTGF0KGUubG5nICsgMzYwLCBlLmxhdCksXG4gICAgICAgICAgICBuID0gby5sb2NhdGlvblBvaW50KGUpLmRpc3RTcXIoaSk7XG4gICAgICAgIG8ubG9jYXRpb25Qb2ludChyKS5kaXN0U3FyKGkpIDwgbiA/IGUgPSByIDogby5sb2NhdGlvblBvaW50KGEpLmRpc3RTcXIoaSkgPCBuICYmIChlID0gYSk7XG4gICAgICB9XG5cbiAgICAgIGZvciAoOyBNYXRoLmFicyhlLmxuZyAtIG8uY2VudGVyLmxuZykgPiAxODA7KSB7XG4gICAgICAgIHZhciBzID0gby5sb2NhdGlvblBvaW50KGUpO1xuICAgICAgICBpZiAocy54ID49IDAgJiYgcy55ID49IDAgJiYgcy54IDw9IG8ud2lkdGggJiYgcy55IDw9IG8uaGVpZ2h0KSBicmVhaztcbiAgICAgICAgZS5sbmcgPiBvLmNlbnRlci5sbmcgPyBlLmxuZyAtPSAzNjAgOiBlLmxuZyArPSAzNjA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlO1xuICAgIH1cblxuICAgIEFyLnByb3RvdHlwZS5kb3duID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHRoaXMubW91c2VSb3RhdGUubW91c2Vkb3duKHQsIGUpLCB0aGlzLm1vdXNlUGl0Y2ggJiYgdGhpcy5tb3VzZVBpdGNoLm1vdXNlZG93bih0LCBlKSwgaS5kaXNhYmxlRHJhZygpO1xuICAgIH0sIEFyLnByb3RvdHlwZS5tb3ZlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHZhciBpID0gdGhpcy5tYXAsXG4gICAgICAgICAgbyA9IHRoaXMubW91c2VSb3RhdGUubW91c2Vtb3ZlV2luZG93KHQsIGUpO1xuXG4gICAgICBpZiAobyAmJiBvLmJlYXJpbmdEZWx0YSAmJiBpLnNldEJlYXJpbmcoaS5nZXRCZWFyaW5nKCkgKyBvLmJlYXJpbmdEZWx0YSksIHRoaXMubW91c2VQaXRjaCkge1xuICAgICAgICB2YXIgciA9IHRoaXMubW91c2VQaXRjaC5tb3VzZW1vdmVXaW5kb3codCwgZSk7XG4gICAgICAgIHIgJiYgci5waXRjaERlbHRhICYmIGkuc2V0UGl0Y2goaS5nZXRQaXRjaCgpICsgci5waXRjaERlbHRhKTtcbiAgICAgIH1cbiAgICB9LCBBci5wcm90b3R5cGUub2ZmID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHQgPSB0aGlzLmVsZW1lbnQ7XG4gICAgICBpLnJlbW92ZUV2ZW50TGlzdGVuZXIodCwgXCJtb3VzZWRvd25cIiwgdGhpcy5tb3VzZWRvd24pLCBpLnJlbW92ZUV2ZW50TGlzdGVuZXIodCwgXCJ0b3VjaHN0YXJ0XCIsIHRoaXMudG91Y2hzdGFydCwge1xuICAgICAgICBwYXNzaXZlOiAhMVxuICAgICAgfSksIGkucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LCBcInRvdWNobW92ZVwiLCB0aGlzLnRvdWNobW92ZSksIGkucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LCBcInRvdWNoZW5kXCIsIHRoaXMudG91Y2hlbmQpLCBpLnJlbW92ZUV2ZW50TGlzdGVuZXIodCwgXCJ0b3VjaGNhbmNlbFwiLCB0aGlzLnJlc2V0KSwgdGhpcy5vZmZUZW1wKCk7XG4gICAgfSwgQXIucHJvdG90eXBlLm9mZlRlbXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpLmVuYWJsZURyYWcoKSwgaS5yZW1vdmVFdmVudExpc3RlbmVyKHQud2luZG93LCBcIm1vdXNlbW92ZVwiLCB0aGlzLm1vdXNlbW92ZSksIGkucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LndpbmRvdywgXCJtb3VzZXVwXCIsIHRoaXMubW91c2V1cCk7XG4gICAgfSwgQXIucHJvdG90eXBlLm1vdXNlZG93biA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB0aGlzLmRvd24odC5leHRlbmQoe30sIGUsIHtcbiAgICAgICAgY3RybEtleTogITAsXG4gICAgICAgIHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbiBwcmV2ZW50RGVmYXVsdCgpIHtcbiAgICAgICAgICByZXR1cm4gZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICB9KSwgaS5tb3VzZVBvcyh0aGlzLmVsZW1lbnQsIGUpKSwgaS5hZGRFdmVudExpc3RlbmVyKHQud2luZG93LCBcIm1vdXNlbW92ZVwiLCB0aGlzLm1vdXNlbW92ZSksIGkuYWRkRXZlbnRMaXN0ZW5lcih0LndpbmRvdywgXCJtb3VzZXVwXCIsIHRoaXMubW91c2V1cCk7XG4gICAgfSwgQXIucHJvdG90eXBlLm1vdXNlbW92ZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0aGlzLm1vdmUodCwgaS5tb3VzZVBvcyh0aGlzLmVsZW1lbnQsIHQpKTtcbiAgICB9LCBBci5wcm90b3R5cGUubW91c2V1cCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0aGlzLm1vdXNlUm90YXRlLm1vdXNldXBXaW5kb3codCksIHRoaXMubW91c2VQaXRjaCAmJiB0aGlzLm1vdXNlUGl0Y2gubW91c2V1cFdpbmRvdyh0KSwgdGhpcy5vZmZUZW1wKCk7XG4gICAgfSwgQXIucHJvdG90eXBlLnRvdWNoc3RhcnQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgMSAhPT0gdC50YXJnZXRUb3VjaGVzLmxlbmd0aCA/IHRoaXMucmVzZXQoKSA6ICh0aGlzLl9zdGFydFBvcyA9IHRoaXMuX2xhc3RQb3MgPSBpLnRvdWNoUG9zKHRoaXMuZWxlbWVudCwgdC50YXJnZXRUb3VjaGVzKVswXSwgdGhpcy5kb3duKHtcbiAgICAgICAgdHlwZTogXCJtb3VzZWRvd25cIixcbiAgICAgICAgYnV0dG9uOiAwLFxuICAgICAgICBjdHJsS2V5OiAhMCxcbiAgICAgICAgcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uIHByZXZlbnREZWZhdWx0KCkge1xuICAgICAgICAgIHJldHVybiB0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgIH0sIHRoaXMuX3N0YXJ0UG9zKSk7XG4gICAgfSwgQXIucHJvdG90eXBlLnRvdWNobW92ZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAxICE9PSB0LnRhcmdldFRvdWNoZXMubGVuZ3RoID8gdGhpcy5yZXNldCgpIDogKHRoaXMuX2xhc3RQb3MgPSBpLnRvdWNoUG9zKHRoaXMuZWxlbWVudCwgdC50YXJnZXRUb3VjaGVzKVswXSwgdGhpcy5tb3ZlKHtcbiAgICAgICAgcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uIHByZXZlbnREZWZhdWx0KCkge1xuICAgICAgICAgIHJldHVybiB0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgIH0sIHRoaXMuX2xhc3RQb3MpKTtcbiAgICB9LCBBci5wcm90b3R5cGUudG91Y2hlbmQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgMCA9PT0gdC50YXJnZXRUb3VjaGVzLmxlbmd0aCAmJiB0aGlzLl9zdGFydFBvcyAmJiB0aGlzLl9sYXN0UG9zICYmIHRoaXMuX3N0YXJ0UG9zLmRpc3QodGhpcy5fbGFzdFBvcykgPCB0aGlzLl9jbGlja1RvbGVyYW5jZSAmJiB0aGlzLmVsZW1lbnQuY2xpY2soKSwgdGhpcy5yZXNldCgpO1xuICAgIH0sIEFyLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMubW91c2VSb3RhdGUucmVzZXQoKSwgdGhpcy5tb3VzZVBpdGNoICYmIHRoaXMubW91c2VQaXRjaC5yZXNldCgpLCBkZWxldGUgdGhpcy5fc3RhcnRQb3MsIGRlbGV0ZSB0aGlzLl9sYXN0UG9zLCB0aGlzLm9mZlRlbXAoKTtcbiAgICB9O1xuICAgIHZhciBMciA9IHtcbiAgICAgIGNlbnRlcjogXCJ0cmFuc2xhdGUoLTUwJSwtNTAlKVwiLFxuICAgICAgdG9wOiBcInRyYW5zbGF0ZSgtNTAlLDApXCIsXG4gICAgICBcInRvcC1sZWZ0XCI6IFwidHJhbnNsYXRlKDAsMClcIixcbiAgICAgIFwidG9wLXJpZ2h0XCI6IFwidHJhbnNsYXRlKC0xMDAlLDApXCIsXG4gICAgICBib3R0b206IFwidHJhbnNsYXRlKC01MCUsLTEwMCUpXCIsXG4gICAgICBcImJvdHRvbS1sZWZ0XCI6IFwidHJhbnNsYXRlKDAsLTEwMCUpXCIsXG4gICAgICBcImJvdHRvbS1yaWdodFwiOiBcInRyYW5zbGF0ZSgtMTAwJSwtMTAwJSlcIixcbiAgICAgIGxlZnQ6IFwidHJhbnNsYXRlKDAsLTUwJSlcIixcbiAgICAgIHJpZ2h0OiBcInRyYW5zbGF0ZSgtMTAwJSwtNTAlKVwiXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIFJyKHQsIGUsIGkpIHtcbiAgICAgIHZhciBvID0gdC5jbGFzc0xpc3Q7XG5cbiAgICAgIGZvciAodmFyIHIgaW4gTHIpIHtcbiAgICAgICAgby5yZW1vdmUoXCJtYXBib3hnbC1cIiArIGkgKyBcIi1hbmNob3ItXCIgKyByKTtcbiAgICAgIH1cblxuICAgICAgby5hZGQoXCJtYXBib3hnbC1cIiArIGkgKyBcIi1hbmNob3ItXCIgKyBlKTtcbiAgICB9XG5cbiAgICB2YXIga3IsXG4gICAgICAgIEJyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGZ1bmN0aW9uIG8obywgcikge1xuICAgICAgICBpZiAoZS5jYWxsKHRoaXMpLCAobyBpbnN0YW5jZW9mIHQud2luZG93LkhUTUxFbGVtZW50IHx8IHIpICYmIChvID0gdC5leHRlbmQoe1xuICAgICAgICAgIGVsZW1lbnQ6IG9cbiAgICAgICAgfSwgcikpLCB0LmJpbmRBbGwoW1wiX3VwZGF0ZVwiLCBcIl9vbk1vdmVcIiwgXCJfb25VcFwiLCBcIl9hZGREcmFnSGFuZGxlclwiLCBcIl9vbk1hcENsaWNrXCIsIFwiX29uS2V5UHJlc3NcIl0sIHRoaXMpLCB0aGlzLl9hbmNob3IgPSBvICYmIG8uYW5jaG9yIHx8IFwiY2VudGVyXCIsIHRoaXMuX2NvbG9yID0gbyAmJiBvLmNvbG9yIHx8IFwiIzNGQjFDRVwiLCB0aGlzLl9zY2FsZSA9IG8gJiYgby5zY2FsZSB8fCAxLCB0aGlzLl9kcmFnZ2FibGUgPSBvICYmIG8uZHJhZ2dhYmxlIHx8ICExLCB0aGlzLl9jbGlja1RvbGVyYW5jZSA9IG8gJiYgby5jbGlja1RvbGVyYW5jZSB8fCAwLCB0aGlzLl9pc0RyYWdnaW5nID0gITEsIHRoaXMuX3N0YXRlID0gXCJpbmFjdGl2ZVwiLCB0aGlzLl9yb3RhdGlvbiA9IG8gJiYgby5yb3RhdGlvbiB8fCAwLCB0aGlzLl9yb3RhdGlvbkFsaWdubWVudCA9IG8gJiYgby5yb3RhdGlvbkFsaWdubWVudCB8fCBcImF1dG9cIiwgdGhpcy5fcGl0Y2hBbGlnbm1lbnQgPSBvICYmIG8ucGl0Y2hBbGlnbm1lbnQgJiYgXCJhdXRvXCIgIT09IG8ucGl0Y2hBbGlnbm1lbnQgPyBvLnBpdGNoQWxpZ25tZW50IDogdGhpcy5fcm90YXRpb25BbGlnbm1lbnQsIG8gJiYgby5lbGVtZW50KSB0aGlzLl9lbGVtZW50ID0gby5lbGVtZW50LCB0aGlzLl9vZmZzZXQgPSB0LlBvaW50LmNvbnZlcnQobyAmJiBvLm9mZnNldCB8fCBbMCwgMF0pO2Vsc2Uge1xuICAgICAgICAgIHRoaXMuX2RlZmF1bHRNYXJrZXIgPSAhMCwgdGhpcy5fZWxlbWVudCA9IGkuY3JlYXRlKFwiZGl2XCIpLCB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgXCJNYXAgbWFya2VyXCIpO1xuICAgICAgICAgIHZhciBhID0gaS5jcmVhdGVOUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwic3ZnXCIpO1xuICAgICAgICAgIGEuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJkaXNwbGF5XCIsIFwiYmxvY2tcIiksIGEuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJoZWlnaHRcIiwgXCI0MXB4XCIpLCBhLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwid2lkdGhcIiwgXCIyN3B4XCIpLCBhLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwidmlld0JveFwiLCBcIjAgMCAyNyA0MVwiKTtcbiAgICAgICAgICB2YXIgbiA9IGkuY3JlYXRlTlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcImdcIik7XG4gICAgICAgICAgbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInN0cm9rZVwiLCBcIm5vbmVcIiksIG4uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJzdHJva2Utd2lkdGhcIiwgXCIxXCIpLCBuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZmlsbFwiLCBcIm5vbmVcIiksIG4uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsLXJ1bGVcIiwgXCJldmVub2RkXCIpO1xuICAgICAgICAgIHZhciBzID0gaS5jcmVhdGVOUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwiZ1wiKTtcbiAgICAgICAgICBzLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZmlsbC1ydWxlXCIsIFwibm9uemVyb1wiKTtcbiAgICAgICAgICB2YXIgbCA9IGkuY3JlYXRlTlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcImdcIik7XG4gICAgICAgICAgbC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInRyYW5zZm9ybVwiLCBcInRyYW5zbGF0ZSgzLjAsIDI5LjApXCIpLCBsLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZmlsbFwiLCBcIiMwMDAwMDBcIik7XG5cbiAgICAgICAgICBmb3IgKHZhciBjID0gMCwgdSA9IFt7XG4gICAgICAgICAgICByeDogXCIxMC41XCIsXG4gICAgICAgICAgICByeTogXCI1LjI1MDAyMjczXCJcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICByeDogXCIxMC41XCIsXG4gICAgICAgICAgICByeTogXCI1LjI1MDAyMjczXCJcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICByeDogXCI5LjVcIixcbiAgICAgICAgICAgIHJ5OiBcIjQuNzcyNzUwMDdcIlxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIHJ4OiBcIjguNVwiLFxuICAgICAgICAgICAgcnk6IFwiNC4yOTU0OTkzNlwiXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgcng6IFwiNy41XCIsXG4gICAgICAgICAgICByeTogXCIzLjgxODIyMzA4XCJcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICByeDogXCI2LjVcIixcbiAgICAgICAgICAgIHJ5OiBcIjMuMzQwOTQ2NzlcIlxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIHJ4OiBcIjUuNVwiLFxuICAgICAgICAgICAgcnk6IFwiMi44NjM2NzA1MVwiXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgcng6IFwiNC41XCIsXG4gICAgICAgICAgICByeTogXCIyLjM4NjM2ODY0XCJcbiAgICAgICAgICB9XTsgYyA8IHUubGVuZ3RoOyBjICs9IDEpIHtcbiAgICAgICAgICAgIHZhciBoID0gdVtjXSxcbiAgICAgICAgICAgICAgICBwID0gaS5jcmVhdGVOUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwiZWxsaXBzZVwiKTtcbiAgICAgICAgICAgIHAuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJvcGFjaXR5XCIsIFwiMC4wNFwiKSwgcC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImN4XCIsIFwiMTAuNVwiKSwgcC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImN5XCIsIFwiNS44MDAyOTAwOFwiKSwgcC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInJ4XCIsIGgucngpLCBwLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwicnlcIiwgaC5yeSksIGwuYXBwZW5kQ2hpbGQocCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGQgPSBpLmNyZWF0ZU5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJnXCIpO1xuICAgICAgICAgIGQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsXCIsIHRoaXMuX2NvbG9yKTtcblxuICAgICAgICAgIHZhciBfID0gaS5jcmVhdGVOUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwicGF0aFwiKTtcblxuICAgICAgICAgIF8uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJkXCIsIFwiTTI3LDEzLjUgQzI3LDE5LjA3NDY0NCAyMC4yNTAwMDEsMjcuMDAwMDAyIDE0Ljc1LDM0LjUwMDAwMiBDMTQuMDE2NjY1LDM1LjUwMDAwNCAxMi45ODMzMzUsMzUuNTAwMDA0IDEyLjI1LDM0LjUwMDAwMiBDNi43NDk5OTkzLDI3LjAwMDAwMiAwLDE5LjIyMjU2MiAwLDEzLjUgQzAsNi4wNDQxNTU5IDYuMDQ0MTU1OSwwIDEzLjUsMCBDMjAuOTU1ODQ0LDAgMjcsNi4wNDQxNTU5IDI3LDEzLjUgWlwiKSwgZC5hcHBlbmRDaGlsZChfKTtcbiAgICAgICAgICB2YXIgZiA9IGkuY3JlYXRlTlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcImdcIik7XG4gICAgICAgICAgZi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcIm9wYWNpdHlcIiwgXCIwLjI1XCIpLCBmLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZmlsbFwiLCBcIiMwMDAwMDBcIik7XG4gICAgICAgICAgdmFyIG0gPSBpLmNyZWF0ZU5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJwYXRoXCIpO1xuICAgICAgICAgIG0uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJkXCIsIFwiTTEzLjUsMCBDNi4wNDQxNTU5LDAgMCw2LjA0NDE1NTkgMCwxMy41IEMwLDE5LjIyMjU2MiA2Ljc0OTk5OTMsMjcgMTIuMjUsMzQuNSBDMTMsMzUuNTIyNzI3IDE0LjAxNjY2NCwzNS41MDAwMDQgMTQuNzUsMzQuNSBDMjAuMjUwMDAxLDI3IDI3LDE5LjA3NDY0NCAyNywxMy41IEMyNyw2LjA0NDE1NTkgMjAuOTU1ODQ0LDAgMTMuNSwwIFogTTEzLjUsMSBDMjAuNDE1NDA0LDEgMjYsNi41ODQ1OTYgMjYsMTMuNSBDMjYsMTUuODk4NjU3IDI0LjQ5NTU4NCwxOS4xODE0MzEgMjIuMjIwNzAzLDIyLjczODI4MSBDMTkuOTQ1ODIzLDI2LjI5NTEzMiAxNi43MDUxMTksMzAuMTQyMTY3IDEzLjk0MzM1OSwzMy45MDgyMDMgQzEzLjc0MzQ0NSwzNC4xODA4MTQgMTMuNjEyNzE1LDM0LjMyMjczOCAxMy41LDM0LjQ0MTQwNiBDMTMuMzg3Mjg1LDM0LjMyMjczOCAxMy4yNTY1NTUsMzQuMTgwODE0IDEzLjA1NjY0MSwzMy45MDgyMDMgQzEwLjI4NDQ4MSwzMC4xMjc5ODUgNy40MTQ4Njg0LDI2LjMxNDE1OSA1LjAxNTYyNSwyMi43NzM0MzggQzIuNjE2MzgxNiwxOS4yMzI3MTUgMSwxNS45NTM1MzggMSwxMy41IEMxLDYuNTg0NTk2IDYuNTg0NTk2LDEgMTMuNSwxIFpcIiksIGYuYXBwZW5kQ2hpbGQobSk7XG4gICAgICAgICAgdmFyIGcgPSBpLmNyZWF0ZU5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJnXCIpO1xuICAgICAgICAgIGcuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ0cmFuc2Zvcm1cIiwgXCJ0cmFuc2xhdGUoNi4wLCA3LjApXCIpLCBnLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZmlsbFwiLCBcIiNGRkZGRkZcIik7XG4gICAgICAgICAgdmFyIHYgPSBpLmNyZWF0ZU5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJnXCIpO1xuICAgICAgICAgIHYuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ0cmFuc2Zvcm1cIiwgXCJ0cmFuc2xhdGUoOC4wLCA4LjApXCIpO1xuICAgICAgICAgIHZhciB5ID0gaS5jcmVhdGVOUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwiY2lyY2xlXCIpO1xuICAgICAgICAgIHkuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsXCIsIFwiIzAwMDAwMFwiKSwgeS5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcIm9wYWNpdHlcIiwgXCIwLjI1XCIpLCB5LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiY3hcIiwgXCI1LjVcIiksIHkuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJjeVwiLCBcIjUuNVwiKSwgeS5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInJcIiwgXCI1LjQ5OTk5NjJcIik7XG4gICAgICAgICAgdmFyIHggPSBpLmNyZWF0ZU5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJjaXJjbGVcIik7XG4gICAgICAgICAgeC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZpbGxcIiwgXCIjRkZGRkZGXCIpLCB4LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiY3hcIiwgXCI1LjVcIiksIHguc2V0QXR0cmlidXRlTlMobnVsbCwgXCJjeVwiLCBcIjUuNVwiKSwgeC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInJcIiwgXCI1LjQ5OTk5NjJcIiksIHYuYXBwZW5kQ2hpbGQoeSksIHYuYXBwZW5kQ2hpbGQoeCksIHMuYXBwZW5kQ2hpbGQobCksIHMuYXBwZW5kQ2hpbGQoZCksIHMuYXBwZW5kQ2hpbGQoZiksIHMuYXBwZW5kQ2hpbGQoZyksIHMuYXBwZW5kQ2hpbGQodiksIGEuYXBwZW5kQ2hpbGQocyksIGEuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJoZWlnaHRcIiwgNDEgKiB0aGlzLl9zY2FsZSArIFwicHhcIiksIGEuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ3aWR0aFwiLCAyNyAqIHRoaXMuX3NjYWxlICsgXCJweFwiKSwgdGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZChhKSwgdGhpcy5fb2Zmc2V0ID0gdC5Qb2ludC5jb252ZXJ0KG8gJiYgby5vZmZzZXQgfHwgWzAsIC0xNF0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChcIm1hcGJveGdsLW1hcmtlclwiKSwgdGhpcy5fZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiZHJhZ3N0YXJ0XCIsIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgdC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9KSwgdGhpcy5fZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgdC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9KSwgUnIodGhpcy5fZWxlbWVudCwgdGhpcy5fYW5jaG9yLCBcIm1hcmtlclwiKSwgdGhpcy5fcG9wdXAgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZSAmJiAoby5fX3Byb3RvX18gPSBlKSwgKG8ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShlICYmIGUucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBvLCBvLnByb3RvdHlwZS5hZGRUbyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbW92ZSgpLCB0aGlzLl9tYXAgPSB0LCB0LmdldENhbnZhc0NvbnRhaW5lcigpLmFwcGVuZENoaWxkKHRoaXMuX2VsZW1lbnQpLCB0Lm9uKFwibW92ZVwiLCB0aGlzLl91cGRhdGUpLCB0Lm9uKFwibW92ZWVuZFwiLCB0aGlzLl91cGRhdGUpLCB0aGlzLnNldERyYWdnYWJsZSh0aGlzLl9kcmFnZ2FibGUpLCB0aGlzLl91cGRhdGUoKSwgdGhpcy5fbWFwLm9uKFwiY2xpY2tcIiwgdGhpcy5fb25NYXBDbGljayksIHRoaXM7XG4gICAgICB9LCBvLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXAgJiYgKHRoaXMuX21hcC5vZmYoXCJjbGlja1wiLCB0aGlzLl9vbk1hcENsaWNrKSwgdGhpcy5fbWFwLm9mZihcIm1vdmVcIiwgdGhpcy5fdXBkYXRlKSwgdGhpcy5fbWFwLm9mZihcIm1vdmVlbmRcIiwgdGhpcy5fdXBkYXRlKSwgdGhpcy5fbWFwLm9mZihcIm1vdXNlZG93blwiLCB0aGlzLl9hZGREcmFnSGFuZGxlciksIHRoaXMuX21hcC5vZmYoXCJ0b3VjaHN0YXJ0XCIsIHRoaXMuX2FkZERyYWdIYW5kbGVyKSwgdGhpcy5fbWFwLm9mZihcIm1vdXNldXBcIiwgdGhpcy5fb25VcCksIHRoaXMuX21hcC5vZmYoXCJ0b3VjaGVuZFwiLCB0aGlzLl9vblVwKSwgdGhpcy5fbWFwLm9mZihcIm1vdXNlbW92ZVwiLCB0aGlzLl9vbk1vdmUpLCB0aGlzLl9tYXAub2ZmKFwidG91Y2htb3ZlXCIsIHRoaXMuX29uTW92ZSksIGRlbGV0ZSB0aGlzLl9tYXApLCBpLnJlbW92ZSh0aGlzLl9lbGVtZW50KSwgdGhpcy5fcG9wdXAgJiYgdGhpcy5fcG9wdXAucmVtb3ZlKCksIHRoaXM7XG4gICAgICB9LCBvLnByb3RvdHlwZS5nZXRMbmdMYXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sbmdMYXQ7XG4gICAgICB9LCBvLnByb3RvdHlwZS5zZXRMbmdMYXQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG5nTGF0ID0gdC5MbmdMYXQuY29udmVydChlKSwgdGhpcy5fcG9zID0gbnVsbCwgdGhpcy5fcG9wdXAgJiYgdGhpcy5fcG9wdXAuc2V0TG5nTGF0KHRoaXMuX2xuZ0xhdCksIHRoaXMuX3VwZGF0ZSgpLCB0aGlzO1xuICAgICAgfSwgby5wcm90b3R5cGUuZ2V0RWxlbWVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7XG4gICAgICB9LCBvLnByb3RvdHlwZS5zZXRQb3B1cCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGlmICh0aGlzLl9wb3B1cCAmJiAodGhpcy5fcG9wdXAucmVtb3ZlKCksIHRoaXMuX3BvcHVwID0gbnVsbCwgdGhpcy5fZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5cHJlc3NcIiwgdGhpcy5fb25LZXlQcmVzcyksIHRoaXMuX29yaWdpbmFsVGFiSW5kZXggfHwgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSksIHQpIHtcbiAgICAgICAgICBpZiAoIShcIm9mZnNldFwiIGluIHQub3B0aW9ucykpIHtcbiAgICAgICAgICAgIHZhciBlID0gTWF0aC5zcXJ0KE1hdGgucG93KDEzLjUsIDIpIC8gMik7XG4gICAgICAgICAgICB0Lm9wdGlvbnMub2Zmc2V0ID0gdGhpcy5fZGVmYXVsdE1hcmtlciA/IHtcbiAgICAgICAgICAgICAgdG9wOiBbMCwgMF0sXG4gICAgICAgICAgICAgIFwidG9wLWxlZnRcIjogWzAsIDBdLFxuICAgICAgICAgICAgICBcInRvcC1yaWdodFwiOiBbMCwgMF0sXG4gICAgICAgICAgICAgIGJvdHRvbTogWzAsIC0zOC4xXSxcbiAgICAgICAgICAgICAgXCJib3R0b20tbGVmdFwiOiBbZSwgLTEgKiAoMjQuNiArIGUpXSxcbiAgICAgICAgICAgICAgXCJib3R0b20tcmlnaHRcIjogWy1lLCAtMSAqICgyNC42ICsgZSldLFxuICAgICAgICAgICAgICBsZWZ0OiBbMTMuNSwgLTI0LjZdLFxuICAgICAgICAgICAgICByaWdodDogWy0xMy41LCAtMjQuNl1cbiAgICAgICAgICAgIH0gOiB0aGlzLl9vZmZzZXQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5fcG9wdXAgPSB0LCB0aGlzLl9sbmdMYXQgJiYgdGhpcy5fcG9wdXAuc2V0TG5nTGF0KHRoaXMuX2xuZ0xhdCksIHRoaXMuX29yaWdpbmFsVGFiSW5kZXggPSB0aGlzLl9lbGVtZW50LmdldEF0dHJpYnV0ZShcInRhYmluZGV4XCIpLCB0aGlzLl9vcmlnaW5hbFRhYkluZGV4IHx8IHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiwgXCIwXCIpLCB0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlwcmVzc1wiLCB0aGlzLl9vbktleVByZXNzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSwgby5wcm90b3R5cGUuX29uS2V5UHJlc3MgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgZSA9IHQuY29kZSxcbiAgICAgICAgICAgIGkgPSB0LmNoYXJDb2RlIHx8IHQua2V5Q29kZTtcbiAgICAgICAgXCJTcGFjZVwiICE9PSBlICYmIFwiRW50ZXJcIiAhPT0gZSAmJiAzMiAhPT0gaSAmJiAxMyAhPT0gaSB8fCB0aGlzLnRvZ2dsZVBvcHVwKCk7XG4gICAgICB9LCBvLnByb3RvdHlwZS5fb25NYXBDbGljayA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHZhciBlID0gdC5vcmlnaW5hbEV2ZW50LnRhcmdldCxcbiAgICAgICAgICAgIGkgPSB0aGlzLl9lbGVtZW50O1xuICAgICAgICB0aGlzLl9wb3B1cCAmJiAoZSA9PT0gaSB8fCBpLmNvbnRhaW5zKGUpKSAmJiB0aGlzLnRvZ2dsZVBvcHVwKCk7XG4gICAgICB9LCBvLnByb3RvdHlwZS5nZXRQb3B1cCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BvcHVwO1xuICAgICAgfSwgby5wcm90b3R5cGUudG9nZ2xlUG9wdXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB0ID0gdGhpcy5fcG9wdXA7XG4gICAgICAgIHJldHVybiB0ID8gKHQuaXNPcGVuKCkgPyB0LnJlbW92ZSgpIDogdC5hZGRUbyh0aGlzLl9tYXApLCB0aGlzKSA6IHRoaXM7XG4gICAgICB9LCBvLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgaWYgKHRoaXMuX21hcCkge1xuICAgICAgICAgIHRoaXMuX21hcC50cmFuc2Zvcm0ucmVuZGVyV29ybGRDb3BpZXMgJiYgKHRoaXMuX2xuZ0xhdCA9IE1yKHRoaXMuX2xuZ0xhdCwgdGhpcy5fcG9zLCB0aGlzLl9tYXAudHJhbnNmb3JtKSksIHRoaXMuX3BvcyA9IHRoaXMuX21hcC5wcm9qZWN0KHRoaXMuX2xuZ0xhdCkuX2FkZCh0aGlzLl9vZmZzZXQpO1xuICAgICAgICAgIHZhciBlID0gXCJcIjtcbiAgICAgICAgICBcInZpZXdwb3J0XCIgPT09IHRoaXMuX3JvdGF0aW9uQWxpZ25tZW50IHx8IFwiYXV0b1wiID09PSB0aGlzLl9yb3RhdGlvbkFsaWdubWVudCA/IGUgPSBcInJvdGF0ZVooXCIgKyB0aGlzLl9yb3RhdGlvbiArIFwiZGVnKVwiIDogXCJtYXBcIiA9PT0gdGhpcy5fcm90YXRpb25BbGlnbm1lbnQgJiYgKGUgPSBcInJvdGF0ZVooXCIgKyAodGhpcy5fcm90YXRpb24gLSB0aGlzLl9tYXAuZ2V0QmVhcmluZygpKSArIFwiZGVnKVwiKTtcbiAgICAgICAgICB2YXIgbyA9IFwiXCI7XG4gICAgICAgICAgXCJ2aWV3cG9ydFwiID09PSB0aGlzLl9waXRjaEFsaWdubWVudCB8fCBcImF1dG9cIiA9PT0gdGhpcy5fcGl0Y2hBbGlnbm1lbnQgPyBvID0gXCJyb3RhdGVYKDBkZWcpXCIgOiBcIm1hcFwiID09PSB0aGlzLl9waXRjaEFsaWdubWVudCAmJiAobyA9IFwicm90YXRlWChcIiArIHRoaXMuX21hcC5nZXRQaXRjaCgpICsgXCJkZWcpXCIpLCB0ICYmIFwibW92ZWVuZFwiICE9PSB0LnR5cGUgfHwgKHRoaXMuX3BvcyA9IHRoaXMuX3Bvcy5yb3VuZCgpKSwgaS5zZXRUcmFuc2Zvcm0odGhpcy5fZWxlbWVudCwgTHJbdGhpcy5fYW5jaG9yXSArIFwiIHRyYW5zbGF0ZShcIiArIHRoaXMuX3Bvcy54ICsgXCJweCwgXCIgKyB0aGlzLl9wb3MueSArIFwicHgpIFwiICsgbyArIFwiIFwiICsgZSk7XG4gICAgICAgIH1cbiAgICAgIH0sIG8ucHJvdG90eXBlLmdldE9mZnNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29mZnNldDtcbiAgICAgIH0sIG8ucHJvdG90eXBlLnNldE9mZnNldCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vZmZzZXQgPSB0LlBvaW50LmNvbnZlcnQoZSksIHRoaXMuX3VwZGF0ZSgpLCB0aGlzO1xuICAgICAgfSwgby5wcm90b3R5cGUuX29uTW92ZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmICghdGhpcy5faXNEcmFnZ2luZykge1xuICAgICAgICAgIHZhciBpID0gdGhpcy5fY2xpY2tUb2xlcmFuY2UgfHwgdGhpcy5fbWFwLl9jbGlja1RvbGVyYW5jZTtcbiAgICAgICAgICB0aGlzLl9pc0RyYWdnaW5nID0gZS5wb2ludC5kaXN0KHRoaXMuX3BvaW50ZXJkb3duUG9zKSA+PSBpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5faXNEcmFnZ2luZyAmJiAodGhpcy5fcG9zID0gZS5wb2ludC5zdWIodGhpcy5fcG9zaXRpb25EZWx0YSksIHRoaXMuX2xuZ0xhdCA9IHRoaXMuX21hcC51bnByb2plY3QodGhpcy5fcG9zKSwgdGhpcy5zZXRMbmdMYXQodGhpcy5fbG5nTGF0KSwgdGhpcy5fZWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gXCJub25lXCIsIFwicGVuZGluZ1wiID09PSB0aGlzLl9zdGF0ZSAmJiAodGhpcy5fc3RhdGUgPSBcImFjdGl2ZVwiLCB0aGlzLmZpcmUobmV3IHQuRXZlbnQoXCJkcmFnc3RhcnRcIikpKSwgdGhpcy5maXJlKG5ldyB0LkV2ZW50KFwiZHJhZ1wiKSkpO1xuICAgICAgfSwgby5wcm90b3R5cGUuX29uVXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9IFwiYXV0b1wiLCB0aGlzLl9wb3NpdGlvbkRlbHRhID0gbnVsbCwgdGhpcy5fcG9pbnRlcmRvd25Qb3MgPSBudWxsLCB0aGlzLl9pc0RyYWdnaW5nID0gITEsIHRoaXMuX21hcC5vZmYoXCJtb3VzZW1vdmVcIiwgdGhpcy5fb25Nb3ZlKSwgdGhpcy5fbWFwLm9mZihcInRvdWNobW92ZVwiLCB0aGlzLl9vbk1vdmUpLCBcImFjdGl2ZVwiID09PSB0aGlzLl9zdGF0ZSAmJiB0aGlzLmZpcmUobmV3IHQuRXZlbnQoXCJkcmFnZW5kXCIpKSwgdGhpcy5fc3RhdGUgPSBcImluYWN0aXZlXCI7XG4gICAgICB9LCBvLnByb3RvdHlwZS5fYWRkRHJhZ0hhbmRsZXIgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB0aGlzLl9lbGVtZW50LmNvbnRhaW5zKHQub3JpZ2luYWxFdmVudC50YXJnZXQpICYmICh0LnByZXZlbnREZWZhdWx0KCksIHRoaXMuX3Bvc2l0aW9uRGVsdGEgPSB0LnBvaW50LnN1Yih0aGlzLl9wb3MpLmFkZCh0aGlzLl9vZmZzZXQpLCB0aGlzLl9wb2ludGVyZG93blBvcyA9IHQucG9pbnQsIHRoaXMuX3N0YXRlID0gXCJwZW5kaW5nXCIsIHRoaXMuX21hcC5vbihcIm1vdXNlbW92ZVwiLCB0aGlzLl9vbk1vdmUpLCB0aGlzLl9tYXAub24oXCJ0b3VjaG1vdmVcIiwgdGhpcy5fb25Nb3ZlKSwgdGhpcy5fbWFwLm9uY2UoXCJtb3VzZXVwXCIsIHRoaXMuX29uVXApLCB0aGlzLl9tYXAub25jZShcInRvdWNoZW5kXCIsIHRoaXMuX29uVXApKTtcbiAgICAgIH0sIG8ucHJvdG90eXBlLnNldERyYWdnYWJsZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kcmFnZ2FibGUgPSAhIXQsIHRoaXMuX21hcCAmJiAodCA/ICh0aGlzLl9tYXAub24oXCJtb3VzZWRvd25cIiwgdGhpcy5fYWRkRHJhZ0hhbmRsZXIpLCB0aGlzLl9tYXAub24oXCJ0b3VjaHN0YXJ0XCIsIHRoaXMuX2FkZERyYWdIYW5kbGVyKSkgOiAodGhpcy5fbWFwLm9mZihcIm1vdXNlZG93blwiLCB0aGlzLl9hZGREcmFnSGFuZGxlciksIHRoaXMuX21hcC5vZmYoXCJ0b3VjaHN0YXJ0XCIsIHRoaXMuX2FkZERyYWdIYW5kbGVyKSkpLCB0aGlzO1xuICAgICAgfSwgby5wcm90b3R5cGUuaXNEcmFnZ2FibGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kcmFnZ2FibGU7XG4gICAgICB9LCBvLnByb3RvdHlwZS5zZXRSb3RhdGlvbiA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3RhdGlvbiA9IHQgfHwgMCwgdGhpcy5fdXBkYXRlKCksIHRoaXM7XG4gICAgICB9LCBvLnByb3RvdHlwZS5nZXRSb3RhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JvdGF0aW9uO1xuICAgICAgfSwgby5wcm90b3R5cGUuc2V0Um90YXRpb25BbGlnbm1lbnQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm90YXRpb25BbGlnbm1lbnQgPSB0IHx8IFwiYXV0b1wiLCB0aGlzLl91cGRhdGUoKSwgdGhpcztcbiAgICAgIH0sIG8ucHJvdG90eXBlLmdldFJvdGF0aW9uQWxpZ25tZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm90YXRpb25BbGlnbm1lbnQ7XG4gICAgICB9LCBvLnByb3RvdHlwZS5zZXRQaXRjaEFsaWdubWVudCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9waXRjaEFsaWdubWVudCA9IHQgJiYgXCJhdXRvXCIgIT09IHQgPyB0IDogdGhpcy5fcm90YXRpb25BbGlnbm1lbnQsIHRoaXMuX3VwZGF0ZSgpLCB0aGlzO1xuICAgICAgfSwgby5wcm90b3R5cGUuZ2V0UGl0Y2hBbGlnbm1lbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9waXRjaEFsaWdubWVudDtcbiAgICAgIH0sIG87XG4gICAgfSh0LkV2ZW50ZWQpLFxuICAgICAgICBPciA9IHtcbiAgICAgIHBvc2l0aW9uT3B0aW9uczoge1xuICAgICAgICBlbmFibGVIaWdoQWNjdXJhY3k6ICExLFxuICAgICAgICBtYXhpbXVtQWdlOiAwLFxuICAgICAgICB0aW1lb3V0OiA2ZTNcbiAgICAgIH0sXG4gICAgICBmaXRCb3VuZHNPcHRpb25zOiB7XG4gICAgICAgIG1heFpvb206IDE1XG4gICAgICB9LFxuICAgICAgdHJhY2tVc2VyTG9jYXRpb246ICExLFxuICAgICAgc2hvd0FjY3VyYWN5Q2lyY2xlOiAhMCxcbiAgICAgIHNob3dVc2VyTG9jYXRpb246ICEwXG4gICAgfSxcbiAgICAgICAgRnIgPSAwLFxuICAgICAgICBVciA9ICExLFxuICAgICAgICBOciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBmdW5jdGlvbiBvKGkpIHtcbiAgICAgICAgZS5jYWxsKHRoaXMpLCB0aGlzLm9wdGlvbnMgPSB0LmV4dGVuZCh7fSwgT3IsIGkpLCB0LmJpbmRBbGwoW1wiX29uU3VjY2Vzc1wiLCBcIl9vbkVycm9yXCIsIFwiX29uWm9vbVwiLCBcIl9maW5pc2hcIiwgXCJfc2V0dXBVSVwiLCBcIl91cGRhdGVDYW1lcmFcIiwgXCJfdXBkYXRlTWFya2VyXCJdLCB0aGlzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGUgJiYgKG8uX19wcm90b19fID0gZSksIChvLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoZSAmJiBlLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gbywgby5wcm90b3R5cGUub25BZGQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgbztcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hcCA9IGUsIHRoaXMuX2NvbnRhaW5lciA9IGkuY3JlYXRlKFwiZGl2XCIsIFwibWFwYm94Z2wtY3RybCBtYXBib3hnbC1jdHJsLWdyb3VwXCIpLCBvID0gdGhpcy5fc2V0dXBVSSwgdm9pZCAwICE9PSBrciA/IG8oa3IpIDogdm9pZCAwICE9PSB0LndpbmRvdy5uYXZpZ2F0b3IucGVybWlzc2lvbnMgPyB0LndpbmRvdy5uYXZpZ2F0b3IucGVybWlzc2lvbnMucXVlcnkoe1xuICAgICAgICAgIG5hbWU6IFwiZ2VvbG9jYXRpb25cIlxuICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgbyhrciA9IFwiZGVuaWVkXCIgIT09IHQuc3RhdGUpO1xuICAgICAgICB9KSA6IG8oa3IgPSAhIXQud2luZG93Lm5hdmlnYXRvci5nZW9sb2NhdGlvbiksIHRoaXMuX2NvbnRhaW5lcjtcbiAgICAgIH0sIG8ucHJvdG90eXBlLm9uUmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2b2lkIDAgIT09IHRoaXMuX2dlb2xvY2F0aW9uV2F0Y2hJRCAmJiAodC53aW5kb3cubmF2aWdhdG9yLmdlb2xvY2F0aW9uLmNsZWFyV2F0Y2godGhpcy5fZ2VvbG9jYXRpb25XYXRjaElEKSwgdGhpcy5fZ2VvbG9jYXRpb25XYXRjaElEID0gdm9pZCAwKSwgdGhpcy5vcHRpb25zLnNob3dVc2VyTG9jYXRpb24gJiYgdGhpcy5fdXNlckxvY2F0aW9uRG90TWFya2VyICYmIHRoaXMuX3VzZXJMb2NhdGlvbkRvdE1hcmtlci5yZW1vdmUoKSwgdGhpcy5vcHRpb25zLnNob3dBY2N1cmFjeUNpcmNsZSAmJiB0aGlzLl9hY2N1cmFjeUNpcmNsZU1hcmtlciAmJiB0aGlzLl9hY2N1cmFjeUNpcmNsZU1hcmtlci5yZW1vdmUoKSwgaS5yZW1vdmUodGhpcy5fY29udGFpbmVyKSwgdGhpcy5fbWFwLm9mZihcInpvb21cIiwgdGhpcy5fb25ab29tKSwgdGhpcy5fbWFwID0gdm9pZCAwLCBGciA9IDAsIFVyID0gITE7XG4gICAgICB9LCBvLnByb3RvdHlwZS5faXNPdXRPZk1hcE1heEJvdW5kcyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHZhciBlID0gdGhpcy5fbWFwLmdldE1heEJvdW5kcygpLFxuICAgICAgICAgICAgaSA9IHQuY29vcmRzO1xuXG4gICAgICAgIHJldHVybiBlICYmIChpLmxvbmdpdHVkZSA8IGUuZ2V0V2VzdCgpIHx8IGkubG9uZ2l0dWRlID4gZS5nZXRFYXN0KCkgfHwgaS5sYXRpdHVkZSA8IGUuZ2V0U291dGgoKSB8fCBpLmxhdGl0dWRlID4gZS5nZXROb3J0aCgpKTtcbiAgICAgIH0sIG8ucHJvdG90eXBlLl9zZXRFcnJvclN0YXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuX3dhdGNoU3RhdGUpIHtcbiAgICAgICAgICBjYXNlIFwiV0FJVElOR19BQ1RJVkVcIjpcbiAgICAgICAgICAgIHRoaXMuX3dhdGNoU3RhdGUgPSBcIkFDVElWRV9FUlJPUlwiLCB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZShcIm1hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWFjdGl2ZVwiKSwgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoXCJtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmUtZXJyb3JcIik7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJBQ1RJVkVfTE9DS1wiOlxuICAgICAgICAgICAgdGhpcy5fd2F0Y2hTdGF0ZSA9IFwiQUNUSVZFX0VSUk9SXCIsIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKFwibWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlXCIpLCB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZChcIm1hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWFjdGl2ZS1lcnJvclwiKSwgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoXCJtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS13YWl0aW5nXCIpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwiQkFDS0dST1VORFwiOlxuICAgICAgICAgICAgdGhpcy5fd2F0Y2hTdGF0ZSA9IFwiQkFDS0dST1VORF9FUlJPUlwiLCB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZShcIm1hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWJhY2tncm91bmRcIiksIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwibWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYmFja2dyb3VuZC1lcnJvclwiKSwgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoXCJtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS13YWl0aW5nXCIpO1xuICAgICAgICB9XG4gICAgICB9LCBvLnByb3RvdHlwZS5fb25TdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKHRoaXMuX21hcCkge1xuICAgICAgICAgIGlmICh0aGlzLl9pc091dE9mTWFwTWF4Qm91bmRzKGUpKSByZXR1cm4gdGhpcy5fc2V0RXJyb3JTdGF0ZSgpLCB0aGlzLmZpcmUobmV3IHQuRXZlbnQoXCJvdXRvZm1heGJvdW5kc1wiLCBlKSksIHRoaXMuX3VwZGF0ZU1hcmtlcigpLCB2b2lkIHRoaXMuX2ZpbmlzaCgpO1xuICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMudHJhY2tVc2VyTG9jYXRpb24pIHN3aXRjaCAodGhpcy5fbGFzdEtub3duUG9zaXRpb24gPSBlLCB0aGlzLl93YXRjaFN0YXRlKSB7XG4gICAgICAgICAgICBjYXNlIFwiV0FJVElOR19BQ1RJVkVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJBQ1RJVkVfTE9DS1wiOlxuICAgICAgICAgICAgY2FzZSBcIkFDVElWRV9FUlJPUlwiOlxuICAgICAgICAgICAgICB0aGlzLl93YXRjaFN0YXRlID0gXCJBQ1RJVkVfTE9DS1wiLCB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZShcIm1hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLXdhaXRpbmdcIiksIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKFwibWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlLWVycm9yXCIpLCB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZChcIm1hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWFjdGl2ZVwiKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgXCJCQUNLR1JPVU5EXCI6XG4gICAgICAgICAgICBjYXNlIFwiQkFDS0dST1VORF9FUlJPUlwiOlxuICAgICAgICAgICAgICB0aGlzLl93YXRjaFN0YXRlID0gXCJCQUNLR1JPVU5EXCIsIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKFwibWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtd2FpdGluZ1wiKSwgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoXCJtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1iYWNrZ3JvdW5kLWVycm9yXCIpLCB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZChcIm1hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWJhY2tncm91bmRcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMub3B0aW9ucy5zaG93VXNlckxvY2F0aW9uICYmIFwiT0ZGXCIgIT09IHRoaXMuX3dhdGNoU3RhdGUgJiYgdGhpcy5fdXBkYXRlTWFya2VyKGUpLCB0aGlzLm9wdGlvbnMudHJhY2tVc2VyTG9jYXRpb24gJiYgXCJBQ1RJVkVfTE9DS1wiICE9PSB0aGlzLl93YXRjaFN0YXRlIHx8IHRoaXMuX3VwZGF0ZUNhbWVyYShlKSwgdGhpcy5vcHRpb25zLnNob3dVc2VyTG9jYXRpb24gJiYgdGhpcy5fZG90RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFwibWFwYm94Z2wtdXNlci1sb2NhdGlvbi1kb3Qtc3RhbGVcIiksIHRoaXMuZmlyZShuZXcgdC5FdmVudChcImdlb2xvY2F0ZVwiLCBlKSksIHRoaXMuX2ZpbmlzaCgpO1xuICAgICAgICB9XG4gICAgICB9LCBvLnByb3RvdHlwZS5fdXBkYXRlQ2FtZXJhID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIGkgPSBuZXcgdC5MbmdMYXQoZS5jb29yZHMubG9uZ2l0dWRlLCBlLmNvb3Jkcy5sYXRpdHVkZSksXG4gICAgICAgICAgICBvID0gZS5jb29yZHMuYWNjdXJhY3ksXG4gICAgICAgICAgICByID0gdGhpcy5fbWFwLmdldEJlYXJpbmcoKSxcbiAgICAgICAgICAgIGEgPSB0LmV4dGVuZCh7XG4gICAgICAgICAgYmVhcmluZzogclxuICAgICAgICB9LCB0aGlzLm9wdGlvbnMuZml0Qm91bmRzT3B0aW9ucyk7XG5cbiAgICAgICAgdGhpcy5fbWFwLmZpdEJvdW5kcyhpLnRvQm91bmRzKG8pLCBhLCB7XG4gICAgICAgICAgZ2VvbG9jYXRlU291cmNlOiAhMFxuICAgICAgICB9KTtcbiAgICAgIH0sIG8ucHJvdG90eXBlLl91cGRhdGVNYXJrZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAoZSkge1xuICAgICAgICAgIHZhciBpID0gbmV3IHQuTG5nTGF0KGUuY29vcmRzLmxvbmdpdHVkZSwgZS5jb29yZHMubGF0aXR1ZGUpO1xuICAgICAgICAgIHRoaXMuX2FjY3VyYWN5Q2lyY2xlTWFya2VyLnNldExuZ0xhdChpKS5hZGRUbyh0aGlzLl9tYXApLCB0aGlzLl91c2VyTG9jYXRpb25Eb3RNYXJrZXIuc2V0TG5nTGF0KGkpLmFkZFRvKHRoaXMuX21hcCksIHRoaXMuX2FjY3VyYWN5ID0gZS5jb29yZHMuYWNjdXJhY3ksIHRoaXMub3B0aW9ucy5zaG93VXNlckxvY2F0aW9uICYmIHRoaXMub3B0aW9ucy5zaG93QWNjdXJhY3lDaXJjbGUgJiYgdGhpcy5fdXBkYXRlQ2lyY2xlUmFkaXVzKCk7XG4gICAgICAgIH0gZWxzZSB0aGlzLl91c2VyTG9jYXRpb25Eb3RNYXJrZXIucmVtb3ZlKCksIHRoaXMuX2FjY3VyYWN5Q2lyY2xlTWFya2VyLnJlbW92ZSgpO1xuICAgICAgfSwgby5wcm90b3R5cGUuX3VwZGF0ZUNpcmNsZVJhZGl1cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHQgPSB0aGlzLl9tYXAuX2NvbnRhaW5lci5jbGllbnRIZWlnaHQgLyAyLFxuICAgICAgICAgICAgZSA9IHRoaXMuX21hcC51bnByb2plY3QoWzAsIHRdKSxcbiAgICAgICAgICAgIGkgPSB0aGlzLl9tYXAudW5wcm9qZWN0KFsxLCB0XSksXG4gICAgICAgICAgICBvID0gZS5kaXN0YW5jZVRvKGkpLFxuICAgICAgICAgICAgciA9IE1hdGguY2VpbCgyICogdGhpcy5fYWNjdXJhY3kgLyBvKTtcblxuICAgICAgICB0aGlzLl9jaXJjbGVFbGVtZW50LnN0eWxlLndpZHRoID0gciArIFwicHhcIiwgdGhpcy5fY2lyY2xlRWxlbWVudC5zdHlsZS5oZWlnaHQgPSByICsgXCJweFwiO1xuICAgICAgfSwgby5wcm90b3R5cGUuX29uWm9vbSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnNob3dVc2VyTG9jYXRpb24gJiYgdGhpcy5vcHRpb25zLnNob3dBY2N1cmFjeUNpcmNsZSAmJiB0aGlzLl91cGRhdGVDaXJjbGVSYWRpdXMoKTtcbiAgICAgIH0sIG8ucHJvdG90eXBlLl9vbkVycm9yID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKHRoaXMuX21hcCkge1xuICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMudHJhY2tVc2VyTG9jYXRpb24pIGlmICgxID09PSBlLmNvZGUpIHtcbiAgICAgICAgICAgIHRoaXMuX3dhdGNoU3RhdGUgPSBcIk9GRlwiLCB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZShcIm1hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLXdhaXRpbmdcIiksIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKFwibWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlXCIpLCB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZShcIm1hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWFjdGl2ZS1lcnJvclwiKSwgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoXCJtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1iYWNrZ3JvdW5kXCIpLCB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZShcIm1hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWJhY2tncm91bmQtZXJyb3JcIiksIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5kaXNhYmxlZCA9ICEwO1xuXG4gICAgICAgICAgICB2YXIgaSA9IHRoaXMuX21hcC5fZ2V0VUlTdHJpbmcoXCJHZW9sb2NhdGVDb250cm9sLkxvY2F0aW9uTm90QXZhaWxhYmxlXCIpO1xuXG4gICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24udGl0bGUgPSBpLCB0aGlzLl9nZW9sb2NhdGVCdXR0b24uc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBpKSwgdm9pZCAwICE9PSB0aGlzLl9nZW9sb2NhdGlvbldhdGNoSUQgJiYgdGhpcy5fY2xlYXJXYXRjaCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoMyA9PT0gZS5jb2RlICYmIFVyKSByZXR1cm47XG5cbiAgICAgICAgICAgIHRoaXMuX3NldEVycm9yU3RhdGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXCJPRkZcIiAhPT0gdGhpcy5fd2F0Y2hTdGF0ZSAmJiB0aGlzLm9wdGlvbnMuc2hvd1VzZXJMb2NhdGlvbiAmJiB0aGlzLl9kb3RFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJtYXBib3hnbC11c2VyLWxvY2F0aW9uLWRvdC1zdGFsZVwiKSwgdGhpcy5maXJlKG5ldyB0LkV2ZW50KFwiZXJyb3JcIiwgZSkpLCB0aGlzLl9maW5pc2goKTtcbiAgICAgICAgfVxuICAgICAgfSwgby5wcm90b3R5cGUuX2ZpbmlzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fdGltZW91dElkICYmIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0SWQpLCB0aGlzLl90aW1lb3V0SWQgPSB2b2lkIDA7XG4gICAgICB9LCBvLnByb3RvdHlwZS5fc2V0dXBVSSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBvID0gdGhpcztcblxuICAgICAgICBpZiAodGhpcy5fY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCBmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHJldHVybiB0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH0pLCB0aGlzLl9nZW9sb2NhdGVCdXR0b24gPSBpLmNyZWF0ZShcImJ1dHRvblwiLCBcIm1hcGJveGdsLWN0cmwtZ2VvbG9jYXRlXCIsIHRoaXMuX2NvbnRhaW5lciksIGkuY3JlYXRlKFwic3BhblwiLCBcIm1hcGJveGdsLWN0cmwtaWNvblwiLCB0aGlzLl9nZW9sb2NhdGVCdXR0b24pLnNldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIsICEwKSwgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLnR5cGUgPSBcImJ1dHRvblwiLCAhMSA9PT0gZSkge1xuICAgICAgICAgIHQud2Fybk9uY2UoXCJHZW9sb2NhdGlvbiBzdXBwb3J0IGlzIG5vdCBhdmFpbGFibGUgc28gdGhlIEdlb2xvY2F0ZUNvbnRyb2wgd2lsbCBiZSBkaXNhYmxlZC5cIik7XG5cbiAgICAgICAgICB2YXIgciA9IHRoaXMuX21hcC5fZ2V0VUlTdHJpbmcoXCJHZW9sb2NhdGVDb250cm9sLkxvY2F0aW9uTm90QXZhaWxhYmxlXCIpO1xuXG4gICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmRpc2FibGVkID0gITAsIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi50aXRsZSA9IHIsIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIHIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBhID0gdGhpcy5fbWFwLl9nZXRVSVN0cmluZyhcIkdlb2xvY2F0ZUNvbnRyb2wuRmluZE15TG9jYXRpb25cIik7XG5cbiAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24udGl0bGUgPSBhLCB0aGlzLl9nZW9sb2NhdGVCdXR0b24uc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub3B0aW9ucy50cmFja1VzZXJMb2NhdGlvbiAmJiAodGhpcy5fZ2VvbG9jYXRlQnV0dG9uLnNldEF0dHJpYnV0ZShcImFyaWEtcHJlc3NlZFwiLCBcImZhbHNlXCIpLCB0aGlzLl93YXRjaFN0YXRlID0gXCJPRkZcIiksIHRoaXMub3B0aW9ucy5zaG93VXNlckxvY2F0aW9uICYmICh0aGlzLl9kb3RFbGVtZW50ID0gaS5jcmVhdGUoXCJkaXZcIiwgXCJtYXBib3hnbC11c2VyLWxvY2F0aW9uLWRvdFwiKSwgdGhpcy5fdXNlckxvY2F0aW9uRG90TWFya2VyID0gbmV3IEJyKHRoaXMuX2RvdEVsZW1lbnQpLCB0aGlzLl9jaXJjbGVFbGVtZW50ID0gaS5jcmVhdGUoXCJkaXZcIiwgXCJtYXBib3hnbC11c2VyLWxvY2F0aW9uLWFjY3VyYWN5LWNpcmNsZVwiKSwgdGhpcy5fYWNjdXJhY3lDaXJjbGVNYXJrZXIgPSBuZXcgQnIoe1xuICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuX2NpcmNsZUVsZW1lbnQsXG4gICAgICAgICAgcGl0Y2hBbGlnbm1lbnQ6IFwibWFwXCJcbiAgICAgICAgfSksIHRoaXMub3B0aW9ucy50cmFja1VzZXJMb2NhdGlvbiAmJiAodGhpcy5fd2F0Y2hTdGF0ZSA9IFwiT0ZGXCIpLCB0aGlzLl9tYXAub24oXCJ6b29tXCIsIHRoaXMuX29uWm9vbSkpLCB0aGlzLl9nZW9sb2NhdGVCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMudHJpZ2dlci5iaW5kKHRoaXMpKSwgdGhpcy5fc2V0dXAgPSAhMCwgdGhpcy5vcHRpb25zLnRyYWNrVXNlckxvY2F0aW9uICYmIHRoaXMuX21hcC5vbihcIm1vdmVzdGFydFwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIGUuZ2VvbG9jYXRlU291cmNlIHx8IFwiQUNUSVZFX0xPQ0tcIiAhPT0gby5fd2F0Y2hTdGF0ZSB8fCBlLm9yaWdpbmFsRXZlbnQgJiYgXCJyZXNpemVcIiA9PT0gZS5vcmlnaW5hbEV2ZW50LnR5cGUgfHwgKG8uX3dhdGNoU3RhdGUgPSBcIkJBQ0tHUk9VTkRcIiwgby5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoXCJtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1iYWNrZ3JvdW5kXCIpLCBvLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZShcIm1hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWFjdGl2ZVwiKSwgby5maXJlKG5ldyB0LkV2ZW50KFwidHJhY2t1c2VybG9jYXRpb25lbmRcIikpKTtcbiAgICAgICAgfSk7XG4gICAgICB9LCBvLnByb3RvdHlwZS50cmlnZ2VyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3NldHVwKSByZXR1cm4gdC53YXJuT25jZShcIkdlb2xvY2F0ZSBjb250cm9sIHRyaWdnZXJlZCBiZWZvcmUgYWRkZWQgdG8gYSBtYXBcIiksICExO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudHJhY2tVc2VyTG9jYXRpb24pIHtcbiAgICAgICAgICBzd2l0Y2ggKHRoaXMuX3dhdGNoU3RhdGUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJPRkZcIjpcbiAgICAgICAgICAgICAgdGhpcy5fd2F0Y2hTdGF0ZSA9IFwiV0FJVElOR19BQ1RJVkVcIiwgdGhpcy5maXJlKG5ldyB0LkV2ZW50KFwidHJhY2t1c2VybG9jYXRpb25zdGFydFwiKSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIFwiV0FJVElOR19BQ1RJVkVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJBQ1RJVkVfTE9DS1wiOlxuICAgICAgICAgICAgY2FzZSBcIkFDVElWRV9FUlJPUlwiOlxuICAgICAgICAgICAgY2FzZSBcIkJBQ0tHUk9VTkRfRVJST1JcIjpcbiAgICAgICAgICAgICAgRnItLSwgVXIgPSAhMSwgdGhpcy5fd2F0Y2hTdGF0ZSA9IFwiT0ZGXCIsIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKFwibWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtd2FpdGluZ1wiKSwgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoXCJtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmVcIiksIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKFwibWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlLWVycm9yXCIpLCB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZShcIm1hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWJhY2tncm91bmRcIiksIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKFwibWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYmFja2dyb3VuZC1lcnJvclwiKSwgdGhpcy5maXJlKG5ldyB0LkV2ZW50KFwidHJhY2t1c2VybG9jYXRpb25lbmRcIikpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBcIkJBQ0tHUk9VTkRcIjpcbiAgICAgICAgICAgICAgdGhpcy5fd2F0Y2hTdGF0ZSA9IFwiQUNUSVZFX0xPQ0tcIiwgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoXCJtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1iYWNrZ3JvdW5kXCIpLCB0aGlzLl9sYXN0S25vd25Qb3NpdGlvbiAmJiB0aGlzLl91cGRhdGVDYW1lcmEodGhpcy5fbGFzdEtub3duUG9zaXRpb24pLCB0aGlzLmZpcmUobmV3IHQuRXZlbnQoXCJ0cmFja3VzZXJsb2NhdGlvbnN0YXJ0XCIpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzd2l0Y2ggKHRoaXMuX3dhdGNoU3RhdGUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJXQUlUSU5HX0FDVElWRVwiOlxuICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZChcIm1hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLXdhaXRpbmdcIiksIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwibWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlXCIpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBcIkFDVElWRV9MT0NLXCI6XG4gICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwibWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlXCIpO1xuXG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIFwiQUNUSVZFX0VSUk9SXCI6XG4gICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwibWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtd2FpdGluZ1wiKSwgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoXCJtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmUtZXJyb3JcIik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIFwiQkFDS0dST1VORFwiOlxuICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZChcIm1hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWJhY2tncm91bmRcIik7XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgXCJCQUNLR1JPVU5EX0VSUk9SXCI6XG4gICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwibWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtd2FpdGluZ1wiKSwgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoXCJtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1iYWNrZ3JvdW5kLWVycm9yXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChcIk9GRlwiID09PSB0aGlzLl93YXRjaFN0YXRlICYmIHZvaWQgMCAhPT0gdGhpcy5fZ2VvbG9jYXRpb25XYXRjaElEKSB0aGlzLl9jbGVhcldhdGNoKCk7ZWxzZSBpZiAodm9pZCAwID09PSB0aGlzLl9nZW9sb2NhdGlvbldhdGNoSUQpIHtcbiAgICAgICAgICAgIHZhciBlO1xuICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoXCJtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS13YWl0aW5nXCIpLCB0aGlzLl9nZW9sb2NhdGVCdXR0b24uc2V0QXR0cmlidXRlKFwiYXJpYS1wcmVzc2VkXCIsIFwidHJ1ZVwiKSwgKytGciA+IDEgPyAoZSA9IHtcbiAgICAgICAgICAgICAgbWF4aW11bUFnZTogNmU1LFxuICAgICAgICAgICAgICB0aW1lb3V0OiAwXG4gICAgICAgICAgICB9LCBVciA9ICEwKSA6IChlID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uT3B0aW9ucywgVXIgPSAhMSksIHRoaXMuX2dlb2xvY2F0aW9uV2F0Y2hJRCA9IHQud2luZG93Lm5hdmlnYXRvci5nZW9sb2NhdGlvbi53YXRjaFBvc2l0aW9uKHRoaXMuX29uU3VjY2VzcywgdGhpcy5fb25FcnJvciwgZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgdC53aW5kb3cubmF2aWdhdG9yLmdlb2xvY2F0aW9uLmdldEN1cnJlbnRQb3NpdGlvbih0aGlzLl9vblN1Y2Nlc3MsIHRoaXMuX29uRXJyb3IsIHRoaXMub3B0aW9ucy5wb3NpdGlvbk9wdGlvbnMpLCB0aGlzLl90aW1lb3V0SWQgPSBzZXRUaW1lb3V0KHRoaXMuX2ZpbmlzaCwgMWU0KTtcblxuICAgICAgICByZXR1cm4gITA7XG4gICAgICB9LCBvLnByb3RvdHlwZS5fY2xlYXJXYXRjaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdC53aW5kb3cubmF2aWdhdG9yLmdlb2xvY2F0aW9uLmNsZWFyV2F0Y2godGhpcy5fZ2VvbG9jYXRpb25XYXRjaElEKSwgdGhpcy5fZ2VvbG9jYXRpb25XYXRjaElEID0gdm9pZCAwLCB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZShcIm1hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLXdhaXRpbmdcIiksIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoXCJhcmlhLXByZXNzZWRcIiwgXCJmYWxzZVwiKSwgdGhpcy5vcHRpb25zLnNob3dVc2VyTG9jYXRpb24gJiYgdGhpcy5fdXBkYXRlTWFya2VyKG51bGwpO1xuICAgICAgfSwgbztcbiAgICB9KHQuRXZlbnRlZCksXG4gICAgICAgIFpyID0ge1xuICAgICAgbWF4V2lkdGg6IDEwMCxcbiAgICAgIHVuaXQ6IFwibWV0cmljXCJcbiAgICB9LFxuICAgICAgICBxciA9IGZ1bmN0aW9uIHFyKGUpIHtcbiAgICAgIHRoaXMub3B0aW9ucyA9IHQuZXh0ZW5kKHt9LCBaciwgZSksIHQuYmluZEFsbChbXCJfb25Nb3ZlXCIsIFwic2V0VW5pdFwiXSwgdGhpcyk7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGpyKHQsIGUsIGkpIHtcbiAgICAgIHZhciBvID0gaSAmJiBpLm1heFdpZHRoIHx8IDEwMCxcbiAgICAgICAgICByID0gdC5fY29udGFpbmVyLmNsaWVudEhlaWdodCAvIDIsXG4gICAgICAgICAgYSA9IHQudW5wcm9qZWN0KFswLCByXSksXG4gICAgICAgICAgbiA9IHQudW5wcm9qZWN0KFtvLCByXSksXG4gICAgICAgICAgcyA9IGEuZGlzdGFuY2VUbyhuKTtcblxuICAgICAgaWYgKGkgJiYgXCJpbXBlcmlhbFwiID09PSBpLnVuaXQpIHtcbiAgICAgICAgdmFyIGwgPSAzLjI4MDggKiBzO1xuICAgICAgICBsID4gNTI4MCA/IFZyKGUsIG8sIGwgLyA1MjgwLCB0Ll9nZXRVSVN0cmluZyhcIlNjYWxlQ29udHJvbC5NaWxlc1wiKSkgOiBWcihlLCBvLCBsLCB0Ll9nZXRVSVN0cmluZyhcIlNjYWxlQ29udHJvbC5GZWV0XCIpKTtcbiAgICAgIH0gZWxzZSBpICYmIFwibmF1dGljYWxcIiA9PT0gaS51bml0ID8gVnIoZSwgbywgcyAvIDE4NTIsIHQuX2dldFVJU3RyaW5nKFwiU2NhbGVDb250cm9sLk5hdXRpY2FsTWlsZXNcIikpIDogcyA+PSAxZTMgPyBWcihlLCBvLCBzIC8gMWUzLCB0Ll9nZXRVSVN0cmluZyhcIlNjYWxlQ29udHJvbC5LaWxvbWV0ZXJzXCIpKSA6IFZyKGUsIG8sIHMsIHQuX2dldFVJU3RyaW5nKFwiU2NhbGVDb250cm9sLk1ldGVyc1wiKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gVnIodCwgZSwgaSwgbykge1xuICAgICAgdmFyIHIsXG4gICAgICAgICAgYSxcbiAgICAgICAgICBuLFxuICAgICAgICAgIHMgPSAociA9IGksIChhID0gTWF0aC5wb3coMTAsIChcIlwiICsgTWF0aC5mbG9vcihyKSkubGVuZ3RoIC0gMSkpICogKG4gPSAobiA9IHIgLyBhKSA+PSAxMCA/IDEwIDogbiA+PSA1ID8gNSA6IG4gPj0gMyA/IDMgOiBuID49IDIgPyAyIDogbiA+PSAxID8gMSA6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHZhciBlID0gTWF0aC5wb3coMTAsIE1hdGguY2VpbCgtTWF0aC5sb2codCkgLyBNYXRoLkxOMTApKTtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQodCAqIGUpIC8gZTtcbiAgICAgIH0obikpKTtcbiAgICAgIHQuc3R5bGUud2lkdGggPSBlICogKHMgLyBpKSArIFwicHhcIiwgdC5pbm5lckhUTUwgPSBzICsgXCImbmJzcDtcIiArIG87XG4gICAgfVxuXG4gICAgcXIucHJvdG90eXBlLmdldERlZmF1bHRQb3NpdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBcImJvdHRvbS1sZWZ0XCI7XG4gICAgfSwgcXIucHJvdG90eXBlLl9vbk1vdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBqcih0aGlzLl9tYXAsIHRoaXMuX2NvbnRhaW5lciwgdGhpcy5vcHRpb25zKTtcbiAgICB9LCBxci5wcm90b3R5cGUub25BZGQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHRoaXMuX21hcCA9IHQsIHRoaXMuX2NvbnRhaW5lciA9IGkuY3JlYXRlKFwiZGl2XCIsIFwibWFwYm94Z2wtY3RybCBtYXBib3hnbC1jdHJsLXNjYWxlXCIsIHQuZ2V0Q29udGFpbmVyKCkpLCB0aGlzLl9tYXAub24oXCJtb3ZlXCIsIHRoaXMuX29uTW92ZSksIHRoaXMuX29uTW92ZSgpLCB0aGlzLl9jb250YWluZXI7XG4gICAgfSwgcXIucHJvdG90eXBlLm9uUmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgaS5yZW1vdmUodGhpcy5fY29udGFpbmVyKSwgdGhpcy5fbWFwLm9mZihcIm1vdmVcIiwgdGhpcy5fb25Nb3ZlKSwgdGhpcy5fbWFwID0gdm9pZCAwO1xuICAgIH0sIHFyLnByb3RvdHlwZS5zZXRVbml0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHRoaXMub3B0aW9ucy51bml0ID0gdCwganIodGhpcy5fbWFwLCB0aGlzLl9jb250YWluZXIsIHRoaXMub3B0aW9ucyk7XG4gICAgfTtcblxuICAgIHZhciBHciA9IGZ1bmN0aW9uIEdyKGUpIHtcbiAgICAgIHRoaXMuX2Z1bGxzY3JlZW4gPSAhMSwgZSAmJiBlLmNvbnRhaW5lciAmJiAoZS5jb250YWluZXIgaW5zdGFuY2VvZiB0LndpbmRvdy5IVE1MRWxlbWVudCA/IHRoaXMuX2NvbnRhaW5lciA9IGUuY29udGFpbmVyIDogdC53YXJuT25jZShcIkZ1bGwgc2NyZWVuIGNvbnRyb2wgJ2NvbnRhaW5lcicgbXVzdCBiZSBhIERPTSBlbGVtZW50LlwiKSksIHQuYmluZEFsbChbXCJfb25DbGlja0Z1bGxzY3JlZW5cIiwgXCJfY2hhbmdlSWNvblwiXSwgdGhpcyksIFwib25mdWxsc2NyZWVuY2hhbmdlXCIgaW4gdC53aW5kb3cuZG9jdW1lbnQgPyB0aGlzLl9mdWxsc2NyZWVuY2hhbmdlID0gXCJmdWxsc2NyZWVuY2hhbmdlXCIgOiBcIm9ubW96ZnVsbHNjcmVlbmNoYW5nZVwiIGluIHQud2luZG93LmRvY3VtZW50ID8gdGhpcy5fZnVsbHNjcmVlbmNoYW5nZSA9IFwibW96ZnVsbHNjcmVlbmNoYW5nZVwiIDogXCJvbndlYmtpdGZ1bGxzY3JlZW5jaGFuZ2VcIiBpbiB0LndpbmRvdy5kb2N1bWVudCA/IHRoaXMuX2Z1bGxzY3JlZW5jaGFuZ2UgPSBcIndlYmtpdGZ1bGxzY3JlZW5jaGFuZ2VcIiA6IFwib25tc2Z1bGxzY3JlZW5jaGFuZ2VcIiBpbiB0LndpbmRvdy5kb2N1bWVudCAmJiAodGhpcy5fZnVsbHNjcmVlbmNoYW5nZSA9IFwiTVNGdWxsc2NyZWVuQ2hhbmdlXCIpO1xuICAgIH07XG5cbiAgICBHci5wcm90b3R5cGUub25BZGQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX21hcCA9IGUsIHRoaXMuX2NvbnRhaW5lciB8fCAodGhpcy5fY29udGFpbmVyID0gdGhpcy5fbWFwLmdldENvbnRhaW5lcigpKSwgdGhpcy5fY29udHJvbENvbnRhaW5lciA9IGkuY3JlYXRlKFwiZGl2XCIsIFwibWFwYm94Z2wtY3RybCBtYXBib3hnbC1jdHJsLWdyb3VwXCIpLCB0aGlzLl9jaGVja0Z1bGxzY3JlZW5TdXBwb3J0KCkgPyB0aGlzLl9zZXR1cFVJKCkgOiAodGhpcy5fY29udHJvbENvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCIsIHQud2Fybk9uY2UoXCJUaGlzIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IGZ1bGxzY3JlZW4gbW9kZS5cIikpLCB0aGlzLl9jb250cm9sQ29udGFpbmVyO1xuICAgIH0sIEdyLnByb3RvdHlwZS5vblJlbW92ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGkucmVtb3ZlKHRoaXMuX2NvbnRyb2xDb250YWluZXIpLCB0aGlzLl9tYXAgPSBudWxsLCB0LndpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHRoaXMuX2Z1bGxzY3JlZW5jaGFuZ2UsIHRoaXMuX2NoYW5nZUljb24pO1xuICAgIH0sIEdyLnByb3RvdHlwZS5fY2hlY2tGdWxsc2NyZWVuU3VwcG9ydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhISh0LndpbmRvdy5kb2N1bWVudC5mdWxsc2NyZWVuRW5hYmxlZCB8fCB0LndpbmRvdy5kb2N1bWVudC5tb3pGdWxsU2NyZWVuRW5hYmxlZCB8fCB0LndpbmRvdy5kb2N1bWVudC5tc0Z1bGxzY3JlZW5FbmFibGVkIHx8IHQud2luZG93LmRvY3VtZW50LndlYmtpdEZ1bGxzY3JlZW5FbmFibGVkKTtcbiAgICB9LCBHci5wcm90b3R5cGUuX3NldHVwVUkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgZSA9IHRoaXMuX2Z1bGxzY3JlZW5CdXR0b24gPSBpLmNyZWF0ZShcImJ1dHRvblwiLCBcIm1hcGJveGdsLWN0cmwtZnVsbHNjcmVlblwiLCB0aGlzLl9jb250cm9sQ29udGFpbmVyKTtcbiAgICAgIGkuY3JlYXRlKFwic3BhblwiLCBcIm1hcGJveGdsLWN0cmwtaWNvblwiLCBlKS5zZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiLCAhMCksIGUudHlwZSA9IFwiYnV0dG9uXCIsIHRoaXMuX3VwZGF0ZVRpdGxlKCksIHRoaXMuX2Z1bGxzY3JlZW5CdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuX29uQ2xpY2tGdWxsc2NyZWVuKSwgdC53aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLl9mdWxsc2NyZWVuY2hhbmdlLCB0aGlzLl9jaGFuZ2VJY29uKTtcbiAgICB9LCBHci5wcm90b3R5cGUuX3VwZGF0ZVRpdGxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHQgPSB0aGlzLl9nZXRUaXRsZSgpO1xuXG4gICAgICB0aGlzLl9mdWxsc2NyZWVuQnV0dG9uLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgdCksIHRoaXMuX2Z1bGxzY3JlZW5CdXR0b24udGl0bGUgPSB0O1xuICAgIH0sIEdyLnByb3RvdHlwZS5fZ2V0VGl0bGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbWFwLl9nZXRVSVN0cmluZyh0aGlzLl9pc0Z1bGxzY3JlZW4oKSA/IFwiRnVsbHNjcmVlbkNvbnRyb2wuRXhpdFwiIDogXCJGdWxsc2NyZWVuQ29udHJvbC5FbnRlclwiKTtcbiAgICB9LCBHci5wcm90b3R5cGUuX2lzRnVsbHNjcmVlbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9mdWxsc2NyZWVuO1xuICAgIH0sIEdyLnByb3RvdHlwZS5fY2hhbmdlSWNvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICh0LndpbmRvdy5kb2N1bWVudC5mdWxsc2NyZWVuRWxlbWVudCB8fCB0LndpbmRvdy5kb2N1bWVudC5tb3pGdWxsU2NyZWVuRWxlbWVudCB8fCB0LndpbmRvdy5kb2N1bWVudC53ZWJraXRGdWxsc2NyZWVuRWxlbWVudCB8fCB0LndpbmRvdy5kb2N1bWVudC5tc0Z1bGxzY3JlZW5FbGVtZW50KSA9PT0gdGhpcy5fY29udGFpbmVyICE9PSB0aGlzLl9mdWxsc2NyZWVuICYmICh0aGlzLl9mdWxsc2NyZWVuID0gIXRoaXMuX2Z1bGxzY3JlZW4sIHRoaXMuX2Z1bGxzY3JlZW5CdXR0b24uY2xhc3NMaXN0LnRvZ2dsZShcIm1hcGJveGdsLWN0cmwtc2hyaW5rXCIpLCB0aGlzLl9mdWxsc2NyZWVuQnV0dG9uLmNsYXNzTGlzdC50b2dnbGUoXCJtYXBib3hnbC1jdHJsLWZ1bGxzY3JlZW5cIiksIHRoaXMuX3VwZGF0ZVRpdGxlKCkpO1xuICAgIH0sIEdyLnByb3RvdHlwZS5fb25DbGlja0Z1bGxzY3JlZW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLl9pc0Z1bGxzY3JlZW4oKSA/IHQud2luZG93LmRvY3VtZW50LmV4aXRGdWxsc2NyZWVuID8gdC53aW5kb3cuZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKSA6IHQud2luZG93LmRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4gPyB0LndpbmRvdy5kb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCkgOiB0LndpbmRvdy5kb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuID8gdC53aW5kb3cuZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpIDogdC53aW5kb3cuZG9jdW1lbnQud2Via2l0Q2FuY2VsRnVsbFNjcmVlbiAmJiB0LndpbmRvdy5kb2N1bWVudC53ZWJraXRDYW5jZWxGdWxsU2NyZWVuKCkgOiB0aGlzLl9jb250YWluZXIucmVxdWVzdEZ1bGxzY3JlZW4gPyB0aGlzLl9jb250YWluZXIucmVxdWVzdEZ1bGxzY3JlZW4oKSA6IHRoaXMuX2NvbnRhaW5lci5tb3pSZXF1ZXN0RnVsbFNjcmVlbiA/IHRoaXMuX2NvbnRhaW5lci5tb3pSZXF1ZXN0RnVsbFNjcmVlbigpIDogdGhpcy5fY29udGFpbmVyLm1zUmVxdWVzdEZ1bGxzY3JlZW4gPyB0aGlzLl9jb250YWluZXIubXNSZXF1ZXN0RnVsbHNjcmVlbigpIDogdGhpcy5fY29udGFpbmVyLndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuICYmIHRoaXMuX2NvbnRhaW5lci53ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbigpO1xuICAgIH07XG5cbiAgICB2YXIgV3IgPSB7XG4gICAgICBjbG9zZUJ1dHRvbjogITAsXG4gICAgICBjbG9zZU9uQ2xpY2s6ICEwLFxuICAgICAgZm9jdXNBZnRlck9wZW46ICEwLFxuICAgICAgY2xhc3NOYW1lOiBcIlwiLFxuICAgICAgbWF4V2lkdGg6IFwiMjQwcHhcIlxuICAgIH0sXG4gICAgICAgIFhyID0gW1wiYVtocmVmXVwiLCBcIlt0YWJpbmRleF06bm90KFt0YWJpbmRleD0nLTEnXSlcIiwgXCJbY29udGVudGVkaXRhYmxlXTpub3QoW2NvbnRlbnRlZGl0YWJsZT0nZmFsc2UnXSlcIiwgXCJidXR0b246bm90KFtkaXNhYmxlZF0pXCIsIFwiaW5wdXQ6bm90KFtkaXNhYmxlZF0pXCIsIFwic2VsZWN0Om5vdChbZGlzYWJsZWRdKVwiLCBcInRleHRhcmVhOm5vdChbZGlzYWJsZWRdKVwiXS5qb2luKFwiLCBcIiksXG4gICAgICAgIEhyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGZ1bmN0aW9uIG8oaSkge1xuICAgICAgICBlLmNhbGwodGhpcyksIHRoaXMub3B0aW9ucyA9IHQuZXh0ZW5kKE9iamVjdC5jcmVhdGUoV3IpLCBpKSwgdC5iaW5kQWxsKFtcIl91cGRhdGVcIiwgXCJfb25DbG9zZVwiLCBcInJlbW92ZVwiLCBcIl9vbk1vdXNlTW92ZVwiLCBcIl9vbk1vdXNlVXBcIiwgXCJfb25EcmFnXCJdLCB0aGlzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGUgJiYgKG8uX19wcm90b19fID0gZSksIChvLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoZSAmJiBlLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gbywgby5wcm90b3R5cGUuYWRkVG8gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFwICYmIHRoaXMucmVtb3ZlKCksIHRoaXMuX21hcCA9IGUsIHRoaXMub3B0aW9ucy5jbG9zZU9uQ2xpY2sgJiYgdGhpcy5fbWFwLm9uKFwiY2xpY2tcIiwgdGhpcy5fb25DbG9zZSksIHRoaXMub3B0aW9ucy5jbG9zZU9uTW92ZSAmJiB0aGlzLl9tYXAub24oXCJtb3ZlXCIsIHRoaXMuX29uQ2xvc2UpLCB0aGlzLl9tYXAub24oXCJyZW1vdmVcIiwgdGhpcy5yZW1vdmUpLCB0aGlzLl91cGRhdGUoKSwgdGhpcy5fZm9jdXNGaXJzdEVsZW1lbnQoKSwgdGhpcy5fdHJhY2tQb2ludGVyID8gKHRoaXMuX21hcC5vbihcIm1vdXNlbW92ZVwiLCB0aGlzLl9vbk1vdXNlTW92ZSksIHRoaXMuX21hcC5vbihcIm1vdXNldXBcIiwgdGhpcy5fb25Nb3VzZVVwKSwgdGhpcy5fY29udGFpbmVyICYmIHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwibWFwYm94Z2wtcG9wdXAtdHJhY2stcG9pbnRlclwiKSwgdGhpcy5fbWFwLl9jYW52YXNDb250YWluZXIuY2xhc3NMaXN0LmFkZChcIm1hcGJveGdsLXRyYWNrLXBvaW50ZXJcIikpIDogdGhpcy5fbWFwLm9uKFwibW92ZVwiLCB0aGlzLl91cGRhdGUpLCB0aGlzLmZpcmUobmV3IHQuRXZlbnQoXCJvcGVuXCIpKSwgdGhpcztcbiAgICAgIH0sIG8ucHJvdG90eXBlLmlzT3BlbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fbWFwO1xuICAgICAgfSwgby5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudCAmJiBpLnJlbW92ZSh0aGlzLl9jb250ZW50KSwgdGhpcy5fY29udGFpbmVyICYmIChpLnJlbW92ZSh0aGlzLl9jb250YWluZXIpLCBkZWxldGUgdGhpcy5fY29udGFpbmVyKSwgdGhpcy5fbWFwICYmICh0aGlzLl9tYXAub2ZmKFwibW92ZVwiLCB0aGlzLl91cGRhdGUpLCB0aGlzLl9tYXAub2ZmKFwibW92ZVwiLCB0aGlzLl9vbkNsb3NlKSwgdGhpcy5fbWFwLm9mZihcImNsaWNrXCIsIHRoaXMuX29uQ2xvc2UpLCB0aGlzLl9tYXAub2ZmKFwicmVtb3ZlXCIsIHRoaXMucmVtb3ZlKSwgdGhpcy5fbWFwLm9mZihcIm1vdXNlbW92ZVwiLCB0aGlzLl9vbk1vdXNlTW92ZSksIHRoaXMuX21hcC5vZmYoXCJtb3VzZXVwXCIsIHRoaXMuX29uTW91c2VVcCksIHRoaXMuX21hcC5vZmYoXCJkcmFnXCIsIHRoaXMuX29uRHJhZyksIGRlbGV0ZSB0aGlzLl9tYXApLCB0aGlzLmZpcmUobmV3IHQuRXZlbnQoXCJjbG9zZVwiKSksIHRoaXM7XG4gICAgICB9LCBvLnByb3RvdHlwZS5nZXRMbmdMYXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sbmdMYXQ7XG4gICAgICB9LCBvLnByb3RvdHlwZS5zZXRMbmdMYXQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG5nTGF0ID0gdC5MbmdMYXQuY29udmVydChlKSwgdGhpcy5fcG9zID0gbnVsbCwgdGhpcy5fdHJhY2tQb2ludGVyID0gITEsIHRoaXMuX3VwZGF0ZSgpLCB0aGlzLl9tYXAgJiYgKHRoaXMuX21hcC5vbihcIm1vdmVcIiwgdGhpcy5fdXBkYXRlKSwgdGhpcy5fbWFwLm9mZihcIm1vdXNlbW92ZVwiLCB0aGlzLl9vbk1vdXNlTW92ZSksIHRoaXMuX2NvbnRhaW5lciAmJiB0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZShcIm1hcGJveGdsLXBvcHVwLXRyYWNrLXBvaW50ZXJcIiksIHRoaXMuX21hcC5fY2FudmFzQ29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoXCJtYXBib3hnbC10cmFjay1wb2ludGVyXCIpKSwgdGhpcztcbiAgICAgIH0sIG8ucHJvdG90eXBlLnRyYWNrUG9pbnRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYWNrUG9pbnRlciA9ICEwLCB0aGlzLl9wb3MgPSBudWxsLCB0aGlzLl91cGRhdGUoKSwgdGhpcy5fbWFwICYmICh0aGlzLl9tYXAub2ZmKFwibW92ZVwiLCB0aGlzLl91cGRhdGUpLCB0aGlzLl9tYXAub24oXCJtb3VzZW1vdmVcIiwgdGhpcy5fb25Nb3VzZU1vdmUpLCB0aGlzLl9tYXAub24oXCJkcmFnXCIsIHRoaXMuX29uRHJhZyksIHRoaXMuX2NvbnRhaW5lciAmJiB0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LmFkZChcIm1hcGJveGdsLXBvcHVwLXRyYWNrLXBvaW50ZXJcIiksIHRoaXMuX21hcC5fY2FudmFzQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJtYXBib3hnbC10cmFjay1wb2ludGVyXCIpKSwgdGhpcztcbiAgICAgIH0sIG8ucHJvdG90eXBlLmdldEVsZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250YWluZXI7XG4gICAgICB9LCBvLnByb3RvdHlwZS5zZXRUZXh0ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0RE9NQ29udGVudCh0LndpbmRvdy5kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShlKSk7XG4gICAgICB9LCBvLnByb3RvdHlwZS5zZXRIVE1MID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBvID0gdC53aW5kb3cuZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLFxuICAgICAgICAgICAgciA9IHQud2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJib2R5XCIpO1xuXG4gICAgICAgIGZvciAoci5pbm5lckhUTUwgPSBlOyBpID0gci5maXJzdENoaWxkOykge1xuICAgICAgICAgIG8uYXBwZW5kQ2hpbGQoaSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5zZXRET01Db250ZW50KG8pO1xuICAgICAgfSwgby5wcm90b3R5cGUuZ2V0TWF4V2lkdGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250YWluZXIgJiYgdGhpcy5fY29udGFpbmVyLnN0eWxlLm1heFdpZHRoO1xuICAgICAgfSwgby5wcm90b3R5cGUuc2V0TWF4V2lkdGggPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLm1heFdpZHRoID0gdCwgdGhpcy5fdXBkYXRlKCksIHRoaXM7XG4gICAgICB9LCBvLnByb3RvdHlwZS5zZXRET01Db250ZW50ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NvbnRlbnQpIGZvciAoOyB0aGlzLl9jb250ZW50Lmhhc0NoaWxkTm9kZXMoKTspIHtcbiAgICAgICAgICB0aGlzLl9jb250ZW50LmZpcnN0Q2hpbGQgJiYgdGhpcy5fY29udGVudC5yZW1vdmVDaGlsZCh0aGlzLl9jb250ZW50LmZpcnN0Q2hpbGQpO1xuICAgICAgICB9IGVsc2UgdGhpcy5fY29udGVudCA9IGkuY3JlYXRlKFwiZGl2XCIsIFwibWFwYm94Z2wtcG9wdXAtY29udGVudFwiLCB0aGlzLl9jb250YWluZXIpO1xuICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudC5hcHBlbmRDaGlsZCh0KSwgdGhpcy5fY3JlYXRlQ2xvc2VCdXR0b24oKSwgdGhpcy5fdXBkYXRlKCksIHRoaXMuX2ZvY3VzRmlyc3RFbGVtZW50KCksIHRoaXM7XG4gICAgICB9LCBvLnByb3RvdHlwZS5hZGRDbGFzc05hbWUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB0aGlzLl9jb250YWluZXIgJiYgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5hZGQodCk7XG4gICAgICB9LCBvLnByb3RvdHlwZS5yZW1vdmVDbGFzc05hbWUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB0aGlzLl9jb250YWluZXIgJiYgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUodCk7XG4gICAgICB9LCBvLnByb3RvdHlwZS5zZXRPZmZzZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLm9mZnNldCA9IHQsIHRoaXMuX3VwZGF0ZSgpLCB0aGlzO1xuICAgICAgfSwgby5wcm90b3R5cGUudG9nZ2xlQ2xhc3NOYW1lID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NvbnRhaW5lcikgcmV0dXJuIHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKHQpO1xuICAgICAgfSwgby5wcm90b3R5cGUuX2NyZWF0ZUNsb3NlQnV0dG9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuY2xvc2VCdXR0b24gJiYgKHRoaXMuX2Nsb3NlQnV0dG9uID0gaS5jcmVhdGUoXCJidXR0b25cIiwgXCJtYXBib3hnbC1wb3B1cC1jbG9zZS1idXR0b25cIiwgdGhpcy5fY29udGVudCksIHRoaXMuX2Nsb3NlQnV0dG9uLnR5cGUgPSBcImJ1dHRvblwiLCB0aGlzLl9jbG9zZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIFwiQ2xvc2UgcG9wdXBcIiksIHRoaXMuX2Nsb3NlQnV0dG9uLmlubmVySFRNTCA9IFwiJiMyMTU7XCIsIHRoaXMuX2Nsb3NlQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLl9vbkNsb3NlKSk7XG4gICAgICB9LCBvLnByb3RvdHlwZS5fb25Nb3VzZVVwID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlKHQucG9pbnQpO1xuICAgICAgfSwgby5wcm90b3R5cGUuX29uTW91c2VNb3ZlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlKHQucG9pbnQpO1xuICAgICAgfSwgby5wcm90b3R5cGUuX29uRHJhZyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSh0LnBvaW50KTtcbiAgICAgIH0sIG8ucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgbyA9IHRoaXM7XG5cbiAgICAgICAgaWYgKHRoaXMuX21hcCAmJiAodGhpcy5fbG5nTGF0IHx8IHRoaXMuX3RyYWNrUG9pbnRlcikgJiYgdGhpcy5fY29udGVudCAmJiAodGhpcy5fY29udGFpbmVyIHx8ICh0aGlzLl9jb250YWluZXIgPSBpLmNyZWF0ZShcImRpdlwiLCBcIm1hcGJveGdsLXBvcHVwXCIsIHRoaXMuX21hcC5nZXRDb250YWluZXIoKSksIHRoaXMuX3RpcCA9IGkuY3JlYXRlKFwiZGl2XCIsIFwibWFwYm94Z2wtcG9wdXAtdGlwXCIsIHRoaXMuX2NvbnRhaW5lciksIHRoaXMuX2NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLl9jb250ZW50KSwgdGhpcy5vcHRpb25zLmNsYXNzTmFtZSAmJiB0aGlzLm9wdGlvbnMuY2xhc3NOYW1lLnNwbGl0KFwiIFwiKS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgcmV0dXJuIG8uX2NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKHQpO1xuICAgICAgICB9KSwgdGhpcy5fdHJhY2tQb2ludGVyICYmIHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwibWFwYm94Z2wtcG9wdXAtdHJhY2stcG9pbnRlclwiKSksIHRoaXMub3B0aW9ucy5tYXhXaWR0aCAmJiB0aGlzLl9jb250YWluZXIuc3R5bGUubWF4V2lkdGggIT09IHRoaXMub3B0aW9ucy5tYXhXaWR0aCAmJiAodGhpcy5fY29udGFpbmVyLnN0eWxlLm1heFdpZHRoID0gdGhpcy5vcHRpb25zLm1heFdpZHRoKSwgdGhpcy5fbWFwLnRyYW5zZm9ybS5yZW5kZXJXb3JsZENvcGllcyAmJiAhdGhpcy5fdHJhY2tQb2ludGVyICYmICh0aGlzLl9sbmdMYXQgPSBNcih0aGlzLl9sbmdMYXQsIHRoaXMuX3BvcywgdGhpcy5fbWFwLnRyYW5zZm9ybSkpLCAhdGhpcy5fdHJhY2tQb2ludGVyIHx8IGUpKSB7XG4gICAgICAgICAgdmFyIHIgPSB0aGlzLl9wb3MgPSB0aGlzLl90cmFja1BvaW50ZXIgJiYgZSA/IGUgOiB0aGlzLl9tYXAucHJvamVjdCh0aGlzLl9sbmdMYXQpLFxuICAgICAgICAgICAgICBhID0gdGhpcy5vcHRpb25zLmFuY2hvcixcbiAgICAgICAgICAgICAgbiA9IGZ1bmN0aW9uIGUoaSkge1xuICAgICAgICAgICAgaWYgKGkpIHtcbiAgICAgICAgICAgICAgaWYgKFwibnVtYmVyXCIgPT0gdHlwZW9mIGkpIHtcbiAgICAgICAgICAgICAgICB2YXIgbyA9IE1hdGgucm91bmQoTWF0aC5zcXJ0KC41ICogTWF0aC5wb3coaSwgMikpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgY2VudGVyOiBuZXcgdC5Qb2ludCgwLCAwKSxcbiAgICAgICAgICAgICAgICAgIHRvcDogbmV3IHQuUG9pbnQoMCwgaSksXG4gICAgICAgICAgICAgICAgICBcInRvcC1sZWZ0XCI6IG5ldyB0LlBvaW50KG8sIG8pLFxuICAgICAgICAgICAgICAgICAgXCJ0b3AtcmlnaHRcIjogbmV3IHQuUG9pbnQoLW8sIG8pLFxuICAgICAgICAgICAgICAgICAgYm90dG9tOiBuZXcgdC5Qb2ludCgwLCAtaSksXG4gICAgICAgICAgICAgICAgICBcImJvdHRvbS1sZWZ0XCI6IG5ldyB0LlBvaW50KG8sIC1vKSxcbiAgICAgICAgICAgICAgICAgIFwiYm90dG9tLXJpZ2h0XCI6IG5ldyB0LlBvaW50KC1vLCAtbyksXG4gICAgICAgICAgICAgICAgICBsZWZ0OiBuZXcgdC5Qb2ludChpLCAwKSxcbiAgICAgICAgICAgICAgICAgIHJpZ2h0OiBuZXcgdC5Qb2ludCgtaSwgMClcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGkgaW5zdGFuY2VvZiB0LlBvaW50IHx8IEFycmF5LmlzQXJyYXkoaSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgciA9IHQuUG9pbnQuY29udmVydChpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgY2VudGVyOiByLFxuICAgICAgICAgICAgICAgICAgdG9wOiByLFxuICAgICAgICAgICAgICAgICAgXCJ0b3AtbGVmdFwiOiByLFxuICAgICAgICAgICAgICAgICAgXCJ0b3AtcmlnaHRcIjogcixcbiAgICAgICAgICAgICAgICAgIGJvdHRvbTogcixcbiAgICAgICAgICAgICAgICAgIFwiYm90dG9tLWxlZnRcIjogcixcbiAgICAgICAgICAgICAgICAgIFwiYm90dG9tLXJpZ2h0XCI6IHIsXG4gICAgICAgICAgICAgICAgICBsZWZ0OiByLFxuICAgICAgICAgICAgICAgICAgcmlnaHQ6IHJcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjZW50ZXI6IHQuUG9pbnQuY29udmVydChpLmNlbnRlciB8fCBbMCwgMF0pLFxuICAgICAgICAgICAgICAgIHRvcDogdC5Qb2ludC5jb252ZXJ0KGkudG9wIHx8IFswLCAwXSksXG4gICAgICAgICAgICAgICAgXCJ0b3AtbGVmdFwiOiB0LlBvaW50LmNvbnZlcnQoaVtcInRvcC1sZWZ0XCJdIHx8IFswLCAwXSksXG4gICAgICAgICAgICAgICAgXCJ0b3AtcmlnaHRcIjogdC5Qb2ludC5jb252ZXJ0KGlbXCJ0b3AtcmlnaHRcIl0gfHwgWzAsIDBdKSxcbiAgICAgICAgICAgICAgICBib3R0b206IHQuUG9pbnQuY29udmVydChpLmJvdHRvbSB8fCBbMCwgMF0pLFxuICAgICAgICAgICAgICAgIFwiYm90dG9tLWxlZnRcIjogdC5Qb2ludC5jb252ZXJ0KGlbXCJib3R0b20tbGVmdFwiXSB8fCBbMCwgMF0pLFxuICAgICAgICAgICAgICAgIFwiYm90dG9tLXJpZ2h0XCI6IHQuUG9pbnQuY29udmVydChpW1wiYm90dG9tLXJpZ2h0XCJdIHx8IFswLCAwXSksXG4gICAgICAgICAgICAgICAgbGVmdDogdC5Qb2ludC5jb252ZXJ0KGkubGVmdCB8fCBbMCwgMF0pLFxuICAgICAgICAgICAgICAgIHJpZ2h0OiB0LlBvaW50LmNvbnZlcnQoaS5yaWdodCB8fCBbMCwgMF0pXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBlKG5ldyB0LlBvaW50KDAsIDApKTtcbiAgICAgICAgICB9KHRoaXMub3B0aW9ucy5vZmZzZXQpO1xuXG4gICAgICAgICAgaWYgKCFhKSB7XG4gICAgICAgICAgICB2YXIgcyxcbiAgICAgICAgICAgICAgICBsID0gdGhpcy5fY29udGFpbmVyLm9mZnNldFdpZHRoLFxuICAgICAgICAgICAgICAgIGMgPSB0aGlzLl9jb250YWluZXIub2Zmc2V0SGVpZ2h0O1xuICAgICAgICAgICAgcyA9IHIueSArIG4uYm90dG9tLnkgPCBjID8gW1widG9wXCJdIDogci55ID4gdGhpcy5fbWFwLnRyYW5zZm9ybS5oZWlnaHQgLSBjID8gW1wiYm90dG9tXCJdIDogW10sIHIueCA8IGwgLyAyID8gcy5wdXNoKFwibGVmdFwiKSA6IHIueCA+IHRoaXMuX21hcC50cmFuc2Zvcm0ud2lkdGggLSBsIC8gMiAmJiBzLnB1c2goXCJyaWdodFwiKSwgYSA9IDAgPT09IHMubGVuZ3RoID8gXCJib3R0b21cIiA6IHMuam9pbihcIi1cIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIHUgPSByLmFkZChuW2FdKS5yb3VuZCgpO1xuICAgICAgICAgIGkuc2V0VHJhbnNmb3JtKHRoaXMuX2NvbnRhaW5lciwgTHJbYV0gKyBcIiB0cmFuc2xhdGUoXCIgKyB1LnggKyBcInB4LFwiICsgdS55ICsgXCJweClcIiksIFJyKHRoaXMuX2NvbnRhaW5lciwgYSwgXCJwb3B1cFwiKTtcbiAgICAgICAgfVxuICAgICAgfSwgby5wcm90b3R5cGUuX2ZvY3VzRmlyc3RFbGVtZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZvY3VzQWZ0ZXJPcGVuICYmIHRoaXMuX2NvbnRhaW5lcikge1xuICAgICAgICAgIHZhciB0ID0gdGhpcy5fY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoWHIpO1xuXG4gICAgICAgICAgdCAmJiB0LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0sIG8ucHJvdG90eXBlLl9vbkNsb3NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnJlbW92ZSgpO1xuICAgICAgfSwgbztcbiAgICB9KHQuRXZlbnRlZCksXG4gICAgICAgIEtyID0ge1xuICAgICAgdmVyc2lvbjogdC52ZXJzaW9uLFxuICAgICAgc3VwcG9ydGVkOiBlLFxuICAgICAgc2V0UlRMVGV4dFBsdWdpbjogdC5zZXRSVExUZXh0UGx1Z2luLFxuICAgICAgZ2V0UlRMVGV4dFBsdWdpblN0YXR1czogdC5nZXRSVExUZXh0UGx1Z2luU3RhdHVzLFxuICAgICAgTWFwOiBTcixcbiAgICAgIE5hdmlnYXRpb25Db250cm9sOiBEcixcbiAgICAgIEdlb2xvY2F0ZUNvbnRyb2w6IE5yLFxuICAgICAgQXR0cmlidXRpb25Db250cm9sOiB5cixcbiAgICAgIFNjYWxlQ29udHJvbDogcXIsXG4gICAgICBGdWxsc2NyZWVuQ29udHJvbDogR3IsXG4gICAgICBQb3B1cDogSHIsXG4gICAgICBNYXJrZXI6IEJyLFxuICAgICAgU3R5bGU6IGplLFxuICAgICAgTG5nTGF0OiB0LkxuZ0xhdCxcbiAgICAgIExuZ0xhdEJvdW5kczogdC5MbmdMYXRCb3VuZHMsXG4gICAgICBQb2ludDogdC5Qb2ludCxcbiAgICAgIE1lcmNhdG9yQ29vcmRpbmF0ZTogdC5NZXJjYXRvckNvb3JkaW5hdGUsXG4gICAgICBFdmVudGVkOiB0LkV2ZW50ZWQsXG4gICAgICBjb25maWc6IHQuY29uZmlnLFxuICAgICAgcHJld2FybTogZnVuY3Rpb24gcHJld2FybSgpIHtcbiAgICAgICAgRnQoKS5hY3F1aXJlKFJ0KTtcbiAgICAgIH0sXG4gICAgICBjbGVhclByZXdhcm1lZFJlc291cmNlczogZnVuY3Rpb24gY2xlYXJQcmV3YXJtZWRSZXNvdXJjZXMoKSB7XG4gICAgICAgIHZhciB0ID0gQnQ7XG4gICAgICAgIHQgJiYgKHQuaXNQcmVsb2FkZWQoKSAmJiAxID09PSB0Lm51bUFjdGl2ZSgpID8gKHQucmVsZWFzZShSdCksIEJ0ID0gbnVsbCkgOiBjb25zb2xlLndhcm4oXCJDb3VsZCBub3QgY2xlYXIgV2ViV29ya2VycyBzaW5jZSB0aGVyZSBhcmUgYWN0aXZlIE1hcCBpbnN0YW5jZXMgdGhhdCBzdGlsbCByZWZlcmVuY2UgaXQuIFRoZSBwcmUtd2FybWVkIFdlYldvcmtlciBwb29sIGNhbiBvbmx5IGJlIGNsZWFyZWQgd2hlbiBhbGwgbWFwIGluc3RhbmNlcyBoYXZlIGJlZW4gcmVtb3ZlZCB3aXRoIG1hcC5yZW1vdmUoKVwiKSk7XG4gICAgICB9LFxuXG4gICAgICBnZXQgYWNjZXNzVG9rZW4oKSB7XG4gICAgICAgIHJldHVybiB0LmNvbmZpZy5BQ0NFU1NfVE9LRU47XG4gICAgICB9LFxuXG4gICAgICBzZXQgYWNjZXNzVG9rZW4oZSkge1xuICAgICAgICB0LmNvbmZpZy5BQ0NFU1NfVE9LRU4gPSBlO1xuICAgICAgfSxcblxuICAgICAgZ2V0IGJhc2VBcGlVcmwoKSB7XG4gICAgICAgIHJldHVybiB0LmNvbmZpZy5BUElfVVJMO1xuICAgICAgfSxcblxuICAgICAgc2V0IGJhc2VBcGlVcmwoZSkge1xuICAgICAgICB0LmNvbmZpZy5BUElfVVJMID0gZTtcbiAgICAgIH0sXG5cbiAgICAgIGdldCB3b3JrZXJDb3VudCgpIHtcbiAgICAgICAgcmV0dXJuIGt0LndvcmtlckNvdW50O1xuICAgICAgfSxcblxuICAgICAgc2V0IHdvcmtlckNvdW50KHQpIHtcbiAgICAgICAga3Qud29ya2VyQ291bnQgPSB0O1xuICAgICAgfSxcblxuICAgICAgZ2V0IG1heFBhcmFsbGVsSW1hZ2VSZXF1ZXN0cygpIHtcbiAgICAgICAgcmV0dXJuIHQuY29uZmlnLk1BWF9QQVJBTExFTF9JTUFHRV9SRVFVRVNUUztcbiAgICAgIH0sXG5cbiAgICAgIHNldCBtYXhQYXJhbGxlbEltYWdlUmVxdWVzdHMoZSkge1xuICAgICAgICB0LmNvbmZpZy5NQVhfUEFSQUxMRUxfSU1BR0VfUkVRVUVTVFMgPSBlO1xuICAgICAgfSxcblxuICAgICAgY2xlYXJTdG9yYWdlOiBmdW5jdGlvbiBjbGVhclN0b3JhZ2UoZSkge1xuICAgICAgICB0LmNsZWFyVGlsZUNhY2hlKGUpO1xuICAgICAgfSxcbiAgICAgIHdvcmtlclVybDogXCJcIlxuICAgIH07XG5cbiAgICByZXR1cm4gS3I7XG4gIH0pOyAvL1xuXG4gIHJldHVybiBtYXBib3hnbDtcbn0pOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///2974\n')}}]); \ No newline at end of file diff --git a/63e863/40194750-c4fc0b9862c31a9e6cdd.js b/63e863/40194750-c4fc0b9862c31a9e6cdd.js new file mode 100644 index 00000000..9ee6f92f --- /dev/null +++ b/63e863/40194750-c4fc0b9862c31a9e6cdd.js @@ -0,0 +1 @@ +(self.webpackChunkjustice40_tool=self.webpackChunkjustice40_tool||[]).push([[30],{2593:function(module,__unused_webpack_exports,__webpack_require__){eval('!function (e, t) {\n true ? module.exports = t(__webpack_require__(7294)) : 0;\n}(this, function (e) {\n return function (e) {\n var t = {};\n\n function r(a) {\n if (t[a]) return t[a].exports;\n var n = t[a] = {\n i: a,\n l: !1,\n exports: {}\n };\n return e[a].call(n.exports, n, n.exports, r), n.l = !0, n.exports;\n }\n\n return r.m = e, r.c = t, r.d = function (e, t, a) {\n r.o(e, t) || Object.defineProperty(e, t, {\n enumerable: !0,\n get: a\n });\n }, r.r = function (e) {\n "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, {\n value: "Module"\n }), Object.defineProperty(e, "__esModule", {\n value: !0\n });\n }, r.t = function (e, t) {\n if (1 & t && (e = r(e)), 8 & t) return e;\n if (4 & t && "object" == typeof e && e && e.__esModule) return e;\n var a = Object.create(null);\n if (r.r(a), Object.defineProperty(a, "default", {\n enumerable: !0,\n value: e\n }), 2 & t && "string" != typeof e) for (var n in e) {\n r.d(a, n, function (t) {\n return e[t];\n }.bind(null, n));\n }\n return a;\n }, r.n = function (e) {\n var t = e && e.__esModule ? function () {\n return e.default;\n } : function () {\n return e;\n };\n return r.d(t, "a", t), t;\n }, r.o = function (e, t) {\n return Object.prototype.hasOwnProperty.call(e, t);\n }, r.p = "", r(r.s = 19);\n }([function (t, r) {\n t.exports = e;\n }, function (e, t, r) {\n var a;\n /*!\n Copyright (c) 2018 Jed Watson.\n Licensed under the MIT License (MIT), see\n http://jedwatson.github.io/classnames\n */\n\n !function () {\n "use strict";\n\n var r = {}.hasOwnProperty;\n\n function n() {\n for (var e = [], t = 0; t < arguments.length; t++) {\n var a = arguments[t];\n\n if (a) {\n var o = typeof a;\n if ("string" === o || "number" === o) e.push(a);else if (Array.isArray(a)) {\n if (a.length) {\n var i = n.apply(null, a);\n i && e.push(i);\n }\n } else if ("object" === o) if (a.toString === Object.prototype.toString) for (var l in a) {\n r.call(a, l) && a[l] && e.push(l);\n } else e.push(a.toString());\n }\n }\n\n return e.join(" ");\n }\n\n e.exports ? (n.default = n, e.exports = n) : void 0 === (a = function () {\n return n;\n }.apply(t, [])) || (e.exports = a);\n }();\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.deprecationWarning = void 0;\n\n var a = function a() {};\n\n t.deprecationWarning = a;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.isIosDevice = t.handleTabKey = t.listToTable = t.isDateInvalid = t.formatDate = t.parseDateString = t.isDatesYearOutsideMinOrMax = t.isDatesMonthOutsideMinOrMax = t.isDateWithinMinAndMax = t.keepDateBetweenMinAndMax = t.isSameDay = t.isSameMonth = t.isSameYear = t.max = t.min = t.setYear = t.setMonth = t.subYears = t.addYears = t.subMonths = t.addMonths = t.endOfWeek = t.startOfWeek = t.subWeeks = t.addWeeks = t.subDays = t.addDays = t.lastDayOfMonth = t.startOfMonth = t.today = t.setDate = t.keepDateWithinMonth = void 0;\n var a,\n n = (a = r(0)) && a.__esModule ? a : {\n default: a\n },\n o = r(6);\n\n var i = function i(e, t) {\n return t !== e.getMonth() && e.setDate(0), e;\n };\n\n t.keepDateWithinMonth = i;\n\n var l = function l(e, t, r) {\n var a = new Date(0);\n return a.setFullYear(e, t, r), a;\n };\n\n t.setDate = l;\n\n var u = function u() {\n var e = new Date(),\n t = e.getDate(),\n r = e.getMonth(),\n a = e.getFullYear();\n return l(a, r, t);\n };\n\n t.today = u;\n\n var c = function c(e) {\n var t = new Date(0);\n return t.setFullYear(e.getFullYear(), e.getMonth(), 1), t;\n };\n\n t.startOfMonth = c;\n\n var s = function s(e) {\n var t = new Date(0);\n return t.setFullYear(e.getFullYear(), e.getMonth() + 1, 0), t;\n };\n\n t.lastDayOfMonth = s;\n\n var d = function d(e, t) {\n var r = new Date(e.getTime());\n return r.setDate(r.getDate() + t), r;\n };\n\n t.addDays = d;\n\n var f = function f(e, t) {\n return d(e, -t);\n };\n\n t.subDays = f;\n\n var p = function p(e, t) {\n return d(e, 7 * t);\n };\n\n t.addWeeks = p;\n\n t.subWeeks = function (e, t) {\n return p(e, -t);\n };\n\n t.startOfWeek = function (e) {\n var t = e.getDay();\n return f(e, t);\n };\n\n t.endOfWeek = function (e) {\n var t = e.getDay();\n return d(e, 6 - t);\n };\n\n var m = function m(e, t) {\n var r = new Date(e.getTime()),\n a = (r.getMonth() + 12 + t) % 12;\n return r.setMonth(r.getMonth() + t), i(r, a), r;\n };\n\n t.addMonths = m;\n\n t.subMonths = function (e, t) {\n return m(e, -t);\n };\n\n var y = function y(e, t) {\n return m(e, 12 * t);\n };\n\n t.addYears = y;\n\n t.subYears = function (e, t) {\n return y(e, -t);\n };\n\n var b = function b(e, t) {\n var r = new Date(e.getTime());\n return r.setMonth(t), i(r, t), r;\n };\n\n t.setMonth = b;\n\n t.setYear = function (e, t) {\n var r = new Date(e.getTime()),\n a = r.getMonth();\n return r.setFullYear(t), i(r, a), r;\n };\n\n t.min = function (e, t) {\n var r = e;\n return t < e && (r = t), new Date(r.getTime());\n };\n\n t.max = function (e, t) {\n var r = e;\n return t > e && (r = t), new Date(r.getTime());\n };\n\n var v = function v(e, t) {\n return e && t && e.getFullYear() === t.getFullYear();\n };\n\n t.isSameYear = v;\n\n var O = function O(e, t) {\n return v(e, t) && e.getMonth() === t.getMonth();\n };\n\n t.isSameMonth = O;\n\n t.isSameDay = function (e, t) {\n return O(e, t) && e.getDate() === t.getDate();\n };\n\n t.keepDateBetweenMinAndMax = function (e, t, r) {\n var a = e;\n return e < t ? a = t : r && e > r && (a = r), new Date(a.getTime());\n };\n\n var g = function g(e, t, r) {\n return e >= t && (!r || e <= r);\n };\n\n t.isDateWithinMinAndMax = g;\n\n t.isDatesMonthOutsideMinOrMax = function (e, t, r) {\n return s(e) < t || !!r && c(e) > r;\n };\n\n t.isDatesYearOutsideMinOrMax = function (e, t, r) {\n return s(b(e, 11)) < t || !!r && c(b(e, 0)) > r;\n };\n\n t.parseDateString = function (e, t, r) {\n var a, n, i, c, s, d, f;\n\n if (void 0 === t && (t = o.INTERNAL_DATE_FORMAT), void 0 === r && (r = !1), e) {\n var p = void 0,\n m = void 0,\n y = void 0;\n\n if (t === o.DEFAULT_EXTERNAL_DATE_FORMAT ? (p = (a = e.split("/"))[0], m = a[1], y = a[2]) : (y = (n = e.split("-"))[0], p = n[1], m = n[2]), y && (f = parseInt(y, 10), !Number.isNaN(f) && (d = f, r && (d = Math.max(0, d), y.length < 3)))) {\n var b = u().getFullYear();\n d = b - b % Math.pow(10, y.length) + f;\n }\n\n if (p && (f = parseInt(p, 10), Number.isNaN(f) || (c = f, r && (c = Math.max(1, c), c = Math.min(12, c)))), c && m && null != d && (f = parseInt(m, 10), !Number.isNaN(f) && (s = f, r))) {\n var v = l(d, c, 0).getDate();\n s = Math.max(1, s), s = Math.min(v, s);\n }\n\n c && s && null != d && (i = l(d, c - 1, s));\n }\n\n return i;\n };\n\n t.formatDate = function (e, t) {\n void 0 === t && (t = o.INTERNAL_DATE_FORMAT);\n\n var r = function r(e, t) {\n return ("0000" + e).slice(-t);\n },\n a = e.getMonth() + 1,\n n = e.getDate(),\n i = e.getFullYear();\n\n return t === o.DEFAULT_EXTERNAL_DATE_FORMAT ? [r(a, 2), r(n, 2), r(i, 4)].join("/") : [r(i, 4), r(a, 2), r(n, 2)].join("-");\n };\n\n t.isDateInvalid = function (e, t, r) {\n var a = !1;\n\n if (e) {\n a = !0;\n var n = e.split("/"),\n o = n.map(function (e) {\n var t,\n r = parseInt(e, 10);\n return Number.isNaN(r) || (t = r), t;\n }),\n i = o[0],\n u = o[1],\n c = o[2];\n\n if (i && u && null != c) {\n var s = l(c, i - 1, u);\n s.getMonth() === i - 1 && s.getDate() === u && s.getFullYear() === c && 4 === n[2].length && g(s, t, r) && (a = !1);\n }\n }\n\n return a;\n };\n\n t.listToTable = function (e, t) {\n for (var r = [], a = 0; a < e.length;) {\n for (var o = []; a < e.length && o.length < t;) {\n o.push(e[parseInt("" + a)]), a += 1;\n }\n\n r.push(o);\n }\n\n return n.default.createElement(n.default.Fragment, null, r.map(function (e, t) {\n return n.default.createElement("tr", {\n key: "row_" + t\n }, e.map(function (e, r) {\n return n.default.createElement("td", {\n key: "row_" + t + "_cell_" + r\n }, e);\n }));\n }));\n };\n\n t.handleTabKey = function (e, t) {\n if ("Tab" === e.key) {\n var r = t.filter(function (e) {\n return e && !e.disabled;\n }),\n a = null === document || void 0 === document ? void 0 : document.activeElement,\n n = r.length - 1,\n o = r[parseInt("0")],\n i = r[parseInt("" + n)],\n l = a instanceof HTMLButtonElement ? r.indexOf(a) : -1,\n u = l === n,\n c = 0 === l,\n s = -1 === l;\n e.shiftKey ? (c || s) && (e.preventDefault(), null == i || i.focus()) : (u || s) && (e.preventDefault(), null == o || o.focus());\n }\n };\n\n t.isIosDevice = function () {\n return "undefined" != typeof navigator && (navigator.userAgent.match(/(iPod|iPhone|iPad)/g) || "MacIntel" === navigator.platform && navigator.maxTouchPoints > 1) && !window.MSStream;\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.NavList = void 0;\n var a = i(r(0)),\n n = i(r(1)),\n o = r(2);\n\n function i(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _l = function l() {\n return (_l = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n u = function u(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.NavList = function (e) {\n var t = e.items,\n r = e.type,\n i = e.primary,\n c = e.secondary,\n s = e.subnav,\n d = e.megamenu,\n f = e.footerSecondary,\n p = e.className,\n m = u(e, ["items", "type", "primary", "secondary", "subnav", "megamenu", "footerSecondary", "className"]);\n i && (0, o.deprecationWarning)("NavList property primary is deprecated. Use type"), c && (0, o.deprecationWarning)("NavList property secondary is deprecated. Use type"), s && (0, o.deprecationWarning)("NavList property subnav is deprecated. Use type"), d && (0, o.deprecationWarning)("NavList property megamenu is deprecated. Use type"), f && (0, o.deprecationWarning)("NavList property footerSecondary is deprecated. Use type");\n\n var y = r ? "primary" === r : i,\n b = r ? "secondary" === r : c,\n v = r ? "subnav" === r : s,\n O = r ? "megamenu" === r : d,\n g = r ? "footerSecondary" === r : f,\n _ = (0, n.default)({\n "usa-nav__primary usa-accordion": y,\n "usa-nav__secondary-links": b,\n "usa-nav__submenu": v,\n "usa-nav__submenu-list": O,\n "usa-list usa-list--unstyled": g\n }, p),\n h = (0, n.default)({\n "usa-nav__primary-item": y,\n "usa-nav__secondary-item": b,\n "usa-nav__submenu-item": v || O,\n "usa-footer__secondary-link": g\n });\n\n return a.default.createElement("ul", _l({\n className: _\n }, m), t.map(function (e, t) {\n return a.default.createElement("li", {\n key: "item_" + t,\n className: h\n }, e);\n }));\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.Label = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i = function i() {\n return (_i = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.children,\n r = e.htmlFor,\n o = e.className,\n u = e.error,\n c = e.hint,\n s = e.srOnly,\n d = l(e, ["children", "htmlFor", "className", "error", "hint", "srOnly"]),\n f = (0, n.default)({\n "usa-label": !s,\n "usa-sr-only": s,\n "usa-label--error": u\n }, o);\n return a.default.createElement("label", _i({}, d, {\n "data-testid": "label",\n className: f,\n htmlFor: r\n }), t, c && a.default.createElement("span", {\n className: "usa-hint"\n }, c));\n };\n\n t.Label = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.INTERNAL_DATE_FORMAT = t.DEFAULT_EXTERNAL_DATE_FORMAT = t.DEFAULT_MIN_DATE = t.YEAR_CHUNK = t.ENTER_KEYCODE = t.DAY_OF_WEEK_SHORT_LABELS = t.DAY_OF_WEEK_LABELS = t.MONTH_LABELS = t.VALIDATION_MESSAGE = void 0;\n t.VALIDATION_MESSAGE = "Please enter a valid date";\n t.MONTH_LABELS = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];\n t.DAY_OF_WEEK_LABELS = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];\n t.DAY_OF_WEEK_SHORT_LABELS = ["S", "M", "T", "W", "Th", "F", "S"];\n t.ENTER_KEYCODE = 13;\n t.YEAR_CHUNK = 12;\n t.DEFAULT_MIN_DATE = "0000-01-01";\n t.DEFAULT_EXTERNAL_DATE_FORMAT = "MM/DD/YYYY";\n t.INTERNAL_DATE_FORMAT = "YYYY-MM-DD";\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.TextInput = void 0;\n var a = i(r(0)),\n n = i(r(1)),\n o = r(2);\n\n function i(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _l2 = function l() {\n return (_l2 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n u = function u(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n c = function c(e) {\n var t = e.id,\n r = e.name,\n i = e.type,\n c = e.className,\n s = e.validationStatus,\n d = e.error,\n f = e.success,\n p = e.inputSize,\n m = e.small,\n y = e.medium,\n b = e.inputRef,\n v = u(e, ["id", "name", "type", "className", "validationStatus", "error", "success", "inputSize", "small", "medium", "inputRef"]);\n d && (0, o.deprecationWarning)("TextInput property error is deprecated. Use validationStatus"), f && (0, o.deprecationWarning)("TextInput property success is deprecated. Use validationStatus"), m && (0, o.deprecationWarning)("TextInput property small is deprecated. Use inputSize"), y && (0, o.deprecationWarning)("TextInput property medium is deprecated. Use inputSize");\n\n var O = s ? "error" === s : d,\n g = s ? "success" === s : f,\n _ = p ? "small" === p : m,\n h = p ? "medium" === p : y,\n j = (0, n.default)("usa-input", {\n "usa-input--error": O,\n "usa-input--success": g,\n "usa-input--small": _,\n "usa-input--medium": h\n }, c);\n\n return a.default.createElement("input", _l2({\n "data-testid": "textInput",\n className: j,\n id: t,\n name: r,\n type: i,\n ref: b\n }, v));\n };\n\n t.TextInput = c;\n var s = c;\n t.default = s;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.FormGroup = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n t.FormGroup = function (e) {\n var t = e.children,\n r = e.className,\n o = e.error,\n i = (0, n.default)("usa-form-group", {\n "usa-form-group--error": o\n }, r);\n return a.default.createElement("div", {\n "data-testid": "formGroup",\n className: i\n }, t);\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.sampleLocalization = t.EN_US = void 0;\n var a = r(6),\n n = {\n months: a.MONTH_LABELS,\n daysOfWeek: a.DAY_OF_WEEK_LABELS,\n daysOfWeekShort: a.DAY_OF_WEEK_SHORT_LABELS,\n statuses: ["You can navigate by day using left and right arrows", "Weeks by using up and down arrows", "Months by using page up and page down keys", "Years by using shift plus page up and shift plus page down", "Home and end keys navigate to the beginning and end of a week"],\n selectedDate: "Selected date",\n selectAMonth: "Select a month.",\n toggleCalendar: "Toggle calendar",\n backOneYear: "Navigate back one year",\n backOneMonth: "Navigate back one month",\n forwardOneYear: "Navigate forward one year",\n forwardOneMonth: "Navigate forward one month",\n clickToSelectMonth: "Click to select month",\n clickToSelectYear: "Click to select year"\n };\n t.EN_US = n;\n t.sampleLocalization = {\n months: ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"],\n daysOfWeek: ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"],\n daysOfWeekShort: ["Do", "Lu", "Ma", "Mi", "Ju", "Vi", "Sa"],\n statuses: ["Puede navegar por día usando las flechas izquierda y derecha", "Semanas usando flechas hacia arriba y hacia abajo", "Meses usando las teclas de avance y retroceso de página", "Años usando shift plus page up y shift plus page down", "Las teclas de inicio y finalización navegan hasta el principio y el final de una semana"],\n selectedDate: "Fecha seleccionada",\n selectAMonth: "Selecciona un mes.",\n toggleCalendar: "Alternar calendario",\n backOneYear: "Navegar hacia atrás un año",\n backOneMonth: "Navegar hacia atrás un mes",\n forwardOneYear: "Navegar hacia adelante un año",\n forwardOneMonth: "Navegar hacia adelante un mes",\n clickToSelectMonth: "Haga clic para seleccionar el mes",\n clickToSelectYear: "Haga clic para seleccionar el año"\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.isCustomProps = u, t.Link = function (e) {\n if (u(e)) {\n var t = e.variant,\n r = e.className,\n n = e.asCustom,\n o = e.children,\n s = l(e, ["variant", "className", "asCustom", "children"]),\n d = c(t, r);\n return a.default.createElement(n, _i2({\n className: d\n }, s), o);\n }\n\n o = e.children, r = e.className, t = e.variant, s = l(e, ["children", "className", "variant"]), d = c(t, r);\n return a.default.createElement("a", _i2({\n className: d\n }, s), o);\n };\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i2 = function i() {\n return (_i2 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n function u(e) {\n return "asCustom" in e;\n }\n\n function c(e, t) {\n var r = "external" === e,\n a = "nav" === e;\n return "unstyled" === e ? t : (0, n.default)("usa-link", {\n "usa-link--external": r,\n "usa-nav__link": a\n }, t);\n }\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.ComboBox = t.FocusMode = void 0;\n\n var a,\n n = function (e, t) {\n if (!t && e && e.__esModule) return e;\n if (null === e || "object" != typeof e && "function" != typeof e) return {\n default: e\n };\n var r = l(t);\n if (r && r.has(e)) return r.get(e);\n var a = {},\n n = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n for (var o in e) {\n if ("default" !== o && Object.prototype.hasOwnProperty.call(e, o)) {\n var i = n ? Object.getOwnPropertyDescriptor(e, o) : null;\n i && (i.get || i.set) ? Object.defineProperty(a, o, i) : a[o] = e[o];\n }\n }\n\n a.default = e, r && r.set(e, a);\n return a;\n }(r(0)),\n o = (a = r(1)) && a.__esModule ? a : {\n default: a\n },\n i = r(49);\n\n function l(e) {\n if ("function" != typeof WeakMap) return null;\n var t = new WeakMap(),\n r = new WeakMap();\n return (l = function l(e) {\n return e ? r : t;\n })(e);\n }\n\n var u,\n c,\n _s = function s() {\n return (_s = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n d = function d(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n !function (e) {\n e[e.Previous = -1] = "Previous", e[e.Next = 1] = "Next";\n }(u || (u = {})), t.FocusMode = c, function (e) {\n e[e.None = 0] = "None", e[e.Input = 1] = "Input", e[e.Item = 2] = "Item";\n }(c || (t.FocusMode = c = {}));\n\n var f = function f(e) {\n var t = e.focused,\n r = d(e, ["focused"]),\n a = (0, n.useRef)(null);\n return (0, n.useEffect)(function () {\n t && a.current && a.current.focus();\n }), n.default.createElement("input", _s({\n type: "text",\n className: "usa-combo-box__input",\n "data-testid": "combo-box-input"\n }, r, {\n autoCapitalize: "off",\n autoComplete: "off",\n ref: a\n }));\n },\n p = function p(e) {\n var t,\n r,\n a = e.id,\n l = e.name,\n d = e.className,\n p = e.options,\n m = e.defaultValue,\n y = e.disabled,\n b = e.onChange,\n v = e.assistiveHint,\n O = e.noResults,\n g = e.selectProps,\n _ = e.inputProps,\n h = e.ulProps,\n j = e.customFilter,\n M = e.disableFiltering,\n N = void 0 !== M && M,\n E = !!y;\n m && (r = p.find(function (e) {\n return e.value === m;\n }));\n var P = j || {\n filter: ".*{{query}}.*"\n },\n w = {\n isOpen: !1,\n selectedOption: r || void 0,\n focusedOption: void 0,\n focusMode: c.None,\n filteredOptions: p,\n inputValue: r ? r.label : ""\n },\n I = (0, i.useComboBox)(w, p, N, P),\n D = I[0],\n S = I[1],\n x = (0, n.useRef)(null),\n k = (0, n.useRef)(null);\n (0, n.useEffect)(function () {\n var e;\n b && b((null === (e = D.selectedOption) || void 0 === e ? void 0 : e.value) || void 0);\n }, [D.selectedOption]), (0, n.useEffect)(function () {\n D.focusMode === c.Item && D.focusedOption && k.current && k.current.focus();\n }, [D.focusMode, D.focusedOption]), (0, n.useEffect)(function () {\n D.isOpen && D.focusedOption && k.current && D.focusMode === c.Input && k.current.scrollIntoView(!1);\n }, [D.isOpen, D.focusedOption]), (0, n.useEffect)(function () {\n var e;\n D.focusMode !== c.None && ((null === (e = x.current) || void 0 === e ? void 0 : e.contains(window.document.activeElement)) || S({\n type: i.ActionTypes.BLUR\n }));\n }, [D.focusMode]);\n\n var A = function A(e, t, r) {\n var a = t.focusedOption ? t.filteredOptions.indexOf(t.focusedOption) : -1,\n n = t.filteredOptions[0],\n o = t.filteredOptions[t.filteredOptions.length - 1];\n if (-1 === a) e({\n type: i.ActionTypes.FOCUS_OPTION,\n option: n\n });else {\n var l = a + r;\n if (l < 0 && t.selectedOption) e({\n type: i.ActionTypes.FOCUS_OPTION,\n option: n\n });else if (l < 0) e({\n type: i.ActionTypes.CLOSE_LIST\n });else if (l >= t.filteredOptions.length) e({\n type: i.ActionTypes.FOCUS_OPTION,\n option: o\n });else {\n var u = t.filteredOptions[l];\n e({\n type: i.ActionTypes.FOCUS_OPTION,\n option: u\n });\n }\n }\n },\n T = function T(e) {\n var t,\n r = e.relatedTarget;\n (!r || r instanceof Node && !(null === (t = x.current) || void 0 === t ? void 0 : t.contains(r))) && S({\n type: i.ActionTypes.BLUR\n });\n },\n C = function C(e) {\n "Escape" === e.key ? S({\n type: i.ActionTypes.CLOSE_LIST\n }) : "Tab" === e.key || "Enter" === e.key ? (e.preventDefault(), D.focusedOption && S({\n type: i.ActionTypes.SELECT_OPTION,\n option: D.focusedOption\n })) : "ArrowDown" === e.key || "Down" === e.key ? (e.preventDefault(), A(S, D, u.Next)) : "ArrowUp" !== e.key && "Up" !== e.key || (e.preventDefault(), A(S, D, u.Previous));\n },\n L = D.selectedOption && D.selectedOption.label === D.inputValue,\n F = (0, o.default)("usa-combo-box", d, {\n "usa-combo-box--pristine": L\n }),\n R = "combobox-" + l + "-list",\n U = "combobox-" + l + "-assistive-hint";\n\n return n.default.createElement("div", {\n "data-testid": "combo-box",\n className: F,\n id: a,\n ref: x\n }, n.default.createElement("select", _s({\n className: "usa-select usa-sr-only usa-combo-box__select",\n name: l,\n "aria-hidden": !0,\n tabIndex: -1,\n defaultValue: null === (t = D.selectedOption) || void 0 === t ? void 0 : t.value,\n "data-testid": "combo-box-select",\n disabled: E\n }, g), p.map(function (e) {\n return n.default.createElement("option", {\n key: e.value,\n value: e.value\n }, e.label);\n })), n.default.createElement(f, _s({\n onChange: function onChange(e) {\n return S({\n type: i.ActionTypes.UPDATE_FILTER,\n value: e.target.value\n });\n },\n onClick: function onClick() {\n return S({\n type: i.ActionTypes.OPEN_LIST\n });\n },\n onBlur: function onBlur(e) {\n var t,\n r = e.relatedTarget;\n (!r || r instanceof Node && !(null === (t = x.current) || void 0 === t ? void 0 : t.contains(r))) && D.focusMode !== c.None && S({\n type: i.ActionTypes.BLUR\n });\n },\n onKeyDown: function onKeyDown(e) {\n if ("Escape" === e.key) S({\n type: i.ActionTypes.CLOSE_LIST\n });else if ("ArrowDown" === e.key || "Down" == e.key) e.preventDefault(), S({\n type: i.ActionTypes.FOCUS_OPTION,\n option: D.selectedOption || D.focusedOption || D.filteredOptions[0]\n });else if ("Tab" === e.key) {\n if (D.isOpen && !D.selectedOption) {\n var t = N ? D.focusedOption : D.selectedOption || D.focusedOption;\n t ? (e.preventDefault(), S({\n type: i.ActionTypes.FOCUS_OPTION,\n option: t\n })) : S({\n type: i.ActionTypes.BLUR\n });\n }\n\n !D.isOpen && D.selectedOption && S({\n type: i.ActionTypes.BLUR\n });\n } else if ("Enter" === e.key && D.isOpen) {\n e.preventDefault();\n var r = D.filteredOptions.find(function (e) {\n return e.label.toLowerCase() === D.inputValue.toLowerCase();\n });\n r ? S({\n type: i.ActionTypes.SELECT_OPTION,\n option: r\n }) : D.selectedOption ? S({\n type: i.ActionTypes.CLOSE_LIST\n }) : S({\n type: i.ActionTypes.CLEAR\n });\n }\n },\n value: D.inputValue,\n focused: D.focusMode === c.Input,\n role: "combobox",\n "aria-owns": R,\n "aria-describedby": U,\n "aria-expanded": D.isOpen,\n disabled: E\n }, _)), n.default.createElement("span", {\n className: "usa-combo-box__clear-input__wrapper",\n tabIndex: -1\n }, n.default.createElement("button", {\n type: "button",\n className: "usa-combo-box__clear-input",\n "aria-label": "Clear the select contents",\n onClick: function onClick() {\n return S({\n type: i.ActionTypes.CLEAR\n });\n },\n "data-testid": "combo-box-clear-button",\n onKeyDown: function onKeyDown(e) {\n "Tab" === e.key && D.isOpen && D.selectedOption && (e.preventDefault(), S({\n type: i.ActionTypes.FOCUS_OPTION,\n option: D.selectedOption\n }));\n },\n hidden: !L\n }, " ")), n.default.createElement("span", {\n className: "usa-combo-box__input-button-separator"\n }, " "), n.default.createElement("span", {\n className: "usa-combo-box__toggle-list__wrapper",\n tabIndex: -1\n }, n.default.createElement("button", {\n "data-testid": "combo-box-toggle",\n type: "button",\n className: "usa-combo-box__toggle-list",\n tabIndex: -1,\n "aria-label": "Toggle the dropdown list",\n onClick: function onClick() {\n return S({\n type: D.isOpen ? i.ActionTypes.CLOSE_LIST : i.ActionTypes.OPEN_LIST\n });\n },\n disabled: E\n }, " ")), n.default.createElement("ul", _s({\n "data-testid": "combo-box-option-list",\n tabIndex: -1,\n id: R,\n className: "usa-combo-box__list",\n role: "listbox",\n hidden: !D.isOpen\n }, h), D.filteredOptions.map(function (e, t) {\n var r = e === D.focusedOption,\n a = e === D.selectedOption,\n l = (0, o.default)("usa-combo-box__list-option", {\n "usa-combo-box__list-option--focused": r,\n "usa-combo-box__list-option--selected": a\n });\n return n.default.createElement("li", {\n ref: r ? k : null,\n value: e.value,\n key: e.value,\n className: l,\n tabIndex: r ? 0 : -1,\n role: "option",\n "aria-selected": a,\n "aria-setsize": 64,\n "aria-posinset": t + 1,\n id: R + "--option-" + t,\n onKeyDown: C,\n onBlur: T,\n "data-testid": "combo-box-option-" + e.value,\n onMouseEnter: function onMouseEnter() {\n return S({\n type: i.ActionTypes.FOCUS_OPTION,\n option: e\n });\n },\n onClick: function onClick() {\n S({\n type: i.ActionTypes.SELECT_OPTION,\n option: e\n });\n }\n }, e.label);\n }), 0 === D.filteredOptions.length ? n.default.createElement("li", {\n className: "usa-combo-box__list-option--no-results"\n }, O || "No results found") : null), n.default.createElement("div", {\n className: "usa-combo-box__status usa-sr-only",\n role: "status"\n }), n.default.createElement("span", {\n id: U,\n className: "usa-sr-only",\n "data-testid": "combo-box-assistive-hint"\n }, v || "When autocomplete results are available use up and down arrows to review\\n and enter to select. Touch device users, explore by touch or with swipe\\n gestures."));\n };\n\n t.ComboBox = p;\n var m = p;\n t.default = m;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.DatePicker = t.FocusMode = void 0;\n\n var a,\n n = function (e, t) {\n if (!t && e && e.__esModule) return e;\n if (null === e || "object" != typeof e && "function" != typeof e) return {\n default: e\n };\n var r = s(t);\n if (r && r.has(e)) return r.get(e);\n var a = {},\n n = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n for (var o in e) {\n if ("default" !== o && Object.prototype.hasOwnProperty.call(e, o)) {\n var i = n ? Object.getOwnPropertyDescriptor(e, o) : null;\n i && (i.get || i.set) ? Object.defineProperty(a, o, i) : a[o] = e[o];\n }\n }\n\n a.default = e, r && r.set(e, a);\n return a;\n }(r(0)),\n o = (a = r(1)) && a.__esModule ? a : {\n default: a\n },\n i = r(6),\n l = r(9),\n u = r(3),\n c = r(53);\n\n function s(e) {\n if ("function" != typeof WeakMap) return null;\n var t = new WeakMap(),\n r = new WeakMap();\n return (s = function s(e) {\n return e ? r : t;\n })(e);\n }\n\n var d,\n _f = function f() {\n return (_f = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n p = function p(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.FocusMode = d, function (e) {\n e[e.None = 0] = "None", e[e.Input = 1] = "Input";\n }(d || (t.FocusMode = d = {}));\n\n var m = function m(e) {\n var t = e.id,\n r = e.name,\n a = e.className,\n s = e.defaultValue,\n m = e.disabled,\n y = e.required,\n b = e.minDate,\n v = void 0 === b ? i.DEFAULT_MIN_DATE : b,\n O = e.maxDate,\n g = e.rangeDate,\n _ = e.onChange,\n h = e.onBlur,\n j = e.i18n,\n M = void 0 === j ? l.EN_US : j,\n N = p(e, ["id", "name", "className", "defaultValue", "disabled", "required", "minDate", "maxDate", "rangeDate", "onChange", "onBlur", "i18n"]),\n E = (0, n.useRef)(null),\n P = (0, n.useRef)(null),\n w = (0, n.useState)(""),\n I = w[0],\n D = w[1],\n S = (0, n.useState)(""),\n x = S[0],\n k = S[1],\n A = (0, n.useState)(!1),\n T = A[0],\n C = A[1],\n L = (0, n.useState)(void 0),\n F = L[0],\n R = L[1],\n U = (0, n.useState)(0),\n W = U[0],\n B = U[1],\n z = (0, n.useState)([]),\n Y = z[0],\n G = z[1],\n V = (0, n.useState)(d.None),\n H = V[0],\n Q = V[1],\n K = (0, n.useState)(void 0),\n Z = K[0],\n X = K[1],\n J = (0, u.parseDateString)(v),\n q = O ? (0, u.parseDateString)(O) : void 0,\n $ = g ? (0, u.parseDateString)(g) : void 0,\n ee = function ee(e, t) {\n var r;\n void 0 === t && (t = !0);\n var a = (0, u.parseDateString)(e),\n n = a && (0, u.formatDate)(a, i.DEFAULT_EXTERNAL_DATE_FORMAT);\n a && D(e), n && k(n), _ && _(n), t && (C(!1), G([]), null === (r = null == P ? void 0 : P.current) || void 0 === r || r.focus());\n };\n\n (0, n.useEffect)(function () {\n s && ee(s, !1);\n }, []), (0, n.useEffect)(function () {\n if (T) {\n var e = E.current && E.current.querySelector(".usa-date-picker__calendar__date--focused");\n e && e.focus();\n }\n }, [T]), (0, n.useEffect)(function () {\n !function () {\n var e,\n t,\n r,\n a,\n n = (0, u.isDateInvalid)(x, J, q);\n n && !(null === (e = null == P ? void 0 : P.current) || void 0 === e ? void 0 : e.validationMessage) && (null === (t = null == P ? void 0 : P.current) || void 0 === t || t.setCustomValidity(i.VALIDATION_MESSAGE)), n || (null === (r = null == P ? void 0 : P.current) || void 0 === r ? void 0 : r.validationMessage) !== i.VALIDATION_MESSAGE || null === (a = null == P ? void 0 : P.current) || void 0 === a || a.setCustomValidity("");\n }();\n }, [x, v, O]);\n var te = (0, o.default)("usa-date-picker", "usa-date-picker--initialized", {\n "usa-date-picker--active": T\n }, a),\n re = M.toggleCalendar;\n return n.default.createElement("div", {\n "data-testid": "date-picker",\n className: te,\n ref: E,\n onBlur: function onBlur(e) {\n var t;\n (null === (t = E.current) || void 0 === t ? void 0 : t.contains(null == e ? void 0 : e.relatedTarget)) || (T && (C(!1), G([])), h && h(e));\n },\n onKeyDown: function onKeyDown(e) {\n var t;\n "Escape" === e.key && (T && (C(!1), G([]), null === (t = null == P ? void 0 : P.current) || void 0 === t || t.focus()), e.preventDefault());\n }\n }, n.default.createElement("input", _f({}, N, {\n name: r,\n "data-testid": "date-picker-internal-input",\n className: "usa-input usa-sr-only usa-date-picker__internal-input",\n type: "text",\n "aria-hidden": !0,\n tabIndex: -1,\n required: !1,\n disabled: !1,\n value: I,\n readOnly: !0\n })), n.default.createElement("div", {\n className: "usa-date-picker__wrapper",\n tabIndex: -1\n }, n.default.createElement("input", _f({}, N, {\n id: t,\n "data-testid": "date-picker-external-input",\n className: "usa-input usa-date-picker__external-input",\n type: "text",\n disabled: m,\n required: y,\n value: x,\n ref: P,\n onInput: function onInput(e) {\n var t = e.target.value;\n k(t), _ && _(t);\n var r = (0, u.parseDateString)(t, i.DEFAULT_EXTERNAL_DATE_FORMAT, !0),\n a = "";\n\n if (r && !(0, u.isDateInvalid)(t, J, q) && (a = (0, u.formatDate)(r)), I !== a && D(a), r && T) {\n var n = (0, u.keepDateBetweenMinAndMax)(r, J, q);\n R(n);\n }\n },\n onFocus: function onFocus() {\n Q(d.Input);\n },\n onBlur: function onBlur(e) {\n Q(d.None), h && h(e);\n }\n })), n.default.createElement("button", {\n "data-testid": "date-picker-button",\n type: "button",\n className: "usa-date-picker__button",\n "aria-haspopup": !0,\n "aria-label": re,\n disabled: m,\n onClick: function onClick() {\n var e;\n if (T) G([]);else {\n var t = (0, u.parseDateString)(x, i.DEFAULT_EXTERNAL_DATE_FORMAT, !0),\n r = (0, u.keepDateBetweenMinAndMax)(t || s && (0, u.parseDateString)(s) || (0, u.today)(), J, q);\n R(r), B(null === (e = null == E ? void 0 : E.current) || void 0 === e ? void 0 : e.offsetHeight);\n var a = M.statuses,\n n = (0, u.parseDateString)(I);\n\n if (n && (0, u.isSameDay)(n, (0, u.addDays)(r, 0))) {\n var o = M.selectedDate;\n a.unshift(o);\n }\n\n G(a);\n }\n C(!T);\n }\n }, " "), n.default.createElement("div", {\n "data-testid": "date-picker-calendar",\n className: "usa-date-picker__calendar",\n role: "dialog",\n "aria-modal": "true",\n hidden: !T,\n "data-value": F && (0, u.formatDate)(F),\n style: {\n top: W + "px"\n },\n onKeyDown: function onKeyDown(e) {\n X(e.keyCode);\n },\n onKeyUp: function onKeyUp(e) {\n e.keyCode !== Z && e.preventDefault();\n }\n }, T && n.default.createElement(c.Calendar, {\n date: F,\n handleSelectDate: ee,\n minDate: J,\n maxDate: q,\n rangeDate: $,\n selectedDate: (0, u.parseDateString)(I),\n setStatuses: G,\n focusMode: H,\n i18n: M\n })), n.default.createElement("div", {\n "data-testid": "date-picker-status",\n className: "usa-sr-only usa-date-picker__status",\n role: "status",\n "aria-live": "polite"\n }, Y.join(". "))));\n };\n\n t.DatePicker = m, m.displayName = "DatePicker", m.defaultProps = {\n minDate: i.DEFAULT_MIN_DATE\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.NavCloseButton = void 0;\n var a = i(r(0)),\n n = i(r(1)),\n o = i(r(72));\n\n function i(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _l3 = function l() {\n return (_l3 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n u = function u(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.NavCloseButton = function (e) {\n var t = e.onClick,\n r = e.className,\n i = u(e, ["onClick", "className"]),\n c = (0, n.default)("usa-nav__close", r);\n return a.default.createElement("button", _l3({\n className: c,\n onClick: t,\n "data-testid": "navCloseButton"\n }, i, {\n type: "button"\n }), a.default.createElement("img", {\n src: o.default,\n alt: "close"\n }));\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.Button = void 0;\n var a = i(r(0)),\n n = i(r(1)),\n o = r(2);\n\n function i(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _l4 = function l() {\n return (_l4 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n u = function u(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n c = function c(e) {\n var t = e.type,\n r = e.children,\n i = e.secondary,\n c = e.base,\n s = e.accent,\n d = e.accentStyle,\n f = e.outline,\n p = e.inverse,\n m = e.size,\n y = e.big,\n b = e.small,\n v = e.icon,\n O = e.unstyled,\n g = e.onClick,\n _ = e.className,\n h = u(e, ["type", "children", "secondary", "base", "accent", "accentStyle", "outline", "inverse", "size", "big", "small", "icon", "unstyled", "onClick", "className"]);\n y && (0, o.deprecationWarning)("Button property big is deprecated. Use size."), v && (0, o.deprecationWarning)("Button property icon is deprecated."), s && (0, o.deprecationWarning)("Button property accent is deprecated. Use accentStyle.");\n var j = m ? "big" === m : y,\n M = m ? "small" === m : b;\n M && (0, o.deprecationWarning)("Small button is deprecated. Use the default, pass in a custom className, or use size big.");\n var N = (0, n.default)("usa-button", {\n "usa-button--secondary": i,\n "usa-button--base": c,\n "usa-button--accent-cool": s || "cool" === d,\n "usa-button--accent-warm": "warm" === d,\n "usa-button--outline": f,\n "usa-button--inverse": p,\n "usa-button--big": j,\n "usa-button--small": M,\n "usa-button--icon": v,\n "usa-button--unstyled": O\n }, _);\n return a.default.createElement("button", _l4({\n type: t,\n className: N,\n onClick: g,\n "data-testid": "button"\n }, h), r);\n };\n\n t.Button = c;\n var s = c;\n t.default = s;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.isCustomProps = c, t.Grid = function (e) {\n var t = e.children,\n r = e.className,\n i = e.row,\n d = e.col,\n f = e.gap,\n p = e.offset,\n m = e.mobile,\n y = e.mobileLg,\n b = e.tablet,\n v = e.tabletLg,\n O = e.desktop,\n g = e.desktopLg,\n _ = e.widescreen,\n h = u(e, ["children", "className", "row", "col", "gap", "offset", "mobile", "mobileLg", "tablet", "tabletLg", "desktop", "desktopLg", "widescreen"]),\n j = {\n mobile: m,\n mobileLg: y,\n tablet: b,\n tabletLg: v,\n desktop: O,\n desktopLg: g,\n widescreen: _\n },\n M = s({\n row: i,\n col: d,\n gap: f,\n offset: p\n });\n\n if (Object.keys(o.breakpoints).forEach(function (t) {\n var r = t;\n\n if (Object.prototype.hasOwnProperty.call(j, r)) {\n var a = e[r];\n M = (0, n.default)(M, s(a, r));\n }\n }), M = (0, n.default)(M, r), c(h)) {\n var N = h.asCustom,\n E = u(h, ["asCustom"]);\n return a.default.createElement(N, _l5({\n className: M\n }, E), t);\n }\n\n return a.default.createElement("div", _l5({\n className: M,\n "data-testid": "grid"\n }, h), t);\n }, t.applyGridClasses = t.getGridClasses = void 0;\n var a = i(r(0)),\n n = i(r(1)),\n o = r(46);\n\n function i(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _l5 = function l() {\n return (_l5 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n u = function u(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n function c(e) {\n return "asCustom" in e;\n }\n\n var s = function s(e, t) {\n var r;\n void 0 === e && (e = {});\n var a = t ? o.breakpoints[t] + ":" : "",\n i = e.row,\n l = e.col,\n u = e.gap,\n c = e.offset;\n return (0, n.default)(((r = {})[a + "grid-row"] = i, r[a + "grid-gap"] = !0 === u, r[a + "grid-gap-" + u] = !0 !== u && !!u, r[a + "grid-col"] = !0 === l, r[a + "grid-col-" + l] = !0 !== l && !!l, r[a + "grid-offset-" + c] = !!c, r));\n };\n\n t.getGridClasses = s;\n\n t.applyGridClasses = function (e) {\n var t = s(e);\n return Object.keys(o.breakpoints).forEach(function (r) {\n var a = r;\n\n if (Object.prototype.hasOwnProperty.call(e, a)) {\n var o = e[a];\n t = (0, n.default)(t, s(o, a));\n }\n }), t;\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.Textarea = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i3 = function i() {\n return (_i3 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.id,\n r = e.name,\n o = e.className,\n u = e.error,\n c = e.success,\n s = e.children,\n d = e.inputRef,\n f = l(e, ["id", "name", "className", "error", "success", "children", "inputRef"]),\n p = (0, n.default)("usa-textarea", {\n "usa-input--error": u,\n "usa-input--success": c\n }, o);\n return a.default.createElement("textarea", _i3({\n "data-testid": "textarea",\n className: p,\n id: t,\n name: r,\n ref: d\n }, f), s);\n };\n\n t.Textarea = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.Form = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i4 = function i() {\n return (_i4 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.Form = function (e) {\n var t = e.onSubmit,\n r = e.children,\n o = e.className,\n u = e.large,\n c = e.search,\n s = l(e, ["onSubmit", "children", "className", "large", "search"]),\n d = (0, n.default)({\n "usa-form": !c,\n "usa-form--large": u\n }, o);\n return a.default.createElement("form", _i4({\n "data-testid": "form",\n className: d,\n onSubmit: t\n }, s), r);\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.FooterExtendedNavList = void 0;\n\n var a,\n n = function (e, t) {\n if (!t && e && e.__esModule) return e;\n if (null === e || "object" != typeof e && "function" != typeof e) return {\n default: e\n };\n var r = l(t);\n if (r && r.has(e)) return r.get(e);\n var a = {},\n n = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n for (var o in e) {\n if ("default" !== o && Object.prototype.hasOwnProperty.call(e, o)) {\n var i = n ? Object.getOwnPropertyDescriptor(e, o) : null;\n i && (i.get || i.set) ? Object.defineProperty(a, o, i) : a[o] = e[o];\n }\n }\n\n a.default = e, r && r.set(e, a);\n return a;\n }(r(0)),\n o = (a = r(1)) && a.__esModule ? a : {\n default: a\n },\n i = r(4);\n\n function l(e) {\n if ("function" != typeof WeakMap) return null;\n var t = new WeakMap(),\n r = new WeakMap();\n return (l = function l(e) {\n return e ? r : t;\n })(e);\n }\n\n t.FooterExtendedNavList = function (e) {\n var t = e.className,\n r = e.isMobile,\n a = e.nestedLinks,\n i = (0, o.default)("grid-row grid-gap-4", t),\n l = "undefined" != typeof window,\n c = n.default.useState(l && window.innerWidth < 480),\n s = c[0],\n d = c[1],\n f = (0, n.useState)(Array(a.length).fill(!1)),\n p = f[0],\n m = f[1],\n y = r || void 0 === r && s;\n (0, n.useEffect)(function () {\n if (!r) return window.addEventListener("resize", e), function () {\n return window.removeEventListener("resize", e);\n };\n\n function e() {\n var e = l && window.innerWidth < 480;\n e !== s && d(e);\n }\n }, []);\n return n.default.createElement("div", {\n className: i\n }, a.map(function (e, t) {\n return n.default.createElement("div", {\n key: "linkSection-" + t,\n className: "mobile-lg:grid-col-6 desktop:grid-col-3"\n }, n.default.createElement(u, {\n onToggle: y ? function () {\n return e = t, void m(function (t) {\n var r = Array(a.length).fill(!1);\n return r[e] = !t[e], r;\n });\n var e;\n } : void 0,\n isOpen: !y || p[t],\n links: e\n }));\n }));\n };\n\n var u = function u(e) {\n var t = e.isOpen,\n r = void 0 !== t && t,\n a = e.links,\n l = e.onToggle,\n u = a[0],\n c = a.slice(1),\n s = (0, o.default)("usa-footer__primary-content usa-footer__primary-content--collapsible", {\n hidden: !r\n });\n return n.default.createElement("section", {\n className: s,\n onClick: l,\n onKeyPress: l\n }, n.default.createElement("h4", {\n className: "usa-footer__primary-link"\n }, u), n.default.createElement(i.NavList, {\n type: "footerSecondary",\n items: c\n }));\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), Object.defineProperty(t, "Alert", {\n enumerable: !0,\n get: function get() {\n return a.Alert;\n }\n }), Object.defineProperty(t, "Accordion", {\n enumerable: !0,\n get: function get() {\n return n.Accordion;\n }\n }), Object.defineProperty(t, "GovBanner", {\n enumerable: !0,\n get: function get() {\n return o.GovBanner;\n }\n }), Object.defineProperty(t, "Button", {\n enumerable: !0,\n get: function get() {\n return i.Button;\n }\n }), Object.defineProperty(t, "ButtonGroup", {\n enumerable: !0,\n get: function get() {\n return l.ButtonGroup;\n }\n }), Object.defineProperty(t, "Link", {\n enumerable: !0,\n get: function get() {\n return u.Link;\n }\n }), Object.defineProperty(t, "Table", {\n enumerable: !0,\n get: function get() {\n return c.Table;\n }\n }), Object.defineProperty(t, "Tag", {\n enumerable: !0,\n get: function get() {\n return s.Tag;\n }\n }), Object.defineProperty(t, "Tooltip", {\n enumerable: !0,\n get: function get() {\n return d.Tooltip;\n }\n }), Object.defineProperty(t, "SideNav", {\n enumerable: !0,\n get: function get() {\n return f.SideNav;\n }\n }), Object.defineProperty(t, "Collection", {\n enumerable: !0,\n get: function get() {\n return p.Collection;\n }\n }), Object.defineProperty(t, "CollectionItem", {\n enumerable: !0,\n get: function get() {\n return m.CollectionItem;\n }\n }), Object.defineProperty(t, "CollectionHeading", {\n enumerable: !0,\n get: function get() {\n return y.CollectionHeading;\n }\n }), Object.defineProperty(t, "CollectionDescription", {\n enumerable: !0,\n get: function get() {\n return b.CollectionDescription;\n }\n }), Object.defineProperty(t, "CollectionMeta", {\n enumerable: !0,\n get: function get() {\n return v.CollectionMeta;\n }\n }), Object.defineProperty(t, "CollectionMetaItem", {\n enumerable: !0,\n get: function get() {\n return O.CollectionMetaItem;\n }\n }), Object.defineProperty(t, "CollectionMetaItemTag", {\n enumerable: !0,\n get: function get() {\n return g.CollectionMetaItemTag;\n }\n }), Object.defineProperty(t, "CollectionThumbnail", {\n enumerable: !0,\n get: function get() {\n return _.CollectionThumbnail;\n }\n }), Object.defineProperty(t, "CollectionCalendarDate", {\n enumerable: !0,\n get: function get() {\n return h.CollectionCalendarDate;\n }\n }), Object.defineProperty(t, "GridContainer", {\n enumerable: !0,\n get: function get() {\n return j.GridContainer;\n }\n }), Object.defineProperty(t, "Grid", {\n enumerable: !0,\n get: function get() {\n return M.Grid;\n }\n }), Object.defineProperty(t, "CharacterCount", {\n enumerable: !0,\n get: function get() {\n return N.CharacterCount;\n }\n }), Object.defineProperty(t, "Checkbox", {\n enumerable: !0,\n get: function get() {\n return E.Checkbox;\n }\n }), Object.defineProperty(t, "ComboBox", {\n enumerable: !0,\n get: function get() {\n return P.ComboBox;\n }\n }), Object.defineProperty(t, "DateInput", {\n enumerable: !0,\n get: function get() {\n return w.DateInput;\n }\n }), Object.defineProperty(t, "DateInputGroup", {\n enumerable: !0,\n get: function get() {\n return I.DateInputGroup;\n }\n }), Object.defineProperty(t, "DatePicker", {\n enumerable: !0,\n get: function get() {\n return D.DatePicker;\n }\n }), Object.defineProperty(t, "DateRangePicker", {\n enumerable: !0,\n get: function get() {\n return S.DateRangePicker;\n }\n }), Object.defineProperty(t, "Dropdown", {\n enumerable: !0,\n get: function get() {\n return x.Dropdown;\n }\n }), Object.defineProperty(t, "ErrorMessage", {\n enumerable: !0,\n get: function get() {\n return k.ErrorMessage;\n }\n }), Object.defineProperty(t, "Fieldset", {\n enumerable: !0,\n get: function get() {\n return A.Fieldset;\n }\n }), Object.defineProperty(t, "FileInput", {\n enumerable: !0,\n get: function get() {\n return T.FileInput;\n }\n }), Object.defineProperty(t, "Form", {\n enumerable: !0,\n get: function get() {\n return C.Form;\n }\n }), Object.defineProperty(t, "FormGroup", {\n enumerable: !0,\n get: function get() {\n return L.FormGroup;\n }\n }), Object.defineProperty(t, "Label", {\n enumerable: !0,\n get: function get() {\n return F.Label;\n }\n }), Object.defineProperty(t, "Radio", {\n enumerable: !0,\n get: function get() {\n return R.Radio;\n }\n }), Object.defineProperty(t, "RangeInput", {\n enumerable: !0,\n get: function get() {\n return U.RangeInput;\n }\n }), Object.defineProperty(t, "Textarea", {\n enumerable: !0,\n get: function get() {\n return W.Textarea;\n }\n }), Object.defineProperty(t, "TextInput", {\n enumerable: !0,\n get: function get() {\n return B.TextInput;\n }\n }), Object.defineProperty(t, "TimePicker", {\n enumerable: !0,\n get: function get() {\n return z.TimePicker;\n }\n }), Object.defineProperty(t, "ValidationChecklist", {\n enumerable: !0,\n get: function get() {\n return Y.ValidationChecklist;\n }\n }), Object.defineProperty(t, "ValidationItem", {\n enumerable: !0,\n get: function get() {\n return G.ValidationItem;\n }\n }), Object.defineProperty(t, "ExtendedNav", {\n enumerable: !0,\n get: function get() {\n return V.ExtendedNav;\n }\n }), Object.defineProperty(t, "Header", {\n enumerable: !0,\n get: function get() {\n return H.Header;\n }\n }), Object.defineProperty(t, "MegaMenu", {\n enumerable: !0,\n get: function get() {\n return Q.MegaMenu;\n }\n }), Object.defineProperty(t, "Menu", {\n enumerable: !0,\n get: function get() {\n return K.Menu;\n }\n }), Object.defineProperty(t, "NavCloseButton", {\n enumerable: !0,\n get: function get() {\n return Z.NavCloseButton;\n }\n }), Object.defineProperty(t, "NavList", {\n enumerable: !0,\n get: function get() {\n return X.NavList;\n }\n }), Object.defineProperty(t, "NavMenuButton", {\n enumerable: !0,\n get: function get() {\n return J.NavMenuButton;\n }\n }), Object.defineProperty(t, "NavDropDownButton", {\n enumerable: !0,\n get: function get() {\n return q.NavDropDownButton;\n }\n }), Object.defineProperty(t, "PrimaryNav", {\n enumerable: !0,\n get: function get() {\n return $.PrimaryNav;\n }\n }), Object.defineProperty(t, "Title", {\n enumerable: !0,\n get: function get() {\n return ee.Title;\n }\n }), Object.defineProperty(t, "Identifier", {\n enumerable: !0,\n get: function get() {\n return te.Identifier;\n }\n }), Object.defineProperty(t, "IdentifierGov", {\n enumerable: !0,\n get: function get() {\n return re.IdentifierGov;\n }\n }), Object.defineProperty(t, "IdentifierIdentity", {\n enumerable: !0,\n get: function get() {\n return ae.IdentifierIdentity;\n }\n }), Object.defineProperty(t, "IdentifierLink", {\n enumerable: !0,\n get: function get() {\n return ne.IdentifierLink;\n }\n }), Object.defineProperty(t, "IdentifierLinkItem", {\n enumerable: !0,\n get: function get() {\n return oe.IdentifierLinkItem;\n }\n }), Object.defineProperty(t, "IdentifierLinks", {\n enumerable: !0,\n get: function get() {\n return ie.IdentifierLinks;\n }\n }), Object.defineProperty(t, "IdentifierLogo", {\n enumerable: !0,\n get: function get() {\n return le.IdentifierLogo;\n }\n }), Object.defineProperty(t, "IdentifierLogos", {\n enumerable: !0,\n get: function get() {\n return ue.IdentifierLogos;\n }\n }), Object.defineProperty(t, "IdentifierMasthead", {\n enumerable: !0,\n get: function get() {\n return ce.IdentifierMasthead;\n }\n }), Object.defineProperty(t, "Address", {\n enumerable: !0,\n get: function get() {\n return se.Address;\n }\n }), Object.defineProperty(t, "Footer", {\n enumerable: !0,\n get: function get() {\n return de.Footer;\n }\n }), Object.defineProperty(t, "FooterExtendedNavList", {\n enumerable: !0,\n get: function get() {\n return fe.FooterExtendedNavList;\n }\n }), Object.defineProperty(t, "FooterNav", {\n enumerable: !0,\n get: function get() {\n return pe.FooterNav;\n }\n }), Object.defineProperty(t, "Logo", {\n enumerable: !0,\n get: function get() {\n return me.Logo;\n }\n }), Object.defineProperty(t, "SocialLinks", {\n enumerable: !0,\n get: function get() {\n return ye.SocialLinks;\n }\n }), Object.defineProperty(t, "CardGroup", {\n enumerable: !0,\n get: function get() {\n return be.CardGroup;\n }\n }), Object.defineProperty(t, "Card", {\n enumerable: !0,\n get: function get() {\n return ve.Card;\n }\n }), Object.defineProperty(t, "CardHeader", {\n enumerable: !0,\n get: function get() {\n return Oe.CardHeader;\n }\n }), Object.defineProperty(t, "CardMedia", {\n enumerable: !0,\n get: function get() {\n return ge.CardMedia;\n }\n }), Object.defineProperty(t, "CardBody", {\n enumerable: !0,\n get: function get() {\n return _e.CardBody;\n }\n }), Object.defineProperty(t, "CardFooter", {\n enumerable: !0,\n get: function get() {\n return he.CardFooter;\n }\n }), Object.defineProperty(t, "BreadcrumbBar", {\n enumerable: !0,\n get: function get() {\n return je.BreadcrumbBar;\n }\n }), Object.defineProperty(t, "Breadcrumb", {\n enumerable: !0,\n get: function get() {\n return Me.Breadcrumb;\n }\n }), Object.defineProperty(t, "BreadcrumbLink", {\n enumerable: !0,\n get: function get() {\n return Ne.BreadcrumbLink;\n }\n }), Object.defineProperty(t, "StepIndicator", {\n enumerable: !0,\n get: function get() {\n return Ee.StepIndicator;\n }\n }), Object.defineProperty(t, "StepIndicatorStep", {\n enumerable: !0,\n get: function get() {\n return Pe.StepIndicatorStep;\n }\n }), Object.defineProperty(t, "Search", {\n enumerable: !0,\n get: function get() {\n return we.Search;\n }\n }), Object.defineProperty(t, "SummaryBox", {\n enumerable: !0,\n get: function get() {\n return Ie.SummaryBox;\n }\n }), Object.defineProperty(t, "ProcessList", {\n enumerable: !0,\n get: function get() {\n return De.ProcessList;\n }\n }), Object.defineProperty(t, "ProcessListItem", {\n enumerable: !0,\n get: function get() {\n return Se.ProcessListItem;\n }\n }), Object.defineProperty(t, "ProcessListHeading", {\n enumerable: !0,\n get: function get() {\n return xe.ProcessListHeading;\n }\n }), Object.defineProperty(t, "SiteAlert", {\n enumerable: !0,\n get: function get() {\n return ke.SiteAlert;\n }\n }), Object.defineProperty(t, "Modal", {\n enumerable: !0,\n get: function get() {\n return Ae.Modal;\n }\n }), Object.defineProperty(t, "Overlay", {\n enumerable: !0,\n get: function get() {\n return Ae.Overlay;\n }\n }), Object.defineProperty(t, "ModalContainer", {\n enumerable: !0,\n get: function get() {\n return Ae.ModalContainer;\n }\n }), Object.defineProperty(t, "connectModal", {\n enumerable: !0,\n get: function get() {\n return Ae.connectModal;\n }\n }), Object.defineProperty(t, "useModal", {\n enumerable: !0,\n get: function get() {\n return Ae.useModal;\n }\n }), r(20);\n\n var a = r(21),\n n = r(23),\n o = r(24),\n i = r(14),\n l = r(29),\n u = r(10),\n c = r(30),\n s = r(32),\n d = r(33),\n f = r(35),\n p = r(36),\n m = r(37),\n y = r(38),\n b = r(39),\n v = r(40),\n O = r(41),\n g = r(42),\n _ = r(43),\n h = r(44),\n j = r(45),\n M = r(15),\n N = r(47),\n E = r(48),\n P = r(11),\n w = r(51),\n I = r(52),\n D = r(12),\n S = r(57),\n x = r(58),\n k = r(59),\n A = r(60),\n T = r(61),\n C = r(17),\n L = r(8),\n F = r(5),\n R = r(64),\n U = r(65),\n W = r(16),\n B = r(7),\n z = r(66),\n Y = r(69),\n G = r(70),\n V = r(71),\n H = r(73),\n Q = r(74),\n K = r(75),\n Z = r(13),\n X = r(4),\n J = r(76),\n q = r(77),\n $ = r(78),\n ee = r(79),\n te = r(80),\n re = r(81),\n ae = r(82),\n ne = r(83),\n oe = r(84),\n ie = r(85),\n le = r(86),\n ue = r(87),\n ce = r(88),\n se = r(89),\n de = r(90),\n fe = r(18),\n pe = r(91),\n me = r(92),\n ye = r(93),\n be = r(94),\n ve = r(95),\n Oe = r(96),\n ge = r(97),\n _e = r(98),\n he = r(99),\n je = r(100),\n Me = r(101),\n Ne = r(102),\n Ee = r(103),\n Pe = r(104),\n we = r(105),\n Ie = r(106),\n De = r(107),\n Se = r(108),\n xe = r(109),\n ke = r(110),\n Ae = r(111);\n }, function (e, t, r) {\n "use strict";\n\n r.r(t);\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.Alert = void 0;\n var a = i(r(0)),\n n = i(r(1)),\n o = i(r(22));\n\n function i(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _l6 = function l() {\n return (_l6 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n u = function u(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n c = function c(e) {\n var t,\n r = e.type,\n i = e.heading,\n c = e.cta,\n s = e.children,\n d = e.slim,\n f = e.noIcon,\n p = e.className,\n m = e.validation,\n y = u(e, ["type", "heading", "cta", "children", "slim", "noIcon", "className", "validation"]),\n b = (0, n.default)("usa-alert", ((t = {\n "usa-alert--success": "success" === r,\n "usa-alert--warning": "warning" === r,\n "usa-alert--error": "error" === r,\n "usa-alert--info": "info" === r,\n "usa-alert--slim": d,\n "usa-alert--no-icon": f,\n "usa-alert--validation": m\n })[o.default.alertWithCTA] = !!c, t), p);\n return a.default.createElement("div", _l6({\n className: b,\n "data-testid": "alert"\n }, y), a.default.createElement("div", {\n className: "usa-alert__body"\n }, i && a.default.createElement("h3", {\n className: "usa-alert__heading"\n }, i), s && (m ? s : a.default.createElement("p", {\n className: "usa-alert__text"\n }, s))), c && a.default.createElement("div", null, c));\n };\n\n t.Alert = c;\n var s = c;\n t.default = s;\n }, function (e, t, r) {\n "use strict";\n\n r.r(t), t.default = {\n alertWithCTA: "src-components-Alert-Alert-module__alertWithCTA--1frj5"\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.Accordion = t.AccordionItem = void 0;\n\n var a,\n n = function (e, t) {\n if (!t && e && e.__esModule) return e;\n if (null === e || "object" != typeof e && "function" != typeof e) return {\n default: e\n };\n var r = i(t);\n if (r && r.has(e)) return r.get(e);\n var a = {},\n n = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n for (var o in e) {\n if ("default" !== o && Object.prototype.hasOwnProperty.call(e, o)) {\n var l = n ? Object.getOwnPropertyDescriptor(e, o) : null;\n l && (l.get || l.set) ? Object.defineProperty(a, o, l) : a[o] = e[o];\n }\n }\n\n a.default = e, r && r.set(e, a);\n return a;\n }(r(0)),\n o = (a = r(1)) && a.__esModule ? a : {\n default: a\n };\n\n function i(e) {\n if ("function" != typeof WeakMap) return null;\n var t = new WeakMap(),\n r = new WeakMap();\n return (i = function i(e) {\n return e ? r : t;\n })(e);\n }\n\n var _l7 = function l() {\n return (_l7 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n u = function u() {\n for (var e = 0, t = 0, r = arguments.length; t < r; t++) {\n e += arguments[t].length;\n }\n\n var a = Array(e),\n n = 0;\n\n for (t = 0; t < r; t++) {\n for (var o = arguments[t], i = 0, l = o.length; i < l; i++, n++) {\n a[n] = o[i];\n }\n }\n\n return a;\n },\n c = function c(e) {\n var t = e.title,\n r = e.id,\n a = e.content,\n i = e.expanded,\n l = e.className,\n u = e.handleToggle,\n c = (0, o.default)("usa-accordion__heading", l),\n s = (0, o.default)("usa-accordion__content", "usa-prose", l);\n return n.default.createElement(n.default.Fragment, null, n.default.createElement("h2", {\n className: c\n }, n.default.createElement("button", {\n type: "button",\n className: "usa-accordion__button",\n "aria-expanded": i,\n "aria-controls": r,\n "data-testid": "accordionButton_" + r,\n onClick: u\n }, t)), n.default.createElement("div", {\n id: r,\n "data-testid": "accordionItem_" + r,\n className: s,\n hidden: !i\n }, a));\n };\n\n t.AccordionItem = c;\n\n var s = function s(e) {\n var t = e.bordered,\n r = e.items,\n a = e.className,\n i = (0, n.useState)(r.filter(function (e) {\n return !!e.expanded;\n }).map(function (e) {\n return e.id;\n })),\n s = i[0],\n d = i[1],\n f = (0, o.default)("usa-accordion", {\n "usa-accordion--bordered": t\n }, a);\n return n.default.createElement("div", {\n className: f,\n "data-testid": "accordion"\n }, r.map(function (e, t) {\n return n.default.createElement(c, _l7({\n key: "accordionItem_" + t\n }, e, {\n expanded: s.indexOf(e.id) > -1,\n handleToggle: function handleToggle() {\n var t, r, a;\n t = e.id, r = u(s), (a = s.indexOf(t)) > -1 ? r.splice(a, 1) : r.push(t), d(r);\n }\n }));\n }));\n };\n\n t.Accordion = s;\n var d = s;\n t.default = d;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.GovBanner = void 0;\n\n var a = function (e, t) {\n if (!t && e && e.__esModule) return e;\n if (null === e || "object" != typeof e && "function" != typeof e) return {\n default: e\n };\n var r = s(t);\n if (r && r.has(e)) return r.get(e);\n var a = {},\n n = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n for (var o in e) {\n if ("default" !== o && Object.prototype.hasOwnProperty.call(e, o)) {\n var i = n ? Object.getOwnPropertyDescriptor(e, o) : null;\n i && (i.get || i.set) ? Object.defineProperty(a, o, i) : a[o] = e[o];\n }\n }\n\n a.default = e, r && r.set(e, a);\n return a;\n }(r(0)),\n n = c(r(1)),\n o = c(r(25)),\n i = c(r(26)),\n l = c(r(27)),\n u = c(r(28));\n\n function c(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n function s(e) {\n if ("function" != typeof WeakMap) return null;\n var t = new WeakMap(),\n r = new WeakMap();\n return (s = function s(e) {\n return e ? r : t;\n })(e);\n }\n\n var _d = function d() {\n return (_d = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n f = function f(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n p = function p(e) {\n var t = e.tld,\n r = void 0 === t ? ".gov" : t,\n c = e.language,\n s = void 0 === c ? "english" : c,\n p = e.className,\n m = f(e, ["tld", "language", "className"]),\n y = (0, a.useState)(!1),\n b = y[0],\n v = y[1],\n O = (0, n.default)("usa-banner", p),\n g = function (e, t) {\n var r = a.default.createElement("span", {\n className: "icon-lock"\n }, a.default.createElement("img", {\n src: u.default,\n className: "usa-banner__lock-image",\n alt: "lock",\n title: "Lock",\n role: "img"\n }));\n\n switch (e) {\n case "english":\n return {\n header: "An official website of the United States government",\n headerAction: "Here’s how you know",\n tldSectionHeader: "Official websites use " + t,\n tldSectionContent: function () {\n switch (t) {\n case ".gov":\n return a.default.createElement(a.default.Fragment, null, "A ", a.default.createElement("strong", null, ".gov"), " website belongs to an official government organization in the United States.");\n\n case ".mil":\n return a.default.createElement(a.default.Fragment, null, "A ", a.default.createElement("strong", null, ".mil"), " website belongs to an official U.S. Department of Defense organization.");\n }\n }(),\n httpsSectionHeader: "Secure " + t + " websites use HTTPS",\n httpsSectionContent: a.default.createElement(a.default.Fragment, null, "A ", a.default.createElement("strong", null, "lock (", r, ")"), " or ", a.default.createElement("strong", null, "https://"), " means you’ve safely connected to the ", t, " website. Share sensitive information only on official, secure websites.")\n };\n\n case "spanish":\n return {\n header: "Un sitio oficial del Gobierno de Estados Unidos",\n headerAction: "Así es como usted puede verificarlo",\n tldSectionHeader: "Los sitios web oficiales usan " + t,\n tldSectionContent: function () {\n switch (t) {\n case ".gov":\n return a.default.createElement(a.default.Fragment, null, "Un sitio web ", a.default.createElement("strong", null, ".gov"), " pertenece a una organización oficial del Gobierno de Estados Unidos.");\n\n case ".mil":\n return a.default.createElement(a.default.Fragment, null, "Un sitio web ", a.default.createElement("strong", null, ".mil"), " pertenece a una organización oficial del Departamento de Defensa de EE. UU.");\n }\n }(),\n httpsSectionHeader: "Los sitios web seguros " + t + " usan HTTPS",\n httpsSectionContent: a.default.createElement(a.default.Fragment, null, "Un ", a.default.createElement("strong", null, "candado (", r, ")"), " o ", a.default.createElement("strong", null, "https://"), " ", "significa que usted se conectó de forma segura a un sitio web ", t, ". Comparta información sensible sólo en sitios web oficiales y seguros.")\n };\n }\n }(s, r);\n\n return a.default.createElement("section", _d({\n className: O,\n "data-testid": "govBanner"\n }, m), a.default.createElement("div", {\n className: "usa-accordion"\n }, a.default.createElement("header", {\n className: "usa-banner__header"\n }, a.default.createElement("div", {\n className: "usa-banner__inner"\n }, a.default.createElement("div", {\n className: "grid-col-auto"\n }, a.default.createElement("img", {\n className: "usa-banner__header-flag",\n src: o.default,\n alt: "U.S. flag"\n })), a.default.createElement("div", {\n className: "grid-col-fill tablet:grid-col-auto"\n }, a.default.createElement("p", {\n className: "usa-banner__header-text"\n }, g.header), a.default.createElement("p", {\n className: "usa-banner__header-action",\n "aria-hidden": "true"\n }, g.headerAction)), a.default.createElement("button", {\n type: "button",\n className: "usa-accordion__button usa-banner__button",\n "aria-expanded": b,\n "aria-controls": "gov-banner",\n onClick: function onClick() {\n v(function (e) {\n return !e;\n });\n }\n }, a.default.createElement("span", {\n className: "usa-banner__button-text"\n }, g.headerAction)))), a.default.createElement("div", {\n className: "usa-banner__content usa-accordion__content",\n id: "gov-banner",\n hidden: !b\n }, a.default.createElement("div", {\n className: "grid-row grid-gap-lg"\n }, a.default.createElement("div", {\n className: "usa-banner__guidance tablet:grid-col-6"\n }, a.default.createElement("img", {\n className: "usa-banner__icon usa-media-block__img",\n src: i.default,\n role: "img",\n alt: "",\n "aria-hidden": "true"\n }), a.default.createElement("div", {\n className: "usa-media-block__body"\n }, a.default.createElement("p", null, a.default.createElement("strong", null, g.tldSectionHeader), a.default.createElement("br", null), g.tldSectionContent))), a.default.createElement("div", {\n className: "usa-banner__guidance tablet:grid-col-6"\n }, a.default.createElement("img", {\n className: "usa-banner__icon usa-media-block__img",\n src: l.default,\n role: "img",\n alt: "",\n "aria-hidden": "true"\n }), a.default.createElement("div", {\n className: "usa-media-block__body"\n }, a.default.createElement("p", null, a.default.createElement("strong", null, g.httpsSectionHeader), a.default.createElement("br", null), g.httpsSectionContent)))))));\n };\n\n t.GovBanner = p;\n var m = p;\n t.default = m;\n }, function (e, t, r) {\n "use strict";\n\n r.r(t), t.default = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAMAAABBPP0LAAAAG1BMVEUdM7EeNLIeM7HgQCDaPh/bPh/bPx/////bPyBEby41AAAAUElEQVQI123MNw4CABDEwD3jC/9/MQ1BQrgeOSkIqYe2o2FZtthXgQLgbHVMZdlsfUQFQnHtjP1+8BUhBDKOqtmfot6ojqPzR7TjdU+f6vkED+IDPhTBcMAAAAAASUVORK5CYII=";\n }, function (e, t, r) {\n "use strict";\n\n r.r(t), t.default = "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiB2aWV3Qm94PSIwIDAgNjQgNjQiPjx0aXRsZT5pY29uLWRvdC1nb3Y8L3RpdGxlPjxwYXRoIGZpbGw9IiMyMzc4QzMiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTMyIDBjMTcuNjczIDAgMzIgMTQuMzI3IDMyIDMyIDAgMTcuNjczLTE0LjMyNyAzMi0zMiAzMkMxNC4zMjcgNjQgMCA0OS42NzMgMCAzMiAwIDE0LjMyNyAxNC4zMjcgMCAzMiAwem0wIDEuMjA4QzE0Ljk5NCAxLjIwOCAxLjIwOCAxNC45OTQgMS4yMDggMzJTMTQuOTk0IDYyLjc5MiAzMiA2Mi43OTIgNjIuNzkyIDQ5LjAwNiA2Mi43OTIgMzIgNDkuMDA2IDEuMjA4IDMyIDEuMjA4em0xMC41OSAzOC44NThhLjg1Ny44NTcgMCAwIDEgLjg4Mi44MjJ2MS42NDJIMTguODg2di0xLjY0MmEuODU3Ljg1NyAwIDAgMSAuODgyLS44MjJINDIuNTl6TTI1LjQ0MyAyNy43NzR2OS44MjloMS42NDJ2LTkuODNoMy4yNzN2OS44M0gzMnYtOS44M2gzLjI3MnY5LjgzaDEuNjQzdi05LjgzaDMuMjcydjkuODNoLjc2YS44NTcuODU3IDAgMCAxIC44ODIuODIxdi44MjFoLTIxLjN2LS44MDlhLjg1Ny44NTcgMCAwIDEgLjg4LS44MmguNzYydi05Ljg0MmgzLjI3MnptNS43MzYtOC4xODhsMTIuMjkzIDQuOTE1djEuNjQyaC0xLjYzYS44NTcuODU3IDAgMCAxLS44ODIuODIySDIxLjQxYS44NTcuODU3IDAgMCAxLS44ODItLjgyMmgtMS42NDJ2LTEuNjQybDEyLjI5My00LjkxNXoiLz48L3N2Zz4=";\n }, function (e, t, r) {\n "use strict";\n\n r.r(t), t.default = "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiB2aWV3Qm94PSIwIDAgNjQgNjQiPjx0aXRsZT5pY29uLWh0dHBzPC90aXRsZT48cGF0aCBmaWxsPSIjNzE5RjJBIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0zMiAwYzE3LjY3MyAwIDMyIDE0LjMyNyAzMiAzMiAwIDE3LjY3My0xNC4zMjcgMzItMzIgMzJDMTQuMzI3IDY0IDAgNDkuNjczIDAgMzIgMCAxNC4zMjcgMTQuMzI3IDAgMzIgMHptMCAxLjIwOEMxNC45OTQgMS4yMDggMS4yMDggMTQuOTk0IDEuMjA4IDMyUzE0Ljk5NCA2Mi43OTIgMzIgNjIuNzkyIDYyLjc5MiA0OS4wMDYgNjIuNzkyIDMyIDQ5LjAwNiAxLjIwOCAzMiAxLjIwOHptMCAxOC44ODZhNy4yNDUgNy4yNDUgMCAwIDEgNy4yNDUgNy4yNDV2My4xMDNoLjUyYy44NiAwIDEuNTU3LjY5OCAxLjU1NyAxLjU1OHY5LjMyMmMwIC44Ni0uNjk3IDEuNTU4LTEuNTU3IDEuNTU4aC0xNS41M2MtLjg2IDAtMS41NTctLjY5Ny0xLjU1Ny0xLjU1OFYzMmMwLS44Ni42OTctMS41NTggMS41NTctMS41NThoLjUyVjI3LjM0QTcuMjQ1IDcuMjQ1IDAgMCAxIDMyIDIwLjA5NHptMCAzLjEwM2E0LjE0MiA0LjE0MiAwIDAgMC00LjE0MiA0LjE0MnYzLjEwM2g4LjI4NFYyNy4zNEE0LjE0MiA0LjE0MiAwIDAgMCAzMiAyMy4xOTd6Ii8+PC9zdmc+";\n }, function (e, t, r) {\n "use strict";\n\n r.r(t), t.default = "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjUyIiBoZWlnaHQ9IjY0IiB2aWV3Qm94PSIwIDAgNTIgNjQiPjx0aXRsZT5sb2NrPC90aXRsZT48cGF0aCBmaWxsPSIjMUIxQjFCIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0yNiAwYzEwLjQ5MyAwIDE5IDguNTA3IDE5IDE5djloM2E0IDQgMCAwIDEgNCA0djI4YTQgNCAwIDAgMS00IDRINGE0IDQgMCAwIDEtNC00VjMyYTQgNCAwIDAgMSA0LTRoM3YtOUM3IDguNTA3IDE1LjUwNyAwIDI2IDB6bTAgOGMtNS45NzkgMC0xMC44NDMgNC43Ny0xMC45OTYgMTAuNzEyTDE1IDE5djloMjJ2LTljMC02LjA3NS00LjkyNS0xMS0xMS0xMXoiLz48L3N2Zz4=";\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.ButtonGroup = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i5 = function i() {\n return (_i5 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.className,\n r = e.children,\n o = e.type,\n u = void 0 === o ? "default" : o,\n c = l(e, ["className", "children", "type"]),\n s = (0, n.default)("usa-button-group", {\n "usa-button-group--segmented": "segmented" == u\n }, t);\n return a.default.createElement("ul", _i5({\n className: s\n }, c), a.default.Children.map(r, function (e) {\n return a.default.createElement("li", {\n className: "usa-button-group__item"\n }, e);\n }));\n };\n\n t.ButtonGroup = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.Table = void 0;\n var a = i(r(0)),\n n = i(r(1)),\n o = i(r(31));\n\n function i(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var l = function l(e) {\n var t,\n r = e.bordered,\n i = e.caption,\n l = e.children,\n u = e.fullWidth,\n c = e.fixed,\n s = e.scrollable,\n d = e.striped,\n f = e.compact,\n p = e.stackedStyle,\n m = void 0 === p ? "none" : p,\n y = (0, n.default)("usa-table", ((t = {\n "usa-table--borderless": !r\n })["" + o.default.fullwidth] = u, t["" + o.default.fixed] = c, t["usa-table--striped"] = d, t["usa-table--compact"] = f, t["usa-table--stacked"] = "default" === m, t["usa-table--stacked-header"] = "headers" === m, t));\n f && "none" !== m && console.warn("USWDS states that compact styling is not suitable for use with stacked variants. See USWDS Table component, Table variants for more information: https://designsystem.digital.gov/components/table");\n var b = a.default.createElement("table", {\n className: y,\n "data-testid": "table"\n }, i && a.default.createElement("caption", null, i), l);\n return a.default.createElement(a.default.Fragment, null, s ? a.default.createElement("div", {\n "data-testid": "scrollable-table-container",\n className: "usa-table-container--scrollable"\n }, b) : b);\n };\n\n t.Table = l;\n var u = l;\n t.default = u;\n }, function (e, t, r) {\n "use strict";\n\n r.r(t), t.default = {\n fullwidth: "src-components-Table-Table-module__fullwidth--3-K3t",\n fixed: "src-components-Table-Table-module__fixed--2Awcy"\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.Tag = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i6 = function i() {\n return (_i6 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.children,\n r = e.background,\n o = e.className,\n u = l(e, ["children", "background", "className"]),\n c = {};\n r && (c.background = r);\n var s = (0, n.default)("usa-tag", o);\n return a.default.createElement("span", _i6({\n "data-testid": "tag",\n className: s,\n style: _i6({}, c)\n }, u), t);\n };\n\n t.Tag = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.isCustomProps = s, t.Tooltip = d;\n\n var a,\n n = function (e, t) {\n if (!t && e && e.__esModule) return e;\n if (null === e || "object" != typeof e && "function" != typeof e) return {\n default: e\n };\n var r = l(t);\n if (r && r.has(e)) return r.get(e);\n var a = {},\n n = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n for (var o in e) {\n if ("default" !== o && Object.prototype.hasOwnProperty.call(e, o)) {\n var i = n ? Object.getOwnPropertyDescriptor(e, o) : null;\n i && (i.get || i.set) ? Object.defineProperty(a, o, i) : a[o] = e[o];\n }\n }\n\n a.default = e, r && r.set(e, a);\n return a;\n }(r(0)),\n o = (a = r(1)) && a.__esModule ? a : {\n default: a\n },\n i = r(34);\n\n function l(e) {\n if ("function" != typeof WeakMap) return null;\n var t = new WeakMap(),\n r = new WeakMap();\n return (l = function l(e) {\n return e ? r : t;\n })(e);\n }\n\n var _u = function u() {\n return (_u = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n c = function c(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n function s(e) {\n return "asCustom" in e;\n }\n\n function d(e) {\n var t = (0, n.useRef)(null),\n r = (0, n.useRef)(null),\n a = (0, n.useRef)("tooltip-" + (Math.floor(9e5 * Math.random()) + 1e5)),\n l = (0, n.useState)(!1),\n d = l[0],\n f = l[1],\n p = function p(a, o) {\n (0, n.useEffect)(function () {\n var n = o;\n\n if (a.current && r.current && t.current) {\n var l = a.current,\n u = r.current,\n c = t.current,\n s = l.offsetWidth,\n d = l.offsetHeight,\n f = Number.parseInt(window.getComputedStyle(l).getPropertyValue("margin-top"), 10),\n p = Number.parseInt(window.getComputedStyle(l).getPropertyValue("margin-bottom"), 10),\n m = Number.parseInt(window.getComputedStyle(c).getPropertyValue("padding-top"), 10),\n y = Number.parseInt(window.getComputedStyle(c).getPropertyValue("padding-bottom"), 10),\n b = Number.parseInt(window.getComputedStyle(u).getPropertyValue("height"), 10),\n v = l.offsetLeft,\n O = u.offsetWidth,\n g = s / 2 + v,\n _ = s + 5 + 2,\n h = d + 5 + 2,\n j = function j(e) {\n u.classList.remove("usa-tooltip__body--" + n), n = e, u.classList.add("usa-tooltip__body--" + e);\n };\n\n if (e.wrapperclasses) e.wrapperclasses.split(" ").forEach(function (e) {\n return c.classList.add(e);\n });\n if (e.className) e.className.split(" ").forEach(function (e) {\n return l.classList.add(e);\n });\n\n var M = function M(e) {\n j("top"), e.style.marginLeft = g + "px", (0, i.isElementInViewport)(e) || e.classList.add("usa-tooltip__body--wrap"), e.style.marginBottom = h + p + y + "px";\n },\n N = function N(e) {\n j("bottom"), e.style.marginLeft = g + "px", (0, i.isElementInViewport)(e) || e.classList.add("usa-tooltip__body--wrap"), e.style.marginTop = h + f + m + "px";\n },\n E = function E(e) {\n j("right"), e.style.marginBottom = "0", e.style.marginLeft = _ + v + "px", e.style.bottom = (d - b) / 2 + p + y + "px";\n },\n P = function P(e) {\n j("left"), e.style.marginBottom = "0", e.style.marginLeft = v > O ? v - O - 7 + "px" : "-" + (O - v + 7) + "px", e.style.bottom = (d - b) / 2 + p + y + "px";\n };\n\n switch (o) {\n case "top":\n M(u), (0, i.isElementInViewport)(u) || N(u);\n break;\n\n case "bottom":\n N(u), (0, i.isElementInViewport)(u) || M(u);\n break;\n\n case "right":\n E(u), (0, i.isElementInViewport)(u) || (P(u), (0, i.isElementInViewport)(u) || M(u));\n break;\n\n case "left":\n P(u), (0, i.isElementInViewport)(u) || (E(u), (0, i.isElementInViewport)(u) || M(u));\n }\n }\n }, [d]);\n };\n\n if (s(e)) {\n var m = (0, n.useRef)(null),\n y = e.label,\n b = e.position,\n v = e.asCustom,\n O = e.children,\n g = N = c(e, ["label", "position", "asCustom", "children"]),\n _ = (0, o.default)("usa-tooltip__body", {\n "is-set": d,\n "usa-tooltip__body--top": "top" === b,\n "usa-tooltip__body--bottom": "bottom" === b,\n "usa-tooltip__body--right": "right" === b,\n "usa-tooltip__body--left": "left" === b,\n "is-visible": d\n }),\n h = function h() {\n f(!0);\n },\n j = function j() {\n f(!1);\n };\n\n p(m, b);\n var M = (0, n.createElement)(v, _u({\n ref: m,\n "data-testid": "triggerElement",\n onMouseEnter: function onMouseEnter() {\n return h();\n },\n onMouseOver: function onMouseOver() {\n return h();\n },\n onFocus: function onFocus() {\n return h();\n },\n onMouseLeave: function onMouseLeave() {\n return j();\n },\n onBlur: function onBlur() {\n return j();\n },\n onKeyDown: function onKeyDown() {\n return j();\n }\n }, g), O);\n return n.default.createElement("span", {\n "data-testid": "tooltipWrapper",\n ref: t,\n className: "usa-tooltip",\n role: "tooltip"\n }, M, n.default.createElement("span", {\n "data-testid": "tooltipBody",\n title: y,\n id: a.current,\n ref: r,\n className: _\n }, y));\n }\n\n m = (0, n.useRef)(null), y = e.label, b = e.position, O = e.children;\n\n var N = c(e, ["label", "position", "children"]),\n E = (_ = (0, o.default)("usa-tooltip__body", {\n "is-set": d,\n "usa-tooltip__body--top": "top" === b,\n "usa-tooltip__body--bottom": "bottom" === b,\n "usa-tooltip__body--right": "right" === b,\n "usa-tooltip__body--left": "left" === b,\n "is-visible": d\n }), function () {\n f(!0);\n }),\n P = function P() {\n f(!1);\n };\n\n return p(m, b), n.default.createElement("span", {\n "data-testid": "tooltipWrapper",\n ref: t,\n className: "usa-tooltip",\n role: "tooltip"\n }, n.default.createElement("button", _u({}, N, {\n "data-testid": "triggerElement",\n ref: m,\n "aria-describedby": a.current,\n type: "button",\n className: "usa-button usa-tooltip__trigger",\n title: y,\n onMouseEnter: E,\n onMouseOver: E,\n onFocus: E,\n onMouseLeave: P,\n onBlur: P,\n onKeyDown: P\n }), O), n.default.createElement("span", {\n "data-testid": "tooltipBody",\n title: y,\n id: a.current,\n ref: r,\n className: _\n }, y));\n }\n\n d.defaultProps = {\n position: "top"\n }, d.DisplayName = "Tooltip";\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.isElementInViewport = void 0;\n\n t.isElementInViewport = function (e, t, r) {\n void 0 === t && (t = window), void 0 === r && (r = document.documentElement);\n var a = e.getBoundingClientRect();\n return a.top >= 0 && a.left >= 0 && a.bottom <= (t.innerHeight || r.clientHeight) && a.right <= (t.innerWidth || r.clientWidth);\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.SideNav = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n t.SideNav = function (e) {\n var t = e.items,\n r = e.isSubnav,\n o = void 0 !== r && r,\n i = (0, n.default)({\n "usa-sidenav": !o,\n "usa-sidenav__sublist": o\n });\n return a.default.createElement("ul", {\n className: i,\n "data-testid": "sidenav"\n }, t.map(function (e, t) {\n return a.default.createElement("li", {\n key: "sidenav_item_" + t,\n className: "usa-sidenav__item"\n }, e);\n }));\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.Collection = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i7 = function i() {\n return (_i7 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.Collection = function (e) {\n var t = e.children,\n r = e.className,\n o = e.condensed,\n u = l(e, ["children", "className", "condensed"]),\n c = (0, n.default)("usa-collection", {\n "usa-collection--condensed": o\n }, r);\n return a.default.createElement("ul", _i7({\n className: c,\n "data-testid": "collection"\n }, u), t);\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.CollectionItem = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i8 = function i() {\n return (_i8 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.CollectionItem = function (e) {\n var t = e.className,\n r = e.children,\n o = e.variantComponent,\n u = l(e, ["className", "children", "variantComponent"]),\n c = (0, n.default)("usa-collection__item", t);\n return a.default.createElement("li", _i8({\n className: c\n }, u), o, a.default.createElement("div", {\n className: "usa-collection__body"\n }, r));\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.CollectionHeading = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i9 = function i() {\n return (_i9 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.CollectionHeading = function (e) {\n var t = e.headingLevel,\n r = e.className,\n o = e.children,\n u = l(e, ["headingLevel", "className", "children"]),\n c = t || "h3",\n s = (0, n.default)("usa-collection__heading", r);\n return a.default.createElement(c, _i9({\n className: s\n }, u), o);\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.CollectionDescription = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i10 = function i() {\n return (_i10 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.CollectionDescription = function (e) {\n var t = e.className,\n r = e.children,\n o = l(e, ["className", "children"]),\n u = (0, n.default)("usa-collection__description", t);\n return a.default.createElement("p", _i10({\n className: u\n }, o), r);\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.CollectionMeta = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i11 = function i() {\n return (_i11 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.CollectionMeta = function (e) {\n var t = e.className,\n r = e.children,\n o = l(e, ["className", "children"]),\n u = (0, n.default)("usa-collection__meta", t);\n return a.default.createElement("ul", _i11({\n className: u\n }, o), r);\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.CollectionMetaItem = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i12 = function i() {\n return (_i12 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.CollectionMetaItem = function (e) {\n var t = e.className,\n r = e.children,\n o = l(e, ["className", "children"]),\n u = (0, n.default)("usa-collection__meta-item", t);\n return a.default.createElement("li", _i12({\n className: u\n }, o), r);\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.CollectionMetaItemTag = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i13 = function i() {\n return (_i13 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.CollectionMetaItemTag = function (e) {\n var t = e.className,\n r = e.children,\n o = e.tagStyle,\n u = l(e, ["className", "children", "tagStyle"]),\n c = (0, n.default)("usa-collection__meta-item", "usa-tag", {\n "usa-tag--new": "new" === o\n }, t);\n return a.default.createElement("li", _i13({\n className: c\n }, u), r);\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.CollectionThumbnail = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i14 = function i() {\n return (_i14 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.CollectionThumbnail = function (e) {\n var t = e.className,\n r = e.src,\n o = e.alt,\n u = l(e, ["className", "src", "alt"]),\n c = (0, n.default)("usa-collection__img", t);\n return a.default.createElement("img", _i14({\n className: c,\n src: r,\n alt: o\n }, u));\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.CollectionCalendarDate = void 0;\n var a,\n n = (a = r(0)) && a.__esModule ? a : {\n default: a\n };\n var o = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];\n\n t.CollectionCalendarDate = function (e) {\n var t = e.datetime,\n r = new Date(t);\n return r && r.getTime && isNaN(r.getTime()) ? n.default.createElement(n.default.Fragment, null) : n.default.createElement("div", {\n className: "usa-collection__calendar-date",\n "data-testid": "collection-calendar-date"\n }, n.default.createElement("time", {\n dateTime: t\n }, n.default.createElement("span", {\n className: "usa-collection__calendar-date-month"\n }, o[r.getMonth()]), n.default.createElement("span", {\n className: "usa-collection__calendar-date-day"\n }, r.getDate())));\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.isCustomProps = u, t.GridContainer = function (e) {\n if (u(e)) {\n var t = e.className,\n r = e.containerSize,\n n = e.asCustom,\n o = e.children,\n s = l(e, ["className", "containerSize", "asCustom", "children"]),\n d = c(t, r);\n return a.default.createElement(n, _i15({\n "data-testid": "gridContainer",\n className: d\n }, s), o);\n }\n\n t = e.className, r = e.containerSize, o = e.children, s = l(e, ["className", "containerSize", "children"]), d = c(t, r);\n return a.default.createElement("div", _i15({\n "data-testid": "gridContainer",\n className: d\n }, s), o);\n };\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i15 = function i() {\n return (_i15 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n function u(e) {\n return "asCustom" in e;\n }\n\n function c(e, t) {\n var r;\n return (0, n.default)(((r = {\n "grid-container": !t\n })["grid-container-" + t] = !!t, r), e);\n }\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.breakpoints = void 0;\n t.breakpoints = {\n mobile: "mobile",\n mobileLg: "mobile-lg",\n tablet: "tablet",\n tabletLg: "tablet-lg",\n desktop: "desktop",\n desktopLg: "desktop-lg",\n widescreen: "widescreen"\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.CharacterCount = void 0;\n\n var a,\n n = function (e, t) {\n if (!t && e && e.__esModule) return e;\n if (null === e || "object" != typeof e && "function" != typeof e) return {\n default: e\n };\n var r = u(t);\n if (r && r.has(e)) return r.get(e);\n var a = {},\n n = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n for (var o in e) {\n if ("default" !== o && Object.prototype.hasOwnProperty.call(e, o)) {\n var i = n ? Object.getOwnPropertyDescriptor(e, o) : null;\n i && (i.get || i.set) ? Object.defineProperty(a, o, i) : a[o] = e[o];\n }\n }\n\n a.default = e, r && r.set(e, a);\n return a;\n }(r(0)),\n o = (a = r(1)) && a.__esModule ? a : {\n default: a\n },\n i = r(7),\n l = r(16);\n\n function u(e) {\n if ("function" != typeof WeakMap) return null;\n var t = new WeakMap(),\n r = new WeakMap();\n return (u = function u(e) {\n return e ? r : t;\n })(e);\n }\n\n var _c = function c() {\n return (_c = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n s = function s(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n d = function d(e) {\n return Array.from(e).length;\n },\n f = function f(e, t) {\n var r = t + " characters allowed",\n a = t - e;\n\n switch (a) {\n case t:\n return r;\n\n case 1:\n return "$0 character left".replace("$0", "1");\n\n case -1:\n return "$0 character over limit".replace("$0", "1");\n\n default:\n return a >= 0 ? "$0 characters left".replace("$0", a.toString()) : "$0 characters over limit".replace("$0", Math.abs(a).toString());\n }\n },\n p = function p(e) {\n var t = e.id,\n r = e.name,\n a = e.className,\n u = e.maxLength,\n p = e.defaultValue,\n m = void 0 === p ? "" : p,\n y = e.isTextArea,\n b = void 0 !== y && y,\n v = e.getCharacterCount,\n O = void 0 === v ? d : v,\n g = e.getMessage,\n _ = void 0 === g ? f : g,\n h = s(e, ["id", "name", "className", "maxLength", "defaultValue", "isTextArea", "getCharacterCount", "getMessage"]),\n j = O(m),\n M = (0, n.useState)(j),\n N = M[0],\n E = M[1],\n P = (0, n.useState)(_(j, u)),\n w = P[0],\n I = P[1],\n D = (0, n.useState)(j < u),\n S = D[0],\n x = D[1],\n k = (0, o.default)("usa-character-count__field", a),\n A = (0, o.default)("usa-hint", "usa-character-count__message", {\n "usa-character-count__message--invalid": !S\n });\n\n (0, n.useEffect)(function () {\n I(_(N, u)), x(N <= u);\n }, [N]);\n\n var T,\n C = function C(e, t) {\n var r = S ? "" : "The content is too long.";\n e.target.setCustomValidity(r), t && t(e);\n },\n L = function L(e, t) {\n var r = e.target.value;\n E(O(void 0 === r ? "" : r)), t && t(e);\n };\n\n if (b) {\n var F = h,\n R = F.onBlur,\n U = F.onChange,\n W = F.inputRef,\n B = s(F, ["onBlur", "onChange", "inputRef"]);\n T = n.default.createElement(l.Textarea, _c({\n id: t,\n name: r,\n className: k,\n defaultValue: m,\n onBlur: function onBlur(e) {\n return C(e, R);\n },\n onChange: function onChange(e) {\n return L(e, U);\n },\n inputRef: W\n }, B));\n } else {\n var z = h,\n Y = z.onBlur,\n G = z.onChange,\n V = (W = z.inputRef, z.type),\n H = void 0 === V ? "text" : V,\n Q = s(z, ["onBlur", "onChange", "inputRef", "type"]);\n T = n.default.createElement(i.TextInput, _c({\n id: t,\n type: H,\n name: r,\n className: k,\n defaultValue: m,\n onBlur: function onBlur(e) {\n return C(e, Y);\n },\n onChange: function onChange(e) {\n return L(e, G);\n },\n inputRef: W\n }, Q));\n }\n\n return n.default.createElement(n.default.Fragment, null, T, n.default.createElement("span", {\n "data-testid": "characterCountMessage",\n id: t + "-info",\n className: A,\n "aria-live": "polite"\n }, w));\n };\n\n t.CharacterCount = p;\n var m = p;\n t.default = m;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.Checkbox = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i16 = function i() {\n return (_i16 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.id,\n r = e.name,\n o = e.className,\n u = e.label,\n c = e.inputRef,\n s = e.tile,\n d = e.labelDescription,\n f = l(e, ["id", "name", "className", "label", "inputRef", "tile", "labelDescription"]),\n p = (0, n.default)("usa-checkbox", o),\n m = (0, n.default)("usa-checkbox__input", {\n "usa-checkbox__input--tile": s\n });\n return a.default.createElement("div", {\n "data-testid": "checkbox",\n className: p\n }, a.default.createElement("input", _i16({\n className: m,\n id: t,\n type: "checkbox",\n name: r,\n ref: c\n }, f)), a.default.createElement("label", {\n className: "usa-checkbox__label",\n htmlFor: t\n }, u, d && a.default.createElement("span", {\n className: "usa-checkbox__label-description"\n }, d)));\n };\n\n t.Checkbox = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.useComboBox = t.ActionTypes = void 0;\n\n var a,\n n = r(0),\n o = r(11),\n i = r(50),\n _l8 = function l() {\n return (_l8 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n };\n\n t.ActionTypes = a, function (e) {\n e[e.SELECT_OPTION = 0] = "SELECT_OPTION", e[e.CLEAR = 1] = "CLEAR", e[e.OPEN_LIST = 2] = "OPEN_LIST", e[e.CLOSE_LIST = 3] = "CLOSE_LIST", e[e.FOCUS_OPTION = 4] = "FOCUS_OPTION", e[e.UPDATE_FILTER = 5] = "UPDATE_FILTER", e[e.BLUR = 6] = "BLUR";\n }(a || (t.ActionTypes = a = {}));\n\n t.useComboBox = function (e, t, r, u) {\n return (0, n.useReducer)(function (e, n) {\n switch (n.type) {\n case a.SELECT_OPTION:\n return _l8(_l8({}, e), {\n isOpen: !1,\n selectedOption: n.option,\n focusMode: o.FocusMode.Input,\n inputValue: n.option.label,\n filteredOptions: t,\n focusedOption: n.option\n });\n\n case a.UPDATE_FILTER:\n var c = (p = n.value, m = (0, i.generateDynamicRegExp)(u.filter, p, u.extras), y = t.filter(function (e) {\n return m.test(e.label.toLowerCase());\n }), r ? {\n closestMatch: y.length > 0 ? y[0] : t[0],\n optionsToDisplay: t\n } : {\n closestMatch: y[0],\n optionsToDisplay: y\n }),\n s = c.closestMatch,\n d = c.optionsToDisplay,\n f = _l8(_l8({}, e), {\n isOpen: !0,\n filteredOptions: d,\n inputValue: n.value\n });\n\n return r || !e.selectedOption ? f.focusedOption = s : e.selectedOption && (f.filteredOptions.includes(e.selectedOption) ? f.focusedOption = e.selectedOption : f.focusedOption = s), f;\n\n case a.OPEN_LIST:\n return _l8(_l8({}, e), {\n isOpen: !0,\n focusMode: o.FocusMode.Input,\n focusedOption: e.selectedOption || e.focusedOption || t[0]\n });\n\n case a.CLOSE_LIST:\n f = _l8(_l8({}, e), {\n isOpen: !1,\n focusMode: o.FocusMode.Input,\n focusedOption: void 0\n });\n return 0 === e.filteredOptions.length && (f.filteredOptions = t, f.inputValue = ""), e.selectedOption && (f.inputValue = e.selectedOption.label), f;\n\n case a.FOCUS_OPTION:\n return _l8(_l8({}, e), {\n isOpen: !0,\n focusedOption: n.option,\n focusMode: o.FocusMode.Item\n });\n\n case a.CLEAR:\n return _l8(_l8({}, e), {\n inputValue: "",\n isOpen: !1,\n focusMode: o.FocusMode.Input,\n selectedOption: void 0,\n filteredOptions: t,\n focusedOption: t[0]\n });\n\n case a.BLUR:\n f = _l8(_l8({}, e), {\n isOpen: !1,\n focusMode: o.FocusMode.None,\n filteredOptions: t\n });\n return e.selectedOption ? (f.inputValue = e.selectedOption.label, f.focusedOption = e.selectedOption) : (f.inputValue = "", f.focusedOption = t[0]), f;\n\n default:\n throw new Error();\n }\n\n var p, m, y;\n }, e);\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.generateDynamicRegExp = void 0;\n\n t.generateDynamicRegExp = function (e, t, r) {\n void 0 === t && (t = ""), void 0 === r && (r = {});\n\n var a = function a(e) {\n return e.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, "\\\\$&");\n },\n n = e.replace(/{{(.*?)}}/g, function (e, n) {\n var o = n.trim(),\n i = r[o];\n\n if ("query" !== o && i) {\n var l = new RegExp(i, "i"),\n u = t.match(l);\n return u ? a(u[1]) : "";\n }\n\n return a(t);\n });\n\n return n = "^(?:" + n + ")$", new RegExp(n, "i");\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.DateInput = void 0;\n var a = u(r(0)),\n n = u(r(1)),\n o = r(7),\n i = r(5),\n l = r(8);\n\n function u(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _c2 = function c() {\n return (_c2 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n s = function s(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n d = function d(e) {\n var t = e.id,\n r = e.name,\n u = e.label,\n d = e.unit,\n f = e.maxLength,\n p = e.minLength,\n m = e.className,\n y = s(e, ["id", "name", "label", "unit", "maxLength", "minLength", "className"]),\n b = (0, n.default)({\n "usa-form-group--month": "month" == d,\n "usa-form-group--day": "day" == d,\n "usa-form-group--year": "year" == d\n }),\n v = (0, n.default)("usa-input--inline", m);\n return a.default.createElement(l.FormGroup, {\n className: b\n }, a.default.createElement(i.Label, {\n htmlFor: t\n }, u), a.default.createElement(o.TextInput, _c2({}, y, {\n className: v,\n id: t,\n name: r,\n type: "text",\n maxLength: f,\n minLength: p,\n pattern: "[0-9]*",\n inputMode: "numeric"\n })));\n };\n\n t.DateInput = d;\n var f = d;\n t.default = f;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.DateInputGroup = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i17 = function i() {\n return (_i17 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.children,\n r = e.className,\n o = l(e, ["children", "className"]),\n u = (0, n.default)("usa-memorable-date", r);\n return a.default.createElement("div", _i17({\n className: u\n }, o, {\n "data-testid": "dateInputGroup"\n }), t);\n };\n\n t.DateInputGroup = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.Calendar = void 0;\n\n var a = function (e, t) {\n if (!t && e && e.__esModule) return e;\n if (null === e || "object" != typeof e && "function" != typeof e) return {\n default: e\n };\n var r = s(t);\n if (r && r.has(e)) return r.get(e);\n var a = {},\n n = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n for (var o in e) {\n if ("default" !== o && Object.prototype.hasOwnProperty.call(e, o)) {\n var i = n ? Object.getOwnPropertyDescriptor(e, o) : null;\n i && (i.get || i.set) ? Object.defineProperty(a, o, i) : a[o] = e[o];\n }\n }\n\n a.default = e, r && r.set(e, a);\n return a;\n }(r(0)),\n n = r(3),\n o = r(54),\n i = r(55),\n l = r(56),\n u = r(12),\n c = r(9);\n\n function s(e) {\n if ("function" != typeof WeakMap) return null;\n var t = new WeakMap(),\n r = new WeakMap();\n return (s = function s(e) {\n return e ? r : t;\n })(e);\n }\n\n var d = "DATE_PICKER",\n f = "MONTH_PICKER",\n p = "YEAR_PICKER",\n m = function m(e) {\n var t = e.date,\n r = e.selectedDate,\n s = e.handleSelectDate,\n m = e.minDate,\n y = e.maxDate,\n b = e.rangeDate,\n v = e.setStatuses,\n O = e.focusMode,\n g = e.i18n,\n _ = void 0 === g ? c.EN_US : g,\n h = (0, a.useRef)(null),\n j = (0, a.useRef)(null),\n M = (0, a.useRef)(null),\n N = (0, a.useRef)(null),\n E = (0, a.useRef)(null),\n P = (0, a.useRef)(null),\n w = (0, a.useRef)(null),\n I = (0, a.useRef)(null),\n D = (0, a.useState)(t || (0, n.today)()),\n S = D[0],\n x = D[1],\n k = (0, a.useState)(d),\n A = k[0],\n T = k[1],\n C = (0, a.useState)([null, null]),\n L = C[0],\n F = C[1],\n R = !0,\n U = (0, n.addDays)(S, 0),\n W = S.getMonth(),\n B = S.getFullYear(),\n z = _.months[parseInt("" + W)],\n Y = _.daysOfWeekShort,\n G = _.daysOfWeek,\n V = _.backOneYear,\n H = _.backOneMonth,\n Q = z + ". " + _.clickToSelectMonth,\n K = B + ". " + _.clickToSelectYear,\n Z = _.forwardOneMonth,\n X = _.forwardOneYear;\n\n if ((0, a.useEffect)(function () {\n R = !1;\n }, []), (0, a.useEffect)(function () {\n t && A === d && x(t);\n }, [t]), (0, a.useEffect)(function () {\n if (O !== u.FocusMode.Input) {\n var e = L[0],\n t = L[1];\n if (e && t) e.disabled ? t.focus() : e.focus(), F([null, null]);else {\n var a = I.current && I.current.querySelector(".usa-date-picker__calendar__date--focused");\n a && a.focus();\n }\n }\n\n if (R) {\n var o = [z + " " + B];\n\n if (r && (0, n.isSameDay)(U, r)) {\n var i = _.selectedDate;\n o.unshift(i);\n }\n\n v(o);\n }\n }, [S]), A === f) return a.default.createElement(i.MonthPicker, {\n date: S,\n minDate: m,\n maxDate: y,\n handleSelectMonth: function handleSelectMonth(e) {\n var t = (0, n.setMonth)(S, e);\n t = (0, n.keepDateBetweenMinAndMax)(t, m, y), x(t), T(d);\n },\n i18n: _\n });\n if (A === p) return a.default.createElement(l.YearPicker, {\n date: S,\n minDate: m,\n maxDate: y,\n handleSelectYear: function handleSelectYear(e) {\n var t = (0, n.setYear)(S, e);\n t = (0, n.keepDateBetweenMinAndMax)(t, m, y), x(t), T(d);\n },\n setStatuses: v\n });\n\n for (var J = (0, n.subMonths)(S, 1), q = (0, n.addMonths)(S, 1), $ = (0, n.startOfMonth)(S), ee = (0, n.isSameMonth)(S, m), te = y && (0, n.isSameMonth)(S, y), re = r || S, ae = b && (0, n.min)(re, b), ne = b && (0, n.max)(re, b), oe = ae && (0, n.addDays)(ae, 1), ie = ne && (0, n.subDays)(ne, 1), le = function le(e) {\n var t;\n\n switch (e.key) {\n case "ArrowUp":\n case "Up":\n t = (0, n.subWeeks)(S, 1);\n break;\n\n case "ArrowDown":\n case "Down":\n t = (0, n.addWeeks)(S, 1);\n break;\n\n case "ArrowLeft":\n case "Left":\n t = (0, n.subDays)(S, 1);\n break;\n\n case "ArrowRight":\n case "Right":\n t = (0, n.addDays)(S, 1);\n break;\n\n case "Home":\n t = (0, n.startOfWeek)(S);\n break;\n\n case "End":\n t = (0, n.endOfWeek)(S);\n break;\n\n case "PageDown":\n t = e.shiftKey ? (0, n.addYears)(S, 1) : (0, n.addMonths)(S, 1);\n break;\n\n case "PageUp":\n t = e.shiftKey ? (0, n.subYears)(S, 1) : (0, n.subMonths)(S, 1);\n break;\n\n default:\n return;\n }\n\n if (void 0 !== t) {\n var r = (0, n.keepDateBetweenMinAndMax)(t, m, y);\n (0, n.isSameDay)(S, r) || x(t);\n }\n\n e.preventDefault();\n }, ue = function ue(e) {\n e !== S && x(e);\n }, ce = [], se = (0, n.startOfWeek)($); ce.length < 28 || se.getMonth() === W || ce.length % 7 != 0;) {\n var de = (0, n.isSameDay)(se, U);\n ce.push(a.default.createElement(o.Day, {\n date: se,\n onClick: s,\n onKeyDown: le,\n onMouseMove: ue,\n ref: de ? w : null,\n isDisabled: !(0, n.isDateWithinMinAndMax)(se, m, y),\n isSelected: r && (0, n.isSameDay)(se, r),\n isFocused: de,\n isPrevMonth: (0, n.isSameMonth)(se, J),\n isFocusedMonth: (0, n.isSameMonth)(se, U),\n isNextMonth: (0, n.isSameMonth)(se, q),\n isToday: (0, n.isSameDay)(se, (0, n.today)()),\n isRangeDate: b && (0, n.isSameDay)(se, b),\n isRangeStart: ae && (0, n.isSameDay)(se, ae),\n isRangeEnd: ne && (0, n.isSameDay)(se, ne),\n isWithinRange: oe && ie && (0, n.isDateWithinMinAndMax)(se, oe, ie),\n i18n: _\n })), se = (0, n.addDays)(se, 1);\n }\n\n return a.default.createElement("div", {\n tabIndex: -1,\n className: "usa-date-picker__calendar__date-picker",\n "data-testid": "calendar-date-picker",\n ref: I,\n onKeyDown: function onKeyDown(e) {\n (0, n.handleTabKey)(e, [null == h ? void 0 : h.current, null == j ? void 0 : j.current, null == E ? void 0 : E.current, null == P ? void 0 : P.current, null == M ? void 0 : M.current, null == N ? void 0 : N.current, null == w ? void 0 : w.current]);\n }\n }, a.default.createElement("div", {\n className: "usa-date-picker__calendar__row"\n }, a.default.createElement("div", {\n className: "usa-date-picker__calendar__cell usa-date-picker__calendar__cell--center-items"\n }, a.default.createElement("button", {\n type: "button",\n "data-testid": "previous-year",\n onClick: function onClick() {\n var e = (0, n.subYears)(S, 1);\n e = (0, n.keepDateBetweenMinAndMax)(e, m, y), x(e), F([h.current, I.current]);\n },\n ref: h,\n className: "usa-date-picker__calendar__previous-year",\n "aria-label": V,\n disabled: ee\n }, " ")), a.default.createElement("div", {\n className: "usa-date-picker__calendar__cell usa-date-picker__calendar__cell--center-items"\n }, a.default.createElement("button", {\n type: "button",\n "data-testid": "previous-month",\n onClick: function onClick() {\n var e = (0, n.subMonths)(S, 1);\n e = (0, n.keepDateBetweenMinAndMax)(e, m, y), x(e), F([j.current, I.current]);\n },\n ref: j,\n className: "usa-date-picker__calendar__previous-month",\n "aria-label": H,\n disabled: ee\n }, " ")), a.default.createElement("div", {\n className: "usa-date-picker__calendar__cell usa-date-picker__calendar__month-label"\n }, a.default.createElement("button", {\n type: "button",\n "data-testid": "select-month",\n onClick: function onClick() {\n T(f);\n var e = _.selectAMonth;\n v([e]);\n },\n ref: E,\n className: "usa-date-picker__calendar__month-selection",\n "aria-label": Q\n }, z), a.default.createElement("button", {\n type: "button",\n "data-testid": "select-year",\n onClick: function onClick() {\n T(p);\n },\n ref: P,\n className: "usa-date-picker__calendar__year-selection",\n "aria-label": K\n }, B)), a.default.createElement("div", {\n className: "usa-date-picker__calendar__cell usa-date-picker__calendar__cell--center-items"\n }, a.default.createElement("button", {\n type: "button",\n "data-testid": "next-month",\n onClick: function onClick() {\n var e = (0, n.addMonths)(S, 1);\n e = (0, n.keepDateBetweenMinAndMax)(e, m, y), x(e), F([M.current, I.current]);\n },\n ref: M,\n className: "usa-date-picker__calendar__next-month",\n "aria-label": Z,\n disabled: te\n }, " ")), a.default.createElement("div", {\n className: "usa-date-picker__calendar__cell usa-date-picker__calendar__cell--center-items"\n }, a.default.createElement("button", {\n type: "button",\n "data-testid": "next-year",\n onClick: function onClick() {\n var e = (0, n.addYears)(S, 1);\n e = (0, n.keepDateBetweenMinAndMax)(e, m, y), x(e), F([N.current, I.current]);\n },\n ref: N,\n className: "usa-date-picker__calendar__next-year",\n "aria-label": X,\n disabled: te\n }, " "))), a.default.createElement("table", {\n className: "usa-date-picker__calendar__table",\n role: "presentation"\n }, a.default.createElement("thead", null, a.default.createElement("tr", null, Y.map(function (e, t) {\n return a.default.createElement("th", {\n className: "usa-date-picker__calendar__day-of-week",\n scope: "col",\n "aria-label": G[parseInt("" + t)],\n key: "day-of-week-" + e + "-" + t\n }, e);\n }))), a.default.createElement("tbody", null, (0, n.listToTable)(ce, 7))));\n };\n\n t.Calendar = m, m.displayName = "Calendar";\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.Day = void 0;\n\n var a,\n n = function (e, t) {\n if (!t && e && e.__esModule) return e;\n if (null === e || "object" != typeof e && "function" != typeof e) return {\n default: e\n };\n var r = u(t);\n if (r && r.has(e)) return r.get(e);\n var a = {},\n n = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n for (var o in e) {\n if ("default" !== o && Object.prototype.hasOwnProperty.call(e, o)) {\n var i = n ? Object.getOwnPropertyDescriptor(e, o) : null;\n i && (i.get || i.set) ? Object.defineProperty(a, o, i) : a[o] = e[o];\n }\n }\n\n a.default = e, r && r.set(e, a);\n return a;\n }(r(0)),\n o = (a = r(1)) && a.__esModule ? a : {\n default: a\n },\n i = r(3),\n l = r(9);\n\n function u(e) {\n if ("function" != typeof WeakMap) return null;\n var t = new WeakMap(),\n r = new WeakMap();\n return (u = function u(e) {\n return e ? r : t;\n })(e);\n }\n\n var c = (0, n.forwardRef)(function (e, t) {\n var r = e.date,\n a = e.onClick,\n u = e.onKeyDown,\n c = e.onMouseMove,\n s = e.isDisabled,\n d = void 0 !== s && s,\n f = e.isSelected,\n p = void 0 !== f && f,\n m = e.isFocused,\n y = void 0 !== m && m,\n b = e.isPrevMonth,\n v = void 0 !== b && b,\n O = e.isFocusedMonth,\n g = void 0 !== O && O,\n _ = e.isNextMonth,\n h = void 0 !== _ && _,\n j = e.isToday,\n M = void 0 !== j && j,\n N = e.isRangeDate,\n E = void 0 !== N && N,\n P = e.isRangeStart,\n w = void 0 !== P && P,\n I = e.isRangeEnd,\n D = void 0 !== I && I,\n S = e.isWithinRange,\n x = void 0 !== S && S,\n k = e.i18n,\n A = void 0 === k ? l.EN_US : k,\n T = r.getDate(),\n C = r.getMonth(),\n L = r.getFullYear(),\n F = r.getDay(),\n R = (0, i.formatDate)(r),\n U = y ? 0 : -1,\n W = (0, o.default)("usa-date-picker__calendar__date", {\n "usa-date-picker__calendar__date--previous-month": v,\n "usa-date-picker__calendar__date--current-month": g,\n "usa-date-picker__calendar__date--next-month": h,\n "usa-date-picker__calendar__date--selected": p,\n "usa-date-picker__calendar__date--today": M,\n "usa-date-picker__calendar__date--focused": y,\n "usa-date-picker__calendar__date--range-date": E,\n "usa-date-picker__calendar__date--range-date-start": w,\n "usa-date-picker__calendar__date--range-date-end": D,\n "usa-date-picker__calendar__date--within-range": x\n }),\n B = A.months[parseInt("" + C)],\n z = A.daysOfWeek[parseInt("" + F)];\n return n.default.createElement("button", {\n type: "button",\n "data-testid": "select-date",\n ref: t,\n onClick: function onClick() {\n a(R);\n },\n tabIndex: U,\n className: W,\n "data-day": T,\n "data-month": C + 1,\n "data-year": L,\n "data-value": R,\n "aria-label": T + " " + B + " " + L + " " + z,\n "aria-selected": !!p,\n disabled: d,\n onKeyDown: function onKeyDown(e) {\n u(e);\n },\n onMouseMove: g ? function () {\n d || (0, i.isIosDevice)() || c(r);\n } : void 0\n }, T);\n });\n t.Day = c, c.displayName = "Day";\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.MonthPicker = void 0;\n\n var a,\n n = function (e, t) {\n if (!t && e && e.__esModule) return e;\n if (null === e || "object" != typeof e && "function" != typeof e) return {\n default: e\n };\n var r = u(t);\n if (r && r.has(e)) return r.get(e);\n var a = {},\n n = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n for (var o in e) {\n if ("default" !== o && Object.prototype.hasOwnProperty.call(e, o)) {\n var i = n ? Object.getOwnPropertyDescriptor(e, o) : null;\n i && (i.get || i.set) ? Object.defineProperty(a, o, i) : a[o] = e[o];\n }\n }\n\n a.default = e, r && r.set(e, a);\n return a;\n }(r(0)),\n o = (a = r(1)) && a.__esModule ? a : {\n default: a\n },\n i = r(3),\n l = r(9);\n\n function u(e) {\n if ("function" != typeof WeakMap) return null;\n var t = new WeakMap(),\n r = new WeakMap();\n return (u = function u(e) {\n return e ? r : t;\n })(e);\n }\n\n var c = function c(e) {\n var t = e.date,\n r = e.minDate,\n a = e.maxDate,\n u = e.handleSelectMonth,\n c = e.i18n,\n s = void 0 === c ? l.EN_US : c,\n d = t.getMonth(),\n f = (0, n.useState)(d),\n p = f[0],\n m = f[1],\n y = (0, n.useRef)(null),\n b = (0, n.useRef)(null);\n (0, n.useEffect)(function () {\n var e = y.current && y.current.querySelector(\'[data-value="\' + p + \'"]\');\n e && e.focus();\n }, [p]);\n\n var v = function v(e) {\n var n,\n o,\n l = e.target,\n u = parseInt((null === (n = l.dataset) || void 0 === n ? void 0 : n.value) || "", 10),\n c = (0, i.setMonth)(t, u);\n\n switch (e.key) {\n case "ArrowUp":\n case "Up":\n o = u - 3;\n break;\n\n case "ArrowDown":\n case "Down":\n o = u + 3;\n break;\n\n case "ArrowLeft":\n case "Left":\n o = u - 1;\n break;\n\n case "ArrowRight":\n case "Right":\n o = u + 1;\n break;\n\n case "Home":\n o = u - u % 3;\n break;\n\n case "End":\n o = u + 2 - u % 3;\n break;\n\n case "PageDown":\n o = 11;\n break;\n\n case "PageUp":\n o = 0;\n break;\n\n default:\n return;\n }\n\n if (void 0 !== o) {\n o = Math.max(0, Math.min(11, o));\n var s = (0, i.setMonth)(t, o),\n d = (0, i.keepDateBetweenMinAndMax)(s, r, a);\n (0, i.isSameMonth)(c, d) || m(d.getMonth());\n }\n\n e.preventDefault();\n },\n O = s.months.map(function (e, l) {\n var c = (0, i.setMonth)(t, l),\n s = (0, i.isDatesMonthOutsideMinOrMax)(c, r, a),\n f = l === d,\n y = l === p,\n O = y ? 0 : -1,\n g = (0, o.default)("usa-date-picker__calendar__month", {\n "usa-date-picker__calendar__month--selected": f,\n "usa-date-picker__calendar__month--focused": y\n });\n return n.default.createElement("button", {\n type: "button",\n key: "selectMonth_" + e,\n ref: y ? b : null,\n tabIndex: O,\n className: g,\n "data-value": l,\n "data-label": e,\n "aria-selected": f,\n disabled: s,\n onClick: function onClick() {\n u(l);\n },\n onKeyDown: v,\n onMouseMove: function onMouseMove() {\n s || (0, i.isIosDevice)() || l !== p && m(l);\n }\n }, e);\n });\n\n return n.default.createElement("div", {\n tabIndex: -1,\n "data-testid": "calendar-month-picker",\n className: "usa-date-picker__calendar__month-picker",\n ref: y,\n onKeyDown: function onKeyDown(e) {\n (0, i.handleTabKey)(e, [null == b ? void 0 : b.current]);\n }\n }, n.default.createElement("table", {\n className: "usa-date-picker__calendar__table",\n role: "presentation"\n }, n.default.createElement("tbody", null, (0, i.listToTable)(O, 3))));\n };\n\n t.MonthPicker = c, c.displayName = "MonthPicker";\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.YearPicker = void 0;\n\n var a,\n n = function (e, t) {\n if (!t && e && e.__esModule) return e;\n if (null === e || "object" != typeof e && "function" != typeof e) return {\n default: e\n };\n var r = u(t);\n if (r && r.has(e)) return r.get(e);\n var a = {},\n n = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n for (var o in e) {\n if ("default" !== o && Object.prototype.hasOwnProperty.call(e, o)) {\n var i = n ? Object.getOwnPropertyDescriptor(e, o) : null;\n i && (i.get || i.set) ? Object.defineProperty(a, o, i) : a[o] = e[o];\n }\n }\n\n a.default = e, r && r.set(e, a);\n return a;\n }(r(0)),\n o = (a = r(1)) && a.__esModule ? a : {\n default: a\n },\n i = r(6),\n l = r(3);\n\n function u(e) {\n if ("function" != typeof WeakMap) return null;\n var t = new WeakMap(),\n r = new WeakMap();\n return (u = function u(e) {\n return e ? r : t;\n })(e);\n }\n\n var c = function c(e) {\n var t = e.date,\n r = e.minDate,\n a = e.maxDate,\n u = e.handleSelectYear,\n c = e.setStatuses,\n s = (0, n.useRef)(null),\n d = (0, n.useRef)(null),\n f = (0, n.useRef)(null),\n p = (0, n.useRef)(null),\n m = t.getFullYear(),\n y = (0, n.useState)(m),\n b = y[0],\n v = y[1],\n O = (0, n.useState)([null, null]),\n g = O[0],\n _ = O[1],\n h = b;\n h -= h % i.YEAR_CHUNK, h = Math.max(0, h);\n var j = (0, l.isDatesYearOutsideMinOrMax)((0, l.setYear)(t, h - 1), r, a),\n M = (0, l.isDatesYearOutsideMinOrMax)((0, l.setYear)(t, h + i.YEAR_CHUNK), r, a);\n (0, n.useEffect)(function () {\n var e = "Showing years " + h + " to " + (h + i.YEAR_CHUNK - 1) + ". Select a year.";\n c([e]);\n var t = g[0],\n r = g[1];\n if (t && r) t.disabled ? r.focus() : t.focus(), _([null, null]);else {\n var a = p.current && p.current.querySelector(".usa-date-picker__calendar__year--focused");\n a && a.focus();\n }\n }, [b]), (0, n.useEffect)(function () {\n var e = p.current && p.current.querySelector(\'[data-value="\' + b + \'"]\');\n e && e.focus();\n }, []);\n\n for (var N = function N(e) {\n var n,\n o,\n u = e.target,\n c = parseInt((null === (n = u.dataset) || void 0 === n ? void 0 : n.value) || "", 10),\n s = (0, l.setYear)(t, c);\n\n switch (e.key) {\n case "ArrowUp":\n case "Up":\n o = c - 3;\n break;\n\n case "ArrowDown":\n case "Down":\n o = c + 3;\n break;\n\n case "ArrowLeft":\n case "Left":\n o = c - 1;\n break;\n\n case "ArrowRight":\n case "Right":\n o = c + 1;\n break;\n\n case "Home":\n o = c - c % 3;\n break;\n\n case "End":\n o = c + 2 - c % 3;\n break;\n\n case "PageDown":\n o = c + i.YEAR_CHUNK;\n break;\n\n case "PageUp":\n o = c - i.YEAR_CHUNK;\n break;\n\n default:\n return;\n }\n\n if (void 0 !== o) {\n o = Math.max(0, o);\n var d = (0, l.setYear)(t, o),\n f = (0, l.keepDateBetweenMinAndMax)(d, r, a);\n (0, l.isSameYear)(s, f) || v(f.getFullYear());\n }\n\n e.preventDefault();\n }, E = [], P = h, w = function w() {\n var e = P,\n i = (0, l.isDatesYearOutsideMinOrMax)((0, l.setYear)(t, e), r, a),\n c = e === m,\n s = e === b,\n d = s ? 0 : -1,\n p = (0, o.default)("usa-date-picker__calendar__year", {\n "usa-date-picker__calendar__year--selected": c,\n "usa-date-picker__calendar__year--focused": s\n });\n E.push(n.default.createElement("button", {\n type: "button",\n tabIndex: d,\n ref: s ? f : null,\n className: p,\n "data-value": e,\n "aria-selected": c,\n disabled: i,\n onClick: function onClick() {\n u(e);\n },\n onKeyDown: N,\n onMouseMove: function onMouseMove() {\n i || (0, l.isIosDevice)() || e !== b && v(e);\n }\n }, e)), P += 1;\n }; E.length < i.YEAR_CHUNK;) {\n w();\n }\n\n return n.default.createElement("div", {\n tabIndex: -1,\n className: "usa-date-picker__calendar__year-picker",\n "data-testid": "calendar-year-picker",\n ref: p,\n onKeyDown: function onKeyDown(e) {\n (0, l.handleTabKey)(e, [null == s ? void 0 : s.current, null == f ? void 0 : f.current, null == d ? void 0 : d.current]);\n }\n }, n.default.createElement("table", {\n className: "usa-date-picker__calendar__table",\n role: "presentation"\n }, n.default.createElement("tbody", null, n.default.createElement("tr", null, n.default.createElement("td", null, n.default.createElement("button", {\n type: "button",\n "data-testid": "previous-year-chunk",\n className: "usa-date-picker__calendar__previous-year-chunk",\n "aria-label": "Navigate back " + i.YEAR_CHUNK + " years",\n disabled: j,\n onClick: function onClick() {\n var e = b - i.YEAR_CHUNK;\n e = Math.max(0, e);\n var n = (0, l.setYear)(t, e);\n n = (0, l.keepDateBetweenMinAndMax)(n, r, a), _([s.current, p.current]), v(n.getFullYear());\n },\n ref: s\n }, " ")), n.default.createElement("td", {\n colSpan: 3\n }, n.default.createElement("table", {\n className: "usa-date-picker__calendar__table",\n role: "presentation"\n }, n.default.createElement("tbody", null, (0, l.listToTable)(E, 3)))), n.default.createElement("td", null, n.default.createElement("button", {\n type: "button",\n "data-testid": "next-year-chunk",\n className: "usa-date-picker__calendar__next-year-chunk",\n "aria-label": "Navigate forward " + i.YEAR_CHUNK + " years",\n disabled: M,\n onClick: function onClick() {\n var e = b + i.YEAR_CHUNK;\n e = Math.max(0, e);\n var n = (0, l.setYear)(t, e);\n n = (0, l.keepDateBetweenMinAndMax)(n, r, a), _([d.current, p.current]), v(n.getFullYear());\n },\n ref: d\n }, " "))))));\n };\n\n t.YearPicker = c, c.displayName = "YearPicker";\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.DateRangePicker = void 0;\n\n var a,\n n = (a = r(1)) && a.__esModule ? a : {\n default: a\n },\n o = function (e, t) {\n if (!t && e && e.__esModule) return e;\n if (null === e || "object" != typeof e && "function" != typeof e) return {\n default: e\n };\n var r = d(t);\n if (r && r.has(e)) return r.get(e);\n var a = {},\n n = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n for (var o in e) {\n if ("default" !== o && Object.prototype.hasOwnProperty.call(e, o)) {\n var i = n ? Object.getOwnPropertyDescriptor(e, o) : null;\n i && (i.get || i.set) ? Object.defineProperty(a, o, i) : a[o] = e[o];\n }\n }\n\n a.default = e, r && r.set(e, a);\n return a;\n }(r(0)),\n i = r(6),\n l = r(12),\n u = r(3),\n c = r(8),\n s = r(5);\n\n function d(e) {\n if ("function" != typeof WeakMap) return null;\n var t = new WeakMap(),\n r = new WeakMap();\n return (d = function d(e) {\n return e ? r : t;\n })(e);\n }\n\n var _f2 = function f() {\n return (_f2 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n };\n\n t.DateRangePicker = function (e) {\n var t,\n r,\n a,\n d,\n p,\n m,\n y = e.startDateLabel,\n b = e.startDateHint,\n v = e.startDatePickerProps,\n O = e.endDateLabel,\n g = e.endDateHint,\n _ = e.endDatePickerProps,\n h = e.className,\n j = (0, o.useState)(v.defaultValue),\n M = j[0],\n N = j[1],\n E = (0, o.useState)(_.defaultValue),\n P = E[0],\n w = E[1],\n I = function I(e, t) {\n return function (r) {\n var a = r && (0, u.parseDateString)(r, i.DEFAULT_EXTERNAL_DATE_FORMAT);\n\n if (a) {\n var n = (0, u.formatDate)(a);\n t(n);\n } else t(r);\n\n e && e(r);\n };\n },\n D = I(v.onChange, N),\n S = I(_.onChange, w),\n x = (0, n.default)(h, "usa-date-range-picker"),\n k = (0, n.default)(v.className, "usa-date-range-picker__range-start"),\n A = (0, n.default)(_.className, "usa-date-range-picker__range-end"),\n T = v.id + "-label",\n C = v.id + "-hint",\n L = [y && T, b && C].join(" ").trim() || void 0,\n F = _.id + "-label",\n R = _.id + "-hint",\n U = [O && F, g && R].join(" ").trim() || void 0;\n\n return o.default.createElement("div", {\n className: x,\n "data-testid": "date-range-picker"\n }, o.default.createElement(c.FormGroup, null, y && o.default.createElement(s.Label, {\n id: T,\n htmlFor: v.id\n }, y), b && o.default.createElement("div", {\n className: "usa-hint",\n id: C\n }, b), o.default.createElement(l.DatePicker, _f2({\n className: k,\n rangeDate: P\n }, v, {\n "aria-describedby": L,\n onChange: D,\n maxDate: (d = v.maxDate, p = d && (0, u.parseDateString)(d), m = P && (0, u.parseDateString)(P), m && p ? m.getTime() < p.getTime() ? (0, u.formatDate)(m) : (0, u.formatDate)(p) : m && (0, u.formatDate)(m) || p && (0, u.formatDate)(p) || void 0)\n }))), o.default.createElement(c.FormGroup, null, O && o.default.createElement(s.Label, {\n id: F,\n htmlFor: _.id\n }, O), g && o.default.createElement("div", {\n className: "usa-hint",\n id: R\n }, g), o.default.createElement(l.DatePicker, _f2({\n className: A,\n rangeDate: M\n }, _, {\n "aria-describedby": U,\n onChange: S,\n minDate: (t = _.minDate, r = t && (0, u.parseDateString)(t), a = M && (0, u.parseDateString)(M), a && r ? a.getTime() > r.getTime() ? (0, u.formatDate)(a) : (0, u.formatDate)(r) : a && (0, u.formatDate)(a) || r && (0, u.formatDate)(r) || void 0)\n }))));\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.Dropdown = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i18 = function i() {\n return (_i18 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.id,\n r = e.name,\n o = e.className,\n u = e.inputRef,\n c = e.children,\n s = l(e, ["id", "name", "className", "inputRef", "children"]),\n d = (0, n.default)("usa-select", o);\n return a.default.createElement("select", _i18({\n "data-testid": "dropdown",\n className: d,\n id: t,\n name: r,\n ref: u\n }, s), c);\n };\n\n t.Dropdown = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.ErrorMessage = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var i = function i(e) {\n var t = e.children,\n r = e.className,\n o = e.id,\n i = (0, n.default)("usa-error-message", r);\n return a.default.createElement("span", {\n "data-testid": "errorMessage",\n className: i,\n id: o,\n role: "alert"\n }, t);\n };\n\n t.ErrorMessage = i;\n var l = i;\n t.default = l;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.Fieldset = void 0;\n var a = i(r(0)),\n n = i(r(1)),\n o = r(2);\n\n function i(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n t.Fieldset = function (e) {\n var t = e.children,\n r = e.legend,\n i = e.className,\n l = e.legendSrOnly,\n u = e.legendStyle,\n c = void 0 === u ? "default" : u,\n s = (0, n.default)("usa-fieldset", i);\n l && (0, o.deprecationWarning)("Fieldset property legendSrOnly is deprecated. Use legendStyle = \'srOnly\'.");\n var d = (0, n.default)({\n "usa-legend": "default" === c,\n "usa-legend--large": "large" === c,\n "usa-sr-only": "srOnly" === c || l\n });\n return a.default.createElement("fieldset", {\n "data-testid": "fieldset",\n className: s\n }, r && a.default.createElement("legend", {\n className: d\n }, r), t);\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.FileInput = void 0;\n\n var a,\n n = function (e, t) {\n if (!t && e && e.__esModule) return e;\n if (null === e || "object" != typeof e && "function" != typeof e) return {\n default: e\n };\n var r = u(t);\n if (r && r.has(e)) return r.get(e);\n var a = {},\n n = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n for (var o in e) {\n if ("default" !== o && Object.prototype.hasOwnProperty.call(e, o)) {\n var i = n ? Object.getOwnPropertyDescriptor(e, o) : null;\n i && (i.get || i.set) ? Object.defineProperty(a, o, i) : a[o] = e[o];\n }\n }\n\n a.default = e, r && r.set(e, a);\n return a;\n }(r(0)),\n o = (a = r(1)) && a.__esModule ? a : {\n default: a\n },\n i = r(62),\n l = r(63);\n\n function u(e) {\n if ("function" != typeof WeakMap) return null;\n var t = new WeakMap(),\n r = new WeakMap();\n return (u = function u(e) {\n return e ? r : t;\n })(e);\n }\n\n var _c3 = function c() {\n return (_c3 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n s = function s(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.FileInput = function (e) {\n var t = e.name,\n r = e.id,\n a = e.disabled,\n u = e.multiple,\n d = e.className,\n f = e.accept,\n p = e.onChange,\n m = e.onDrop,\n y = e.inputRef,\n b = s(e, ["name", "id", "disabled", "multiple", "className", "accept", "onChange", "onDrop", "inputRef"]),\n v = (0, n.useState)(!1),\n O = v[0],\n g = v[1],\n _ = (0, n.useState)(!1),\n h = _[0],\n j = _[1],\n M = (0, n.useState)(null),\n N = M[0],\n E = M[1],\n P = (0, o.default)("usa-file-input", {\n "usa-file-input--disabled": a\n }, d),\n w = (0, o.default)("usa-file-input__target", {\n "usa-file-input--drag": O,\n "has-invalid-file": h\n }),\n I = /rv:11.0/i.test(navigator.userAgent) || /Edge\\/\\d./i.test(navigator.userAgent),\n D = u ? "Drag files here or " : "Drag file here or ",\n S = [];\n\n if (N) for (var x = 0; x < (null == N ? void 0 : N.length); x++) {\n var k = (0, l.makeSafeForID)(N[parseInt("" + x)].name),\n A = "filePreview_" + k;\n S.push(n.default.createElement(i.FilePreview, {\n key: A,\n imageId: k,\n file: N[parseInt("" + x)]\n }));\n }\n var T = (0, o.default)("usa-file-input__instructions", {\n "display-none": S.length > 0\n }),\n C = S.length > 1 ? S.length + " files selected" : "Selected file";\n return n.default.createElement("div", {\n "data-testid": "file-input",\n className: P,\n "aria-disabled": a\n }, n.default.createElement("div", {\n "data-testid": "file-input-droptarget",\n className: w,\n onDragOver: function onDragOver() {\n return g(!0);\n },\n onDragLeave: function onDragLeave() {\n return g(!1);\n },\n onDrop: function onDrop(e) {\n !function (e) {\n if (j(!1), f) {\n for (var t = f.split(","), r = !0, a = 0; a < e.dataTransfer.files.length; a += 1) {\n var n = e.dataTransfer.files[parseInt("" + a)];\n if (!r) break;\n\n for (var o = 0; o < t.length; o += 1) {\n var i = t[parseInt("" + o)];\n if (r = n.name.indexOf(i) > 0 || n.type.includes(i.replace(/\\*/g, ""))) break;\n }\n }\n\n r || (E(null), j(!0), e.preventDefault(), e.stopPropagation());\n }\n }(e), g(!1), m && m(e);\n }\n }, S.length > 0 && n.default.createElement("div", {\n "data-testid": "file-input-preview-heading",\n className: "usa-file-input__preview-heading"\n }, C, " ", n.default.createElement("span", {\n className: "usa-file-input__choose"\n }, "Change file", S.length > 1 && "s")), n.default.createElement("div", {\n "data-testid": "file-input-instructions",\n className: T,\n "aria-hidden": "true"\n }, !I && n.default.createElement("span", {\n className: "usa-file-input__drag-text"\n }, D), n.default.createElement("span", {\n className: "usa-file-input__choose"\n }, "choose from folder")), S, n.default.createElement("div", {\n "data-testid": "file-input-box",\n className: "usa-file-input__box"\n }), h && n.default.createElement("div", {\n "data-testid": "file-input-error",\n className: "usa-file-input__accepted-files-message"\n }, "This is not a valid file type."), n.default.createElement("input", _c3({}, b, {\n ref: y,\n type: "file",\n "data-testid": "file-input-input",\n name: t,\n id: r,\n className: "usa-file-input__input",\n disabled: a,\n onChange: function onChange(e) {\n var t;\n j(!1), E(null === (t = e.target) || void 0 === t ? void 0 : t.files), p && p(e);\n },\n multiple: u,\n accept: f\n }))));\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.FilePreview = void 0;\n\n var a,\n n = function (e, t) {\n if (!t && e && e.__esModule) return e;\n if (null === e || "object" != typeof e && "function" != typeof e) return {\n default: e\n };\n var r = i(t);\n if (r && r.has(e)) return r.get(e);\n var a = {},\n n = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n for (var o in e) {\n if ("default" !== o && Object.prototype.hasOwnProperty.call(e, o)) {\n var l = n ? Object.getOwnPropertyDescriptor(e, o) : null;\n l && (l.get || l.set) ? Object.defineProperty(a, o, l) : a[o] = e[o];\n }\n }\n\n a.default = e, r && r.set(e, a);\n return a;\n }(r(0)),\n o = (a = r(1)) && a.__esModule ? a : {\n default: a\n };\n\n function i(e) {\n if ("function" != typeof WeakMap) return null;\n var t = new WeakMap(),\n r = new WeakMap();\n return (i = function i(e) {\n return e ? r : t;\n })(e);\n }\n\n var l = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7";\n\n t.FilePreview = function (e) {\n var t = e.imageId,\n r = e.file,\n a = (0, n.useRef)(new FileReader()),\n i = (0, n.useState)(!0),\n u = i[0],\n c = i[1],\n s = (0, n.useState)(l),\n d = s[0],\n f = s[1],\n p = (0, n.useState)(!1),\n m = p[0],\n y = p[1];\n (0, n.useEffect)(function () {\n return a.current.onloadend = function () {\n c(!1), f(a.current.result);\n }, a.current.readAsDataURL(r), function () {\n a.current.onloadend = null;\n };\n }, []);\n\n var b = r.name,\n v = b.indexOf(".pdf") > 0,\n O = b.indexOf(".doc") > 0 || b.indexOf(".pages") > 0,\n g = b.indexOf(".mov") > 0 || b.indexOf(".mp4") > 0,\n _ = b.indexOf(".xls") > 0 || b.indexOf(".numbers") > 0,\n h = !(v || O || g || _),\n j = (0, o.default)("usa-file-input__preview-image", {\n "is-loading": u,\n "usa-file-input__preview-image--pdf": m && v,\n "usa-file-input__preview-image--word": m && O,\n "usa-file-input__preview-image--video": m && g,\n "usa-file-input__preview-image--excel": m && _,\n "usa-file-input__preview-image--generic": m && h\n });\n\n return n.default.createElement("div", {\n "data-testid": "file-input-preview",\n className: "usa-file-input__preview",\n "aria-hidden": "true"\n }, n.default.createElement("img", {\n id: t,\n "data-testid": "file-input-preview-image",\n src: d,\n alt: "",\n className: j,\n onError: function onError() {\n f(l), y(!0);\n }\n }), b);\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.makeSafeForID = void 0;\n\n t.makeSafeForID = function (e) {\n return e.replace(/[^a-z0-9]/g, function (e) {\n var t = e.charCodeAt(0);\n return 32 === t ? "-" : t >= 65 && t <= 90 ? "img_" + e.toLowerCase() : "__" + t.toString(16).slice(-4);\n });\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.Radio = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i19 = function i() {\n return (_i19 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.id,\n r = e.name,\n o = e.className,\n u = e.label,\n c = e.inputRef,\n s = e.tile,\n d = e.labelDescription,\n f = l(e, ["id", "name", "className", "label", "inputRef", "tile", "labelDescription"]),\n p = (0, n.default)("usa-radio", o),\n m = (0, n.default)("usa-radio__input", {\n "usa-radio__input--tile": s\n });\n return a.default.createElement("div", {\n "data-testid": "radio",\n className: p\n }, a.default.createElement("input", _i19({\n className: m,\n id: t,\n type: "radio",\n name: r,\n ref: c\n }, f)), a.default.createElement("label", {\n className: "usa-radio__label",\n htmlFor: t\n }, u, d && a.default.createElement("span", {\n className: "usa-checkbox__label-description"\n }, d)));\n };\n\n t.Radio = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.RangeInput = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i20 = function i() {\n return (_i20 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.className,\n r = e.inputRef,\n o = l(e, ["className", "inputRef"]),\n u = (0, n.default)("usa-range", t);\n return a.default.createElement("input", _i20({\n "data-testid": "range",\n className: u,\n ref: r,\n type: "range"\n }, o));\n };\n\n t.RangeInput = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.TimePicker = void 0;\n\n var a,\n n = function (e, t) {\n if (!t && e && e.__esModule) return e;\n if (null === e || "object" != typeof e && "function" != typeof e) return {\n default: e\n };\n var r = d(t);\n if (r && r.has(e)) return r.get(e);\n var a = {},\n n = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n for (var o in e) {\n if ("default" !== o && Object.prototype.hasOwnProperty.call(e, o)) {\n var i = n ? Object.getOwnPropertyDescriptor(e, o) : null;\n i && (i.get || i.set) ? Object.defineProperty(a, o, i) : a[o] = e[o];\n }\n }\n\n a.default = e, r && r.set(e, a);\n return a;\n }(r(0)),\n o = (a = r(1)) && a.__esModule ? a : {\n default: a\n },\n i = r(8),\n l = r(5),\n u = r(11),\n c = r(67),\n s = r(68);\n\n function d(e) {\n if ("function" != typeof WeakMap) return null;\n var t = new WeakMap(),\n r = new WeakMap();\n return (d = function d(e) {\n return e ? r : t;\n })(e);\n }\n\n t.TimePicker = function (e) {\n var t = e.id,\n r = e.name,\n a = e.onChange,\n d = e.label,\n f = e.defaultValue,\n p = e.disabled,\n m = e.minTime,\n y = void 0 === m ? s.DEFAULT_MIN_TIME : m,\n b = e.maxTime,\n v = void 0 === b ? s.DEFAULT_MAX_TIME : b,\n O = e.step,\n g = void 0 === O ? s.DEFAULT_STEP : O,\n _ = e.hint,\n h = e.className,\n j = (0, o.default)("usa-time-picker", h),\n M = (0, c.parseTimeString)(y) || s.DEFAULT_MIN_TIME_MINUTES,\n N = (0, c.parseTimeString)(v) || s.DEFAULT_MAX_TIME_MINUTES,\n E = g < s.MIN_STEP ? s.MIN_STEP : g,\n P = (0, n.useMemo)(function () {\n return (0, c.getTimeOptions)(M, N, E);\n }, [y, v, g]),\n w = r + "-label",\n I = r + "-hint";\n return n.default.createElement(i.FormGroup, null, n.default.createElement(l.Label, {\n className: "usa-label",\n id: w,\n htmlFor: t\n }, d), _ && n.default.createElement("div", {\n className: "usa-hint",\n id: I\n }, _), n.default.createElement(u.ComboBox, {\n id: t,\n name: r,\n className: j,\n onChange: a,\n defaultValue: f,\n options: P,\n disabled: p,\n customFilter: s.TIME_PICKER_CUSTOM_FILTER,\n disableFiltering: !0\n }));\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.getTimeOptions = t.parseTimeString = void 0;\n\n t.parseTimeString = function (e) {\n var t;\n\n if (e) {\n var r = e.split(":").map(function (e) {\n var t,\n r = parseInt(e, 10);\n return Number.isNaN(r) || (t = r), t;\n }),\n a = r[0],\n n = r[1];\n null != a && null != n && (t = 60 * a + n);\n }\n\n return t;\n };\n\n var a = function a(e) {\n var t = e % 60,\n r = Math.floor(e / 60);\n return {\n minute: t,\n hour24: r,\n hour12: r % 12 || 12,\n ampm: r < 12 ? "am" : "pm"\n };\n },\n n = function n(e, t) {\n return ("0000" + e).slice(-t);\n };\n\n t.getTimeOptions = function (e, t, r) {\n for (var o = [], i = e; i <= t; i += r) {\n var l = a(i),\n u = l.minute,\n c = l.hour24,\n s = l.hour12,\n d = l.ampm;\n o.push({\n value: n(c, 2) + ":" + n(u, 2),\n label: s + ":" + n(u, 2) + d\n });\n }\n\n return o;\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.TIME_PICKER_CUSTOM_FILTER = t.MIN_STEP = t.DEFAULT_STEP = t.DEFAULT_MIN_TIME_MINUTES = t.DEFAULT_MIN_TIME = t.DEFAULT_MAX_TIME_MINUTES = t.DEFAULT_MAX_TIME = void 0;\n t.DEFAULT_MAX_TIME = "23:59";\n t.DEFAULT_MAX_TIME_MINUTES = 1439;\n t.DEFAULT_MIN_TIME = "00:00";\n t.DEFAULT_MIN_TIME_MINUTES = 0;\n t.DEFAULT_STEP = 30;\n t.MIN_STEP = 1;\n t.TIME_PICKER_CUSTOM_FILTER = {\n filter: "0?{{ hourQueryFilter }}:{{minuteQueryFilter}}.*{{ apQueryFilter }}m?",\n extras: {\n apQueryFilter: "([ap])",\n hourQueryFilter: "([1-9][0-2]?)",\n minuteQueryFilter: "[\\\\d]+:([0-9]{0,2})"\n }\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.ValidationChecklist = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i21 = function i() {\n return (_i21 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.children,\n r = e.className,\n o = l(e, ["children", "className"]),\n u = (0, n.default)(r, "usa-checklist");\n return a.default.createElement("ul", _i21({\n className: u,\n "data-testid": "validationChecklist"\n }, o), t);\n };\n\n t.ValidationChecklist = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.ValidationItem = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i22 = function i() {\n return (_i22 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.children,\n r = e.className,\n o = e.isValid,\n u = l(e, ["children", "className", "isValid"]),\n c = (0, n.default)("usa-checklist__item", {\n "usa-checklist__item--checked": o\n }, r);\n return a.default.createElement("li", _i22({\n className: c\n }, u), t);\n };\n\n t.ValidationItem = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.ExtendedNav = void 0;\n var a = l(r(0)),\n n = l(r(1)),\n o = r(13),\n i = r(4);\n\n function l(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _u2 = function u() {\n return (_u2 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n c = function c(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n s = function s(e) {\n var t = e.primaryItems,\n r = e.secondaryItems,\n l = e.mobileExpanded,\n s = void 0 !== l && l,\n d = e.children,\n f = e.className,\n p = e.onToggleMobileNav,\n m = c(e, ["primaryItems", "secondaryItems", "mobileExpanded", "children", "className", "onToggleMobileNav"]),\n y = (0, n.default)("usa-nav", {\n "is-visible": s\n }, f);\n return a.default.createElement("nav", _u2({\n className: y\n }, m), a.default.createElement("div", {\n className: "usa-nav__inner"\n }, a.default.createElement(o.NavCloseButton, {\n onClick: p\n }), a.default.createElement(i.NavList, {\n items: t,\n type: "primary"\n }), a.default.createElement("div", {\n className: "usa-nav__secondary"\n }, a.default.createElement(i.NavList, {\n items: r,\n type: "secondary"\n }), d)));\n };\n\n t.ExtendedNav = s;\n var d = s;\n t.default = d;\n }, function (e, t, r) {\n "use strict";\n\n r.r(t), t.default = "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiB2aWV3Qm94PSIwIDAgNjQgNjQiPjx0aXRsZT5jbG9zZTwvdGl0bGU+PHBhdGggZmlsbD0iIzU2NUM2NSIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNNTcuMDQyIDEuMTVsNS44MDkgNS44MDhhNCA0IDAgMCAxIDAgNS42NTdMNDMuNDY1IDMybDE5LjM4NiAxOS4zODVhNCA0IDAgMCAxIDAgNS42NTdsLTUuODA5IDUuODA5YTQgNCAwIDAgMS01LjY1NyAwTDMyIDQzLjQ2NSAxMi42MTUgNjIuODUxYTQgNCAwIDAgMS01LjY1NyAwbC01LjgwOS01LjgwOWE0IDQgMCAwIDEgMC01LjY1N0wyMC41MzUgMzIgMS4xNDkgMTIuNjE1YTQgNCAwIDAgMSAwLTUuNjU3bDUuODA5LTUuODA5YTQgNCAwIDAgMSA1LjY1NyAwTDMyIDIwLjUzNSA1MS4zODUgMS4xNDlhNCA0IDAgMCAxIDUuNjU3IDB6Ii8+PC9zdmc+";\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.Header = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i23 = function i() {\n return (_i23 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.Header = function (e) {\n var t = e.basic,\n r = e.extended,\n o = e.basicWithMegaMenu,\n u = e.children,\n c = e.className,\n s = l(e, ["basic", "extended", "basicWithMegaMenu", "children", "className"]),\n d = (0, n.default)("usa-header", {\n "usa-header--basic": t,\n "usa-header--megamenu": o,\n "usa-header--extended": r\n }, c);\n return a.default.createElement("header", _i23({\n "data-testid": "header",\n className: d\n }, s), u);\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.MegaMenu = void 0;\n var a = i(r(0)),\n n = i(r(1)),\n o = r(4);\n\n function i(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _l9 = function l() {\n return (_l9 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n u = function u(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n c = function c(e) {\n var t = e.items,\n r = e.isOpen,\n i = e.className,\n c = u(e, ["items", "isOpen", "className"]),\n s = (0, n.default)("usa-nav__submenu usa-megamenu", i);\n return a.default.createElement("div", {\n className: s,\n hidden: !r,\n "data-testid": "megamenu"\n }, a.default.createElement("div", {\n className: "grid-row grid-gap-4"\n }, t.map(function (e, t) {\n return a.default.createElement("div", {\n className: "usa-col",\n key: "subnav_col_" + t\n }, a.default.createElement(o.NavList, _l9({\n items: e,\n type: "megamenu"\n }, c)));\n })));\n };\n\n t.MegaMenu = c;\n var s = c;\n t.default = s;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.Menu = void 0;\n var a,\n n = (a = r(0)) && a.__esModule ? a : {\n default: a\n },\n o = r(4);\n\n var _i24 = function i() {\n return (_i24 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.className,\n r = e.items,\n a = e.isOpen,\n u = l(e, ["className", "items", "isOpen"]);\n return n.default.createElement(o.NavList, _i24({\n className: t,\n items: r,\n type: "subnav",\n hidden: !a\n }, u));\n };\n\n t.Menu = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.NavMenuButton = void 0;\n var a,\n n = (a = r(0)) && a.__esModule ? a : {\n default: a\n };\n\n var _o = function o() {\n return (_o = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n i = function i(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.NavMenuButton = function (e) {\n var t = e.label,\n r = e.onClick,\n a = i(e, ["label", "onClick"]);\n return n.default.createElement("button", _o({\n className: "usa-menu-btn",\n onClick: r,\n "data-testid": "navMenuButton"\n }, a, {\n type: "button"\n }), t);\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.NavDropDownButton = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i25 = function i() {\n return (_i25 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.label,\n r = e.menuId,\n o = e.isOpen,\n u = e.onToggle,\n c = e.isCurrent,\n s = e.className,\n d = l(e, ["label", "menuId", "isOpen", "onToggle", "isCurrent", "className"]),\n f = (0, n.default)("usa-accordion__button", "usa-nav__link", {\n "usa-current": c\n }, s);\n return a.default.createElement("button", _i25({\n "data-testid": "navDropDownButton",\n className: f,\n "aria-expanded": o,\n "aria-controls": r,\n onClick: function onClick() {\n return u();\n }\n }, d, {\n type: "button"\n }), a.default.createElement("span", null, t));\n };\n\n t.NavDropDownButton = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.PrimaryNav = void 0;\n var a = l(r(0)),\n n = l(r(1)),\n o = r(13),\n i = r(4);\n\n function l(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _u3 = function u() {\n return (_u3 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n c = function c(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n s = function s(e) {\n var t = e.items,\n r = e.onToggleMobileNav,\n l = e.mobileExpanded,\n s = e.children,\n d = e.className,\n f = c(e, ["items", "onToggleMobileNav", "mobileExpanded", "children", "className"]),\n p = (0, n.default)("usa-nav", {\n "is-visible": l\n }, d);\n return a.default.createElement("nav", _u3({\n className: p\n }, f), a.default.createElement(o.NavCloseButton, {\n onClick: r\n }), a.default.createElement(i.NavList, {\n items: t,\n type: "primary"\n }), s);\n };\n\n t.PrimaryNav = s;\n var d = s;\n t.default = d;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.Title = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i26 = function i() {\n return (_i26 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.className,\n r = e.children,\n o = l(e, ["className", "children"]),\n u = (0, n.default)("usa-logo", t);\n return a.default.createElement("div", _i26({\n className: u\n }, o), a.default.createElement("em", {\n className: "usa-logo__text"\n }, r));\n };\n\n t.Title = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.Identifier = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i27 = function i() {\n return (_i27 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.className,\n r = e.children,\n o = l(e, ["className", "children"]),\n u = (0, n.default)("usa-identifier", t);\n return a.default.createElement("div", _i27({\n "data-testid": "identifier",\n className: u\n }, o), r);\n };\n\n t.Identifier = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.IdentifierGov = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i28 = function i() {\n return (_i28 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.children,\n r = e.className,\n o = l(e, ["children", "className"]),\n u = (0, n.default)("usa-identifier__section usa-identifier__section--usagov", r);\n return a.default.createElement("section", _i28({\n "data-testid": "identifierGov",\n className: u\n }, o), a.default.createElement("div", {\n className: "usa-identifier__container"\n }, t));\n };\n\n t.IdentifierGov = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.IdentifierIdentity = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i29 = function i() {\n return (_i29 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.children,\n r = e.domain,\n o = e.className,\n u = l(e, ["children", "domain", "className"]),\n c = (0, n.default)("usa-identifier__identity", o);\n return a.default.createElement("div", _i29({\n "data-testid": "identifierIdentity",\n className: c\n }, u), a.default.createElement("p", {\n className: "usa-identifier__identity-domain"\n }, r), a.default.createElement("p", {\n className: "usa-identifier__identity-disclaimer"\n }, t));\n };\n\n t.IdentifierIdentity = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.IdentifierLink = function (e) {\n var t = e.className,\n r = u(e, ["className"]),\n i = (0, n.default)(t, "usa-identifier__required-link"),\n c = _l10(_l10({}, r), {\n className: i\n });\n\n if ((0, o.isCustomProps)(c)) return a.default.createElement(o.Link, _l10({}, c));\n return a.default.createElement(o.Link, _l10({}, c));\n };\n var a = i(r(0)),\n n = i(r(1)),\n o = r(10);\n\n function i(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _l10 = function l() {\n return (_l10 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n u = function u(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.IdentifierLinkItem = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i30 = function i() {\n return (_i30 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.IdentifierLinkItem = function (e) {\n var t = e.children,\n r = e.className,\n o = l(e, ["children", "className"]),\n u = (0, n.default)("usa-identifier__required-links-item", r);\n return a.default.createElement("li", _i30({\n className: u\n }, o), t);\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.IdentifierLinks = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i31 = function i() {\n return (_i31 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e) {\n var t = e.children,\n r = e.className,\n o = e.navProps,\n l = e.listProps,\n u = (0, n.default)("usa-identifier__section usa-identifier__section--required-links", r);\n return a.default.createElement("nav", _i31({\n className: u\n }, o), a.default.createElement("div", {\n className: "usa-identifier__container"\n }, a.default.createElement("ul", _i31({\n className: "usa-identifier__required-links-list"\n }, l), t)));\n };\n\n t.IdentifierLinks = l;\n var u = l;\n t.default = u;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.IdentifierLogo = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i32 = function i() {\n return (_i32 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.IdentifierLogo = function (e) {\n var t = e.children,\n r = e.className,\n o = l(e, ["children", "className"]),\n u = (0, n.default)("usa-identifier__logo", r);\n return a.default.createElement("a", _i32({\n className: u\n }, o), t);\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.IdentifierLogos = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i33 = function i() {\n return (_i33 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.children,\n r = e.className,\n o = l(e, ["children", "className"]),\n u = (0, n.default)("usa-identifier__logos", r);\n return a.default.createElement("div", _i33({\n "data-testid": "identifierLogos",\n className: u\n }, o), t);\n };\n\n t.IdentifierLogos = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.IdentifierMasthead = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i34 = function i() {\n return (_i34 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.className,\n r = e.children,\n o = l(e, ["className", "children"]),\n u = (0, n.default)("usa-identifier__section usa-identifier__section--masthead", t);\n return a.default.createElement("section", _i34({\n "data-testid": "identifierMasthead",\n className: u\n }, o), a.default.createElement("div", {\n className: "usa-identifier__container"\n }, r));\n };\n\n t.IdentifierMasthead = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.Address = void 0;\n var a = i(r(0)),\n n = i(r(1)),\n o = r(2);\n\n function i(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n t.Address = function (e) {\n var t = e.size,\n r = e.className,\n i = e.big,\n l = e.medium,\n u = e.slim,\n c = e.items;\n i && (0, o.deprecationWarning)("FooterNav property big is deprecated. Use size"), l && (0, o.deprecationWarning)("FooterNav property medium is deprecated. Use size"), u && (0, o.deprecationWarning)("FooterNav property slim is deprecated. Use size");\n var s = t ? "big" === t : i,\n d = t ? "medium" === t : l,\n f = t ? "slim" === t : u,\n p = (0, n.default)("usa-footer__address", r),\n m = (0, n.default)({\n "grid-col-auto": s || d,\n "grid-col-auto mobile-lg:grid-col-12 desktop:grid-col-auto": f\n });\n return a.default.createElement("address", {\n className: p\n }, f ? a.default.createElement("div", {\n className: "grid-row grid-gap"\n }, c.map(function (e, t) {\n return a.default.createElement("div", {\n className: m,\n key: "addressItem-" + t\n }, a.default.createElement("div", {\n className: "usa-footer__contact-info"\n }, e));\n })) : a.default.createElement("div", {\n className: "usa-footer__contact-info grid-row grid-gap"\n }, c.map(function (e, t) {\n return a.default.createElement("div", {\n className: m,\n key: "addressItem-" + t\n }, e);\n })));\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.Footer = void 0;\n var a = i(r(0)),\n n = i(r(1)),\n o = r(2);\n\n function i(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _l11 = function l() {\n return (_l11 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n u = function u(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.Footer = function (e) {\n var t = e.size,\n r = e.big,\n i = e.medium,\n c = e.slim,\n s = e.returnToTop,\n d = e.primary,\n f = e.secondary,\n p = u(e, ["size", "big", "medium", "slim", "returnToTop", "primary", "secondary"]);\n r && (0, o.deprecationWarning)("Footer property big is deprecated. Use size"), i && (0, o.deprecationWarning)("Footer property medium is deprecated. Use size"), c && (0, o.deprecationWarning)("Footer property slim is deprecated. Use size");\n var m = t ? "big" === t : r,\n y = t ? "medium" === t : i,\n b = t ? "slim" === t : c,\n v = (0, n.default)("usa-footer", {\n "usa-footer--big": m,\n "usa-footer--medium": y,\n "usa-footer--slim": b\n }, p.className);\n return a.default.createElement("footer", _l11({}, p, {\n className: v\n }), s && s, a.default.createElement("div", {\n className: "usa-footer__primary-section"\n }, d), a.default.createElement("div", {\n className: "usa-footer__secondary-section"\n }, a.default.createElement("div", {\n className: "grid-container"\n }, f)));\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.FooterNav = void 0;\n var a = l(r(0)),\n n = r(18),\n o = l(r(1)),\n i = r(2);\n\n function l(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _u4 = function u() {\n return (_u4 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n c = function c(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n function s(e) {\n return e[0].constructor === Array;\n }\n\n t.FooterNav = function (e) {\n var t = e.className,\n r = e.size,\n l = e.big,\n d = e.medium,\n f = e.slim,\n p = e.isMobile,\n m = e.links,\n y = c(e, ["className", "size", "big", "medium", "slim", "isMobile", "links"]);\n l && (0, i.deprecationWarning)("FooterNav property big is deprecated. Use size"), d && (0, i.deprecationWarning)("FooterNav property medium is deprecated. Use size"), f && (0, i.deprecationWarning)("FooterNav property slim is deprecated. Use size");\n\n var b = r ? "big" === r : l,\n v = r ? "medium" === r : d,\n O = r ? "slim" === r : f,\n g = (0, o.default)("usa-footer__nav", t),\n _ = (0, o.default)("desktop:grid-col-auto usa-footer__primary-content", {\n "mobile-lg:grid-col-4": b || v,\n "mobile-lg:grid-col-6": O\n });\n\n return a.default.createElement("nav", _u4({\n className: g\n }, y), b && s(m) && a.default.createElement(n.FooterExtendedNavList, {\n isMobile: p,\n nestedLinks: m\n }), !s(m) && a.default.createElement("ul", {\n className: "grid-row grid-gap"\n }, m.map(function (e, t) {\n return a.default.createElement("li", {\n key: "navLink-" + t,\n className: _\n }, e);\n })));\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.Logo = void 0;\n var a = i(r(0)),\n n = i(r(1)),\n o = r(2);\n\n function i(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.Logo = function (e) {\n var t = e.size,\n r = e.big,\n i = e.medium,\n u = e.slim,\n c = e.heading,\n s = e.image,\n d = l(e, ["size", "big", "medium", "slim", "heading", "image"]);\n r && (0, o.deprecationWarning)("FooterNav property big is deprecated. Use size"), i && (0, o.deprecationWarning)("FooterNav property medium is deprecated. Use size"), u && (0, o.deprecationWarning)("FooterNav property slim is deprecated. Use size");\n var f = t ? "big" === t : r,\n p = t ? "medium" === t : i,\n m = t ? "slim" === t : u,\n y = (0, n.default)("usa-footer__logo grid-row", {\n "mobile-lg:grid-col-6 mobile-lg:grid-gap-2": f || p,\n "grid-gap-2": m\n }, d.className),\n b = (0, n.default)({\n "mobile-lg:grid-col-auto": f || p,\n "grid-col-auto": m\n });\n return a.default.createElement("div", {\n className: y,\n "data-testid": "footerLogo"\n }, a.default.createElement(a.default.Fragment, null, a.default.createElement("div", {\n className: b\n }, s), c && a.default.createElement("div", {\n className: b\n }, c)));\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.SocialLinks = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n t.SocialLinks = function (e) {\n var t = e.className,\n r = e.links,\n o = (0, n.default)("usa-footer__social-links grid-row grid-gap-1", t);\n return a.default.createElement("div", {\n className: o\n }, r.map(function (e, t) {\n return a.default.createElement("div", {\n key: "socialLink" + t,\n className: "grid-col-auto"\n }, e);\n }));\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.CardGroup = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i35 = function i() {\n return (_i35 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.children,\n r = e.className,\n o = l(e, ["children", "className"]),\n u = (0, n.default)("usa-card-group", r);\n return a.default.createElement("ul", _i35({\n className: u,\n "data-testid": "CardGroup"\n }, o), t);\n };\n\n t.CardGroup = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.Card = void 0;\n var a = i(r(0)),\n n = i(r(1)),\n o = r(15);\n\n function i(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _l12 = function l() {\n return (_l12 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n u = function u(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n c = function c(e) {\n var t = e.layout,\n r = void 0 === t ? "standardDefault" : t,\n i = e.headerFirst,\n c = e.children,\n s = e.className,\n d = e.gridLayout,\n f = e.containerProps,\n p = u(e, ["layout", "headerFirst", "children", "className", "gridLayout", "containerProps"]),\n m = f || {},\n y = m.className,\n b = u(m, ["className"]),\n v = d && (0, o.applyGridClasses)(d),\n O = (0, n.default)("usa-card", {\n "usa-card--header-first": i,\n "usa-card--flag": "flagDefault" === r || "flagMediaRight" === r,\n "usa-card--media-right": "flagMediaRight" === r\n }, v, s),\n g = (0, n.default)("usa-card__container", y);\n return a.default.createElement("li", _l12({\n className: O,\n "data-testid": "Card"\n }, p), a.default.createElement("div", _l12({\n className: g\n }, b), c));\n };\n\n t.Card = c;\n var s = c;\n t.default = s;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.CardHeader = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i36 = function i() {\n return (_i36 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.exdent,\n r = e.children,\n o = e.className,\n u = l(e, ["exdent", "children", "className"]),\n c = (0, n.default)("usa-card__header", {\n "usa-card__header--exdent": t\n }, o);\n return a.default.createElement("header", _i36({\n className: c\n }, u, {\n "data-testid": "CardHeader"\n }), r);\n };\n\n t.CardHeader = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.CardMedia = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i37 = function i() {\n return (_i37 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.exdent,\n r = e.inset,\n o = e.imageClass,\n u = e.children,\n c = e.className,\n s = l(e, ["exdent", "inset", "imageClass", "children", "className"]),\n d = (0, n.default)("usa-card__media", {\n "usa-card__media--exdent": t,\n "usa-card__media--inset": r\n }, c),\n f = (0, n.default)("usa-card__img", o);\n return a.default.createElement("div", _i37({\n className: d\n }, s, {\n "data-testid": "CardMedia"\n }), a.default.createElement("div", {\n className: f\n }, u));\n };\n\n t.CardMedia = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.CardBody = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i38 = function i() {\n return (_i38 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.exdent,\n r = e.children,\n o = e.className,\n u = l(e, ["exdent", "children", "className"]),\n c = (0, n.default)("usa-card__body", {\n "usa-card__body--exdent": t\n }, o);\n return a.default.createElement("div", _i38({\n className: c\n }, u, {\n "data-testid": "CardBody"\n }), r);\n };\n\n t.CardBody = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.CardFooter = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i39 = function i() {\n return (_i39 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.exdent,\n r = e.children,\n o = e.className,\n u = l(e, ["exdent", "children", "className"]),\n c = (0, n.default)("usa-card__footer", {\n "usa-card__footer--exdent": t\n }, o);\n return a.default.createElement("div", _i39({\n className: c\n }, u, {\n "data-testid": "CardFooter"\n }), r);\n };\n\n t.CardFooter = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.BreadcrumbBar = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i40 = function i() {\n return (_i40 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n };\n\n t.BreadcrumbBar = function (e) {\n var t = e.variant,\n r = void 0 === t ? "default" : t,\n o = e.children,\n l = e.className,\n u = e.navProps,\n c = e.listProps,\n s = (0, n.default)("usa-breadcrumb", {\n "usa-breadcrumb--wrap": "wrap" === r\n }, l);\n return a.default.createElement("nav", _i40({\n className: s\n }, u, {\n "aria-label": "Breadcrumbs"\n }), a.default.createElement("ol", _i40({\n className: "usa-breadcrumb__list"\n }, c), o));\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.Breadcrumb = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i41 = function i() {\n return (_i41 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.Breadcrumb = function (e) {\n var t = e.children,\n r = e.current,\n o = void 0 !== r && r,\n u = e.className,\n c = l(e, ["children", "current", "className"]),\n s = (0, n.default)("usa-breadcrumb__list-item", {\n "usa-current": o\n }, u);\n return a.default.createElement("li", _i41({\n className: s,\n "aria-current": o ? "page" : void 0\n }, c), t);\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.BreadcrumbLink = function (e) {\n var t = e.className,\n r = u(e, ["className"]),\n i = (0, a.default)(t, "usa-breadcrumb__link"),\n c = _l13(_l13({}, r), {\n className: i\n });\n\n if ((0, o.isCustomProps)(c)) return n.default.createElement(o.Link, _l13({}, c, {\n variant: "unstyled"\n }));\n return n.default.createElement(o.Link, _l13({}, c, {\n variant: "unstyled"\n }));\n };\n var a = i(r(1)),\n n = i(r(0)),\n o = r(10);\n\n function i(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _l13 = function l() {\n return (_l13 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n u = function u(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.StepIndicator = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i42 = function i() {\n return (_i42 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n };\n\n t.StepIndicator = function (e) {\n var t,\n r = e.showLabels,\n o = void 0 === r || r,\n l = e.counters,\n u = void 0 === l ? "none" : l,\n c = e.centered,\n s = void 0 !== c && c,\n d = e.children,\n f = e.className,\n p = e.divProps,\n m = e.listProps,\n y = (0, n.default)("usa-step-indicator", {\n "usa-step-indicator--no-labels": !o,\n "usa-step-indicator--counters": "default" === u,\n "usa-step-indicator--counters-sm": "small" === u,\n "usa-step-indicator--center": s\n }, f),\n b = -1 === (t = d.findIndex(function (e) {\n return "current" === e.props.status;\n })) ? 0 : t,\n v = b + 1,\n O = d[parseInt("" + b)].props.label,\n g = d.length;\n return a.default.createElement("div", _i42({\n className: y,\n "data-testid": "step-indicator",\n "aria-label": "progress"\n }, p), a.default.createElement("ol", _i42({\n className: "usa-step-indicator__segments"\n }, m), d), a.default.createElement("div", {\n className: "usa-step-indicator__header"\n }, a.default.createElement("h2", {\n className: "usa-step-indicator__heading"\n }, a.default.createElement("span", {\n className: "usa-step-indicator__heading-counter"\n }, a.default.createElement("span", {\n className: "usa-sr-only"\n }, "Step"), a.default.createElement("span", {\n className: "usa-step-indicator__current-step"\n }, v), " ", a.default.createElement("span", {\n className: "usa-step-indicator__total-steps"\n }, "of " + g), " "), a.default.createElement("span", {\n className: "usa-step-indicator__heading-text"\n }, O))));\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.StepIndicatorStep = void 0;\n var a = o(r(1)),\n n = o(r(0));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i43 = function i() {\n return (_i43 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.StepIndicatorStep = function (e) {\n var t = e.label,\n r = e.status,\n o = void 0 === r ? "incomplete" : r,\n u = e.className,\n c = l(e, ["label", "status", "className"]),\n s = (0, a.default)("usa-step-indicator__segment", {\n "usa-step-indicator__segment--complete": "complete" === o,\n "usa-step-indicator__segment--current": "current" === o\n }, u);\n return n.default.createElement("li", _i43({\n className: s,\n "aria-current": "current" === o ? "true" : void 0\n }, c), n.default.createElement("span", {\n className: "usa-step-indicator__segment-label"\n }, t, " ", "current" !== o && n.default.createElement("span", {\n className: "usa-sr-only"\n }, "complete" === o ? "completed" : "not completed")));\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.Search = void 0;\n var a = s(r(0)),\n n = s(r(1)),\n o = r(2),\n i = r(14),\n l = r(17),\n u = r(5),\n c = r(7);\n\n function s(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _d2 = function d() {\n return (_d2 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n f = function f(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n p = function p(e) {\n var t = e.onSubmit,\n r = e.size,\n s = e.big,\n p = e.small,\n m = e.className,\n y = e.placeholder,\n b = e.inputName,\n v = void 0 === b ? "search" : b,\n O = e.label,\n g = void 0 === O ? "Search" : O,\n _ = e.inputId,\n h = void 0 === _ ? "search-field" : _,\n j = e.i18n,\n M = f(e, ["onSubmit", "size", "big", "small", "className", "placeholder", "inputName", "label", "inputId", "i18n"]);\n s && (0, o.deprecationWarning)("Search property big is deprecated. Use size"), p && (0, o.deprecationWarning)("Search property small is deprecated. Use size");\n var N = (null == j ? void 0 : j.buttonText) || "Search",\n E = r ? "big" === r : s,\n P = r ? "small" === r : p,\n w = (0, n.default)("usa-search", {\n "usa-search--small": P,\n "usa-search--big": E\n }, m);\n return a.default.createElement(l.Form, _d2({\n onSubmit: t,\n className: w,\n role: "search",\n search: !0\n }, M), a.default.createElement(u.Label, {\n srOnly: !0,\n htmlFor: h\n }, g), a.default.createElement(c.TextInput, {\n id: h,\n type: "search",\n name: v,\n placeholder: y\n }), a.default.createElement(i.Button, {\n type: "submit"\n }, a.default.createElement("span", {\n className: P ? "usa-sr-only" : "usa-search__submit-text"\n }, N)));\n };\n\n t.Search = p;\n var m = p;\n t.default = m;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.SummaryBox = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i44 = function i() {\n return (_i44 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.heading,\n r = e.children,\n o = e.className,\n u = l(e, ["heading", "children", "className"]),\n c = (0, n.default)("usa-summary-box", o);\n return a.default.createElement("div", _i44({\n className: c,\n "data-testid": "summary-box"\n }, u), a.default.createElement("div", {\n className: "usa-summary-box__body"\n }, a.default.createElement("h3", {\n className: "usa-summary-box__heading"\n }, t), a.default.createElement("div", {\n className: "usa-summary-box__text"\n }, r)));\n };\n\n t.SummaryBox = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.ProcessList = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i45 = function i() {\n return (_i45 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.className,\n r = e.children,\n o = l(e, ["className", "children"]),\n u = (0, n.default)("usa-process-list", t);\n return a.default.createElement("ol", _i45({\n className: u\n }, o), r);\n };\n\n t.ProcessList = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.ProcessListItem = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i46 = function i() {\n return (_i46 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.className,\n r = e.children,\n o = l(e, ["className", "children"]),\n u = (0, n.default)("usa-process-list__item", t);\n return a.default.createElement("li", _i46({\n className: u\n }, o), r);\n };\n\n t.ProcessListItem = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.ProcessListHeading = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i47 = function i() {\n return (_i47 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.ProcessListHeading = function (e) {\n var t = e.type,\n r = e.className,\n o = e.children,\n u = l(e, ["type", "className", "children"]),\n c = (0, n.default)("usa-process-list__heading", r),\n s = t;\n return a.default.createElement(s, _i47({\n "data-testid": "processListHeading",\n className: c\n }, u), o);\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.SiteAlert = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i48 = function i() {\n return (_i48 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.variant,\n r = e.children,\n o = e.heading,\n u = e.showIcon,\n c = void 0 === u || u,\n s = e.slim,\n d = void 0 !== s && s,\n f = e.className,\n p = l(e, ["variant", "children", "heading", "showIcon", "slim", "className"]),\n m = (0, n.default)("usa-site-alert", {\n "usa-site-alert--info": "info" === t,\n "usa-site-alert--emergency": "emergency" === t,\n "usa-site-alert--no-heading": void 0 === o && !d,\n "usa-site-alert--no-icon": !c,\n "usa-site-alert--slim": d\n }, f);\n return a.default.createElement("section", _i48({\n "data-testid": "siteAlert",\n className: m,\n "aria-label": "Site alert"\n }, p), a.default.createElement("div", {\n className: "usa-alert"\n }, a.default.createElement("div", {\n className: "usa-alert__body"\n }, o && a.default.createElement("h3", {\n className: "usa-alert__heading"\n }, o), r)));\n };\n\n t.SiteAlert = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.useModal = t.connectModal = t.ModalContainer = t.Overlay = t.Modal = void 0;\n\n var a = function (e, t) {\n if (!t && e && e.__esModule) return e;\n if (null === e || "object" != typeof e && "function" != typeof e) return {\n default: e\n };\n var r = u(t);\n if (r && r.has(e)) return r.get(e);\n var a = {},\n n = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n for (var o in e) {\n if ("default" !== o && Object.prototype.hasOwnProperty.call(e, o)) {\n var i = n ? Object.getOwnPropertyDescriptor(e, o) : null;\n i && (i.get || i.set) ? Object.defineProperty(a, o, i) : a[o] = e[o];\n }\n }\n\n a.default = e, r && r.set(e, a);\n return a;\n }(r(0)),\n n = l(r(1)),\n o = l(r(112)),\n i = r(2);\n\n function l(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n function u(e) {\n if ("function" != typeof WeakMap) return null;\n var t = new WeakMap(),\n r = new WeakMap();\n return (u = function u(e) {\n return e ? r : t;\n })(e);\n }\n\n var _c4 = function c() {\n return (_c4 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n s = function s(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.Modal = function (e) {\n var t = e.title,\n r = e.children,\n l = e.actions,\n u = e.className,\n c = (0, n.default)(o.default.modal, u);\n return (0, i.deprecationWarning)("Modal is deprecated. Modal will be removed from react-uswds alongside all other Modal related components and functions in the next major release."), a.default.createElement("div", {\n "data-testid": "modal",\n className: c\n }, a.default.createElement("div", {\n className: o.default.title\n }, t), a.default.createElement("div", {\n className: o.default.content\n }, r), a.default.createElement("div", {\n className: o.default.actions\n }, l));\n };\n\n var d = function d() {\n return a.default.createElement("div", {\n className: o.default.overlay\n });\n };\n\n t.Overlay = d;\n\n var f = function f(e) {\n var t = e.children;\n return (0, i.deprecationWarning)("Modal is deprecated. ModalContainer will be removed from react-uswds alongside all other Modal related components and functions in the next major release."), a.default.createElement("div", {\n className: o.default.modalContainer\n }, t);\n };\n\n t.ModalContainer = f;\n\n t.connectModal = function (e) {\n return function (t) {\n var r = t.isOpen,\n n = s(t, ["isOpen"]);\n return (0, i.deprecationWarning)("Modal is deprecated. \'connectModal\' will be removed from react-uswds alongside all other Modal related components and functions in the next major release."), r ? a.default.createElement(a.default.Fragment, null, a.default.createElement(d, null), a.default.createElement(f, null, a.default.createElement(e, _c4({}, n)))) : null;\n };\n };\n\n t.useModal = function () {\n (0, i.deprecationWarning)("Modal is deprecated. The useModal hook will be removed from react-uswds alongside all other Modal related components and functions in the next major release.");\n var e = (0, a.useState)(!1),\n t = e[0],\n r = e[1];\n return {\n isOpen: t,\n openModal: function openModal() {\n r(!0);\n },\n closeModal: function closeModal() {\n r(!1);\n }\n };\n };\n }, function (e, t, r) {\n "use strict";\n\n r.r(t), t.default = {\n title: "src-components-Modal-Modal-module__title--3YHHD",\n actions: "src-components-Modal-Modal-module__actions--2Ur9N",\n content: "src-components-Modal-Modal-module__content--3-4_Y",\n modal: "src-components-Modal-Modal-module__modal--1uszs",\n overlay: "src-components-Modal-Modal-module__overlay--WSsyO",\n modalContainer: "src-components-Modal-Modal-module__modalContainer--2Zv9O"\n };\n }]);\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AdHJ1c3N3b3Jrcy9yZWFjdC11c3dkcy9saWIvaW5kZXguanM/YjE4MiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBLEVBQUUsS0FBdUQsc0JBQXNCLG1CQUFPLENBQUMsSUFBTyxLQUFLLENBQW9LO0FBQ3ZRLENBQUM7QUFDRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsZ0JBQWdCOztBQUVoQjtBQUNBLCtCQUErQixzQkFBc0I7QUFDckQ7O0FBRUE7QUFDQTtBQUNBLDREQUE0RDtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDZCQUE2QixjQUFjO0FBQzNDLHdCQUF3Qiw4QkFBOEI7QUFDdEQ7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVCxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0RBQWdELE9BQU87QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsaURBQWlELGNBQWM7QUFDL0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0RBQWdELE9BQU87QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsaURBQWlELGNBQWM7QUFDL0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxtREFBbUQ7QUFDbkQ7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnREFBZ0QsT0FBTztBQUN2RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpREFBaUQsY0FBYztBQUMvRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdEQUFnRCxPQUFPO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGlEQUFpRCxjQUFjO0FBQy9EO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRCxPQUFPO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGlEQUFpRCxjQUFjO0FBQy9EO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLLGFBQWE7QUFDbEI7QUFDQSxLQUFLLDJCQUEyQjs7QUFFaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLHFCQUFxQixPQUFPO0FBQzVCLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxFQUFFO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYjtBQUNBLFdBQVcsRUFBRTtBQUNiO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsV0FB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QUFDaEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnREFBZ0QsT0FBTztBQUN2RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpREFBaUQsY0FBYztBQUMvRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQSxnREFBZ0QsT0FBTztBQUN2RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQSxrREFBa0QsT0FBTztBQUN6RDtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsaUJBQWlCLE9BQU87QUFDeEIsdURBQXVELE9BQU87QUFDOUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0EsZ0RBQWdELE9BQU87QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsaURBQWlELGNBQWM7QUFDL0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQSxnREFBZ0QsT0FBTztBQUN2RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpREFBaUQsY0FBYztBQUMvRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFD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QUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGlEQUFpRCxjQUFjO0FBQy9EO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsMEVBQTBFO0FBQzFFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxPQUFPOztBQUVQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTyxzQ0FBc0MsNkRBQTZEO0FBQzFHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQOztBQUVBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdFQUF3RTtBQUN4RTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxRQUFRLHlCQUF5QjtBQUNqQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0EsZ0RBQWdELE9BQU87QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXOztBQUVYO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0RBQWdELE9BQU87QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsaURBQWlELGNBQWM7QUFDL0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtB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QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnREFBZ0QsT0FBTztBQUN2RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpREFBaUQsY0FBYztBQUMvRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnREFBZ0QsT0FBTztBQUN2RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpREFBaUQsY0FBYztBQUMvRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUEsNENBQTRDO0FBQzVDLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0RBQWdELE9BQU87QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsaURBQWlELGNBQWM7QUFDL0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0RBQWdELE9BQU87QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsaURBQWlELGNBQWM7QUFDL0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNULE9B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QUFDL0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdEQUFnRCxPQUFPO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0RBQWdELE9BQU87QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsaURBQWlELGNBQWM7QUFDL0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdEQUFnRCxPQUFPO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGlEQUFpRCxjQUFjO0FBQy9EO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnREFBZ0QsT0FBTztBQUN2RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpREFBaUQsY0FBYztBQUMvRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0RBQWdELE9BQU87QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsaURBQWlELGNBQWM7QUFDL0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0RBQWdELE9BQU87QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsaURBQWlELGNBQWM7QUFDL0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0RBQWdELE9BQU87QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsaURBQWlELGNBQWM7QUFDL0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdEQUFnRCxPQUFPO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGlEQUFpRCxjQUFjO0FBQy9EO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQSxnREFBZ0QsT0FBTztBQUN2RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpREFBaUQsY0FBYztBQUMvRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa1dBQWtXO0FBQ2xXO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDIiwiZmlsZSI6IjI1OTMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIhZnVuY3Rpb24gKGUsIHQpIHtcbiAgXCJvYmplY3RcIiA9PSB0eXBlb2YgZXhwb3J0cyAmJiBcIm9iamVjdFwiID09IHR5cGVvZiBtb2R1bGUgPyBtb2R1bGUuZXhwb3J0cyA9IHQocmVxdWlyZShcInJlYWN0XCIpKSA6IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgZGVmaW5lICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoW1wicmVhY3RcIl0sIHQpIDogXCJvYmplY3RcIiA9PSB0eXBlb2YgZXhwb3J0cyA/IGV4cG9ydHMuUmVhY3RVU1dEUyA9IHQocmVxdWlyZShcInJlYWN0XCIpKSA6IGUuUmVhY3RVU1dEUyA9IHQoZS5SZWFjdCk7XG59KHRoaXMsIGZ1bmN0aW9uIChlKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoZSkge1xuICAgIHZhciB0ID0ge307XG5cbiAgICBmdW5jdGlvbiByKGEpIHtcbiAgICAgIGlmICh0W2FdKSByZXR1cm4gdFthXS5leHBvcnRzO1xuICAgICAgdmFyIG4gPSB0W2FdID0ge1xuICAgICAgICBpOiBhLFxuICAgICAgICBsOiAhMSxcbiAgICAgICAgZXhwb3J0czoge31cbiAgICAgIH07XG4gICAgICByZXR1cm4gZVthXS5jYWxsKG4uZXhwb3J0cywgbiwgbi5leHBvcnRzLCByKSwgbi5sID0gITAsIG4uZXhwb3J0cztcbiAgICB9XG5cbiAgICByZXR1cm4gci5tID0gZSwgci5jID0gdCwgci5kID0gZnVuY3Rpb24gKGUsIHQsIGEpIHtcbiAgICAgIHIubyhlLCB0KSB8fCBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdCwge1xuICAgICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgICAgZ2V0OiBhXG4gICAgICB9KTtcbiAgICB9LCByLnIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgU3ltYm9sICYmIFN5bWJvbC50b1N0cmluZ1RhZyAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgU3ltYm9sLnRvU3RyaW5nVGFnLCB7XG4gICAgICAgIHZhbHVlOiBcIk1vZHVsZVwiXG4gICAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiAhMFxuICAgICAgfSk7XG4gICAgfSwgci50ID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIGlmICgxICYgdCAmJiAoZSA9IHIoZSkpLCA4ICYgdCkgcmV0dXJuIGU7XG4gICAgICBpZiAoNCAmIHQgJiYgXCJvYmplY3RcIiA9PSB0eXBlb2YgZSAmJiBlICYmIGUuX19lc01vZHVsZSkgcmV0dXJuIGU7XG4gICAgICB2YXIgYSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICBpZiAoci5yKGEpLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwgXCJkZWZhdWx0XCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICAgIHZhbHVlOiBlXG4gICAgICB9KSwgMiAmIHQgJiYgXCJzdHJpbmdcIiAhPSB0eXBlb2YgZSkgZm9yICh2YXIgbiBpbiBlKSB7XG4gICAgICAgIHIuZChhLCBuLCBmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHJldHVybiBlW3RdO1xuICAgICAgICB9LmJpbmQobnVsbCwgbikpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGE7XG4gICAgfSwgci5uID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0ID0gZSAmJiBlLl9fZXNNb2R1bGUgPyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBlLmRlZmF1bHQ7XG4gICAgICB9IDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gci5kKHQsIFwiYVwiLCB0KSwgdDtcbiAgICB9LCByLm8gPSBmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCB0KTtcbiAgICB9LCByLnAgPSBcIlwiLCByKHIucyA9IDE5KTtcbiAgfShbZnVuY3Rpb24gKHQsIHIpIHtcbiAgICB0LmV4cG9ydHMgPSBlO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIHZhciBhO1xuICAgIC8qIVxuICAgICAgQ29weXJpZ2h0IChjKSAyMDE4IEplZCBXYXRzb24uXG4gICAgICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgKE1JVCksIHNlZVxuICAgICAgaHR0cDovL2plZHdhdHNvbi5naXRodWIuaW8vY2xhc3NuYW1lc1xuICAgICovXG5cbiAgICAhZnVuY3Rpb24gKCkge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIHZhciByID0ge30uaGFzT3duUHJvcGVydHk7XG5cbiAgICAgIGZ1bmN0aW9uIG4oKSB7XG4gICAgICAgIGZvciAodmFyIGUgPSBbXSwgdCA9IDA7IHQgPCBhcmd1bWVudHMubGVuZ3RoOyB0KyspIHtcbiAgICAgICAgICB2YXIgYSA9IGFyZ3VtZW50c1t0XTtcblxuICAgICAgICAgIGlmIChhKSB7XG4gICAgICAgICAgICB2YXIgbyA9IHR5cGVvZiBhO1xuICAgICAgICAgICAgaWYgKFwic3RyaW5nXCIgPT09IG8gfHwgXCJudW1iZXJcIiA9PT0gbykgZS5wdXNoKGEpO2Vsc2UgaWYgKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICAgICAgICAgICAgaWYgKGEubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGkgPSBuLmFwcGx5KG51bGwsIGEpO1xuICAgICAgICAgICAgICAgIGkgJiYgZS5wdXNoKGkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFwib2JqZWN0XCIgPT09IG8pIGlmIChhLnRvU3RyaW5nID09PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKSBmb3IgKHZhciBsIGluIGEpIHtcbiAgICAgICAgICAgICAgci5jYWxsKGEsIGwpICYmIGFbbF0gJiYgZS5wdXNoKGwpO1xuICAgICAgICAgICAgfSBlbHNlIGUucHVzaChhLnRvU3RyaW5nKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlLmpvaW4oXCIgXCIpO1xuICAgICAgfVxuXG4gICAgICBlLmV4cG9ydHMgPyAobi5kZWZhdWx0ID0gbiwgZS5leHBvcnRzID0gbikgOiB2b2lkIDAgPT09IChhID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbjtcbiAgICAgIH0uYXBwbHkodCwgW10pKSB8fCAoZS5leHBvcnRzID0gYSk7XG4gICAgfSgpO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZXByZWNhdGlvbldhcm5pbmcgPSB2b2lkIDA7XG5cbiAgICB2YXIgYSA9IGZ1bmN0aW9uIGEoKSB7fTtcblxuICAgIHQuZGVwcmVjYXRpb25XYXJuaW5nID0gYTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuaXNJb3NEZXZpY2UgPSB0LmhhbmRsZVRhYktleSA9IHQubGlzdFRvVGFibGUgPSB0LmlzRGF0ZUludmFsaWQgPSB0LmZvcm1hdERhdGUgPSB0LnBhcnNlRGF0ZVN0cmluZyA9IHQuaXNEYXRlc1llYXJPdXRzaWRlTWluT3JNYXggPSB0LmlzRGF0ZXNNb250aE91dHNpZGVNaW5Pck1heCA9IHQuaXNEYXRlV2l0aGluTWluQW5kTWF4ID0gdC5rZWVwRGF0ZUJldHdlZW5NaW5BbmRNYXggPSB0LmlzU2FtZURheSA9IHQuaXNTYW1lTW9udGggPSB0LmlzU2FtZVllYXIgPSB0Lm1heCA9IHQubWluID0gdC5zZXRZZWFyID0gdC5zZXRNb250aCA9IHQuc3ViWWVhcnMgPSB0LmFkZFllYXJzID0gdC5zdWJNb250aHMgPSB0LmFkZE1vbnRocyA9IHQuZW5kT2ZXZWVrID0gdC5zdGFydE9mV2VlayA9IHQuc3ViV2Vla3MgPSB0LmFkZFdlZWtzID0gdC5zdWJEYXlzID0gdC5hZGREYXlzID0gdC5sYXN0RGF5T2ZNb250aCA9IHQuc3RhcnRPZk1vbnRoID0gdC50b2RheSA9IHQuc2V0RGF0ZSA9IHQua2VlcERhdGVXaXRoaW5Nb250aCA9IHZvaWQgMDtcbiAgICB2YXIgYSxcbiAgICAgICAgbiA9IChhID0gcigwKSkgJiYgYS5fX2VzTW9kdWxlID8gYSA6IHtcbiAgICAgIGRlZmF1bHQ6IGFcbiAgICB9LFxuICAgICAgICBvID0gcig2KTtcblxuICAgIHZhciBpID0gZnVuY3Rpb24gaShlLCB0KSB7XG4gICAgICByZXR1cm4gdCAhPT0gZS5nZXRNb250aCgpICYmIGUuc2V0RGF0ZSgwKSwgZTtcbiAgICB9O1xuXG4gICAgdC5rZWVwRGF0ZVdpdGhpbk1vbnRoID0gaTtcblxuICAgIHZhciBsID0gZnVuY3Rpb24gbChlLCB0LCByKSB7XG4gICAgICB2YXIgYSA9IG5ldyBEYXRlKDApO1xuICAgICAgcmV0dXJuIGEuc2V0RnVsbFllYXIoZSwgdCwgciksIGE7XG4gICAgfTtcblxuICAgIHQuc2V0RGF0ZSA9IGw7XG5cbiAgICB2YXIgdSA9IGZ1bmN0aW9uIHUoKSB7XG4gICAgICB2YXIgZSA9IG5ldyBEYXRlKCksXG4gICAgICAgICAgdCA9IGUuZ2V0RGF0ZSgpLFxuICAgICAgICAgIHIgPSBlLmdldE1vbnRoKCksXG4gICAgICAgICAgYSA9IGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgIHJldHVybiBsKGEsIHIsIHQpO1xuICAgIH07XG5cbiAgICB0LnRvZGF5ID0gdTtcblxuICAgIHZhciBjID0gZnVuY3Rpb24gYyhlKSB7XG4gICAgICB2YXIgdCA9IG5ldyBEYXRlKDApO1xuICAgICAgcmV0dXJuIHQuc2V0RnVsbFllYXIoZS5nZXRGdWxsWWVhcigpLCBlLmdldE1vbnRoKCksIDEpLCB0O1xuICAgIH07XG5cbiAgICB0LnN0YXJ0T2ZNb250aCA9IGM7XG5cbiAgICB2YXIgcyA9IGZ1bmN0aW9uIHMoZSkge1xuICAgICAgdmFyIHQgPSBuZXcgRGF0ZSgwKTtcbiAgICAgIHJldHVybiB0LnNldEZ1bGxZZWFyKGUuZ2V0RnVsbFllYXIoKSwgZS5nZXRNb250aCgpICsgMSwgMCksIHQ7XG4gICAgfTtcblxuICAgIHQubGFzdERheU9mTW9udGggPSBzO1xuXG4gICAgdmFyIGQgPSBmdW5jdGlvbiBkKGUsIHQpIHtcbiAgICAgIHZhciByID0gbmV3IERhdGUoZS5nZXRUaW1lKCkpO1xuICAgICAgcmV0dXJuIHIuc2V0RGF0ZShyLmdldERhdGUoKSArIHQpLCByO1xuICAgIH07XG5cbiAgICB0LmFkZERheXMgPSBkO1xuXG4gICAgdmFyIGYgPSBmdW5jdGlvbiBmKGUsIHQpIHtcbiAgICAgIHJldHVybiBkKGUsIC10KTtcbiAgICB9O1xuXG4gICAgdC5zdWJEYXlzID0gZjtcblxuICAgIHZhciBwID0gZnVuY3Rpb24gcChlLCB0KSB7XG4gICAgICByZXR1cm4gZChlLCA3ICogdCk7XG4gICAgfTtcblxuICAgIHQuYWRkV2Vla3MgPSBwO1xuXG4gICAgdC5zdWJXZWVrcyA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICByZXR1cm4gcChlLCAtdCk7XG4gICAgfTtcblxuICAgIHQuc3RhcnRPZldlZWsgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLmdldERheSgpO1xuICAgICAgcmV0dXJuIGYoZSwgdCk7XG4gICAgfTtcblxuICAgIHQuZW5kT2ZXZWVrID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0ID0gZS5nZXREYXkoKTtcbiAgICAgIHJldHVybiBkKGUsIDYgLSB0KTtcbiAgICB9O1xuXG4gICAgdmFyIG0gPSBmdW5jdGlvbiBtKGUsIHQpIHtcbiAgICAgIHZhciByID0gbmV3IERhdGUoZS5nZXRUaW1lKCkpLFxuICAgICAgICAgIGEgPSAoci5nZXRNb250aCgpICsgMTIgKyB0KSAlIDEyO1xuICAgICAgcmV0dXJuIHIuc2V0TW9udGgoci5nZXRNb250aCgpICsgdCksIGkociwgYSksIHI7XG4gICAgfTtcblxuICAgIHQuYWRkTW9udGhzID0gbTtcblxuICAgIHQuc3ViTW9udGhzID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIHJldHVybiBtKGUsIC10KTtcbiAgICB9O1xuXG4gICAgdmFyIHkgPSBmdW5jdGlvbiB5KGUsIHQpIHtcbiAgICAgIHJldHVybiBtKGUsIDEyICogdCk7XG4gICAgfTtcblxuICAgIHQuYWRkWWVhcnMgPSB5O1xuXG4gICAgdC5zdWJZZWFycyA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICByZXR1cm4geShlLCAtdCk7XG4gICAgfTtcblxuICAgIHZhciBiID0gZnVuY3Rpb24gYihlLCB0KSB7XG4gICAgICB2YXIgciA9IG5ldyBEYXRlKGUuZ2V0VGltZSgpKTtcbiAgICAgIHJldHVybiByLnNldE1vbnRoKHQpLCBpKHIsIHQpLCByO1xuICAgIH07XG5cbiAgICB0LnNldE1vbnRoID0gYjtcblxuICAgIHQuc2V0WWVhciA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICB2YXIgciA9IG5ldyBEYXRlKGUuZ2V0VGltZSgpKSxcbiAgICAgICAgICBhID0gci5nZXRNb250aCgpO1xuICAgICAgcmV0dXJuIHIuc2V0RnVsbFllYXIodCksIGkociwgYSksIHI7XG4gICAgfTtcblxuICAgIHQubWluID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIHZhciByID0gZTtcbiAgICAgIHJldHVybiB0IDwgZSAmJiAociA9IHQpLCBuZXcgRGF0ZShyLmdldFRpbWUoKSk7XG4gICAgfTtcblxuICAgIHQubWF4ID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIHZhciByID0gZTtcbiAgICAgIHJldHVybiB0ID4gZSAmJiAociA9IHQpLCBuZXcgRGF0ZShyLmdldFRpbWUoKSk7XG4gICAgfTtcblxuICAgIHZhciB2ID0gZnVuY3Rpb24gdihlLCB0KSB7XG4gICAgICByZXR1cm4gZSAmJiB0ICYmIGUuZ2V0RnVsbFllYXIoKSA9PT0gdC5nZXRGdWxsWWVhcigpO1xuICAgIH07XG5cbiAgICB0LmlzU2FtZVllYXIgPSB2O1xuXG4gICAgdmFyIE8gPSBmdW5jdGlvbiBPKGUsIHQpIHtcbiAgICAgIHJldHVybiB2KGUsIHQpICYmIGUuZ2V0TW9udGgoKSA9PT0gdC5nZXRNb250aCgpO1xuICAgIH07XG5cbiAgICB0LmlzU2FtZU1vbnRoID0gTztcblxuICAgIHQuaXNTYW1lRGF5ID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIHJldHVybiBPKGUsIHQpICYmIGUuZ2V0RGF0ZSgpID09PSB0LmdldERhdGUoKTtcbiAgICB9O1xuXG4gICAgdC5rZWVwRGF0ZUJldHdlZW5NaW5BbmRNYXggPSBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgICAgdmFyIGEgPSBlO1xuICAgICAgcmV0dXJuIGUgPCB0ID8gYSA9IHQgOiByICYmIGUgPiByICYmIChhID0gciksIG5ldyBEYXRlKGEuZ2V0VGltZSgpKTtcbiAgICB9O1xuXG4gICAgdmFyIGcgPSBmdW5jdGlvbiBnKGUsIHQsIHIpIHtcbiAgICAgIHJldHVybiBlID49IHQgJiYgKCFyIHx8IGUgPD0gcik7XG4gICAgfTtcblxuICAgIHQuaXNEYXRlV2l0aGluTWluQW5kTWF4ID0gZztcblxuICAgIHQuaXNEYXRlc01vbnRoT3V0c2lkZU1pbk9yTWF4ID0gZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICAgIHJldHVybiBzKGUpIDwgdCB8fCAhIXIgJiYgYyhlKSA+IHI7XG4gICAgfTtcblxuICAgIHQuaXNEYXRlc1llYXJPdXRzaWRlTWluT3JNYXggPSBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgICAgcmV0dXJuIHMoYihlLCAxMSkpIDwgdCB8fCAhIXIgJiYgYyhiKGUsIDApKSA+IHI7XG4gICAgfTtcblxuICAgIHQucGFyc2VEYXRlU3RyaW5nID0gZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICAgIHZhciBhLCBuLCBpLCBjLCBzLCBkLCBmO1xuXG4gICAgICBpZiAodm9pZCAwID09PSB0ICYmICh0ID0gby5JTlRFUk5BTF9EQVRFX0ZPUk1BVCksIHZvaWQgMCA9PT0gciAmJiAociA9ICExKSwgZSkge1xuICAgICAgICB2YXIgcCA9IHZvaWQgMCxcbiAgICAgICAgICAgIG0gPSB2b2lkIDAsXG4gICAgICAgICAgICB5ID0gdm9pZCAwO1xuXG4gICAgICAgIGlmICh0ID09PSBvLkRFRkFVTFRfRVhURVJOQUxfREFURV9GT1JNQVQgPyAocCA9IChhID0gZS5zcGxpdChcIi9cIikpWzBdLCBtID0gYVsxXSwgeSA9IGFbMl0pIDogKHkgPSAobiA9IGUuc3BsaXQoXCItXCIpKVswXSwgcCA9IG5bMV0sIG0gPSBuWzJdKSwgeSAmJiAoZiA9IHBhcnNlSW50KHksIDEwKSwgIU51bWJlci5pc05hTihmKSAmJiAoZCA9IGYsIHIgJiYgKGQgPSBNYXRoLm1heCgwLCBkKSwgeS5sZW5ndGggPCAzKSkpKSB7XG4gICAgICAgICAgdmFyIGIgPSB1KCkuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgICBkID0gYiAtIGIgJSBNYXRoLnBvdygxMCwgeS5sZW5ndGgpICsgZjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwICYmIChmID0gcGFyc2VJbnQocCwgMTApLCBOdW1iZXIuaXNOYU4oZikgfHwgKGMgPSBmLCByICYmIChjID0gTWF0aC5tYXgoMSwgYyksIGMgPSBNYXRoLm1pbigxMiwgYykpKSksIGMgJiYgbSAmJiBudWxsICE9IGQgJiYgKGYgPSBwYXJzZUludChtLCAxMCksICFOdW1iZXIuaXNOYU4oZikgJiYgKHMgPSBmLCByKSkpIHtcbiAgICAgICAgICB2YXIgdiA9IGwoZCwgYywgMCkuZ2V0RGF0ZSgpO1xuICAgICAgICAgIHMgPSBNYXRoLm1heCgxLCBzKSwgcyA9IE1hdGgubWluKHYsIHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgYyAmJiBzICYmIG51bGwgIT0gZCAmJiAoaSA9IGwoZCwgYyAtIDEsIHMpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGk7XG4gICAgfTtcblxuICAgIHQuZm9ybWF0RGF0ZSA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICB2b2lkIDAgPT09IHQgJiYgKHQgPSBvLklOVEVSTkFMX0RBVEVfRk9STUFUKTtcblxuICAgICAgdmFyIHIgPSBmdW5jdGlvbiByKGUsIHQpIHtcbiAgICAgICAgcmV0dXJuIChcIjAwMDBcIiArIGUpLnNsaWNlKC10KTtcbiAgICAgIH0sXG4gICAgICAgICAgYSA9IGUuZ2V0TW9udGgoKSArIDEsXG4gICAgICAgICAgbiA9IGUuZ2V0RGF0ZSgpLFxuICAgICAgICAgIGkgPSBlLmdldEZ1bGxZZWFyKCk7XG5cbiAgICAgIHJldHVybiB0ID09PSBvLkRFRkFVTFRfRVhURVJOQUxfREFURV9GT1JNQVQgPyBbcihhLCAyKSwgcihuLCAyKSwgcihpLCA0KV0uam9pbihcIi9cIikgOiBbcihpLCA0KSwgcihhLCAyKSwgcihuLCAyKV0uam9pbihcIi1cIik7XG4gICAgfTtcblxuICAgIHQuaXNEYXRlSW52YWxpZCA9IGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgICB2YXIgYSA9ICExO1xuXG4gICAgICBpZiAoZSkge1xuICAgICAgICBhID0gITA7XG4gICAgICAgIHZhciBuID0gZS5zcGxpdChcIi9cIiksXG4gICAgICAgICAgICBvID0gbi5tYXAoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICB2YXIgdCxcbiAgICAgICAgICAgICAgciA9IHBhcnNlSW50KGUsIDEwKTtcbiAgICAgICAgICByZXR1cm4gTnVtYmVyLmlzTmFOKHIpIHx8ICh0ID0gciksIHQ7XG4gICAgICAgIH0pLFxuICAgICAgICAgICAgaSA9IG9bMF0sXG4gICAgICAgICAgICB1ID0gb1sxXSxcbiAgICAgICAgICAgIGMgPSBvWzJdO1xuXG4gICAgICAgIGlmIChpICYmIHUgJiYgbnVsbCAhPSBjKSB7XG4gICAgICAgICAgdmFyIHMgPSBsKGMsIGkgLSAxLCB1KTtcbiAgICAgICAgICBzLmdldE1vbnRoKCkgPT09IGkgLSAxICYmIHMuZ2V0RGF0ZSgpID09PSB1ICYmIHMuZ2V0RnVsbFllYXIoKSA9PT0gYyAmJiA0ID09PSBuWzJdLmxlbmd0aCAmJiBnKHMsIHQsIHIpICYmIChhID0gITEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhO1xuICAgIH07XG5cbiAgICB0Lmxpc3RUb1RhYmxlID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIGZvciAodmFyIHIgPSBbXSwgYSA9IDA7IGEgPCBlLmxlbmd0aDspIHtcbiAgICAgICAgZm9yICh2YXIgbyA9IFtdOyBhIDwgZS5sZW5ndGggJiYgby5sZW5ndGggPCB0Oykge1xuICAgICAgICAgIG8ucHVzaChlW3BhcnNlSW50KFwiXCIgKyBhKV0pLCBhICs9IDE7XG4gICAgICAgIH1cblxuICAgICAgICByLnB1c2gobyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChuLmRlZmF1bHQuRnJhZ21lbnQsIG51bGwsIHIubWFwKGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICAgIHJldHVybiBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInRyXCIsIHtcbiAgICAgICAgICBrZXk6IFwicm93X1wiICsgdFxuICAgICAgICB9LCBlLm1hcChmdW5jdGlvbiAoZSwgcikge1xuICAgICAgICAgIHJldHVybiBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInRkXCIsIHtcbiAgICAgICAgICAgIGtleTogXCJyb3dfXCIgKyB0ICsgXCJfY2VsbF9cIiArIHJcbiAgICAgICAgICB9LCBlKTtcbiAgICAgICAgfSkpO1xuICAgICAgfSkpO1xuICAgIH07XG5cbiAgICB0LmhhbmRsZVRhYktleSA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICBpZiAoXCJUYWJcIiA9PT0gZS5rZXkpIHtcbiAgICAgICAgdmFyIHIgPSB0LmZpbHRlcihmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIHJldHVybiBlICYmICFlLmRpc2FibGVkO1xuICAgICAgICB9KSxcbiAgICAgICAgICAgIGEgPSBudWxsID09PSBkb2N1bWVudCB8fCB2b2lkIDAgPT09IGRvY3VtZW50ID8gdm9pZCAwIDogZG9jdW1lbnQuYWN0aXZlRWxlbWVudCxcbiAgICAgICAgICAgIG4gPSByLmxlbmd0aCAtIDEsXG4gICAgICAgICAgICBvID0gcltwYXJzZUludChcIjBcIildLFxuICAgICAgICAgICAgaSA9IHJbcGFyc2VJbnQoXCJcIiArIG4pXSxcbiAgICAgICAgICAgIGwgPSBhIGluc3RhbmNlb2YgSFRNTEJ1dHRvbkVsZW1lbnQgPyByLmluZGV4T2YoYSkgOiAtMSxcbiAgICAgICAgICAgIHUgPSBsID09PSBuLFxuICAgICAgICAgICAgYyA9IDAgPT09IGwsXG4gICAgICAgICAgICBzID0gLTEgPT09IGw7XG4gICAgICAgIGUuc2hpZnRLZXkgPyAoYyB8fCBzKSAmJiAoZS5wcmV2ZW50RGVmYXVsdCgpLCBudWxsID09IGkgfHwgaS5mb2N1cygpKSA6ICh1IHx8IHMpICYmIChlLnByZXZlbnREZWZhdWx0KCksIG51bGwgPT0gbyB8fCBvLmZvY3VzKCkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0LmlzSW9zRGV2aWNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIG5hdmlnYXRvciAmJiAobmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvKGlQb2R8aVBob25lfGlQYWQpL2cpIHx8IFwiTWFjSW50ZWxcIiA9PT0gbmF2aWdhdG9yLnBsYXRmb3JtICYmIG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyA+IDEpICYmICF3aW5kb3cuTVNTdHJlYW07XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuTmF2TGlzdCA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IGkocigwKSksXG4gICAgICAgIG4gPSBpKHIoMSkpLFxuICAgICAgICBvID0gcigyKTtcblxuICAgIGZ1bmN0aW9uIGkoZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2wgPSBmdW5jdGlvbiBsKCkge1xuICAgICAgcmV0dXJuIChfbCA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfTtcblxuICAgIHQuTmF2TGlzdCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCA9IGUuaXRlbXMsXG4gICAgICAgICAgciA9IGUudHlwZSxcbiAgICAgICAgICBpID0gZS5wcmltYXJ5LFxuICAgICAgICAgIGMgPSBlLnNlY29uZGFyeSxcbiAgICAgICAgICBzID0gZS5zdWJuYXYsXG4gICAgICAgICAgZCA9IGUubWVnYW1lbnUsXG4gICAgICAgICAgZiA9IGUuZm9vdGVyU2Vjb25kYXJ5LFxuICAgICAgICAgIHAgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBtID0gdShlLCBbXCJpdGVtc1wiLCBcInR5cGVcIiwgXCJwcmltYXJ5XCIsIFwic2Vjb25kYXJ5XCIsIFwic3VibmF2XCIsIFwibWVnYW1lbnVcIiwgXCJmb290ZXJTZWNvbmRhcnlcIiwgXCJjbGFzc05hbWVcIl0pO1xuICAgICAgaSAmJiAoMCwgby5kZXByZWNhdGlvbldhcm5pbmcpKFwiTmF2TGlzdCBwcm9wZXJ0eSBwcmltYXJ5IGlzIGRlcHJlY2F0ZWQuICBVc2UgdHlwZVwiKSwgYyAmJiAoMCwgby5kZXByZWNhdGlvbldhcm5pbmcpKFwiTmF2TGlzdCBwcm9wZXJ0eSBzZWNvbmRhcnkgaXMgZGVwcmVjYXRlZC4gIFVzZSB0eXBlXCIpLCBzICYmICgwLCBvLmRlcHJlY2F0aW9uV2FybmluZykoXCJOYXZMaXN0IHByb3BlcnR5IHN1Ym5hdiBpcyBkZXByZWNhdGVkLiAgVXNlIHR5cGVcIiksIGQgJiYgKDAsIG8uZGVwcmVjYXRpb25XYXJuaW5nKShcIk5hdkxpc3QgcHJvcGVydHkgbWVnYW1lbnUgaXMgZGVwcmVjYXRlZC4gIFVzZSB0eXBlXCIpLCBmICYmICgwLCBvLmRlcHJlY2F0aW9uV2FybmluZykoXCJOYXZMaXN0IHByb3BlcnR5IGZvb3RlclNlY29uZGFyeSBpcyBkZXByZWNhdGVkLiAgVXNlIHR5cGVcIik7XG5cbiAgICAgIHZhciB5ID0gciA/IFwicHJpbWFyeVwiID09PSByIDogaSxcbiAgICAgICAgICBiID0gciA/IFwic2Vjb25kYXJ5XCIgPT09IHIgOiBjLFxuICAgICAgICAgIHYgPSByID8gXCJzdWJuYXZcIiA9PT0gciA6IHMsXG4gICAgICAgICAgTyA9IHIgPyBcIm1lZ2FtZW51XCIgPT09IHIgOiBkLFxuICAgICAgICAgIGcgPSByID8gXCJmb290ZXJTZWNvbmRhcnlcIiA9PT0gciA6IGYsXG4gICAgICAgICAgXyA9ICgwLCBuLmRlZmF1bHQpKHtcbiAgICAgICAgXCJ1c2EtbmF2X19wcmltYXJ5IHVzYS1hY2NvcmRpb25cIjogeSxcbiAgICAgICAgXCJ1c2EtbmF2X19zZWNvbmRhcnktbGlua3NcIjogYixcbiAgICAgICAgXCJ1c2EtbmF2X19zdWJtZW51XCI6IHYsXG4gICAgICAgIFwidXNhLW5hdl9fc3VibWVudS1saXN0XCI6IE8sXG4gICAgICAgIFwidXNhLWxpc3QgdXNhLWxpc3QtLXVuc3R5bGVkXCI6IGdcbiAgICAgIH0sIHApLFxuICAgICAgICAgIGggPSAoMCwgbi5kZWZhdWx0KSh7XG4gICAgICAgIFwidXNhLW5hdl9fcHJpbWFyeS1pdGVtXCI6IHksXG4gICAgICAgIFwidXNhLW5hdl9fc2Vjb25kYXJ5LWl0ZW1cIjogYixcbiAgICAgICAgXCJ1c2EtbmF2X19zdWJtZW51LWl0ZW1cIjogdiB8fCBPLFxuICAgICAgICBcInVzYS1mb290ZXJfX3NlY29uZGFyeS1saW5rXCI6IGdcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCBfbCh7XG4gICAgICAgIGNsYXNzTmFtZTogX1xuICAgICAgfSwgbSksIHQubWFwKGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICAgICAgICBrZXk6IFwiaXRlbV9cIiArIHQsXG4gICAgICAgICAgY2xhc3NOYW1lOiBoXG4gICAgICAgIH0sIGUpO1xuICAgICAgfSkpO1xuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0LkxhYmVsID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDApKSxcbiAgICAgICAgbiA9IG8ocigxKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9pID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIHZhciB0ID0gZS5jaGlsZHJlbixcbiAgICAgICAgICByID0gZS5odG1sRm9yLFxuICAgICAgICAgIG8gPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICB1ID0gZS5lcnJvcixcbiAgICAgICAgICBjID0gZS5oaW50LFxuICAgICAgICAgIHMgPSBlLnNyT25seSxcbiAgICAgICAgICBkID0gbChlLCBbXCJjaGlsZHJlblwiLCBcImh0bWxGb3JcIiwgXCJjbGFzc05hbWVcIiwgXCJlcnJvclwiLCBcImhpbnRcIiwgXCJzck9ubHlcIl0pLFxuICAgICAgICAgIGYgPSAoMCwgbi5kZWZhdWx0KSh7XG4gICAgICAgIFwidXNhLWxhYmVsXCI6ICFzLFxuICAgICAgICBcInVzYS1zci1vbmx5XCI6IHMsXG4gICAgICAgIFwidXNhLWxhYmVsLS1lcnJvclwiOiB1XG4gICAgICB9LCBvKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImxhYmVsXCIsIF9pKHt9LCBkLCB7XG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJsYWJlbFwiLFxuICAgICAgICBjbGFzc05hbWU6IGYsXG4gICAgICAgIGh0bWxGb3I6IHJcbiAgICAgIH0pLCB0LCBjICYmIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtaGludFwiXG4gICAgICB9LCBjKSk7XG4gICAgfTtcblxuICAgIHQuTGFiZWwgPSB1O1xuICAgIHZhciBjID0gdTtcbiAgICB0LmRlZmF1bHQgPSBjO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5JTlRFUk5BTF9EQVRFX0ZPUk1BVCA9IHQuREVGQVVMVF9FWFRFUk5BTF9EQVRFX0ZPUk1BVCA9IHQuREVGQVVMVF9NSU5fREFURSA9IHQuWUVBUl9DSFVOSyA9IHQuRU5URVJfS0VZQ09ERSA9IHQuREFZX09GX1dFRUtfU0hPUlRfTEFCRUxTID0gdC5EQVlfT0ZfV0VFS19MQUJFTFMgPSB0Lk1PTlRIX0xBQkVMUyA9IHQuVkFMSURBVElPTl9NRVNTQUdFID0gdm9pZCAwO1xuICAgIHQuVkFMSURBVElPTl9NRVNTQUdFID0gXCJQbGVhc2UgZW50ZXIgYSB2YWxpZCBkYXRlXCI7XG4gICAgdC5NT05USF9MQUJFTFMgPSBbXCJKYW51YXJ5XCIsIFwiRmVicnVhcnlcIiwgXCJNYXJjaFwiLCBcIkFwcmlsXCIsIFwiTWF5XCIsIFwiSnVuZVwiLCBcIkp1bHlcIiwgXCJBdWd1c3RcIiwgXCJTZXB0ZW1iZXJcIiwgXCJPY3RvYmVyXCIsIFwiTm92ZW1iZXJcIiwgXCJEZWNlbWJlclwiXTtcbiAgICB0LkRBWV9PRl9XRUVLX0xBQkVMUyA9IFtcIlN1bmRheVwiLCBcIk1vbmRheVwiLCBcIlR1ZXNkYXlcIiwgXCJXZWRuZXNkYXlcIiwgXCJUaHVyc2RheVwiLCBcIkZyaWRheVwiLCBcIlNhdHVyZGF5XCJdO1xuICAgIHQuREFZX09GX1dFRUtfU0hPUlRfTEFCRUxTID0gW1wiU1wiLCBcIk1cIiwgXCJUXCIsIFwiV1wiLCBcIlRoXCIsIFwiRlwiLCBcIlNcIl07XG4gICAgdC5FTlRFUl9LRVlDT0RFID0gMTM7XG4gICAgdC5ZRUFSX0NIVU5LID0gMTI7XG4gICAgdC5ERUZBVUxUX01JTl9EQVRFID0gXCIwMDAwLTAxLTAxXCI7XG4gICAgdC5ERUZBVUxUX0VYVEVSTkFMX0RBVEVfRk9STUFUID0gXCJNTS9ERC9ZWVlZXCI7XG4gICAgdC5JTlRFUk5BTF9EQVRFX0ZPUk1BVCA9IFwiWVlZWS1NTS1ERFwiO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZWZhdWx0ID0gdC5UZXh0SW5wdXQgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBpKHIoMCkpLFxuICAgICAgICBuID0gaShyKDEpKSxcbiAgICAgICAgbyA9IHIoMik7XG5cbiAgICBmdW5jdGlvbiBpKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9sMiA9IGZ1bmN0aW9uIGwoKSB7XG4gICAgICByZXR1cm4gKF9sMiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICAgICAgYyA9IGZ1bmN0aW9uIGMoZSkge1xuICAgICAgdmFyIHQgPSBlLmlkLFxuICAgICAgICAgIHIgPSBlLm5hbWUsXG4gICAgICAgICAgaSA9IGUudHlwZSxcbiAgICAgICAgICBjID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgcyA9IGUudmFsaWRhdGlvblN0YXR1cyxcbiAgICAgICAgICBkID0gZS5lcnJvcixcbiAgICAgICAgICBmID0gZS5zdWNjZXNzLFxuICAgICAgICAgIHAgPSBlLmlucHV0U2l6ZSxcbiAgICAgICAgICBtID0gZS5zbWFsbCxcbiAgICAgICAgICB5ID0gZS5tZWRpdW0sXG4gICAgICAgICAgYiA9IGUuaW5wdXRSZWYsXG4gICAgICAgICAgdiA9IHUoZSwgW1wiaWRcIiwgXCJuYW1lXCIsIFwidHlwZVwiLCBcImNsYXNzTmFtZVwiLCBcInZhbGlkYXRpb25TdGF0dXNcIiwgXCJlcnJvclwiLCBcInN1Y2Nlc3NcIiwgXCJpbnB1dFNpemVcIiwgXCJzbWFsbFwiLCBcIm1lZGl1bVwiLCBcImlucHV0UmVmXCJdKTtcbiAgICAgIGQgJiYgKDAsIG8uZGVwcmVjYXRpb25XYXJuaW5nKShcIlRleHRJbnB1dCBwcm9wZXJ0eSBlcnJvciBpcyBkZXByZWNhdGVkLiAgVXNlIHZhbGlkYXRpb25TdGF0dXNcIiksIGYgJiYgKDAsIG8uZGVwcmVjYXRpb25XYXJuaW5nKShcIlRleHRJbnB1dCBwcm9wZXJ0eSBzdWNjZXNzIGlzIGRlcHJlY2F0ZWQuICBVc2UgdmFsaWRhdGlvblN0YXR1c1wiKSwgbSAmJiAoMCwgby5kZXByZWNhdGlvbldhcm5pbmcpKFwiVGV4dElucHV0IHByb3BlcnR5IHNtYWxsIGlzIGRlcHJlY2F0ZWQuICBVc2UgaW5wdXRTaXplXCIpLCB5ICYmICgwLCBvLmRlcHJlY2F0aW9uV2FybmluZykoXCJUZXh0SW5wdXQgcHJvcGVydHkgbWVkaXVtIGlzIGRlcHJlY2F0ZWQuICBVc2UgaW5wdXRTaXplXCIpO1xuXG4gICAgICB2YXIgTyA9IHMgPyBcImVycm9yXCIgPT09IHMgOiBkLFxuICAgICAgICAgIGcgPSBzID8gXCJzdWNjZXNzXCIgPT09IHMgOiBmLFxuICAgICAgICAgIF8gPSBwID8gXCJzbWFsbFwiID09PSBwIDogbSxcbiAgICAgICAgICBoID0gcCA/IFwibWVkaXVtXCIgPT09IHAgOiB5LFxuICAgICAgICAgIGogPSAoMCwgbi5kZWZhdWx0KShcInVzYS1pbnB1dFwiLCB7XG4gICAgICAgIFwidXNhLWlucHV0LS1lcnJvclwiOiBPLFxuICAgICAgICBcInVzYS1pbnB1dC0tc3VjY2Vzc1wiOiBnLFxuICAgICAgICBcInVzYS1pbnB1dC0tc21hbGxcIjogXyxcbiAgICAgICAgXCJ1c2EtaW5wdXQtLW1lZGl1bVwiOiBoXG4gICAgICB9LCBjKTtcblxuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiwgX2wyKHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcInRleHRJbnB1dFwiLFxuICAgICAgICBjbGFzc05hbWU6IGosXG4gICAgICAgIGlkOiB0LFxuICAgICAgICBuYW1lOiByLFxuICAgICAgICB0eXBlOiBpLFxuICAgICAgICByZWY6IGJcbiAgICAgIH0sIHYpKTtcbiAgICB9O1xuXG4gICAgdC5UZXh0SW5wdXQgPSBjO1xuICAgIHZhciBzID0gYztcbiAgICB0LmRlZmF1bHQgPSBzO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5Gb3JtR3JvdXAgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0LkZvcm1Hcm91cCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgciA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIG8gPSBlLmVycm9yLFxuICAgICAgICAgIGkgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1mb3JtLWdyb3VwXCIsIHtcbiAgICAgICAgXCJ1c2EtZm9ybS1ncm91cC0tZXJyb3JcIjogb1xuICAgICAgfSwgcik7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiZm9ybUdyb3VwXCIsXG4gICAgICAgIGNsYXNzTmFtZTogaVxuICAgICAgfSwgdCk7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuc2FtcGxlTG9jYWxpemF0aW9uID0gdC5FTl9VUyA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IHIoNiksXG4gICAgICAgIG4gPSB7XG4gICAgICBtb250aHM6IGEuTU9OVEhfTEFCRUxTLFxuICAgICAgZGF5c09mV2VlazogYS5EQVlfT0ZfV0VFS19MQUJFTFMsXG4gICAgICBkYXlzT2ZXZWVrU2hvcnQ6IGEuREFZX09GX1dFRUtfU0hPUlRfTEFCRUxTLFxuICAgICAgc3RhdHVzZXM6IFtcIllvdSBjYW4gbmF2aWdhdGUgYnkgZGF5IHVzaW5nIGxlZnQgYW5kIHJpZ2h0IGFycm93c1wiLCBcIldlZWtzIGJ5IHVzaW5nIHVwIGFuZCBkb3duIGFycm93c1wiLCBcIk1vbnRocyBieSB1c2luZyBwYWdlIHVwIGFuZCBwYWdlIGRvd24ga2V5c1wiLCBcIlllYXJzIGJ5IHVzaW5nIHNoaWZ0IHBsdXMgcGFnZSB1cCBhbmQgc2hpZnQgcGx1cyBwYWdlIGRvd25cIiwgXCJIb21lIGFuZCBlbmQga2V5cyBuYXZpZ2F0ZSB0byB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgYSB3ZWVrXCJdLFxuICAgICAgc2VsZWN0ZWREYXRlOiBcIlNlbGVjdGVkIGRhdGVcIixcbiAgICAgIHNlbGVjdEFNb250aDogXCJTZWxlY3QgYSBtb250aC5cIixcbiAgICAgIHRvZ2dsZUNhbGVuZGFyOiBcIlRvZ2dsZSBjYWxlbmRhclwiLFxuICAgICAgYmFja09uZVllYXI6IFwiTmF2aWdhdGUgYmFjayBvbmUgeWVhclwiLFxuICAgICAgYmFja09uZU1vbnRoOiBcIk5hdmlnYXRlIGJhY2sgb25lIG1vbnRoXCIsXG4gICAgICBmb3J3YXJkT25lWWVhcjogXCJOYXZpZ2F0ZSBmb3J3YXJkIG9uZSB5ZWFyXCIsXG4gICAgICBmb3J3YXJkT25lTW9udGg6IFwiTmF2aWdhdGUgZm9yd2FyZCBvbmUgbW9udGhcIixcbiAgICAgIGNsaWNrVG9TZWxlY3RNb250aDogXCJDbGljayB0byBzZWxlY3QgbW9udGhcIixcbiAgICAgIGNsaWNrVG9TZWxlY3RZZWFyOiBcIkNsaWNrIHRvIHNlbGVjdCB5ZWFyXCJcbiAgICB9O1xuICAgIHQuRU5fVVMgPSBuO1xuICAgIHQuc2FtcGxlTG9jYWxpemF0aW9uID0ge1xuICAgICAgbW9udGhzOiBbXCJlbmVyb1wiLCBcImZlYnJlcm9cIiwgXCJtYXJ6b1wiLCBcImFicmlsXCIsIFwibWF5b1wiLCBcImp1bmlvXCIsIFwianVsaW9cIiwgXCJhZ29zdG9cIiwgXCJzZXB0aWVtYnJlXCIsIFwib2N0dWJyZVwiLCBcIm5vdmllbWJyZVwiLCBcImRpY2llbWJyZVwiXSxcbiAgICAgIGRheXNPZldlZWs6IFtcImRvbWluZ29cIiwgXCJsdW5lc1wiLCBcIm1hcnRlc1wiLCBcIm1pw6lyY29sZXNcIiwgXCJqdWV2ZXNcIiwgXCJ2aWVybmVzXCIsIFwic8OhYmFkb1wiXSxcbiAgICAgIGRheXNPZldlZWtTaG9ydDogW1wiRG9cIiwgXCJMdVwiLCBcIk1hXCIsIFwiTWlcIiwgXCJKdVwiLCBcIlZpXCIsIFwiU2FcIl0sXG4gICAgICBzdGF0dXNlczogW1wiUHVlZGUgbmF2ZWdhciBwb3IgZMOtYSB1c2FuZG8gbGFzIGZsZWNoYXMgaXpxdWllcmRhIHkgZGVyZWNoYVwiLCBcIlNlbWFuYXMgdXNhbmRvIGZsZWNoYXMgaGFjaWEgYXJyaWJhIHkgaGFjaWEgYWJham9cIiwgXCJNZXNlcyB1c2FuZG8gbGFzIHRlY2xhcyBkZSBhdmFuY2UgeSByZXRyb2Nlc28gZGUgcMOhZ2luYVwiLCBcIkHDsW9zIHVzYW5kbyBzaGlmdCBwbHVzIHBhZ2UgdXAgeSBzaGlmdCBwbHVzIHBhZ2UgZG93blwiLCBcIkxhcyB0ZWNsYXMgZGUgaW5pY2lvIHkgZmluYWxpemFjacOzbiBuYXZlZ2FuIGhhc3RhIGVsIHByaW5jaXBpbyB5IGVsIGZpbmFsIGRlIHVuYSBzZW1hbmFcIl0sXG4gICAgICBzZWxlY3RlZERhdGU6IFwiRmVjaGEgc2VsZWNjaW9uYWRhXCIsXG4gICAgICBzZWxlY3RBTW9udGg6IFwiU2VsZWNjaW9uYSB1biBtZXMuXCIsXG4gICAgICB0b2dnbGVDYWxlbmRhcjogXCJBbHRlcm5hciBjYWxlbmRhcmlvXCIsXG4gICAgICBiYWNrT25lWWVhcjogXCJOYXZlZ2FyIGhhY2lhIGF0csOhcyB1biBhw7FvXCIsXG4gICAgICBiYWNrT25lTW9udGg6IFwiTmF2ZWdhciBoYWNpYSBhdHLDoXMgdW4gbWVzXCIsXG4gICAgICBmb3J3YXJkT25lWWVhcjogXCJOYXZlZ2FyIGhhY2lhIGFkZWxhbnRlIHVuIGHDsW9cIixcbiAgICAgIGZvcndhcmRPbmVNb250aDogXCJOYXZlZ2FyIGhhY2lhIGFkZWxhbnRlIHVuIG1lc1wiLFxuICAgICAgY2xpY2tUb1NlbGVjdE1vbnRoOiBcIkhhZ2EgY2xpYyBwYXJhIHNlbGVjY2lvbmFyIGVsIG1lc1wiLFxuICAgICAgY2xpY2tUb1NlbGVjdFllYXI6IFwiSGFnYSBjbGljIHBhcmEgc2VsZWNjaW9uYXIgZWwgYcOxb1wiXG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuaXNDdXN0b21Qcm9wcyA9IHUsIHQuTGluayA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAodShlKSkge1xuICAgICAgICB2YXIgdCA9IGUudmFyaWFudCxcbiAgICAgICAgICAgIHIgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICAgIG4gPSBlLmFzQ3VzdG9tLFxuICAgICAgICAgICAgbyA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgICBzID0gbChlLCBbXCJ2YXJpYW50XCIsIFwiY2xhc3NOYW1lXCIsIFwiYXNDdXN0b21cIiwgXCJjaGlsZHJlblwiXSksXG4gICAgICAgICAgICBkID0gYyh0LCByKTtcbiAgICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KG4sIF9pMih7XG4gICAgICAgICAgY2xhc3NOYW1lOiBkXG4gICAgICAgIH0sIHMpLCBvKTtcbiAgICAgIH1cblxuICAgICAgbyA9IGUuY2hpbGRyZW4sIHIgPSBlLmNsYXNzTmFtZSwgdCA9IGUudmFyaWFudCwgcyA9IGwoZSwgW1wiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJ2YXJpYW50XCJdKSwgZCA9IGModCwgcik7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJhXCIsIF9pMih7XG4gICAgICAgIGNsYXNzTmFtZTogZFxuICAgICAgfSwgcyksIG8pO1xuICAgIH07XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2kyID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kyID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBsID0gZnVuY3Rpb24gbChlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gdShlKSB7XG4gICAgICByZXR1cm4gXCJhc0N1c3RvbVwiIGluIGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYyhlLCB0KSB7XG4gICAgICB2YXIgciA9IFwiZXh0ZXJuYWxcIiA9PT0gZSxcbiAgICAgICAgICBhID0gXCJuYXZcIiA9PT0gZTtcbiAgICAgIHJldHVybiBcInVuc3R5bGVkXCIgPT09IGUgPyB0IDogKDAsIG4uZGVmYXVsdCkoXCJ1c2EtbGlua1wiLCB7XG4gICAgICAgIFwidXNhLWxpbmstLWV4dGVybmFsXCI6IHIsXG4gICAgICAgIFwidXNhLW5hdl9fbGlua1wiOiBhXG4gICAgICB9LCB0KTtcbiAgICB9XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0LkNvbWJvQm94ID0gdC5Gb2N1c01vZGUgPSB2b2lkIDA7XG5cbiAgICB2YXIgYSxcbiAgICAgICAgbiA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICBpZiAoIXQgJiYgZSAmJiBlLl9fZXNNb2R1bGUpIHJldHVybiBlO1xuICAgICAgaWYgKG51bGwgPT09IGUgfHwgXCJvYmplY3RcIiAhPSB0eXBlb2YgZSAmJiBcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIGUpIHJldHVybiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgICB2YXIgciA9IGwodCk7XG4gICAgICBpZiAociAmJiByLmhhcyhlKSkgcmV0dXJuIHIuZ2V0KGUpO1xuICAgICAgdmFyIGEgPSB7fSxcbiAgICAgICAgICBuID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbiAgICAgIGZvciAodmFyIG8gaW4gZSkge1xuICAgICAgICBpZiAoXCJkZWZhdWx0XCIgIT09IG8gJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIG8pKSB7XG4gICAgICAgICAgdmFyIGkgPSBuID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCBvKSA6IG51bGw7XG4gICAgICAgICAgaSAmJiAoaS5nZXQgfHwgaS5zZXQpID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsIG8sIGkpIDogYVtvXSA9IGVbb107XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYS5kZWZhdWx0ID0gZSwgciAmJiByLnNldChlLCBhKTtcbiAgICAgIHJldHVybiBhO1xuICAgIH0ocigwKSksXG4gICAgICAgIG8gPSAoYSA9IHIoMSkpICYmIGEuX19lc01vZHVsZSA/IGEgOiB7XG4gICAgICBkZWZhdWx0OiBhXG4gICAgfSxcbiAgICAgICAgaSA9IHIoNDkpO1xuXG4gICAgZnVuY3Rpb24gbChlKSB7XG4gICAgICBpZiAoXCJmdW5jdGlvblwiICE9IHR5cGVvZiBXZWFrTWFwKSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciB0ID0gbmV3IFdlYWtNYXAoKSxcbiAgICAgICAgICByID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgIHJldHVybiAobCA9IGZ1bmN0aW9uIGwoZSkge1xuICAgICAgICByZXR1cm4gZSA/IHIgOiB0O1xuICAgICAgfSkoZSk7XG4gICAgfVxuXG4gICAgdmFyIHUsXG4gICAgICAgIGMsXG4gICAgICAgIF9zID0gZnVuY3Rpb24gcygpIHtcbiAgICAgIHJldHVybiAoX3MgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGQgPSBmdW5jdGlvbiBkKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH07XG5cbiAgICAhZnVuY3Rpb24gKGUpIHtcbiAgICAgIGVbZS5QcmV2aW91cyA9IC0xXSA9IFwiUHJldmlvdXNcIiwgZVtlLk5leHQgPSAxXSA9IFwiTmV4dFwiO1xuICAgIH0odSB8fCAodSA9IHt9KSksIHQuRm9jdXNNb2RlID0gYywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGVbZS5Ob25lID0gMF0gPSBcIk5vbmVcIiwgZVtlLklucHV0ID0gMV0gPSBcIklucHV0XCIsIGVbZS5JdGVtID0gMl0gPSBcIkl0ZW1cIjtcbiAgICB9KGMgfHwgKHQuRm9jdXNNb2RlID0gYyA9IHt9KSk7XG5cbiAgICB2YXIgZiA9IGZ1bmN0aW9uIGYoZSkge1xuICAgICAgdmFyIHQgPSBlLmZvY3VzZWQsXG4gICAgICAgICAgciA9IGQoZSwgW1wiZm9jdXNlZFwiXSksXG4gICAgICAgICAgYSA9ICgwLCBuLnVzZVJlZikobnVsbCk7XG4gICAgICByZXR1cm4gKDAsIG4udXNlRWZmZWN0KShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHQgJiYgYS5jdXJyZW50ICYmIGEuY3VycmVudC5mb2N1cygpO1xuICAgICAgfSksIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiwgX3Moe1xuICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1jb21iby1ib3hfX2lucHV0XCIsXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJjb21iby1ib3gtaW5wdXRcIlxuICAgICAgfSwgciwge1xuICAgICAgICBhdXRvQ2FwaXRhbGl6ZTogXCJvZmZcIixcbiAgICAgICAgYXV0b0NvbXBsZXRlOiBcIm9mZlwiLFxuICAgICAgICByZWY6IGFcbiAgICAgIH0pKTtcbiAgICB9LFxuICAgICAgICBwID0gZnVuY3Rpb24gcChlKSB7XG4gICAgICB2YXIgdCxcbiAgICAgICAgICByLFxuICAgICAgICAgIGEgPSBlLmlkLFxuICAgICAgICAgIGwgPSBlLm5hbWUsXG4gICAgICAgICAgZCA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHAgPSBlLm9wdGlvbnMsXG4gICAgICAgICAgbSA9IGUuZGVmYXVsdFZhbHVlLFxuICAgICAgICAgIHkgPSBlLmRpc2FibGVkLFxuICAgICAgICAgIGIgPSBlLm9uQ2hhbmdlLFxuICAgICAgICAgIHYgPSBlLmFzc2lzdGl2ZUhpbnQsXG4gICAgICAgICAgTyA9IGUubm9SZXN1bHRzLFxuICAgICAgICAgIGcgPSBlLnNlbGVjdFByb3BzLFxuICAgICAgICAgIF8gPSBlLmlucHV0UHJvcHMsXG4gICAgICAgICAgaCA9IGUudWxQcm9wcyxcbiAgICAgICAgICBqID0gZS5jdXN0b21GaWx0ZXIsXG4gICAgICAgICAgTSA9IGUuZGlzYWJsZUZpbHRlcmluZyxcbiAgICAgICAgICBOID0gdm9pZCAwICE9PSBNICYmIE0sXG4gICAgICAgICAgRSA9ICEheTtcbiAgICAgIG0gJiYgKHIgPSBwLmZpbmQoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIGUudmFsdWUgPT09IG07XG4gICAgICB9KSk7XG4gICAgICB2YXIgUCA9IGogfHwge1xuICAgICAgICBmaWx0ZXI6IFwiLip7e3F1ZXJ5fX0uKlwiXG4gICAgICB9LFxuICAgICAgICAgIHcgPSB7XG4gICAgICAgIGlzT3BlbjogITEsXG4gICAgICAgIHNlbGVjdGVkT3B0aW9uOiByIHx8IHZvaWQgMCxcbiAgICAgICAgZm9jdXNlZE9wdGlvbjogdm9pZCAwLFxuICAgICAgICBmb2N1c01vZGU6IGMuTm9uZSxcbiAgICAgICAgZmlsdGVyZWRPcHRpb25zOiBwLFxuICAgICAgICBpbnB1dFZhbHVlOiByID8gci5sYWJlbCA6IFwiXCJcbiAgICAgIH0sXG4gICAgICAgICAgSSA9ICgwLCBpLnVzZUNvbWJvQm94KSh3LCBwLCBOLCBQKSxcbiAgICAgICAgICBEID0gSVswXSxcbiAgICAgICAgICBTID0gSVsxXSxcbiAgICAgICAgICB4ID0gKDAsIG4udXNlUmVmKShudWxsKSxcbiAgICAgICAgICBrID0gKDAsIG4udXNlUmVmKShudWxsKTtcbiAgICAgICgwLCBuLnVzZUVmZmVjdCkoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZTtcbiAgICAgICAgYiAmJiBiKChudWxsID09PSAoZSA9IEQuc2VsZWN0ZWRPcHRpb24pIHx8IHZvaWQgMCA9PT0gZSA/IHZvaWQgMCA6IGUudmFsdWUpIHx8IHZvaWQgMCk7XG4gICAgICB9LCBbRC5zZWxlY3RlZE9wdGlvbl0pLCAoMCwgbi51c2VFZmZlY3QpKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgRC5mb2N1c01vZGUgPT09IGMuSXRlbSAmJiBELmZvY3VzZWRPcHRpb24gJiYgay5jdXJyZW50ICYmIGsuY3VycmVudC5mb2N1cygpO1xuICAgICAgfSwgW0QuZm9jdXNNb2RlLCBELmZvY3VzZWRPcHRpb25dKSwgKDAsIG4udXNlRWZmZWN0KShmdW5jdGlvbiAoKSB7XG4gICAgICAgIEQuaXNPcGVuICYmIEQuZm9jdXNlZE9wdGlvbiAmJiBrLmN1cnJlbnQgJiYgRC5mb2N1c01vZGUgPT09IGMuSW5wdXQgJiYgay5jdXJyZW50LnNjcm9sbEludG9WaWV3KCExKTtcbiAgICAgIH0sIFtELmlzT3BlbiwgRC5mb2N1c2VkT3B0aW9uXSksICgwLCBuLnVzZUVmZmVjdCkoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZTtcbiAgICAgICAgRC5mb2N1c01vZGUgIT09IGMuTm9uZSAmJiAoKG51bGwgPT09IChlID0geC5jdXJyZW50KSB8fCB2b2lkIDAgPT09IGUgPyB2b2lkIDAgOiBlLmNvbnRhaW5zKHdpbmRvdy5kb2N1bWVudC5hY3RpdmVFbGVtZW50KSkgfHwgUyh7XG4gICAgICAgICAgdHlwZTogaS5BY3Rpb25UeXBlcy5CTFVSXG4gICAgICAgIH0pKTtcbiAgICAgIH0sIFtELmZvY3VzTW9kZV0pO1xuXG4gICAgICB2YXIgQSA9IGZ1bmN0aW9uIEEoZSwgdCwgcikge1xuICAgICAgICB2YXIgYSA9IHQuZm9jdXNlZE9wdGlvbiA/IHQuZmlsdGVyZWRPcHRpb25zLmluZGV4T2YodC5mb2N1c2VkT3B0aW9uKSA6IC0xLFxuICAgICAgICAgICAgbiA9IHQuZmlsdGVyZWRPcHRpb25zWzBdLFxuICAgICAgICAgICAgbyA9IHQuZmlsdGVyZWRPcHRpb25zW3QuZmlsdGVyZWRPcHRpb25zLmxlbmd0aCAtIDFdO1xuICAgICAgICBpZiAoLTEgPT09IGEpIGUoe1xuICAgICAgICAgIHR5cGU6IGkuQWN0aW9uVHlwZXMuRk9DVVNfT1BUSU9OLFxuICAgICAgICAgIG9wdGlvbjogblxuICAgICAgICB9KTtlbHNlIHtcbiAgICAgICAgICB2YXIgbCA9IGEgKyByO1xuICAgICAgICAgIGlmIChsIDwgMCAmJiB0LnNlbGVjdGVkT3B0aW9uKSBlKHtcbiAgICAgICAgICAgIHR5cGU6IGkuQWN0aW9uVHlwZXMuRk9DVVNfT1BUSU9OLFxuICAgICAgICAgICAgb3B0aW9uOiBuXG4gICAgICAgICAgfSk7ZWxzZSBpZiAobCA8IDApIGUoe1xuICAgICAgICAgICAgdHlwZTogaS5BY3Rpb25UeXBlcy5DTE9TRV9MSVNUXG4gICAgICAgICAgfSk7ZWxzZSBpZiAobCA+PSB0LmZpbHRlcmVkT3B0aW9ucy5sZW5ndGgpIGUoe1xuICAgICAgICAgICAgdHlwZTogaS5BY3Rpb25UeXBlcy5GT0NVU19PUFRJT04sXG4gICAgICAgICAgICBvcHRpb246IG9cbiAgICAgICAgICB9KTtlbHNlIHtcbiAgICAgICAgICAgIHZhciB1ID0gdC5maWx0ZXJlZE9wdGlvbnNbbF07XG4gICAgICAgICAgICBlKHtcbiAgICAgICAgICAgICAgdHlwZTogaS5BY3Rpb25UeXBlcy5GT0NVU19PUFRJT04sXG4gICAgICAgICAgICAgIG9wdGlvbjogdVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgICAgIFQgPSBmdW5jdGlvbiBUKGUpIHtcbiAgICAgICAgdmFyIHQsXG4gICAgICAgICAgICByID0gZS5yZWxhdGVkVGFyZ2V0O1xuICAgICAgICAoIXIgfHwgciBpbnN0YW5jZW9mIE5vZGUgJiYgIShudWxsID09PSAodCA9IHguY3VycmVudCkgfHwgdm9pZCAwID09PSB0ID8gdm9pZCAwIDogdC5jb250YWlucyhyKSkpICYmIFMoe1xuICAgICAgICAgIHR5cGU6IGkuQWN0aW9uVHlwZXMuQkxVUlxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICAgICAgQyA9IGZ1bmN0aW9uIEMoZSkge1xuICAgICAgICBcIkVzY2FwZVwiID09PSBlLmtleSA/IFMoe1xuICAgICAgICAgIHR5cGU6IGkuQWN0aW9uVHlwZXMuQ0xPU0VfTElTVFxuICAgICAgICB9KSA6IFwiVGFiXCIgPT09IGUua2V5IHx8IFwiRW50ZXJcIiA9PT0gZS5rZXkgPyAoZS5wcmV2ZW50RGVmYXVsdCgpLCBELmZvY3VzZWRPcHRpb24gJiYgUyh7XG4gICAgICAgICAgdHlwZTogaS5BY3Rpb25UeXBlcy5TRUxFQ1RfT1BUSU9OLFxuICAgICAgICAgIG9wdGlvbjogRC5mb2N1c2VkT3B0aW9uXG4gICAgICAgIH0pKSA6IFwiQXJyb3dEb3duXCIgPT09IGUua2V5IHx8IFwiRG93blwiID09PSBlLmtleSA/IChlLnByZXZlbnREZWZhdWx0KCksIEEoUywgRCwgdS5OZXh0KSkgOiBcIkFycm93VXBcIiAhPT0gZS5rZXkgJiYgXCJVcFwiICE9PSBlLmtleSB8fCAoZS5wcmV2ZW50RGVmYXVsdCgpLCBBKFMsIEQsIHUuUHJldmlvdXMpKTtcbiAgICAgIH0sXG4gICAgICAgICAgTCA9IEQuc2VsZWN0ZWRPcHRpb24gJiYgRC5zZWxlY3RlZE9wdGlvbi5sYWJlbCA9PT0gRC5pbnB1dFZhbHVlLFxuICAgICAgICAgIEYgPSAoMCwgby5kZWZhdWx0KShcInVzYS1jb21iby1ib3hcIiwgZCwge1xuICAgICAgICBcInVzYS1jb21iby1ib3gtLXByaXN0aW5lXCI6IExcbiAgICAgIH0pLFxuICAgICAgICAgIFIgPSBcImNvbWJvYm94LVwiICsgbCArIFwiLWxpc3RcIixcbiAgICAgICAgICBVID0gXCJjb21ib2JveC1cIiArIGwgKyBcIi1hc3Npc3RpdmUtaGludFwiO1xuXG4gICAgICByZXR1cm4gbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiY29tYm8tYm94XCIsXG4gICAgICAgIGNsYXNzTmFtZTogRixcbiAgICAgICAgaWQ6IGEsXG4gICAgICAgIHJlZjogeFxuICAgICAgfSwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzZWxlY3RcIiwgX3Moe1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLXNlbGVjdCB1c2Etc3Itb25seSB1c2EtY29tYm8tYm94X19zZWxlY3RcIixcbiAgICAgICAgbmFtZTogbCxcbiAgICAgICAgXCJhcmlhLWhpZGRlblwiOiAhMCxcbiAgICAgICAgdGFiSW5kZXg6IC0xLFxuICAgICAgICBkZWZhdWx0VmFsdWU6IG51bGwgPT09ICh0ID0gRC5zZWxlY3RlZE9wdGlvbikgfHwgdm9pZCAwID09PSB0ID8gdm9pZCAwIDogdC52YWx1ZSxcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImNvbWJvLWJveC1zZWxlY3RcIixcbiAgICAgICAgZGlzYWJsZWQ6IEVcbiAgICAgIH0sIGcpLCBwLm1hcChmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJvcHRpb25cIiwge1xuICAgICAgICAgIGtleTogZS52YWx1ZSxcbiAgICAgICAgICB2YWx1ZTogZS52YWx1ZVxuICAgICAgICB9LCBlLmxhYmVsKTtcbiAgICAgIH0pKSwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoZiwgX3Moe1xuICAgICAgICBvbkNoYW5nZTogZnVuY3Rpb24gb25DaGFuZ2UoZSkge1xuICAgICAgICAgIHJldHVybiBTKHtcbiAgICAgICAgICAgIHR5cGU6IGkuQWN0aW9uVHlwZXMuVVBEQVRFX0ZJTFRFUixcbiAgICAgICAgICAgIHZhbHVlOiBlLnRhcmdldC52YWx1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKCkge1xuICAgICAgICAgIHJldHVybiBTKHtcbiAgICAgICAgICAgIHR5cGU6IGkuQWN0aW9uVHlwZXMuT1BFTl9MSVNUXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uQmx1cjogZnVuY3Rpb24gb25CbHVyKGUpIHtcbiAgICAgICAgICB2YXIgdCxcbiAgICAgICAgICAgICAgciA9IGUucmVsYXRlZFRhcmdldDtcbiAgICAgICAgICAoIXIgfHwgciBpbnN0YW5jZW9mIE5vZGUgJiYgIShudWxsID09PSAodCA9IHguY3VycmVudCkgfHwgdm9pZCAwID09PSB0ID8gdm9pZCAwIDogdC5jb250YWlucyhyKSkpICYmIEQuZm9jdXNNb2RlICE9PSBjLk5vbmUgJiYgUyh7XG4gICAgICAgICAgICB0eXBlOiBpLkFjdGlvblR5cGVzLkJMVVJcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25LZXlEb3duOiBmdW5jdGlvbiBvbktleURvd24oZSkge1xuICAgICAgICAgIGlmIChcIkVzY2FwZVwiID09PSBlLmtleSkgUyh7XG4gICAgICAgICAgICB0eXBlOiBpLkFjdGlvblR5cGVzLkNMT1NFX0xJU1RcbiAgICAgICAgICB9KTtlbHNlIGlmIChcIkFycm93RG93blwiID09PSBlLmtleSB8fCBcIkRvd25cIiA9PSBlLmtleSkgZS5wcmV2ZW50RGVmYXVsdCgpLCBTKHtcbiAgICAgICAgICAgIHR5cGU6IGkuQWN0aW9uVHlwZXMuRk9DVVNfT1BUSU9OLFxuICAgICAgICAgICAgb3B0aW9uOiBELnNlbGVjdGVkT3B0aW9uIHx8IEQuZm9jdXNlZE9wdGlvbiB8fCBELmZpbHRlcmVkT3B0aW9uc1swXVxuICAgICAgICAgIH0pO2Vsc2UgaWYgKFwiVGFiXCIgPT09IGUua2V5KSB7XG4gICAgICAgICAgICBpZiAoRC5pc09wZW4gJiYgIUQuc2VsZWN0ZWRPcHRpb24pIHtcbiAgICAgICAgICAgICAgdmFyIHQgPSBOID8gRC5mb2N1c2VkT3B0aW9uIDogRC5zZWxlY3RlZE9wdGlvbiB8fCBELmZvY3VzZWRPcHRpb247XG4gICAgICAgICAgICAgIHQgPyAoZS5wcmV2ZW50RGVmYXVsdCgpLCBTKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBpLkFjdGlvblR5cGVzLkZPQ1VTX09QVElPTixcbiAgICAgICAgICAgICAgICBvcHRpb246IHRcbiAgICAgICAgICAgICAgfSkpIDogUyh7XG4gICAgICAgICAgICAgICAgdHlwZTogaS5BY3Rpb25UeXBlcy5CTFVSXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAhRC5pc09wZW4gJiYgRC5zZWxlY3RlZE9wdGlvbiAmJiBTKHtcbiAgICAgICAgICAgICAgdHlwZTogaS5BY3Rpb25UeXBlcy5CTFVSXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKFwiRW50ZXJcIiA9PT0gZS5rZXkgJiYgRC5pc09wZW4pIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHZhciByID0gRC5maWx0ZXJlZE9wdGlvbnMuZmluZChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZS5sYWJlbC50b0xvd2VyQ2FzZSgpID09PSBELmlucHV0VmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgciA/IFMoe1xuICAgICAgICAgICAgICB0eXBlOiBpLkFjdGlvblR5cGVzLlNFTEVDVF9PUFRJT04sXG4gICAgICAgICAgICAgIG9wdGlvbjogclxuICAgICAgICAgICAgfSkgOiBELnNlbGVjdGVkT3B0aW9uID8gUyh7XG4gICAgICAgICAgICAgIHR5cGU6IGkuQWN0aW9uVHlwZXMuQ0xPU0VfTElTVFxuICAgICAgICAgICAgfSkgOiBTKHtcbiAgICAgICAgICAgICAgdHlwZTogaS5BY3Rpb25UeXBlcy5DTEVBUlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB2YWx1ZTogRC5pbnB1dFZhbHVlLFxuICAgICAgICBmb2N1c2VkOiBELmZvY3VzTW9kZSA9PT0gYy5JbnB1dCxcbiAgICAgICAgcm9sZTogXCJjb21ib2JveFwiLFxuICAgICAgICBcImFyaWEtb3duc1wiOiBSLFxuICAgICAgICBcImFyaWEtZGVzY3JpYmVkYnlcIjogVSxcbiAgICAgICAgXCJhcmlhLWV4cGFuZGVkXCI6IEQuaXNPcGVuLFxuICAgICAgICBkaXNhYmxlZDogRVxuICAgICAgfSwgXykpLCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWNvbWJvLWJveF9fY2xlYXItaW5wdXRfX3dyYXBwZXJcIixcbiAgICAgICAgdGFiSW5kZXg6IC0xXG4gICAgICB9LCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtY29tYm8tYm94X19jbGVhci1pbnB1dFwiLFxuICAgICAgICBcImFyaWEtbGFiZWxcIjogXCJDbGVhciB0aGUgc2VsZWN0IGNvbnRlbnRzXCIsXG4gICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG4gICAgICAgICAgcmV0dXJuIFMoe1xuICAgICAgICAgICAgdHlwZTogaS5BY3Rpb25UeXBlcy5DTEVBUlxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiY29tYm8tYm94LWNsZWFyLWJ1dHRvblwiLFxuICAgICAgICBvbktleURvd246IGZ1bmN0aW9uIG9uS2V5RG93bihlKSB7XG4gICAgICAgICAgXCJUYWJcIiA9PT0gZS5rZXkgJiYgRC5pc09wZW4gJiYgRC5zZWxlY3RlZE9wdGlvbiAmJiAoZS5wcmV2ZW50RGVmYXVsdCgpLCBTKHtcbiAgICAgICAgICAgIHR5cGU6IGkuQWN0aW9uVHlwZXMuRk9DVVNfT1BUSU9OLFxuICAgICAgICAgICAgb3B0aW9uOiBELnNlbGVjdGVkT3B0aW9uXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9LFxuICAgICAgICBoaWRkZW46ICFMXG4gICAgICB9LCBcIsKgXCIpKSwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1jb21iby1ib3hfX2lucHV0LWJ1dHRvbi1zZXBhcmF0b3JcIlxuICAgICAgfSwgXCLCoFwiKSwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1jb21iby1ib3hfX3RvZ2dsZS1saXN0X193cmFwcGVyXCIsXG4gICAgICAgIHRhYkluZGV4OiAtMVxuICAgICAgfSwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiY29tYm8tYm94LXRvZ2dsZVwiLFxuICAgICAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWNvbWJvLWJveF9fdG9nZ2xlLWxpc3RcIixcbiAgICAgICAgdGFiSW5kZXg6IC0xLFxuICAgICAgICBcImFyaWEtbGFiZWxcIjogXCJUb2dnbGUgdGhlIGRyb3Bkb3duIGxpc3RcIixcbiAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcbiAgICAgICAgICByZXR1cm4gUyh7XG4gICAgICAgICAgICB0eXBlOiBELmlzT3BlbiA/IGkuQWN0aW9uVHlwZXMuQ0xPU0VfTElTVCA6IGkuQWN0aW9uVHlwZXMuT1BFTl9MSVNUXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGRpc2FibGVkOiBFXG4gICAgICB9LCBcIsKgXCIpKSwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCBfcyh7XG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJjb21iby1ib3gtb3B0aW9uLWxpc3RcIixcbiAgICAgICAgdGFiSW5kZXg6IC0xLFxuICAgICAgICBpZDogUixcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1jb21iby1ib3hfX2xpc3RcIixcbiAgICAgICAgcm9sZTogXCJsaXN0Ym94XCIsXG4gICAgICAgIGhpZGRlbjogIUQuaXNPcGVuXG4gICAgICB9LCBoKSwgRC5maWx0ZXJlZE9wdGlvbnMubWFwKGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICAgIHZhciByID0gZSA9PT0gRC5mb2N1c2VkT3B0aW9uLFxuICAgICAgICAgICAgYSA9IGUgPT09IEQuc2VsZWN0ZWRPcHRpb24sXG4gICAgICAgICAgICBsID0gKDAsIG8uZGVmYXVsdCkoXCJ1c2EtY29tYm8tYm94X19saXN0LW9wdGlvblwiLCB7XG4gICAgICAgICAgXCJ1c2EtY29tYm8tYm94X19saXN0LW9wdGlvbi0tZm9jdXNlZFwiOiByLFxuICAgICAgICAgIFwidXNhLWNvbWJvLWJveF9fbGlzdC1vcHRpb24tLXNlbGVjdGVkXCI6IGFcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICAgICAgICByZWY6IHIgPyBrIDogbnVsbCxcbiAgICAgICAgICB2YWx1ZTogZS52YWx1ZSxcbiAgICAgICAgICBrZXk6IGUudmFsdWUsXG4gICAgICAgICAgY2xhc3NOYW1lOiBsLFxuICAgICAgICAgIHRhYkluZGV4OiByID8gMCA6IC0xLFxuICAgICAgICAgIHJvbGU6IFwib3B0aW9uXCIsXG4gICAgICAgICAgXCJhcmlhLXNlbGVjdGVkXCI6IGEsXG4gICAgICAgICAgXCJhcmlhLXNldHNpemVcIjogNjQsXG4gICAgICAgICAgXCJhcmlhLXBvc2luc2V0XCI6IHQgKyAxLFxuICAgICAgICAgIGlkOiBSICsgXCItLW9wdGlvbi1cIiArIHQsXG4gICAgICAgICAgb25LZXlEb3duOiBDLFxuICAgICAgICAgIG9uQmx1cjogVCxcbiAgICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiY29tYm8tYm94LW9wdGlvbi1cIiArIGUudmFsdWUsXG4gICAgICAgICAgb25Nb3VzZUVudGVyOiBmdW5jdGlvbiBvbk1vdXNlRW50ZXIoKSB7XG4gICAgICAgICAgICByZXR1cm4gUyh7XG4gICAgICAgICAgICAgIHR5cGU6IGkuQWN0aW9uVHlwZXMuRk9DVVNfT1BUSU9OLFxuICAgICAgICAgICAgICBvcHRpb246IGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcbiAgICAgICAgICAgIFMoe1xuICAgICAgICAgICAgICB0eXBlOiBpLkFjdGlvblR5cGVzLlNFTEVDVF9PUFRJT04sXG4gICAgICAgICAgICAgIG9wdGlvbjogZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCBlLmxhYmVsKTtcbiAgICAgIH0pLCAwID09PSBELmZpbHRlcmVkT3B0aW9ucy5sZW5ndGggPyBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1jb21iby1ib3hfX2xpc3Qtb3B0aW9uLS1uby1yZXN1bHRzXCJcbiAgICAgIH0sIE8gfHwgXCJObyByZXN1bHRzIGZvdW5kXCIpIDogbnVsbCksIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1jb21iby1ib3hfX3N0YXR1cyB1c2Etc3Itb25seVwiLFxuICAgICAgICByb2xlOiBcInN0YXR1c1wiXG4gICAgICB9KSwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgaWQ6IFUsXG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2Etc3Itb25seVwiLFxuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiY29tYm8tYm94LWFzc2lzdGl2ZS1oaW50XCJcbiAgICAgIH0sIHYgfHwgXCJXaGVuIGF1dG9jb21wbGV0ZSByZXN1bHRzIGFyZSBhdmFpbGFibGUgdXNlIHVwIGFuZCBkb3duIGFycm93cyB0byByZXZpZXdcXG4gICAgICAgICAgIGFuZCBlbnRlciB0byBzZWxlY3QuIFRvdWNoIGRldmljZSB1c2VycywgZXhwbG9yZSBieSB0b3VjaCBvciB3aXRoIHN3aXBlXFxuICAgICAgICAgICBnZXN0dXJlcy5cIikpO1xuICAgIH07XG5cbiAgICB0LkNvbWJvQm94ID0gcDtcbiAgICB2YXIgbSA9IHA7XG4gICAgdC5kZWZhdWx0ID0gbTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuRGF0ZVBpY2tlciA9IHQuRm9jdXNNb2RlID0gdm9pZCAwO1xuXG4gICAgdmFyIGEsXG4gICAgICAgIG4gPSBmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgaWYgKCF0ICYmIGUgJiYgZS5fX2VzTW9kdWxlKSByZXR1cm4gZTtcbiAgICAgIGlmIChudWxsID09PSBlIHx8IFwib2JqZWN0XCIgIT0gdHlwZW9mIGUgJiYgXCJmdW5jdGlvblwiICE9IHR5cGVvZiBlKSByZXR1cm4ge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgICAgdmFyIHIgPSBzKHQpO1xuICAgICAgaWYgKHIgJiYgci5oYXMoZSkpIHJldHVybiByLmdldChlKTtcbiAgICAgIHZhciBhID0ge30sXG4gICAgICAgICAgbiA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4gICAgICBmb3IgKHZhciBvIGluIGUpIHtcbiAgICAgICAgaWYgKFwiZGVmYXVsdFwiICE9PSBvICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBvKSkge1xuICAgICAgICAgIHZhciBpID0gbiA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgbykgOiBudWxsO1xuICAgICAgICAgIGkgJiYgKGkuZ2V0IHx8IGkuc2V0KSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCBvLCBpKSA6IGFbb10gPSBlW29dO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGEuZGVmYXVsdCA9IGUsIHIgJiYgci5zZXQoZSwgYSk7XG4gICAgICByZXR1cm4gYTtcbiAgICB9KHIoMCkpLFxuICAgICAgICBvID0gKGEgPSByKDEpKSAmJiBhLl9fZXNNb2R1bGUgPyBhIDoge1xuICAgICAgZGVmYXVsdDogYVxuICAgIH0sXG4gICAgICAgIGkgPSByKDYpLFxuICAgICAgICBsID0gcig5KSxcbiAgICAgICAgdSA9IHIoMyksXG4gICAgICAgIGMgPSByKDUzKTtcblxuICAgIGZ1bmN0aW9uIHMoZSkge1xuICAgICAgaWYgKFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgV2Vha01hcCkgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgdCA9IG5ldyBXZWFrTWFwKCksXG4gICAgICAgICAgciA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICByZXR1cm4gKHMgPSBmdW5jdGlvbiBzKGUpIHtcbiAgICAgICAgcmV0dXJuIGUgPyByIDogdDtcbiAgICAgIH0pKGUpO1xuICAgIH1cblxuICAgIHZhciBkLFxuICAgICAgICBfZiA9IGZ1bmN0aW9uIGYoKSB7XG4gICAgICByZXR1cm4gKF9mID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBwID0gZnVuY3Rpb24gcChlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuXG4gICAgdC5Gb2N1c01vZGUgPSBkLCBmdW5jdGlvbiAoZSkge1xuICAgICAgZVtlLk5vbmUgPSAwXSA9IFwiTm9uZVwiLCBlW2UuSW5wdXQgPSAxXSA9IFwiSW5wdXRcIjtcbiAgICB9KGQgfHwgKHQuRm9jdXNNb2RlID0gZCA9IHt9KSk7XG5cbiAgICB2YXIgbSA9IGZ1bmN0aW9uIG0oZSkge1xuICAgICAgdmFyIHQgPSBlLmlkLFxuICAgICAgICAgIHIgPSBlLm5hbWUsXG4gICAgICAgICAgYSA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHMgPSBlLmRlZmF1bHRWYWx1ZSxcbiAgICAgICAgICBtID0gZS5kaXNhYmxlZCxcbiAgICAgICAgICB5ID0gZS5yZXF1aXJlZCxcbiAgICAgICAgICBiID0gZS5taW5EYXRlLFxuICAgICAgICAgIHYgPSB2b2lkIDAgPT09IGIgPyBpLkRFRkFVTFRfTUlOX0RBVEUgOiBiLFxuICAgICAgICAgIE8gPSBlLm1heERhdGUsXG4gICAgICAgICAgZyA9IGUucmFuZ2VEYXRlLFxuICAgICAgICAgIF8gPSBlLm9uQ2hhbmdlLFxuICAgICAgICAgIGggPSBlLm9uQmx1cixcbiAgICAgICAgICBqID0gZS5pMThuLFxuICAgICAgICAgIE0gPSB2b2lkIDAgPT09IGogPyBsLkVOX1VTIDogaixcbiAgICAgICAgICBOID0gcChlLCBbXCJpZFwiLCBcIm5hbWVcIiwgXCJjbGFzc05hbWVcIiwgXCJkZWZhdWx0VmFsdWVcIiwgXCJkaXNhYmxlZFwiLCBcInJlcXVpcmVkXCIsIFwibWluRGF0ZVwiLCBcIm1heERhdGVcIiwgXCJyYW5nZURhdGVcIiwgXCJvbkNoYW5nZVwiLCBcIm9uQmx1clwiLCBcImkxOG5cIl0pLFxuICAgICAgICAgIEUgPSAoMCwgbi51c2VSZWYpKG51bGwpLFxuICAgICAgICAgIFAgPSAoMCwgbi51c2VSZWYpKG51bGwpLFxuICAgICAgICAgIHcgPSAoMCwgbi51c2VTdGF0ZSkoXCJcIiksXG4gICAgICAgICAgSSA9IHdbMF0sXG4gICAgICAgICAgRCA9IHdbMV0sXG4gICAgICAgICAgUyA9ICgwLCBuLnVzZVN0YXRlKShcIlwiKSxcbiAgICAgICAgICB4ID0gU1swXSxcbiAgICAgICAgICBrID0gU1sxXSxcbiAgICAgICAgICBBID0gKDAsIG4udXNlU3RhdGUpKCExKSxcbiAgICAgICAgICBUID0gQVswXSxcbiAgICAgICAgICBDID0gQVsxXSxcbiAgICAgICAgICBMID0gKDAsIG4udXNlU3RhdGUpKHZvaWQgMCksXG4gICAgICAgICAgRiA9IExbMF0sXG4gICAgICAgICAgUiA9IExbMV0sXG4gICAgICAgICAgVSA9ICgwLCBuLnVzZVN0YXRlKSgwKSxcbiAgICAgICAgICBXID0gVVswXSxcbiAgICAgICAgICBCID0gVVsxXSxcbiAgICAgICAgICB6ID0gKDAsIG4udXNlU3RhdGUpKFtdKSxcbiAgICAgICAgICBZID0gelswXSxcbiAgICAgICAgICBHID0gelsxXSxcbiAgICAgICAgICBWID0gKDAsIG4udXNlU3RhdGUpKGQuTm9uZSksXG4gICAgICAgICAgSCA9IFZbMF0sXG4gICAgICAgICAgUSA9IFZbMV0sXG4gICAgICAgICAgSyA9ICgwLCBuLnVzZVN0YXRlKSh2b2lkIDApLFxuICAgICAgICAgIFogPSBLWzBdLFxuICAgICAgICAgIFggPSBLWzFdLFxuICAgICAgICAgIEogPSAoMCwgdS5wYXJzZURhdGVTdHJpbmcpKHYpLFxuICAgICAgICAgIHEgPSBPID8gKDAsIHUucGFyc2VEYXRlU3RyaW5nKShPKSA6IHZvaWQgMCxcbiAgICAgICAgICAkID0gZyA/ICgwLCB1LnBhcnNlRGF0ZVN0cmluZykoZykgOiB2b2lkIDAsXG4gICAgICAgICAgZWUgPSBmdW5jdGlvbiBlZShlLCB0KSB7XG4gICAgICAgIHZhciByO1xuICAgICAgICB2b2lkIDAgPT09IHQgJiYgKHQgPSAhMCk7XG4gICAgICAgIHZhciBhID0gKDAsIHUucGFyc2VEYXRlU3RyaW5nKShlKSxcbiAgICAgICAgICAgIG4gPSBhICYmICgwLCB1LmZvcm1hdERhdGUpKGEsIGkuREVGQVVMVF9FWFRFUk5BTF9EQVRFX0ZPUk1BVCk7XG4gICAgICAgIGEgJiYgRChlKSwgbiAmJiBrKG4pLCBfICYmIF8obiksIHQgJiYgKEMoITEpLCBHKFtdKSwgbnVsbCA9PT0gKHIgPSBudWxsID09IFAgPyB2b2lkIDAgOiBQLmN1cnJlbnQpIHx8IHZvaWQgMCA9PT0gciB8fCByLmZvY3VzKCkpO1xuICAgICAgfTtcblxuICAgICAgKDAsIG4udXNlRWZmZWN0KShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHMgJiYgZWUocywgITEpO1xuICAgICAgfSwgW10pLCAoMCwgbi51c2VFZmZlY3QpKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKFQpIHtcbiAgICAgICAgICB2YXIgZSA9IEUuY3VycmVudCAmJiBFLmN1cnJlbnQucXVlcnlTZWxlY3RvcihcIi51c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX19kYXRlLS1mb2N1c2VkXCIpO1xuICAgICAgICAgIGUgJiYgZS5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9LCBbVF0pLCAoMCwgbi51c2VFZmZlY3QpKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgIWZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgZSxcbiAgICAgICAgICAgICAgdCxcbiAgICAgICAgICAgICAgcixcbiAgICAgICAgICAgICAgYSxcbiAgICAgICAgICAgICAgbiA9ICgwLCB1LmlzRGF0ZUludmFsaWQpKHgsIEosIHEpO1xuICAgICAgICAgIG4gJiYgIShudWxsID09PSAoZSA9IG51bGwgPT0gUCA/IHZvaWQgMCA6IFAuY3VycmVudCkgfHwgdm9pZCAwID09PSBlID8gdm9pZCAwIDogZS52YWxpZGF0aW9uTWVzc2FnZSkgJiYgKG51bGwgPT09ICh0ID0gbnVsbCA9PSBQID8gdm9pZCAwIDogUC5jdXJyZW50KSB8fCB2b2lkIDAgPT09IHQgfHwgdC5zZXRDdXN0b21WYWxpZGl0eShpLlZBTElEQVRJT05fTUVTU0FHRSkpLCBuIHx8IChudWxsID09PSAociA9IG51bGwgPT0gUCA/IHZvaWQgMCA6IFAuY3VycmVudCkgfHwgdm9pZCAwID09PSByID8gdm9pZCAwIDogci52YWxpZGF0aW9uTWVzc2FnZSkgIT09IGkuVkFMSURBVElPTl9NRVNTQUdFIHx8IG51bGwgPT09IChhID0gbnVsbCA9PSBQID8gdm9pZCAwIDogUC5jdXJyZW50KSB8fCB2b2lkIDAgPT09IGEgfHwgYS5zZXRDdXN0b21WYWxpZGl0eShcIlwiKTtcbiAgICAgICAgfSgpO1xuICAgICAgfSwgW3gsIHYsIE9dKTtcbiAgICAgIHZhciB0ZSA9ICgwLCBvLmRlZmF1bHQpKFwidXNhLWRhdGUtcGlja2VyXCIsIFwidXNhLWRhdGUtcGlja2VyLS1pbml0aWFsaXplZFwiLCB7XG4gICAgICAgIFwidXNhLWRhdGUtcGlja2VyLS1hY3RpdmVcIjogVFxuICAgICAgfSwgYSksXG4gICAgICAgICAgcmUgPSBNLnRvZ2dsZUNhbGVuZGFyO1xuICAgICAgcmV0dXJuIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImRhdGUtcGlja2VyXCIsXG4gICAgICAgIGNsYXNzTmFtZTogdGUsXG4gICAgICAgIHJlZjogRSxcbiAgICAgICAgb25CbHVyOiBmdW5jdGlvbiBvbkJsdXIoZSkge1xuICAgICAgICAgIHZhciB0O1xuICAgICAgICAgIChudWxsID09PSAodCA9IEUuY3VycmVudCkgfHwgdm9pZCAwID09PSB0ID8gdm9pZCAwIDogdC5jb250YWlucyhudWxsID09IGUgPyB2b2lkIDAgOiBlLnJlbGF0ZWRUYXJnZXQpKSB8fCAoVCAmJiAoQyghMSksIEcoW10pKSwgaCAmJiBoKGUpKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25LZXlEb3duOiBmdW5jdGlvbiBvbktleURvd24oZSkge1xuICAgICAgICAgIHZhciB0O1xuICAgICAgICAgIFwiRXNjYXBlXCIgPT09IGUua2V5ICYmIChUICYmIChDKCExKSwgRyhbXSksIG51bGwgPT09ICh0ID0gbnVsbCA9PSBQID8gdm9pZCAwIDogUC5jdXJyZW50KSB8fCB2b2lkIDAgPT09IHQgfHwgdC5mb2N1cygpKSwgZS5wcmV2ZW50RGVmYXVsdCgpKTtcbiAgICAgICAgfVxuICAgICAgfSwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLCBfZih7fSwgTiwge1xuICAgICAgICBuYW1lOiByLFxuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiZGF0ZS1waWNrZXItaW50ZXJuYWwtaW5wdXRcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1pbnB1dCB1c2Etc3Itb25seSB1c2EtZGF0ZS1waWNrZXJfX2ludGVybmFsLWlucHV0XCIsXG4gICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICBcImFyaWEtaGlkZGVuXCI6ICEwLFxuICAgICAgICB0YWJJbmRleDogLTEsXG4gICAgICAgIHJlcXVpcmVkOiAhMSxcbiAgICAgICAgZGlzYWJsZWQ6ICExLFxuICAgICAgICB2YWx1ZTogSSxcbiAgICAgICAgcmVhZE9ubHk6ICEwXG4gICAgICB9KSksIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1kYXRlLXBpY2tlcl9fd3JhcHBlclwiLFxuICAgICAgICB0YWJJbmRleDogLTFcbiAgICAgIH0sIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiwgX2Yoe30sIE4sIHtcbiAgICAgICAgaWQ6IHQsXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJkYXRlLXBpY2tlci1leHRlcm5hbC1pbnB1dFwiLFxuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWlucHV0IHVzYS1kYXRlLXBpY2tlcl9fZXh0ZXJuYWwtaW5wdXRcIixcbiAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgIGRpc2FibGVkOiBtLFxuICAgICAgICByZXF1aXJlZDogeSxcbiAgICAgICAgdmFsdWU6IHgsXG4gICAgICAgIHJlZjogUCxcbiAgICAgICAgb25JbnB1dDogZnVuY3Rpb24gb25JbnB1dChlKSB7XG4gICAgICAgICAgdmFyIHQgPSBlLnRhcmdldC52YWx1ZTtcbiAgICAgICAgICBrKHQpLCBfICYmIF8odCk7XG4gICAgICAgICAgdmFyIHIgPSAoMCwgdS5wYXJzZURhdGVTdHJpbmcpKHQsIGkuREVGQVVMVF9FWFRFUk5BTF9EQVRFX0ZPUk1BVCwgITApLFxuICAgICAgICAgICAgICBhID0gXCJcIjtcblxuICAgICAgICAgIGlmIChyICYmICEoMCwgdS5pc0RhdGVJbnZhbGlkKSh0LCBKLCBxKSAmJiAoYSA9ICgwLCB1LmZvcm1hdERhdGUpKHIpKSwgSSAhPT0gYSAmJiBEKGEpLCByICYmIFQpIHtcbiAgICAgICAgICAgIHZhciBuID0gKDAsIHUua2VlcERhdGVCZXR3ZWVuTWluQW5kTWF4KShyLCBKLCBxKTtcbiAgICAgICAgICAgIFIobik7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvbkZvY3VzOiBmdW5jdGlvbiBvbkZvY3VzKCkge1xuICAgICAgICAgIFEoZC5JbnB1dCk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uQmx1cjogZnVuY3Rpb24gb25CbHVyKGUpIHtcbiAgICAgICAgICBRKGQuTm9uZSksIGggJiYgaChlKTtcbiAgICAgICAgfVxuICAgICAgfSkpLCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJkYXRlLXBpY2tlci1idXR0b25cIixcbiAgICAgICAgdHlwZTogXCJidXR0b25cIixcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1kYXRlLXBpY2tlcl9fYnV0dG9uXCIsXG4gICAgICAgIFwiYXJpYS1oYXNwb3B1cFwiOiAhMCxcbiAgICAgICAgXCJhcmlhLWxhYmVsXCI6IHJlLFxuICAgICAgICBkaXNhYmxlZDogbSxcbiAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcbiAgICAgICAgICB2YXIgZTtcbiAgICAgICAgICBpZiAoVCkgRyhbXSk7ZWxzZSB7XG4gICAgICAgICAgICB2YXIgdCA9ICgwLCB1LnBhcnNlRGF0ZVN0cmluZykoeCwgaS5ERUZBVUxUX0VYVEVSTkFMX0RBVEVfRk9STUFULCAhMCksXG4gICAgICAgICAgICAgICAgciA9ICgwLCB1LmtlZXBEYXRlQmV0d2Vlbk1pbkFuZE1heCkodCB8fCBzICYmICgwLCB1LnBhcnNlRGF0ZVN0cmluZykocykgfHwgKDAsIHUudG9kYXkpKCksIEosIHEpO1xuICAgICAgICAgICAgUihyKSwgQihudWxsID09PSAoZSA9IG51bGwgPT0gRSA/IHZvaWQgMCA6IEUuY3VycmVudCkgfHwgdm9pZCAwID09PSBlID8gdm9pZCAwIDogZS5vZmZzZXRIZWlnaHQpO1xuICAgICAgICAgICAgdmFyIGEgPSBNLnN0YXR1c2VzLFxuICAgICAgICAgICAgICAgIG4gPSAoMCwgdS5wYXJzZURhdGVTdHJpbmcpKEkpO1xuXG4gICAgICAgICAgICBpZiAobiAmJiAoMCwgdS5pc1NhbWVEYXkpKG4sICgwLCB1LmFkZERheXMpKHIsIDApKSkge1xuICAgICAgICAgICAgICB2YXIgbyA9IE0uc2VsZWN0ZWREYXRlO1xuICAgICAgICAgICAgICBhLnVuc2hpZnQobyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEcoYSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIEMoIVQpO1xuICAgICAgICB9XG4gICAgICB9LCBcIsKgXCIpLCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJkYXRlLXBpY2tlci1jYWxlbmRhclwiLFxuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWRhdGUtcGlja2VyX19jYWxlbmRhclwiLFxuICAgICAgICByb2xlOiBcImRpYWxvZ1wiLFxuICAgICAgICBcImFyaWEtbW9kYWxcIjogXCJ0cnVlXCIsXG4gICAgICAgIGhpZGRlbjogIVQsXG4gICAgICAgIFwiZGF0YS12YWx1ZVwiOiBGICYmICgwLCB1LmZvcm1hdERhdGUpKEYpLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgIHRvcDogVyArIFwicHhcIlxuICAgICAgICB9LFxuICAgICAgICBvbktleURvd246IGZ1bmN0aW9uIG9uS2V5RG93bihlKSB7XG4gICAgICAgICAgWChlLmtleUNvZGUpO1xuICAgICAgICB9LFxuICAgICAgICBvbktleVVwOiBmdW5jdGlvbiBvbktleVVwKGUpIHtcbiAgICAgICAgICBlLmtleUNvZGUgIT09IFogJiYgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICB9LCBUICYmIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KGMuQ2FsZW5kYXIsIHtcbiAgICAgICAgZGF0ZTogRixcbiAgICAgICAgaGFuZGxlU2VsZWN0RGF0ZTogZWUsXG4gICAgICAgIG1pbkRhdGU6IEosXG4gICAgICAgIG1heERhdGU6IHEsXG4gICAgICAgIHJhbmdlRGF0ZTogJCxcbiAgICAgICAgc2VsZWN0ZWREYXRlOiAoMCwgdS5wYXJzZURhdGVTdHJpbmcpKEkpLFxuICAgICAgICBzZXRTdGF0dXNlczogRyxcbiAgICAgICAgZm9jdXNNb2RlOiBILFxuICAgICAgICBpMThuOiBNXG4gICAgICB9KSksIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImRhdGUtcGlja2VyLXN0YXR1c1wiLFxuICAgICAgICBjbGFzc05hbWU6IFwidXNhLXNyLW9ubHkgdXNhLWRhdGUtcGlja2VyX19zdGF0dXNcIixcbiAgICAgICAgcm9sZTogXCJzdGF0dXNcIixcbiAgICAgICAgXCJhcmlhLWxpdmVcIjogXCJwb2xpdGVcIlxuICAgICAgfSwgWS5qb2luKFwiLiBcIikpKSk7XG4gICAgfTtcblxuICAgIHQuRGF0ZVBpY2tlciA9IG0sIG0uZGlzcGxheU5hbWUgPSBcIkRhdGVQaWNrZXJcIiwgbS5kZWZhdWx0UHJvcHMgPSB7XG4gICAgICBtaW5EYXRlOiBpLkRFRkFVTFRfTUlOX0RBVEVcbiAgICB9O1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5OYXZDbG9zZUJ1dHRvbiA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IGkocigwKSksXG4gICAgICAgIG4gPSBpKHIoMSkpLFxuICAgICAgICBvID0gaShyKDcyKSk7XG5cbiAgICBmdW5jdGlvbiBpKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9sMyA9IGZ1bmN0aW9uIGwoKSB7XG4gICAgICByZXR1cm4gKF9sMyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfTtcblxuICAgIHQuTmF2Q2xvc2VCdXR0b24gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLm9uQ2xpY2ssXG4gICAgICAgICAgciA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIGkgPSB1KGUsIFtcIm9uQ2xpY2tcIiwgXCJjbGFzc05hbWVcIl0pLFxuICAgICAgICAgIGMgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1uYXZfX2Nsb3NlXCIsIHIpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIF9sMyh7XG4gICAgICAgIGNsYXNzTmFtZTogYyxcbiAgICAgICAgb25DbGljazogdCxcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcIm5hdkNsb3NlQnV0dG9uXCJcbiAgICAgIH0sIGksIHtcbiAgICAgICAgdHlwZTogXCJidXR0b25cIlxuICAgICAgfSksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiaW1nXCIsIHtcbiAgICAgICAgc3JjOiBvLmRlZmF1bHQsXG4gICAgICAgIGFsdDogXCJjbG9zZVwiXG4gICAgICB9KSk7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuQnV0dG9uID0gdm9pZCAwO1xuICAgIHZhciBhID0gaShyKDApKSxcbiAgICAgICAgbiA9IGkocigxKSksXG4gICAgICAgIG8gPSByKDIpO1xuXG4gICAgZnVuY3Rpb24gaShlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfbDQgPSBmdW5jdGlvbiBsKCkge1xuICAgICAgcmV0dXJuIChfbDQgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIGMgPSBmdW5jdGlvbiBjKGUpIHtcbiAgICAgIHZhciB0ID0gZS50eXBlLFxuICAgICAgICAgIHIgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIGkgPSBlLnNlY29uZGFyeSxcbiAgICAgICAgICBjID0gZS5iYXNlLFxuICAgICAgICAgIHMgPSBlLmFjY2VudCxcbiAgICAgICAgICBkID0gZS5hY2NlbnRTdHlsZSxcbiAgICAgICAgICBmID0gZS5vdXRsaW5lLFxuICAgICAgICAgIHAgPSBlLmludmVyc2UsXG4gICAgICAgICAgbSA9IGUuc2l6ZSxcbiAgICAgICAgICB5ID0gZS5iaWcsXG4gICAgICAgICAgYiA9IGUuc21hbGwsXG4gICAgICAgICAgdiA9IGUuaWNvbixcbiAgICAgICAgICBPID0gZS51bnN0eWxlZCxcbiAgICAgICAgICBnID0gZS5vbkNsaWNrLFxuICAgICAgICAgIF8gPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBoID0gdShlLCBbXCJ0eXBlXCIsIFwiY2hpbGRyZW5cIiwgXCJzZWNvbmRhcnlcIiwgXCJiYXNlXCIsIFwiYWNjZW50XCIsIFwiYWNjZW50U3R5bGVcIiwgXCJvdXRsaW5lXCIsIFwiaW52ZXJzZVwiLCBcInNpemVcIiwgXCJiaWdcIiwgXCJzbWFsbFwiLCBcImljb25cIiwgXCJ1bnN0eWxlZFwiLCBcIm9uQ2xpY2tcIiwgXCJjbGFzc05hbWVcIl0pO1xuICAgICAgeSAmJiAoMCwgby5kZXByZWNhdGlvbldhcm5pbmcpKFwiQnV0dG9uIHByb3BlcnR5IGJpZyBpcyBkZXByZWNhdGVkLiAgVXNlIHNpemUuXCIpLCB2ICYmICgwLCBvLmRlcHJlY2F0aW9uV2FybmluZykoXCJCdXR0b24gcHJvcGVydHkgaWNvbiBpcyBkZXByZWNhdGVkLlwiKSwgcyAmJiAoMCwgby5kZXByZWNhdGlvbldhcm5pbmcpKFwiQnV0dG9uIHByb3BlcnR5IGFjY2VudCBpcyBkZXByZWNhdGVkLiBVc2UgYWNjZW50U3R5bGUuXCIpO1xuICAgICAgdmFyIGogPSBtID8gXCJiaWdcIiA9PT0gbSA6IHksXG4gICAgICAgICAgTSA9IG0gPyBcInNtYWxsXCIgPT09IG0gOiBiO1xuICAgICAgTSAmJiAoMCwgby5kZXByZWNhdGlvbldhcm5pbmcpKFwiU21hbGwgYnV0dG9uIGlzIGRlcHJlY2F0ZWQuIFVzZSB0aGUgZGVmYXVsdCwgcGFzcyBpbiBhIGN1c3RvbSBjbGFzc05hbWUsIG9yIHVzZSBzaXplIGJpZy5cIik7XG4gICAgICB2YXIgTiA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLWJ1dHRvblwiLCB7XG4gICAgICAgIFwidXNhLWJ1dHRvbi0tc2Vjb25kYXJ5XCI6IGksXG4gICAgICAgIFwidXNhLWJ1dHRvbi0tYmFzZVwiOiBjLFxuICAgICAgICBcInVzYS1idXR0b24tLWFjY2VudC1jb29sXCI6IHMgfHwgXCJjb29sXCIgPT09IGQsXG4gICAgICAgIFwidXNhLWJ1dHRvbi0tYWNjZW50LXdhcm1cIjogXCJ3YXJtXCIgPT09IGQsXG4gICAgICAgIFwidXNhLWJ1dHRvbi0tb3V0bGluZVwiOiBmLFxuICAgICAgICBcInVzYS1idXR0b24tLWludmVyc2VcIjogcCxcbiAgICAgICAgXCJ1c2EtYnV0dG9uLS1iaWdcIjogaixcbiAgICAgICAgXCJ1c2EtYnV0dG9uLS1zbWFsbFwiOiBNLFxuICAgICAgICBcInVzYS1idXR0b24tLWljb25cIjogdixcbiAgICAgICAgXCJ1c2EtYnV0dG9uLS11bnN0eWxlZFwiOiBPXG4gICAgICB9LCBfKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCBfbDQoe1xuICAgICAgICB0eXBlOiB0LFxuICAgICAgICBjbGFzc05hbWU6IE4sXG4gICAgICAgIG9uQ2xpY2s6IGcsXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJidXR0b25cIlxuICAgICAgfSwgaCksIHIpO1xuICAgIH07XG5cbiAgICB0LkJ1dHRvbiA9IGM7XG4gICAgdmFyIHMgPSBjO1xuICAgIHQuZGVmYXVsdCA9IHM7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmlzQ3VzdG9tUHJvcHMgPSBjLCB0LkdyaWQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIHIgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBpID0gZS5yb3csXG4gICAgICAgICAgZCA9IGUuY29sLFxuICAgICAgICAgIGYgPSBlLmdhcCxcbiAgICAgICAgICBwID0gZS5vZmZzZXQsXG4gICAgICAgICAgbSA9IGUubW9iaWxlLFxuICAgICAgICAgIHkgPSBlLm1vYmlsZUxnLFxuICAgICAgICAgIGIgPSBlLnRhYmxldCxcbiAgICAgICAgICB2ID0gZS50YWJsZXRMZyxcbiAgICAgICAgICBPID0gZS5kZXNrdG9wLFxuICAgICAgICAgIGcgPSBlLmRlc2t0b3BMZyxcbiAgICAgICAgICBfID0gZS53aWRlc2NyZWVuLFxuICAgICAgICAgIGggPSB1KGUsIFtcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwicm93XCIsIFwiY29sXCIsIFwiZ2FwXCIsIFwib2Zmc2V0XCIsIFwibW9iaWxlXCIsIFwibW9iaWxlTGdcIiwgXCJ0YWJsZXRcIiwgXCJ0YWJsZXRMZ1wiLCBcImRlc2t0b3BcIiwgXCJkZXNrdG9wTGdcIiwgXCJ3aWRlc2NyZWVuXCJdKSxcbiAgICAgICAgICBqID0ge1xuICAgICAgICBtb2JpbGU6IG0sXG4gICAgICAgIG1vYmlsZUxnOiB5LFxuICAgICAgICB0YWJsZXQ6IGIsXG4gICAgICAgIHRhYmxldExnOiB2LFxuICAgICAgICBkZXNrdG9wOiBPLFxuICAgICAgICBkZXNrdG9wTGc6IGcsXG4gICAgICAgIHdpZGVzY3JlZW46IF9cbiAgICAgIH0sXG4gICAgICAgICAgTSA9IHMoe1xuICAgICAgICByb3c6IGksXG4gICAgICAgIGNvbDogZCxcbiAgICAgICAgZ2FwOiBmLFxuICAgICAgICBvZmZzZXQ6IHBcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoT2JqZWN0LmtleXMoby5icmVha3BvaW50cykuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgciA9IHQ7XG5cbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChqLCByKSkge1xuICAgICAgICAgIHZhciBhID0gZVtyXTtcbiAgICAgICAgICBNID0gKDAsIG4uZGVmYXVsdCkoTSwgcyhhLCByKSk7XG4gICAgICAgIH1cbiAgICAgIH0pLCBNID0gKDAsIG4uZGVmYXVsdCkoTSwgciksIGMoaCkpIHtcbiAgICAgICAgdmFyIE4gPSBoLmFzQ3VzdG9tLFxuICAgICAgICAgICAgRSA9IHUoaCwgW1wiYXNDdXN0b21cIl0pO1xuICAgICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoTiwgX2w1KHtcbiAgICAgICAgICBjbGFzc05hbWU6IE1cbiAgICAgICAgfSwgRSksIHQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2w1KHtcbiAgICAgICAgY2xhc3NOYW1lOiBNLFxuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiZ3JpZFwiXG4gICAgICB9LCBoKSwgdCk7XG4gICAgfSwgdC5hcHBseUdyaWRDbGFzc2VzID0gdC5nZXRHcmlkQ2xhc3NlcyA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IGkocigwKSksXG4gICAgICAgIG4gPSBpKHIoMSkpLFxuICAgICAgICBvID0gcig0Nik7XG5cbiAgICBmdW5jdGlvbiBpKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9sNSA9IGZ1bmN0aW9uIGwoKSB7XG4gICAgICByZXR1cm4gKF9sNSA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGMoZSkge1xuICAgICAgcmV0dXJuIFwiYXNDdXN0b21cIiBpbiBlO1xuICAgIH1cblxuICAgIHZhciBzID0gZnVuY3Rpb24gcyhlLCB0KSB7XG4gICAgICB2YXIgcjtcbiAgICAgIHZvaWQgMCA9PT0gZSAmJiAoZSA9IHt9KTtcbiAgICAgIHZhciBhID0gdCA/IG8uYnJlYWtwb2ludHNbdF0gKyBcIjpcIiA6IFwiXCIsXG4gICAgICAgICAgaSA9IGUucm93LFxuICAgICAgICAgIGwgPSBlLmNvbCxcbiAgICAgICAgICB1ID0gZS5nYXAsXG4gICAgICAgICAgYyA9IGUub2Zmc2V0O1xuICAgICAgcmV0dXJuICgwLCBuLmRlZmF1bHQpKCgociA9IHt9KVthICsgXCJncmlkLXJvd1wiXSA9IGksIHJbYSArIFwiZ3JpZC1nYXBcIl0gPSAhMCA9PT0gdSwgclthICsgXCJncmlkLWdhcC1cIiArIHVdID0gITAgIT09IHUgJiYgISF1LCByW2EgKyBcImdyaWQtY29sXCJdID0gITAgPT09IGwsIHJbYSArIFwiZ3JpZC1jb2wtXCIgKyBsXSA9ICEwICE9PSBsICYmICEhbCwgclthICsgXCJncmlkLW9mZnNldC1cIiArIGNdID0gISFjLCByKSk7XG4gICAgfTtcblxuICAgIHQuZ2V0R3JpZENsYXNzZXMgPSBzO1xuXG4gICAgdC5hcHBseUdyaWRDbGFzc2VzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0ID0gcyhlKTtcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyhvLmJyZWFrcG9pbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7XG4gICAgICAgIHZhciBhID0gcjtcblxuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpKSB7XG4gICAgICAgICAgdmFyIG8gPSBlW2FdO1xuICAgICAgICAgIHQgPSAoMCwgbi5kZWZhdWx0KSh0LCBzKG8sIGEpKTtcbiAgICAgICAgfVxuICAgICAgfSksIHQ7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuVGV4dGFyZWEgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2kzID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBsID0gZnVuY3Rpb24gbChlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9LFxuICAgICAgICB1ID0gZnVuY3Rpb24gdShlKSB7XG4gICAgICB2YXIgdCA9IGUuaWQsXG4gICAgICAgICAgciA9IGUubmFtZSxcbiAgICAgICAgICBvID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgdSA9IGUuZXJyb3IsXG4gICAgICAgICAgYyA9IGUuc3VjY2VzcyxcbiAgICAgICAgICBzID0gZS5jaGlsZHJlbixcbiAgICAgICAgICBkID0gZS5pbnB1dFJlZixcbiAgICAgICAgICBmID0gbChlLCBbXCJpZFwiLCBcIm5hbWVcIiwgXCJjbGFzc05hbWVcIiwgXCJlcnJvclwiLCBcInN1Y2Nlc3NcIiwgXCJjaGlsZHJlblwiLCBcImlucHV0UmVmXCJdKSxcbiAgICAgICAgICBwID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtdGV4dGFyZWFcIiwge1xuICAgICAgICBcInVzYS1pbnB1dC0tZXJyb3JcIjogdSxcbiAgICAgICAgXCJ1c2EtaW5wdXQtLXN1Y2Nlc3NcIjogY1xuICAgICAgfSwgbyk7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiLCBfaTMoe1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwidGV4dGFyZWFcIixcbiAgICAgICAgY2xhc3NOYW1lOiBwLFxuICAgICAgICBpZDogdCxcbiAgICAgICAgbmFtZTogcixcbiAgICAgICAgcmVmOiBkXG4gICAgICB9LCBmKSwgcyk7XG4gICAgfTtcblxuICAgIHQuVGV4dGFyZWEgPSB1O1xuICAgIHZhciBjID0gdTtcbiAgICB0LmRlZmF1bHQgPSBjO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5Gb3JtID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDApKSxcbiAgICAgICAgbiA9IG8ocigxKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9pNCA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pNCA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfTtcblxuICAgIHQuRm9ybSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCA9IGUub25TdWJtaXQsXG4gICAgICAgICAgciA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgbyA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHUgPSBlLmxhcmdlLFxuICAgICAgICAgIGMgPSBlLnNlYXJjaCxcbiAgICAgICAgICBzID0gbChlLCBbXCJvblN1Ym1pdFwiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwibGFyZ2VcIiwgXCJzZWFyY2hcIl0pLFxuICAgICAgICAgIGQgPSAoMCwgbi5kZWZhdWx0KSh7XG4gICAgICAgIFwidXNhLWZvcm1cIjogIWMsXG4gICAgICAgIFwidXNhLWZvcm0tLWxhcmdlXCI6IHVcbiAgICAgIH0sIG8pO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZm9ybVwiLCBfaTQoe1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiZm9ybVwiLFxuICAgICAgICBjbGFzc05hbWU6IGQsXG4gICAgICAgIG9uU3VibWl0OiB0XG4gICAgICB9LCBzKSwgcik7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuRm9vdGVyRXh0ZW5kZWROYXZMaXN0ID0gdm9pZCAwO1xuXG4gICAgdmFyIGEsXG4gICAgICAgIG4gPSBmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgaWYgKCF0ICYmIGUgJiYgZS5fX2VzTW9kdWxlKSByZXR1cm4gZTtcbiAgICAgIGlmIChudWxsID09PSBlIHx8IFwib2JqZWN0XCIgIT0gdHlwZW9mIGUgJiYgXCJmdW5jdGlvblwiICE9IHR5cGVvZiBlKSByZXR1cm4ge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgICAgdmFyIHIgPSBsKHQpO1xuICAgICAgaWYgKHIgJiYgci5oYXMoZSkpIHJldHVybiByLmdldChlKTtcbiAgICAgIHZhciBhID0ge30sXG4gICAgICAgICAgbiA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4gICAgICBmb3IgKHZhciBvIGluIGUpIHtcbiAgICAgICAgaWYgKFwiZGVmYXVsdFwiICE9PSBvICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBvKSkge1xuICAgICAgICAgIHZhciBpID0gbiA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgbykgOiBudWxsO1xuICAgICAgICAgIGkgJiYgKGkuZ2V0IHx8IGkuc2V0KSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCBvLCBpKSA6IGFbb10gPSBlW29dO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGEuZGVmYXVsdCA9IGUsIHIgJiYgci5zZXQoZSwgYSk7XG4gICAgICByZXR1cm4gYTtcbiAgICB9KHIoMCkpLFxuICAgICAgICBvID0gKGEgPSByKDEpKSAmJiBhLl9fZXNNb2R1bGUgPyBhIDoge1xuICAgICAgZGVmYXVsdDogYVxuICAgIH0sXG4gICAgICAgIGkgPSByKDQpO1xuXG4gICAgZnVuY3Rpb24gbChlKSB7XG4gICAgICBpZiAoXCJmdW5jdGlvblwiICE9IHR5cGVvZiBXZWFrTWFwKSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciB0ID0gbmV3IFdlYWtNYXAoKSxcbiAgICAgICAgICByID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgIHJldHVybiAobCA9IGZ1bmN0aW9uIGwoZSkge1xuICAgICAgICByZXR1cm4gZSA/IHIgOiB0O1xuICAgICAgfSkoZSk7XG4gICAgfVxuXG4gICAgdC5Gb290ZXJFeHRlbmRlZE5hdkxpc3QgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICByID0gZS5pc01vYmlsZSxcbiAgICAgICAgICBhID0gZS5uZXN0ZWRMaW5rcyxcbiAgICAgICAgICBpID0gKDAsIG8uZGVmYXVsdCkoXCJncmlkLXJvdyBncmlkLWdhcC00XCIsIHQpLFxuICAgICAgICAgIGwgPSBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiB3aW5kb3csXG4gICAgICAgICAgYyA9IG4uZGVmYXVsdC51c2VTdGF0ZShsICYmIHdpbmRvdy5pbm5lcldpZHRoIDwgNDgwKSxcbiAgICAgICAgICBzID0gY1swXSxcbiAgICAgICAgICBkID0gY1sxXSxcbiAgICAgICAgICBmID0gKDAsIG4udXNlU3RhdGUpKEFycmF5KGEubGVuZ3RoKS5maWxsKCExKSksXG4gICAgICAgICAgcCA9IGZbMF0sXG4gICAgICAgICAgbSA9IGZbMV0sXG4gICAgICAgICAgeSA9IHIgfHwgdm9pZCAwID09PSByICYmIHM7XG4gICAgICAoMCwgbi51c2VFZmZlY3QpKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFyKSByZXR1cm4gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgZSksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgZSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgICB2YXIgZSA9IGwgJiYgd2luZG93LmlubmVyV2lkdGggPCA0ODA7XG4gICAgICAgICAgZSAhPT0gcyAmJiBkKGUpO1xuICAgICAgICB9XG4gICAgICB9LCBbXSk7XG4gICAgICByZXR1cm4gbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IGlcbiAgICAgIH0sIGEubWFwKGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICAgIHJldHVybiBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgICAga2V5OiBcImxpbmtTZWN0aW9uLVwiICsgdCxcbiAgICAgICAgICBjbGFzc05hbWU6IFwibW9iaWxlLWxnOmdyaWQtY29sLTYgZGVza3RvcDpncmlkLWNvbC0zXCJcbiAgICAgICAgfSwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQodSwge1xuICAgICAgICAgIG9uVG9nZ2xlOiB5ID8gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIGUgPSB0LCB2b2lkIG0oZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgdmFyIHIgPSBBcnJheShhLmxlbmd0aCkuZmlsbCghMSk7XG4gICAgICAgICAgICAgIHJldHVybiByW2VdID0gIXRbZV0sIHI7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHZhciBlO1xuICAgICAgICAgIH0gOiB2b2lkIDAsXG4gICAgICAgICAgaXNPcGVuOiAheSB8fCBwW3RdLFxuICAgICAgICAgIGxpbmtzOiBlXG4gICAgICAgIH0pKTtcbiAgICAgIH0pKTtcbiAgICB9O1xuXG4gICAgdmFyIHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIHZhciB0ID0gZS5pc09wZW4sXG4gICAgICAgICAgciA9IHZvaWQgMCAhPT0gdCAmJiB0LFxuICAgICAgICAgIGEgPSBlLmxpbmtzLFxuICAgICAgICAgIGwgPSBlLm9uVG9nZ2xlLFxuICAgICAgICAgIHUgPSBhWzBdLFxuICAgICAgICAgIGMgPSBhLnNsaWNlKDEpLFxuICAgICAgICAgIHMgPSAoMCwgby5kZWZhdWx0KShcInVzYS1mb290ZXJfX3ByaW1hcnktY29udGVudCB1c2EtZm9vdGVyX19wcmltYXJ5LWNvbnRlbnQtLWNvbGxhcHNpYmxlXCIsIHtcbiAgICAgICAgaGlkZGVuOiAhclxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzZWN0aW9uXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBzLFxuICAgICAgICBvbkNsaWNrOiBsLFxuICAgICAgICBvbktleVByZXNzOiBsXG4gICAgICB9LCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImg0XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1mb290ZXJfX3ByaW1hcnktbGlua1wiXG4gICAgICB9LCB1KSwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoaS5OYXZMaXN0LCB7XG4gICAgICAgIHR5cGU6IFwiZm9vdGVyU2Vjb25kYXJ5XCIsXG4gICAgICAgIGl0ZW1zOiBjXG4gICAgICB9KSk7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkFsZXJ0XCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBhLkFsZXJ0O1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJBY2NvcmRpb25cIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIG4uQWNjb3JkaW9uO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJHb3ZCYW5uZXJcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIG8uR292QmFubmVyO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJCdXR0b25cIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGkuQnV0dG9uO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJCdXR0b25Hcm91cFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gbC5CdXR0b25Hcm91cDtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiTGlua1wiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gdS5MaW5rO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJUYWJsZVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gYy5UYWJsZTtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiVGFnXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBzLlRhZztcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiVG9vbHRpcFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gZC5Ub29sdGlwO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJTaWRlTmF2XCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBmLlNpZGVOYXY7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkNvbGxlY3Rpb25cIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHAuQ29sbGVjdGlvbjtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiQ29sbGVjdGlvbkl0ZW1cIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIG0uQ29sbGVjdGlvbkl0ZW07XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkNvbGxlY3Rpb25IZWFkaW5nXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiB5LkNvbGxlY3Rpb25IZWFkaW5nO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJDb2xsZWN0aW9uRGVzY3JpcHRpb25cIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGIuQ29sbGVjdGlvbkRlc2NyaXB0aW9uO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJDb2xsZWN0aW9uTWV0YVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gdi5Db2xsZWN0aW9uTWV0YTtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiQ29sbGVjdGlvbk1ldGFJdGVtXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBPLkNvbGxlY3Rpb25NZXRhSXRlbTtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiQ29sbGVjdGlvbk1ldGFJdGVtVGFnXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBnLkNvbGxlY3Rpb25NZXRhSXRlbVRhZztcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiQ29sbGVjdGlvblRodW1ibmFpbFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gXy5Db2xsZWN0aW9uVGh1bWJuYWlsO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJDb2xsZWN0aW9uQ2FsZW5kYXJEYXRlXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBoLkNvbGxlY3Rpb25DYWxlbmRhckRhdGU7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkdyaWRDb250YWluZXJcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGouR3JpZENvbnRhaW5lcjtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiR3JpZFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gTS5HcmlkO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJDaGFyYWN0ZXJDb3VudFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gTi5DaGFyYWN0ZXJDb3VudDtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiQ2hlY2tib3hcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIEUuQ2hlY2tib3g7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkNvbWJvQm94XCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBQLkNvbWJvQm94O1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJEYXRlSW5wdXRcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHcuRGF0ZUlucHV0O1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJEYXRlSW5wdXRHcm91cFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gSS5EYXRlSW5wdXRHcm91cDtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiRGF0ZVBpY2tlclwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gRC5EYXRlUGlja2VyO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJEYXRlUmFuZ2VQaWNrZXJcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIFMuRGF0ZVJhbmdlUGlja2VyO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJEcm9wZG93blwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4geC5Ecm9wZG93bjtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiRXJyb3JNZXNzYWdlXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBrLkVycm9yTWVzc2FnZTtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiRmllbGRzZXRcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIEEuRmllbGRzZXQ7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkZpbGVJbnB1dFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gVC5GaWxlSW5wdXQ7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkZvcm1cIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIEMuRm9ybTtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiRm9ybUdyb3VwXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBMLkZvcm1Hcm91cDtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiTGFiZWxcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIEYuTGFiZWw7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIlJhZGlvXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBSLlJhZGlvO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJSYW5nZUlucHV0XCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBVLlJhbmdlSW5wdXQ7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIlRleHRhcmVhXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBXLlRleHRhcmVhO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJUZXh0SW5wdXRcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIEIuVGV4dElucHV0O1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJUaW1lUGlja2VyXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiB6LlRpbWVQaWNrZXI7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIlZhbGlkYXRpb25DaGVja2xpc3RcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIFkuVmFsaWRhdGlvbkNoZWNrbGlzdDtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiVmFsaWRhdGlvbkl0ZW1cIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIEcuVmFsaWRhdGlvbkl0ZW07XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkV4dGVuZGVkTmF2XCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBWLkV4dGVuZGVkTmF2O1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJIZWFkZXJcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIEguSGVhZGVyO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJNZWdhTWVudVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gUS5NZWdhTWVudTtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiTWVudVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gSy5NZW51O1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJOYXZDbG9zZUJ1dHRvblwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gWi5OYXZDbG9zZUJ1dHRvbjtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiTmF2TGlzdFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gWC5OYXZMaXN0O1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJOYXZNZW51QnV0dG9uXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBKLk5hdk1lbnVCdXR0b247XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIk5hdkRyb3BEb3duQnV0dG9uXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBxLk5hdkRyb3BEb3duQnV0dG9uO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJQcmltYXJ5TmF2XCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiAkLlByaW1hcnlOYXY7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIlRpdGxlXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBlZS5UaXRsZTtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiSWRlbnRpZmllclwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGUuSWRlbnRpZmllcjtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiSWRlbnRpZmllckdvdlwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gcmUuSWRlbnRpZmllckdvdjtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiSWRlbnRpZmllcklkZW50aXR5XCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBhZS5JZGVudGlmaWVySWRlbnRpdHk7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIklkZW50aWZpZXJMaW5rXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBuZS5JZGVudGlmaWVyTGluaztcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiSWRlbnRpZmllckxpbmtJdGVtXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBvZS5JZGVudGlmaWVyTGlua0l0ZW07XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIklkZW50aWZpZXJMaW5rc1wiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gaWUuSWRlbnRpZmllckxpbmtzO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJJZGVudGlmaWVyTG9nb1wiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gbGUuSWRlbnRpZmllckxvZ287XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIklkZW50aWZpZXJMb2dvc1wiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gdWUuSWRlbnRpZmllckxvZ29zO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJJZGVudGlmaWVyTWFzdGhlYWRcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGNlLklkZW50aWZpZXJNYXN0aGVhZDtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiQWRkcmVzc1wiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gc2UuQWRkcmVzcztcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiRm9vdGVyXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBkZS5Gb290ZXI7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkZvb3RlckV4dGVuZGVkTmF2TGlzdFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gZmUuRm9vdGVyRXh0ZW5kZWROYXZMaXN0O1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJGb290ZXJOYXZcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHBlLkZvb3Rlck5hdjtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiTG9nb1wiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gbWUuTG9nbztcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiU29jaWFsTGlua3NcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHllLlNvY2lhbExpbmtzO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJDYXJkR3JvdXBcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGJlLkNhcmRHcm91cDtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiQ2FyZFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gdmUuQ2FyZDtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiQ2FyZEhlYWRlclwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gT2UuQ2FyZEhlYWRlcjtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiQ2FyZE1lZGlhXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBnZS5DYXJkTWVkaWE7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkNhcmRCb2R5XCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBfZS5DYXJkQm9keTtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiQ2FyZEZvb3RlclwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gaGUuQ2FyZEZvb3RlcjtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiQnJlYWRjcnVtYkJhclwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gamUuQnJlYWRjcnVtYkJhcjtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiQnJlYWRjcnVtYlwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gTWUuQnJlYWRjcnVtYjtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiQnJlYWRjcnVtYkxpbmtcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIE5lLkJyZWFkY3J1bWJMaW5rO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJTdGVwSW5kaWNhdG9yXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBFZS5TdGVwSW5kaWNhdG9yO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJTdGVwSW5kaWNhdG9yU3RlcFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gUGUuU3RlcEluZGljYXRvclN0ZXA7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIlNlYXJjaFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gd2UuU2VhcmNoO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJTdW1tYXJ5Qm94XCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBJZS5TdW1tYXJ5Qm94O1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJQcm9jZXNzTGlzdFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gRGUuUHJvY2Vzc0xpc3Q7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIlByb2Nlc3NMaXN0SXRlbVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gU2UuUHJvY2Vzc0xpc3RJdGVtO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJQcm9jZXNzTGlzdEhlYWRpbmdcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHhlLlByb2Nlc3NMaXN0SGVhZGluZztcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiU2l0ZUFsZXJ0XCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBrZS5TaXRlQWxlcnQ7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIk1vZGFsXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBBZS5Nb2RhbDtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiT3ZlcmxheVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gQWUuT3ZlcmxheTtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiTW9kYWxDb250YWluZXJcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIEFlLk1vZGFsQ29udGFpbmVyO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJjb25uZWN0TW9kYWxcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIEFlLmNvbm5lY3RNb2RhbDtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwidXNlTW9kYWxcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIEFlLnVzZU1vZGFsO1xuICAgICAgfVxuICAgIH0pLCByKDIwKTtcblxuICAgIHZhciBhID0gcigyMSksXG4gICAgICAgIG4gPSByKDIzKSxcbiAgICAgICAgbyA9IHIoMjQpLFxuICAgICAgICBpID0gcigxNCksXG4gICAgICAgIGwgPSByKDI5KSxcbiAgICAgICAgdSA9IHIoMTApLFxuICAgICAgICBjID0gcigzMCksXG4gICAgICAgIHMgPSByKDMyKSxcbiAgICAgICAgZCA9IHIoMzMpLFxuICAgICAgICBmID0gcigzNSksXG4gICAgICAgIHAgPSByKDM2KSxcbiAgICAgICAgbSA9IHIoMzcpLFxuICAgICAgICB5ID0gcigzOCksXG4gICAgICAgIGIgPSByKDM5KSxcbiAgICAgICAgdiA9IHIoNDApLFxuICAgICAgICBPID0gcig0MSksXG4gICAgICAgIGcgPSByKDQyKSxcbiAgICAgICAgXyA9IHIoNDMpLFxuICAgICAgICBoID0gcig0NCksXG4gICAgICAgIGogPSByKDQ1KSxcbiAgICAgICAgTSA9IHIoMTUpLFxuICAgICAgICBOID0gcig0NyksXG4gICAgICAgIEUgPSByKDQ4KSxcbiAgICAgICAgUCA9IHIoMTEpLFxuICAgICAgICB3ID0gcig1MSksXG4gICAgICAgIEkgPSByKDUyKSxcbiAgICAgICAgRCA9IHIoMTIpLFxuICAgICAgICBTID0gcig1NyksXG4gICAgICAgIHggPSByKDU4KSxcbiAgICAgICAgayA9IHIoNTkpLFxuICAgICAgICBBID0gcig2MCksXG4gICAgICAgIFQgPSByKDYxKSxcbiAgICAgICAgQyA9IHIoMTcpLFxuICAgICAgICBMID0gcig4KSxcbiAgICAgICAgRiA9IHIoNSksXG4gICAgICAgIFIgPSByKDY0KSxcbiAgICAgICAgVSA9IHIoNjUpLFxuICAgICAgICBXID0gcigxNiksXG4gICAgICAgIEIgPSByKDcpLFxuICAgICAgICB6ID0gcig2NiksXG4gICAgICAgIFkgPSByKDY5KSxcbiAgICAgICAgRyA9IHIoNzApLFxuICAgICAgICBWID0gcig3MSksXG4gICAgICAgIEggPSByKDczKSxcbiAgICAgICAgUSA9IHIoNzQpLFxuICAgICAgICBLID0gcig3NSksXG4gICAgICAgIFogPSByKDEzKSxcbiAgICAgICAgWCA9IHIoNCksXG4gICAgICAgIEogPSByKDc2KSxcbiAgICAgICAgcSA9IHIoNzcpLFxuICAgICAgICAkID0gcig3OCksXG4gICAgICAgIGVlID0gcig3OSksXG4gICAgICAgIHRlID0gcig4MCksXG4gICAgICAgIHJlID0gcig4MSksXG4gICAgICAgIGFlID0gcig4MiksXG4gICAgICAgIG5lID0gcig4MyksXG4gICAgICAgIG9lID0gcig4NCksXG4gICAgICAgIGllID0gcig4NSksXG4gICAgICAgIGxlID0gcig4NiksXG4gICAgICAgIHVlID0gcig4NyksXG4gICAgICAgIGNlID0gcig4OCksXG4gICAgICAgIHNlID0gcig4OSksXG4gICAgICAgIGRlID0gcig5MCksXG4gICAgICAgIGZlID0gcigxOCksXG4gICAgICAgIHBlID0gcig5MSksXG4gICAgICAgIG1lID0gcig5MiksXG4gICAgICAgIHllID0gcig5MyksXG4gICAgICAgIGJlID0gcig5NCksXG4gICAgICAgIHZlID0gcig5NSksXG4gICAgICAgIE9lID0gcig5NiksXG4gICAgICAgIGdlID0gcig5NyksXG4gICAgICAgIF9lID0gcig5OCksXG4gICAgICAgIGhlID0gcig5OSksXG4gICAgICAgIGplID0gcigxMDApLFxuICAgICAgICBNZSA9IHIoMTAxKSxcbiAgICAgICAgTmUgPSByKDEwMiksXG4gICAgICAgIEVlID0gcigxMDMpLFxuICAgICAgICBQZSA9IHIoMTA0KSxcbiAgICAgICAgd2UgPSByKDEwNSksXG4gICAgICAgIEllID0gcigxMDYpLFxuICAgICAgICBEZSA9IHIoMTA3KSxcbiAgICAgICAgU2UgPSByKDEwOCksXG4gICAgICAgIHhlID0gcigxMDkpLFxuICAgICAgICBrZSA9IHIoMTEwKSxcbiAgICAgICAgQWUgPSByKDExMSk7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICByLnIodCk7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0LkFsZXJ0ID0gdm9pZCAwO1xuICAgIHZhciBhID0gaShyKDApKSxcbiAgICAgICAgbiA9IGkocigxKSksXG4gICAgICAgIG8gPSBpKHIoMjIpKTtcblxuICAgIGZ1bmN0aW9uIGkoZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2w2ID0gZnVuY3Rpb24gbCgpIHtcbiAgICAgIHJldHVybiAoX2w2ID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICB1ID0gZnVuY3Rpb24gdShlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9LFxuICAgICAgICBjID0gZnVuY3Rpb24gYyhlKSB7XG4gICAgICB2YXIgdCxcbiAgICAgICAgICByID0gZS50eXBlLFxuICAgICAgICAgIGkgPSBlLmhlYWRpbmcsXG4gICAgICAgICAgYyA9IGUuY3RhLFxuICAgICAgICAgIHMgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIGQgPSBlLnNsaW0sXG4gICAgICAgICAgZiA9IGUubm9JY29uLFxuICAgICAgICAgIHAgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBtID0gZS52YWxpZGF0aW9uLFxuICAgICAgICAgIHkgPSB1KGUsIFtcInR5cGVcIiwgXCJoZWFkaW5nXCIsIFwiY3RhXCIsIFwiY2hpbGRyZW5cIiwgXCJzbGltXCIsIFwibm9JY29uXCIsIFwiY2xhc3NOYW1lXCIsIFwidmFsaWRhdGlvblwiXSksXG4gICAgICAgICAgYiA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLWFsZXJ0XCIsICgodCA9IHtcbiAgICAgICAgXCJ1c2EtYWxlcnQtLXN1Y2Nlc3NcIjogXCJzdWNjZXNzXCIgPT09IHIsXG4gICAgICAgIFwidXNhLWFsZXJ0LS13YXJuaW5nXCI6IFwid2FybmluZ1wiID09PSByLFxuICAgICAgICBcInVzYS1hbGVydC0tZXJyb3JcIjogXCJlcnJvclwiID09PSByLFxuICAgICAgICBcInVzYS1hbGVydC0taW5mb1wiOiBcImluZm9cIiA9PT0gcixcbiAgICAgICAgXCJ1c2EtYWxlcnQtLXNsaW1cIjogZCxcbiAgICAgICAgXCJ1c2EtYWxlcnQtLW5vLWljb25cIjogZixcbiAgICAgICAgXCJ1c2EtYWxlcnQtLXZhbGlkYXRpb25cIjogbVxuICAgICAgfSlbby5kZWZhdWx0LmFsZXJ0V2l0aENUQV0gPSAhIWMsIHQpLCBwKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfbDYoe1xuICAgICAgICBjbGFzc05hbWU6IGIsXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJhbGVydFwiXG4gICAgICB9LCB5KSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWFsZXJ0X19ib2R5XCJcbiAgICAgIH0sIGkgJiYgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJoM1wiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtYWxlcnRfX2hlYWRpbmdcIlxuICAgICAgfSwgaSksIHMgJiYgKG0gPyBzIDogYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJwXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1hbGVydF9fdGV4dFwiXG4gICAgICB9LCBzKSkpLCBjICYmIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIG51bGwsIGMpKTtcbiAgICB9O1xuXG4gICAgdC5BbGVydCA9IGM7XG4gICAgdmFyIHMgPSBjO1xuICAgIHQuZGVmYXVsdCA9IHM7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICByLnIodCksIHQuZGVmYXVsdCA9IHtcbiAgICAgIGFsZXJ0V2l0aENUQTogXCJzcmMtY29tcG9uZW50cy1BbGVydC1BbGVydC1tb2R1bGVfX2FsZXJ0V2l0aENUQS0tMWZyajVcIlxuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0LkFjY29yZGlvbiA9IHQuQWNjb3JkaW9uSXRlbSA9IHZvaWQgMDtcblxuICAgIHZhciBhLFxuICAgICAgICBuID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIGlmICghdCAmJiBlICYmIGUuX19lc01vZHVsZSkgcmV0dXJuIGU7XG4gICAgICBpZiAobnVsbCA9PT0gZSB8fCBcIm9iamVjdFwiICE9IHR5cGVvZiBlICYmIFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgZSkgcmV0dXJuIHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICAgIHZhciByID0gaSh0KTtcbiAgICAgIGlmIChyICYmIHIuaGFzKGUpKSByZXR1cm4gci5nZXQoZSk7XG4gICAgICB2YXIgYSA9IHt9LFxuICAgICAgICAgIG4gPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuICAgICAgZm9yICh2YXIgbyBpbiBlKSB7XG4gICAgICAgIGlmIChcImRlZmF1bHRcIiAhPT0gbyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgbykpIHtcbiAgICAgICAgICB2YXIgbCA9IG4gPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIG8pIDogbnVsbDtcbiAgICAgICAgICBsICYmIChsLmdldCB8fCBsLnNldCkgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwgbywgbCkgOiBhW29dID0gZVtvXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhLmRlZmF1bHQgPSBlLCByICYmIHIuc2V0KGUsIGEpO1xuICAgICAgcmV0dXJuIGE7XG4gICAgfShyKDApKSxcbiAgICAgICAgbyA9IChhID0gcigxKSkgJiYgYS5fX2VzTW9kdWxlID8gYSA6IHtcbiAgICAgIGRlZmF1bHQ6IGFcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gaShlKSB7XG4gICAgICBpZiAoXCJmdW5jdGlvblwiICE9IHR5cGVvZiBXZWFrTWFwKSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciB0ID0gbmV3IFdlYWtNYXAoKSxcbiAgICAgICAgICByID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgIHJldHVybiAoaSA9IGZ1bmN0aW9uIGkoZSkge1xuICAgICAgICByZXR1cm4gZSA/IHIgOiB0O1xuICAgICAgfSkoZSk7XG4gICAgfVxuXG4gICAgdmFyIF9sNyA9IGZ1bmN0aW9uIGwoKSB7XG4gICAgICByZXR1cm4gKF9sNyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoKSB7XG4gICAgICBmb3IgKHZhciBlID0gMCwgdCA9IDAsIHIgPSBhcmd1bWVudHMubGVuZ3RoOyB0IDwgcjsgdCsrKSB7XG4gICAgICAgIGUgKz0gYXJndW1lbnRzW3RdLmxlbmd0aDtcbiAgICAgIH1cblxuICAgICAgdmFyIGEgPSBBcnJheShlKSxcbiAgICAgICAgICBuID0gMDtcblxuICAgICAgZm9yICh0ID0gMDsgdCA8IHI7IHQrKykge1xuICAgICAgICBmb3IgKHZhciBvID0gYXJndW1lbnRzW3RdLCBpID0gMCwgbCA9IG8ubGVuZ3RoOyBpIDwgbDsgaSsrLCBuKyspIHtcbiAgICAgICAgICBhW25dID0gb1tpXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYTtcbiAgICB9LFxuICAgICAgICBjID0gZnVuY3Rpb24gYyhlKSB7XG4gICAgICB2YXIgdCA9IGUudGl0bGUsXG4gICAgICAgICAgciA9IGUuaWQsXG4gICAgICAgICAgYSA9IGUuY29udGVudCxcbiAgICAgICAgICBpID0gZS5leHBhbmRlZCxcbiAgICAgICAgICBsID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgdSA9IGUuaGFuZGxlVG9nZ2xlLFxuICAgICAgICAgIGMgPSAoMCwgby5kZWZhdWx0KShcInVzYS1hY2NvcmRpb25fX2hlYWRpbmdcIiwgbCksXG4gICAgICAgICAgcyA9ICgwLCBvLmRlZmF1bHQpKFwidXNhLWFjY29yZGlvbl9fY29udGVudFwiLCBcInVzYS1wcm9zZVwiLCBsKTtcbiAgICAgIHJldHVybiBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChuLmRlZmF1bHQuRnJhZ21lbnQsIG51bGwsIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiaDJcIiwge1xuICAgICAgICBjbGFzc05hbWU6IGNcbiAgICAgIH0sIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICAgICAgdHlwZTogXCJidXR0b25cIixcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1hY2NvcmRpb25fX2J1dHRvblwiLFxuICAgICAgICBcImFyaWEtZXhwYW5kZWRcIjogaSxcbiAgICAgICAgXCJhcmlhLWNvbnRyb2xzXCI6IHIsXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJhY2NvcmRpb25CdXR0b25fXCIgKyByLFxuICAgICAgICBvbkNsaWNrOiB1XG4gICAgICB9LCB0KSksIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgaWQ6IHIsXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJhY2NvcmRpb25JdGVtX1wiICsgcixcbiAgICAgICAgY2xhc3NOYW1lOiBzLFxuICAgICAgICBoaWRkZW46ICFpXG4gICAgICB9LCBhKSk7XG4gICAgfTtcblxuICAgIHQuQWNjb3JkaW9uSXRlbSA9IGM7XG5cbiAgICB2YXIgcyA9IGZ1bmN0aW9uIHMoZSkge1xuICAgICAgdmFyIHQgPSBlLmJvcmRlcmVkLFxuICAgICAgICAgIHIgPSBlLml0ZW1zLFxuICAgICAgICAgIGEgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBpID0gKDAsIG4udXNlU3RhdGUpKHIuZmlsdGVyKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiAhIWUuZXhwYW5kZWQ7XG4gICAgICB9KS5tYXAoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIGUuaWQ7XG4gICAgICB9KSksXG4gICAgICAgICAgcyA9IGlbMF0sXG4gICAgICAgICAgZCA9IGlbMV0sXG4gICAgICAgICAgZiA9ICgwLCBvLmRlZmF1bHQpKFwidXNhLWFjY29yZGlvblwiLCB7XG4gICAgICAgIFwidXNhLWFjY29yZGlvbi0tYm9yZGVyZWRcIjogdFxuICAgICAgfSwgYSk7XG4gICAgICByZXR1cm4gbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IGYsXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJhY2NvcmRpb25cIlxuICAgICAgfSwgci5tYXAoZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgICAgcmV0dXJuIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KGMsIF9sNyh7XG4gICAgICAgICAga2V5OiBcImFjY29yZGlvbkl0ZW1fXCIgKyB0XG4gICAgICAgIH0sIGUsIHtcbiAgICAgICAgICBleHBhbmRlZDogcy5pbmRleE9mKGUuaWQpID4gLTEsXG4gICAgICAgICAgaGFuZGxlVG9nZ2xlOiBmdW5jdGlvbiBoYW5kbGVUb2dnbGUoKSB7XG4gICAgICAgICAgICB2YXIgdCwgciwgYTtcbiAgICAgICAgICAgIHQgPSBlLmlkLCByID0gdShzKSwgKGEgPSBzLmluZGV4T2YodCkpID4gLTEgPyByLnNwbGljZShhLCAxKSA6IHIucHVzaCh0KSwgZChyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbiAgICAgIH0pKTtcbiAgICB9O1xuXG4gICAgdC5BY2NvcmRpb24gPSBzO1xuICAgIHZhciBkID0gcztcbiAgICB0LmRlZmF1bHQgPSBkO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZWZhdWx0ID0gdC5Hb3ZCYW5uZXIgPSB2b2lkIDA7XG5cbiAgICB2YXIgYSA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICBpZiAoIXQgJiYgZSAmJiBlLl9fZXNNb2R1bGUpIHJldHVybiBlO1xuICAgICAgaWYgKG51bGwgPT09IGUgfHwgXCJvYmplY3RcIiAhPSB0eXBlb2YgZSAmJiBcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIGUpIHJldHVybiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgICB2YXIgciA9IHModCk7XG4gICAgICBpZiAociAmJiByLmhhcyhlKSkgcmV0dXJuIHIuZ2V0KGUpO1xuICAgICAgdmFyIGEgPSB7fSxcbiAgICAgICAgICBuID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbiAgICAgIGZvciAodmFyIG8gaW4gZSkge1xuICAgICAgICBpZiAoXCJkZWZhdWx0XCIgIT09IG8gJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIG8pKSB7XG4gICAgICAgICAgdmFyIGkgPSBuID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCBvKSA6IG51bGw7XG4gICAgICAgICAgaSAmJiAoaS5nZXQgfHwgaS5zZXQpID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsIG8sIGkpIDogYVtvXSA9IGVbb107XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYS5kZWZhdWx0ID0gZSwgciAmJiByLnNldChlLCBhKTtcbiAgICAgIHJldHVybiBhO1xuICAgIH0ocigwKSksXG4gICAgICAgIG4gPSBjKHIoMSkpLFxuICAgICAgICBvID0gYyhyKDI1KSksXG4gICAgICAgIGkgPSBjKHIoMjYpKSxcbiAgICAgICAgbCA9IGMocigyNykpLFxuICAgICAgICB1ID0gYyhyKDI4KSk7XG5cbiAgICBmdW5jdGlvbiBjKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcyhlKSB7XG4gICAgICBpZiAoXCJmdW5jdGlvblwiICE9IHR5cGVvZiBXZWFrTWFwKSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciB0ID0gbmV3IFdlYWtNYXAoKSxcbiAgICAgICAgICByID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgIHJldHVybiAocyA9IGZ1bmN0aW9uIHMoZSkge1xuICAgICAgICByZXR1cm4gZSA/IHIgOiB0O1xuICAgICAgfSkoZSk7XG4gICAgfVxuXG4gICAgdmFyIF9kID0gZnVuY3Rpb24gZCgpIHtcbiAgICAgIHJldHVybiAoX2QgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGYgPSBmdW5jdGlvbiBmKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIHAgPSBmdW5jdGlvbiBwKGUpIHtcbiAgICAgIHZhciB0ID0gZS50bGQsXG4gICAgICAgICAgciA9IHZvaWQgMCA9PT0gdCA/IFwiLmdvdlwiIDogdCxcbiAgICAgICAgICBjID0gZS5sYW5ndWFnZSxcbiAgICAgICAgICBzID0gdm9pZCAwID09PSBjID8gXCJlbmdsaXNoXCIgOiBjLFxuICAgICAgICAgIHAgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBtID0gZihlLCBbXCJ0bGRcIiwgXCJsYW5ndWFnZVwiLCBcImNsYXNzTmFtZVwiXSksXG4gICAgICAgICAgeSA9ICgwLCBhLnVzZVN0YXRlKSghMSksXG4gICAgICAgICAgYiA9IHlbMF0sXG4gICAgICAgICAgdiA9IHlbMV0sXG4gICAgICAgICAgTyA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLWJhbm5lclwiLCBwKSxcbiAgICAgICAgICBnID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgICAgdmFyIHIgPSBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICAgIGNsYXNzTmFtZTogXCJpY29uLWxvY2tcIlxuICAgICAgICB9LCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImltZ1wiLCB7XG4gICAgICAgICAgc3JjOiB1LmRlZmF1bHQsXG4gICAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1iYW5uZXJfX2xvY2staW1hZ2VcIixcbiAgICAgICAgICBhbHQ6IFwibG9ja1wiLFxuICAgICAgICAgIHRpdGxlOiBcIkxvY2tcIixcbiAgICAgICAgICByb2xlOiBcImltZ1wiXG4gICAgICAgIH0pKTtcblxuICAgICAgICBzd2l0Y2ggKGUpIHtcbiAgICAgICAgICBjYXNlIFwiZW5nbGlzaFwiOlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgaGVhZGVyOiBcIkFuIG9mZmljaWFsIHdlYnNpdGUgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgZ292ZXJubWVudFwiLFxuICAgICAgICAgICAgICBoZWFkZXJBY3Rpb246IFwiSGVyZeKAmXMgaG93IHlvdSBrbm93XCIsXG4gICAgICAgICAgICAgIHRsZFNlY3Rpb25IZWFkZXI6IFwiT2ZmaWNpYWwgd2Vic2l0ZXMgdXNlIFwiICsgdCxcbiAgICAgICAgICAgICAgdGxkU2VjdGlvbkNvbnRlbnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHQpIHtcbiAgICAgICAgICAgICAgICAgIGNhc2UgXCIuZ292XCI6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChhLmRlZmF1bHQuRnJhZ21lbnQsIG51bGwsIFwiQSBcIiwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzdHJvbmdcIiwgbnVsbCwgXCIuZ292XCIpLCBcIiB3ZWJzaXRlIGJlbG9uZ3MgdG8gYW4gb2ZmaWNpYWwgZ292ZXJubWVudCBvcmdhbml6YXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMuXCIpO1xuXG4gICAgICAgICAgICAgICAgICBjYXNlIFwiLm1pbFwiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoYS5kZWZhdWx0LkZyYWdtZW50LCBudWxsLCBcIkEgXCIsIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3Ryb25nXCIsIG51bGwsIFwiLm1pbFwiKSwgXCIgd2Vic2l0ZSBiZWxvbmdzIHRvIGFuIG9mZmljaWFsIFUuUy4gRGVwYXJ0bWVudCBvZiBEZWZlbnNlIG9yZ2FuaXphdGlvbi5cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KCksXG4gICAgICAgICAgICAgIGh0dHBzU2VjdGlvbkhlYWRlcjogXCJTZWN1cmUgXCIgKyB0ICsgXCIgd2Vic2l0ZXMgdXNlIEhUVFBTXCIsXG4gICAgICAgICAgICAgIGh0dHBzU2VjdGlvbkNvbnRlbnQ6IGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGEuZGVmYXVsdC5GcmFnbWVudCwgbnVsbCwgXCJBIFwiLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInN0cm9uZ1wiLCBudWxsLCBcImxvY2sgKFwiLCByLCBcIilcIiksIFwiIG9yIFwiLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInN0cm9uZ1wiLCBudWxsLCBcImh0dHBzOi8vXCIpLCBcIiBtZWFucyB5b3XigJl2ZSBzYWZlbHkgY29ubmVjdGVkIHRvIHRoZSBcIiwgdCwgXCIgd2Vic2l0ZS4gU2hhcmUgc2Vuc2l0aXZlIGluZm9ybWF0aW9uIG9ubHkgb24gb2ZmaWNpYWwsIHNlY3VyZSB3ZWJzaXRlcy5cIilcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICBjYXNlIFwic3BhbmlzaFwiOlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgaGVhZGVyOiBcIlVuIHNpdGlvIG9maWNpYWwgZGVsIEdvYmllcm5vIGRlIEVzdGFkb3MgVW5pZG9zXCIsXG4gICAgICAgICAgICAgIGhlYWRlckFjdGlvbjogXCJBc8OtIGVzIGNvbW8gdXN0ZWQgcHVlZGUgdmVyaWZpY2FybG9cIixcbiAgICAgICAgICAgICAgdGxkU2VjdGlvbkhlYWRlcjogXCJMb3Mgc2l0aW9zIHdlYiBvZmljaWFsZXMgdXNhbiBcIiArIHQsXG4gICAgICAgICAgICAgIHRsZFNlY3Rpb25Db250ZW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0KSB7XG4gICAgICAgICAgICAgICAgICBjYXNlIFwiLmdvdlwiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoYS5kZWZhdWx0LkZyYWdtZW50LCBudWxsLCBcIlVuIHNpdGlvIHdlYiBcIiwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzdHJvbmdcIiwgbnVsbCwgXCIuZ292XCIpLCBcIiBwZXJ0ZW5lY2UgYSB1bmEgb3JnYW5pemFjacOzbiBvZmljaWFsIGRlbCBHb2JpZXJubyBkZSBFc3RhZG9zIFVuaWRvcy5cIik7XG5cbiAgICAgICAgICAgICAgICAgIGNhc2UgXCIubWlsXCI6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChhLmRlZmF1bHQuRnJhZ21lbnQsIG51bGwsIFwiVW4gc2l0aW8gd2ViIFwiLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInN0cm9uZ1wiLCBudWxsLCBcIi5taWxcIiksIFwiIHBlcnRlbmVjZSBhIHVuYSBvcmdhbml6YWNpw7NuIG9maWNpYWwgZGVsIERlcGFydGFtZW50byBkZSBEZWZlbnNhIGRlIEVFLiBVVS5cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KCksXG4gICAgICAgICAgICAgIGh0dHBzU2VjdGlvbkhlYWRlcjogXCJMb3Mgc2l0aW9zIHdlYiBzZWd1cm9zIFwiICsgdCArIFwiIHVzYW4gSFRUUFNcIixcbiAgICAgICAgICAgICAgaHR0cHNTZWN0aW9uQ29udGVudDogYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoYS5kZWZhdWx0LkZyYWdtZW50LCBudWxsLCBcIlVuIFwiLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInN0cm9uZ1wiLCBudWxsLCBcImNhbmRhZG8gKFwiLCByLCBcIilcIiksIFwiIG8gXCIsIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3Ryb25nXCIsIG51bGwsIFwiaHR0cHM6Ly9cIiksIFwiIFwiLCBcInNpZ25pZmljYSBxdWUgdXN0ZWQgc2UgY29uZWN0w7MgZGUgZm9ybWEgc2VndXJhIGEgdW4gc2l0aW8gd2ViIFwiLCB0LCBcIi4gQ29tcGFydGEgaW5mb3JtYWNpw7NuIHNlbnNpYmxlIHPDs2xvIGVuIHNpdGlvcyB3ZWIgb2ZpY2lhbGVzIHkgc2VndXJvcy5cIilcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0ocywgcik7XG5cbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNlY3Rpb25cIiwgX2Qoe1xuICAgICAgICBjbGFzc05hbWU6IE8sXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJnb3ZCYW5uZXJcIlxuICAgICAgfSwgbSksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1hY2NvcmRpb25cIlxuICAgICAgfSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJoZWFkZXJcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWJhbm5lcl9faGVhZGVyXCJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1iYW5uZXJfX2lubmVyXCJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcImdyaWQtY29sLWF1dG9cIlxuICAgICAgfSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWJhbm5lcl9faGVhZGVyLWZsYWdcIixcbiAgICAgICAgc3JjOiBvLmRlZmF1bHQsXG4gICAgICAgIGFsdDogXCJVLlMuIGZsYWdcIlxuICAgICAgfSkpLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJncmlkLWNvbC1maWxsIHRhYmxldDpncmlkLWNvbC1hdXRvXCJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwicFwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtYmFubmVyX19oZWFkZXItdGV4dFwiXG4gICAgICB9LCBnLmhlYWRlciksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwicFwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtYmFubmVyX19oZWFkZXItYWN0aW9uXCIsXG4gICAgICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCJcbiAgICAgIH0sIGcuaGVhZGVyQWN0aW9uKSksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICAgICAgdHlwZTogXCJidXR0b25cIixcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1hY2NvcmRpb25fX2J1dHRvbiB1c2EtYmFubmVyX19idXR0b25cIixcbiAgICAgICAgXCJhcmlhLWV4cGFuZGVkXCI6IGIsXG4gICAgICAgIFwiYXJpYS1jb250cm9sc1wiOiBcImdvdi1iYW5uZXJcIixcbiAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcbiAgICAgICAgICB2KGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gIWU7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtYmFubmVyX19idXR0b24tdGV4dFwiXG4gICAgICB9LCBnLmhlYWRlckFjdGlvbikpKSksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1iYW5uZXJfX2NvbnRlbnQgdXNhLWFjY29yZGlvbl9fY29udGVudFwiLFxuICAgICAgICBpZDogXCJnb3YtYmFubmVyXCIsXG4gICAgICAgIGhpZGRlbjogIWJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcImdyaWQtcm93IGdyaWQtZ2FwLWxnXCJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1iYW5uZXJfX2d1aWRhbmNlIHRhYmxldDpncmlkLWNvbC02XCJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiaW1nXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1iYW5uZXJfX2ljb24gdXNhLW1lZGlhLWJsb2NrX19pbWdcIixcbiAgICAgICAgc3JjOiBpLmRlZmF1bHQsXG4gICAgICAgIHJvbGU6IFwiaW1nXCIsXG4gICAgICAgIGFsdDogXCJcIixcbiAgICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuICAgICAgfSksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1tZWRpYS1ibG9ja19fYm9keVwiXG4gICAgICB9LCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInBcIiwgbnVsbCwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzdHJvbmdcIiwgbnVsbCwgZy50bGRTZWN0aW9uSGVhZGVyKSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJiclwiLCBudWxsKSwgZy50bGRTZWN0aW9uQ29udGVudCkpKSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWJhbm5lcl9fZ3VpZGFuY2UgdGFibGV0OmdyaWQtY29sLTZcIlxuICAgICAgfSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWJhbm5lcl9faWNvbiB1c2EtbWVkaWEtYmxvY2tfX2ltZ1wiLFxuICAgICAgICBzcmM6IGwuZGVmYXVsdCxcbiAgICAgICAgcm9sZTogXCJpbWdcIixcbiAgICAgICAgYWx0OiBcIlwiLFxuICAgICAgICBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiXG4gICAgICB9KSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLW1lZGlhLWJsb2NrX19ib2R5XCJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwicFwiLCBudWxsLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInN0cm9uZ1wiLCBudWxsLCBnLmh0dHBzU2VjdGlvbkhlYWRlciksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiYnJcIiwgbnVsbCksIGcuaHR0cHNTZWN0aW9uQ29udGVudCkpKSkpKSk7XG4gICAgfTtcblxuICAgIHQuR292QmFubmVyID0gcDtcbiAgICB2YXIgbSA9IHA7XG4gICAgdC5kZWZhdWx0ID0gbTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIHIucih0KSwgdC5kZWZhdWx0ID0gXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQUxDQU1BQUFCQlBQMExBQUFBRzFCTVZFVWRNN0VlTkxJZU03SGdRQ0RhUGgvYlBoL2JQeC8vLy8vYlB5QkVieTQxQUFBQVVFbEVRVlFJMTIzTU53NENBQkRFd0QzakMvOS9NUTFCUXJnZU9Ta0lxWWUybzJGWnR0aFhnUUxnYkhWTVpkbHNmVVFGUW5IdGpQMSs4QlVoQkRLT3F0bWZvdDZvanFQelI3VGpkVStmNnZrRUQrSURQaFRCY01BQUFBQUFTVVZPUks1Q1lJST1cIjtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIHIucih0KSwgdC5kZWZhdWx0ID0gXCJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52WkdsdVp6MGlWVlJHTFRnaVB6NDhjM1puSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeUlnZDJsa2RHZzlJalkwSWlCb1pXbG5hSFE5SWpZMElpQjJhV1YzUW05NFBTSXdJREFnTmpRZ05qUWlQangwYVhSc1pUNXBZMjl1TFdSdmRDMW5iM1k4TDNScGRHeGxQanh3WVhSb0lHWnBiR3c5SWlNeU16YzRRek1pSUdacGJHd3RjblZzWlQwaVpYWmxibTlrWkNJZ1pEMGlUVE15SURCak1UY3VOamN6SURBZ016SWdNVFF1TXpJM0lETXlJRE15SURBZ01UY3VOamN6TFRFMExqTXlOeUF6TWkwek1pQXpNa014TkM0ek1qY2dOalFnTUNBME9TNDJOek1nTUNBek1pQXdJREUwTGpNeU55QXhOQzR6TWpjZ01DQXpNaUF3ZW0wd0lERXVNakE0UXpFMExqazVOQ0F4TGpJd09DQXhMakl3T0NBeE5DNDVPVFFnTVM0eU1EZ2dNekpUTVRRdU9UazBJRFl5TGpjNU1pQXpNaUEyTWk0M09USWdOakl1TnpreUlEUTVMakF3TmlBMk1pNDNPVElnTXpJZ05Ea3VNREEySURFdU1qQTRJRE15SURFdU1qQTRlbTB4TUM0MU9TQXpPQzQ0TlRoaExqZzFOeTQ0TlRjZ01DQXdJREVnTGpnNE1pNDRNakoyTVM0Mk5ESklNVGd1T0RnMmRpMHhMalkwTW1FdU9EVTNMamcxTnlBd0lEQWdNU0F1T0RneUxTNDRNakpJTkRJdU5UbDZUVEkxTGpRME15QXlOeTQzTnpSMk9TNDRNamxvTVM0Mk5ESjJMVGt1T0ROb015NHlOek4yT1M0NE0wZ3pNbll0T1M0NE0yZ3pMakkzTW5ZNUxqZ3phREV1TmpRemRpMDVMamd6YURNdU1qY3lkamt1T0ROb0xqYzJZUzQ0TlRjdU9EVTNJREFnTUNBeElDNDRPREl1T0RJeGRpNDRNakZvTFRJeExqTjJMUzQ0TURsaExqZzFOeTQ0TlRjZ01DQXdJREVnTGpnNExTNDRNbWd1TnpZeWRpMDVMamcwTW1nekxqSTNNbnB0TlM0M016WXRPQzR4T0Roc01USXVNamt6SURRdU9URTFkakV1TmpReWFDMHhMall6WVM0NE5UY3VPRFUzSURBZ01DQXhMUzQ0T0RJdU9ESXlTREl4TGpReFlTNDROVGN1T0RVM0lEQWdNQ0F4TFM0NE9ESXRMamd5TW1ndE1TNDJOREoyTFRFdU5qUXliREV5TGpJNU15MDBMamt4TlhvaUx6NDhMM04yWno0PVwiO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgci5yKHQpLCB0LmRlZmF1bHQgPSBcImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlCbGJtTnZaR2x1WnowaVZWUkdMVGdpUHo0OGMzWm5JSGh0Ykc1elBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHlNREF3TDNOMlp5SWdkMmxrZEdnOUlqWTBJaUJvWldsbmFIUTlJalkwSWlCMmFXVjNRbTk0UFNJd0lEQWdOalFnTmpRaVBqeDBhWFJzWlQ1cFkyOXVMV2gwZEhCelBDOTBhWFJzWlQ0OGNHRjBhQ0JtYVd4c1BTSWpOekU1UmpKQklpQm1hV3hzTFhKMWJHVTlJbVYyWlc1dlpHUWlJR1E5SWswek1pQXdZekUzTGpZM015QXdJRE15SURFMExqTXlOeUF6TWlBek1pQXdJREUzTGpZM015MHhOQzR6TWpjZ016SXRNeklnTXpKRE1UUXVNekkzSURZMElEQWdORGt1TmpjeklEQWdNeklnTUNBeE5DNHpNamNnTVRRdU16STNJREFnTXpJZ01IcHRNQ0F4TGpJd09FTXhOQzQ1T1RRZ01TNHlNRGdnTVM0eU1EZ2dNVFF1T1RrMElERXVNakE0SURNeVV6RTBMams1TkNBMk1pNDNPVElnTXpJZ05qSXVOemt5SURZeUxqYzVNaUEwT1M0d01EWWdOakl1TnpreUlETXlJRFE1TGpBd05pQXhMakl3T0NBek1pQXhMakl3T0hwdE1DQXhPQzQ0T0RaaE55NHlORFVnTnk0eU5EVWdNQ0F3SURFZ055NHlORFVnTnk0eU5EVjJNeTR4TUROb0xqVXlZeTQ0TmlBd0lERXVOVFUzTGpZNU9DQXhMalUxTnlBeExqVTFPSFk1TGpNeU1tTXdJQzQ0TmkwdU5qazNJREV1TlRVNExURXVOVFUzSURFdU5UVTRhQzB4TlM0MU0yTXRMamcySURBdE1TNDFOVGN0TGpZNU55MHhMalUxTnkweExqVTFPRll6TW1Nd0xTNDROaTQyT1RjdE1TNDFOVGdnTVM0MU5UY3RNUzQxTlRob0xqVXlWakkzTGpNMFFUY3VNalExSURjdU1qUTFJREFnTUNBeElETXlJREl3TGpBNU5IcHRNQ0F6TGpFd00yRTBMakUwTWlBMExqRTBNaUF3SURBZ01DMDBMakUwTWlBMExqRTBNbll6TGpFd00yZzRMakk0TkZZeU55NHpORUUwTGpFME1pQTBMakUwTWlBd0lEQWdNQ0F6TWlBeU15NHhPVGQ2SWk4K1BDOXpkbWMrXCI7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICByLnIodCksIHQuZGVmYXVsdCA9IFwiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJsYm1OdlpHbHVaejBpVlZSR0xUZ2lQejQ4YzNabklIaHRiRzV6UFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eU1EQXdMM04yWnlJZ2QybGtkR2c5SWpVeUlpQm9aV2xuYUhROUlqWTBJaUIyYVdWM1FtOTRQU0l3SURBZ05USWdOalFpUGp4MGFYUnNaVDVzYjJOclBDOTBhWFJzWlQ0OGNHRjBhQ0JtYVd4c1BTSWpNVUl4UWpGQ0lpQm1hV3hzTFhKMWJHVTlJbVYyWlc1dlpHUWlJR1E5SWsweU5pQXdZekV3TGpRNU15QXdJREU1SURndU5UQTNJREU1SURFNWRqbG9NMkUwSURRZ01DQXdJREVnTkNBMGRqSTRZVFFnTkNBd0lEQWdNUzAwSURSSU5HRTBJRFFnTUNBd0lERXROQzAwVmpNeVlUUWdOQ0F3SURBZ01TQTBMVFJvTTNZdE9VTTNJRGd1TlRBM0lERTFMalV3TnlBd0lESTJJREI2YlRBZ09HTXROUzQ1TnprZ01DMHhNQzQ0TkRNZ05DNDNOeTB4TUM0NU9UWWdNVEF1TnpFeVRERTFJREU1ZGpsb01qSjJMVGxqTUMwMkxqQTNOUzAwTGpreU5TMHhNUzB4TVMweE1Yb2lMejQ4TDNOMlp6ND1cIjtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuQnV0dG9uR3JvdXAgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2k1ID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2k1ID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBsID0gZnVuY3Rpb24gbChlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9LFxuICAgICAgICB1ID0gZnVuY3Rpb24gdShlKSB7XG4gICAgICB2YXIgdCA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHIgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIG8gPSBlLnR5cGUsXG4gICAgICAgICAgdSA9IHZvaWQgMCA9PT0gbyA/IFwiZGVmYXVsdFwiIDogbyxcbiAgICAgICAgICBjID0gbChlLCBbXCJjbGFzc05hbWVcIiwgXCJjaGlsZHJlblwiLCBcInR5cGVcIl0pLFxuICAgICAgICAgIHMgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1idXR0b24tZ3JvdXBcIiwge1xuICAgICAgICBcInVzYS1idXR0b24tZ3JvdXAtLXNlZ21lbnRlZFwiOiBcInNlZ21lbnRlZFwiID09IHVcbiAgICAgIH0sIHQpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwidWxcIiwgX2k1KHtcbiAgICAgICAgY2xhc3NOYW1lOiBzXG4gICAgICB9LCBjKSwgYS5kZWZhdWx0LkNoaWxkcmVuLm1hcChyLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1idXR0b24tZ3JvdXBfX2l0ZW1cIlxuICAgICAgICB9LCBlKTtcbiAgICAgIH0pKTtcbiAgICB9O1xuXG4gICAgdC5CdXR0b25Hcm91cCA9IHU7XG4gICAgdmFyIGMgPSB1O1xuICAgIHQuZGVmYXVsdCA9IGM7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0LlRhYmxlID0gdm9pZCAwO1xuICAgIHZhciBhID0gaShyKDApKSxcbiAgICAgICAgbiA9IGkocigxKSksXG4gICAgICAgIG8gPSBpKHIoMzEpKTtcblxuICAgIGZ1bmN0aW9uIGkoZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgbCA9IGZ1bmN0aW9uIGwoZSkge1xuICAgICAgdmFyIHQsXG4gICAgICAgICAgciA9IGUuYm9yZGVyZWQsXG4gICAgICAgICAgaSA9IGUuY2FwdGlvbixcbiAgICAgICAgICBsID0gZS5jaGlsZHJlbixcbiAgICAgICAgICB1ID0gZS5mdWxsV2lkdGgsXG4gICAgICAgICAgYyA9IGUuZml4ZWQsXG4gICAgICAgICAgcyA9IGUuc2Nyb2xsYWJsZSxcbiAgICAgICAgICBkID0gZS5zdHJpcGVkLFxuICAgICAgICAgIGYgPSBlLmNvbXBhY3QsXG4gICAgICAgICAgcCA9IGUuc3RhY2tlZFN0eWxlLFxuICAgICAgICAgIG0gPSB2b2lkIDAgPT09IHAgPyBcIm5vbmVcIiA6IHAsXG4gICAgICAgICAgeSA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLXRhYmxlXCIsICgodCA9IHtcbiAgICAgICAgXCJ1c2EtdGFibGUtLWJvcmRlcmxlc3NcIjogIXJcbiAgICAgIH0pW1wiXCIgKyBvLmRlZmF1bHQuZnVsbHdpZHRoXSA9IHUsIHRbXCJcIiArIG8uZGVmYXVsdC5maXhlZF0gPSBjLCB0W1widXNhLXRhYmxlLS1zdHJpcGVkXCJdID0gZCwgdFtcInVzYS10YWJsZS0tY29tcGFjdFwiXSA9IGYsIHRbXCJ1c2EtdGFibGUtLXN0YWNrZWRcIl0gPSBcImRlZmF1bHRcIiA9PT0gbSwgdFtcInVzYS10YWJsZS0tc3RhY2tlZC1oZWFkZXJcIl0gPSBcImhlYWRlcnNcIiA9PT0gbSwgdCkpO1xuICAgICAgZiAmJiBcIm5vbmVcIiAhPT0gbSAmJiBjb25zb2xlLndhcm4oXCJVU1dEUyBzdGF0ZXMgdGhhdCBjb21wYWN0IHN0eWxpbmcgaXMgbm90IHN1aXRhYmxlIGZvciB1c2Ugd2l0aCBzdGFja2VkIHZhcmlhbnRzLiBTZWUgVVNXRFMgVGFibGUgY29tcG9uZW50LCBUYWJsZSB2YXJpYW50cyBmb3IgbW9yZSBpbmZvcm1hdGlvbjogaHR0cHM6Ly9kZXNpZ25zeXN0ZW0uZGlnaXRhbC5nb3YvY29tcG9uZW50cy90YWJsZVwiKTtcbiAgICAgIHZhciBiID0gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJ0YWJsZVwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogeSxcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcInRhYmxlXCJcbiAgICAgIH0sIGkgJiYgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJjYXB0aW9uXCIsIG51bGwsIGkpLCBsKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChhLmRlZmF1bHQuRnJhZ21lbnQsIG51bGwsIHMgPyBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJzY3JvbGxhYmxlLXRhYmxlLWNvbnRhaW5lclwiLFxuICAgICAgICBjbGFzc05hbWU6IFwidXNhLXRhYmxlLWNvbnRhaW5lci0tc2Nyb2xsYWJsZVwiXG4gICAgICB9LCBiKSA6IGIpO1xuICAgIH07XG5cbiAgICB0LlRhYmxlID0gbDtcbiAgICB2YXIgdSA9IGw7XG4gICAgdC5kZWZhdWx0ID0gdTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIHIucih0KSwgdC5kZWZhdWx0ID0ge1xuICAgICAgZnVsbHdpZHRoOiBcInNyYy1jb21wb25lbnRzLVRhYmxlLVRhYmxlLW1vZHVsZV9fZnVsbHdpZHRoLS0zLUszdFwiLFxuICAgICAgZml4ZWQ6IFwic3JjLWNvbXBvbmVudHMtVGFibGUtVGFibGUtbW9kdWxlX19maXhlZC0tMkF3Y3lcIlxuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0LlRhZyA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTYgPSBmdW5jdGlvbiBpKCkge1xuICAgICAgcmV0dXJuIChfaTYgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIHZhciB0ID0gZS5jaGlsZHJlbixcbiAgICAgICAgICByID0gZS5iYWNrZ3JvdW5kLFxuICAgICAgICAgIG8gPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICB1ID0gbChlLCBbXCJjaGlsZHJlblwiLCBcImJhY2tncm91bmRcIiwgXCJjbGFzc05hbWVcIl0pLFxuICAgICAgICAgIGMgPSB7fTtcbiAgICAgIHIgJiYgKGMuYmFja2dyb3VuZCA9IHIpO1xuICAgICAgdmFyIHMgPSAoMCwgbi5kZWZhdWx0KShcInVzYS10YWdcIiwgbyk7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIF9pNih7XG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJ0YWdcIixcbiAgICAgICAgY2xhc3NOYW1lOiBzLFxuICAgICAgICBzdHlsZTogX2k2KHt9LCBjKVxuICAgICAgfSwgdSksIHQpO1xuICAgIH07XG5cbiAgICB0LlRhZyA9IHU7XG4gICAgdmFyIGMgPSB1O1xuICAgIHQuZGVmYXVsdCA9IGM7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmlzQ3VzdG9tUHJvcHMgPSBzLCB0LlRvb2x0aXAgPSBkO1xuXG4gICAgdmFyIGEsXG4gICAgICAgIG4gPSBmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgaWYgKCF0ICYmIGUgJiYgZS5fX2VzTW9kdWxlKSByZXR1cm4gZTtcbiAgICAgIGlmIChudWxsID09PSBlIHx8IFwib2JqZWN0XCIgIT0gdHlwZW9mIGUgJiYgXCJmdW5jdGlvblwiICE9IHR5cGVvZiBlKSByZXR1cm4ge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgICAgdmFyIHIgPSBsKHQpO1xuICAgICAgaWYgKHIgJiYgci5oYXMoZSkpIHJldHVybiByLmdldChlKTtcbiAgICAgIHZhciBhID0ge30sXG4gICAgICAgICAgbiA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4gICAgICBmb3IgKHZhciBvIGluIGUpIHtcbiAgICAgICAgaWYgKFwiZGVmYXVsdFwiICE9PSBvICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBvKSkge1xuICAgICAgICAgIHZhciBpID0gbiA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgbykgOiBudWxsO1xuICAgICAgICAgIGkgJiYgKGkuZ2V0IHx8IGkuc2V0KSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCBvLCBpKSA6IGFbb10gPSBlW29dO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGEuZGVmYXVsdCA9IGUsIHIgJiYgci5zZXQoZSwgYSk7XG4gICAgICByZXR1cm4gYTtcbiAgICB9KHIoMCkpLFxuICAgICAgICBvID0gKGEgPSByKDEpKSAmJiBhLl9fZXNNb2R1bGUgPyBhIDoge1xuICAgICAgZGVmYXVsdDogYVxuICAgIH0sXG4gICAgICAgIGkgPSByKDM0KTtcblxuICAgIGZ1bmN0aW9uIGwoZSkge1xuICAgICAgaWYgKFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgV2Vha01hcCkgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgdCA9IG5ldyBXZWFrTWFwKCksXG4gICAgICAgICAgciA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICByZXR1cm4gKGwgPSBmdW5jdGlvbiBsKGUpIHtcbiAgICAgICAgcmV0dXJuIGUgPyByIDogdDtcbiAgICAgIH0pKGUpO1xuICAgIH1cblxuICAgIHZhciBfdSA9IGZ1bmN0aW9uIHUoKSB7XG4gICAgICByZXR1cm4gKF91ID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBjID0gZnVuY3Rpb24gYyhlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gcyhlKSB7XG4gICAgICByZXR1cm4gXCJhc0N1c3RvbVwiIGluIGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZChlKSB7XG4gICAgICB2YXIgdCA9ICgwLCBuLnVzZVJlZikobnVsbCksXG4gICAgICAgICAgciA9ICgwLCBuLnVzZVJlZikobnVsbCksXG4gICAgICAgICAgYSA9ICgwLCBuLnVzZVJlZikoXCJ0b29sdGlwLVwiICsgKE1hdGguZmxvb3IoOWU1ICogTWF0aC5yYW5kb20oKSkgKyAxZTUpKSxcbiAgICAgICAgICBsID0gKDAsIG4udXNlU3RhdGUpKCExKSxcbiAgICAgICAgICBkID0gbFswXSxcbiAgICAgICAgICBmID0gbFsxXSxcbiAgICAgICAgICBwID0gZnVuY3Rpb24gcChhLCBvKSB7XG4gICAgICAgICgwLCBuLnVzZUVmZmVjdCkoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBuID0gbztcblxuICAgICAgICAgIGlmIChhLmN1cnJlbnQgJiYgci5jdXJyZW50ICYmIHQuY3VycmVudCkge1xuICAgICAgICAgICAgdmFyIGwgPSBhLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgdSA9IHIuY3VycmVudCxcbiAgICAgICAgICAgICAgICBjID0gdC5jdXJyZW50LFxuICAgICAgICAgICAgICAgIHMgPSBsLm9mZnNldFdpZHRoLFxuICAgICAgICAgICAgICAgIGQgPSBsLm9mZnNldEhlaWdodCxcbiAgICAgICAgICAgICAgICBmID0gTnVtYmVyLnBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGwpLmdldFByb3BlcnR5VmFsdWUoXCJtYXJnaW4tdG9wXCIpLCAxMCksXG4gICAgICAgICAgICAgICAgcCA9IE51bWJlci5wYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShsKS5nZXRQcm9wZXJ0eVZhbHVlKFwibWFyZ2luLWJvdHRvbVwiKSwgMTApLFxuICAgICAgICAgICAgICAgIG0gPSBOdW1iZXIucGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoYykuZ2V0UHJvcGVydHlWYWx1ZShcInBhZGRpbmctdG9wXCIpLCAxMCksXG4gICAgICAgICAgICAgICAgeSA9IE51bWJlci5wYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjKS5nZXRQcm9wZXJ0eVZhbHVlKFwicGFkZGluZy1ib3R0b21cIiksIDEwKSxcbiAgICAgICAgICAgICAgICBiID0gTnVtYmVyLnBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHUpLmdldFByb3BlcnR5VmFsdWUoXCJoZWlnaHRcIiksIDEwKSxcbiAgICAgICAgICAgICAgICB2ID0gbC5vZmZzZXRMZWZ0LFxuICAgICAgICAgICAgICAgIE8gPSB1Lm9mZnNldFdpZHRoLFxuICAgICAgICAgICAgICAgIGcgPSBzIC8gMiArIHYsXG4gICAgICAgICAgICAgICAgXyA9IHMgKyA1ICsgMixcbiAgICAgICAgICAgICAgICBoID0gZCArIDUgKyAyLFxuICAgICAgICAgICAgICAgIGogPSBmdW5jdGlvbiBqKGUpIHtcbiAgICAgICAgICAgICAgdS5jbGFzc0xpc3QucmVtb3ZlKFwidXNhLXRvb2x0aXBfX2JvZHktLVwiICsgbiksIG4gPSBlLCB1LmNsYXNzTGlzdC5hZGQoXCJ1c2EtdG9vbHRpcF9fYm9keS0tXCIgKyBlKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChlLndyYXBwZXJjbGFzc2VzKSBlLndyYXBwZXJjbGFzc2VzLnNwbGl0KFwiIFwiKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBjLmNsYXNzTGlzdC5hZGQoZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChlLmNsYXNzTmFtZSkgZS5jbGFzc05hbWUuc3BsaXQoXCIgXCIpLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGwuY2xhc3NMaXN0LmFkZChlKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB2YXIgTSA9IGZ1bmN0aW9uIE0oZSkge1xuICAgICAgICAgICAgICBqKFwidG9wXCIpLCBlLnN0eWxlLm1hcmdpbkxlZnQgPSBnICsgXCJweFwiLCAoMCwgaS5pc0VsZW1lbnRJblZpZXdwb3J0KShlKSB8fCBlLmNsYXNzTGlzdC5hZGQoXCJ1c2EtdG9vbHRpcF9fYm9keS0td3JhcFwiKSwgZS5zdHlsZS5tYXJnaW5Cb3R0b20gPSBoICsgcCArIHkgKyBcInB4XCI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIE4gPSBmdW5jdGlvbiBOKGUpIHtcbiAgICAgICAgICAgICAgaihcImJvdHRvbVwiKSwgZS5zdHlsZS5tYXJnaW5MZWZ0ID0gZyArIFwicHhcIiwgKDAsIGkuaXNFbGVtZW50SW5WaWV3cG9ydCkoZSkgfHwgZS5jbGFzc0xpc3QuYWRkKFwidXNhLXRvb2x0aXBfX2JvZHktLXdyYXBcIiksIGUuc3R5bGUubWFyZ2luVG9wID0gaCArIGYgKyBtICsgXCJweFwiO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBFID0gZnVuY3Rpb24gRShlKSB7XG4gICAgICAgICAgICAgIGooXCJyaWdodFwiKSwgZS5zdHlsZS5tYXJnaW5Cb3R0b20gPSBcIjBcIiwgZS5zdHlsZS5tYXJnaW5MZWZ0ID0gXyArIHYgKyBcInB4XCIsIGUuc3R5bGUuYm90dG9tID0gKGQgLSBiKSAvIDIgKyBwICsgeSArIFwicHhcIjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgUCA9IGZ1bmN0aW9uIFAoZSkge1xuICAgICAgICAgICAgICBqKFwibGVmdFwiKSwgZS5zdHlsZS5tYXJnaW5Cb3R0b20gPSBcIjBcIiwgZS5zdHlsZS5tYXJnaW5MZWZ0ID0gdiA+IE8gPyB2IC0gTyAtIDcgKyBcInB4XCIgOiBcIi1cIiArIChPIC0gdiArIDcpICsgXCJweFwiLCBlLnN0eWxlLmJvdHRvbSA9IChkIC0gYikgLyAyICsgcCArIHkgKyBcInB4XCI7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBzd2l0Y2ggKG8pIHtcbiAgICAgICAgICAgICAgY2FzZSBcInRvcFwiOlxuICAgICAgICAgICAgICAgIE0odSksICgwLCBpLmlzRWxlbWVudEluVmlld3BvcnQpKHUpIHx8IE4odSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgY2FzZSBcImJvdHRvbVwiOlxuICAgICAgICAgICAgICAgIE4odSksICgwLCBpLmlzRWxlbWVudEluVmlld3BvcnQpKHUpIHx8IE0odSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgY2FzZSBcInJpZ2h0XCI6XG4gICAgICAgICAgICAgICAgRSh1KSwgKDAsIGkuaXNFbGVtZW50SW5WaWV3cG9ydCkodSkgfHwgKFAodSksICgwLCBpLmlzRWxlbWVudEluVmlld3BvcnQpKHUpIHx8IE0odSkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgIGNhc2UgXCJsZWZ0XCI6XG4gICAgICAgICAgICAgICAgUCh1KSwgKDAsIGkuaXNFbGVtZW50SW5WaWV3cG9ydCkodSkgfHwgKEUodSksICgwLCBpLmlzRWxlbWVudEluVmlld3BvcnQpKHUpIHx8IE0odSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgW2RdKTtcbiAgICAgIH07XG5cbiAgICAgIGlmIChzKGUpKSB7XG4gICAgICAgIHZhciBtID0gKDAsIG4udXNlUmVmKShudWxsKSxcbiAgICAgICAgICAgIHkgPSBlLmxhYmVsLFxuICAgICAgICAgICAgYiA9IGUucG9zaXRpb24sXG4gICAgICAgICAgICB2ID0gZS5hc0N1c3RvbSxcbiAgICAgICAgICAgIE8gPSBlLmNoaWxkcmVuLFxuICAgICAgICAgICAgZyA9IE4gPSBjKGUsIFtcImxhYmVsXCIsIFwicG9zaXRpb25cIiwgXCJhc0N1c3RvbVwiLCBcImNoaWxkcmVuXCJdKSxcbiAgICAgICAgICAgIF8gPSAoMCwgby5kZWZhdWx0KShcInVzYS10b29sdGlwX19ib2R5XCIsIHtcbiAgICAgICAgICBcImlzLXNldFwiOiBkLFxuICAgICAgICAgIFwidXNhLXRvb2x0aXBfX2JvZHktLXRvcFwiOiBcInRvcFwiID09PSBiLFxuICAgICAgICAgIFwidXNhLXRvb2x0aXBfX2JvZHktLWJvdHRvbVwiOiBcImJvdHRvbVwiID09PSBiLFxuICAgICAgICAgIFwidXNhLXRvb2x0aXBfX2JvZHktLXJpZ2h0XCI6IFwicmlnaHRcIiA9PT0gYixcbiAgICAgICAgICBcInVzYS10b29sdGlwX19ib2R5LS1sZWZ0XCI6IFwibGVmdFwiID09PSBiLFxuICAgICAgICAgIFwiaXMtdmlzaWJsZVwiOiBkXG4gICAgICAgIH0pLFxuICAgICAgICAgICAgaCA9IGZ1bmN0aW9uIGgoKSB7XG4gICAgICAgICAgZighMCk7XG4gICAgICAgIH0sXG4gICAgICAgICAgICBqID0gZnVuY3Rpb24gaigpIHtcbiAgICAgICAgICBmKCExKTtcbiAgICAgICAgfTtcblxuICAgICAgICBwKG0sIGIpO1xuICAgICAgICB2YXIgTSA9ICgwLCBuLmNyZWF0ZUVsZW1lbnQpKHYsIF91KHtcbiAgICAgICAgICByZWY6IG0sXG4gICAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcInRyaWdnZXJFbGVtZW50XCIsXG4gICAgICAgICAgb25Nb3VzZUVudGVyOiBmdW5jdGlvbiBvbk1vdXNlRW50ZXIoKSB7XG4gICAgICAgICAgICByZXR1cm4gaCgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25Nb3VzZU92ZXI6IGZ1bmN0aW9uIG9uTW91c2VPdmVyKCkge1xuICAgICAgICAgICAgcmV0dXJuIGgoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uRm9jdXM6IGZ1bmN0aW9uIG9uRm9jdXMoKSB7XG4gICAgICAgICAgICByZXR1cm4gaCgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25Nb3VzZUxlYXZlOiBmdW5jdGlvbiBvbk1vdXNlTGVhdmUoKSB7XG4gICAgICAgICAgICByZXR1cm4gaigpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25CbHVyOiBmdW5jdGlvbiBvbkJsdXIoKSB7XG4gICAgICAgICAgICByZXR1cm4gaigpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25LZXlEb3duOiBmdW5jdGlvbiBvbktleURvd24oKSB7XG4gICAgICAgICAgICByZXR1cm4gaigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgZyksIE8pO1xuICAgICAgICByZXR1cm4gbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwidG9vbHRpcFdyYXBwZXJcIixcbiAgICAgICAgICByZWY6IHQsXG4gICAgICAgICAgY2xhc3NOYW1lOiBcInVzYS10b29sdGlwXCIsXG4gICAgICAgICAgcm9sZTogXCJ0b29sdGlwXCJcbiAgICAgICAgfSwgTSwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwidG9vbHRpcEJvZHlcIixcbiAgICAgICAgICB0aXRsZTogeSxcbiAgICAgICAgICBpZDogYS5jdXJyZW50LFxuICAgICAgICAgIHJlZjogcixcbiAgICAgICAgICBjbGFzc05hbWU6IF9cbiAgICAgICAgfSwgeSkpO1xuICAgICAgfVxuXG4gICAgICBtID0gKDAsIG4udXNlUmVmKShudWxsKSwgeSA9IGUubGFiZWwsIGIgPSBlLnBvc2l0aW9uLCBPID0gZS5jaGlsZHJlbjtcblxuICAgICAgdmFyIE4gPSBjKGUsIFtcImxhYmVsXCIsIFwicG9zaXRpb25cIiwgXCJjaGlsZHJlblwiXSksXG4gICAgICAgICAgRSA9IChfID0gKDAsIG8uZGVmYXVsdCkoXCJ1c2EtdG9vbHRpcF9fYm9keVwiLCB7XG4gICAgICAgIFwiaXMtc2V0XCI6IGQsXG4gICAgICAgIFwidXNhLXRvb2x0aXBfX2JvZHktLXRvcFwiOiBcInRvcFwiID09PSBiLFxuICAgICAgICBcInVzYS10b29sdGlwX19ib2R5LS1ib3R0b21cIjogXCJib3R0b21cIiA9PT0gYixcbiAgICAgICAgXCJ1c2EtdG9vbHRpcF9fYm9keS0tcmlnaHRcIjogXCJyaWdodFwiID09PSBiLFxuICAgICAgICBcInVzYS10b29sdGlwX19ib2R5LS1sZWZ0XCI6IFwibGVmdFwiID09PSBiLFxuICAgICAgICBcImlzLXZpc2libGVcIjogZFxuICAgICAgfSksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZighMCk7XG4gICAgICB9KSxcbiAgICAgICAgICBQID0gZnVuY3Rpb24gUCgpIHtcbiAgICAgICAgZighMSk7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gcChtLCBiKSwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcInRvb2x0aXBXcmFwcGVyXCIsXG4gICAgICAgIHJlZjogdCxcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS10b29sdGlwXCIsXG4gICAgICAgIHJvbGU6IFwidG9vbHRpcFwiXG4gICAgICB9LCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCBfdSh7fSwgTiwge1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwidHJpZ2dlckVsZW1lbnRcIixcbiAgICAgICAgcmVmOiBtLFxuICAgICAgICBcImFyaWEtZGVzY3JpYmVkYnlcIjogYS5jdXJyZW50LFxuICAgICAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWJ1dHRvbiB1c2EtdG9vbHRpcF9fdHJpZ2dlclwiLFxuICAgICAgICB0aXRsZTogeSxcbiAgICAgICAgb25Nb3VzZUVudGVyOiBFLFxuICAgICAgICBvbk1vdXNlT3ZlcjogRSxcbiAgICAgICAgb25Gb2N1czogRSxcbiAgICAgICAgb25Nb3VzZUxlYXZlOiBQLFxuICAgICAgICBvbkJsdXI6IFAsXG4gICAgICAgIG9uS2V5RG93bjogUFxuICAgICAgfSksIE8pLCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwidG9vbHRpcEJvZHlcIixcbiAgICAgICAgdGl0bGU6IHksXG4gICAgICAgIGlkOiBhLmN1cnJlbnQsXG4gICAgICAgIHJlZjogcixcbiAgICAgICAgY2xhc3NOYW1lOiBfXG4gICAgICB9LCB5KSk7XG4gICAgfVxuXG4gICAgZC5kZWZhdWx0UHJvcHMgPSB7XG4gICAgICBwb3NpdGlvbjogXCJ0b3BcIlxuICAgIH0sIGQuRGlzcGxheU5hbWUgPSBcIlRvb2x0aXBcIjtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuaXNFbGVtZW50SW5WaWV3cG9ydCA9IHZvaWQgMDtcblxuICAgIHQuaXNFbGVtZW50SW5WaWV3cG9ydCA9IGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgICB2b2lkIDAgPT09IHQgJiYgKHQgPSB3aW5kb3cpLCB2b2lkIDAgPT09IHIgJiYgKHIgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpO1xuICAgICAgdmFyIGEgPSBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgcmV0dXJuIGEudG9wID49IDAgJiYgYS5sZWZ0ID49IDAgJiYgYS5ib3R0b20gPD0gKHQuaW5uZXJIZWlnaHQgfHwgci5jbGllbnRIZWlnaHQpICYmIGEucmlnaHQgPD0gKHQuaW5uZXJXaWR0aCB8fCByLmNsaWVudFdpZHRoKTtcbiAgICB9O1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5TaWRlTmF2ID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDApKSxcbiAgICAgICAgbiA9IG8ocigxKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdC5TaWRlTmF2ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0ID0gZS5pdGVtcyxcbiAgICAgICAgICByID0gZS5pc1N1Ym5hdixcbiAgICAgICAgICBvID0gdm9pZCAwICE9PSByICYmIHIsXG4gICAgICAgICAgaSA9ICgwLCBuLmRlZmF1bHQpKHtcbiAgICAgICAgXCJ1c2Etc2lkZW5hdlwiOiAhbyxcbiAgICAgICAgXCJ1c2Etc2lkZW5hdl9fc3VibGlzdFwiOiBvXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInVsXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBpLFxuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwic2lkZW5hdlwiXG4gICAgICB9LCB0Lm1hcChmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAgICAgICAga2V5OiBcInNpZGVuYXZfaXRlbV9cIiArIHQsXG4gICAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1zaWRlbmF2X19pdGVtXCJcbiAgICAgICAgfSwgZSk7XG4gICAgICB9KSk7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuQ29sbGVjdGlvbiA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTcgPSBmdW5jdGlvbiBpKCkge1xuICAgICAgcmV0dXJuIChfaTcgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH07XG5cbiAgICB0LkNvbGxlY3Rpb24gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIHIgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBvID0gZS5jb25kZW5zZWQsXG4gICAgICAgICAgdSA9IGwoZSwgW1wiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJjb25kZW5zZWRcIl0pLFxuICAgICAgICAgIGMgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1jb2xsZWN0aW9uXCIsIHtcbiAgICAgICAgXCJ1c2EtY29sbGVjdGlvbi0tY29uZGVuc2VkXCI6IG9cbiAgICAgIH0sIHIpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwidWxcIiwgX2k3KHtcbiAgICAgICAgY2xhc3NOYW1lOiBjLFxuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiY29sbGVjdGlvblwiXG4gICAgICB9LCB1KSwgdCk7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuQ29sbGVjdGlvbkl0ZW0gPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2k4ID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2k4ID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBsID0gZnVuY3Rpb24gbChlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuXG4gICAgdC5Db2xsZWN0aW9uSXRlbSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHIgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIG8gPSBlLnZhcmlhbnRDb21wb25lbnQsXG4gICAgICAgICAgdSA9IGwoZSwgW1wiY2xhc3NOYW1lXCIsIFwiY2hpbGRyZW5cIiwgXCJ2YXJpYW50Q29tcG9uZW50XCJdKSxcbiAgICAgICAgICBjID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtY29sbGVjdGlvbl9faXRlbVwiLCB0KTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImxpXCIsIF9pOCh7XG4gICAgICAgIGNsYXNzTmFtZTogY1xuICAgICAgfSwgdSksIG8sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1jb2xsZWN0aW9uX19ib2R5XCJcbiAgICAgIH0sIHIpKTtcbiAgICB9O1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5Db2xsZWN0aW9uSGVhZGluZyA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTkgPSBmdW5jdGlvbiBpKCkge1xuICAgICAgcmV0dXJuIChfaTkgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH07XG5cbiAgICB0LkNvbGxlY3Rpb25IZWFkaW5nID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0ID0gZS5oZWFkaW5nTGV2ZWwsXG4gICAgICAgICAgciA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIG8gPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIHUgPSBsKGUsIFtcImhlYWRpbmdMZXZlbFwiLCBcImNsYXNzTmFtZVwiLCBcImNoaWxkcmVuXCJdKSxcbiAgICAgICAgICBjID0gdCB8fCBcImgzXCIsXG4gICAgICAgICAgcyA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLWNvbGxlY3Rpb25fX2hlYWRpbmdcIiwgcik7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoYywgX2k5KHtcbiAgICAgICAgY2xhc3NOYW1lOiBzXG4gICAgICB9LCB1KSwgbyk7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuQ29sbGVjdGlvbkRlc2NyaXB0aW9uID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDApKSxcbiAgICAgICAgbiA9IG8ocigxKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9pMTAgPSBmdW5jdGlvbiBpKCkge1xuICAgICAgcmV0dXJuIChfaTEwID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBsID0gZnVuY3Rpb24gbChlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuXG4gICAgdC5Db2xsZWN0aW9uRGVzY3JpcHRpb24gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICByID0gZS5jaGlsZHJlbixcbiAgICAgICAgICBvID0gbChlLCBbXCJjbGFzc05hbWVcIiwgXCJjaGlsZHJlblwiXSksXG4gICAgICAgICAgdSA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLWNvbGxlY3Rpb25fX2Rlc2NyaXB0aW9uXCIsIHQpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwicFwiLCBfaTEwKHtcbiAgICAgICAgY2xhc3NOYW1lOiB1XG4gICAgICB9LCBvKSwgcik7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuQ29sbGVjdGlvbk1ldGEgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2kxMSA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pMTEgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH07XG5cbiAgICB0LkNvbGxlY3Rpb25NZXRhID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0ID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgciA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgbyA9IGwoZSwgW1wiY2xhc3NOYW1lXCIsIFwiY2hpbGRyZW5cIl0pLFxuICAgICAgICAgIHUgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1jb2xsZWN0aW9uX19tZXRhXCIsIHQpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwidWxcIiwgX2kxMSh7XG4gICAgICAgIGNsYXNzTmFtZTogdVxuICAgICAgfSwgbyksIHIpO1xuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LkNvbGxlY3Rpb25NZXRhSXRlbSA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTEyID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kxMiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfTtcblxuICAgIHQuQ29sbGVjdGlvbk1ldGFJdGVtID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0ID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgciA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgbyA9IGwoZSwgW1wiY2xhc3NOYW1lXCIsIFwiY2hpbGRyZW5cIl0pLFxuICAgICAgICAgIHUgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1jb2xsZWN0aW9uX19tZXRhLWl0ZW1cIiwgdCk7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBfaTEyKHtcbiAgICAgICAgY2xhc3NOYW1lOiB1XG4gICAgICB9LCBvKSwgcik7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuQ29sbGVjdGlvbk1ldGFJdGVtVGFnID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDApKSxcbiAgICAgICAgbiA9IG8ocigxKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9pMTMgPSBmdW5jdGlvbiBpKCkge1xuICAgICAgcmV0dXJuIChfaTEzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBsID0gZnVuY3Rpb24gbChlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuXG4gICAgdC5Db2xsZWN0aW9uTWV0YUl0ZW1UYWcgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICByID0gZS5jaGlsZHJlbixcbiAgICAgICAgICBvID0gZS50YWdTdHlsZSxcbiAgICAgICAgICB1ID0gbChlLCBbXCJjbGFzc05hbWVcIiwgXCJjaGlsZHJlblwiLCBcInRhZ1N0eWxlXCJdKSxcbiAgICAgICAgICBjID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtY29sbGVjdGlvbl9fbWV0YS1pdGVtXCIsIFwidXNhLXRhZ1wiLCB7XG4gICAgICAgIFwidXNhLXRhZy0tbmV3XCI6IFwibmV3XCIgPT09IG9cbiAgICAgIH0sIHQpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwibGlcIiwgX2kxMyh7XG4gICAgICAgIGNsYXNzTmFtZTogY1xuICAgICAgfSwgdSksIHIpO1xuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LkNvbGxlY3Rpb25UaHVtYm5haWwgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2kxNCA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pMTQgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH07XG5cbiAgICB0LkNvbGxlY3Rpb25UaHVtYm5haWwgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICByID0gZS5zcmMsXG4gICAgICAgICAgbyA9IGUuYWx0LFxuICAgICAgICAgIHUgPSBsKGUsIFtcImNsYXNzTmFtZVwiLCBcInNyY1wiLCBcImFsdFwiXSksXG4gICAgICAgICAgYyA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLWNvbGxlY3Rpb25fX2ltZ1wiLCB0KTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImltZ1wiLCBfaTE0KHtcbiAgICAgICAgY2xhc3NOYW1lOiBjLFxuICAgICAgICBzcmM6IHIsXG4gICAgICAgIGFsdDogb1xuICAgICAgfSwgdSkpO1xuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LkNvbGxlY3Rpb25DYWxlbmRhckRhdGUgPSB2b2lkIDA7XG4gICAgdmFyIGEsXG4gICAgICAgIG4gPSAoYSA9IHIoMCkpICYmIGEuX19lc01vZHVsZSA/IGEgOiB7XG4gICAgICBkZWZhdWx0OiBhXG4gICAgfTtcbiAgICB2YXIgbyA9IFtcIkphblwiLCBcIkZlYlwiLCBcIk1hclwiLCBcIkFwclwiLCBcIk1heVwiLCBcIkp1blwiLCBcIkp1bFwiLCBcIkF1Z1wiLCBcIlNlcFwiLCBcIk9jdFwiLCBcIk5vdlwiLCBcIkRlY1wiXTtcblxuICAgIHQuQ29sbGVjdGlvbkNhbGVuZGFyRGF0ZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCA9IGUuZGF0ZXRpbWUsXG4gICAgICAgICAgciA9IG5ldyBEYXRlKHQpO1xuICAgICAgcmV0dXJuIHIgJiYgci5nZXRUaW1lICYmIGlzTmFOKHIuZ2V0VGltZSgpKSA/IG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KG4uZGVmYXVsdC5GcmFnbWVudCwgbnVsbCkgOiBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtY29sbGVjdGlvbl9fY2FsZW5kYXItZGF0ZVwiLFxuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiY29sbGVjdGlvbi1jYWxlbmRhci1kYXRlXCJcbiAgICAgIH0sIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwidGltZVwiLCB7XG4gICAgICAgIGRhdGVUaW1lOiB0XG4gICAgICB9LCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWNvbGxlY3Rpb25fX2NhbGVuZGFyLWRhdGUtbW9udGhcIlxuICAgICAgfSwgb1tyLmdldE1vbnRoKCldKSwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1jb2xsZWN0aW9uX19jYWxlbmRhci1kYXRlLWRheVwiXG4gICAgICB9LCByLmdldERhdGUoKSkpKTtcbiAgICB9O1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5pc0N1c3RvbVByb3BzID0gdSwgdC5HcmlkQ29udGFpbmVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmICh1KGUpKSB7XG4gICAgICAgIHZhciB0ID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgICByID0gZS5jb250YWluZXJTaXplLFxuICAgICAgICAgICAgbiA9IGUuYXNDdXN0b20sXG4gICAgICAgICAgICBvID0gZS5jaGlsZHJlbixcbiAgICAgICAgICAgIHMgPSBsKGUsIFtcImNsYXNzTmFtZVwiLCBcImNvbnRhaW5lclNpemVcIiwgXCJhc0N1c3RvbVwiLCBcImNoaWxkcmVuXCJdKSxcbiAgICAgICAgICAgIGQgPSBjKHQsIHIpO1xuICAgICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQobiwgX2kxNSh7XG4gICAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImdyaWRDb250YWluZXJcIixcbiAgICAgICAgICBjbGFzc05hbWU6IGRcbiAgICAgICAgfSwgcyksIG8pO1xuICAgICAgfVxuXG4gICAgICB0ID0gZS5jbGFzc05hbWUsIHIgPSBlLmNvbnRhaW5lclNpemUsIG8gPSBlLmNoaWxkcmVuLCBzID0gbChlLCBbXCJjbGFzc05hbWVcIiwgXCJjb250YWluZXJTaXplXCIsIFwiY2hpbGRyZW5cIl0pLCBkID0gYyh0LCByKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfaTE1KHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImdyaWRDb250YWluZXJcIixcbiAgICAgICAgY2xhc3NOYW1lOiBkXG4gICAgICB9LCBzKSwgbyk7XG4gICAgfTtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTE1ID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kxNSA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHUoZSkge1xuICAgICAgcmV0dXJuIFwiYXNDdXN0b21cIiBpbiBlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGMoZSwgdCkge1xuICAgICAgdmFyIHI7XG4gICAgICByZXR1cm4gKDAsIG4uZGVmYXVsdCkoKChyID0ge1xuICAgICAgICBcImdyaWQtY29udGFpbmVyXCI6ICF0XG4gICAgICB9KVtcImdyaWQtY29udGFpbmVyLVwiICsgdF0gPSAhIXQsIHIpLCBlKTtcbiAgICB9XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmJyZWFrcG9pbnRzID0gdm9pZCAwO1xuICAgIHQuYnJlYWtwb2ludHMgPSB7XG4gICAgICBtb2JpbGU6IFwibW9iaWxlXCIsXG4gICAgICBtb2JpbGVMZzogXCJtb2JpbGUtbGdcIixcbiAgICAgIHRhYmxldDogXCJ0YWJsZXRcIixcbiAgICAgIHRhYmxldExnOiBcInRhYmxldC1sZ1wiLFxuICAgICAgZGVza3RvcDogXCJkZXNrdG9wXCIsXG4gICAgICBkZXNrdG9wTGc6IFwiZGVza3RvcC1sZ1wiLFxuICAgICAgd2lkZXNjcmVlbjogXCJ3aWRlc2NyZWVuXCJcbiAgICB9O1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZWZhdWx0ID0gdC5DaGFyYWN0ZXJDb3VudCA9IHZvaWQgMDtcblxuICAgIHZhciBhLFxuICAgICAgICBuID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIGlmICghdCAmJiBlICYmIGUuX19lc01vZHVsZSkgcmV0dXJuIGU7XG4gICAgICBpZiAobnVsbCA9PT0gZSB8fCBcIm9iamVjdFwiICE9IHR5cGVvZiBlICYmIFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgZSkgcmV0dXJuIHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICAgIHZhciByID0gdSh0KTtcbiAgICAgIGlmIChyICYmIHIuaGFzKGUpKSByZXR1cm4gci5nZXQoZSk7XG4gICAgICB2YXIgYSA9IHt9LFxuICAgICAgICAgIG4gPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuICAgICAgZm9yICh2YXIgbyBpbiBlKSB7XG4gICAgICAgIGlmIChcImRlZmF1bHRcIiAhPT0gbyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgbykpIHtcbiAgICAgICAgICB2YXIgaSA9IG4gPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIG8pIDogbnVsbDtcbiAgICAgICAgICBpICYmIChpLmdldCB8fCBpLnNldCkgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwgbywgaSkgOiBhW29dID0gZVtvXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhLmRlZmF1bHQgPSBlLCByICYmIHIuc2V0KGUsIGEpO1xuICAgICAgcmV0dXJuIGE7XG4gICAgfShyKDApKSxcbiAgICAgICAgbyA9IChhID0gcigxKSkgJiYgYS5fX2VzTW9kdWxlID8gYSA6IHtcbiAgICAgIGRlZmF1bHQ6IGFcbiAgICB9LFxuICAgICAgICBpID0gcig3KSxcbiAgICAgICAgbCA9IHIoMTYpO1xuXG4gICAgZnVuY3Rpb24gdShlKSB7XG4gICAgICBpZiAoXCJmdW5jdGlvblwiICE9IHR5cGVvZiBXZWFrTWFwKSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciB0ID0gbmV3IFdlYWtNYXAoKSxcbiAgICAgICAgICByID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgIHJldHVybiAodSA9IGZ1bmN0aW9uIHUoZSkge1xuICAgICAgICByZXR1cm4gZSA/IHIgOiB0O1xuICAgICAgfSkoZSk7XG4gICAgfVxuXG4gICAgdmFyIF9jID0gZnVuY3Rpb24gYygpIHtcbiAgICAgIHJldHVybiAoX2MgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIHMgPSBmdW5jdGlvbiBzKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIGQgPSBmdW5jdGlvbiBkKGUpIHtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKGUpLmxlbmd0aDtcbiAgICB9LFxuICAgICAgICBmID0gZnVuY3Rpb24gZihlLCB0KSB7XG4gICAgICB2YXIgciA9IHQgKyBcIiBjaGFyYWN0ZXJzIGFsbG93ZWRcIixcbiAgICAgICAgICBhID0gdCAtIGU7XG5cbiAgICAgIHN3aXRjaCAoYSkge1xuICAgICAgICBjYXNlIHQ6XG4gICAgICAgICAgcmV0dXJuIHI7XG5cbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHJldHVybiBcIiQwIGNoYXJhY3RlciBsZWZ0XCIucmVwbGFjZShcIiQwXCIsIFwiMVwiKTtcblxuICAgICAgICBjYXNlIC0xOlxuICAgICAgICAgIHJldHVybiBcIiQwIGNoYXJhY3RlciBvdmVyIGxpbWl0XCIucmVwbGFjZShcIiQwXCIsIFwiMVwiKTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBhID49IDAgPyBcIiQwIGNoYXJhY3RlcnMgbGVmdFwiLnJlcGxhY2UoXCIkMFwiLCBhLnRvU3RyaW5nKCkpIDogXCIkMCBjaGFyYWN0ZXJzIG92ZXIgbGltaXRcIi5yZXBsYWNlKFwiJDBcIiwgTWF0aC5hYnMoYSkudG9TdHJpbmcoKSk7XG4gICAgICB9XG4gICAgfSxcbiAgICAgICAgcCA9IGZ1bmN0aW9uIHAoZSkge1xuICAgICAgdmFyIHQgPSBlLmlkLFxuICAgICAgICAgIHIgPSBlLm5hbWUsXG4gICAgICAgICAgYSA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHUgPSBlLm1heExlbmd0aCxcbiAgICAgICAgICBwID0gZS5kZWZhdWx0VmFsdWUsXG4gICAgICAgICAgbSA9IHZvaWQgMCA9PT0gcCA/IFwiXCIgOiBwLFxuICAgICAgICAgIHkgPSBlLmlzVGV4dEFyZWEsXG4gICAgICAgICAgYiA9IHZvaWQgMCAhPT0geSAmJiB5LFxuICAgICAgICAgIHYgPSBlLmdldENoYXJhY3RlckNvdW50LFxuICAgICAgICAgIE8gPSB2b2lkIDAgPT09IHYgPyBkIDogdixcbiAgICAgICAgICBnID0gZS5nZXRNZXNzYWdlLFxuICAgICAgICAgIF8gPSB2b2lkIDAgPT09IGcgPyBmIDogZyxcbiAgICAgICAgICBoID0gcyhlLCBbXCJpZFwiLCBcIm5hbWVcIiwgXCJjbGFzc05hbWVcIiwgXCJtYXhMZW5ndGhcIiwgXCJkZWZhdWx0VmFsdWVcIiwgXCJpc1RleHRBcmVhXCIsIFwiZ2V0Q2hhcmFjdGVyQ291bnRcIiwgXCJnZXRNZXNzYWdlXCJdKSxcbiAgICAgICAgICBqID0gTyhtKSxcbiAgICAgICAgICBNID0gKDAsIG4udXNlU3RhdGUpKGopLFxuICAgICAgICAgIE4gPSBNWzBdLFxuICAgICAgICAgIEUgPSBNWzFdLFxuICAgICAgICAgIFAgPSAoMCwgbi51c2VTdGF0ZSkoXyhqLCB1KSksXG4gICAgICAgICAgdyA9IFBbMF0sXG4gICAgICAgICAgSSA9IFBbMV0sXG4gICAgICAgICAgRCA9ICgwLCBuLnVzZVN0YXRlKShqIDwgdSksXG4gICAgICAgICAgUyA9IERbMF0sXG4gICAgICAgICAgeCA9IERbMV0sXG4gICAgICAgICAgayA9ICgwLCBvLmRlZmF1bHQpKFwidXNhLWNoYXJhY3Rlci1jb3VudF9fZmllbGRcIiwgYSksXG4gICAgICAgICAgQSA9ICgwLCBvLmRlZmF1bHQpKFwidXNhLWhpbnRcIiwgXCJ1c2EtY2hhcmFjdGVyLWNvdW50X19tZXNzYWdlXCIsIHtcbiAgICAgICAgXCJ1c2EtY2hhcmFjdGVyLWNvdW50X19tZXNzYWdlLS1pbnZhbGlkXCI6ICFTXG4gICAgICB9KTtcblxuICAgICAgKDAsIG4udXNlRWZmZWN0KShmdW5jdGlvbiAoKSB7XG4gICAgICAgIEkoXyhOLCB1KSksIHgoTiA8PSB1KTtcbiAgICAgIH0sIFtOXSk7XG5cbiAgICAgIHZhciBULFxuICAgICAgICAgIEMgPSBmdW5jdGlvbiBDKGUsIHQpIHtcbiAgICAgICAgdmFyIHIgPSBTID8gXCJcIiA6IFwiVGhlIGNvbnRlbnQgaXMgdG9vIGxvbmcuXCI7XG4gICAgICAgIGUudGFyZ2V0LnNldEN1c3RvbVZhbGlkaXR5KHIpLCB0ICYmIHQoZSk7XG4gICAgICB9LFxuICAgICAgICAgIEwgPSBmdW5jdGlvbiBMKGUsIHQpIHtcbiAgICAgICAgdmFyIHIgPSBlLnRhcmdldC52YWx1ZTtcbiAgICAgICAgRShPKHZvaWQgMCA9PT0gciA/IFwiXCIgOiByKSksIHQgJiYgdChlKTtcbiAgICAgIH07XG5cbiAgICAgIGlmIChiKSB7XG4gICAgICAgIHZhciBGID0gaCxcbiAgICAgICAgICAgIFIgPSBGLm9uQmx1cixcbiAgICAgICAgICAgIFUgPSBGLm9uQ2hhbmdlLFxuICAgICAgICAgICAgVyA9IEYuaW5wdXRSZWYsXG4gICAgICAgICAgICBCID0gcyhGLCBbXCJvbkJsdXJcIiwgXCJvbkNoYW5nZVwiLCBcImlucHV0UmVmXCJdKTtcbiAgICAgICAgVCA9IG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KGwuVGV4dGFyZWEsIF9jKHtcbiAgICAgICAgICBpZDogdCxcbiAgICAgICAgICBuYW1lOiByLFxuICAgICAgICAgIGNsYXNzTmFtZTogayxcbiAgICAgICAgICBkZWZhdWx0VmFsdWU6IG0sXG4gICAgICAgICAgb25CbHVyOiBmdW5jdGlvbiBvbkJsdXIoZSkge1xuICAgICAgICAgICAgcmV0dXJuIEMoZSwgUik7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkNoYW5nZTogZnVuY3Rpb24gb25DaGFuZ2UoZSkge1xuICAgICAgICAgICAgcmV0dXJuIEwoZSwgVSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBpbnB1dFJlZjogV1xuICAgICAgICB9LCBCKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgeiA9IGgsXG4gICAgICAgICAgICBZID0gei5vbkJsdXIsXG4gICAgICAgICAgICBHID0gei5vbkNoYW5nZSxcbiAgICAgICAgICAgIFYgPSAoVyA9IHouaW5wdXRSZWYsIHoudHlwZSksXG4gICAgICAgICAgICBIID0gdm9pZCAwID09PSBWID8gXCJ0ZXh0XCIgOiBWLFxuICAgICAgICAgICAgUSA9IHMoeiwgW1wib25CbHVyXCIsIFwib25DaGFuZ2VcIiwgXCJpbnB1dFJlZlwiLCBcInR5cGVcIl0pO1xuICAgICAgICBUID0gbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoaS5UZXh0SW5wdXQsIF9jKHtcbiAgICAgICAgICBpZDogdCxcbiAgICAgICAgICB0eXBlOiBILFxuICAgICAgICAgIG5hbWU6IHIsXG4gICAgICAgICAgY2xhc3NOYW1lOiBrLFxuICAgICAgICAgIGRlZmF1bHRWYWx1ZTogbSxcbiAgICAgICAgICBvbkJsdXI6IGZ1bmN0aW9uIG9uQmx1cihlKSB7XG4gICAgICAgICAgICByZXR1cm4gQyhlLCBZKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbiBvbkNoYW5nZShlKSB7XG4gICAgICAgICAgICByZXR1cm4gTChlLCBHKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGlucHV0UmVmOiBXXG4gICAgICAgIH0sIFEpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KG4uZGVmYXVsdC5GcmFnbWVudCwgbnVsbCwgVCwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImNoYXJhY3RlckNvdW50TWVzc2FnZVwiLFxuICAgICAgICBpZDogdCArIFwiLWluZm9cIixcbiAgICAgICAgY2xhc3NOYW1lOiBBLFxuICAgICAgICBcImFyaWEtbGl2ZVwiOiBcInBvbGl0ZVwiXG4gICAgICB9LCB3KSk7XG4gICAgfTtcblxuICAgIHQuQ2hhcmFjdGVyQ291bnQgPSBwO1xuICAgIHZhciBtID0gcDtcbiAgICB0LmRlZmF1bHQgPSBtO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZWZhdWx0ID0gdC5DaGVja2JveCA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTE2ID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kxNiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSkge1xuICAgICAgdmFyIHQgPSBlLmlkLFxuICAgICAgICAgIHIgPSBlLm5hbWUsXG4gICAgICAgICAgbyA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHUgPSBlLmxhYmVsLFxuICAgICAgICAgIGMgPSBlLmlucHV0UmVmLFxuICAgICAgICAgIHMgPSBlLnRpbGUsXG4gICAgICAgICAgZCA9IGUubGFiZWxEZXNjcmlwdGlvbixcbiAgICAgICAgICBmID0gbChlLCBbXCJpZFwiLCBcIm5hbWVcIiwgXCJjbGFzc05hbWVcIiwgXCJsYWJlbFwiLCBcImlucHV0UmVmXCIsIFwidGlsZVwiLCBcImxhYmVsRGVzY3JpcHRpb25cIl0pLFxuICAgICAgICAgIHAgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1jaGVja2JveFwiLCBvKSxcbiAgICAgICAgICBtID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtY2hlY2tib3hfX2lucHV0XCIsIHtcbiAgICAgICAgXCJ1c2EtY2hlY2tib3hfX2lucHV0LS10aWxlXCI6IHNcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImNoZWNrYm94XCIsXG4gICAgICAgIGNsYXNzTmFtZTogcFxuICAgICAgfSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLCBfaTE2KHtcbiAgICAgICAgY2xhc3NOYW1lOiBtLFxuICAgICAgICBpZDogdCxcbiAgICAgICAgdHlwZTogXCJjaGVja2JveFwiLFxuICAgICAgICBuYW1lOiByLFxuICAgICAgICByZWY6IGNcbiAgICAgIH0sIGYpKSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtY2hlY2tib3hfX2xhYmVsXCIsXG4gICAgICAgIGh0bWxGb3I6IHRcbiAgICAgIH0sIHUsIGQgJiYgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1jaGVja2JveF9fbGFiZWwtZGVzY3JpcHRpb25cIlxuICAgICAgfSwgZCkpKTtcbiAgICB9O1xuXG4gICAgdC5DaGVja2JveCA9IHU7XG4gICAgdmFyIGMgPSB1O1xuICAgIHQuZGVmYXVsdCA9IGM7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LnVzZUNvbWJvQm94ID0gdC5BY3Rpb25UeXBlcyA9IHZvaWQgMDtcblxuICAgIHZhciBhLFxuICAgICAgICBuID0gcigwKSxcbiAgICAgICAgbyA9IHIoMTEpLFxuICAgICAgICBpID0gcig1MCksXG4gICAgICAgIF9sOCA9IGZ1bmN0aW9uIGwoKSB7XG4gICAgICByZXR1cm4gKF9sOCA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcblxuICAgIHQuQWN0aW9uVHlwZXMgPSBhLCBmdW5jdGlvbiAoZSkge1xuICAgICAgZVtlLlNFTEVDVF9PUFRJT04gPSAwXSA9IFwiU0VMRUNUX09QVElPTlwiLCBlW2UuQ0xFQVIgPSAxXSA9IFwiQ0xFQVJcIiwgZVtlLk9QRU5fTElTVCA9IDJdID0gXCJPUEVOX0xJU1RcIiwgZVtlLkNMT1NFX0xJU1QgPSAzXSA9IFwiQ0xPU0VfTElTVFwiLCBlW2UuRk9DVVNfT1BUSU9OID0gNF0gPSBcIkZPQ1VTX09QVElPTlwiLCBlW2UuVVBEQVRFX0ZJTFRFUiA9IDVdID0gXCJVUERBVEVfRklMVEVSXCIsIGVbZS5CTFVSID0gNl0gPSBcIkJMVVJcIjtcbiAgICB9KGEgfHwgKHQuQWN0aW9uVHlwZXMgPSBhID0ge30pKTtcblxuICAgIHQudXNlQ29tYm9Cb3ggPSBmdW5jdGlvbiAoZSwgdCwgciwgdSkge1xuICAgICAgcmV0dXJuICgwLCBuLnVzZVJlZHVjZXIpKGZ1bmN0aW9uIChlLCBuKSB7XG4gICAgICAgIHN3aXRjaCAobi50eXBlKSB7XG4gICAgICAgICAgY2FzZSBhLlNFTEVDVF9PUFRJT046XG4gICAgICAgICAgICByZXR1cm4gX2w4KF9sOCh7fSwgZSksIHtcbiAgICAgICAgICAgICAgaXNPcGVuOiAhMSxcbiAgICAgICAgICAgICAgc2VsZWN0ZWRPcHRpb246IG4ub3B0aW9uLFxuICAgICAgICAgICAgICBmb2N1c01vZGU6IG8uRm9jdXNNb2RlLklucHV0LFxuICAgICAgICAgICAgICBpbnB1dFZhbHVlOiBuLm9wdGlvbi5sYWJlbCxcbiAgICAgICAgICAgICAgZmlsdGVyZWRPcHRpb25zOiB0LFxuICAgICAgICAgICAgICBmb2N1c2VkT3B0aW9uOiBuLm9wdGlvblxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjYXNlIGEuVVBEQVRFX0ZJTFRFUjpcbiAgICAgICAgICAgIHZhciBjID0gKHAgPSBuLnZhbHVlLCBtID0gKDAsIGkuZ2VuZXJhdGVEeW5hbWljUmVnRXhwKSh1LmZpbHRlciwgcCwgdS5leHRyYXMpLCB5ID0gdC5maWx0ZXIoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG0udGVzdChlLmxhYmVsLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgICAgfSksIHIgPyB7XG4gICAgICAgICAgICAgIGNsb3Nlc3RNYXRjaDogeS5sZW5ndGggPiAwID8geVswXSA6IHRbMF0sXG4gICAgICAgICAgICAgIG9wdGlvbnNUb0Rpc3BsYXk6IHRcbiAgICAgICAgICAgIH0gOiB7XG4gICAgICAgICAgICAgIGNsb3Nlc3RNYXRjaDogeVswXSxcbiAgICAgICAgICAgICAgb3B0aW9uc1RvRGlzcGxheTogeVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgcyA9IGMuY2xvc2VzdE1hdGNoLFxuICAgICAgICAgICAgICAgIGQgPSBjLm9wdGlvbnNUb0Rpc3BsYXksXG4gICAgICAgICAgICAgICAgZiA9IF9sOChfbDgoe30sIGUpLCB7XG4gICAgICAgICAgICAgIGlzT3BlbjogITAsXG4gICAgICAgICAgICAgIGZpbHRlcmVkT3B0aW9uczogZCxcbiAgICAgICAgICAgICAgaW5wdXRWYWx1ZTogbi52YWx1ZVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiByIHx8ICFlLnNlbGVjdGVkT3B0aW9uID8gZi5mb2N1c2VkT3B0aW9uID0gcyA6IGUuc2VsZWN0ZWRPcHRpb24gJiYgKGYuZmlsdGVyZWRPcHRpb25zLmluY2x1ZGVzKGUuc2VsZWN0ZWRPcHRpb24pID8gZi5mb2N1c2VkT3B0aW9uID0gZS5zZWxlY3RlZE9wdGlvbiA6IGYuZm9jdXNlZE9wdGlvbiA9IHMpLCBmO1xuXG4gICAgICAgICAgY2FzZSBhLk9QRU5fTElTVDpcbiAgICAgICAgICAgIHJldHVybiBfbDgoX2w4KHt9LCBlKSwge1xuICAgICAgICAgICAgICBpc09wZW46ICEwLFxuICAgICAgICAgICAgICBmb2N1c01vZGU6IG8uRm9jdXNNb2RlLklucHV0LFxuICAgICAgICAgICAgICBmb2N1c2VkT3B0aW9uOiBlLnNlbGVjdGVkT3B0aW9uIHx8IGUuZm9jdXNlZE9wdGlvbiB8fCB0WzBdXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNhc2UgYS5DTE9TRV9MSVNUOlxuICAgICAgICAgICAgZiA9IF9sOChfbDgoe30sIGUpLCB7XG4gICAgICAgICAgICAgIGlzT3BlbjogITEsXG4gICAgICAgICAgICAgIGZvY3VzTW9kZTogby5Gb2N1c01vZGUuSW5wdXQsXG4gICAgICAgICAgICAgIGZvY3VzZWRPcHRpb246IHZvaWQgMFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gMCA9PT0gZS5maWx0ZXJlZE9wdGlvbnMubGVuZ3RoICYmIChmLmZpbHRlcmVkT3B0aW9ucyA9IHQsIGYuaW5wdXRWYWx1ZSA9IFwiXCIpLCBlLnNlbGVjdGVkT3B0aW9uICYmIChmLmlucHV0VmFsdWUgPSBlLnNlbGVjdGVkT3B0aW9uLmxhYmVsKSwgZjtcblxuICAgICAgICAgIGNhc2UgYS5GT0NVU19PUFRJT046XG4gICAgICAgICAgICByZXR1cm4gX2w4KF9sOCh7fSwgZSksIHtcbiAgICAgICAgICAgICAgaXNPcGVuOiAhMCxcbiAgICAgICAgICAgICAgZm9jdXNlZE9wdGlvbjogbi5vcHRpb24sXG4gICAgICAgICAgICAgIGZvY3VzTW9kZTogby5Gb2N1c01vZGUuSXRlbVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjYXNlIGEuQ0xFQVI6XG4gICAgICAgICAgICByZXR1cm4gX2w4KF9sOCh7fSwgZSksIHtcbiAgICAgICAgICAgICAgaW5wdXRWYWx1ZTogXCJcIixcbiAgICAgICAgICAgICAgaXNPcGVuOiAhMSxcbiAgICAgICAgICAgICAgZm9jdXNNb2RlOiBvLkZvY3VzTW9kZS5JbnB1dCxcbiAgICAgICAgICAgICAgc2VsZWN0ZWRPcHRpb246IHZvaWQgMCxcbiAgICAgICAgICAgICAgZmlsdGVyZWRPcHRpb25zOiB0LFxuICAgICAgICAgICAgICBmb2N1c2VkT3B0aW9uOiB0WzBdXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNhc2UgYS5CTFVSOlxuICAgICAgICAgICAgZiA9IF9sOChfbDgoe30sIGUpLCB7XG4gICAgICAgICAgICAgIGlzT3BlbjogITEsXG4gICAgICAgICAgICAgIGZvY3VzTW9kZTogby5Gb2N1c01vZGUuTm9uZSxcbiAgICAgICAgICAgICAgZmlsdGVyZWRPcHRpb25zOiB0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBlLnNlbGVjdGVkT3B0aW9uID8gKGYuaW5wdXRWYWx1ZSA9IGUuc2VsZWN0ZWRPcHRpb24ubGFiZWwsIGYuZm9jdXNlZE9wdGlvbiA9IGUuc2VsZWN0ZWRPcHRpb24pIDogKGYuaW5wdXRWYWx1ZSA9IFwiXCIsIGYuZm9jdXNlZE9wdGlvbiA9IHRbMF0pLCBmO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHAsIG0sIHk7XG4gICAgICB9LCBlKTtcbiAgICB9O1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5nZW5lcmF0ZUR5bmFtaWNSZWdFeHAgPSB2b2lkIDA7XG5cbiAgICB0LmdlbmVyYXRlRHluYW1pY1JlZ0V4cCA9IGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgICB2b2lkIDAgPT09IHQgJiYgKHQgPSBcIlwiKSwgdm9pZCAwID09PSByICYmIChyID0ge30pO1xuXG4gICAgICB2YXIgYSA9IGZ1bmN0aW9uIGEoZSkge1xuICAgICAgICByZXR1cm4gZS5yZXBsYWNlKC9bLVtcXF17fSgpKis/LixcXFxcXiR8I1xcc10vZywgXCJcXFxcJCZcIik7XG4gICAgICB9LFxuICAgICAgICAgIG4gPSBlLnJlcGxhY2UoL3t7KC4qPyl9fS9nLCBmdW5jdGlvbiAoZSwgbikge1xuICAgICAgICB2YXIgbyA9IG4udHJpbSgpLFxuICAgICAgICAgICAgaSA9IHJbb107XG5cbiAgICAgICAgaWYgKFwicXVlcnlcIiAhPT0gbyAmJiBpKSB7XG4gICAgICAgICAgdmFyIGwgPSBuZXcgUmVnRXhwKGksIFwiaVwiKSxcbiAgICAgICAgICAgICAgdSA9IHQubWF0Y2gobCk7XG4gICAgICAgICAgcmV0dXJuIHUgPyBhKHVbMV0pIDogXCJcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhKHQpO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBuID0gXCJeKD86XCIgKyBuICsgXCIpJFwiLCBuZXcgUmVnRXhwKG4sIFwiaVwiKTtcbiAgICB9O1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZWZhdWx0ID0gdC5EYXRlSW5wdXQgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSB1KHIoMCkpLFxuICAgICAgICBuID0gdShyKDEpKSxcbiAgICAgICAgbyA9IHIoNyksXG4gICAgICAgIGkgPSByKDUpLFxuICAgICAgICBsID0gcig4KTtcblxuICAgIGZ1bmN0aW9uIHUoZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2MyID0gZnVuY3Rpb24gYygpIHtcbiAgICAgIHJldHVybiAoX2MyID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBzID0gZnVuY3Rpb24gcyhlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9LFxuICAgICAgICBkID0gZnVuY3Rpb24gZChlKSB7XG4gICAgICB2YXIgdCA9IGUuaWQsXG4gICAgICAgICAgciA9IGUubmFtZSxcbiAgICAgICAgICB1ID0gZS5sYWJlbCxcbiAgICAgICAgICBkID0gZS51bml0LFxuICAgICAgICAgIGYgPSBlLm1heExlbmd0aCxcbiAgICAgICAgICBwID0gZS5taW5MZW5ndGgsXG4gICAgICAgICAgbSA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHkgPSBzKGUsIFtcImlkXCIsIFwibmFtZVwiLCBcImxhYmVsXCIsIFwidW5pdFwiLCBcIm1heExlbmd0aFwiLCBcIm1pbkxlbmd0aFwiLCBcImNsYXNzTmFtZVwiXSksXG4gICAgICAgICAgYiA9ICgwLCBuLmRlZmF1bHQpKHtcbiAgICAgICAgXCJ1c2EtZm9ybS1ncm91cC0tbW9udGhcIjogXCJtb250aFwiID09IGQsXG4gICAgICAgIFwidXNhLWZvcm0tZ3JvdXAtLWRheVwiOiBcImRheVwiID09IGQsXG4gICAgICAgIFwidXNhLWZvcm0tZ3JvdXAtLXllYXJcIjogXCJ5ZWFyXCIgPT0gZFxuICAgICAgfSksXG4gICAgICAgICAgdiA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLWlucHV0LS1pbmxpbmVcIiwgbSk7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQobC5Gb3JtR3JvdXAsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBiXG4gICAgICB9LCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChpLkxhYmVsLCB7XG4gICAgICAgIGh0bWxGb3I6IHRcbiAgICAgIH0sIHUpLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChvLlRleHRJbnB1dCwgX2MyKHt9LCB5LCB7XG4gICAgICAgIGNsYXNzTmFtZTogdixcbiAgICAgICAgaWQ6IHQsXG4gICAgICAgIG5hbWU6IHIsXG4gICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICBtYXhMZW5ndGg6IGYsXG4gICAgICAgIG1pbkxlbmd0aDogcCxcbiAgICAgICAgcGF0dGVybjogXCJbMC05XSpcIixcbiAgICAgICAgaW5wdXRNb2RlOiBcIm51bWVyaWNcIlxuICAgICAgfSkpKTtcbiAgICB9O1xuXG4gICAgdC5EYXRlSW5wdXQgPSBkO1xuICAgIHZhciBmID0gZDtcbiAgICB0LmRlZmF1bHQgPSBmO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZWZhdWx0ID0gdC5EYXRlSW5wdXRHcm91cCA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTE3ID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kxNyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSkge1xuICAgICAgdmFyIHQgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIHIgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBvID0gbChlLCBbXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiXSksXG4gICAgICAgICAgdSA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLW1lbW9yYWJsZS1kYXRlXCIsIHIpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9pMTcoe1xuICAgICAgICBjbGFzc05hbWU6IHVcbiAgICAgIH0sIG8sIHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImRhdGVJbnB1dEdyb3VwXCJcbiAgICAgIH0pLCB0KTtcbiAgICB9O1xuXG4gICAgdC5EYXRlSW5wdXRHcm91cCA9IHU7XG4gICAgdmFyIGMgPSB1O1xuICAgIHQuZGVmYXVsdCA9IGM7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LkNhbGVuZGFyID0gdm9pZCAwO1xuXG4gICAgdmFyIGEgPSBmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgaWYgKCF0ICYmIGUgJiYgZS5fX2VzTW9kdWxlKSByZXR1cm4gZTtcbiAgICAgIGlmIChudWxsID09PSBlIHx8IFwib2JqZWN0XCIgIT0gdHlwZW9mIGUgJiYgXCJmdW5jdGlvblwiICE9IHR5cGVvZiBlKSByZXR1cm4ge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgICAgdmFyIHIgPSBzKHQpO1xuICAgICAgaWYgKHIgJiYgci5oYXMoZSkpIHJldHVybiByLmdldChlKTtcbiAgICAgIHZhciBhID0ge30sXG4gICAgICAgICAgbiA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4gICAgICBmb3IgKHZhciBvIGluIGUpIHtcbiAgICAgICAgaWYgKFwiZGVmYXVsdFwiICE9PSBvICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBvKSkge1xuICAgICAgICAgIHZhciBpID0gbiA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgbykgOiBudWxsO1xuICAgICAgICAgIGkgJiYgKGkuZ2V0IHx8IGkuc2V0KSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCBvLCBpKSA6IGFbb10gPSBlW29dO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGEuZGVmYXVsdCA9IGUsIHIgJiYgci5zZXQoZSwgYSk7XG4gICAgICByZXR1cm4gYTtcbiAgICB9KHIoMCkpLFxuICAgICAgICBuID0gcigzKSxcbiAgICAgICAgbyA9IHIoNTQpLFxuICAgICAgICBpID0gcig1NSksXG4gICAgICAgIGwgPSByKDU2KSxcbiAgICAgICAgdSA9IHIoMTIpLFxuICAgICAgICBjID0gcig5KTtcblxuICAgIGZ1bmN0aW9uIHMoZSkge1xuICAgICAgaWYgKFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgV2Vha01hcCkgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgdCA9IG5ldyBXZWFrTWFwKCksXG4gICAgICAgICAgciA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICByZXR1cm4gKHMgPSBmdW5jdGlvbiBzKGUpIHtcbiAgICAgICAgcmV0dXJuIGUgPyByIDogdDtcbiAgICAgIH0pKGUpO1xuICAgIH1cblxuICAgIHZhciBkID0gXCJEQVRFX1BJQ0tFUlwiLFxuICAgICAgICBmID0gXCJNT05USF9QSUNLRVJcIixcbiAgICAgICAgcCA9IFwiWUVBUl9QSUNLRVJcIixcbiAgICAgICAgbSA9IGZ1bmN0aW9uIG0oZSkge1xuICAgICAgdmFyIHQgPSBlLmRhdGUsXG4gICAgICAgICAgciA9IGUuc2VsZWN0ZWREYXRlLFxuICAgICAgICAgIHMgPSBlLmhhbmRsZVNlbGVjdERhdGUsXG4gICAgICAgICAgbSA9IGUubWluRGF0ZSxcbiAgICAgICAgICB5ID0gZS5tYXhEYXRlLFxuICAgICAgICAgIGIgPSBlLnJhbmdlRGF0ZSxcbiAgICAgICAgICB2ID0gZS5zZXRTdGF0dXNlcyxcbiAgICAgICAgICBPID0gZS5mb2N1c01vZGUsXG4gICAgICAgICAgZyA9IGUuaTE4bixcbiAgICAgICAgICBfID0gdm9pZCAwID09PSBnID8gYy5FTl9VUyA6IGcsXG4gICAgICAgICAgaCA9ICgwLCBhLnVzZVJlZikobnVsbCksXG4gICAgICAgICAgaiA9ICgwLCBhLnVzZVJlZikobnVsbCksXG4gICAgICAgICAgTSA9ICgwLCBhLnVzZVJlZikobnVsbCksXG4gICAgICAgICAgTiA9ICgwLCBhLnVzZVJlZikobnVsbCksXG4gICAgICAgICAgRSA9ICgwLCBhLnVzZVJlZikobnVsbCksXG4gICAgICAgICAgUCA9ICgwLCBhLnVzZVJlZikobnVsbCksXG4gICAgICAgICAgdyA9ICgwLCBhLnVzZVJlZikobnVsbCksXG4gICAgICAgICAgSSA9ICgwLCBhLnVzZVJlZikobnVsbCksXG4gICAgICAgICAgRCA9ICgwLCBhLnVzZVN0YXRlKSh0IHx8ICgwLCBuLnRvZGF5KSgpKSxcbiAgICAgICAgICBTID0gRFswXSxcbiAgICAgICAgICB4ID0gRFsxXSxcbiAgICAgICAgICBrID0gKDAsIGEudXNlU3RhdGUpKGQpLFxuICAgICAgICAgIEEgPSBrWzBdLFxuICAgICAgICAgIFQgPSBrWzFdLFxuICAgICAgICAgIEMgPSAoMCwgYS51c2VTdGF0ZSkoW251bGwsIG51bGxdKSxcbiAgICAgICAgICBMID0gQ1swXSxcbiAgICAgICAgICBGID0gQ1sxXSxcbiAgICAgICAgICBSID0gITAsXG4gICAgICAgICAgVSA9ICgwLCBuLmFkZERheXMpKFMsIDApLFxuICAgICAgICAgIFcgPSBTLmdldE1vbnRoKCksXG4gICAgICAgICAgQiA9IFMuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgICB6ID0gXy5tb250aHNbcGFyc2VJbnQoXCJcIiArIFcpXSxcbiAgICAgICAgICBZID0gXy5kYXlzT2ZXZWVrU2hvcnQsXG4gICAgICAgICAgRyA9IF8uZGF5c09mV2VlayxcbiAgICAgICAgICBWID0gXy5iYWNrT25lWWVhcixcbiAgICAgICAgICBIID0gXy5iYWNrT25lTW9udGgsXG4gICAgICAgICAgUSA9IHogKyBcIi4gXCIgKyBfLmNsaWNrVG9TZWxlY3RNb250aCxcbiAgICAgICAgICBLID0gQiArIFwiLiBcIiArIF8uY2xpY2tUb1NlbGVjdFllYXIsXG4gICAgICAgICAgWiA9IF8uZm9yd2FyZE9uZU1vbnRoLFxuICAgICAgICAgIFggPSBfLmZvcndhcmRPbmVZZWFyO1xuXG4gICAgICBpZiAoKDAsIGEudXNlRWZmZWN0KShmdW5jdGlvbiAoKSB7XG4gICAgICAgIFIgPSAhMTtcbiAgICAgIH0sIFtdKSwgKDAsIGEudXNlRWZmZWN0KShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHQgJiYgQSA9PT0gZCAmJiB4KHQpO1xuICAgICAgfSwgW3RdKSwgKDAsIGEudXNlRWZmZWN0KShmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChPICE9PSB1LkZvY3VzTW9kZS5JbnB1dCkge1xuICAgICAgICAgIHZhciBlID0gTFswXSxcbiAgICAgICAgICAgICAgdCA9IExbMV07XG4gICAgICAgICAgaWYgKGUgJiYgdCkgZS5kaXNhYmxlZCA/IHQuZm9jdXMoKSA6IGUuZm9jdXMoKSwgRihbbnVsbCwgbnVsbF0pO2Vsc2Uge1xuICAgICAgICAgICAgdmFyIGEgPSBJLmN1cnJlbnQgJiYgSS5jdXJyZW50LnF1ZXJ5U2VsZWN0b3IoXCIudXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9fZGF0ZS0tZm9jdXNlZFwiKTtcbiAgICAgICAgICAgIGEgJiYgYS5mb2N1cygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChSKSB7XG4gICAgICAgICAgdmFyIG8gPSBbeiArIFwiIFwiICsgQl07XG5cbiAgICAgICAgICBpZiAociAmJiAoMCwgbi5pc1NhbWVEYXkpKFUsIHIpKSB7XG4gICAgICAgICAgICB2YXIgaSA9IF8uc2VsZWN0ZWREYXRlO1xuICAgICAgICAgICAgby51bnNoaWZ0KGkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHYobyk7XG4gICAgICAgIH1cbiAgICAgIH0sIFtTXSksIEEgPT09IGYpIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChpLk1vbnRoUGlja2VyLCB7XG4gICAgICAgIGRhdGU6IFMsXG4gICAgICAgIG1pbkRhdGU6IG0sXG4gICAgICAgIG1heERhdGU6IHksXG4gICAgICAgIGhhbmRsZVNlbGVjdE1vbnRoOiBmdW5jdGlvbiBoYW5kbGVTZWxlY3RNb250aChlKSB7XG4gICAgICAgICAgdmFyIHQgPSAoMCwgbi5zZXRNb250aCkoUywgZSk7XG4gICAgICAgICAgdCA9ICgwLCBuLmtlZXBEYXRlQmV0d2Vlbk1pbkFuZE1heCkodCwgbSwgeSksIHgodCksIFQoZCk7XG4gICAgICAgIH0sXG4gICAgICAgIGkxOG46IF9cbiAgICAgIH0pO1xuICAgICAgaWYgKEEgPT09IHApIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChsLlllYXJQaWNrZXIsIHtcbiAgICAgICAgZGF0ZTogUyxcbiAgICAgICAgbWluRGF0ZTogbSxcbiAgICAgICAgbWF4RGF0ZTogeSxcbiAgICAgICAgaGFuZGxlU2VsZWN0WWVhcjogZnVuY3Rpb24gaGFuZGxlU2VsZWN0WWVhcihlKSB7XG4gICAgICAgICAgdmFyIHQgPSAoMCwgbi5zZXRZZWFyKShTLCBlKTtcbiAgICAgICAgICB0ID0gKDAsIG4ua2VlcERhdGVCZXR3ZWVuTWluQW5kTWF4KSh0LCBtLCB5KSwgeCh0KSwgVChkKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0U3RhdHVzZXM6IHZcbiAgICAgIH0pO1xuXG4gICAgICBmb3IgKHZhciBKID0gKDAsIG4uc3ViTW9udGhzKShTLCAxKSwgcSA9ICgwLCBuLmFkZE1vbnRocykoUywgMSksICQgPSAoMCwgbi5zdGFydE9mTW9udGgpKFMpLCBlZSA9ICgwLCBuLmlzU2FtZU1vbnRoKShTLCBtKSwgdGUgPSB5ICYmICgwLCBuLmlzU2FtZU1vbnRoKShTLCB5KSwgcmUgPSByIHx8IFMsIGFlID0gYiAmJiAoMCwgbi5taW4pKHJlLCBiKSwgbmUgPSBiICYmICgwLCBuLm1heCkocmUsIGIpLCBvZSA9IGFlICYmICgwLCBuLmFkZERheXMpKGFlLCAxKSwgaWUgPSBuZSAmJiAoMCwgbi5zdWJEYXlzKShuZSwgMSksIGxlID0gZnVuY3Rpb24gbGUoZSkge1xuICAgICAgICB2YXIgdDtcblxuICAgICAgICBzd2l0Y2ggKGUua2V5KSB7XG4gICAgICAgICAgY2FzZSBcIkFycm93VXBcIjpcbiAgICAgICAgICBjYXNlIFwiVXBcIjpcbiAgICAgICAgICAgIHQgPSAoMCwgbi5zdWJXZWVrcykoUywgMSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJBcnJvd0Rvd25cIjpcbiAgICAgICAgICBjYXNlIFwiRG93blwiOlxuICAgICAgICAgICAgdCA9ICgwLCBuLmFkZFdlZWtzKShTLCAxKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcIkFycm93TGVmdFwiOlxuICAgICAgICAgIGNhc2UgXCJMZWZ0XCI6XG4gICAgICAgICAgICB0ID0gKDAsIG4uc3ViRGF5cykoUywgMSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJBcnJvd1JpZ2h0XCI6XG4gICAgICAgICAgY2FzZSBcIlJpZ2h0XCI6XG4gICAgICAgICAgICB0ID0gKDAsIG4uYWRkRGF5cykoUywgMSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJIb21lXCI6XG4gICAgICAgICAgICB0ID0gKDAsIG4uc3RhcnRPZldlZWspKFMpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwiRW5kXCI6XG4gICAgICAgICAgICB0ID0gKDAsIG4uZW5kT2ZXZWVrKShTKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcIlBhZ2VEb3duXCI6XG4gICAgICAgICAgICB0ID0gZS5zaGlmdEtleSA/ICgwLCBuLmFkZFllYXJzKShTLCAxKSA6ICgwLCBuLmFkZE1vbnRocykoUywgMSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJQYWdlVXBcIjpcbiAgICAgICAgICAgIHQgPSBlLnNoaWZ0S2V5ID8gKDAsIG4uc3ViWWVhcnMpKFMsIDEpIDogKDAsIG4uc3ViTW9udGhzKShTLCAxKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2b2lkIDAgIT09IHQpIHtcbiAgICAgICAgICB2YXIgciA9ICgwLCBuLmtlZXBEYXRlQmV0d2Vlbk1pbkFuZE1heCkodCwgbSwgeSk7XG4gICAgICAgICAgKDAsIG4uaXNTYW1lRGF5KShTLCByKSB8fCB4KHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfSwgdWUgPSBmdW5jdGlvbiB1ZShlKSB7XG4gICAgICAgIGUgIT09IFMgJiYgeChlKTtcbiAgICAgIH0sIGNlID0gW10sIHNlID0gKDAsIG4uc3RhcnRPZldlZWspKCQpOyBjZS5sZW5ndGggPCAyOCB8fCBzZS5nZXRNb250aCgpID09PSBXIHx8IGNlLmxlbmd0aCAlIDcgIT0gMDspIHtcbiAgICAgICAgdmFyIGRlID0gKDAsIG4uaXNTYW1lRGF5KShzZSwgVSk7XG4gICAgICAgIGNlLnB1c2goYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoby5EYXksIHtcbiAgICAgICAgICBkYXRlOiBzZSxcbiAgICAgICAgICBvbkNsaWNrOiBzLFxuICAgICAgICAgIG9uS2V5RG93bjogbGUsXG4gICAgICAgICAgb25Nb3VzZU1vdmU6IHVlLFxuICAgICAgICAgIHJlZjogZGUgPyB3IDogbnVsbCxcbiAgICAgICAgICBpc0Rpc2FibGVkOiAhKDAsIG4uaXNEYXRlV2l0aGluTWluQW5kTWF4KShzZSwgbSwgeSksXG4gICAgICAgICAgaXNTZWxlY3RlZDogciAmJiAoMCwgbi5pc1NhbWVEYXkpKHNlLCByKSxcbiAgICAgICAgICBpc0ZvY3VzZWQ6IGRlLFxuICAgICAgICAgIGlzUHJldk1vbnRoOiAoMCwgbi5pc1NhbWVNb250aCkoc2UsIEopLFxuICAgICAgICAgIGlzRm9jdXNlZE1vbnRoOiAoMCwgbi5pc1NhbWVNb250aCkoc2UsIFUpLFxuICAgICAgICAgIGlzTmV4dE1vbnRoOiAoMCwgbi5pc1NhbWVNb250aCkoc2UsIHEpLFxuICAgICAgICAgIGlzVG9kYXk6ICgwLCBuLmlzU2FtZURheSkoc2UsICgwLCBuLnRvZGF5KSgpKSxcbiAgICAgICAgICBpc1JhbmdlRGF0ZTogYiAmJiAoMCwgbi5pc1NhbWVEYXkpKHNlLCBiKSxcbiAgICAgICAgICBpc1JhbmdlU3RhcnQ6IGFlICYmICgwLCBuLmlzU2FtZURheSkoc2UsIGFlKSxcbiAgICAgICAgICBpc1JhbmdlRW5kOiBuZSAmJiAoMCwgbi5pc1NhbWVEYXkpKHNlLCBuZSksXG4gICAgICAgICAgaXNXaXRoaW5SYW5nZTogb2UgJiYgaWUgJiYgKDAsIG4uaXNEYXRlV2l0aGluTWluQW5kTWF4KShzZSwgb2UsIGllKSxcbiAgICAgICAgICBpMThuOiBfXG4gICAgICAgIH0pKSwgc2UgPSAoMCwgbi5hZGREYXlzKShzZSwgMSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIHRhYkluZGV4OiAtMSxcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX2RhdGUtcGlja2VyXCIsXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJjYWxlbmRhci1kYXRlLXBpY2tlclwiLFxuICAgICAgICByZWY6IEksXG4gICAgICAgIG9uS2V5RG93bjogZnVuY3Rpb24gb25LZXlEb3duKGUpIHtcbiAgICAgICAgICAoMCwgbi5oYW5kbGVUYWJLZXkpKGUsIFtudWxsID09IGggPyB2b2lkIDAgOiBoLmN1cnJlbnQsIG51bGwgPT0gaiA/IHZvaWQgMCA6IGouY3VycmVudCwgbnVsbCA9PSBFID8gdm9pZCAwIDogRS5jdXJyZW50LCBudWxsID09IFAgPyB2b2lkIDAgOiBQLmN1cnJlbnQsIG51bGwgPT0gTSA/IHZvaWQgMCA6IE0uY3VycmVudCwgbnVsbCA9PSBOID8gdm9pZCAwIDogTi5jdXJyZW50LCBudWxsID09IHcgPyB2b2lkIDAgOiB3LmN1cnJlbnRdKTtcbiAgICAgICAgfVxuICAgICAgfSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9fcm93XCJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX2NlbGwgdXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9fY2VsbC0tY2VudGVyLWl0ZW1zXCJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICAgICAgdHlwZTogXCJidXR0b25cIixcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcInByZXZpb3VzLXllYXJcIixcbiAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcbiAgICAgICAgICB2YXIgZSA9ICgwLCBuLnN1YlllYXJzKShTLCAxKTtcbiAgICAgICAgICBlID0gKDAsIG4ua2VlcERhdGVCZXR3ZWVuTWluQW5kTWF4KShlLCBtLCB5KSwgeChlKSwgRihbaC5jdXJyZW50LCBJLmN1cnJlbnRdKTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVmOiBoLFxuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9fcHJldmlvdXMteWVhclwiLFxuICAgICAgICBcImFyaWEtbGFiZWxcIjogVixcbiAgICAgICAgZGlzYWJsZWQ6IGVlXG4gICAgICB9LCBcIsKgXCIpKSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9fY2VsbCB1c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX19jZWxsLS1jZW50ZXItaXRlbXNcIlxuICAgICAgfSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgICAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwicHJldmlvdXMtbW9udGhcIixcbiAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcbiAgICAgICAgICB2YXIgZSA9ICgwLCBuLnN1Yk1vbnRocykoUywgMSk7XG4gICAgICAgICAgZSA9ICgwLCBuLmtlZXBEYXRlQmV0d2Vlbk1pbkFuZE1heCkoZSwgbSwgeSksIHgoZSksIEYoW2ouY3VycmVudCwgSS5jdXJyZW50XSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlZjogaixcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX3ByZXZpb3VzLW1vbnRoXCIsXG4gICAgICAgIFwiYXJpYS1sYWJlbFwiOiBILFxuICAgICAgICBkaXNhYmxlZDogZWVcbiAgICAgIH0sIFwiwqBcIikpLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX19jZWxsIHVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX21vbnRoLWxhYmVsXCJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICAgICAgdHlwZTogXCJidXR0b25cIixcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcInNlbGVjdC1tb250aFwiLFxuICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKCkge1xuICAgICAgICAgIFQoZik7XG4gICAgICAgICAgdmFyIGUgPSBfLnNlbGVjdEFNb250aDtcbiAgICAgICAgICB2KFtlXSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlZjogRSxcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX21vbnRoLXNlbGVjdGlvblwiLFxuICAgICAgICBcImFyaWEtbGFiZWxcIjogUVxuICAgICAgfSwgeiksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICAgICAgdHlwZTogXCJidXR0b25cIixcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcInNlbGVjdC15ZWFyXCIsXG4gICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG4gICAgICAgICAgVChwKTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVmOiBQLFxuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9feWVhci1zZWxlY3Rpb25cIixcbiAgICAgICAgXCJhcmlhLWxhYmVsXCI6IEtcbiAgICAgIH0sIEIpKSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9fY2VsbCB1c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX19jZWxsLS1jZW50ZXItaXRlbXNcIlxuICAgICAgfSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgICAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwibmV4dC1tb250aFwiLFxuICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKCkge1xuICAgICAgICAgIHZhciBlID0gKDAsIG4uYWRkTW9udGhzKShTLCAxKTtcbiAgICAgICAgICBlID0gKDAsIG4ua2VlcERhdGVCZXR3ZWVuTWluQW5kTWF4KShlLCBtLCB5KSwgeChlKSwgRihbTS5jdXJyZW50LCBJLmN1cnJlbnRdKTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVmOiBNLFxuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9fbmV4dC1tb250aFwiLFxuICAgICAgICBcImFyaWEtbGFiZWxcIjogWixcbiAgICAgICAgZGlzYWJsZWQ6IHRlXG4gICAgICB9LCBcIsKgXCIpKSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9fY2VsbCB1c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX19jZWxsLS1jZW50ZXItaXRlbXNcIlxuICAgICAgfSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgICAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwibmV4dC15ZWFyXCIsXG4gICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG4gICAgICAgICAgdmFyIGUgPSAoMCwgbi5hZGRZZWFycykoUywgMSk7XG4gICAgICAgICAgZSA9ICgwLCBuLmtlZXBEYXRlQmV0d2Vlbk1pbkFuZE1heCkoZSwgbSwgeSksIHgoZSksIEYoW04uY3VycmVudCwgSS5jdXJyZW50XSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlZjogTixcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX25leHQteWVhclwiLFxuICAgICAgICBcImFyaWEtbGFiZWxcIjogWCxcbiAgICAgICAgZGlzYWJsZWQ6IHRlXG4gICAgICB9LCBcIsKgXCIpKSksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwidGFibGVcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9fdGFibGVcIixcbiAgICAgICAgcm9sZTogXCJwcmVzZW50YXRpb25cIlxuICAgICAgfSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJ0aGVhZFwiLCBudWxsLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInRyXCIsIG51bGwsIFkubWFwKGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInRoXCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IFwidXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9fZGF5LW9mLXdlZWtcIixcbiAgICAgICAgICBzY29wZTogXCJjb2xcIixcbiAgICAgICAgICBcImFyaWEtbGFiZWxcIjogR1twYXJzZUludChcIlwiICsgdCldLFxuICAgICAgICAgIGtleTogXCJkYXktb2Ytd2Vlay1cIiArIGUgKyBcIi1cIiArIHRcbiAgICAgICAgfSwgZSk7XG4gICAgICB9KSkpLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInRib2R5XCIsIG51bGwsICgwLCBuLmxpc3RUb1RhYmxlKShjZSwgNykpKSk7XG4gICAgfTtcblxuICAgIHQuQ2FsZW5kYXIgPSBtLCBtLmRpc3BsYXlOYW1lID0gXCJDYWxlbmRhclwiO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5EYXkgPSB2b2lkIDA7XG5cbiAgICB2YXIgYSxcbiAgICAgICAgbiA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICBpZiAoIXQgJiYgZSAmJiBlLl9fZXNNb2R1bGUpIHJldHVybiBlO1xuICAgICAgaWYgKG51bGwgPT09IGUgfHwgXCJvYmplY3RcIiAhPSB0eXBlb2YgZSAmJiBcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIGUpIHJldHVybiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgICB2YXIgciA9IHUodCk7XG4gICAgICBpZiAociAmJiByLmhhcyhlKSkgcmV0dXJuIHIuZ2V0KGUpO1xuICAgICAgdmFyIGEgPSB7fSxcbiAgICAgICAgICBuID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbiAgICAgIGZvciAodmFyIG8gaW4gZSkge1xuICAgICAgICBpZiAoXCJkZWZhdWx0XCIgIT09IG8gJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIG8pKSB7XG4gICAgICAgICAgdmFyIGkgPSBuID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCBvKSA6IG51bGw7XG4gICAgICAgICAgaSAmJiAoaS5nZXQgfHwgaS5zZXQpID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsIG8sIGkpIDogYVtvXSA9IGVbb107XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYS5kZWZhdWx0ID0gZSwgciAmJiByLnNldChlLCBhKTtcbiAgICAgIHJldHVybiBhO1xuICAgIH0ocigwKSksXG4gICAgICAgIG8gPSAoYSA9IHIoMSkpICYmIGEuX19lc01vZHVsZSA/IGEgOiB7XG4gICAgICBkZWZhdWx0OiBhXG4gICAgfSxcbiAgICAgICAgaSA9IHIoMyksXG4gICAgICAgIGwgPSByKDkpO1xuXG4gICAgZnVuY3Rpb24gdShlKSB7XG4gICAgICBpZiAoXCJmdW5jdGlvblwiICE9IHR5cGVvZiBXZWFrTWFwKSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciB0ID0gbmV3IFdlYWtNYXAoKSxcbiAgICAgICAgICByID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgIHJldHVybiAodSA9IGZ1bmN0aW9uIHUoZSkge1xuICAgICAgICByZXR1cm4gZSA/IHIgOiB0O1xuICAgICAgfSkoZSk7XG4gICAgfVxuXG4gICAgdmFyIGMgPSAoMCwgbi5mb3J3YXJkUmVmKShmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgdmFyIHIgPSBlLmRhdGUsXG4gICAgICAgICAgYSA9IGUub25DbGljayxcbiAgICAgICAgICB1ID0gZS5vbktleURvd24sXG4gICAgICAgICAgYyA9IGUub25Nb3VzZU1vdmUsXG4gICAgICAgICAgcyA9IGUuaXNEaXNhYmxlZCxcbiAgICAgICAgICBkID0gdm9pZCAwICE9PSBzICYmIHMsXG4gICAgICAgICAgZiA9IGUuaXNTZWxlY3RlZCxcbiAgICAgICAgICBwID0gdm9pZCAwICE9PSBmICYmIGYsXG4gICAgICAgICAgbSA9IGUuaXNGb2N1c2VkLFxuICAgICAgICAgIHkgPSB2b2lkIDAgIT09IG0gJiYgbSxcbiAgICAgICAgICBiID0gZS5pc1ByZXZNb250aCxcbiAgICAgICAgICB2ID0gdm9pZCAwICE9PSBiICYmIGIsXG4gICAgICAgICAgTyA9IGUuaXNGb2N1c2VkTW9udGgsXG4gICAgICAgICAgZyA9IHZvaWQgMCAhPT0gTyAmJiBPLFxuICAgICAgICAgIF8gPSBlLmlzTmV4dE1vbnRoLFxuICAgICAgICAgIGggPSB2b2lkIDAgIT09IF8gJiYgXyxcbiAgICAgICAgICBqID0gZS5pc1RvZGF5LFxuICAgICAgICAgIE0gPSB2b2lkIDAgIT09IGogJiYgaixcbiAgICAgICAgICBOID0gZS5pc1JhbmdlRGF0ZSxcbiAgICAgICAgICBFID0gdm9pZCAwICE9PSBOICYmIE4sXG4gICAgICAgICAgUCA9IGUuaXNSYW5nZVN0YXJ0LFxuICAgICAgICAgIHcgPSB2b2lkIDAgIT09IFAgJiYgUCxcbiAgICAgICAgICBJID0gZS5pc1JhbmdlRW5kLFxuICAgICAgICAgIEQgPSB2b2lkIDAgIT09IEkgJiYgSSxcbiAgICAgICAgICBTID0gZS5pc1dpdGhpblJhbmdlLFxuICAgICAgICAgIHggPSB2b2lkIDAgIT09IFMgJiYgUyxcbiAgICAgICAgICBrID0gZS5pMThuLFxuICAgICAgICAgIEEgPSB2b2lkIDAgPT09IGsgPyBsLkVOX1VTIDogayxcbiAgICAgICAgICBUID0gci5nZXREYXRlKCksXG4gICAgICAgICAgQyA9IHIuZ2V0TW9udGgoKSxcbiAgICAgICAgICBMID0gci5nZXRGdWxsWWVhcigpLFxuICAgICAgICAgIEYgPSByLmdldERheSgpLFxuICAgICAgICAgIFIgPSAoMCwgaS5mb3JtYXREYXRlKShyKSxcbiAgICAgICAgICBVID0geSA/IDAgOiAtMSxcbiAgICAgICAgICBXID0gKDAsIG8uZGVmYXVsdCkoXCJ1c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX19kYXRlXCIsIHtcbiAgICAgICAgXCJ1c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX19kYXRlLS1wcmV2aW91cy1tb250aFwiOiB2LFxuICAgICAgICBcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX2RhdGUtLWN1cnJlbnQtbW9udGhcIjogZyxcbiAgICAgICAgXCJ1c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX19kYXRlLS1uZXh0LW1vbnRoXCI6IGgsXG4gICAgICAgIFwidXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9fZGF0ZS0tc2VsZWN0ZWRcIjogcCxcbiAgICAgICAgXCJ1c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX19kYXRlLS10b2RheVwiOiBNLFxuICAgICAgICBcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX2RhdGUtLWZvY3VzZWRcIjogeSxcbiAgICAgICAgXCJ1c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX19kYXRlLS1yYW5nZS1kYXRlXCI6IEUsXG4gICAgICAgIFwidXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9fZGF0ZS0tcmFuZ2UtZGF0ZS1zdGFydFwiOiB3LFxuICAgICAgICBcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX2RhdGUtLXJhbmdlLWRhdGUtZW5kXCI6IEQsXG4gICAgICAgIFwidXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9fZGF0ZS0td2l0aGluLXJhbmdlXCI6IHhcbiAgICAgIH0pLFxuICAgICAgICAgIEIgPSBBLm1vbnRoc1twYXJzZUludChcIlwiICsgQyldLFxuICAgICAgICAgIHogPSBBLmRheXNPZldlZWtbcGFyc2VJbnQoXCJcIiArIEYpXTtcbiAgICAgIHJldHVybiBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJzZWxlY3QtZGF0ZVwiLFxuICAgICAgICByZWY6IHQsXG4gICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG4gICAgICAgICAgYShSKTtcbiAgICAgICAgfSxcbiAgICAgICAgdGFiSW5kZXg6IFUsXG4gICAgICAgIGNsYXNzTmFtZTogVyxcbiAgICAgICAgXCJkYXRhLWRheVwiOiBULFxuICAgICAgICBcImRhdGEtbW9udGhcIjogQyArIDEsXG4gICAgICAgIFwiZGF0YS15ZWFyXCI6IEwsXG4gICAgICAgIFwiZGF0YS12YWx1ZVwiOiBSLFxuICAgICAgICBcImFyaWEtbGFiZWxcIjogVCArIFwiIFwiICsgQiArIFwiIFwiICsgTCArIFwiIFwiICsgeixcbiAgICAgICAgXCJhcmlhLXNlbGVjdGVkXCI6ICEhcCxcbiAgICAgICAgZGlzYWJsZWQ6IGQsXG4gICAgICAgIG9uS2V5RG93bjogZnVuY3Rpb24gb25LZXlEb3duKGUpIHtcbiAgICAgICAgICB1KGUpO1xuICAgICAgICB9LFxuICAgICAgICBvbk1vdXNlTW92ZTogZyA/IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBkIHx8ICgwLCBpLmlzSW9zRGV2aWNlKSgpIHx8IGMocik7XG4gICAgICAgIH0gOiB2b2lkIDBcbiAgICAgIH0sIFQpO1xuICAgIH0pO1xuICAgIHQuRGF5ID0gYywgYy5kaXNwbGF5TmFtZSA9IFwiRGF5XCI7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0Lk1vbnRoUGlja2VyID0gdm9pZCAwO1xuXG4gICAgdmFyIGEsXG4gICAgICAgIG4gPSBmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgaWYgKCF0ICYmIGUgJiYgZS5fX2VzTW9kdWxlKSByZXR1cm4gZTtcbiAgICAgIGlmIChudWxsID09PSBlIHx8IFwib2JqZWN0XCIgIT0gdHlwZW9mIGUgJiYgXCJmdW5jdGlvblwiICE9IHR5cGVvZiBlKSByZXR1cm4ge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgICAgdmFyIHIgPSB1KHQpO1xuICAgICAgaWYgKHIgJiYgci5oYXMoZSkpIHJldHVybiByLmdldChlKTtcbiAgICAgIHZhciBhID0ge30sXG4gICAgICAgICAgbiA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4gICAgICBmb3IgKHZhciBvIGluIGUpIHtcbiAgICAgICAgaWYgKFwiZGVmYXVsdFwiICE9PSBvICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBvKSkge1xuICAgICAgICAgIHZhciBpID0gbiA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgbykgOiBudWxsO1xuICAgICAgICAgIGkgJiYgKGkuZ2V0IHx8IGkuc2V0KSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCBvLCBpKSA6IGFbb10gPSBlW29dO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGEuZGVmYXVsdCA9IGUsIHIgJiYgci5zZXQoZSwgYSk7XG4gICAgICByZXR1cm4gYTtcbiAgICB9KHIoMCkpLFxuICAgICAgICBvID0gKGEgPSByKDEpKSAmJiBhLl9fZXNNb2R1bGUgPyBhIDoge1xuICAgICAgZGVmYXVsdDogYVxuICAgIH0sXG4gICAgICAgIGkgPSByKDMpLFxuICAgICAgICBsID0gcig5KTtcblxuICAgIGZ1bmN0aW9uIHUoZSkge1xuICAgICAgaWYgKFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgV2Vha01hcCkgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgdCA9IG5ldyBXZWFrTWFwKCksXG4gICAgICAgICAgciA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICByZXR1cm4gKHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgICAgcmV0dXJuIGUgPyByIDogdDtcbiAgICAgIH0pKGUpO1xuICAgIH1cblxuICAgIHZhciBjID0gZnVuY3Rpb24gYyhlKSB7XG4gICAgICB2YXIgdCA9IGUuZGF0ZSxcbiAgICAgICAgICByID0gZS5taW5EYXRlLFxuICAgICAgICAgIGEgPSBlLm1heERhdGUsXG4gICAgICAgICAgdSA9IGUuaGFuZGxlU2VsZWN0TW9udGgsXG4gICAgICAgICAgYyA9IGUuaTE4bixcbiAgICAgICAgICBzID0gdm9pZCAwID09PSBjID8gbC5FTl9VUyA6IGMsXG4gICAgICAgICAgZCA9IHQuZ2V0TW9udGgoKSxcbiAgICAgICAgICBmID0gKDAsIG4udXNlU3RhdGUpKGQpLFxuICAgICAgICAgIHAgPSBmWzBdLFxuICAgICAgICAgIG0gPSBmWzFdLFxuICAgICAgICAgIHkgPSAoMCwgbi51c2VSZWYpKG51bGwpLFxuICAgICAgICAgIGIgPSAoMCwgbi51c2VSZWYpKG51bGwpO1xuICAgICAgKDAsIG4udXNlRWZmZWN0KShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlID0geS5jdXJyZW50ICYmIHkuY3VycmVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS12YWx1ZT1cIicgKyBwICsgJ1wiXScpO1xuICAgICAgICBlICYmIGUuZm9jdXMoKTtcbiAgICAgIH0sIFtwXSk7XG5cbiAgICAgIHZhciB2ID0gZnVuY3Rpb24gdihlKSB7XG4gICAgICAgIHZhciBuLFxuICAgICAgICAgICAgbyxcbiAgICAgICAgICAgIGwgPSBlLnRhcmdldCxcbiAgICAgICAgICAgIHUgPSBwYXJzZUludCgobnVsbCA9PT0gKG4gPSBsLmRhdGFzZXQpIHx8IHZvaWQgMCA9PT0gbiA/IHZvaWQgMCA6IG4udmFsdWUpIHx8IFwiXCIsIDEwKSxcbiAgICAgICAgICAgIGMgPSAoMCwgaS5zZXRNb250aCkodCwgdSk7XG5cbiAgICAgICAgc3dpdGNoIChlLmtleSkge1xuICAgICAgICAgIGNhc2UgXCJBcnJvd1VwXCI6XG4gICAgICAgICAgY2FzZSBcIlVwXCI6XG4gICAgICAgICAgICBvID0gdSAtIDM7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJBcnJvd0Rvd25cIjpcbiAgICAgICAgICBjYXNlIFwiRG93blwiOlxuICAgICAgICAgICAgbyA9IHUgKyAzO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwiQXJyb3dMZWZ0XCI6XG4gICAgICAgICAgY2FzZSBcIkxlZnRcIjpcbiAgICAgICAgICAgIG8gPSB1IC0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcIkFycm93UmlnaHRcIjpcbiAgICAgICAgICBjYXNlIFwiUmlnaHRcIjpcbiAgICAgICAgICAgIG8gPSB1ICsgMTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcIkhvbWVcIjpcbiAgICAgICAgICAgIG8gPSB1IC0gdSAlIDM7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJFbmRcIjpcbiAgICAgICAgICAgIG8gPSB1ICsgMiAtIHUgJSAzO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwiUGFnZURvd25cIjpcbiAgICAgICAgICAgIG8gPSAxMTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcIlBhZ2VVcFwiOlxuICAgICAgICAgICAgbyA9IDA7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodm9pZCAwICE9PSBvKSB7XG4gICAgICAgICAgbyA9IE1hdGgubWF4KDAsIE1hdGgubWluKDExLCBvKSk7XG4gICAgICAgICAgdmFyIHMgPSAoMCwgaS5zZXRNb250aCkodCwgbyksXG4gICAgICAgICAgICAgIGQgPSAoMCwgaS5rZWVwRGF0ZUJldHdlZW5NaW5BbmRNYXgpKHMsIHIsIGEpO1xuICAgICAgICAgICgwLCBpLmlzU2FtZU1vbnRoKShjLCBkKSB8fCBtKGQuZ2V0TW9udGgoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9LFxuICAgICAgICAgIE8gPSBzLm1vbnRocy5tYXAoZnVuY3Rpb24gKGUsIGwpIHtcbiAgICAgICAgdmFyIGMgPSAoMCwgaS5zZXRNb250aCkodCwgbCksXG4gICAgICAgICAgICBzID0gKDAsIGkuaXNEYXRlc01vbnRoT3V0c2lkZU1pbk9yTWF4KShjLCByLCBhKSxcbiAgICAgICAgICAgIGYgPSBsID09PSBkLFxuICAgICAgICAgICAgeSA9IGwgPT09IHAsXG4gICAgICAgICAgICBPID0geSA/IDAgOiAtMSxcbiAgICAgICAgICAgIGcgPSAoMCwgby5kZWZhdWx0KShcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX21vbnRoXCIsIHtcbiAgICAgICAgICBcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX21vbnRoLS1zZWxlY3RlZFwiOiBmLFxuICAgICAgICAgIFwidXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9fbW9udGgtLWZvY3VzZWRcIjogeVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICAgICAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgICAgICAgIGtleTogXCJzZWxlY3RNb250aF9cIiArIGUsXG4gICAgICAgICAgcmVmOiB5ID8gYiA6IG51bGwsXG4gICAgICAgICAgdGFiSW5kZXg6IE8sXG4gICAgICAgICAgY2xhc3NOYW1lOiBnLFxuICAgICAgICAgIFwiZGF0YS12YWx1ZVwiOiBsLFxuICAgICAgICAgIFwiZGF0YS1sYWJlbFwiOiBlLFxuICAgICAgICAgIFwiYXJpYS1zZWxlY3RlZFwiOiBmLFxuICAgICAgICAgIGRpc2FibGVkOiBzLFxuICAgICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG4gICAgICAgICAgICB1KGwpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25LZXlEb3duOiB2LFxuICAgICAgICAgIG9uTW91c2VNb3ZlOiBmdW5jdGlvbiBvbk1vdXNlTW92ZSgpIHtcbiAgICAgICAgICAgIHMgfHwgKDAsIGkuaXNJb3NEZXZpY2UpKCkgfHwgbCAhPT0gcCAmJiBtKGwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgZSk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgdGFiSW5kZXg6IC0xLFxuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiY2FsZW5kYXItbW9udGgtcGlja2VyXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX19tb250aC1waWNrZXJcIixcbiAgICAgICAgcmVmOiB5LFxuICAgICAgICBvbktleURvd246IGZ1bmN0aW9uIG9uS2V5RG93bihlKSB7XG4gICAgICAgICAgKDAsIGkuaGFuZGxlVGFiS2V5KShlLCBbbnVsbCA9PSBiID8gdm9pZCAwIDogYi5jdXJyZW50XSk7XG4gICAgICAgIH1cbiAgICAgIH0sIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwidGFibGVcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9fdGFibGVcIixcbiAgICAgICAgcm9sZTogXCJwcmVzZW50YXRpb25cIlxuICAgICAgfSwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJ0Ym9keVwiLCBudWxsLCAoMCwgaS5saXN0VG9UYWJsZSkoTywgMykpKSk7XG4gICAgfTtcblxuICAgIHQuTW9udGhQaWNrZXIgPSBjLCBjLmRpc3BsYXlOYW1lID0gXCJNb250aFBpY2tlclwiO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5ZZWFyUGlja2VyID0gdm9pZCAwO1xuXG4gICAgdmFyIGEsXG4gICAgICAgIG4gPSBmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgaWYgKCF0ICYmIGUgJiYgZS5fX2VzTW9kdWxlKSByZXR1cm4gZTtcbiAgICAgIGlmIChudWxsID09PSBlIHx8IFwib2JqZWN0XCIgIT0gdHlwZW9mIGUgJiYgXCJmdW5jdGlvblwiICE9IHR5cGVvZiBlKSByZXR1cm4ge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgICAgdmFyIHIgPSB1KHQpO1xuICAgICAgaWYgKHIgJiYgci5oYXMoZSkpIHJldHVybiByLmdldChlKTtcbiAgICAgIHZhciBhID0ge30sXG4gICAgICAgICAgbiA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4gICAgICBmb3IgKHZhciBvIGluIGUpIHtcbiAgICAgICAgaWYgKFwiZGVmYXVsdFwiICE9PSBvICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBvKSkge1xuICAgICAgICAgIHZhciBpID0gbiA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgbykgOiBudWxsO1xuICAgICAgICAgIGkgJiYgKGkuZ2V0IHx8IGkuc2V0KSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCBvLCBpKSA6IGFbb10gPSBlW29dO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGEuZGVmYXVsdCA9IGUsIHIgJiYgci5zZXQoZSwgYSk7XG4gICAgICByZXR1cm4gYTtcbiAgICB9KHIoMCkpLFxuICAgICAgICBvID0gKGEgPSByKDEpKSAmJiBhLl9fZXNNb2R1bGUgPyBhIDoge1xuICAgICAgZGVmYXVsdDogYVxuICAgIH0sXG4gICAgICAgIGkgPSByKDYpLFxuICAgICAgICBsID0gcigzKTtcblxuICAgIGZ1bmN0aW9uIHUoZSkge1xuICAgICAgaWYgKFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgV2Vha01hcCkgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgdCA9IG5ldyBXZWFrTWFwKCksXG4gICAgICAgICAgciA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICByZXR1cm4gKHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgICAgcmV0dXJuIGUgPyByIDogdDtcbiAgICAgIH0pKGUpO1xuICAgIH1cblxuICAgIHZhciBjID0gZnVuY3Rpb24gYyhlKSB7XG4gICAgICB2YXIgdCA9IGUuZGF0ZSxcbiAgICAgICAgICByID0gZS5taW5EYXRlLFxuICAgICAgICAgIGEgPSBlLm1heERhdGUsXG4gICAgICAgICAgdSA9IGUuaGFuZGxlU2VsZWN0WWVhcixcbiAgICAgICAgICBjID0gZS5zZXRTdGF0dXNlcyxcbiAgICAgICAgICBzID0gKDAsIG4udXNlUmVmKShudWxsKSxcbiAgICAgICAgICBkID0gKDAsIG4udXNlUmVmKShudWxsKSxcbiAgICAgICAgICBmID0gKDAsIG4udXNlUmVmKShudWxsKSxcbiAgICAgICAgICBwID0gKDAsIG4udXNlUmVmKShudWxsKSxcbiAgICAgICAgICBtID0gdC5nZXRGdWxsWWVhcigpLFxuICAgICAgICAgIHkgPSAoMCwgbi51c2VTdGF0ZSkobSksXG4gICAgICAgICAgYiA9IHlbMF0sXG4gICAgICAgICAgdiA9IHlbMV0sXG4gICAgICAgICAgTyA9ICgwLCBuLnVzZVN0YXRlKShbbnVsbCwgbnVsbF0pLFxuICAgICAgICAgIGcgPSBPWzBdLFxuICAgICAgICAgIF8gPSBPWzFdLFxuICAgICAgICAgIGggPSBiO1xuICAgICAgaCAtPSBoICUgaS5ZRUFSX0NIVU5LLCBoID0gTWF0aC5tYXgoMCwgaCk7XG4gICAgICB2YXIgaiA9ICgwLCBsLmlzRGF0ZXNZZWFyT3V0c2lkZU1pbk9yTWF4KSgoMCwgbC5zZXRZZWFyKSh0LCBoIC0gMSksIHIsIGEpLFxuICAgICAgICAgIE0gPSAoMCwgbC5pc0RhdGVzWWVhck91dHNpZGVNaW5Pck1heCkoKDAsIGwuc2V0WWVhcikodCwgaCArIGkuWUVBUl9DSFVOSyksIHIsIGEpO1xuICAgICAgKDAsIG4udXNlRWZmZWN0KShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlID0gXCJTaG93aW5nIHllYXJzIFwiICsgaCArIFwiIHRvIFwiICsgKGggKyBpLllFQVJfQ0hVTksgLSAxKSArIFwiLiBTZWxlY3QgYSB5ZWFyLlwiO1xuICAgICAgICBjKFtlXSk7XG4gICAgICAgIHZhciB0ID0gZ1swXSxcbiAgICAgICAgICAgIHIgPSBnWzFdO1xuICAgICAgICBpZiAodCAmJiByKSB0LmRpc2FibGVkID8gci5mb2N1cygpIDogdC5mb2N1cygpLCBfKFtudWxsLCBudWxsXSk7ZWxzZSB7XG4gICAgICAgICAgdmFyIGEgPSBwLmN1cnJlbnQgJiYgcC5jdXJyZW50LnF1ZXJ5U2VsZWN0b3IoXCIudXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9feWVhci0tZm9jdXNlZFwiKTtcbiAgICAgICAgICBhICYmIGEuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfSwgW2JdKSwgKDAsIG4udXNlRWZmZWN0KShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlID0gcC5jdXJyZW50ICYmIHAuY3VycmVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS12YWx1ZT1cIicgKyBiICsgJ1wiXScpO1xuICAgICAgICBlICYmIGUuZm9jdXMoKTtcbiAgICAgIH0sIFtdKTtcblxuICAgICAgZm9yICh2YXIgTiA9IGZ1bmN0aW9uIE4oZSkge1xuICAgICAgICB2YXIgbixcbiAgICAgICAgICAgIG8sXG4gICAgICAgICAgICB1ID0gZS50YXJnZXQsXG4gICAgICAgICAgICBjID0gcGFyc2VJbnQoKG51bGwgPT09IChuID0gdS5kYXRhc2V0KSB8fCB2b2lkIDAgPT09IG4gPyB2b2lkIDAgOiBuLnZhbHVlKSB8fCBcIlwiLCAxMCksXG4gICAgICAgICAgICBzID0gKDAsIGwuc2V0WWVhcikodCwgYyk7XG5cbiAgICAgICAgc3dpdGNoIChlLmtleSkge1xuICAgICAgICAgIGNhc2UgXCJBcnJvd1VwXCI6XG4gICAgICAgICAgY2FzZSBcIlVwXCI6XG4gICAgICAgICAgICBvID0gYyAtIDM7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJBcnJvd0Rvd25cIjpcbiAgICAgICAgICBjYXNlIFwiRG93blwiOlxuICAgICAgICAgICAgbyA9IGMgKyAzO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwiQXJyb3dMZWZ0XCI6XG4gICAgICAgICAgY2FzZSBcIkxlZnRcIjpcbiAgICAgICAgICAgIG8gPSBjIC0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcIkFycm93UmlnaHRcIjpcbiAgICAgICAgICBjYXNlIFwiUmlnaHRcIjpcbiAgICAgICAgICAgIG8gPSBjICsgMTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcIkhvbWVcIjpcbiAgICAgICAgICAgIG8gPSBjIC0gYyAlIDM7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJFbmRcIjpcbiAgICAgICAgICAgIG8gPSBjICsgMiAtIGMgJSAzO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwiUGFnZURvd25cIjpcbiAgICAgICAgICAgIG8gPSBjICsgaS5ZRUFSX0NIVU5LO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwiUGFnZVVwXCI6XG4gICAgICAgICAgICBvID0gYyAtIGkuWUVBUl9DSFVOSztcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2b2lkIDAgIT09IG8pIHtcbiAgICAgICAgICBvID0gTWF0aC5tYXgoMCwgbyk7XG4gICAgICAgICAgdmFyIGQgPSAoMCwgbC5zZXRZZWFyKSh0LCBvKSxcbiAgICAgICAgICAgICAgZiA9ICgwLCBsLmtlZXBEYXRlQmV0d2Vlbk1pbkFuZE1heCkoZCwgciwgYSk7XG4gICAgICAgICAgKDAsIGwuaXNTYW1lWWVhcikocywgZikgfHwgdihmLmdldEZ1bGxZZWFyKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfSwgRSA9IFtdLCBQID0gaCwgdyA9IGZ1bmN0aW9uIHcoKSB7XG4gICAgICAgIHZhciBlID0gUCxcbiAgICAgICAgICAgIGkgPSAoMCwgbC5pc0RhdGVzWWVhck91dHNpZGVNaW5Pck1heCkoKDAsIGwuc2V0WWVhcikodCwgZSksIHIsIGEpLFxuICAgICAgICAgICAgYyA9IGUgPT09IG0sXG4gICAgICAgICAgICBzID0gZSA9PT0gYixcbiAgICAgICAgICAgIGQgPSBzID8gMCA6IC0xLFxuICAgICAgICAgICAgcCA9ICgwLCBvLmRlZmF1bHQpKFwidXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9feWVhclwiLCB7XG4gICAgICAgICAgXCJ1c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX195ZWFyLS1zZWxlY3RlZFwiOiBjLFxuICAgICAgICAgIFwidXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9feWVhci0tZm9jdXNlZFwiOiBzXG4gICAgICAgIH0pO1xuICAgICAgICBFLnB1c2gobi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgICAgICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgICAgICAgdGFiSW5kZXg6IGQsXG4gICAgICAgICAgcmVmOiBzID8gZiA6IG51bGwsXG4gICAgICAgICAgY2xhc3NOYW1lOiBwLFxuICAgICAgICAgIFwiZGF0YS12YWx1ZVwiOiBlLFxuICAgICAgICAgIFwiYXJpYS1zZWxlY3RlZFwiOiBjLFxuICAgICAgICAgIGRpc2FibGVkOiBpLFxuICAgICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG4gICAgICAgICAgICB1KGUpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25LZXlEb3duOiBOLFxuICAgICAgICAgIG9uTW91c2VNb3ZlOiBmdW5jdGlvbiBvbk1vdXNlTW92ZSgpIHtcbiAgICAgICAgICAgIGkgfHwgKDAsIGwuaXNJb3NEZXZpY2UpKCkgfHwgZSAhPT0gYiAmJiB2KGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgZSkpLCBQICs9IDE7XG4gICAgICB9OyBFLmxlbmd0aCA8IGkuWUVBUl9DSFVOSzspIHtcbiAgICAgICAgdygpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICB0YWJJbmRleDogLTEsXG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX195ZWFyLXBpY2tlclwiLFxuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiY2FsZW5kYXIteWVhci1waWNrZXJcIixcbiAgICAgICAgcmVmOiBwLFxuICAgICAgICBvbktleURvd246IGZ1bmN0aW9uIG9uS2V5RG93bihlKSB7XG4gICAgICAgICAgKDAsIGwuaGFuZGxlVGFiS2V5KShlLCBbbnVsbCA9PSBzID8gdm9pZCAwIDogcy5jdXJyZW50LCBudWxsID09IGYgPyB2b2lkIDAgOiBmLmN1cnJlbnQsIG51bGwgPT0gZCA/IHZvaWQgMCA6IGQuY3VycmVudF0pO1xuICAgICAgICB9XG4gICAgICB9LCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInRhYmxlXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX3RhYmxlXCIsXG4gICAgICAgIHJvbGU6IFwicHJlc2VudGF0aW9uXCJcbiAgICAgIH0sIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwidGJvZHlcIiwgbnVsbCwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJ0clwiLCBudWxsLCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInRkXCIsIG51bGwsIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICAgICAgdHlwZTogXCJidXR0b25cIixcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcInByZXZpb3VzLXllYXItY2h1bmtcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX3ByZXZpb3VzLXllYXItY2h1bmtcIixcbiAgICAgICAgXCJhcmlhLWxhYmVsXCI6IFwiTmF2aWdhdGUgYmFjayBcIiArIGkuWUVBUl9DSFVOSyArIFwiIHllYXJzXCIsXG4gICAgICAgIGRpc2FibGVkOiBqLFxuICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKCkge1xuICAgICAgICAgIHZhciBlID0gYiAtIGkuWUVBUl9DSFVOSztcbiAgICAgICAgICBlID0gTWF0aC5tYXgoMCwgZSk7XG4gICAgICAgICAgdmFyIG4gPSAoMCwgbC5zZXRZZWFyKSh0LCBlKTtcbiAgICAgICAgICBuID0gKDAsIGwua2VlcERhdGVCZXR3ZWVuTWluQW5kTWF4KShuLCByLCBhKSwgXyhbcy5jdXJyZW50LCBwLmN1cnJlbnRdKSwgdihuLmdldEZ1bGxZZWFyKCkpO1xuICAgICAgICB9LFxuICAgICAgICByZWY6IHNcbiAgICAgIH0sIFwiwqBcIikpLCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInRkXCIsIHtcbiAgICAgICAgY29sU3BhbjogM1xuICAgICAgfSwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJ0YWJsZVwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX190YWJsZVwiLFxuICAgICAgICByb2xlOiBcInByZXNlbnRhdGlvblwiXG4gICAgICB9LCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInRib2R5XCIsIG51bGwsICgwLCBsLmxpc3RUb1RhYmxlKShFLCAzKSkpKSwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJ0ZFwiLCBudWxsLCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJuZXh0LXllYXItY2h1bmtcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX25leHQteWVhci1jaHVua1wiLFxuICAgICAgICBcImFyaWEtbGFiZWxcIjogXCJOYXZpZ2F0ZSBmb3J3YXJkIFwiICsgaS5ZRUFSX0NIVU5LICsgXCIgeWVhcnNcIixcbiAgICAgICAgZGlzYWJsZWQ6IE0sXG4gICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG4gICAgICAgICAgdmFyIGUgPSBiICsgaS5ZRUFSX0NIVU5LO1xuICAgICAgICAgIGUgPSBNYXRoLm1heCgwLCBlKTtcbiAgICAgICAgICB2YXIgbiA9ICgwLCBsLnNldFllYXIpKHQsIGUpO1xuICAgICAgICAgIG4gPSAoMCwgbC5rZWVwRGF0ZUJldHdlZW5NaW5BbmRNYXgpKG4sIHIsIGEpLCBfKFtkLmN1cnJlbnQsIHAuY3VycmVudF0pLCB2KG4uZ2V0RnVsbFllYXIoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlZjogZFxuICAgICAgfSwgXCLCoFwiKSkpKSkpO1xuICAgIH07XG5cbiAgICB0LlllYXJQaWNrZXIgPSBjLCBjLmRpc3BsYXlOYW1lID0gXCJZZWFyUGlja2VyXCI7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LkRhdGVSYW5nZVBpY2tlciA9IHZvaWQgMDtcblxuICAgIHZhciBhLFxuICAgICAgICBuID0gKGEgPSByKDEpKSAmJiBhLl9fZXNNb2R1bGUgPyBhIDoge1xuICAgICAgZGVmYXVsdDogYVxuICAgIH0sXG4gICAgICAgIG8gPSBmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgaWYgKCF0ICYmIGUgJiYgZS5fX2VzTW9kdWxlKSByZXR1cm4gZTtcbiAgICAgIGlmIChudWxsID09PSBlIHx8IFwib2JqZWN0XCIgIT0gdHlwZW9mIGUgJiYgXCJmdW5jdGlvblwiICE9IHR5cGVvZiBlKSByZXR1cm4ge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgICAgdmFyIHIgPSBkKHQpO1xuICAgICAgaWYgKHIgJiYgci5oYXMoZSkpIHJldHVybiByLmdldChlKTtcbiAgICAgIHZhciBhID0ge30sXG4gICAgICAgICAgbiA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4gICAgICBmb3IgKHZhciBvIGluIGUpIHtcbiAgICAgICAgaWYgKFwiZGVmYXVsdFwiICE9PSBvICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBvKSkge1xuICAgICAgICAgIHZhciBpID0gbiA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgbykgOiBudWxsO1xuICAgICAgICAgIGkgJiYgKGkuZ2V0IHx8IGkuc2V0KSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCBvLCBpKSA6IGFbb10gPSBlW29dO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGEuZGVmYXVsdCA9IGUsIHIgJiYgci5zZXQoZSwgYSk7XG4gICAgICByZXR1cm4gYTtcbiAgICB9KHIoMCkpLFxuICAgICAgICBpID0gcig2KSxcbiAgICAgICAgbCA9IHIoMTIpLFxuICAgICAgICB1ID0gcigzKSxcbiAgICAgICAgYyA9IHIoOCksXG4gICAgICAgIHMgPSByKDUpO1xuXG4gICAgZnVuY3Rpb24gZChlKSB7XG4gICAgICBpZiAoXCJmdW5jdGlvblwiICE9IHR5cGVvZiBXZWFrTWFwKSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciB0ID0gbmV3IFdlYWtNYXAoKSxcbiAgICAgICAgICByID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgIHJldHVybiAoZCA9IGZ1bmN0aW9uIGQoZSkge1xuICAgICAgICByZXR1cm4gZSA/IHIgOiB0O1xuICAgICAgfSkoZSk7XG4gICAgfVxuXG4gICAgdmFyIF9mMiA9IGZ1bmN0aW9uIGYoKSB7XG4gICAgICByZXR1cm4gKF9mMiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcblxuICAgIHQuRGF0ZVJhbmdlUGlja2VyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0LFxuICAgICAgICAgIHIsXG4gICAgICAgICAgYSxcbiAgICAgICAgICBkLFxuICAgICAgICAgIHAsXG4gICAgICAgICAgbSxcbiAgICAgICAgICB5ID0gZS5zdGFydERhdGVMYWJlbCxcbiAgICAgICAgICBiID0gZS5zdGFydERhdGVIaW50LFxuICAgICAgICAgIHYgPSBlLnN0YXJ0RGF0ZVBpY2tlclByb3BzLFxuICAgICAgICAgIE8gPSBlLmVuZERhdGVMYWJlbCxcbiAgICAgICAgICBnID0gZS5lbmREYXRlSGludCxcbiAgICAgICAgICBfID0gZS5lbmREYXRlUGlja2VyUHJvcHMsXG4gICAgICAgICAgaCA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIGogPSAoMCwgby51c2VTdGF0ZSkodi5kZWZhdWx0VmFsdWUpLFxuICAgICAgICAgIE0gPSBqWzBdLFxuICAgICAgICAgIE4gPSBqWzFdLFxuICAgICAgICAgIEUgPSAoMCwgby51c2VTdGF0ZSkoXy5kZWZhdWx0VmFsdWUpLFxuICAgICAgICAgIFAgPSBFWzBdLFxuICAgICAgICAgIHcgPSBFWzFdLFxuICAgICAgICAgIEkgPSBmdW5jdGlvbiBJKGUsIHQpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChyKSB7XG4gICAgICAgICAgdmFyIGEgPSByICYmICgwLCB1LnBhcnNlRGF0ZVN0cmluZykociwgaS5ERUZBVUxUX0VYVEVSTkFMX0RBVEVfRk9STUFUKTtcblxuICAgICAgICAgIGlmIChhKSB7XG4gICAgICAgICAgICB2YXIgbiA9ICgwLCB1LmZvcm1hdERhdGUpKGEpO1xuICAgICAgICAgICAgdChuKTtcbiAgICAgICAgICB9IGVsc2UgdChyKTtcblxuICAgICAgICAgIGUgJiYgZShyKTtcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICAgICAgRCA9IEkodi5vbkNoYW5nZSwgTiksXG4gICAgICAgICAgUyA9IEkoXy5vbkNoYW5nZSwgdyksXG4gICAgICAgICAgeCA9ICgwLCBuLmRlZmF1bHQpKGgsIFwidXNhLWRhdGUtcmFuZ2UtcGlja2VyXCIpLFxuICAgICAgICAgIGsgPSAoMCwgbi5kZWZhdWx0KSh2LmNsYXNzTmFtZSwgXCJ1c2EtZGF0ZS1yYW5nZS1waWNrZXJfX3JhbmdlLXN0YXJ0XCIpLFxuICAgICAgICAgIEEgPSAoMCwgbi5kZWZhdWx0KShfLmNsYXNzTmFtZSwgXCJ1c2EtZGF0ZS1yYW5nZS1waWNrZXJfX3JhbmdlLWVuZFwiKSxcbiAgICAgICAgICBUID0gdi5pZCArIFwiLWxhYmVsXCIsXG4gICAgICAgICAgQyA9IHYuaWQgKyBcIi1oaW50XCIsXG4gICAgICAgICAgTCA9IFt5ICYmIFQsIGIgJiYgQ10uam9pbihcIiBcIikudHJpbSgpIHx8IHZvaWQgMCxcbiAgICAgICAgICBGID0gXy5pZCArIFwiLWxhYmVsXCIsXG4gICAgICAgICAgUiA9IF8uaWQgKyBcIi1oaW50XCIsXG4gICAgICAgICAgVSA9IFtPICYmIEYsIGcgJiYgUl0uam9pbihcIiBcIikudHJpbSgpIHx8IHZvaWQgMDtcblxuICAgICAgcmV0dXJuIG8uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiB4LFxuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiZGF0ZS1yYW5nZS1waWNrZXJcIlxuICAgICAgfSwgby5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoYy5Gb3JtR3JvdXAsIG51bGwsIHkgJiYgby5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQocy5MYWJlbCwge1xuICAgICAgICBpZDogVCxcbiAgICAgICAgaHRtbEZvcjogdi5pZFxuICAgICAgfSwgeSksIGIgJiYgby5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWhpbnRcIixcbiAgICAgICAgaWQ6IENcbiAgICAgIH0sIGIpLCBvLmRlZmF1bHQuY3JlYXRlRWxlbWVudChsLkRhdGVQaWNrZXIsIF9mMih7XG4gICAgICAgIGNsYXNzTmFtZTogayxcbiAgICAgICAgcmFuZ2VEYXRlOiBQXG4gICAgICB9LCB2LCB7XG4gICAgICAgIFwiYXJpYS1kZXNjcmliZWRieVwiOiBMLFxuICAgICAgICBvbkNoYW5nZTogRCxcbiAgICAgICAgbWF4RGF0ZTogKGQgPSB2Lm1heERhdGUsIHAgPSBkICYmICgwLCB1LnBhcnNlRGF0ZVN0cmluZykoZCksIG0gPSBQICYmICgwLCB1LnBhcnNlRGF0ZVN0cmluZykoUCksIG0gJiYgcCA/IG0uZ2V0VGltZSgpIDwgcC5nZXRUaW1lKCkgPyAoMCwgdS5mb3JtYXREYXRlKShtKSA6ICgwLCB1LmZvcm1hdERhdGUpKHApIDogbSAmJiAoMCwgdS5mb3JtYXREYXRlKShtKSB8fCBwICYmICgwLCB1LmZvcm1hdERhdGUpKHApIHx8IHZvaWQgMClcbiAgICAgIH0pKSksIG8uZGVmYXVsdC5jcmVhdGVFbGVtZW50KGMuRm9ybUdyb3VwLCBudWxsLCBPICYmIG8uZGVmYXVsdC5jcmVhdGVFbGVtZW50KHMuTGFiZWwsIHtcbiAgICAgICAgaWQ6IEYsXG4gICAgICAgIGh0bWxGb3I6IF8uaWRcbiAgICAgIH0sIE8pLCBnICYmIG8uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1oaW50XCIsXG4gICAgICAgIGlkOiBSXG4gICAgICB9LCBnKSwgby5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQobC5EYXRlUGlja2VyLCBfZjIoe1xuICAgICAgICBjbGFzc05hbWU6IEEsXG4gICAgICAgIHJhbmdlRGF0ZTogTVxuICAgICAgfSwgXywge1xuICAgICAgICBcImFyaWEtZGVzY3JpYmVkYnlcIjogVSxcbiAgICAgICAgb25DaGFuZ2U6IFMsXG4gICAgICAgIG1pbkRhdGU6ICh0ID0gXy5taW5EYXRlLCByID0gdCAmJiAoMCwgdS5wYXJzZURhdGVTdHJpbmcpKHQpLCBhID0gTSAmJiAoMCwgdS5wYXJzZURhdGVTdHJpbmcpKE0pLCBhICYmIHIgPyBhLmdldFRpbWUoKSA+IHIuZ2V0VGltZSgpID8gKDAsIHUuZm9ybWF0RGF0ZSkoYSkgOiAoMCwgdS5mb3JtYXREYXRlKShyKSA6IGEgJiYgKDAsIHUuZm9ybWF0RGF0ZSkoYSkgfHwgciAmJiAoMCwgdS5mb3JtYXREYXRlKShyKSB8fCB2b2lkIDApXG4gICAgICB9KSkpKTtcbiAgICB9O1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZWZhdWx0ID0gdC5Ecm9wZG93biA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTE4ID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kxOCA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSkge1xuICAgICAgdmFyIHQgPSBlLmlkLFxuICAgICAgICAgIHIgPSBlLm5hbWUsXG4gICAgICAgICAgbyA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHUgPSBlLmlucHV0UmVmLFxuICAgICAgICAgIGMgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIHMgPSBsKGUsIFtcImlkXCIsIFwibmFtZVwiLCBcImNsYXNzTmFtZVwiLCBcImlucHV0UmVmXCIsIFwiY2hpbGRyZW5cIl0pLFxuICAgICAgICAgIGQgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1zZWxlY3RcIiwgbyk7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzZWxlY3RcIiwgX2kxOCh7XG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJkcm9wZG93blwiLFxuICAgICAgICBjbGFzc05hbWU6IGQsXG4gICAgICAgIGlkOiB0LFxuICAgICAgICBuYW1lOiByLFxuICAgICAgICByZWY6IHVcbiAgICAgIH0sIHMpLCBjKTtcbiAgICB9O1xuXG4gICAgdC5Ecm9wZG93biA9IHU7XG4gICAgdmFyIGMgPSB1O1xuICAgIHQuZGVmYXVsdCA9IGM7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0LkVycm9yTWVzc2FnZSA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBpID0gZnVuY3Rpb24gaShlKSB7XG4gICAgICB2YXIgdCA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgciA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIG8gPSBlLmlkLFxuICAgICAgICAgIGkgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1lcnJvci1tZXNzYWdlXCIsIHIpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJlcnJvck1lc3NhZ2VcIixcbiAgICAgICAgY2xhc3NOYW1lOiBpLFxuICAgICAgICBpZDogbyxcbiAgICAgICAgcm9sZTogXCJhbGVydFwiXG4gICAgICB9LCB0KTtcbiAgICB9O1xuXG4gICAgdC5FcnJvck1lc3NhZ2UgPSBpO1xuICAgIHZhciBsID0gaTtcbiAgICB0LmRlZmF1bHQgPSBsO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5GaWVsZHNldCA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IGkocigwKSksXG4gICAgICAgIG4gPSBpKHIoMSkpLFxuICAgICAgICBvID0gcigyKTtcblxuICAgIGZ1bmN0aW9uIGkoZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0LkZpZWxkc2V0ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0ID0gZS5jaGlsZHJlbixcbiAgICAgICAgICByID0gZS5sZWdlbmQsXG4gICAgICAgICAgaSA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIGwgPSBlLmxlZ2VuZFNyT25seSxcbiAgICAgICAgICB1ID0gZS5sZWdlbmRTdHlsZSxcbiAgICAgICAgICBjID0gdm9pZCAwID09PSB1ID8gXCJkZWZhdWx0XCIgOiB1LFxuICAgICAgICAgIHMgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1maWVsZHNldFwiLCBpKTtcbiAgICAgIGwgJiYgKDAsIG8uZGVwcmVjYXRpb25XYXJuaW5nKShcIkZpZWxkc2V0IHByb3BlcnR5IGxlZ2VuZFNyT25seSBpcyBkZXByZWNhdGVkLiBVc2UgbGVnZW5kU3R5bGUgPSAnc3JPbmx5Jy5cIik7XG4gICAgICB2YXIgZCA9ICgwLCBuLmRlZmF1bHQpKHtcbiAgICAgICAgXCJ1c2EtbGVnZW5kXCI6IFwiZGVmYXVsdFwiID09PSBjLFxuICAgICAgICBcInVzYS1sZWdlbmQtLWxhcmdlXCI6IFwibGFyZ2VcIiA9PT0gYyxcbiAgICAgICAgXCJ1c2Etc3Itb25seVwiOiBcInNyT25seVwiID09PSBjIHx8IGxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZmllbGRzZXRcIiwge1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiZmllbGRzZXRcIixcbiAgICAgICAgY2xhc3NOYW1lOiBzXG4gICAgICB9LCByICYmIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwibGVnZW5kXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBkXG4gICAgICB9LCByKSwgdCk7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuRmlsZUlucHV0ID0gdm9pZCAwO1xuXG4gICAgdmFyIGEsXG4gICAgICAgIG4gPSBmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgaWYgKCF0ICYmIGUgJiYgZS5fX2VzTW9kdWxlKSByZXR1cm4gZTtcbiAgICAgIGlmIChudWxsID09PSBlIHx8IFwib2JqZWN0XCIgIT0gdHlwZW9mIGUgJiYgXCJmdW5jdGlvblwiICE9IHR5cGVvZiBlKSByZXR1cm4ge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgICAgdmFyIHIgPSB1KHQpO1xuICAgICAgaWYgKHIgJiYgci5oYXMoZSkpIHJldHVybiByLmdldChlKTtcbiAgICAgIHZhciBhID0ge30sXG4gICAgICAgICAgbiA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4gICAgICBmb3IgKHZhciBvIGluIGUpIHtcbiAgICAgICAgaWYgKFwiZGVmYXVsdFwiICE9PSBvICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBvKSkge1xuICAgICAgICAgIHZhciBpID0gbiA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgbykgOiBudWxsO1xuICAgICAgICAgIGkgJiYgKGkuZ2V0IHx8IGkuc2V0KSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCBvLCBpKSA6IGFbb10gPSBlW29dO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGEuZGVmYXVsdCA9IGUsIHIgJiYgci5zZXQoZSwgYSk7XG4gICAgICByZXR1cm4gYTtcbiAgICB9KHIoMCkpLFxuICAgICAgICBvID0gKGEgPSByKDEpKSAmJiBhLl9fZXNNb2R1bGUgPyBhIDoge1xuICAgICAgZGVmYXVsdDogYVxuICAgIH0sXG4gICAgICAgIGkgPSByKDYyKSxcbiAgICAgICAgbCA9IHIoNjMpO1xuXG4gICAgZnVuY3Rpb24gdShlKSB7XG4gICAgICBpZiAoXCJmdW5jdGlvblwiICE9IHR5cGVvZiBXZWFrTWFwKSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciB0ID0gbmV3IFdlYWtNYXAoKSxcbiAgICAgICAgICByID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgIHJldHVybiAodSA9IGZ1bmN0aW9uIHUoZSkge1xuICAgICAgICByZXR1cm4gZSA/IHIgOiB0O1xuICAgICAgfSkoZSk7XG4gICAgfVxuXG4gICAgdmFyIF9jMyA9IGZ1bmN0aW9uIGMoKSB7XG4gICAgICByZXR1cm4gKF9jMyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgcyA9IGZ1bmN0aW9uIHMoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfTtcblxuICAgIHQuRmlsZUlucHV0ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0ID0gZS5uYW1lLFxuICAgICAgICAgIHIgPSBlLmlkLFxuICAgICAgICAgIGEgPSBlLmRpc2FibGVkLFxuICAgICAgICAgIHUgPSBlLm11bHRpcGxlLFxuICAgICAgICAgIGQgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBmID0gZS5hY2NlcHQsXG4gICAgICAgICAgcCA9IGUub25DaGFuZ2UsXG4gICAgICAgICAgbSA9IGUub25Ecm9wLFxuICAgICAgICAgIHkgPSBlLmlucHV0UmVmLFxuICAgICAgICAgIGIgPSBzKGUsIFtcIm5hbWVcIiwgXCJpZFwiLCBcImRpc2FibGVkXCIsIFwibXVsdGlwbGVcIiwgXCJjbGFzc05hbWVcIiwgXCJhY2NlcHRcIiwgXCJvbkNoYW5nZVwiLCBcIm9uRHJvcFwiLCBcImlucHV0UmVmXCJdKSxcbiAgICAgICAgICB2ID0gKDAsIG4udXNlU3RhdGUpKCExKSxcbiAgICAgICAgICBPID0gdlswXSxcbiAgICAgICAgICBnID0gdlsxXSxcbiAgICAgICAgICBfID0gKDAsIG4udXNlU3RhdGUpKCExKSxcbiAgICAgICAgICBoID0gX1swXSxcbiAgICAgICAgICBqID0gX1sxXSxcbiAgICAgICAgICBNID0gKDAsIG4udXNlU3RhdGUpKG51bGwpLFxuICAgICAgICAgIE4gPSBNWzBdLFxuICAgICAgICAgIEUgPSBNWzFdLFxuICAgICAgICAgIFAgPSAoMCwgby5kZWZhdWx0KShcInVzYS1maWxlLWlucHV0XCIsIHtcbiAgICAgICAgXCJ1c2EtZmlsZS1pbnB1dC0tZGlzYWJsZWRcIjogYVxuICAgICAgfSwgZCksXG4gICAgICAgICAgdyA9ICgwLCBvLmRlZmF1bHQpKFwidXNhLWZpbGUtaW5wdXRfX3RhcmdldFwiLCB7XG4gICAgICAgIFwidXNhLWZpbGUtaW5wdXQtLWRyYWdcIjogTyxcbiAgICAgICAgXCJoYXMtaW52YWxpZC1maWxlXCI6IGhcbiAgICAgIH0pLFxuICAgICAgICAgIEkgPSAvcnY6MTEuMC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgfHwgL0VkZ2VcXC9cXGQuL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSxcbiAgICAgICAgICBEID0gdSA/IFwiRHJhZyBmaWxlcyBoZXJlIG9yIFwiIDogXCJEcmFnIGZpbGUgaGVyZSBvciBcIixcbiAgICAgICAgICBTID0gW107XG5cbiAgICAgIGlmIChOKSBmb3IgKHZhciB4ID0gMDsgeCA8IChudWxsID09IE4gPyB2b2lkIDAgOiBOLmxlbmd0aCk7IHgrKykge1xuICAgICAgICB2YXIgayA9ICgwLCBsLm1ha2VTYWZlRm9ySUQpKE5bcGFyc2VJbnQoXCJcIiArIHgpXS5uYW1lKSxcbiAgICAgICAgICAgIEEgPSBcImZpbGVQcmV2aWV3X1wiICsgaztcbiAgICAgICAgUy5wdXNoKG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KGkuRmlsZVByZXZpZXcsIHtcbiAgICAgICAgICBrZXk6IEEsXG4gICAgICAgICAgaW1hZ2VJZDogayxcbiAgICAgICAgICBmaWxlOiBOW3BhcnNlSW50KFwiXCIgKyB4KV1cbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgICAgdmFyIFQgPSAoMCwgby5kZWZhdWx0KShcInVzYS1maWxlLWlucHV0X19pbnN0cnVjdGlvbnNcIiwge1xuICAgICAgICBcImRpc3BsYXktbm9uZVwiOiBTLmxlbmd0aCA+IDBcbiAgICAgIH0pLFxuICAgICAgICAgIEMgPSBTLmxlbmd0aCA+IDEgPyBTLmxlbmd0aCArIFwiIGZpbGVzIHNlbGVjdGVkXCIgOiBcIlNlbGVjdGVkIGZpbGVcIjtcbiAgICAgIHJldHVybiBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJmaWxlLWlucHV0XCIsXG4gICAgICAgIGNsYXNzTmFtZTogUCxcbiAgICAgICAgXCJhcmlhLWRpc2FibGVkXCI6IGFcbiAgICAgIH0sIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImZpbGUtaW5wdXQtZHJvcHRhcmdldFwiLFxuICAgICAgICBjbGFzc05hbWU6IHcsXG4gICAgICAgIG9uRHJhZ092ZXI6IGZ1bmN0aW9uIG9uRHJhZ092ZXIoKSB7XG4gICAgICAgICAgcmV0dXJuIGcoITApO1xuICAgICAgICB9LFxuICAgICAgICBvbkRyYWdMZWF2ZTogZnVuY3Rpb24gb25EcmFnTGVhdmUoKSB7XG4gICAgICAgICAgcmV0dXJuIGcoITEpO1xuICAgICAgICB9LFxuICAgICAgICBvbkRyb3A6IGZ1bmN0aW9uIG9uRHJvcChlKSB7XG4gICAgICAgICAgIWZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBpZiAoaighMSksIGYpIHtcbiAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IGYuc3BsaXQoXCIsXCIpLCByID0gITAsIGEgPSAwOyBhIDwgZS5kYXRhVHJhbnNmZXIuZmlsZXMubGVuZ3RoOyBhICs9IDEpIHtcbiAgICAgICAgICAgICAgICB2YXIgbiA9IGUuZGF0YVRyYW5zZmVyLmZpbGVzW3BhcnNlSW50KFwiXCIgKyBhKV07XG4gICAgICAgICAgICAgICAgaWYgKCFyKSBicmVhaztcblxuICAgICAgICAgICAgICAgIGZvciAodmFyIG8gPSAwOyBvIDwgdC5sZW5ndGg7IG8gKz0gMSkge1xuICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0W3BhcnNlSW50KFwiXCIgKyBvKV07XG4gICAgICAgICAgICAgICAgICBpZiAociA9IG4ubmFtZS5pbmRleE9mKGkpID4gMCB8fCBuLnR5cGUuaW5jbHVkZXMoaS5yZXBsYWNlKC9cXCovZywgXCJcIikpKSBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByIHx8IChFKG51bGwpLCBqKCEwKSwgZS5wcmV2ZW50RGVmYXVsdCgpLCBlLnN0b3BQcm9wYWdhdGlvbigpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KGUpLCBnKCExKSwgbSAmJiBtKGUpO1xuICAgICAgICB9XG4gICAgICB9LCBTLmxlbmd0aCA+IDAgJiYgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiZmlsZS1pbnB1dC1wcmV2aWV3LWhlYWRpbmdcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1maWxlLWlucHV0X19wcmV2aWV3LWhlYWRpbmdcIlxuICAgICAgfSwgQywgXCIgXCIsIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtZmlsZS1pbnB1dF9fY2hvb3NlXCJcbiAgICAgIH0sIFwiQ2hhbmdlIGZpbGVcIiwgUy5sZW5ndGggPiAxICYmIFwic1wiKSksIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImZpbGUtaW5wdXQtaW5zdHJ1Y3Rpb25zXCIsXG4gICAgICAgIGNsYXNzTmFtZTogVCxcbiAgICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuICAgICAgfSwgIUkgJiYgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1maWxlLWlucHV0X19kcmFnLXRleHRcIlxuICAgICAgfSwgRCksIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtZmlsZS1pbnB1dF9fY2hvb3NlXCJcbiAgICAgIH0sIFwiY2hvb3NlIGZyb20gZm9sZGVyXCIpKSwgUywgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiZmlsZS1pbnB1dC1ib3hcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1maWxlLWlucHV0X19ib3hcIlxuICAgICAgfSksIGggJiYgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiZmlsZS1pbnB1dC1lcnJvclwiLFxuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWZpbGUtaW5wdXRfX2FjY2VwdGVkLWZpbGVzLW1lc3NhZ2VcIlxuICAgICAgfSwgXCJUaGlzIGlzIG5vdCBhIHZhbGlkIGZpbGUgdHlwZS5cIiksIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiwgX2MzKHt9LCBiLCB7XG4gICAgICAgIHJlZjogeSxcbiAgICAgICAgdHlwZTogXCJmaWxlXCIsXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJmaWxlLWlucHV0LWlucHV0XCIsXG4gICAgICAgIG5hbWU6IHQsXG4gICAgICAgIGlkOiByLFxuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWZpbGUtaW5wdXRfX2lucHV0XCIsXG4gICAgICAgIGRpc2FibGVkOiBhLFxuICAgICAgICBvbkNoYW5nZTogZnVuY3Rpb24gb25DaGFuZ2UoZSkge1xuICAgICAgICAgIHZhciB0O1xuICAgICAgICAgIGooITEpLCBFKG51bGwgPT09ICh0ID0gZS50YXJnZXQpIHx8IHZvaWQgMCA9PT0gdCA/IHZvaWQgMCA6IHQuZmlsZXMpLCBwICYmIHAoZSk7XG4gICAgICAgIH0sXG4gICAgICAgIG11bHRpcGxlOiB1LFxuICAgICAgICBhY2NlcHQ6IGZcbiAgICAgIH0pKSkpO1xuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LkZpbGVQcmV2aWV3ID0gdm9pZCAwO1xuXG4gICAgdmFyIGEsXG4gICAgICAgIG4gPSBmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgaWYgKCF0ICYmIGUgJiYgZS5fX2VzTW9kdWxlKSByZXR1cm4gZTtcbiAgICAgIGlmIChudWxsID09PSBlIHx8IFwib2JqZWN0XCIgIT0gdHlwZW9mIGUgJiYgXCJmdW5jdGlvblwiICE9IHR5cGVvZiBlKSByZXR1cm4ge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgICAgdmFyIHIgPSBpKHQpO1xuICAgICAgaWYgKHIgJiYgci5oYXMoZSkpIHJldHVybiByLmdldChlKTtcbiAgICAgIHZhciBhID0ge30sXG4gICAgICAgICAgbiA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4gICAgICBmb3IgKHZhciBvIGluIGUpIHtcbiAgICAgICAgaWYgKFwiZGVmYXVsdFwiICE9PSBvICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBvKSkge1xuICAgICAgICAgIHZhciBsID0gbiA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgbykgOiBudWxsO1xuICAgICAgICAgIGwgJiYgKGwuZ2V0IHx8IGwuc2V0KSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCBvLCBsKSA6IGFbb10gPSBlW29dO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGEuZGVmYXVsdCA9IGUsIHIgJiYgci5zZXQoZSwgYSk7XG4gICAgICByZXR1cm4gYTtcbiAgICB9KHIoMCkpLFxuICAgICAgICBvID0gKGEgPSByKDEpKSAmJiBhLl9fZXNNb2R1bGUgPyBhIDoge1xuICAgICAgZGVmYXVsdDogYVxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBpKGUpIHtcbiAgICAgIGlmIChcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIFdlYWtNYXApIHJldHVybiBudWxsO1xuICAgICAgdmFyIHQgPSBuZXcgV2Vha01hcCgpLFxuICAgICAgICAgIHIgPSBuZXcgV2Vha01hcCgpO1xuICAgICAgcmV0dXJuIChpID0gZnVuY3Rpb24gaShlKSB7XG4gICAgICAgIHJldHVybiBlID8gciA6IHQ7XG4gICAgICB9KShlKTtcbiAgICB9XG5cbiAgICB2YXIgbCA9IFwiZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFJQUFBQUFBQVAvLy95SDVCQUVBQUFBQUxBQUFBQUFCQUFFQUFBSUJSQUE3XCI7XG5cbiAgICB0LkZpbGVQcmV2aWV3ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0ID0gZS5pbWFnZUlkLFxuICAgICAgICAgIHIgPSBlLmZpbGUsXG4gICAgICAgICAgYSA9ICgwLCBuLnVzZVJlZikobmV3IEZpbGVSZWFkZXIoKSksXG4gICAgICAgICAgaSA9ICgwLCBuLnVzZVN0YXRlKSghMCksXG4gICAgICAgICAgdSA9IGlbMF0sXG4gICAgICAgICAgYyA9IGlbMV0sXG4gICAgICAgICAgcyA9ICgwLCBuLnVzZVN0YXRlKShsKSxcbiAgICAgICAgICBkID0gc1swXSxcbiAgICAgICAgICBmID0gc1sxXSxcbiAgICAgICAgICBwID0gKDAsIG4udXNlU3RhdGUpKCExKSxcbiAgICAgICAgICBtID0gcFswXSxcbiAgICAgICAgICB5ID0gcFsxXTtcbiAgICAgICgwLCBuLnVzZUVmZmVjdCkoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gYS5jdXJyZW50Lm9ubG9hZGVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjKCExKSwgZihhLmN1cnJlbnQucmVzdWx0KTtcbiAgICAgICAgfSwgYS5jdXJyZW50LnJlYWRBc0RhdGFVUkwociksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBhLmN1cnJlbnQub25sb2FkZW5kID0gbnVsbDtcbiAgICAgICAgfTtcbiAgICAgIH0sIFtdKTtcblxuICAgICAgdmFyIGIgPSByLm5hbWUsXG4gICAgICAgICAgdiA9IGIuaW5kZXhPZihcIi5wZGZcIikgPiAwLFxuICAgICAgICAgIE8gPSBiLmluZGV4T2YoXCIuZG9jXCIpID4gMCB8fCBiLmluZGV4T2YoXCIucGFnZXNcIikgPiAwLFxuICAgICAgICAgIGcgPSBiLmluZGV4T2YoXCIubW92XCIpID4gMCB8fCBiLmluZGV4T2YoXCIubXA0XCIpID4gMCxcbiAgICAgICAgICBfID0gYi5pbmRleE9mKFwiLnhsc1wiKSA+IDAgfHwgYi5pbmRleE9mKFwiLm51bWJlcnNcIikgPiAwLFxuICAgICAgICAgIGggPSAhKHYgfHwgTyB8fCBnIHx8IF8pLFxuICAgICAgICAgIGogPSAoMCwgby5kZWZhdWx0KShcInVzYS1maWxlLWlucHV0X19wcmV2aWV3LWltYWdlXCIsIHtcbiAgICAgICAgXCJpcy1sb2FkaW5nXCI6IHUsXG4gICAgICAgIFwidXNhLWZpbGUtaW5wdXRfX3ByZXZpZXctaW1hZ2UtLXBkZlwiOiBtICYmIHYsXG4gICAgICAgIFwidXNhLWZpbGUtaW5wdXRfX3ByZXZpZXctaW1hZ2UtLXdvcmRcIjogbSAmJiBPLFxuICAgICAgICBcInVzYS1maWxlLWlucHV0X19wcmV2aWV3LWltYWdlLS12aWRlb1wiOiBtICYmIGcsXG4gICAgICAgIFwidXNhLWZpbGUtaW5wdXRfX3ByZXZpZXctaW1hZ2UtLWV4Y2VsXCI6IG0gJiYgXyxcbiAgICAgICAgXCJ1c2EtZmlsZS1pbnB1dF9fcHJldmlldy1pbWFnZS0tZ2VuZXJpY1wiOiBtICYmIGhcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiZmlsZS1pbnB1dC1wcmV2aWV3XCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtZmlsZS1pbnB1dF9fcHJldmlld1wiLFxuICAgICAgICBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiXG4gICAgICB9LCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImltZ1wiLCB7XG4gICAgICAgIGlkOiB0LFxuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiZmlsZS1pbnB1dC1wcmV2aWV3LWltYWdlXCIsXG4gICAgICAgIHNyYzogZCxcbiAgICAgICAgYWx0OiBcIlwiLFxuICAgICAgICBjbGFzc05hbWU6IGosXG4gICAgICAgIG9uRXJyb3I6IGZ1bmN0aW9uIG9uRXJyb3IoKSB7XG4gICAgICAgICAgZihsKSwgeSghMCk7XG4gICAgICAgIH1cbiAgICAgIH0pLCBiKTtcbiAgICB9O1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5tYWtlU2FmZUZvcklEID0gdm9pZCAwO1xuXG4gICAgdC5tYWtlU2FmZUZvcklEID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHJldHVybiBlLnJlcGxhY2UoL1teYS16MC05XS9nLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgdCA9IGUuY2hhckNvZGVBdCgwKTtcbiAgICAgICAgcmV0dXJuIDMyID09PSB0ID8gXCItXCIgOiB0ID49IDY1ICYmIHQgPD0gOTAgPyBcImltZ19cIiArIGUudG9Mb3dlckNhc2UoKSA6IFwiX19cIiArIHQudG9TdHJpbmcoMTYpLnNsaWNlKC00KTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0LlJhZGlvID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDApKSxcbiAgICAgICAgbiA9IG8ocigxKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9pMTkgPSBmdW5jdGlvbiBpKCkge1xuICAgICAgcmV0dXJuIChfaTE5ID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBsID0gZnVuY3Rpb24gbChlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9LFxuICAgICAgICB1ID0gZnVuY3Rpb24gdShlKSB7XG4gICAgICB2YXIgdCA9IGUuaWQsXG4gICAgICAgICAgciA9IGUubmFtZSxcbiAgICAgICAgICBvID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgdSA9IGUubGFiZWwsXG4gICAgICAgICAgYyA9IGUuaW5wdXRSZWYsXG4gICAgICAgICAgcyA9IGUudGlsZSxcbiAgICAgICAgICBkID0gZS5sYWJlbERlc2NyaXB0aW9uLFxuICAgICAgICAgIGYgPSBsKGUsIFtcImlkXCIsIFwibmFtZVwiLCBcImNsYXNzTmFtZVwiLCBcImxhYmVsXCIsIFwiaW5wdXRSZWZcIiwgXCJ0aWxlXCIsIFwibGFiZWxEZXNjcmlwdGlvblwiXSksXG4gICAgICAgICAgcCA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLXJhZGlvXCIsIG8pLFxuICAgICAgICAgIG0gPSAoMCwgbi5kZWZhdWx0KShcInVzYS1yYWRpb19faW5wdXRcIiwge1xuICAgICAgICBcInVzYS1yYWRpb19faW5wdXQtLXRpbGVcIjogc1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwicmFkaW9cIixcbiAgICAgICAgY2xhc3NOYW1lOiBwXG4gICAgICB9LCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImlucHV0XCIsIF9pMTkoe1xuICAgICAgICBjbGFzc05hbWU6IG0sXG4gICAgICAgIGlkOiB0LFxuICAgICAgICB0eXBlOiBcInJhZGlvXCIsXG4gICAgICAgIG5hbWU6IHIsXG4gICAgICAgIHJlZjogY1xuICAgICAgfSwgZikpLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImxhYmVsXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1yYWRpb19fbGFiZWxcIixcbiAgICAgICAgaHRtbEZvcjogdFxuICAgICAgfSwgdSwgZCAmJiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWNoZWNrYm94X19sYWJlbC1kZXNjcmlwdGlvblwiXG4gICAgICB9LCBkKSkpO1xuICAgIH07XG5cbiAgICB0LlJhZGlvID0gdTtcbiAgICB2YXIgYyA9IHU7XG4gICAgdC5kZWZhdWx0ID0gYztcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuUmFuZ2VJbnB1dCA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTIwID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kyMCA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSkge1xuICAgICAgdmFyIHQgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICByID0gZS5pbnB1dFJlZixcbiAgICAgICAgICBvID0gbChlLCBbXCJjbGFzc05hbWVcIiwgXCJpbnB1dFJlZlwiXSksXG4gICAgICAgICAgdSA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLXJhbmdlXCIsIHQpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiwgX2kyMCh7XG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJyYW5nZVwiLFxuICAgICAgICBjbGFzc05hbWU6IHUsXG4gICAgICAgIHJlZjogcixcbiAgICAgICAgdHlwZTogXCJyYW5nZVwiXG4gICAgICB9LCBvKSk7XG4gICAgfTtcblxuICAgIHQuUmFuZ2VJbnB1dCA9IHU7XG4gICAgdmFyIGMgPSB1O1xuICAgIHQuZGVmYXVsdCA9IGM7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LlRpbWVQaWNrZXIgPSB2b2lkIDA7XG5cbiAgICB2YXIgYSxcbiAgICAgICAgbiA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICBpZiAoIXQgJiYgZSAmJiBlLl9fZXNNb2R1bGUpIHJldHVybiBlO1xuICAgICAgaWYgKG51bGwgPT09IGUgfHwgXCJvYmplY3RcIiAhPSB0eXBlb2YgZSAmJiBcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIGUpIHJldHVybiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgICB2YXIgciA9IGQodCk7XG4gICAgICBpZiAociAmJiByLmhhcyhlKSkgcmV0dXJuIHIuZ2V0KGUpO1xuICAgICAgdmFyIGEgPSB7fSxcbiAgICAgICAgICBuID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbiAgICAgIGZvciAodmFyIG8gaW4gZSkge1xuICAgICAgICBpZiAoXCJkZWZhdWx0XCIgIT09IG8gJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIG8pKSB7XG4gICAgICAgICAgdmFyIGkgPSBuID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCBvKSA6IG51bGw7XG4gICAgICAgICAgaSAmJiAoaS5nZXQgfHwgaS5zZXQpID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsIG8sIGkpIDogYVtvXSA9IGVbb107XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYS5kZWZhdWx0ID0gZSwgciAmJiByLnNldChlLCBhKTtcbiAgICAgIHJldHVybiBhO1xuICAgIH0ocigwKSksXG4gICAgICAgIG8gPSAoYSA9IHIoMSkpICYmIGEuX19lc01vZHVsZSA/IGEgOiB7XG4gICAgICBkZWZhdWx0OiBhXG4gICAgfSxcbiAgICAgICAgaSA9IHIoOCksXG4gICAgICAgIGwgPSByKDUpLFxuICAgICAgICB1ID0gcigxMSksXG4gICAgICAgIGMgPSByKDY3KSxcbiAgICAgICAgcyA9IHIoNjgpO1xuXG4gICAgZnVuY3Rpb24gZChlKSB7XG4gICAgICBpZiAoXCJmdW5jdGlvblwiICE9IHR5cGVvZiBXZWFrTWFwKSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciB0ID0gbmV3IFdlYWtNYXAoKSxcbiAgICAgICAgICByID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgIHJldHVybiAoZCA9IGZ1bmN0aW9uIGQoZSkge1xuICAgICAgICByZXR1cm4gZSA/IHIgOiB0O1xuICAgICAgfSkoZSk7XG4gICAgfVxuXG4gICAgdC5UaW1lUGlja2VyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0ID0gZS5pZCxcbiAgICAgICAgICByID0gZS5uYW1lLFxuICAgICAgICAgIGEgPSBlLm9uQ2hhbmdlLFxuICAgICAgICAgIGQgPSBlLmxhYmVsLFxuICAgICAgICAgIGYgPSBlLmRlZmF1bHRWYWx1ZSxcbiAgICAgICAgICBwID0gZS5kaXNhYmxlZCxcbiAgICAgICAgICBtID0gZS5taW5UaW1lLFxuICAgICAgICAgIHkgPSB2b2lkIDAgPT09IG0gPyBzLkRFRkFVTFRfTUlOX1RJTUUgOiBtLFxuICAgICAgICAgIGIgPSBlLm1heFRpbWUsXG4gICAgICAgICAgdiA9IHZvaWQgMCA9PT0gYiA/IHMuREVGQVVMVF9NQVhfVElNRSA6IGIsXG4gICAgICAgICAgTyA9IGUuc3RlcCxcbiAgICAgICAgICBnID0gdm9pZCAwID09PSBPID8gcy5ERUZBVUxUX1NURVAgOiBPLFxuICAgICAgICAgIF8gPSBlLmhpbnQsXG4gICAgICAgICAgaCA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIGogPSAoMCwgby5kZWZhdWx0KShcInVzYS10aW1lLXBpY2tlclwiLCBoKSxcbiAgICAgICAgICBNID0gKDAsIGMucGFyc2VUaW1lU3RyaW5nKSh5KSB8fCBzLkRFRkFVTFRfTUlOX1RJTUVfTUlOVVRFUyxcbiAgICAgICAgICBOID0gKDAsIGMucGFyc2VUaW1lU3RyaW5nKSh2KSB8fCBzLkRFRkFVTFRfTUFYX1RJTUVfTUlOVVRFUyxcbiAgICAgICAgICBFID0gZyA8IHMuTUlOX1NURVAgPyBzLk1JTl9TVEVQIDogZyxcbiAgICAgICAgICBQID0gKDAsIG4udXNlTWVtbykoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gKDAsIGMuZ2V0VGltZU9wdGlvbnMpKE0sIE4sIEUpO1xuICAgICAgfSwgW3ksIHYsIGddKSxcbiAgICAgICAgICB3ID0gciArIFwiLWxhYmVsXCIsXG4gICAgICAgICAgSSA9IHIgKyBcIi1oaW50XCI7XG4gICAgICByZXR1cm4gbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoaS5Gb3JtR3JvdXAsIG51bGwsIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KGwuTGFiZWwsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1sYWJlbFwiLFxuICAgICAgICBpZDogdyxcbiAgICAgICAgaHRtbEZvcjogdFxuICAgICAgfSwgZCksIF8gJiYgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWhpbnRcIixcbiAgICAgICAgaWQ6IElcbiAgICAgIH0sIF8pLCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh1LkNvbWJvQm94LCB7XG4gICAgICAgIGlkOiB0LFxuICAgICAgICBuYW1lOiByLFxuICAgICAgICBjbGFzc05hbWU6IGosXG4gICAgICAgIG9uQ2hhbmdlOiBhLFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGYsXG4gICAgICAgIG9wdGlvbnM6IFAsXG4gICAgICAgIGRpc2FibGVkOiBwLFxuICAgICAgICBjdXN0b21GaWx0ZXI6IHMuVElNRV9QSUNLRVJfQ1VTVE9NX0ZJTFRFUixcbiAgICAgICAgZGlzYWJsZUZpbHRlcmluZzogITBcbiAgICAgIH0pKTtcbiAgICB9O1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5nZXRUaW1lT3B0aW9ucyA9IHQucGFyc2VUaW1lU3RyaW5nID0gdm9pZCAwO1xuXG4gICAgdC5wYXJzZVRpbWVTdHJpbmcgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQ7XG5cbiAgICAgIGlmIChlKSB7XG4gICAgICAgIHZhciByID0gZS5zcGxpdChcIjpcIikubWFwKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgdmFyIHQsXG4gICAgICAgICAgICAgIHIgPSBwYXJzZUludChlLCAxMCk7XG4gICAgICAgICAgcmV0dXJuIE51bWJlci5pc05hTihyKSB8fCAodCA9IHIpLCB0O1xuICAgICAgICB9KSxcbiAgICAgICAgICAgIGEgPSByWzBdLFxuICAgICAgICAgICAgbiA9IHJbMV07XG4gICAgICAgIG51bGwgIT0gYSAmJiBudWxsICE9IG4gJiYgKHQgPSA2MCAqIGEgKyBuKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcblxuICAgIHZhciBhID0gZnVuY3Rpb24gYShlKSB7XG4gICAgICB2YXIgdCA9IGUgJSA2MCxcbiAgICAgICAgICByID0gTWF0aC5mbG9vcihlIC8gNjApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbWludXRlOiB0LFxuICAgICAgICBob3VyMjQ6IHIsXG4gICAgICAgIGhvdXIxMjogciAlIDEyIHx8IDEyLFxuICAgICAgICBhbXBtOiByIDwgMTIgPyBcImFtXCIgOiBcInBtXCJcbiAgICAgIH07XG4gICAgfSxcbiAgICAgICAgbiA9IGZ1bmN0aW9uIG4oZSwgdCkge1xuICAgICAgcmV0dXJuIChcIjAwMDBcIiArIGUpLnNsaWNlKC10KTtcbiAgICB9O1xuXG4gICAgdC5nZXRUaW1lT3B0aW9ucyA9IGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgICBmb3IgKHZhciBvID0gW10sIGkgPSBlOyBpIDw9IHQ7IGkgKz0gcikge1xuICAgICAgICB2YXIgbCA9IGEoaSksXG4gICAgICAgICAgICB1ID0gbC5taW51dGUsXG4gICAgICAgICAgICBjID0gbC5ob3VyMjQsXG4gICAgICAgICAgICBzID0gbC5ob3VyMTIsXG4gICAgICAgICAgICBkID0gbC5hbXBtO1xuICAgICAgICBvLnB1c2goe1xuICAgICAgICAgIHZhbHVlOiBuKGMsIDIpICsgXCI6XCIgKyBuKHUsIDIpLFxuICAgICAgICAgIGxhYmVsOiBzICsgXCI6XCIgKyBuKHUsIDIpICsgZFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG87XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuVElNRV9QSUNLRVJfQ1VTVE9NX0ZJTFRFUiA9IHQuTUlOX1NURVAgPSB0LkRFRkFVTFRfU1RFUCA9IHQuREVGQVVMVF9NSU5fVElNRV9NSU5VVEVTID0gdC5ERUZBVUxUX01JTl9USU1FID0gdC5ERUZBVUxUX01BWF9USU1FX01JTlVURVMgPSB0LkRFRkFVTFRfTUFYX1RJTUUgPSB2b2lkIDA7XG4gICAgdC5ERUZBVUxUX01BWF9USU1FID0gXCIyMzo1OVwiO1xuICAgIHQuREVGQVVMVF9NQVhfVElNRV9NSU5VVEVTID0gMTQzOTtcbiAgICB0LkRFRkFVTFRfTUlOX1RJTUUgPSBcIjAwOjAwXCI7XG4gICAgdC5ERUZBVUxUX01JTl9USU1FX01JTlVURVMgPSAwO1xuICAgIHQuREVGQVVMVF9TVEVQID0gMzA7XG4gICAgdC5NSU5fU1RFUCA9IDE7XG4gICAgdC5USU1FX1BJQ0tFUl9DVVNUT01fRklMVEVSID0ge1xuICAgICAgZmlsdGVyOiBcIjA/e3sgaG91clF1ZXJ5RmlsdGVyIH19Ont7bWludXRlUXVlcnlGaWx0ZXJ9fS4qe3sgYXBRdWVyeUZpbHRlciB9fW0/XCIsXG4gICAgICBleHRyYXM6IHtcbiAgICAgICAgYXBRdWVyeUZpbHRlcjogXCIoW2FwXSlcIixcbiAgICAgICAgaG91clF1ZXJ5RmlsdGVyOiBcIihbMS05XVswLTJdPylcIixcbiAgICAgICAgbWludXRlUXVlcnlGaWx0ZXI6IFwiW1xcXFxkXSs6KFswLTldezAsMn0pXCJcbiAgICAgIH1cbiAgICB9O1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZWZhdWx0ID0gdC5WYWxpZGF0aW9uQ2hlY2tsaXN0ID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDApKSxcbiAgICAgICAgbiA9IG8ocigxKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9pMjEgPSBmdW5jdGlvbiBpKCkge1xuICAgICAgcmV0dXJuIChfaTIxID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBsID0gZnVuY3Rpb24gbChlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9LFxuICAgICAgICB1ID0gZnVuY3Rpb24gdShlKSB7XG4gICAgICB2YXIgdCA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgciA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIG8gPSBsKGUsIFtcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCJdKSxcbiAgICAgICAgICB1ID0gKDAsIG4uZGVmYXVsdCkociwgXCJ1c2EtY2hlY2tsaXN0XCIpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwidWxcIiwgX2kyMSh7XG4gICAgICAgIGNsYXNzTmFtZTogdSxcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcInZhbGlkYXRpb25DaGVja2xpc3RcIlxuICAgICAgfSwgbyksIHQpO1xuICAgIH07XG5cbiAgICB0LlZhbGlkYXRpb25DaGVja2xpc3QgPSB1O1xuICAgIHZhciBjID0gdTtcbiAgICB0LmRlZmF1bHQgPSBjO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZWZhdWx0ID0gdC5WYWxpZGF0aW9uSXRlbSA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTIyID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kyMiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSkge1xuICAgICAgdmFyIHQgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIHIgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBvID0gZS5pc1ZhbGlkLFxuICAgICAgICAgIHUgPSBsKGUsIFtcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwiaXNWYWxpZFwiXSksXG4gICAgICAgICAgYyA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLWNoZWNrbGlzdF9faXRlbVwiLCB7XG4gICAgICAgIFwidXNhLWNoZWNrbGlzdF9faXRlbS0tY2hlY2tlZFwiOiBvXG4gICAgICB9LCByKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImxpXCIsIF9pMjIoe1xuICAgICAgICBjbGFzc05hbWU6IGNcbiAgICAgIH0sIHUpLCB0KTtcbiAgICB9O1xuXG4gICAgdC5WYWxpZGF0aW9uSXRlbSA9IHU7XG4gICAgdmFyIGMgPSB1O1xuICAgIHQuZGVmYXVsdCA9IGM7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0LkV4dGVuZGVkTmF2ID0gdm9pZCAwO1xuICAgIHZhciBhID0gbChyKDApKSxcbiAgICAgICAgbiA9IGwocigxKSksXG4gICAgICAgIG8gPSByKDEzKSxcbiAgICAgICAgaSA9IHIoNCk7XG5cbiAgICBmdW5jdGlvbiBsKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF91MiA9IGZ1bmN0aW9uIHUoKSB7XG4gICAgICByZXR1cm4gKF91MiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgYyA9IGZ1bmN0aW9uIGMoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICAgICAgcyA9IGZ1bmN0aW9uIHMoZSkge1xuICAgICAgdmFyIHQgPSBlLnByaW1hcnlJdGVtcyxcbiAgICAgICAgICByID0gZS5zZWNvbmRhcnlJdGVtcyxcbiAgICAgICAgICBsID0gZS5tb2JpbGVFeHBhbmRlZCxcbiAgICAgICAgICBzID0gdm9pZCAwICE9PSBsICYmIGwsXG4gICAgICAgICAgZCA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgZiA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHAgPSBlLm9uVG9nZ2xlTW9iaWxlTmF2LFxuICAgICAgICAgIG0gPSBjKGUsIFtcInByaW1hcnlJdGVtc1wiLCBcInNlY29uZGFyeUl0ZW1zXCIsIFwibW9iaWxlRXhwYW5kZWRcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcIm9uVG9nZ2xlTW9iaWxlTmF2XCJdKSxcbiAgICAgICAgICB5ID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtbmF2XCIsIHtcbiAgICAgICAgXCJpcy12aXNpYmxlXCI6IHNcbiAgICAgIH0sIGYpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwibmF2XCIsIF91Mih7XG4gICAgICAgIGNsYXNzTmFtZTogeVxuICAgICAgfSwgbSksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1uYXZfX2lubmVyXCJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KG8uTmF2Q2xvc2VCdXR0b24sIHtcbiAgICAgICAgb25DbGljazogcFxuICAgICAgfSksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGkuTmF2TGlzdCwge1xuICAgICAgICBpdGVtczogdCxcbiAgICAgICAgdHlwZTogXCJwcmltYXJ5XCJcbiAgICAgIH0pLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtbmF2X19zZWNvbmRhcnlcIlxuICAgICAgfSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoaS5OYXZMaXN0LCB7XG4gICAgICAgIGl0ZW1zOiByLFxuICAgICAgICB0eXBlOiBcInNlY29uZGFyeVwiXG4gICAgICB9KSwgZCkpKTtcbiAgICB9O1xuXG4gICAgdC5FeHRlbmRlZE5hdiA9IHM7XG4gICAgdmFyIGQgPSBzO1xuICAgIHQuZGVmYXVsdCA9IGQ7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICByLnIodCksIHQuZGVmYXVsdCA9IFwiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJsYm1OdlpHbHVaejBpVlZSR0xUZ2lQejQ4YzNabklIaHRiRzV6UFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eU1EQXdMM04yWnlJZ2QybGtkR2c5SWpZMElpQm9aV2xuYUhROUlqWTBJaUIyYVdWM1FtOTRQU0l3SURBZ05qUWdOalFpUGp4MGFYUnNaVDVqYkc5elpUd3ZkR2wwYkdVK1BIQmhkR2dnWm1sc2JEMGlJelUyTlVNMk5TSWdabWxzYkMxeWRXeGxQU0psZG1WdWIyUmtJaUJrUFNKTk5UY3VNRFF5SURFdU1UVnNOUzQ0TURrZ05TNDRNRGhoTkNBMElEQWdNQ0F4SURBZ05TNDJOVGRNTkRNdU5EWTFJRE15YkRFNUxqTTROaUF4T1M0ek9EVmhOQ0EwSURBZ01DQXhJREFnTlM0Mk5UZHNMVFV1T0RBNUlEVXVPREE1WVRRZ05DQXdJREFnTVMwMUxqWTFOeUF3VERNeUlEUXpMalEyTlNBeE1pNDJNVFVnTmpJdU9EVXhZVFFnTkNBd0lEQWdNUzAxTGpZMU55QXdiQzAxTGpnd09TMDFMamd3T1dFMElEUWdNQ0F3SURFZ01DMDFMalkxTjB3eU1DNDFNelVnTXpJZ01TNHhORGtnTVRJdU5qRTFZVFFnTkNBd0lEQWdNU0F3TFRVdU5qVTNiRFV1T0RBNUxUVXVPREE1WVRRZ05DQXdJREFnTVNBMUxqWTFOeUF3VERNeUlESXdMalV6TlNBMU1TNHpPRFVnTVM0eE5EbGhOQ0EwSURBZ01DQXhJRFV1TmpVM0lEQjZJaTgrUEM5emRtYytcIjtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuSGVhZGVyID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDApKSxcbiAgICAgICAgbiA9IG8ocigxKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9pMjMgPSBmdW5jdGlvbiBpKCkge1xuICAgICAgcmV0dXJuIChfaTIzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBsID0gZnVuY3Rpb24gbChlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuXG4gICAgdC5IZWFkZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLmJhc2ljLFxuICAgICAgICAgIHIgPSBlLmV4dGVuZGVkLFxuICAgICAgICAgIG8gPSBlLmJhc2ljV2l0aE1lZ2FNZW51LFxuICAgICAgICAgIHUgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIGMgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBzID0gbChlLCBbXCJiYXNpY1wiLCBcImV4dGVuZGVkXCIsIFwiYmFzaWNXaXRoTWVnYU1lbnVcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiXSksXG4gICAgICAgICAgZCA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLWhlYWRlclwiLCB7XG4gICAgICAgIFwidXNhLWhlYWRlci0tYmFzaWNcIjogdCxcbiAgICAgICAgXCJ1c2EtaGVhZGVyLS1tZWdhbWVudVwiOiBvLFxuICAgICAgICBcInVzYS1oZWFkZXItLWV4dGVuZGVkXCI6IHJcbiAgICAgIH0sIGMpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiaGVhZGVyXCIsIF9pMjMoe1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiaGVhZGVyXCIsXG4gICAgICAgIGNsYXNzTmFtZTogZFxuICAgICAgfSwgcyksIHUpO1xuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0Lk1lZ2FNZW51ID0gdm9pZCAwO1xuICAgIHZhciBhID0gaShyKDApKSxcbiAgICAgICAgbiA9IGkocigxKSksXG4gICAgICAgIG8gPSByKDQpO1xuXG4gICAgZnVuY3Rpb24gaShlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfbDkgPSBmdW5jdGlvbiBsKCkge1xuICAgICAgcmV0dXJuIChfbDkgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIGMgPSBmdW5jdGlvbiBjKGUpIHtcbiAgICAgIHZhciB0ID0gZS5pdGVtcyxcbiAgICAgICAgICByID0gZS5pc09wZW4sXG4gICAgICAgICAgaSA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIGMgPSB1KGUsIFtcIml0ZW1zXCIsIFwiaXNPcGVuXCIsIFwiY2xhc3NOYW1lXCJdKSxcbiAgICAgICAgICBzID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtbmF2X19zdWJtZW51IHVzYS1tZWdhbWVudVwiLCBpKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogcyxcbiAgICAgICAgaGlkZGVuOiAhcixcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcIm1lZ2FtZW51XCJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcImdyaWQtcm93IGdyaWQtZ2FwLTRcIlxuICAgICAgfSwgdC5tYXAoZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IFwidXNhLWNvbFwiLFxuICAgICAgICAgIGtleTogXCJzdWJuYXZfY29sX1wiICsgdFxuICAgICAgICB9LCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChvLk5hdkxpc3QsIF9sOSh7XG4gICAgICAgICAgaXRlbXM6IGUsXG4gICAgICAgICAgdHlwZTogXCJtZWdhbWVudVwiXG4gICAgICAgIH0sIGMpKSk7XG4gICAgICB9KSkpO1xuICAgIH07XG5cbiAgICB0Lk1lZ2FNZW51ID0gYztcbiAgICB2YXIgcyA9IGM7XG4gICAgdC5kZWZhdWx0ID0gcztcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuTWVudSA9IHZvaWQgMDtcbiAgICB2YXIgYSxcbiAgICAgICAgbiA9IChhID0gcigwKSkgJiYgYS5fX2VzTW9kdWxlID8gYSA6IHtcbiAgICAgIGRlZmF1bHQ6IGFcbiAgICB9LFxuICAgICAgICBvID0gcig0KTtcblxuICAgIHZhciBfaTI0ID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kyNCA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSkge1xuICAgICAgdmFyIHQgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICByID0gZS5pdGVtcyxcbiAgICAgICAgICBhID0gZS5pc09wZW4sXG4gICAgICAgICAgdSA9IGwoZSwgW1wiY2xhc3NOYW1lXCIsIFwiaXRlbXNcIiwgXCJpc09wZW5cIl0pO1xuICAgICAgcmV0dXJuIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KG8uTmF2TGlzdCwgX2kyNCh7XG4gICAgICAgIGNsYXNzTmFtZTogdCxcbiAgICAgICAgaXRlbXM6IHIsXG4gICAgICAgIHR5cGU6IFwic3VibmF2XCIsXG4gICAgICAgIGhpZGRlbjogIWFcbiAgICAgIH0sIHUpKTtcbiAgICB9O1xuXG4gICAgdC5NZW51ID0gdTtcbiAgICB2YXIgYyA9IHU7XG4gICAgdC5kZWZhdWx0ID0gYztcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuTmF2TWVudUJ1dHRvbiA9IHZvaWQgMDtcbiAgICB2YXIgYSxcbiAgICAgICAgbiA9IChhID0gcigwKSkgJiYgYS5fX2VzTW9kdWxlID8gYSA6IHtcbiAgICAgIGRlZmF1bHQ6IGFcbiAgICB9O1xuXG4gICAgdmFyIF9vID0gZnVuY3Rpb24gbygpIHtcbiAgICAgIHJldHVybiAoX28gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGkgPSBmdW5jdGlvbiBpKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH07XG5cbiAgICB0Lk5hdk1lbnVCdXR0b24gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLmxhYmVsLFxuICAgICAgICAgIHIgPSBlLm9uQ2xpY2ssXG4gICAgICAgICAgYSA9IGkoZSwgW1wibGFiZWxcIiwgXCJvbkNsaWNrXCJdKTtcbiAgICAgIHJldHVybiBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCBfbyh7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtbWVudS1idG5cIixcbiAgICAgICAgb25DbGljazogcixcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcIm5hdk1lbnVCdXR0b25cIlxuICAgICAgfSwgYSwge1xuICAgICAgICB0eXBlOiBcImJ1dHRvblwiXG4gICAgICB9KSwgdCk7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuTmF2RHJvcERvd25CdXR0b24gPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2kyNSA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pMjUgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIHZhciB0ID0gZS5sYWJlbCxcbiAgICAgICAgICByID0gZS5tZW51SWQsXG4gICAgICAgICAgbyA9IGUuaXNPcGVuLFxuICAgICAgICAgIHUgPSBlLm9uVG9nZ2xlLFxuICAgICAgICAgIGMgPSBlLmlzQ3VycmVudCxcbiAgICAgICAgICBzID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgZCA9IGwoZSwgW1wibGFiZWxcIiwgXCJtZW51SWRcIiwgXCJpc09wZW5cIiwgXCJvblRvZ2dsZVwiLCBcImlzQ3VycmVudFwiLCBcImNsYXNzTmFtZVwiXSksXG4gICAgICAgICAgZiA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLWFjY29yZGlvbl9fYnV0dG9uXCIsIFwidXNhLW5hdl9fbGlua1wiLCB7XG4gICAgICAgIFwidXNhLWN1cnJlbnRcIjogY1xuICAgICAgfSwgcyk7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwgX2kyNSh7XG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJuYXZEcm9wRG93bkJ1dHRvblwiLFxuICAgICAgICBjbGFzc05hbWU6IGYsXG4gICAgICAgIFwiYXJpYS1leHBhbmRlZFwiOiBvLFxuICAgICAgICBcImFyaWEtY29udHJvbHNcIjogcixcbiAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcbiAgICAgICAgICByZXR1cm4gdSgpO1xuICAgICAgICB9XG4gICAgICB9LCBkLCB7XG4gICAgICAgIHR5cGU6IFwiYnV0dG9uXCJcbiAgICAgIH0pLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgdCkpO1xuICAgIH07XG5cbiAgICB0Lk5hdkRyb3BEb3duQnV0dG9uID0gdTtcbiAgICB2YXIgYyA9IHU7XG4gICAgdC5kZWZhdWx0ID0gYztcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuUHJpbWFyeU5hdiA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IGwocigwKSksXG4gICAgICAgIG4gPSBsKHIoMSkpLFxuICAgICAgICBvID0gcigxMyksXG4gICAgICAgIGkgPSByKDQpO1xuXG4gICAgZnVuY3Rpb24gbChlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfdTMgPSBmdW5jdGlvbiB1KCkge1xuICAgICAgcmV0dXJuIChfdTMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGMgPSBmdW5jdGlvbiBjKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIHMgPSBmdW5jdGlvbiBzKGUpIHtcbiAgICAgIHZhciB0ID0gZS5pdGVtcyxcbiAgICAgICAgICByID0gZS5vblRvZ2dsZU1vYmlsZU5hdixcbiAgICAgICAgICBsID0gZS5tb2JpbGVFeHBhbmRlZCxcbiAgICAgICAgICBzID0gZS5jaGlsZHJlbixcbiAgICAgICAgICBkID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgZiA9IGMoZSwgW1wiaXRlbXNcIiwgXCJvblRvZ2dsZU1vYmlsZU5hdlwiLCBcIm1vYmlsZUV4cGFuZGVkXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIl0pLFxuICAgICAgICAgIHAgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1uYXZcIiwge1xuICAgICAgICBcImlzLXZpc2libGVcIjogbFxuICAgICAgfSwgZCk7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJuYXZcIiwgX3UzKHtcbiAgICAgICAgY2xhc3NOYW1lOiBwXG4gICAgICB9LCBmKSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoby5OYXZDbG9zZUJ1dHRvbiwge1xuICAgICAgICBvbkNsaWNrOiByXG4gICAgICB9KSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoaS5OYXZMaXN0LCB7XG4gICAgICAgIGl0ZW1zOiB0LFxuICAgICAgICB0eXBlOiBcInByaW1hcnlcIlxuICAgICAgfSksIHMpO1xuICAgIH07XG5cbiAgICB0LlByaW1hcnlOYXYgPSBzO1xuICAgIHZhciBkID0gcztcbiAgICB0LmRlZmF1bHQgPSBkO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZWZhdWx0ID0gdC5UaXRsZSA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTI2ID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kyNiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSkge1xuICAgICAgdmFyIHQgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICByID0gZS5jaGlsZHJlbixcbiAgICAgICAgICBvID0gbChlLCBbXCJjbGFzc05hbWVcIiwgXCJjaGlsZHJlblwiXSksXG4gICAgICAgICAgdSA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLWxvZ29cIiwgdCk7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2kyNih7XG4gICAgICAgIGNsYXNzTmFtZTogdVxuICAgICAgfSwgbyksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZW1cIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWxvZ29fX3RleHRcIlxuICAgICAgfSwgcikpO1xuICAgIH07XG5cbiAgICB0LlRpdGxlID0gdTtcbiAgICB2YXIgYyA9IHU7XG4gICAgdC5kZWZhdWx0ID0gYztcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuSWRlbnRpZmllciA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTI3ID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kyNyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSkge1xuICAgICAgdmFyIHQgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICByID0gZS5jaGlsZHJlbixcbiAgICAgICAgICBvID0gbChlLCBbXCJjbGFzc05hbWVcIiwgXCJjaGlsZHJlblwiXSksXG4gICAgICAgICAgdSA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLWlkZW50aWZpZXJcIiwgdCk7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2kyNyh7XG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJpZGVudGlmaWVyXCIsXG4gICAgICAgIGNsYXNzTmFtZTogdVxuICAgICAgfSwgbyksIHIpO1xuICAgIH07XG5cbiAgICB0LklkZW50aWZpZXIgPSB1O1xuICAgIHZhciBjID0gdTtcbiAgICB0LmRlZmF1bHQgPSBjO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZWZhdWx0ID0gdC5JZGVudGlmaWVyR292ID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDApKSxcbiAgICAgICAgbiA9IG8ocigxKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9pMjggPSBmdW5jdGlvbiBpKCkge1xuICAgICAgcmV0dXJuIChfaTI4ID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBsID0gZnVuY3Rpb24gbChlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9LFxuICAgICAgICB1ID0gZnVuY3Rpb24gdShlKSB7XG4gICAgICB2YXIgdCA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgciA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIG8gPSBsKGUsIFtcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCJdKSxcbiAgICAgICAgICB1ID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtaWRlbnRpZmllcl9fc2VjdGlvbiB1c2EtaWRlbnRpZmllcl9fc2VjdGlvbi0tdXNhZ292XCIsIHIpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic2VjdGlvblwiLCBfaTI4KHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImlkZW50aWZpZXJHb3ZcIixcbiAgICAgICAgY2xhc3NOYW1lOiB1XG4gICAgICB9LCBvKSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWlkZW50aWZpZXJfX2NvbnRhaW5lclwiXG4gICAgICB9LCB0KSk7XG4gICAgfTtcblxuICAgIHQuSWRlbnRpZmllckdvdiA9IHU7XG4gICAgdmFyIGMgPSB1O1xuICAgIHQuZGVmYXVsdCA9IGM7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0LklkZW50aWZpZXJJZGVudGl0eSA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTI5ID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kyOSA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSkge1xuICAgICAgdmFyIHQgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIHIgPSBlLmRvbWFpbixcbiAgICAgICAgICBvID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgdSA9IGwoZSwgW1wiY2hpbGRyZW5cIiwgXCJkb21haW5cIiwgXCJjbGFzc05hbWVcIl0pLFxuICAgICAgICAgIGMgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1pZGVudGlmaWVyX19pZGVudGl0eVwiLCBvKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfaTI5KHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImlkZW50aWZpZXJJZGVudGl0eVwiLFxuICAgICAgICBjbGFzc05hbWU6IGNcbiAgICAgIH0sIHUpLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInBcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWlkZW50aWZpZXJfX2lkZW50aXR5LWRvbWFpblwiXG4gICAgICB9LCByKSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJwXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1pZGVudGlmaWVyX19pZGVudGl0eS1kaXNjbGFpbWVyXCJcbiAgICAgIH0sIHQpKTtcbiAgICB9O1xuXG4gICAgdC5JZGVudGlmaWVySWRlbnRpdHkgPSB1O1xuICAgIHZhciBjID0gdTtcbiAgICB0LmRlZmF1bHQgPSBjO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5JZGVudGlmaWVyTGluayA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHIgPSB1KGUsIFtcImNsYXNzTmFtZVwiXSksXG4gICAgICAgICAgaSA9ICgwLCBuLmRlZmF1bHQpKHQsIFwidXNhLWlkZW50aWZpZXJfX3JlcXVpcmVkLWxpbmtcIiksXG4gICAgICAgICAgYyA9IF9sMTAoX2wxMCh7fSwgciksIHtcbiAgICAgICAgY2xhc3NOYW1lOiBpXG4gICAgICB9KTtcblxuICAgICAgaWYgKCgwLCBvLmlzQ3VzdG9tUHJvcHMpKGMpKSByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoby5MaW5rLCBfbDEwKHt9LCBjKSk7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoby5MaW5rLCBfbDEwKHt9LCBjKSk7XG4gICAgfTtcbiAgICB2YXIgYSA9IGkocigwKSksXG4gICAgICAgIG4gPSBpKHIoMSkpLFxuICAgICAgICBvID0gcigxMCk7XG5cbiAgICBmdW5jdGlvbiBpKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9sMTAgPSBmdW5jdGlvbiBsKCkge1xuICAgICAgcmV0dXJuIChfbDEwID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICB1ID0gZnVuY3Rpb24gdShlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5JZGVudGlmaWVyTGlua0l0ZW0gPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2kzMCA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pMzAgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH07XG5cbiAgICB0LklkZW50aWZpZXJMaW5rSXRlbSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgciA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIG8gPSBsKGUsIFtcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCJdKSxcbiAgICAgICAgICB1ID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtaWRlbnRpZmllcl9fcmVxdWlyZWQtbGlua3MtaXRlbVwiLCByKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImxpXCIsIF9pMzAoe1xuICAgICAgICBjbGFzc05hbWU6IHVcbiAgICAgIH0sIG8pLCB0KTtcbiAgICB9O1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZWZhdWx0ID0gdC5JZGVudGlmaWVyTGlua3MgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2kzMSA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pMzEgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUpIHtcbiAgICAgIHZhciB0ID0gZS5jaGlsZHJlbixcbiAgICAgICAgICByID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgbyA9IGUubmF2UHJvcHMsXG4gICAgICAgICAgbCA9IGUubGlzdFByb3BzLFxuICAgICAgICAgIHUgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1pZGVudGlmaWVyX19zZWN0aW9uIHVzYS1pZGVudGlmaWVyX19zZWN0aW9uLS1yZXF1aXJlZC1saW5rc1wiLCByKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcIm5hdlwiLCBfaTMxKHtcbiAgICAgICAgY2xhc3NOYW1lOiB1XG4gICAgICB9LCBvKSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWlkZW50aWZpZXJfX2NvbnRhaW5lclwiXG4gICAgICB9LCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInVsXCIsIF9pMzEoe1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWlkZW50aWZpZXJfX3JlcXVpcmVkLWxpbmtzLWxpc3RcIlxuICAgICAgfSwgbCksIHQpKSk7XG4gICAgfTtcblxuICAgIHQuSWRlbnRpZmllckxpbmtzID0gbDtcbiAgICB2YXIgdSA9IGw7XG4gICAgdC5kZWZhdWx0ID0gdTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuSWRlbnRpZmllckxvZ28gPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2kzMiA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pMzIgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH07XG5cbiAgICB0LklkZW50aWZpZXJMb2dvID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0ID0gZS5jaGlsZHJlbixcbiAgICAgICAgICByID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgbyA9IGwoZSwgW1wiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIl0pLFxuICAgICAgICAgIHUgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1pZGVudGlmaWVyX19sb2dvXCIsIHIpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiYVwiLCBfaTMyKHtcbiAgICAgICAgY2xhc3NOYW1lOiB1XG4gICAgICB9LCBvKSwgdCk7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuSWRlbnRpZmllckxvZ29zID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDApKSxcbiAgICAgICAgbiA9IG8ocigxKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9pMzMgPSBmdW5jdGlvbiBpKCkge1xuICAgICAgcmV0dXJuIChfaTMzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBsID0gZnVuY3Rpb24gbChlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9LFxuICAgICAgICB1ID0gZnVuY3Rpb24gdShlKSB7XG4gICAgICB2YXIgdCA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgciA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIG8gPSBsKGUsIFtcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCJdKSxcbiAgICAgICAgICB1ID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtaWRlbnRpZmllcl9fbG9nb3NcIiwgcik7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2kzMyh7XG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJpZGVudGlmaWVyTG9nb3NcIixcbiAgICAgICAgY2xhc3NOYW1lOiB1XG4gICAgICB9LCBvKSwgdCk7XG4gICAgfTtcblxuICAgIHQuSWRlbnRpZmllckxvZ29zID0gdTtcbiAgICB2YXIgYyA9IHU7XG4gICAgdC5kZWZhdWx0ID0gYztcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuSWRlbnRpZmllck1hc3RoZWFkID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDApKSxcbiAgICAgICAgbiA9IG8ocigxKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9pMzQgPSBmdW5jdGlvbiBpKCkge1xuICAgICAgcmV0dXJuIChfaTM0ID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBsID0gZnVuY3Rpb24gbChlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9LFxuICAgICAgICB1ID0gZnVuY3Rpb24gdShlKSB7XG4gICAgICB2YXIgdCA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHIgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIG8gPSBsKGUsIFtcImNsYXNzTmFtZVwiLCBcImNoaWxkcmVuXCJdKSxcbiAgICAgICAgICB1ID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtaWRlbnRpZmllcl9fc2VjdGlvbiB1c2EtaWRlbnRpZmllcl9fc2VjdGlvbi0tbWFzdGhlYWRcIiwgdCk7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzZWN0aW9uXCIsIF9pMzQoe1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiaWRlbnRpZmllck1hc3RoZWFkXCIsXG4gICAgICAgIGNsYXNzTmFtZTogdVxuICAgICAgfSwgbyksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1pZGVudGlmaWVyX19jb250YWluZXJcIlxuICAgICAgfSwgcikpO1xuICAgIH07XG5cbiAgICB0LklkZW50aWZpZXJNYXN0aGVhZCA9IHU7XG4gICAgdmFyIGMgPSB1O1xuICAgIHQuZGVmYXVsdCA9IGM7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LkFkZHJlc3MgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBpKHIoMCkpLFxuICAgICAgICBuID0gaShyKDEpKSxcbiAgICAgICAgbyA9IHIoMik7XG5cbiAgICBmdW5jdGlvbiBpKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdC5BZGRyZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0ID0gZS5zaXplLFxuICAgICAgICAgIHIgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBpID0gZS5iaWcsXG4gICAgICAgICAgbCA9IGUubWVkaXVtLFxuICAgICAgICAgIHUgPSBlLnNsaW0sXG4gICAgICAgICAgYyA9IGUuaXRlbXM7XG4gICAgICBpICYmICgwLCBvLmRlcHJlY2F0aW9uV2FybmluZykoXCJGb290ZXJOYXYgcHJvcGVydHkgYmlnIGlzIGRlcHJlY2F0ZWQuICBVc2Ugc2l6ZVwiKSwgbCAmJiAoMCwgby5kZXByZWNhdGlvbldhcm5pbmcpKFwiRm9vdGVyTmF2IHByb3BlcnR5IG1lZGl1bSBpcyBkZXByZWNhdGVkLiAgVXNlIHNpemVcIiksIHUgJiYgKDAsIG8uZGVwcmVjYXRpb25XYXJuaW5nKShcIkZvb3Rlck5hdiBwcm9wZXJ0eSBzbGltIGlzIGRlcHJlY2F0ZWQuICBVc2Ugc2l6ZVwiKTtcbiAgICAgIHZhciBzID0gdCA/IFwiYmlnXCIgPT09IHQgOiBpLFxuICAgICAgICAgIGQgPSB0ID8gXCJtZWRpdW1cIiA9PT0gdCA6IGwsXG4gICAgICAgICAgZiA9IHQgPyBcInNsaW1cIiA9PT0gdCA6IHUsXG4gICAgICAgICAgcCA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLWZvb3Rlcl9fYWRkcmVzc1wiLCByKSxcbiAgICAgICAgICBtID0gKDAsIG4uZGVmYXVsdCkoe1xuICAgICAgICBcImdyaWQtY29sLWF1dG9cIjogcyB8fCBkLFxuICAgICAgICBcImdyaWQtY29sLWF1dG8gbW9iaWxlLWxnOmdyaWQtY29sLTEyIGRlc2t0b3A6Z3JpZC1jb2wtYXV0b1wiOiBmXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImFkZHJlc3NcIiwge1xuICAgICAgICBjbGFzc05hbWU6IHBcbiAgICAgIH0sIGYgPyBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJncmlkLXJvdyBncmlkLWdhcFwiXG4gICAgICB9LCBjLm1hcChmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICAgIGNsYXNzTmFtZTogbSxcbiAgICAgICAgICBrZXk6IFwiYWRkcmVzc0l0ZW0tXCIgKyB0XG4gICAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IFwidXNhLWZvb3Rlcl9fY29udGFjdC1pbmZvXCJcbiAgICAgICAgfSwgZSkpO1xuICAgICAgfSkpIDogYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWZvb3Rlcl9fY29udGFjdC1pbmZvIGdyaWQtcm93IGdyaWQtZ2FwXCJcbiAgICAgIH0sIGMubWFwKGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBtLFxuICAgICAgICAgIGtleTogXCJhZGRyZXNzSXRlbS1cIiArIHRcbiAgICAgICAgfSwgZSk7XG4gICAgICB9KSkpO1xuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LkZvb3RlciA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IGkocigwKSksXG4gICAgICAgIG4gPSBpKHIoMSkpLFxuICAgICAgICBvID0gcigyKTtcblxuICAgIGZ1bmN0aW9uIGkoZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2wxMSA9IGZ1bmN0aW9uIGwoKSB7XG4gICAgICByZXR1cm4gKF9sMTEgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH07XG5cbiAgICB0LkZvb3RlciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCA9IGUuc2l6ZSxcbiAgICAgICAgICByID0gZS5iaWcsXG4gICAgICAgICAgaSA9IGUubWVkaXVtLFxuICAgICAgICAgIGMgPSBlLnNsaW0sXG4gICAgICAgICAgcyA9IGUucmV0dXJuVG9Ub3AsXG4gICAgICAgICAgZCA9IGUucHJpbWFyeSxcbiAgICAgICAgICBmID0gZS5zZWNvbmRhcnksXG4gICAgICAgICAgcCA9IHUoZSwgW1wic2l6ZVwiLCBcImJpZ1wiLCBcIm1lZGl1bVwiLCBcInNsaW1cIiwgXCJyZXR1cm5Ub1RvcFwiLCBcInByaW1hcnlcIiwgXCJzZWNvbmRhcnlcIl0pO1xuICAgICAgciAmJiAoMCwgby5kZXByZWNhdGlvbldhcm5pbmcpKFwiRm9vdGVyIHByb3BlcnR5IGJpZyBpcyBkZXByZWNhdGVkLiAgVXNlIHNpemVcIiksIGkgJiYgKDAsIG8uZGVwcmVjYXRpb25XYXJuaW5nKShcIkZvb3RlciBwcm9wZXJ0eSBtZWRpdW0gaXMgZGVwcmVjYXRlZC4gIFVzZSBzaXplXCIpLCBjICYmICgwLCBvLmRlcHJlY2F0aW9uV2FybmluZykoXCJGb290ZXIgcHJvcGVydHkgc2xpbSBpcyBkZXByZWNhdGVkLiAgVXNlIHNpemVcIik7XG4gICAgICB2YXIgbSA9IHQgPyBcImJpZ1wiID09PSB0IDogcixcbiAgICAgICAgICB5ID0gdCA/IFwibWVkaXVtXCIgPT09IHQgOiBpLFxuICAgICAgICAgIGIgPSB0ID8gXCJzbGltXCIgPT09IHQgOiBjLFxuICAgICAgICAgIHYgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1mb290ZXJcIiwge1xuICAgICAgICBcInVzYS1mb290ZXItLWJpZ1wiOiBtLFxuICAgICAgICBcInVzYS1mb290ZXItLW1lZGl1bVwiOiB5LFxuICAgICAgICBcInVzYS1mb290ZXItLXNsaW1cIjogYlxuICAgICAgfSwgcC5jbGFzc05hbWUpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZm9vdGVyXCIsIF9sMTEoe30sIHAsIHtcbiAgICAgICAgY2xhc3NOYW1lOiB2XG4gICAgICB9KSwgcyAmJiBzLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtZm9vdGVyX19wcmltYXJ5LXNlY3Rpb25cIlxuICAgICAgfSwgZCksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1mb290ZXJfX3NlY29uZGFyeS1zZWN0aW9uXCJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcImdyaWQtY29udGFpbmVyXCJcbiAgICAgIH0sIGYpKSk7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuRm9vdGVyTmF2ID0gdm9pZCAwO1xuICAgIHZhciBhID0gbChyKDApKSxcbiAgICAgICAgbiA9IHIoMTgpLFxuICAgICAgICBvID0gbChyKDEpKSxcbiAgICAgICAgaSA9IHIoMik7XG5cbiAgICBmdW5jdGlvbiBsKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF91NCA9IGZ1bmN0aW9uIHUoKSB7XG4gICAgICByZXR1cm4gKF91NCA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgYyA9IGZ1bmN0aW9uIGMoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHMoZSkge1xuICAgICAgcmV0dXJuIGVbMF0uY29uc3RydWN0b3IgPT09IEFycmF5O1xuICAgIH1cblxuICAgIHQuRm9vdGVyTmF2ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0ID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgciA9IGUuc2l6ZSxcbiAgICAgICAgICBsID0gZS5iaWcsXG4gICAgICAgICAgZCA9IGUubWVkaXVtLFxuICAgICAgICAgIGYgPSBlLnNsaW0sXG4gICAgICAgICAgcCA9IGUuaXNNb2JpbGUsXG4gICAgICAgICAgbSA9IGUubGlua3MsXG4gICAgICAgICAgeSA9IGMoZSwgW1wiY2xhc3NOYW1lXCIsIFwic2l6ZVwiLCBcImJpZ1wiLCBcIm1lZGl1bVwiLCBcInNsaW1cIiwgXCJpc01vYmlsZVwiLCBcImxpbmtzXCJdKTtcbiAgICAgIGwgJiYgKDAsIGkuZGVwcmVjYXRpb25XYXJuaW5nKShcIkZvb3Rlck5hdiBwcm9wZXJ0eSBiaWcgaXMgZGVwcmVjYXRlZC4gIFVzZSBzaXplXCIpLCBkICYmICgwLCBpLmRlcHJlY2F0aW9uV2FybmluZykoXCJGb290ZXJOYXYgcHJvcGVydHkgbWVkaXVtIGlzIGRlcHJlY2F0ZWQuICBVc2Ugc2l6ZVwiKSwgZiAmJiAoMCwgaS5kZXByZWNhdGlvbldhcm5pbmcpKFwiRm9vdGVyTmF2IHByb3BlcnR5IHNsaW0gaXMgZGVwcmVjYXRlZC4gIFVzZSBzaXplXCIpO1xuXG4gICAgICB2YXIgYiA9IHIgPyBcImJpZ1wiID09PSByIDogbCxcbiAgICAgICAgICB2ID0gciA/IFwibWVkaXVtXCIgPT09IHIgOiBkLFxuICAgICAgICAgIE8gPSByID8gXCJzbGltXCIgPT09IHIgOiBmLFxuICAgICAgICAgIGcgPSAoMCwgby5kZWZhdWx0KShcInVzYS1mb290ZXJfX25hdlwiLCB0KSxcbiAgICAgICAgICBfID0gKDAsIG8uZGVmYXVsdCkoXCJkZXNrdG9wOmdyaWQtY29sLWF1dG8gdXNhLWZvb3Rlcl9fcHJpbWFyeS1jb250ZW50XCIsIHtcbiAgICAgICAgXCJtb2JpbGUtbGc6Z3JpZC1jb2wtNFwiOiBiIHx8IHYsXG4gICAgICAgIFwibW9iaWxlLWxnOmdyaWQtY29sLTZcIjogT1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcIm5hdlwiLCBfdTQoe1xuICAgICAgICBjbGFzc05hbWU6IGdcbiAgICAgIH0sIHkpLCBiICYmIHMobSkgJiYgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQobi5Gb290ZXJFeHRlbmRlZE5hdkxpc3QsIHtcbiAgICAgICAgaXNNb2JpbGU6IHAsXG4gICAgICAgIG5lc3RlZExpbmtzOiBtXG4gICAgICB9KSwgIXMobSkgJiYgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJncmlkLXJvdyBncmlkLWdhcFwiXG4gICAgICB9LCBtLm1hcChmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAgICAgICAga2V5OiBcIm5hdkxpbmstXCIgKyB0LFxuICAgICAgICAgIGNsYXNzTmFtZTogX1xuICAgICAgICB9LCBlKTtcbiAgICAgIH0pKSk7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuTG9nbyA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IGkocigwKSksXG4gICAgICAgIG4gPSBpKHIoMSkpLFxuICAgICAgICBvID0gcigyKTtcblxuICAgIGZ1bmN0aW9uIGkoZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfTtcblxuICAgIHQuTG9nbyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCA9IGUuc2l6ZSxcbiAgICAgICAgICByID0gZS5iaWcsXG4gICAgICAgICAgaSA9IGUubWVkaXVtLFxuICAgICAgICAgIHUgPSBlLnNsaW0sXG4gICAgICAgICAgYyA9IGUuaGVhZGluZyxcbiAgICAgICAgICBzID0gZS5pbWFnZSxcbiAgICAgICAgICBkID0gbChlLCBbXCJzaXplXCIsIFwiYmlnXCIsIFwibWVkaXVtXCIsIFwic2xpbVwiLCBcImhlYWRpbmdcIiwgXCJpbWFnZVwiXSk7XG4gICAgICByICYmICgwLCBvLmRlcHJlY2F0aW9uV2FybmluZykoXCJGb290ZXJOYXYgcHJvcGVydHkgYmlnIGlzIGRlcHJlY2F0ZWQuICBVc2Ugc2l6ZVwiKSwgaSAmJiAoMCwgby5kZXByZWNhdGlvbldhcm5pbmcpKFwiRm9vdGVyTmF2IHByb3BlcnR5IG1lZGl1bSBpcyBkZXByZWNhdGVkLiAgVXNlIHNpemVcIiksIHUgJiYgKDAsIG8uZGVwcmVjYXRpb25XYXJuaW5nKShcIkZvb3Rlck5hdiBwcm9wZXJ0eSBzbGltIGlzIGRlcHJlY2F0ZWQuICBVc2Ugc2l6ZVwiKTtcbiAgICAgIHZhciBmID0gdCA/IFwiYmlnXCIgPT09IHQgOiByLFxuICAgICAgICAgIHAgPSB0ID8gXCJtZWRpdW1cIiA9PT0gdCA6IGksXG4gICAgICAgICAgbSA9IHQgPyBcInNsaW1cIiA9PT0gdCA6IHUsXG4gICAgICAgICAgeSA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLWZvb3Rlcl9fbG9nbyBncmlkLXJvd1wiLCB7XG4gICAgICAgIFwibW9iaWxlLWxnOmdyaWQtY29sLTYgbW9iaWxlLWxnOmdyaWQtZ2FwLTJcIjogZiB8fCBwLFxuICAgICAgICBcImdyaWQtZ2FwLTJcIjogbVxuICAgICAgfSwgZC5jbGFzc05hbWUpLFxuICAgICAgICAgIGIgPSAoMCwgbi5kZWZhdWx0KSh7XG4gICAgICAgIFwibW9iaWxlLWxnOmdyaWQtY29sLWF1dG9cIjogZiB8fCBwLFxuICAgICAgICBcImdyaWQtY29sLWF1dG9cIjogbVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IHksXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJmb290ZXJMb2dvXCJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGEuZGVmYXVsdC5GcmFnbWVudCwgbnVsbCwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IGJcbiAgICAgIH0sIHMpLCBjICYmIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBiXG4gICAgICB9LCBjKSkpO1xuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LlNvY2lhbExpbmtzID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDApKSxcbiAgICAgICAgbiA9IG8ocigxKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdC5Tb2NpYWxMaW5rcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHIgPSBlLmxpbmtzLFxuICAgICAgICAgIG8gPSAoMCwgbi5kZWZhdWx0KShcInVzYS1mb290ZXJfX3NvY2lhbC1saW5rcyBncmlkLXJvdyBncmlkLWdhcC0xXCIsIHQpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBvXG4gICAgICB9LCByLm1hcChmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICAgIGtleTogXCJzb2NpYWxMaW5rXCIgKyB0LFxuICAgICAgICAgIGNsYXNzTmFtZTogXCJncmlkLWNvbC1hdXRvXCJcbiAgICAgICAgfSwgZSk7XG4gICAgICB9KSk7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuQ2FyZEdyb3VwID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDApKSxcbiAgICAgICAgbiA9IG8ocigxKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9pMzUgPSBmdW5jdGlvbiBpKCkge1xuICAgICAgcmV0dXJuIChfaTM1ID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBsID0gZnVuY3Rpb24gbChlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9LFxuICAgICAgICB1ID0gZnVuY3Rpb24gdShlKSB7XG4gICAgICB2YXIgdCA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgciA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIG8gPSBsKGUsIFtcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCJdKSxcbiAgICAgICAgICB1ID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtY2FyZC1ncm91cFwiLCByKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInVsXCIsIF9pMzUoe1xuICAgICAgICBjbGFzc05hbWU6IHUsXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJDYXJkR3JvdXBcIlxuICAgICAgfSwgbyksIHQpO1xuICAgIH07XG5cbiAgICB0LkNhcmRHcm91cCA9IHU7XG4gICAgdmFyIGMgPSB1O1xuICAgIHQuZGVmYXVsdCA9IGM7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0LkNhcmQgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBpKHIoMCkpLFxuICAgICAgICBuID0gaShyKDEpKSxcbiAgICAgICAgbyA9IHIoMTUpO1xuXG4gICAgZnVuY3Rpb24gaShlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfbDEyID0gZnVuY3Rpb24gbCgpIHtcbiAgICAgIHJldHVybiAoX2wxMiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICAgICAgYyA9IGZ1bmN0aW9uIGMoZSkge1xuICAgICAgdmFyIHQgPSBlLmxheW91dCxcbiAgICAgICAgICByID0gdm9pZCAwID09PSB0ID8gXCJzdGFuZGFyZERlZmF1bHRcIiA6IHQsXG4gICAgICAgICAgaSA9IGUuaGVhZGVyRmlyc3QsXG4gICAgICAgICAgYyA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgcyA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIGQgPSBlLmdyaWRMYXlvdXQsXG4gICAgICAgICAgZiA9IGUuY29udGFpbmVyUHJvcHMsXG4gICAgICAgICAgcCA9IHUoZSwgW1wibGF5b3V0XCIsIFwiaGVhZGVyRmlyc3RcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImdyaWRMYXlvdXRcIiwgXCJjb250YWluZXJQcm9wc1wiXSksXG4gICAgICAgICAgbSA9IGYgfHwge30sXG4gICAgICAgICAgeSA9IG0uY2xhc3NOYW1lLFxuICAgICAgICAgIGIgPSB1KG0sIFtcImNsYXNzTmFtZVwiXSksXG4gICAgICAgICAgdiA9IGQgJiYgKDAsIG8uYXBwbHlHcmlkQ2xhc3NlcykoZCksXG4gICAgICAgICAgTyA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLWNhcmRcIiwge1xuICAgICAgICBcInVzYS1jYXJkLS1oZWFkZXItZmlyc3RcIjogaSxcbiAgICAgICAgXCJ1c2EtY2FyZC0tZmxhZ1wiOiBcImZsYWdEZWZhdWx0XCIgPT09IHIgfHwgXCJmbGFnTWVkaWFSaWdodFwiID09PSByLFxuICAgICAgICBcInVzYS1jYXJkLS1tZWRpYS1yaWdodFwiOiBcImZsYWdNZWRpYVJpZ2h0XCIgPT09IHJcbiAgICAgIH0sIHYsIHMpLFxuICAgICAgICAgIGcgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1jYXJkX19jb250YWluZXJcIiwgeSk7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBfbDEyKHtcbiAgICAgICAgY2xhc3NOYW1lOiBPLFxuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiQ2FyZFwiXG4gICAgICB9LCBwKSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2wxMih7XG4gICAgICAgIGNsYXNzTmFtZTogZ1xuICAgICAgfSwgYiksIGMpKTtcbiAgICB9O1xuXG4gICAgdC5DYXJkID0gYztcbiAgICB2YXIgcyA9IGM7XG4gICAgdC5kZWZhdWx0ID0gcztcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuQ2FyZEhlYWRlciA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTM2ID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kzNiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSkge1xuICAgICAgdmFyIHQgPSBlLmV4ZGVudCxcbiAgICAgICAgICByID0gZS5jaGlsZHJlbixcbiAgICAgICAgICBvID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgdSA9IGwoZSwgW1wiZXhkZW50XCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIl0pLFxuICAgICAgICAgIGMgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1jYXJkX19oZWFkZXJcIiwge1xuICAgICAgICBcInVzYS1jYXJkX19oZWFkZXItLWV4ZGVudFwiOiB0XG4gICAgICB9LCBvKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImhlYWRlclwiLCBfaTM2KHtcbiAgICAgICAgY2xhc3NOYW1lOiBjXG4gICAgICB9LCB1LCB7XG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJDYXJkSGVhZGVyXCJcbiAgICAgIH0pLCByKTtcbiAgICB9O1xuXG4gICAgdC5DYXJkSGVhZGVyID0gdTtcbiAgICB2YXIgYyA9IHU7XG4gICAgdC5kZWZhdWx0ID0gYztcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuQ2FyZE1lZGlhID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDApKSxcbiAgICAgICAgbiA9IG8ocigxKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9pMzcgPSBmdW5jdGlvbiBpKCkge1xuICAgICAgcmV0dXJuIChfaTM3ID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBsID0gZnVuY3Rpb24gbChlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9LFxuICAgICAgICB1ID0gZnVuY3Rpb24gdShlKSB7XG4gICAgICB2YXIgdCA9IGUuZXhkZW50LFxuICAgICAgICAgIHIgPSBlLmluc2V0LFxuICAgICAgICAgIG8gPSBlLmltYWdlQ2xhc3MsXG4gICAgICAgICAgdSA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgYyA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHMgPSBsKGUsIFtcImV4ZGVudFwiLCBcImluc2V0XCIsIFwiaW1hZ2VDbGFzc1wiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCJdKSxcbiAgICAgICAgICBkID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtY2FyZF9fbWVkaWFcIiwge1xuICAgICAgICBcInVzYS1jYXJkX19tZWRpYS0tZXhkZW50XCI6IHQsXG4gICAgICAgIFwidXNhLWNhcmRfX21lZGlhLS1pbnNldFwiOiByXG4gICAgICB9LCBjKSxcbiAgICAgICAgICBmID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtY2FyZF9faW1nXCIsIG8pO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9pMzcoe1xuICAgICAgICBjbGFzc05hbWU6IGRcbiAgICAgIH0sIHMsIHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcIkNhcmRNZWRpYVwiXG4gICAgICB9KSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IGZcbiAgICAgIH0sIHUpKTtcbiAgICB9O1xuXG4gICAgdC5DYXJkTWVkaWEgPSB1O1xuICAgIHZhciBjID0gdTtcbiAgICB0LmRlZmF1bHQgPSBjO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZWZhdWx0ID0gdC5DYXJkQm9keSA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTM4ID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kzOCA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSkge1xuICAgICAgdmFyIHQgPSBlLmV4ZGVudCxcbiAgICAgICAgICByID0gZS5jaGlsZHJlbixcbiAgICAgICAgICBvID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgdSA9IGwoZSwgW1wiZXhkZW50XCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIl0pLFxuICAgICAgICAgIGMgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1jYXJkX19ib2R5XCIsIHtcbiAgICAgICAgXCJ1c2EtY2FyZF9fYm9keS0tZXhkZW50XCI6IHRcbiAgICAgIH0sIG8pO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9pMzgoe1xuICAgICAgICBjbGFzc05hbWU6IGNcbiAgICAgIH0sIHUsIHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcIkNhcmRCb2R5XCJcbiAgICAgIH0pLCByKTtcbiAgICB9O1xuXG4gICAgdC5DYXJkQm9keSA9IHU7XG4gICAgdmFyIGMgPSB1O1xuICAgIHQuZGVmYXVsdCA9IGM7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0LkNhcmRGb290ZXIgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2kzOSA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pMzkgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIHZhciB0ID0gZS5leGRlbnQsXG4gICAgICAgICAgciA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgbyA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHUgPSBsKGUsIFtcImV4ZGVudFwiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCJdKSxcbiAgICAgICAgICBjID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtY2FyZF9fZm9vdGVyXCIsIHtcbiAgICAgICAgXCJ1c2EtY2FyZF9fZm9vdGVyLS1leGRlbnRcIjogdFxuICAgICAgfSwgbyk7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2kzOSh7XG4gICAgICAgIGNsYXNzTmFtZTogY1xuICAgICAgfSwgdSwge1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiQ2FyZEZvb3RlclwiXG4gICAgICB9KSwgcik7XG4gICAgfTtcblxuICAgIHQuQ2FyZEZvb3RlciA9IHU7XG4gICAgdmFyIGMgPSB1O1xuICAgIHQuZGVmYXVsdCA9IGM7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LkJyZWFkY3J1bWJCYXIgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2k0MCA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pNDAgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG5cbiAgICB0LkJyZWFkY3J1bWJCYXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLnZhcmlhbnQsXG4gICAgICAgICAgciA9IHZvaWQgMCA9PT0gdCA/IFwiZGVmYXVsdFwiIDogdCxcbiAgICAgICAgICBvID0gZS5jaGlsZHJlbixcbiAgICAgICAgICBsID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgdSA9IGUubmF2UHJvcHMsXG4gICAgICAgICAgYyA9IGUubGlzdFByb3BzLFxuICAgICAgICAgIHMgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1icmVhZGNydW1iXCIsIHtcbiAgICAgICAgXCJ1c2EtYnJlYWRjcnVtYi0td3JhcFwiOiBcIndyYXBcIiA9PT0gclxuICAgICAgfSwgbCk7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJuYXZcIiwgX2k0MCh7XG4gICAgICAgIGNsYXNzTmFtZTogc1xuICAgICAgfSwgdSwge1xuICAgICAgICBcImFyaWEtbGFiZWxcIjogXCJCcmVhZGNydW1ic1wiXG4gICAgICB9KSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJvbFwiLCBfaTQwKHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1icmVhZGNydW1iX19saXN0XCJcbiAgICAgIH0sIGMpLCBvKSk7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuQnJlYWRjcnVtYiA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTQxID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2k0MSA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfTtcblxuICAgIHQuQnJlYWRjcnVtYiA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgciA9IGUuY3VycmVudCxcbiAgICAgICAgICBvID0gdm9pZCAwICE9PSByICYmIHIsXG4gICAgICAgICAgdSA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIGMgPSBsKGUsIFtcImNoaWxkcmVuXCIsIFwiY3VycmVudFwiLCBcImNsYXNzTmFtZVwiXSksXG4gICAgICAgICAgcyA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLWJyZWFkY3J1bWJfX2xpc3QtaXRlbVwiLCB7XG4gICAgICAgIFwidXNhLWN1cnJlbnRcIjogb1xuICAgICAgfSwgdSk7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBfaTQxKHtcbiAgICAgICAgY2xhc3NOYW1lOiBzLFxuICAgICAgICBcImFyaWEtY3VycmVudFwiOiBvID8gXCJwYWdlXCIgOiB2b2lkIDBcbiAgICAgIH0sIGMpLCB0KTtcbiAgICB9O1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5CcmVhZGNydW1iTGluayA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHIgPSB1KGUsIFtcImNsYXNzTmFtZVwiXSksXG4gICAgICAgICAgaSA9ICgwLCBhLmRlZmF1bHQpKHQsIFwidXNhLWJyZWFkY3J1bWJfX2xpbmtcIiksXG4gICAgICAgICAgYyA9IF9sMTMoX2wxMyh7fSwgciksIHtcbiAgICAgICAgY2xhc3NOYW1lOiBpXG4gICAgICB9KTtcblxuICAgICAgaWYgKCgwLCBvLmlzQ3VzdG9tUHJvcHMpKGMpKSByZXR1cm4gbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoby5MaW5rLCBfbDEzKHt9LCBjLCB7XG4gICAgICAgIHZhcmlhbnQ6IFwidW5zdHlsZWRcIlxuICAgICAgfSkpO1xuICAgICAgcmV0dXJuIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KG8uTGluaywgX2wxMyh7fSwgYywge1xuICAgICAgICB2YXJpYW50OiBcInVuc3R5bGVkXCJcbiAgICAgIH0pKTtcbiAgICB9O1xuICAgIHZhciBhID0gaShyKDEpKSxcbiAgICAgICAgbiA9IGkocigwKSksXG4gICAgICAgIG8gPSByKDEwKTtcblxuICAgIGZ1bmN0aW9uIGkoZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2wxMyA9IGZ1bmN0aW9uIGwoKSB7XG4gICAgICByZXR1cm4gKF9sMTMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LlN0ZXBJbmRpY2F0b3IgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2k0MiA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pNDIgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG5cbiAgICB0LlN0ZXBJbmRpY2F0b3IgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQsXG4gICAgICAgICAgciA9IGUuc2hvd0xhYmVscyxcbiAgICAgICAgICBvID0gdm9pZCAwID09PSByIHx8IHIsXG4gICAgICAgICAgbCA9IGUuY291bnRlcnMsXG4gICAgICAgICAgdSA9IHZvaWQgMCA9PT0gbCA/IFwibm9uZVwiIDogbCxcbiAgICAgICAgICBjID0gZS5jZW50ZXJlZCxcbiAgICAgICAgICBzID0gdm9pZCAwICE9PSBjICYmIGMsXG4gICAgICAgICAgZCA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgZiA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHAgPSBlLmRpdlByb3BzLFxuICAgICAgICAgIG0gPSBlLmxpc3RQcm9wcyxcbiAgICAgICAgICB5ID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2Etc3RlcC1pbmRpY2F0b3JcIiwge1xuICAgICAgICBcInVzYS1zdGVwLWluZGljYXRvci0tbm8tbGFiZWxzXCI6ICFvLFxuICAgICAgICBcInVzYS1zdGVwLWluZGljYXRvci0tY291bnRlcnNcIjogXCJkZWZhdWx0XCIgPT09IHUsXG4gICAgICAgIFwidXNhLXN0ZXAtaW5kaWNhdG9yLS1jb3VudGVycy1zbVwiOiBcInNtYWxsXCIgPT09IHUsXG4gICAgICAgIFwidXNhLXN0ZXAtaW5kaWNhdG9yLS1jZW50ZXJcIjogc1xuICAgICAgfSwgZiksXG4gICAgICAgICAgYiA9IC0xID09PSAodCA9IGQuZmluZEluZGV4KGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBcImN1cnJlbnRcIiA9PT0gZS5wcm9wcy5zdGF0dXM7XG4gICAgICB9KSkgPyAwIDogdCxcbiAgICAgICAgICB2ID0gYiArIDEsXG4gICAgICAgICAgTyA9IGRbcGFyc2VJbnQoXCJcIiArIGIpXS5wcm9wcy5sYWJlbCxcbiAgICAgICAgICBnID0gZC5sZW5ndGg7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2k0Mih7XG4gICAgICAgIGNsYXNzTmFtZTogeSxcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcInN0ZXAtaW5kaWNhdG9yXCIsXG4gICAgICAgIFwiYXJpYS1sYWJlbFwiOiBcInByb2dyZXNzXCJcbiAgICAgIH0sIHApLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcIm9sXCIsIF9pNDIoe1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLXN0ZXAtaW5kaWNhdG9yX19zZWdtZW50c1wiXG4gICAgICB9LCBtKSwgZCksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1zdGVwLWluZGljYXRvcl9faGVhZGVyXCJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiaDJcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLXN0ZXAtaW5kaWNhdG9yX19oZWFkaW5nXCJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2Etc3RlcC1pbmRpY2F0b3JfX2hlYWRpbmctY291bnRlclwiXG4gICAgICB9LCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLXNyLW9ubHlcIlxuICAgICAgfSwgXCJTdGVwXCIpLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLXN0ZXAtaW5kaWNhdG9yX19jdXJyZW50LXN0ZXBcIlxuICAgICAgfSwgdiksIFwiwqBcIiwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1zdGVwLWluZGljYXRvcl9fdG90YWwtc3RlcHNcIlxuICAgICAgfSwgXCJvZiBcIiArIGcpLCBcIsKgXCIpLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLXN0ZXAtaW5kaWNhdG9yX19oZWFkaW5nLXRleHRcIlxuICAgICAgfSwgTykpKSk7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuU3RlcEluZGljYXRvclN0ZXAgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMSkpLFxuICAgICAgICBuID0gbyhyKDApKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2k0MyA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pNDMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH07XG5cbiAgICB0LlN0ZXBJbmRpY2F0b3JTdGVwID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0ID0gZS5sYWJlbCxcbiAgICAgICAgICByID0gZS5zdGF0dXMsXG4gICAgICAgICAgbyA9IHZvaWQgMCA9PT0gciA/IFwiaW5jb21wbGV0ZVwiIDogcixcbiAgICAgICAgICB1ID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgYyA9IGwoZSwgW1wibGFiZWxcIiwgXCJzdGF0dXNcIiwgXCJjbGFzc05hbWVcIl0pLFxuICAgICAgICAgIHMgPSAoMCwgYS5kZWZhdWx0KShcInVzYS1zdGVwLWluZGljYXRvcl9fc2VnbWVudFwiLCB7XG4gICAgICAgIFwidXNhLXN0ZXAtaW5kaWNhdG9yX19zZWdtZW50LS1jb21wbGV0ZVwiOiBcImNvbXBsZXRlXCIgPT09IG8sXG4gICAgICAgIFwidXNhLXN0ZXAtaW5kaWNhdG9yX19zZWdtZW50LS1jdXJyZW50XCI6IFwiY3VycmVudFwiID09PSBvXG4gICAgICB9LCB1KTtcbiAgICAgIHJldHVybiBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImxpXCIsIF9pNDMoe1xuICAgICAgICBjbGFzc05hbWU6IHMsXG4gICAgICAgIFwiYXJpYS1jdXJyZW50XCI6IFwiY3VycmVudFwiID09PSBvID8gXCJ0cnVlXCIgOiB2b2lkIDBcbiAgICAgIH0sIGMpLCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLXN0ZXAtaW5kaWNhdG9yX19zZWdtZW50LWxhYmVsXCJcbiAgICAgIH0sIHQsIFwiwqBcIiwgXCJjdXJyZW50XCIgIT09IG8gJiYgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1zci1vbmx5XCJcbiAgICAgIH0sIFwiY29tcGxldGVcIiA9PT0gbyA/IFwiY29tcGxldGVkXCIgOiBcIm5vdCBjb21wbGV0ZWRcIikpKTtcbiAgICB9O1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZWZhdWx0ID0gdC5TZWFyY2ggPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBzKHIoMCkpLFxuICAgICAgICBuID0gcyhyKDEpKSxcbiAgICAgICAgbyA9IHIoMiksXG4gICAgICAgIGkgPSByKDE0KSxcbiAgICAgICAgbCA9IHIoMTcpLFxuICAgICAgICB1ID0gcig1KSxcbiAgICAgICAgYyA9IHIoNyk7XG5cbiAgICBmdW5jdGlvbiBzKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9kMiA9IGZ1bmN0aW9uIGQoKSB7XG4gICAgICByZXR1cm4gKF9kMiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgZiA9IGZ1bmN0aW9uIGYoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICAgICAgcCA9IGZ1bmN0aW9uIHAoZSkge1xuICAgICAgdmFyIHQgPSBlLm9uU3VibWl0LFxuICAgICAgICAgIHIgPSBlLnNpemUsXG4gICAgICAgICAgcyA9IGUuYmlnLFxuICAgICAgICAgIHAgPSBlLnNtYWxsLFxuICAgICAgICAgIG0gPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICB5ID0gZS5wbGFjZWhvbGRlcixcbiAgICAgICAgICBiID0gZS5pbnB1dE5hbWUsXG4gICAgICAgICAgdiA9IHZvaWQgMCA9PT0gYiA/IFwic2VhcmNoXCIgOiBiLFxuICAgICAgICAgIE8gPSBlLmxhYmVsLFxuICAgICAgICAgIGcgPSB2b2lkIDAgPT09IE8gPyBcIlNlYXJjaFwiIDogTyxcbiAgICAgICAgICBfID0gZS5pbnB1dElkLFxuICAgICAgICAgIGggPSB2b2lkIDAgPT09IF8gPyBcInNlYXJjaC1maWVsZFwiIDogXyxcbiAgICAgICAgICBqID0gZS5pMThuLFxuICAgICAgICAgIE0gPSBmKGUsIFtcIm9uU3VibWl0XCIsIFwic2l6ZVwiLCBcImJpZ1wiLCBcInNtYWxsXCIsIFwiY2xhc3NOYW1lXCIsIFwicGxhY2Vob2xkZXJcIiwgXCJpbnB1dE5hbWVcIiwgXCJsYWJlbFwiLCBcImlucHV0SWRcIiwgXCJpMThuXCJdKTtcbiAgICAgIHMgJiYgKDAsIG8uZGVwcmVjYXRpb25XYXJuaW5nKShcIlNlYXJjaCBwcm9wZXJ0eSBiaWcgaXMgZGVwcmVjYXRlZC4gIFVzZSBzaXplXCIpLCBwICYmICgwLCBvLmRlcHJlY2F0aW9uV2FybmluZykoXCJTZWFyY2ggcHJvcGVydHkgc21hbGwgaXMgZGVwcmVjYXRlZC4gIFVzZSBzaXplXCIpO1xuICAgICAgdmFyIE4gPSAobnVsbCA9PSBqID8gdm9pZCAwIDogai5idXR0b25UZXh0KSB8fCBcIlNlYXJjaFwiLFxuICAgICAgICAgIEUgPSByID8gXCJiaWdcIiA9PT0gciA6IHMsXG4gICAgICAgICAgUCA9IHIgPyBcInNtYWxsXCIgPT09IHIgOiBwLFxuICAgICAgICAgIHcgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1zZWFyY2hcIiwge1xuICAgICAgICBcInVzYS1zZWFyY2gtLXNtYWxsXCI6IFAsXG4gICAgICAgIFwidXNhLXNlYXJjaC0tYmlnXCI6IEVcbiAgICAgIH0sIG0pO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGwuRm9ybSwgX2QyKHtcbiAgICAgICAgb25TdWJtaXQ6IHQsXG4gICAgICAgIGNsYXNzTmFtZTogdyxcbiAgICAgICAgcm9sZTogXCJzZWFyY2hcIixcbiAgICAgICAgc2VhcmNoOiAhMFxuICAgICAgfSwgTSksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHUuTGFiZWwsIHtcbiAgICAgICAgc3JPbmx5OiAhMCxcbiAgICAgICAgaHRtbEZvcjogaFxuICAgICAgfSwgZyksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGMuVGV4dElucHV0LCB7XG4gICAgICAgIGlkOiBoLFxuICAgICAgICB0eXBlOiBcInNlYXJjaFwiLFxuICAgICAgICBuYW1lOiB2LFxuICAgICAgICBwbGFjZWhvbGRlcjogeVxuICAgICAgfSksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGkuQnV0dG9uLCB7XG4gICAgICAgIHR5cGU6IFwic3VibWl0XCJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogUCA/IFwidXNhLXNyLW9ubHlcIiA6IFwidXNhLXNlYXJjaF9fc3VibWl0LXRleHRcIlxuICAgICAgfSwgTikpKTtcbiAgICB9O1xuXG4gICAgdC5TZWFyY2ggPSBwO1xuICAgIHZhciBtID0gcDtcbiAgICB0LmRlZmF1bHQgPSBtO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZWZhdWx0ID0gdC5TdW1tYXJ5Qm94ID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDApKSxcbiAgICAgICAgbiA9IG8ocigxKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9pNDQgPSBmdW5jdGlvbiBpKCkge1xuICAgICAgcmV0dXJuIChfaTQ0ID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBsID0gZnVuY3Rpb24gbChlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9LFxuICAgICAgICB1ID0gZnVuY3Rpb24gdShlKSB7XG4gICAgICB2YXIgdCA9IGUuaGVhZGluZyxcbiAgICAgICAgICByID0gZS5jaGlsZHJlbixcbiAgICAgICAgICBvID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgdSA9IGwoZSwgW1wiaGVhZGluZ1wiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCJdKSxcbiAgICAgICAgICBjID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2Etc3VtbWFyeS1ib3hcIiwgbyk7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2k0NCh7XG4gICAgICAgIGNsYXNzTmFtZTogYyxcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcInN1bW1hcnktYm94XCJcbiAgICAgIH0sIHUpLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2Etc3VtbWFyeS1ib3hfX2JvZHlcIlxuICAgICAgfSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJoM1wiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2Etc3VtbWFyeS1ib3hfX2hlYWRpbmdcIlxuICAgICAgfSwgdCksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1zdW1tYXJ5LWJveF9fdGV4dFwiXG4gICAgICB9LCByKSkpO1xuICAgIH07XG5cbiAgICB0LlN1bW1hcnlCb3ggPSB1O1xuICAgIHZhciBjID0gdTtcbiAgICB0LmRlZmF1bHQgPSBjO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZWZhdWx0ID0gdC5Qcm9jZXNzTGlzdCA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTQ1ID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2k0NSA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSkge1xuICAgICAgdmFyIHQgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICByID0gZS5jaGlsZHJlbixcbiAgICAgICAgICBvID0gbChlLCBbXCJjbGFzc05hbWVcIiwgXCJjaGlsZHJlblwiXSksXG4gICAgICAgICAgdSA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLXByb2Nlc3MtbGlzdFwiLCB0KTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcIm9sXCIsIF9pNDUoe1xuICAgICAgICBjbGFzc05hbWU6IHVcbiAgICAgIH0sIG8pLCByKTtcbiAgICB9O1xuXG4gICAgdC5Qcm9jZXNzTGlzdCA9IHU7XG4gICAgdmFyIGMgPSB1O1xuICAgIHQuZGVmYXVsdCA9IGM7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0LlByb2Nlc3NMaXN0SXRlbSA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTQ2ID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2k0NiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSkge1xuICAgICAgdmFyIHQgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICByID0gZS5jaGlsZHJlbixcbiAgICAgICAgICBvID0gbChlLCBbXCJjbGFzc05hbWVcIiwgXCJjaGlsZHJlblwiXSksXG4gICAgICAgICAgdSA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLXByb2Nlc3MtbGlzdF9faXRlbVwiLCB0KTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImxpXCIsIF9pNDYoe1xuICAgICAgICBjbGFzc05hbWU6IHVcbiAgICAgIH0sIG8pLCByKTtcbiAgICB9O1xuXG4gICAgdC5Qcm9jZXNzTGlzdEl0ZW0gPSB1O1xuICAgIHZhciBjID0gdTtcbiAgICB0LmRlZmF1bHQgPSBjO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5Qcm9jZXNzTGlzdEhlYWRpbmcgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2k0NyA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pNDcgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH07XG5cbiAgICB0LlByb2Nlc3NMaXN0SGVhZGluZyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCA9IGUudHlwZSxcbiAgICAgICAgICByID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgbyA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgdSA9IGwoZSwgW1widHlwZVwiLCBcImNsYXNzTmFtZVwiLCBcImNoaWxkcmVuXCJdKSxcbiAgICAgICAgICBjID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtcHJvY2Vzcy1saXN0X19oZWFkaW5nXCIsIHIpLFxuICAgICAgICAgIHMgPSB0O1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHMsIF9pNDcoe1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwicHJvY2Vzc0xpc3RIZWFkaW5nXCIsXG4gICAgICAgIGNsYXNzTmFtZTogY1xuICAgICAgfSwgdSksIG8pO1xuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0LlNpdGVBbGVydCA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTQ4ID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2k0OCA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSkge1xuICAgICAgdmFyIHQgPSBlLnZhcmlhbnQsXG4gICAgICAgICAgciA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgbyA9IGUuaGVhZGluZyxcbiAgICAgICAgICB1ID0gZS5zaG93SWNvbixcbiAgICAgICAgICBjID0gdm9pZCAwID09PSB1IHx8IHUsXG4gICAgICAgICAgcyA9IGUuc2xpbSxcbiAgICAgICAgICBkID0gdm9pZCAwICE9PSBzICYmIHMsXG4gICAgICAgICAgZiA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHAgPSBsKGUsIFtcInZhcmlhbnRcIiwgXCJjaGlsZHJlblwiLCBcImhlYWRpbmdcIiwgXCJzaG93SWNvblwiLCBcInNsaW1cIiwgXCJjbGFzc05hbWVcIl0pLFxuICAgICAgICAgIG0gPSAoMCwgbi5kZWZhdWx0KShcInVzYS1zaXRlLWFsZXJ0XCIsIHtcbiAgICAgICAgXCJ1c2Etc2l0ZS1hbGVydC0taW5mb1wiOiBcImluZm9cIiA9PT0gdCxcbiAgICAgICAgXCJ1c2Etc2l0ZS1hbGVydC0tZW1lcmdlbmN5XCI6IFwiZW1lcmdlbmN5XCIgPT09IHQsXG4gICAgICAgIFwidXNhLXNpdGUtYWxlcnQtLW5vLWhlYWRpbmdcIjogdm9pZCAwID09PSBvICYmICFkLFxuICAgICAgICBcInVzYS1zaXRlLWFsZXJ0LS1uby1pY29uXCI6ICFjLFxuICAgICAgICBcInVzYS1zaXRlLWFsZXJ0LS1zbGltXCI6IGRcbiAgICAgIH0sIGYpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic2VjdGlvblwiLCBfaTQ4KHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcInNpdGVBbGVydFwiLFxuICAgICAgICBjbGFzc05hbWU6IG0sXG4gICAgICAgIFwiYXJpYS1sYWJlbFwiOiBcIlNpdGUgYWxlcnRcIlxuICAgICAgfSwgcCksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1hbGVydFwiXG4gICAgICB9LCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtYWxlcnRfX2JvZHlcIlxuICAgICAgfSwgbyAmJiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImgzXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1hbGVydF9faGVhZGluZ1wiXG4gICAgICB9LCBvKSwgcikpKTtcbiAgICB9O1xuXG4gICAgdC5TaXRlQWxlcnQgPSB1O1xuICAgIHZhciBjID0gdTtcbiAgICB0LmRlZmF1bHQgPSBjO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC51c2VNb2RhbCA9IHQuY29ubmVjdE1vZGFsID0gdC5Nb2RhbENvbnRhaW5lciA9IHQuT3ZlcmxheSA9IHQuTW9kYWwgPSB2b2lkIDA7XG5cbiAgICB2YXIgYSA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICBpZiAoIXQgJiYgZSAmJiBlLl9fZXNNb2R1bGUpIHJldHVybiBlO1xuICAgICAgaWYgKG51bGwgPT09IGUgfHwgXCJvYmplY3RcIiAhPSB0eXBlb2YgZSAmJiBcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIGUpIHJldHVybiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgICB2YXIgciA9IHUodCk7XG4gICAgICBpZiAociAmJiByLmhhcyhlKSkgcmV0dXJuIHIuZ2V0KGUpO1xuICAgICAgdmFyIGEgPSB7fSxcbiAgICAgICAgICBuID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbiAgICAgIGZvciAodmFyIG8gaW4gZSkge1xuICAgICAgICBpZiAoXCJkZWZhdWx0XCIgIT09IG8gJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIG8pKSB7XG4gICAgICAgICAgdmFyIGkgPSBuID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCBvKSA6IG51bGw7XG4gICAgICAgICAgaSAmJiAoaS5nZXQgfHwgaS5zZXQpID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsIG8sIGkpIDogYVtvXSA9IGVbb107XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYS5kZWZhdWx0ID0gZSwgciAmJiByLnNldChlLCBhKTtcbiAgICAgIHJldHVybiBhO1xuICAgIH0ocigwKSksXG4gICAgICAgIG4gPSBsKHIoMSkpLFxuICAgICAgICBvID0gbChyKDExMikpLFxuICAgICAgICBpID0gcigyKTtcblxuICAgIGZ1bmN0aW9uIGwoZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIGlmIChcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIFdlYWtNYXApIHJldHVybiBudWxsO1xuICAgICAgdmFyIHQgPSBuZXcgV2Vha01hcCgpLFxuICAgICAgICAgIHIgPSBuZXcgV2Vha01hcCgpO1xuICAgICAgcmV0dXJuICh1ID0gZnVuY3Rpb24gdShlKSB7XG4gICAgICAgIHJldHVybiBlID8gciA6IHQ7XG4gICAgICB9KShlKTtcbiAgICB9XG5cbiAgICB2YXIgX2M0ID0gZnVuY3Rpb24gYygpIHtcbiAgICAgIHJldHVybiAoX2M0ID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBzID0gZnVuY3Rpb24gcyhlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuXG4gICAgdC5Nb2RhbCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCA9IGUudGl0bGUsXG4gICAgICAgICAgciA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgbCA9IGUuYWN0aW9ucyxcbiAgICAgICAgICB1ID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgYyA9ICgwLCBuLmRlZmF1bHQpKG8uZGVmYXVsdC5tb2RhbCwgdSk7XG4gICAgICByZXR1cm4gKDAsIGkuZGVwcmVjYXRpb25XYXJuaW5nKShcIk1vZGFsIGlzIGRlcHJlY2F0ZWQuICBNb2RhbCB3aWxsIGJlIHJlbW92ZWQgZnJvbSByZWFjdC11c3dkcyBhbG9uZ3NpZGUgYWxsIG90aGVyIE1vZGFsIHJlbGF0ZWQgY29tcG9uZW50cyBhbmQgZnVuY3Rpb25zIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2UuXCIpLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJtb2RhbFwiLFxuICAgICAgICBjbGFzc05hbWU6IGNcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBvLmRlZmF1bHQudGl0bGVcbiAgICAgIH0sIHQpLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogby5kZWZhdWx0LmNvbnRlbnRcbiAgICAgIH0sIHIpLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogby5kZWZhdWx0LmFjdGlvbnNcbiAgICAgIH0sIGwpKTtcbiAgICB9O1xuXG4gICAgdmFyIGQgPSBmdW5jdGlvbiBkKCkge1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBvLmRlZmF1bHQub3ZlcmxheVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHQuT3ZlcmxheSA9IGQ7XG5cbiAgICB2YXIgZiA9IGZ1bmN0aW9uIGYoZSkge1xuICAgICAgdmFyIHQgPSBlLmNoaWxkcmVuO1xuICAgICAgcmV0dXJuICgwLCBpLmRlcHJlY2F0aW9uV2FybmluZykoXCJNb2RhbCBpcyBkZXByZWNhdGVkLiBNb2RhbENvbnRhaW5lciB3aWxsIGJlIHJlbW92ZWQgZnJvbSByZWFjdC11c3dkcyBhbG9uZ3NpZGUgYWxsIG90aGVyIE1vZGFsIHJlbGF0ZWQgY29tcG9uZW50cyBhbmQgZnVuY3Rpb25zIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2UuXCIpLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogby5kZWZhdWx0Lm1vZGFsQ29udGFpbmVyXG4gICAgICB9LCB0KTtcbiAgICB9O1xuXG4gICAgdC5Nb2RhbENvbnRhaW5lciA9IGY7XG5cbiAgICB0LmNvbm5lY3RNb2RhbCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdmFyIHIgPSB0LmlzT3BlbixcbiAgICAgICAgICAgIG4gPSBzKHQsIFtcImlzT3BlblwiXSk7XG4gICAgICAgIHJldHVybiAoMCwgaS5kZXByZWNhdGlvbldhcm5pbmcpKFwiTW9kYWwgaXMgZGVwcmVjYXRlZC4gJ2Nvbm5lY3RNb2RhbCcgd2lsbCBiZSByZW1vdmVkIGZyb20gcmVhY3QtdXN3ZHMgYWxvbmdzaWRlIGFsbCBvdGhlciBNb2RhbCByZWxhdGVkIGNvbXBvbmVudHMgYW5kIGZ1bmN0aW9ucyBpbiB0aGUgbmV4dCBtYWpvciByZWxlYXNlLlwiKSwgciA/IGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGEuZGVmYXVsdC5GcmFnbWVudCwgbnVsbCwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoZCwgbnVsbCksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGYsIG51bGwsIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGUsIF9jNCh7fSwgbikpKSkgOiBudWxsO1xuICAgICAgfTtcbiAgICB9O1xuXG4gICAgdC51c2VNb2RhbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICgwLCBpLmRlcHJlY2F0aW9uV2FybmluZykoXCJNb2RhbCBpcyBkZXByZWNhdGVkLiBUaGUgdXNlTW9kYWwgaG9vayB3aWxsIGJlIHJlbW92ZWQgZnJvbSByZWFjdC11c3dkcyBhbG9uZ3NpZGUgYWxsIG90aGVyIE1vZGFsIHJlbGF0ZWQgY29tcG9uZW50cyBhbmQgZnVuY3Rpb25zIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2UuXCIpO1xuICAgICAgdmFyIGUgPSAoMCwgYS51c2VTdGF0ZSkoITEpLFxuICAgICAgICAgIHQgPSBlWzBdLFxuICAgICAgICAgIHIgPSBlWzFdO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNPcGVuOiB0LFxuICAgICAgICBvcGVuTW9kYWw6IGZ1bmN0aW9uIG9wZW5Nb2RhbCgpIHtcbiAgICAgICAgICByKCEwKTtcbiAgICAgICAgfSxcbiAgICAgICAgY2xvc2VNb2RhbDogZnVuY3Rpb24gY2xvc2VNb2RhbCgpIHtcbiAgICAgICAgICByKCExKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgci5yKHQpLCB0LmRlZmF1bHQgPSB7XG4gICAgICB0aXRsZTogXCJzcmMtY29tcG9uZW50cy1Nb2RhbC1Nb2RhbC1tb2R1bGVfX3RpdGxlLS0zWUhIRFwiLFxuICAgICAgYWN0aW9uczogXCJzcmMtY29tcG9uZW50cy1Nb2RhbC1Nb2RhbC1tb2R1bGVfX2FjdGlvbnMtLTJVcjlOXCIsXG4gICAgICBjb250ZW50OiBcInNyYy1jb21wb25lbnRzLU1vZGFsLU1vZGFsLW1vZHVsZV9fY29udGVudC0tMy00X1lcIixcbiAgICAgIG1vZGFsOiBcInNyYy1jb21wb25lbnRzLU1vZGFsLU1vZGFsLW1vZHVsZV9fbW9kYWwtLTF1c3pzXCIsXG4gICAgICBvdmVybGF5OiBcInNyYy1jb21wb25lbnRzLU1vZGFsLU1vZGFsLW1vZHVsZV9fb3ZlcmxheS0tV1NzeU9cIixcbiAgICAgIG1vZGFsQ29udGFpbmVyOiBcInNyYy1jb21wb25lbnRzLU1vZGFsLU1vZGFsLW1vZHVsZV9fbW9kYWxDb250YWluZXItLTJadjlPXCJcbiAgICB9O1xuICB9XSk7XG59KTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///2593\n')}}]); \ No newline at end of file diff --git a/63e863/404.html b/63e863/404.html new file mode 100644 index 00000000..83cd4c1c --- /dev/null +++ b/63e863/404.html @@ -0,0 +1,3 @@ +
\ No newline at end of file diff --git a/63e863/404/index.html b/63e863/404/index.html new file mode 100644 index 00000000..1e050a58 --- /dev/null +++ b/63e863/404/index.html @@ -0,0 +1,3 @@ +
\ No newline at end of file diff --git a/63e863/5feba8b89e127aa62af01f1d81ab114c6127781b-dba7aa714d56cd027220.js b/63e863/5feba8b89e127aa62af01f1d81ab114c6127781b-dba7aa714d56cd027220.js new file mode 100644 index 00000000..0136614d --- /dev/null +++ b/63e863/5feba8b89e127aa62af01f1d81ab114c6127781b-dba7aa714d56cd027220.js @@ -0,0 +1 @@ +(self.webpackChunkjustice40_tool=self.webpackChunkjustice40_tool||[]).push([[569],{7228:function(module){eval("function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n\n return arr2;\n}\n\nmodule.exports = _arrayLikeToArray;\nmodule.exports.default = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2FycmF5TGlrZVRvQXJyYXkuanM/NWE0MyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUVBLHdDQUF3QyxTQUFTO0FBQ2pEO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHNCQUF5QixtQkFBbUIseUJBQXlCIiwiZmlsZSI6IjcyMjguanMiLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikge1xuICBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHtcbiAgICBhcnIyW2ldID0gYXJyW2ldO1xuICB9XG5cbiAgcmV0dXJuIGFycjI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2FycmF5TGlrZVRvQXJyYXk7XG5tb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///7228\n")},2858:function(module){eval("function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\n\nmodule.exports = _arrayWithHoles;\nmodule.exports.default = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2FycmF5V2l0aEhvbGVzLmpzP2MxMzUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0JBQXlCLG1CQUFtQix5QkFBeUIiLCJmaWxlIjoiMjg1OC5qcyIsInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfYXJyYXlXaXRoSG9sZXM7XG5tb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///2858\n")},3646:function(module,__unused_webpack_exports,__webpack_require__){eval("var arrayLikeToArray = __webpack_require__(7228);\n\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return arrayLikeToArray(arr);\n}\n\nmodule.exports = _arrayWithoutHoles;\nmodule.exports.default = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2FycmF5V2l0aG91dEhvbGVzLmpzPzIyMzYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdUJBQXVCLG1CQUFPLENBQUMsSUFBdUI7O0FBRXREO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNCQUF5QixtQkFBbUIseUJBQXlCIiwiZmlsZSI6IjM2NDYuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYXJyYXlMaWtlVG9BcnJheSA9IHJlcXVpcmUoXCIuL2FycmF5TGlrZVRvQXJyYXkuanNcIik7XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXkoYXJyKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfYXJyYXlXaXRob3V0SG9sZXM7XG5tb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///3646\n")},9713:function(module){eval("function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nmodule.exports = _defineProperty;\nmodule.exports.default = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5LmpzPzk1MjMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHNCQUF5QixtQkFBbUIseUJBQXlCIiwiZmlsZSI6Ijk3MTMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfZGVmaW5lUHJvcGVydHk7XG5tb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///9713\n")},862:function(module,__unused_webpack_exports,__webpack_require__){eval('var _typeof = __webpack_require__(8).default;\n\nfunction _getRequireWildcardCache(nodeInterop) {\n if (typeof WeakMap !== "function") return null;\n var cacheBabelInterop = new WeakMap();\n var cacheNodeInterop = new WeakMap();\n return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {\n return nodeInterop ? cacheNodeInterop : cacheBabelInterop;\n })(nodeInterop);\n}\n\nfunction _interopRequireWildcard(obj, nodeInterop) {\n if (!nodeInterop && obj && obj.__esModule) {\n return obj;\n }\n\n if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") {\n return {\n "default": obj\n };\n }\n\n var cache = _getRequireWildcardCache(nodeInterop);\n\n if (cache && cache.has(obj)) {\n return cache.get(obj);\n }\n\n var newObj = {};\n var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n for (var key in obj) {\n if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {\n var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;\n\n if (desc && (desc.get || desc.set)) {\n Object.defineProperty(newObj, key, desc);\n } else {\n newObj[key] = obj[key];\n }\n }\n }\n\n newObj["default"] = obj;\n\n if (cache) {\n cache.set(obj, newObj);\n }\n\n return newObj;\n}\n\nmodule.exports = _interopRequireWildcard;\nmodule.exports.default = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmQuanM/ZGJjZSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDhCQUFtRDs7QUFFakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxzQkFBeUIsbUJBQW1CLHlCQUF5QiIsImZpbGUiOiI4NjIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgX3R5cGVvZiA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZlwiKVtcImRlZmF1bHRcIl07XG5cbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShub2RlSW50ZXJvcCkge1xuICBpZiAodHlwZW9mIFdlYWtNYXAgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG51bGw7XG4gIHZhciBjYWNoZUJhYmVsSW50ZXJvcCA9IG5ldyBXZWFrTWFwKCk7XG4gIHZhciBjYWNoZU5vZGVJbnRlcm9wID0gbmV3IFdlYWtNYXAoKTtcbiAgcmV0dXJuIChfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApIHtcbiAgICByZXR1cm4gbm9kZUludGVyb3AgPyBjYWNoZU5vZGVJbnRlcm9wIDogY2FjaGVCYWJlbEludGVyb3A7XG4gIH0pKG5vZGVJbnRlcm9wKTtcbn1cblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqLCBub2RlSW50ZXJvcCkge1xuICBpZiAoIW5vZGVJbnRlcm9wICYmIG9iaiAmJiBvYmouX19lc01vZHVsZSkge1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBpZiAob2JqID09PSBudWxsIHx8IF90eXBlb2Yob2JqKSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygb2JqICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgXCJkZWZhdWx0XCI6IG9ialxuICAgIH07XG4gIH1cblxuICB2YXIgY2FjaGUgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApO1xuXG4gIGlmIChjYWNoZSAmJiBjYWNoZS5oYXMob2JqKSkge1xuICAgIHJldHVybiBjYWNoZS5nZXQob2JqKTtcbiAgfVxuXG4gIHZhciBuZXdPYmogPSB7fTtcbiAgdmFyIGhhc1Byb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4gIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICBpZiAoa2V5ICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICB2YXIgZGVzYyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvciA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpIDogbnVsbDtcblxuICAgICAgaWYgKGRlc2MgJiYgKGRlc2MuZ2V0IHx8IGRlc2Muc2V0KSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3T2JqLCBrZXksIGRlc2MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3T2JqW2tleV0gPSBvYmpba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZXdPYmpbXCJkZWZhdWx0XCJdID0gb2JqO1xuXG4gIGlmIChjYWNoZSkge1xuICAgIGNhY2hlLnNldChvYmosIG5ld09iaik7XG4gIH1cblxuICByZXR1cm4gbmV3T2JqO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkO1xubW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///862\n')},6860:function(module){eval('function _iterableToArray(iter) {\n if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);\n}\n\nmodule.exports = _iterableToArray;\nmodule.exports.default = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2l0ZXJhYmxlVG9BcnJheS5qcz8xMWIwIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNCQUF5QixtQkFBbUIseUJBQXlCIiwiZmlsZSI6IjY4NjAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHtcbiAgaWYgKHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgaXRlcltTeW1ib2wuaXRlcmF0b3JdICE9IG51bGwgfHwgaXRlcltcIkBAaXRlcmF0b3JcIl0gIT0gbnVsbCkgcmV0dXJuIEFycmF5LmZyb20oaXRlcik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2l0ZXJhYmxlVG9BcnJheTtcbm1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///6860\n')},3884:function(module){eval('function _iterableToArrayLimit(arr, i) {\n var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];\n\n if (_i == null) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n\n var _s, _e;\n\n try {\n for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i["return"] != null) _i["return"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}\n\nmodule.exports = _iterableToArrayLimit;\nmodule.exports.default = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2l0ZXJhYmxlVG9BcnJheUxpbWl0LmpzPzliNDIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLDJCQUEyQiwrQkFBK0I7QUFDMUQ7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxzQkFBeUIsbUJBQW1CLHlCQUF5QiIsImZpbGUiOiIzODg0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkge1xuICB2YXIgX2kgPSBhcnIgPT0gbnVsbCA/IG51bGwgOiB0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIGFycltTeW1ib2wuaXRlcmF0b3JdIHx8IGFycltcIkBAaXRlcmF0b3JcIl07XG5cbiAgaWYgKF9pID09IG51bGwpIHJldHVybjtcbiAgdmFyIF9hcnIgPSBbXTtcbiAgdmFyIF9uID0gdHJ1ZTtcbiAgdmFyIF9kID0gZmFsc2U7XG5cbiAgdmFyIF9zLCBfZTtcblxuICB0cnkge1xuICAgIGZvciAoX2kgPSBfaS5jYWxsKGFycik7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHtcbiAgICAgIF9hcnIucHVzaChfcy52YWx1ZSk7XG5cbiAgICAgIGlmIChpICYmIF9hcnIubGVuZ3RoID09PSBpKSBicmVhaztcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9kID0gdHJ1ZTtcbiAgICBfZSA9IGVycjtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSAhPSBudWxsKSBfaVtcInJldHVyblwiXSgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoX2QpIHRocm93IF9lO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBfYXJyO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9pdGVyYWJsZVRvQXJyYXlMaW1pdDtcbm1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///3884\n')},521:function(module){eval('function _nonIterableRest() {\n throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");\n}\n\nmodule.exports = _nonIterableRest;\nmodule.exports.default = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL25vbkl0ZXJhYmxlUmVzdC5qcz9jMjQwIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNCQUF5QixtQkFBbUIseUJBQXlCIiwiZmlsZSI6IjUyMS5qcyIsInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX25vbkl0ZXJhYmxlUmVzdDtcbm1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///521\n')},8206:function(module){eval('function _nonIterableSpread() {\n throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");\n}\n\nmodule.exports = _nonIterableSpread;\nmodule.exports.default = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL25vbkl0ZXJhYmxlU3ByZWFkLmpzPzA2NzYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0JBQXlCLG1CQUFtQix5QkFBeUIiLCJmaWxlIjoiODIwNi5qcyIsInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX25vbkl0ZXJhYmxlU3ByZWFkO1xubW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///8206\n')},3038:function(module,__unused_webpack_exports,__webpack_require__){eval("var arrayWithHoles = __webpack_require__(2858);\n\nvar iterableToArrayLimit = __webpack_require__(3884);\n\nvar unsupportedIterableToArray = __webpack_require__(3323);\n\nvar nonIterableRest = __webpack_require__(521);\n\nfunction _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n}\n\nmodule.exports = _slicedToArray;\nmodule.exports.default = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXkuanM/Mjc4YyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxxQkFBcUIsbUJBQU8sQ0FBQyxJQUFxQjs7QUFFbEQsMkJBQTJCLG1CQUFPLENBQUMsSUFBMkI7O0FBRTlELGlDQUFpQyxtQkFBTyxDQUFDLElBQWlDOztBQUUxRSxzQkFBc0IsbUJBQU8sQ0FBQyxHQUFzQjs7QUFFcEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0JBQXlCLG1CQUFtQix5QkFBeUIiLCJmaWxlIjoiMzAzOC5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBhcnJheVdpdGhIb2xlcyA9IHJlcXVpcmUoXCIuL2FycmF5V2l0aEhvbGVzLmpzXCIpO1xuXG52YXIgaXRlcmFibGVUb0FycmF5TGltaXQgPSByZXF1aXJlKFwiLi9pdGVyYWJsZVRvQXJyYXlMaW1pdC5qc1wiKTtcblxudmFyIHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5ID0gcmVxdWlyZShcIi4vdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkuanNcIik7XG5cbnZhciBub25JdGVyYWJsZVJlc3QgPSByZXF1aXJlKFwiLi9ub25JdGVyYWJsZVJlc3QuanNcIik7XG5cbmZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkge1xuICByZXR1cm4gYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBpdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFyciwgaSkgfHwgbm9uSXRlcmFibGVSZXN0KCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3NsaWNlZFRvQXJyYXk7XG5tb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///3038\n")},319:function(module,__unused_webpack_exports,__webpack_require__){eval("var arrayWithoutHoles = __webpack_require__(3646);\n\nvar iterableToArray = __webpack_require__(6860);\n\nvar unsupportedIterableToArray = __webpack_require__(3323);\n\nvar nonIterableSpread = __webpack_require__(8206);\n\nfunction _toConsumableArray(arr) {\n return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n}\n\nmodule.exports = _toConsumableArray;\nmodule.exports.default = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5LmpzPzQ0OGEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsd0JBQXdCLG1CQUFPLENBQUMsSUFBd0I7O0FBRXhELHNCQUFzQixtQkFBTyxDQUFDLElBQXNCOztBQUVwRCxpQ0FBaUMsbUJBQU8sQ0FBQyxJQUFpQzs7QUFFMUUsd0JBQXdCLG1CQUFPLENBQUMsSUFBd0I7O0FBRXhEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNCQUF5QixtQkFBbUIseUJBQXlCIiwiZmlsZSI6IjMxOS5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBhcnJheVdpdGhvdXRIb2xlcyA9IHJlcXVpcmUoXCIuL2FycmF5V2l0aG91dEhvbGVzLmpzXCIpO1xuXG52YXIgaXRlcmFibGVUb0FycmF5ID0gcmVxdWlyZShcIi4vaXRlcmFibGVUb0FycmF5LmpzXCIpO1xuXG52YXIgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkgPSByZXF1aXJlKFwiLi91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qc1wiKTtcblxudmFyIG5vbkl0ZXJhYmxlU3ByZWFkID0gcmVxdWlyZShcIi4vbm9uSXRlcmFibGVTcHJlYWQuanNcIik7XG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHtcbiAgcmV0dXJuIGFycmF5V2l0aG91dEhvbGVzKGFycikgfHwgaXRlcmFibGVUb0FycmF5KGFycikgfHwgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBub25JdGVyYWJsZVNwcmVhZCgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF90b0NvbnN1bWFibGVBcnJheTtcbm1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///319\n")},3323:function(module,__unused_webpack_exports,__webpack_require__){eval('var arrayLikeToArray = __webpack_require__(7228);\n\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === "string") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === "Object" && o.constructor) n = o.constructor.name;\n if (n === "Map" || n === "Set") return Array.from(o);\n if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}\n\nmodule.exports = _unsupportedIterableToArray;\nmodule.exports.default = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5LmpzPzY2MTMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdUJBQXVCLG1CQUFPLENBQUMsSUFBdUI7O0FBRXREO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxzQkFBeUIsbUJBQW1CLHlCQUF5QiIsImZpbGUiOiIzMzIzLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGFycmF5TGlrZVRvQXJyYXkgPSByZXF1aXJlKFwiLi9hcnJheUxpa2VUb0FycmF5LmpzXCIpO1xuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7XG4gIGlmICghbykgcmV0dXJuO1xuICBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBhcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG4gIHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTtcbiAgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTtcbiAgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7XG4gIGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheTtcbm1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///3323\n')},7091:function(module){"use strict";eval("\n\nvar token = '%[a-f0-9]{2}';\nvar singleMatcher = new RegExp(token, 'gi');\nvar multiMatcher = new RegExp('(' + token + ')+', 'gi');\n\nfunction decodeComponents(components, split) {\n try {\n // Try to decode the entire string first\n return decodeURIComponent(components.join(''));\n } catch (err) {// Do nothing\n }\n\n if (components.length === 1) {\n return components;\n }\n\n split = split || 1; // Split the array in 2 parts\n\n var left = components.slice(0, split);\n var right = components.slice(split);\n return Array.prototype.concat.call([], decodeComponents(left), decodeComponents(right));\n}\n\nfunction decode(input) {\n try {\n return decodeURIComponent(input);\n } catch (err) {\n var tokens = input.match(singleMatcher);\n\n for (var i = 1; i < tokens.length; i++) {\n input = decodeComponents(tokens, i).join('');\n tokens = input.match(singleMatcher);\n }\n\n return input;\n }\n}\n\nfunction customDecodeURIComponent(input) {\n // Keep track of all the replacements and prefill the map with the `BOM`\n var replaceMap = {\n '%FE%FF': \"\\uFFFD\\uFFFD\",\n '%FF%FE': \"\\uFFFD\\uFFFD\"\n };\n var match = multiMatcher.exec(input);\n\n while (match) {\n try {\n // Decode as big chunks as possible\n replaceMap[match[0]] = decodeURIComponent(match[0]);\n } catch (err) {\n var result = decode(match[0]);\n\n if (result !== match[0]) {\n replaceMap[match[0]] = result;\n }\n }\n\n match = multiMatcher.exec(input);\n } // Add `%C2` at the end of the map to make sure it does not replace the combinator before everything else\n\n\n replaceMap['%C2'] = \"\\uFFFD\";\n var entries = Object.keys(replaceMap);\n\n for (var i = 0; i < entries.length; i++) {\n // Replace all decoded components\n var key = entries[i];\n input = input.replace(new RegExp(key, 'g'), replaceMap[key]);\n }\n\n return input;\n}\n\nmodule.exports = function (encodedURI) {\n if (typeof encodedURI !== 'string') {\n throw new TypeError('Expected `encodedURI` to be of type `string`, got `' + typeof encodedURI + '`');\n }\n\n try {\n encodedURI = encodedURI.replace(/\\+/g, ' '); // Try the built in decoder first\n\n return decodeURIComponent(encodedURI);\n } catch (err) {\n // Fallback to a more advanced decoder\n return customDecodeURIComponent(encodedURI);\n }\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9kZWNvZGUtdXJpLWNvbXBvbmVudC9pbmRleC5qcz8yYWYxIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViLHVCQUF1QixFQUFFO0FBQ3pCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLGNBQWM7QUFDakI7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHFCQUFxQjs7QUFFckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBLG1CQUFtQixtQkFBbUI7QUFDdEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7O0FBRUEsaUJBQWlCLG9CQUFvQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZ0RBQWdEOztBQUVoRDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiI3MDkxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdG9rZW4gPSAnJVthLWYwLTldezJ9JztcbnZhciBzaW5nbGVNYXRjaGVyID0gbmV3IFJlZ0V4cCh0b2tlbiwgJ2dpJyk7XG52YXIgbXVsdGlNYXRjaGVyID0gbmV3IFJlZ0V4cCgnKCcgKyB0b2tlbiArICcpKycsICdnaScpO1xuXG5mdW5jdGlvbiBkZWNvZGVDb21wb25lbnRzKGNvbXBvbmVudHMsIHNwbGl0KSB7XG4gIHRyeSB7XG4gICAgLy8gVHJ5IHRvIGRlY29kZSB0aGUgZW50aXJlIHN0cmluZyBmaXJzdFxuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoY29tcG9uZW50cy5qb2luKCcnKSk7XG4gIH0gY2F0Y2ggKGVycikgey8vIERvIG5vdGhpbmdcbiAgfVxuXG4gIGlmIChjb21wb25lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBjb21wb25lbnRzO1xuICB9XG5cbiAgc3BsaXQgPSBzcGxpdCB8fCAxOyAvLyBTcGxpdCB0aGUgYXJyYXkgaW4gMiBwYXJ0c1xuXG4gIHZhciBsZWZ0ID0gY29tcG9uZW50cy5zbGljZSgwLCBzcGxpdCk7XG4gIHZhciByaWdodCA9IGNvbXBvbmVudHMuc2xpY2Uoc3BsaXQpO1xuICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5jYWxsKFtdLCBkZWNvZGVDb21wb25lbnRzKGxlZnQpLCBkZWNvZGVDb21wb25lbnRzKHJpZ2h0KSk7XG59XG5cbmZ1bmN0aW9uIGRlY29kZShpbnB1dCkge1xuICB0cnkge1xuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoaW5wdXQpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB2YXIgdG9rZW5zID0gaW5wdXQubWF0Y2goc2luZ2xlTWF0Y2hlcik7XG5cbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgICAgaW5wdXQgPSBkZWNvZGVDb21wb25lbnRzKHRva2VucywgaSkuam9pbignJyk7XG4gICAgICB0b2tlbnMgPSBpbnB1dC5tYXRjaChzaW5nbGVNYXRjaGVyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5wdXQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3VzdG9tRGVjb2RlVVJJQ29tcG9uZW50KGlucHV0KSB7XG4gIC8vIEtlZXAgdHJhY2sgb2YgYWxsIHRoZSByZXBsYWNlbWVudHMgYW5kIHByZWZpbGwgdGhlIG1hcCB3aXRoIHRoZSBgQk9NYFxuICB2YXIgcmVwbGFjZU1hcCA9IHtcbiAgICAnJUZFJUZGJzogXCJcXHVGRkZEXFx1RkZGRFwiLFxuICAgICclRkYlRkUnOiBcIlxcdUZGRkRcXHVGRkZEXCJcbiAgfTtcbiAgdmFyIG1hdGNoID0gbXVsdGlNYXRjaGVyLmV4ZWMoaW5wdXQpO1xuXG4gIHdoaWxlIChtYXRjaCkge1xuICAgIHRyeSB7XG4gICAgICAvLyBEZWNvZGUgYXMgYmlnIGNodW5rcyBhcyBwb3NzaWJsZVxuICAgICAgcmVwbGFjZU1hcFttYXRjaFswXV0gPSBkZWNvZGVVUklDb21wb25lbnQobWF0Y2hbMF0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdmFyIHJlc3VsdCA9IGRlY29kZShtYXRjaFswXSk7XG5cbiAgICAgIGlmIChyZXN1bHQgIT09IG1hdGNoWzBdKSB7XG4gICAgICAgIHJlcGxhY2VNYXBbbWF0Y2hbMF1dID0gcmVzdWx0O1xuICAgICAgfVxuICAgIH1cblxuICAgIG1hdGNoID0gbXVsdGlNYXRjaGVyLmV4ZWMoaW5wdXQpO1xuICB9IC8vIEFkZCBgJUMyYCBhdCB0aGUgZW5kIG9mIHRoZSBtYXAgdG8gbWFrZSBzdXJlIGl0IGRvZXMgbm90IHJlcGxhY2UgdGhlIGNvbWJpbmF0b3IgYmVmb3JlIGV2ZXJ5dGhpbmcgZWxzZVxuXG5cbiAgcmVwbGFjZU1hcFsnJUMyJ10gPSBcIlxcdUZGRkRcIjtcbiAgdmFyIGVudHJpZXMgPSBPYmplY3Qua2V5cyhyZXBsYWNlTWFwKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAvLyBSZXBsYWNlIGFsbCBkZWNvZGVkIGNvbXBvbmVudHNcbiAgICB2YXIga2V5ID0gZW50cmllc1tpXTtcbiAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UobmV3IFJlZ0V4cChrZXksICdnJyksIHJlcGxhY2VNYXBba2V5XSk7XG4gIH1cblxuICByZXR1cm4gaW5wdXQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGVuY29kZWRVUkkpIHtcbiAgaWYgKHR5cGVvZiBlbmNvZGVkVVJJICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGBlbmNvZGVkVVJJYCB0byBiZSBvZiB0eXBlIGBzdHJpbmdgLCBnb3QgYCcgKyB0eXBlb2YgZW5jb2RlZFVSSSArICdgJyk7XG4gIH1cblxuICB0cnkge1xuICAgIGVuY29kZWRVUkkgPSBlbmNvZGVkVVJJLnJlcGxhY2UoL1xcKy9nLCAnICcpOyAvLyBUcnkgdGhlIGJ1aWx0IGluIGRlY29kZXIgZmlyc3RcblxuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZW5jb2RlZFVSSSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIEZhbGxiYWNrIHRvIGEgbW9yZSBhZHZhbmNlZCBkZWNvZGVyXG4gICAgcmV0dXJuIGN1c3RvbURlY29kZVVSSUNvbXBvbmVudChlbmNvZGVkVVJJKTtcbiAgfVxufTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///7091\n")},8616:function(module){"use strict";eval("\n\nmodule.exports = function (obj, predicate) {\n var ret = {};\n var keys = Object.keys(obj);\n var isArr = Array.isArray(predicate);\n\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n var val = obj[key];\n\n if (isArr ? predicate.indexOf(key) !== -1 : predicate(key, val, obj)) {\n ret[key] = val;\n }\n }\n\n return ret;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9maWx0ZXItb2JqL2luZGV4LmpzPzI5Y2QiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUJBQWlCLGlCQUFpQjtBQUNsQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EiLCJmaWxlIjoiODYxNi5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqLCBwcmVkaWNhdGUpIHtcbiAgdmFyIHJldCA9IHt9O1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gIHZhciBpc0FyciA9IEFycmF5LmlzQXJyYXkocHJlZGljYXRlKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICB2YXIgdmFsID0gb2JqW2tleV07XG5cbiAgICBpZiAoaXNBcnIgPyBwcmVkaWNhdGUuaW5kZXhPZihrZXkpICE9PSAtMSA6IHByZWRpY2F0ZShrZXksIHZhbCwgb2JqKSkge1xuICAgICAgcmV0W2tleV0gPSB2YWw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldDtcbn07Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///8616\n")},2203:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("\n\nvar _defineProperty = __webpack_require__(9713);\n\nvar _slicedToArray = __webpack_require__(3038);\n\nvar _toConsumableArray = __webpack_require__(319);\n\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nvar strictUriEncode = __webpack_require__(8936);\n\nvar decodeComponent = __webpack_require__(7091);\n\nvar splitOnFirst = __webpack_require__(4734);\n\nvar filterObject = __webpack_require__(8616);\n\nvar isNullOrUndefined = function isNullOrUndefined(value) {\n return value === null || value === undefined;\n};\n\nvar encodeFragmentIdentifier = Symbol('encodeFragmentIdentifier');\n\nfunction encoderForArrayFormat(options) {\n switch (options.arrayFormat) {\n case 'index':\n return function (key) {\n return function (result, value) {\n var index = result.length;\n\n if (value === undefined || options.skipNull && value === null || options.skipEmptyString && value === '') {\n return result;\n }\n\n if (value === null) {\n return [].concat(_toConsumableArray(result), [[encode(key, options), '[', index, ']'].join('')]);\n }\n\n return [].concat(_toConsumableArray(result), [[encode(key, options), '[', encode(index, options), ']=', encode(value, options)].join('')]);\n };\n };\n\n case 'bracket':\n return function (key) {\n return function (result, value) {\n if (value === undefined || options.skipNull && value === null || options.skipEmptyString && value === '') {\n return result;\n }\n\n if (value === null) {\n return [].concat(_toConsumableArray(result), [[encode(key, options), '[]'].join('')]);\n }\n\n return [].concat(_toConsumableArray(result), [[encode(key, options), '[]=', encode(value, options)].join('')]);\n };\n };\n\n case 'comma':\n case 'separator':\n case 'bracket-separator':\n {\n var keyValueSep = options.arrayFormat === 'bracket-separator' ? '[]=' : '=';\n return function (key) {\n return function (result, value) {\n if (value === undefined || options.skipNull && value === null || options.skipEmptyString && value === '') {\n return result;\n } // Translate null to an empty string so that it doesn't serialize as 'null'\n\n\n value = value === null ? '' : value;\n\n if (result.length === 0) {\n return [[encode(key, options), keyValueSep, encode(value, options)].join('')];\n }\n\n return [[result, encode(value, options)].join(options.arrayFormatSeparator)];\n };\n };\n }\n\n default:\n return function (key) {\n return function (result, value) {\n if (value === undefined || options.skipNull && value === null || options.skipEmptyString && value === '') {\n return result;\n }\n\n if (value === null) {\n return [].concat(_toConsumableArray(result), [encode(key, options)]);\n }\n\n return [].concat(_toConsumableArray(result), [[encode(key, options), '=', encode(value, options)].join('')]);\n };\n };\n }\n}\n\nfunction parserForArrayFormat(options) {\n var result;\n\n switch (options.arrayFormat) {\n case 'index':\n return function (key, value, accumulator) {\n result = /\\[(\\d*)\\]$/.exec(key);\n key = key.replace(/\\[\\d*\\]$/, '');\n\n if (!result) {\n accumulator[key] = value;\n return;\n }\n\n if (accumulator[key] === undefined) {\n accumulator[key] = {};\n }\n\n accumulator[key][result[1]] = value;\n };\n\n case 'bracket':\n return function (key, value, accumulator) {\n result = /(\\[\\])$/.exec(key);\n key = key.replace(/\\[\\]$/, '');\n\n if (!result) {\n accumulator[key] = value;\n return;\n }\n\n if (accumulator[key] === undefined) {\n accumulator[key] = [value];\n return;\n }\n\n accumulator[key] = [].concat(accumulator[key], value);\n };\n\n case 'comma':\n case 'separator':\n return function (key, value, accumulator) {\n var isArray = typeof value === 'string' && value.includes(options.arrayFormatSeparator);\n var isEncodedArray = typeof value === 'string' && !isArray && decode(value, options).includes(options.arrayFormatSeparator);\n value = isEncodedArray ? decode(value, options) : value;\n var newValue = isArray || isEncodedArray ? value.split(options.arrayFormatSeparator).map(function (item) {\n return decode(item, options);\n }) : value === null ? value : decode(value, options);\n accumulator[key] = newValue;\n };\n\n case 'bracket-separator':\n return function (key, value, accumulator) {\n var isArray = /(\\[\\])$/.test(key);\n key = key.replace(/\\[\\]$/, '');\n\n if (!isArray) {\n accumulator[key] = value ? decode(value, options) : value;\n return;\n }\n\n var arrayValue = value === null ? [] : value.split(options.arrayFormatSeparator).map(function (item) {\n return decode(item, options);\n });\n\n if (accumulator[key] === undefined) {\n accumulator[key] = arrayValue;\n return;\n }\n\n accumulator[key] = [].concat(accumulator[key], arrayValue);\n };\n\n default:\n return function (key, value, accumulator) {\n if (accumulator[key] === undefined) {\n accumulator[key] = value;\n return;\n }\n\n accumulator[key] = [].concat(accumulator[key], value);\n };\n }\n}\n\nfunction validateArrayFormatSeparator(value) {\n if (typeof value !== 'string' || value.length !== 1) {\n throw new TypeError('arrayFormatSeparator must be single character string');\n }\n}\n\nfunction encode(value, options) {\n if (options.encode) {\n return options.strict ? strictUriEncode(value) : encodeURIComponent(value);\n }\n\n return value;\n}\n\nfunction decode(value, options) {\n if (options.decode) {\n return decodeComponent(value);\n }\n\n return value;\n}\n\nfunction keysSorter(input) {\n if (Array.isArray(input)) {\n return input.sort();\n }\n\n if (typeof input === 'object') {\n return keysSorter(Object.keys(input)).sort(function (a, b) {\n return Number(a) - Number(b);\n }).map(function (key) {\n return input[key];\n });\n }\n\n return input;\n}\n\nfunction removeHash(input) {\n var hashStart = input.indexOf('#');\n\n if (hashStart !== -1) {\n input = input.slice(0, hashStart);\n }\n\n return input;\n}\n\nfunction getHash(url) {\n var hash = '';\n var hashStart = url.indexOf('#');\n\n if (hashStart !== -1) {\n hash = url.slice(hashStart);\n }\n\n return hash;\n}\n\nfunction extract(input) {\n input = removeHash(input);\n var queryStart = input.indexOf('?');\n\n if (queryStart === -1) {\n return '';\n }\n\n return input.slice(queryStart + 1);\n}\n\nfunction parseValue(value, options) {\n if (options.parseNumbers && !Number.isNaN(Number(value)) && typeof value === 'string' && value.trim() !== '') {\n value = Number(value);\n } else if (options.parseBooleans && value !== null && (value.toLowerCase() === 'true' || value.toLowerCase() === 'false')) {\n value = value.toLowerCase() === 'true';\n }\n\n return value;\n}\n\nfunction parse(query, options) {\n options = Object.assign({\n decode: true,\n sort: true,\n arrayFormat: 'none',\n arrayFormatSeparator: ',',\n parseNumbers: false,\n parseBooleans: false\n }, options);\n validateArrayFormatSeparator(options.arrayFormatSeparator);\n var formatter = parserForArrayFormat(options); // Create an object with no prototype\n\n var ret = Object.create(null);\n\n if (typeof query !== 'string') {\n return ret;\n }\n\n query = query.trim().replace(/^[?#&]/, '');\n\n if (!query) {\n return ret;\n }\n\n var _iterator = _createForOfIteratorHelper(query.split('&')),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var param = _step.value;\n\n if (param === '') {\n continue;\n }\n\n var _splitOnFirst = splitOnFirst(options.decode ? param.replace(/\\+/g, ' ') : param, '='),\n _splitOnFirst2 = _slicedToArray(_splitOnFirst, 2),\n _key = _splitOnFirst2[0],\n _value = _splitOnFirst2[1]; // Missing `=` should be `null`:\n // http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters\n\n\n _value = _value === undefined ? null : ['comma', 'separator', 'bracket-separator'].includes(options.arrayFormat) ? _value : decode(_value, options);\n formatter(decode(_key, options), _value, ret);\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n for (var _i = 0, _Object$keys = Object.keys(ret); _i < _Object$keys.length; _i++) {\n var key = _Object$keys[_i];\n var value = ret[key];\n\n if (typeof value === 'object' && value !== null) {\n for (var _i2 = 0, _Object$keys2 = Object.keys(value); _i2 < _Object$keys2.length; _i2++) {\n var k = _Object$keys2[_i2];\n value[k] = parseValue(value[k], options);\n }\n } else {\n ret[key] = parseValue(value, options);\n }\n }\n\n if (options.sort === false) {\n return ret;\n }\n\n return (options.sort === true ? Object.keys(ret).sort() : Object.keys(ret).sort(options.sort)).reduce(function (result, key) {\n var value = ret[key];\n\n if (Boolean(value) && typeof value === 'object' && !Array.isArray(value)) {\n // Sort object keys, not values\n result[key] = keysSorter(value);\n } else {\n result[key] = value;\n }\n\n return result;\n }, Object.create(null));\n}\n\nexports.extract = extract;\nexports.parse = parse;\n\nexports.stringify = function (object, options) {\n if (!object) {\n return '';\n }\n\n options = Object.assign({\n encode: true,\n strict: true,\n arrayFormat: 'none',\n arrayFormatSeparator: ','\n }, options);\n validateArrayFormatSeparator(options.arrayFormatSeparator);\n\n var shouldFilter = function shouldFilter(key) {\n return options.skipNull && isNullOrUndefined(object[key]) || options.skipEmptyString && object[key] === '';\n };\n\n var formatter = encoderForArrayFormat(options);\n var objectCopy = {};\n\n for (var _i3 = 0, _Object$keys3 = Object.keys(object); _i3 < _Object$keys3.length; _i3++) {\n var key = _Object$keys3[_i3];\n\n if (!shouldFilter(key)) {\n objectCopy[key] = object[key];\n }\n }\n\n var keys = Object.keys(objectCopy);\n\n if (options.sort !== false) {\n keys.sort(options.sort);\n }\n\n return keys.map(function (key) {\n var value = object[key];\n\n if (value === undefined) {\n return '';\n }\n\n if (value === null) {\n return encode(key, options);\n }\n\n if (Array.isArray(value)) {\n if (value.length === 0 && options.arrayFormat === 'bracket-separator') {\n return encode(key, options) + '[]';\n }\n\n return value.reduce(formatter(key), []).join('&');\n }\n\n return encode(key, options) + '=' + encode(value, options);\n }).filter(function (x) {\n return x.length > 0;\n }).join('&');\n};\n\nexports.parseUrl = function (url, options) {\n options = Object.assign({\n decode: true\n }, options);\n\n var _splitOnFirst3 = splitOnFirst(url, '#'),\n _splitOnFirst4 = _slicedToArray(_splitOnFirst3, 2),\n url_ = _splitOnFirst4[0],\n hash = _splitOnFirst4[1];\n\n return Object.assign({\n url: url_.split('?')[0] || '',\n query: parse(extract(url), options)\n }, options && options.parseFragmentIdentifier && hash ? {\n fragmentIdentifier: decode(hash, options)\n } : {});\n};\n\nexports.stringifyUrl = function (object, options) {\n options = Object.assign(_defineProperty({\n encode: true,\n strict: true\n }, encodeFragmentIdentifier, true), options);\n var url = removeHash(object.url).split('?')[0] || '';\n var queryFromUrl = exports.extract(object.url);\n var parsedQueryFromUrl = exports.parse(queryFromUrl, {\n sort: false\n });\n var query = Object.assign(parsedQueryFromUrl, object.query);\n var queryString = exports.stringify(query, options);\n\n if (queryString) {\n queryString = \"?\".concat(queryString);\n }\n\n var hash = getHash(object.url);\n\n if (object.fragmentIdentifier) {\n hash = \"#\".concat(options[encodeFragmentIdentifier] ? encode(object.fragmentIdentifier, options) : object.fragmentIdentifier);\n }\n\n return \"\".concat(url).concat(queryString).concat(hash);\n};\n\nexports.pick = function (input, filter, options) {\n options = Object.assign(_defineProperty({\n parseFragmentIdentifier: true\n }, encodeFragmentIdentifier, false), options);\n\n var _exports$parseUrl = exports.parseUrl(input, options),\n url = _exports$parseUrl.url,\n query = _exports$parseUrl.query,\n fragmentIdentifier = _exports$parseUrl.fragmentIdentifier;\n\n return exports.stringifyUrl({\n url: url,\n query: filterObject(query, filter),\n fragmentIdentifier: fragmentIdentifier\n }, options);\n};\n\nexports.exclude = function (input, filter, options) {\n var exclusionFilter = Array.isArray(filter) ? function (key) {\n return !filter.includes(key);\n } : function (key, value) {\n return !filter(key, value);\n };\n return exports.pick(input, exclusionFilter, options);\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9xdWVyeS1zdHJpbmcvaW5kZXguanM/MDIxMyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixzQkFBc0IsbUJBQU8sQ0FBQyxJQUEyRzs7QUFFekkscUJBQXFCLG1CQUFPLENBQUMsSUFBMEc7O0FBRXZJLHlCQUF5QixtQkFBTyxDQUFDLEdBQThHOztBQUUvSSx3REFBd0QsaUZBQWlGLFdBQVcsd0hBQXdILGdCQUFnQixXQUFXLHlCQUF5QixTQUFTLHdCQUF3Qiw0QkFBNEIsY0FBYyxTQUFTLDhCQUE4QixFQUFFLHFCQUFxQixVQUFVLEVBQUUsU0FBUyxFQUFFLDhKQUE4SixFQUFFLGtEQUFrRCxTQUFTLGtCQUFrQixpQkFBaUIsRUFBRSxtQkFBbUIsc0JBQXNCLDhCQUE4QixhQUFhLEVBQUUsc0JBQXNCLGVBQWUsV0FBVyxFQUFFLG1CQUFtQixNQUFNLHlEQUF5RCxFQUFFLFVBQVUsdUJBQXVCLEVBQUUsRUFBRSxHQUFHOztBQUVwK0IsaURBQWlELGdCQUFnQixnRUFBZ0Usd0RBQXdELDZEQUE2RCxzREFBc0Qsa0hBQWtIOztBQUU5WixzQ0FBc0MsdURBQXVELHVDQUF1QyxTQUFTLE9BQU8sa0JBQWtCLEVBQUUsYUFBYTs7QUFFckwsc0JBQXNCLG1CQUFPLENBQUMsSUFBbUI7O0FBRWpELHNCQUFzQixtQkFBTyxDQUFDLElBQXNCOztBQUVwRCxtQkFBbUIsbUJBQU8sQ0FBQyxJQUFnQjs7QUFFM0MsbUJBQW1CLG1CQUFPLENBQUMsSUFBWTs7QUFFdkM7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhOzs7QUFHYjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsZ0RBQWdEOztBQUVoRDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSx1QkFBdUIsK0JBQStCO0FBQ3REOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUM7QUFDckM7OztBQUdBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBLG1EQUFtRCwwQkFBMEI7QUFDN0U7QUFDQTs7QUFFQTtBQUNBLDJEQUEyRCw0QkFBNEI7QUFDdkY7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7QUFFQSxlQUFlO0FBQ2YsYUFBYTs7QUFFYixpQkFBaUI7QUFDakI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsd0RBQXdELDRCQUE0QjtBQUNwRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7O0FBRUEsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUcsS0FBSztBQUNSOztBQUVBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsWUFBWTtBQUNaO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBLGVBQWU7QUFDZjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjIyMDMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiL2hvbWUvcnVubmVyL3dvcmsvanVzdGljZTQwLXRvb2wvanVzdGljZTQwLXRvb2wvY2xpZW50L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpO1xuXG52YXIgX3NsaWNlZFRvQXJyYXkgPSByZXF1aXJlKFwiL2hvbWUvcnVubmVyL3dvcmsvanVzdGljZTQwLXRvb2wvanVzdGljZTQwLXRvb2wvY2xpZW50L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIik7XG5cbnZhciBfdG9Db25zdW1hYmxlQXJyYXkgPSByZXF1aXJlKFwiL2hvbWUvcnVubmVyL3dvcmsvanVzdGljZTQwLXRvb2wvanVzdGljZTQwLXRvb2wvY2xpZW50L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5XCIpO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQgPSB0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXSB8fCBvW1wiQEBpdGVyYXRvclwiXTsgaWYgKCFpdCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHZhciBGID0gZnVuY3Rpb24gRigpIHt9OyByZXR1cm4geyBzOiBGLCBuOiBmdW5jdGlvbiBuKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9LCBlOiBmdW5jdGlvbiBlKF9lKSB7IHRocm93IF9lOyB9LCBmOiBGIH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSwgZGlkRXJyID0gZmFsc2UsIGVycjsgcmV0dXJuIHsgczogZnVuY3Rpb24gcygpIHsgaXQgPSBpdC5jYWxsKG8pOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgc3RlcCA9IGl0Lm5leHQoKTsgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTsgcmV0dXJuIHN0ZXA7IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IGRpZEVyciA9IHRydWU7IGVyciA9IF9lMjsgfSwgZjogZnVuY3Rpb24gZigpIHsgdHJ5IHsgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0LnJldHVybiAhPSBudWxsKSBpdC5yZXR1cm4oKTsgfSBmaW5hbGx5IHsgaWYgKGRpZEVycikgdGhyb3cgZXJyOyB9IH0gfTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbnZhciBzdHJpY3RVcmlFbmNvZGUgPSByZXF1aXJlKCdzdHJpY3QtdXJpLWVuY29kZScpO1xuXG52YXIgZGVjb2RlQ29tcG9uZW50ID0gcmVxdWlyZSgnZGVjb2RlLXVyaS1jb21wb25lbnQnKTtcblxudmFyIHNwbGl0T25GaXJzdCA9IHJlcXVpcmUoJ3NwbGl0LW9uLWZpcnN0Jyk7XG5cbnZhciBmaWx0ZXJPYmplY3QgPSByZXF1aXJlKCdmaWx0ZXItb2JqJyk7XG5cbnZhciBpc051bGxPclVuZGVmaW5lZCA9IGZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkO1xufTtcblxudmFyIGVuY29kZUZyYWdtZW50SWRlbnRpZmllciA9IFN5bWJvbCgnZW5jb2RlRnJhZ21lbnRJZGVudGlmaWVyJyk7XG5cbmZ1bmN0aW9uIGVuY29kZXJGb3JBcnJheUZvcm1hdChvcHRpb25zKSB7XG4gIHN3aXRjaCAob3B0aW9ucy5hcnJheUZvcm1hdCkge1xuICAgIGNhc2UgJ2luZGV4JzpcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAocmVzdWx0LCB2YWx1ZSkge1xuICAgICAgICAgIHZhciBpbmRleCA9IHJlc3VsdC5sZW5ndGg7XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLnNraXBOdWxsICYmIHZhbHVlID09PSBudWxsIHx8IG9wdGlvbnMuc2tpcEVtcHR5U3RyaW5nICYmIHZhbHVlID09PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHJlc3VsdCksIFtbZW5jb2RlKGtleSwgb3B0aW9ucyksICdbJywgaW5kZXgsICddJ10uam9pbignJyldKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShyZXN1bHQpLCBbW2VuY29kZShrZXksIG9wdGlvbnMpLCAnWycsIGVuY29kZShpbmRleCwgb3B0aW9ucyksICddPScsIGVuY29kZSh2YWx1ZSwgb3B0aW9ucyldLmpvaW4oJycpXSk7XG4gICAgICAgIH07XG4gICAgICB9O1xuXG4gICAgY2FzZSAnYnJhY2tldCc6XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHJlc3VsdCwgdmFsdWUpIHtcbiAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLnNraXBOdWxsICYmIHZhbHVlID09PSBudWxsIHx8IG9wdGlvbnMuc2tpcEVtcHR5U3RyaW5nICYmIHZhbHVlID09PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHJlc3VsdCksIFtbZW5jb2RlKGtleSwgb3B0aW9ucyksICdbXSddLmpvaW4oJycpXSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkocmVzdWx0KSwgW1tlbmNvZGUoa2V5LCBvcHRpb25zKSwgJ1tdPScsIGVuY29kZSh2YWx1ZSwgb3B0aW9ucyldLmpvaW4oJycpXSk7XG4gICAgICAgIH07XG4gICAgICB9O1xuXG4gICAgY2FzZSAnY29tbWEnOlxuICAgIGNhc2UgJ3NlcGFyYXRvcic6XG4gICAgY2FzZSAnYnJhY2tldC1zZXBhcmF0b3InOlxuICAgICAge1xuICAgICAgICB2YXIga2V5VmFsdWVTZXAgPSBvcHRpb25zLmFycmF5Rm9ybWF0ID09PSAnYnJhY2tldC1zZXBhcmF0b3InID8gJ1tdPScgOiAnPSc7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChyZXN1bHQsIHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLnNraXBOdWxsICYmIHZhbHVlID09PSBudWxsIHx8IG9wdGlvbnMuc2tpcEVtcHR5U3RyaW5nICYmIHZhbHVlID09PSAnJykge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSAvLyBUcmFuc2xhdGUgbnVsbCB0byBhbiBlbXB0eSBzdHJpbmcgc28gdGhhdCBpdCBkb2Vzbid0IHNlcmlhbGl6ZSBhcyAnbnVsbCdcblxuXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlID09PSBudWxsID8gJycgOiB2YWx1ZTtcblxuICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFtbZW5jb2RlKGtleSwgb3B0aW9ucyksIGtleVZhbHVlU2VwLCBlbmNvZGUodmFsdWUsIG9wdGlvbnMpXS5qb2luKCcnKV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBbW3Jlc3VsdCwgZW5jb2RlKHZhbHVlLCBvcHRpb25zKV0uam9pbihvcHRpb25zLmFycmF5Rm9ybWF0U2VwYXJhdG9yKV07XG4gICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHJlc3VsdCwgdmFsdWUpIHtcbiAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLnNraXBOdWxsICYmIHZhbHVlID09PSBudWxsIHx8IG9wdGlvbnMuc2tpcEVtcHR5U3RyaW5nICYmIHZhbHVlID09PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHJlc3VsdCksIFtlbmNvZGUoa2V5LCBvcHRpb25zKV0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHJlc3VsdCksIFtbZW5jb2RlKGtleSwgb3B0aW9ucyksICc9JywgZW5jb2RlKHZhbHVlLCBvcHRpb25zKV0uam9pbignJyldKTtcbiAgICAgICAgfTtcbiAgICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VyRm9yQXJyYXlGb3JtYXQob3B0aW9ucykge1xuICB2YXIgcmVzdWx0O1xuXG4gIHN3aXRjaCAob3B0aW9ucy5hcnJheUZvcm1hdCkge1xuICAgIGNhc2UgJ2luZGV4JzpcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSwgYWNjdW11bGF0b3IpIHtcbiAgICAgICAgcmVzdWx0ID0gL1xcWyhcXGQqKVxcXSQvLmV4ZWMoa2V5KTtcbiAgICAgICAga2V5ID0ga2V5LnJlcGxhY2UoL1xcW1xcZCpcXF0kLywgJycpO1xuXG4gICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgYWNjdW11bGF0b3Jba2V5XSA9IHZhbHVlO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhY2N1bXVsYXRvcltrZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhY2N1bXVsYXRvcltrZXldID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBhY2N1bXVsYXRvcltrZXldW3Jlc3VsdFsxXV0gPSB2YWx1ZTtcbiAgICAgIH07XG5cbiAgICBjYXNlICdicmFja2V0JzpcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSwgYWNjdW11bGF0b3IpIHtcbiAgICAgICAgcmVzdWx0ID0gLyhcXFtcXF0pJC8uZXhlYyhrZXkpO1xuICAgICAgICBrZXkgPSBrZXkucmVwbGFjZSgvXFxbXFxdJC8sICcnKTtcblxuICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgIGFjY3VtdWxhdG9yW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYWNjdW11bGF0b3Jba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYWNjdW11bGF0b3Jba2V5XSA9IFt2YWx1ZV07XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYWNjdW11bGF0b3Jba2V5XSA9IFtdLmNvbmNhdChhY2N1bXVsYXRvcltrZXldLCB2YWx1ZSk7XG4gICAgICB9O1xuXG4gICAgY2FzZSAnY29tbWEnOlxuICAgIGNhc2UgJ3NlcGFyYXRvcic6XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGtleSwgdmFsdWUsIGFjY3VtdWxhdG9yKSB7XG4gICAgICAgIHZhciBpc0FycmF5ID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5pbmNsdWRlcyhvcHRpb25zLmFycmF5Rm9ybWF0U2VwYXJhdG9yKTtcbiAgICAgICAgdmFyIGlzRW5jb2RlZEFycmF5ID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiAhaXNBcnJheSAmJiBkZWNvZGUodmFsdWUsIG9wdGlvbnMpLmluY2x1ZGVzKG9wdGlvbnMuYXJyYXlGb3JtYXRTZXBhcmF0b3IpO1xuICAgICAgICB2YWx1ZSA9IGlzRW5jb2RlZEFycmF5ID8gZGVjb2RlKHZhbHVlLCBvcHRpb25zKSA6IHZhbHVlO1xuICAgICAgICB2YXIgbmV3VmFsdWUgPSBpc0FycmF5IHx8IGlzRW5jb2RlZEFycmF5ID8gdmFsdWUuc3BsaXQob3B0aW9ucy5hcnJheUZvcm1hdFNlcGFyYXRvcikubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgcmV0dXJuIGRlY29kZShpdGVtLCBvcHRpb25zKTtcbiAgICAgICAgfSkgOiB2YWx1ZSA9PT0gbnVsbCA/IHZhbHVlIDogZGVjb2RlKHZhbHVlLCBvcHRpb25zKTtcbiAgICAgICAgYWNjdW11bGF0b3Jba2V5XSA9IG5ld1ZhbHVlO1xuICAgICAgfTtcblxuICAgIGNhc2UgJ2JyYWNrZXQtc2VwYXJhdG9yJzpcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSwgYWNjdW11bGF0b3IpIHtcbiAgICAgICAgdmFyIGlzQXJyYXkgPSAvKFxcW1xcXSkkLy50ZXN0KGtleSk7XG4gICAgICAgIGtleSA9IGtleS5yZXBsYWNlKC9cXFtcXF0kLywgJycpO1xuXG4gICAgICAgIGlmICghaXNBcnJheSkge1xuICAgICAgICAgIGFjY3VtdWxhdG9yW2tleV0gPSB2YWx1ZSA/IGRlY29kZSh2YWx1ZSwgb3B0aW9ucykgOiB2YWx1ZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYXJyYXlWYWx1ZSA9IHZhbHVlID09PSBudWxsID8gW10gOiB2YWx1ZS5zcGxpdChvcHRpb25zLmFycmF5Rm9ybWF0U2VwYXJhdG9yKS5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICByZXR1cm4gZGVjb2RlKGl0ZW0sIG9wdGlvbnMpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoYWNjdW11bGF0b3Jba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYWNjdW11bGF0b3Jba2V5XSA9IGFycmF5VmFsdWU7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYWNjdW11bGF0b3Jba2V5XSA9IFtdLmNvbmNhdChhY2N1bXVsYXRvcltrZXldLCBhcnJheVZhbHVlKTtcbiAgICAgIH07XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChrZXksIHZhbHVlLCBhY2N1bXVsYXRvcikge1xuICAgICAgICBpZiAoYWNjdW11bGF0b3Jba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYWNjdW11bGF0b3Jba2V5XSA9IHZhbHVlO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGFjY3VtdWxhdG9yW2tleV0gPSBbXS5jb25jYXQoYWNjdW11bGF0b3Jba2V5XSwgdmFsdWUpO1xuICAgICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUFycmF5Rm9ybWF0U2VwYXJhdG9yKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnIHx8IHZhbHVlLmxlbmd0aCAhPT0gMSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FycmF5Rm9ybWF0U2VwYXJhdG9yIG11c3QgYmUgc2luZ2xlIGNoYXJhY3RlciBzdHJpbmcnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbmNvZGUodmFsdWUsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMuZW5jb2RlKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMuc3RyaWN0ID8gc3RyaWN0VXJpRW5jb2RlKHZhbHVlKSA6IGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGRlY29kZSh2YWx1ZSwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucy5kZWNvZGUpIHtcbiAgICByZXR1cm4gZGVjb2RlQ29tcG9uZW50KHZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24ga2V5c1NvcnRlcihpbnB1dCkge1xuICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICByZXR1cm4gaW5wdXQuc29ydCgpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4ga2V5c1NvcnRlcihPYmplY3Qua2V5cyhpbnB1dCkpLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBOdW1iZXIoYSkgLSBOdW1iZXIoYik7XG4gICAgfSkubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHJldHVybiBpbnB1dFtrZXldO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGlucHV0O1xufVxuXG5mdW5jdGlvbiByZW1vdmVIYXNoKGlucHV0KSB7XG4gIHZhciBoYXNoU3RhcnQgPSBpbnB1dC5pbmRleE9mKCcjJyk7XG5cbiAgaWYgKGhhc2hTdGFydCAhPT0gLTEpIHtcbiAgICBpbnB1dCA9IGlucHV0LnNsaWNlKDAsIGhhc2hTdGFydCk7XG4gIH1cblxuICByZXR1cm4gaW5wdXQ7XG59XG5cbmZ1bmN0aW9uIGdldEhhc2godXJsKSB7XG4gIHZhciBoYXNoID0gJyc7XG4gIHZhciBoYXNoU3RhcnQgPSB1cmwuaW5kZXhPZignIycpO1xuXG4gIGlmIChoYXNoU3RhcnQgIT09IC0xKSB7XG4gICAgaGFzaCA9IHVybC5zbGljZShoYXNoU3RhcnQpO1xuICB9XG5cbiAgcmV0dXJuIGhhc2g7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3QoaW5wdXQpIHtcbiAgaW5wdXQgPSByZW1vdmVIYXNoKGlucHV0KTtcbiAgdmFyIHF1ZXJ5U3RhcnQgPSBpbnB1dC5pbmRleE9mKCc/Jyk7XG5cbiAgaWYgKHF1ZXJ5U3RhcnQgPT09IC0xKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcmV0dXJuIGlucHV0LnNsaWNlKHF1ZXJ5U3RhcnQgKyAxKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VWYWx1ZSh2YWx1ZSwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucy5wYXJzZU51bWJlcnMgJiYgIU51bWJlci5pc05hTihOdW1iZXIodmFsdWUpKSAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLnRyaW0oKSAhPT0gJycpIHtcbiAgICB2YWx1ZSA9IE51bWJlcih2YWx1ZSk7XG4gIH0gZWxzZSBpZiAob3B0aW9ucy5wYXJzZUJvb2xlYW5zICYmIHZhbHVlICE9PSBudWxsICYmICh2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZScgfHwgdmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gJ2ZhbHNlJykpIHtcbiAgICB2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJztcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gcGFyc2UocXVlcnksIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe1xuICAgIGRlY29kZTogdHJ1ZSxcbiAgICBzb3J0OiB0cnVlLFxuICAgIGFycmF5Rm9ybWF0OiAnbm9uZScsXG4gICAgYXJyYXlGb3JtYXRTZXBhcmF0b3I6ICcsJyxcbiAgICBwYXJzZU51bWJlcnM6IGZhbHNlLFxuICAgIHBhcnNlQm9vbGVhbnM6IGZhbHNlXG4gIH0sIG9wdGlvbnMpO1xuICB2YWxpZGF0ZUFycmF5Rm9ybWF0U2VwYXJhdG9yKG9wdGlvbnMuYXJyYXlGb3JtYXRTZXBhcmF0b3IpO1xuICB2YXIgZm9ybWF0dGVyID0gcGFyc2VyRm9yQXJyYXlGb3JtYXQob3B0aW9ucyk7IC8vIENyZWF0ZSBhbiBvYmplY3Qgd2l0aCBubyBwcm90b3R5cGVcblxuICB2YXIgcmV0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICBpZiAodHlwZW9mIHF1ZXJ5ICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICBxdWVyeSA9IHF1ZXJ5LnRyaW0oKS5yZXBsYWNlKC9eWz8jJl0vLCAnJyk7XG5cbiAgaWYgKCFxdWVyeSkge1xuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIocXVlcnkuc3BsaXQoJyYnKSksXG4gICAgICBfc3RlcDtcblxuICB0cnkge1xuICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7XG4gICAgICB2YXIgcGFyYW0gPSBfc3RlcC52YWx1ZTtcblxuICAgICAgaWYgKHBhcmFtID09PSAnJykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIF9zcGxpdE9uRmlyc3QgPSBzcGxpdE9uRmlyc3Qob3B0aW9ucy5kZWNvZGUgPyBwYXJhbS5yZXBsYWNlKC9cXCsvZywgJyAnKSA6IHBhcmFtLCAnPScpLFxuICAgICAgICAgIF9zcGxpdE9uRmlyc3QyID0gX3NsaWNlZFRvQXJyYXkoX3NwbGl0T25GaXJzdCwgMiksXG4gICAgICAgICAgX2tleSA9IF9zcGxpdE9uRmlyc3QyWzBdLFxuICAgICAgICAgIF92YWx1ZSA9IF9zcGxpdE9uRmlyc3QyWzFdOyAvLyBNaXNzaW5nIGA9YCBzaG91bGQgYmUgYG51bGxgOlxuICAgICAgLy8gaHR0cDovL3czLm9yZy9UUi8yMDEyL1dELXVybC0yMDEyMDUyNC8jY29sbGVjdC11cmwtcGFyYW1ldGVyc1xuXG5cbiAgICAgIF92YWx1ZSA9IF92YWx1ZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IFsnY29tbWEnLCAnc2VwYXJhdG9yJywgJ2JyYWNrZXQtc2VwYXJhdG9yJ10uaW5jbHVkZXMob3B0aW9ucy5hcnJheUZvcm1hdCkgPyBfdmFsdWUgOiBkZWNvZGUoX3ZhbHVlLCBvcHRpb25zKTtcbiAgICAgIGZvcm1hdHRlcihkZWNvZGUoX2tleSwgb3B0aW9ucyksIF92YWx1ZSwgcmV0KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9pdGVyYXRvci5lKGVycik7XG4gIH0gZmluYWxseSB7XG4gICAgX2l0ZXJhdG9yLmYoKTtcbiAgfVxuXG4gIGZvciAodmFyIF9pID0gMCwgX09iamVjdCRrZXlzID0gT2JqZWN0LmtleXMocmV0KTsgX2kgPCBfT2JqZWN0JGtleXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgdmFyIGtleSA9IF9PYmplY3Qka2V5c1tfaV07XG4gICAgdmFyIHZhbHVlID0gcmV0W2tleV07XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgZm9yICh2YXIgX2kyID0gMCwgX09iamVjdCRrZXlzMiA9IE9iamVjdC5rZXlzKHZhbHVlKTsgX2kyIDwgX09iamVjdCRrZXlzMi5sZW5ndGg7IF9pMisrKSB7XG4gICAgICAgIHZhciBrID0gX09iamVjdCRrZXlzMltfaTJdO1xuICAgICAgICB2YWx1ZVtrXSA9IHBhcnNlVmFsdWUodmFsdWVba10sIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXRba2V5XSA9IHBhcnNlVmFsdWUodmFsdWUsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChvcHRpb25zLnNvcnQgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIHJldHVybiAob3B0aW9ucy5zb3J0ID09PSB0cnVlID8gT2JqZWN0LmtleXMocmV0KS5zb3J0KCkgOiBPYmplY3Qua2V5cyhyZXQpLnNvcnQob3B0aW9ucy5zb3J0KSkucmVkdWNlKGZ1bmN0aW9uIChyZXN1bHQsIGtleSkge1xuICAgIHZhciB2YWx1ZSA9IHJldFtrZXldO1xuXG4gICAgaWYgKEJvb2xlYW4odmFsdWUpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAvLyBTb3J0IG9iamVjdCBrZXlzLCBub3QgdmFsdWVzXG4gICAgICByZXN1bHRba2V5XSA9IGtleXNTb3J0ZXIodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sIE9iamVjdC5jcmVhdGUobnVsbCkpO1xufVxuXG5leHBvcnRzLmV4dHJhY3QgPSBleHRyYWN0O1xuZXhwb3J0cy5wYXJzZSA9IHBhcnNlO1xuXG5leHBvcnRzLnN0cmluZ2lmeSA9IGZ1bmN0aW9uIChvYmplY3QsIG9wdGlvbnMpIHtcbiAgaWYgKCFvYmplY3QpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7XG4gICAgZW5jb2RlOiB0cnVlLFxuICAgIHN0cmljdDogdHJ1ZSxcbiAgICBhcnJheUZvcm1hdDogJ25vbmUnLFxuICAgIGFycmF5Rm9ybWF0U2VwYXJhdG9yOiAnLCdcbiAgfSwgb3B0aW9ucyk7XG4gIHZhbGlkYXRlQXJyYXlGb3JtYXRTZXBhcmF0b3Iob3B0aW9ucy5hcnJheUZvcm1hdFNlcGFyYXRvcik7XG5cbiAgdmFyIHNob3VsZEZpbHRlciA9IGZ1bmN0aW9uIHNob3VsZEZpbHRlcihrZXkpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5za2lwTnVsbCAmJiBpc051bGxPclVuZGVmaW5lZChvYmplY3Rba2V5XSkgfHwgb3B0aW9ucy5za2lwRW1wdHlTdHJpbmcgJiYgb2JqZWN0W2tleV0gPT09ICcnO1xuICB9O1xuXG4gIHZhciBmb3JtYXR0ZXIgPSBlbmNvZGVyRm9yQXJyYXlGb3JtYXQob3B0aW9ucyk7XG4gIHZhciBvYmplY3RDb3B5ID0ge307XG5cbiAgZm9yICh2YXIgX2kzID0gMCwgX09iamVjdCRrZXlzMyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IF9pMyA8IF9PYmplY3Qka2V5czMubGVuZ3RoOyBfaTMrKykge1xuICAgIHZhciBrZXkgPSBfT2JqZWN0JGtleXMzW19pM107XG5cbiAgICBpZiAoIXNob3VsZEZpbHRlcihrZXkpKSB7XG4gICAgICBvYmplY3RDb3B5W2tleV0gPSBvYmplY3Rba2V5XTtcbiAgICB9XG4gIH1cblxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdENvcHkpO1xuXG4gIGlmIChvcHRpb25zLnNvcnQgIT09IGZhbHNlKSB7XG4gICAga2V5cy5zb3J0KG9wdGlvbnMuc29ydCk7XG4gIH1cblxuICByZXR1cm4ga2V5cy5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciB2YWx1ZSA9IG9iamVjdFtrZXldO1xuXG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBlbmNvZGUoa2V5LCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDAgJiYgb3B0aW9ucy5hcnJheUZvcm1hdCA9PT0gJ2JyYWNrZXQtc2VwYXJhdG9yJykge1xuICAgICAgICByZXR1cm4gZW5jb2RlKGtleSwgb3B0aW9ucykgKyAnW10nO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdmFsdWUucmVkdWNlKGZvcm1hdHRlcihrZXkpLCBbXSkuam9pbignJicpO1xuICAgIH1cblxuICAgIHJldHVybiBlbmNvZGUoa2V5LCBvcHRpb25zKSArICc9JyArIGVuY29kZSh2YWx1ZSwgb3B0aW9ucyk7XG4gIH0pLmZpbHRlcihmdW5jdGlvbiAoeCkge1xuICAgIHJldHVybiB4Lmxlbmd0aCA+IDA7XG4gIH0pLmpvaW4oJyYnKTtcbn07XG5cbmV4cG9ydHMucGFyc2VVcmwgPSBmdW5jdGlvbiAodXJsLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHtcbiAgICBkZWNvZGU6IHRydWVcbiAgfSwgb3B0aW9ucyk7XG5cbiAgdmFyIF9zcGxpdE9uRmlyc3QzID0gc3BsaXRPbkZpcnN0KHVybCwgJyMnKSxcbiAgICAgIF9zcGxpdE9uRmlyc3Q0ID0gX3NsaWNlZFRvQXJyYXkoX3NwbGl0T25GaXJzdDMsIDIpLFxuICAgICAgdXJsXyA9IF9zcGxpdE9uRmlyc3Q0WzBdLFxuICAgICAgaGFzaCA9IF9zcGxpdE9uRmlyc3Q0WzFdO1xuXG4gIHJldHVybiBPYmplY3QuYXNzaWduKHtcbiAgICB1cmw6IHVybF8uc3BsaXQoJz8nKVswXSB8fCAnJyxcbiAgICBxdWVyeTogcGFyc2UoZXh0cmFjdCh1cmwpLCBvcHRpb25zKVxuICB9LCBvcHRpb25zICYmIG9wdGlvbnMucGFyc2VGcmFnbWVudElkZW50aWZpZXIgJiYgaGFzaCA/IHtcbiAgICBmcmFnbWVudElkZW50aWZpZXI6IGRlY29kZShoYXNoLCBvcHRpb25zKVxuICB9IDoge30pO1xufTtcblxuZXhwb3J0cy5zdHJpbmdpZnlVcmwgPSBmdW5jdGlvbiAob2JqZWN0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKF9kZWZpbmVQcm9wZXJ0eSh7XG4gICAgZW5jb2RlOiB0cnVlLFxuICAgIHN0cmljdDogdHJ1ZVxuICB9LCBlbmNvZGVGcmFnbWVudElkZW50aWZpZXIsIHRydWUpLCBvcHRpb25zKTtcbiAgdmFyIHVybCA9IHJlbW92ZUhhc2gob2JqZWN0LnVybCkuc3BsaXQoJz8nKVswXSB8fCAnJztcbiAgdmFyIHF1ZXJ5RnJvbVVybCA9IGV4cG9ydHMuZXh0cmFjdChvYmplY3QudXJsKTtcbiAgdmFyIHBhcnNlZFF1ZXJ5RnJvbVVybCA9IGV4cG9ydHMucGFyc2UocXVlcnlGcm9tVXJsLCB7XG4gICAgc29ydDogZmFsc2VcbiAgfSk7XG4gIHZhciBxdWVyeSA9IE9iamVjdC5hc3NpZ24ocGFyc2VkUXVlcnlGcm9tVXJsLCBvYmplY3QucXVlcnkpO1xuICB2YXIgcXVlcnlTdHJpbmcgPSBleHBvcnRzLnN0cmluZ2lmeShxdWVyeSwgb3B0aW9ucyk7XG5cbiAgaWYgKHF1ZXJ5U3RyaW5nKSB7XG4gICAgcXVlcnlTdHJpbmcgPSBcIj9cIi5jb25jYXQocXVlcnlTdHJpbmcpO1xuICB9XG5cbiAgdmFyIGhhc2ggPSBnZXRIYXNoKG9iamVjdC51cmwpO1xuXG4gIGlmIChvYmplY3QuZnJhZ21lbnRJZGVudGlmaWVyKSB7XG4gICAgaGFzaCA9IFwiI1wiLmNvbmNhdChvcHRpb25zW2VuY29kZUZyYWdtZW50SWRlbnRpZmllcl0gPyBlbmNvZGUob2JqZWN0LmZyYWdtZW50SWRlbnRpZmllciwgb3B0aW9ucykgOiBvYmplY3QuZnJhZ21lbnRJZGVudGlmaWVyKTtcbiAgfVxuXG4gIHJldHVybiBcIlwiLmNvbmNhdCh1cmwpLmNvbmNhdChxdWVyeVN0cmluZykuY29uY2F0KGhhc2gpO1xufTtcblxuZXhwb3J0cy5waWNrID0gZnVuY3Rpb24gKGlucHV0LCBmaWx0ZXIsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oX2RlZmluZVByb3BlcnR5KHtcbiAgICBwYXJzZUZyYWdtZW50SWRlbnRpZmllcjogdHJ1ZVxuICB9LCBlbmNvZGVGcmFnbWVudElkZW50aWZpZXIsIGZhbHNlKSwgb3B0aW9ucyk7XG5cbiAgdmFyIF9leHBvcnRzJHBhcnNlVXJsID0gZXhwb3J0cy5wYXJzZVVybChpbnB1dCwgb3B0aW9ucyksXG4gICAgICB1cmwgPSBfZXhwb3J0cyRwYXJzZVVybC51cmwsXG4gICAgICBxdWVyeSA9IF9leHBvcnRzJHBhcnNlVXJsLnF1ZXJ5LFxuICAgICAgZnJhZ21lbnRJZGVudGlmaWVyID0gX2V4cG9ydHMkcGFyc2VVcmwuZnJhZ21lbnRJZGVudGlmaWVyO1xuXG4gIHJldHVybiBleHBvcnRzLnN0cmluZ2lmeVVybCh7XG4gICAgdXJsOiB1cmwsXG4gICAgcXVlcnk6IGZpbHRlck9iamVjdChxdWVyeSwgZmlsdGVyKSxcbiAgICBmcmFnbWVudElkZW50aWZpZXI6IGZyYWdtZW50SWRlbnRpZmllclxuICB9LCBvcHRpb25zKTtcbn07XG5cbmV4cG9ydHMuZXhjbHVkZSA9IGZ1bmN0aW9uIChpbnB1dCwgZmlsdGVyLCBvcHRpb25zKSB7XG4gIHZhciBleGNsdXNpb25GaWx0ZXIgPSBBcnJheS5pc0FycmF5KGZpbHRlcikgPyBmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuICFmaWx0ZXIuaW5jbHVkZXMoa2V5KTtcbiAgfSA6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuICFmaWx0ZXIoa2V5LCB2YWx1ZSk7XG4gIH07XG4gIHJldHVybiBleHBvcnRzLnBpY2soaW5wdXQsIGV4Y2x1c2lvbkZpbHRlciwgb3B0aW9ucyk7XG59OyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///2203\n")},2993:function(module){eval("/* global Map:readonly, Set:readonly, ArrayBuffer:readonly */\nvar hasElementType = typeof Element !== 'undefined';\nvar hasMap = typeof Map === 'function';\nvar hasSet = typeof Set === 'function';\nvar hasArrayBuffer = typeof ArrayBuffer === 'function' && !!ArrayBuffer.isView; // Note: We **don't** need `envHasBigInt64Array` in fde es6/index.js\n\nfunction equal(a, b) {\n // START: fast-deep-equal es6/index.js 3.1.1\n if (a === b) return true;\n\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n if (a.constructor !== b.constructor) return false;\n var length, i, keys;\n\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n\n for (i = length; i-- !== 0;) {\n if (!equal(a[i], b[i])) return false;\n }\n\n return true;\n } // START: Modifications:\n // 1. Extra `has &&` helpers in initial condition allow es6 code\n // to co-exist with es5.\n // 2. Replace `for of` with es5 compliant iteration using `for`.\n // Basically, take:\n //\n // ```js\n // for (i of a.entries())\n // if (!b.has(i[0])) return false;\n // ```\n //\n // ... and convert to:\n //\n // ```js\n // it = a.entries();\n // while (!(i = it.next()).done)\n // if (!b.has(i.value[0])) return false;\n // ```\n //\n // **Note**: `i` access switches to `i.value`.\n\n\n var it;\n\n if (hasMap && a instanceof Map && b instanceof Map) {\n if (a.size !== b.size) return false;\n it = a.entries();\n\n while (!(i = it.next()).done) {\n if (!b.has(i.value[0])) return false;\n }\n\n it = a.entries();\n\n while (!(i = it.next()).done) {\n if (!equal(i.value[1], b.get(i.value[0]))) return false;\n }\n\n return true;\n }\n\n if (hasSet && a instanceof Set && b instanceof Set) {\n if (a.size !== b.size) return false;\n it = a.entries();\n\n while (!(i = it.next()).done) {\n if (!b.has(i.value[0])) return false;\n }\n\n return true;\n } // END: Modifications\n\n\n if (hasArrayBuffer && ArrayBuffer.isView(a) && ArrayBuffer.isView(b)) {\n length = a.length;\n if (length != b.length) return false;\n\n for (i = length; i-- !== 0;) {\n if (a[i] !== b[i]) return false;\n }\n\n return true;\n }\n\n if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\n if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0;) {\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n } // END: fast-deep-equal\n // START: react-fast-compare\n // custom handling for DOM elements\n\n\n if (hasElementType && a instanceof Element) return false; // custom handling for React/Preact\n\n for (i = length; i-- !== 0;) {\n if ((keys[i] === '_owner' || keys[i] === '__v' || keys[i] === '__o') && a.$$typeof) {\n // React-specific: avoid traversing React elements' _owner\n // Preact-specific: avoid traversing Preact elements' __v and __o\n // __v = $_original / $_vnode\n // __o = $_owner\n // These properties contain circular references and are not needed when\n // comparing the actual elements (and not their owners)\n // .$$typeof and ._store on just reasonable markers of elements\n continue;\n } // all other properties should be traversed as usual\n\n\n if (!equal(a[keys[i]], b[keys[i]])) return false;\n } // END: react-fast-compare\n // START: fast-deep-equal\n\n\n return true;\n }\n\n return a !== a && b !== b;\n} // end fast-deep-equal\n\n\nmodule.exports = function isEqual(a, b) {\n try {\n return equal(a, b);\n } catch (error) {\n if ((error.message || '').match(/stack|recursion/i)) {\n // warn on circular references, don't crash\n // browsers give this different errors name and messages:\n // chrome/safari: \"RangeError\", \"Maximum call stack size exceeded\"\n // firefox: \"InternalError\", too much recursion\"\n // edge: \"Error\", \"Out of stack space\"\n console.warn('react-fast-compare cannot handle circular refs');\n return false;\n } // some other error. we should definitely know about these\n\n\n throw error;\n }\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1mYXN0LWNvbXBhcmUvaW5kZXguanM/MWMyNyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtFQUErRTs7QUFFL0U7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsc0JBQXNCLFdBQVc7QUFDakM7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBOztBQUVBLHNCQUFzQixXQUFXO0FBQ2pDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CLFdBQVc7QUFDL0I7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7O0FBR0EsNkRBQTZEOztBQUU3RCxvQkFBb0IsV0FBVztBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUDtBQUNBLEtBQUs7QUFDTDs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7OztBQUdEO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBIiwiZmlsZSI6IjI5OTMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBnbG9iYWwgTWFwOnJlYWRvbmx5LCBTZXQ6cmVhZG9ubHksIEFycmF5QnVmZmVyOnJlYWRvbmx5ICovXG52YXIgaGFzRWxlbWVudFR5cGUgPSB0eXBlb2YgRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCc7XG52YXIgaGFzTWFwID0gdHlwZW9mIE1hcCA9PT0gJ2Z1bmN0aW9uJztcbnZhciBoYXNTZXQgPSB0eXBlb2YgU2V0ID09PSAnZnVuY3Rpb24nO1xudmFyIGhhc0FycmF5QnVmZmVyID0gdHlwZW9mIEFycmF5QnVmZmVyID09PSAnZnVuY3Rpb24nICYmICEhQXJyYXlCdWZmZXIuaXNWaWV3OyAvLyBOb3RlOiBXZSAqKmRvbid0KiogbmVlZCBgZW52SGFzQmlnSW50NjRBcnJheWAgaW4gZmRlIGVzNi9pbmRleC5qc1xuXG5mdW5jdGlvbiBlcXVhbChhLCBiKSB7XG4gIC8vIFNUQVJUOiBmYXN0LWRlZXAtZXF1YWwgZXM2L2luZGV4LmpzIDMuMS4xXG4gIGlmIChhID09PSBiKSByZXR1cm4gdHJ1ZTtcblxuICBpZiAoYSAmJiBiICYmIHR5cGVvZiBhID09ICdvYmplY3QnICYmIHR5cGVvZiBiID09ICdvYmplY3QnKSB7XG4gICAgaWYgKGEuY29uc3RydWN0b3IgIT09IGIuY29uc3RydWN0b3IpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgbGVuZ3RoLCBpLCBrZXlzO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICAgIGxlbmd0aCA9IGEubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCAhPSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspIHtcbiAgICAgICAgaWYgKCFlcXVhbChhW2ldLCBiW2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IC8vIFNUQVJUOiBNb2RpZmljYXRpb25zOlxuICAgIC8vIDEuIEV4dHJhIGBoYXM8VHlwZT4gJiZgIGhlbHBlcnMgaW4gaW5pdGlhbCBjb25kaXRpb24gYWxsb3cgZXM2IGNvZGVcbiAgICAvLyAgICB0byBjby1leGlzdCB3aXRoIGVzNS5cbiAgICAvLyAyLiBSZXBsYWNlIGBmb3Igb2ZgIHdpdGggZXM1IGNvbXBsaWFudCBpdGVyYXRpb24gdXNpbmcgYGZvcmAuXG4gICAgLy8gICAgQmFzaWNhbGx5LCB0YWtlOlxuICAgIC8vXG4gICAgLy8gICAgYGBganNcbiAgICAvLyAgICBmb3IgKGkgb2YgYS5lbnRyaWVzKCkpXG4gICAgLy8gICAgICBpZiAoIWIuaGFzKGlbMF0pKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gICAgYGBgXG4gICAgLy9cbiAgICAvLyAgICAuLi4gYW5kIGNvbnZlcnQgdG86XG4gICAgLy9cbiAgICAvLyAgICBgYGBqc1xuICAgIC8vICAgIGl0ID0gYS5lbnRyaWVzKCk7XG4gICAgLy8gICAgd2hpbGUgKCEoaSA9IGl0Lm5leHQoKSkuZG9uZSlcbiAgICAvLyAgICAgIGlmICghYi5oYXMoaS52YWx1ZVswXSkpIHJldHVybiBmYWxzZTtcbiAgICAvLyAgICBgYGBcbiAgICAvL1xuICAgIC8vICAgICoqTm90ZSoqOiBgaWAgYWNjZXNzIHN3aXRjaGVzIHRvIGBpLnZhbHVlYC5cblxuXG4gICAgdmFyIGl0O1xuXG4gICAgaWYgKGhhc01hcCAmJiBhIGluc3RhbmNlb2YgTWFwICYmIGIgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgIGlmIChhLnNpemUgIT09IGIuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaXQgPSBhLmVudHJpZXMoKTtcblxuICAgICAgd2hpbGUgKCEoaSA9IGl0Lm5leHQoKSkuZG9uZSkge1xuICAgICAgICBpZiAoIWIuaGFzKGkudmFsdWVbMF0pKSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGl0ID0gYS5lbnRyaWVzKCk7XG5cbiAgICAgIHdoaWxlICghKGkgPSBpdC5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgaWYgKCFlcXVhbChpLnZhbHVlWzFdLCBiLmdldChpLnZhbHVlWzBdKSkpIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGhhc1NldCAmJiBhIGluc3RhbmNlb2YgU2V0ICYmIGIgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgIGlmIChhLnNpemUgIT09IGIuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaXQgPSBhLmVudHJpZXMoKTtcblxuICAgICAgd2hpbGUgKCEoaSA9IGl0Lm5leHQoKSkuZG9uZSkge1xuICAgICAgICBpZiAoIWIuaGFzKGkudmFsdWVbMF0pKSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gLy8gRU5EOiBNb2RpZmljYXRpb25zXG5cblxuICAgIGlmIChoYXNBcnJheUJ1ZmZlciAmJiBBcnJheUJ1ZmZlci5pc1ZpZXcoYSkgJiYgQXJyYXlCdWZmZXIuaXNWaWV3KGIpKSB7XG4gICAgICBsZW5ndGggPSBhLmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGggIT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICAgICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gIT09IDA7KSB7XG4gICAgICAgIGlmIChhW2ldICE9PSBiW2ldKSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChhLmNvbnN0cnVjdG9yID09PSBSZWdFeHApIHJldHVybiBhLnNvdXJjZSA9PT0gYi5zb3VyY2UgJiYgYS5mbGFncyA9PT0gYi5mbGFncztcbiAgICBpZiAoYS52YWx1ZU9mICE9PSBPYmplY3QucHJvdG90eXBlLnZhbHVlT2YpIHJldHVybiBhLnZhbHVlT2YoKSA9PT0gYi52YWx1ZU9mKCk7XG4gICAgaWYgKGEudG9TdHJpbmcgIT09IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcpIHJldHVybiBhLnRvU3RyaW5nKCkgPT09IGIudG9TdHJpbmcoKTtcbiAgICBrZXlzID0gT2JqZWN0LmtleXMoYSk7XG4gICAgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgaWYgKGxlbmd0aCAhPT0gT2JqZWN0LmtleXMoYikubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspIHtcbiAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIGtleXNbaV0pKSByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyBFTkQ6IGZhc3QtZGVlcC1lcXVhbFxuICAgIC8vIFNUQVJUOiByZWFjdC1mYXN0LWNvbXBhcmVcbiAgICAvLyBjdXN0b20gaGFuZGxpbmcgZm9yIERPTSBlbGVtZW50c1xuXG5cbiAgICBpZiAoaGFzRWxlbWVudFR5cGUgJiYgYSBpbnN0YW5jZW9mIEVsZW1lbnQpIHJldHVybiBmYWxzZTsgLy8gY3VzdG9tIGhhbmRsaW5nIGZvciBSZWFjdC9QcmVhY3RcblxuICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tICE9PSAwOykge1xuICAgICAgaWYgKChrZXlzW2ldID09PSAnX293bmVyJyB8fCBrZXlzW2ldID09PSAnX192JyB8fCBrZXlzW2ldID09PSAnX19vJykgJiYgYS4kJHR5cGVvZikge1xuICAgICAgICAvLyBSZWFjdC1zcGVjaWZpYzogYXZvaWQgdHJhdmVyc2luZyBSZWFjdCBlbGVtZW50cycgX293bmVyXG4gICAgICAgIC8vIFByZWFjdC1zcGVjaWZpYzogYXZvaWQgdHJhdmVyc2luZyBQcmVhY3QgZWxlbWVudHMnIF9fdiBhbmQgX19vXG4gICAgICAgIC8vICAgIF9fdiA9ICRfb3JpZ2luYWwgLyAkX3Zub2RlXG4gICAgICAgIC8vICAgIF9fbyA9ICRfb3duZXJcbiAgICAgICAgLy8gVGhlc2UgcHJvcGVydGllcyBjb250YWluIGNpcmN1bGFyIHJlZmVyZW5jZXMgYW5kIGFyZSBub3QgbmVlZGVkIHdoZW5cbiAgICAgICAgLy8gY29tcGFyaW5nIHRoZSBhY3R1YWwgZWxlbWVudHMgKGFuZCBub3QgdGhlaXIgb3duZXJzKVxuICAgICAgICAvLyAuJCR0eXBlb2YgYW5kIC5fc3RvcmUgb24ganVzdCByZWFzb25hYmxlIG1hcmtlcnMgb2YgZWxlbWVudHNcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IC8vIGFsbCBvdGhlciBwcm9wZXJ0aWVzIHNob3VsZCBiZSB0cmF2ZXJzZWQgYXMgdXN1YWxcblxuXG4gICAgICBpZiAoIWVxdWFsKGFba2V5c1tpXV0sIGJba2V5c1tpXV0pKSByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyBFTkQ6IHJlYWN0LWZhc3QtY29tcGFyZVxuICAgIC8vIFNUQVJUOiBmYXN0LWRlZXAtZXF1YWxcblxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gYSAhPT0gYSAmJiBiICE9PSBiO1xufSAvLyBlbmQgZmFzdC1kZWVwLWVxdWFsXG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0VxdWFsKGEsIGIpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZXF1YWwoYSwgYik7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKChlcnJvci5tZXNzYWdlIHx8ICcnKS5tYXRjaCgvc3RhY2t8cmVjdXJzaW9uL2kpKSB7XG4gICAgICAvLyB3YXJuIG9uIGNpcmN1bGFyIHJlZmVyZW5jZXMsIGRvbid0IGNyYXNoXG4gICAgICAvLyBicm93c2VycyBnaXZlIHRoaXMgZGlmZmVyZW50IGVycm9ycyBuYW1lIGFuZCBtZXNzYWdlczpcbiAgICAgIC8vIGNocm9tZS9zYWZhcmk6IFwiUmFuZ2VFcnJvclwiLCBcIk1heGltdW0gY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCJcbiAgICAgIC8vIGZpcmVmb3g6IFwiSW50ZXJuYWxFcnJvclwiLCB0b28gbXVjaCByZWN1cnNpb25cIlxuICAgICAgLy8gZWRnZTogXCJFcnJvclwiLCBcIk91dCBvZiBzdGFjayBzcGFjZVwiXG4gICAgICBjb25zb2xlLndhcm4oJ3JlYWN0LWZhc3QtY29tcGFyZSBjYW5ub3QgaGFuZGxlIGNpcmN1bGFyIHJlZnMnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IC8vIHNvbWUgb3RoZXIgZXJyb3IuIHdlIHNob3VsZCBkZWZpbml0ZWx5IGtub3cgYWJvdXQgdGhlc2VcblxuXG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///2993\n")},4839:function(module,__unused_webpack_exports,__webpack_require__){"use strict";eval("\n\nfunction _interopDefault(ex) {\n return ex && typeof ex === 'object' && 'default' in ex ? ex['default'] : ex;\n}\n\nvar React = __webpack_require__(7294);\n\nvar React__default = _interopDefault(React);\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n subClass.__proto__ = superClass;\n}\n\nvar canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);\n\nfunction withSideEffect(reducePropsToState, handleStateChangeOnClient, mapStateOnServer) {\n if (typeof reducePropsToState !== 'function') {\n throw new Error('Expected reducePropsToState to be a function.');\n }\n\n if (typeof handleStateChangeOnClient !== 'function') {\n throw new Error('Expected handleStateChangeOnClient to be a function.');\n }\n\n if (typeof mapStateOnServer !== 'undefined' && typeof mapStateOnServer !== 'function') {\n throw new Error('Expected mapStateOnServer to either be undefined or a function.');\n }\n\n function getDisplayName(WrappedComponent) {\n return WrappedComponent.displayName || WrappedComponent.name || 'Component';\n }\n\n return function wrap(WrappedComponent) {\n if (typeof WrappedComponent !== 'function') {\n throw new Error('Expected WrappedComponent to be a React component.');\n }\n\n var mountedInstances = [];\n var state;\n\n function emitChange() {\n state = reducePropsToState(mountedInstances.map(function (instance) {\n return instance.props;\n }));\n\n if (SideEffect.canUseDOM) {\n handleStateChangeOnClient(state);\n } else if (mapStateOnServer) {\n state = mapStateOnServer(state);\n }\n }\n\n var SideEffect = /*#__PURE__*/function (_PureComponent) {\n _inheritsLoose(SideEffect, _PureComponent);\n\n function SideEffect() {\n return _PureComponent.apply(this, arguments) || this;\n } // Try to use displayName of wrapped component\n // Expose canUseDOM so tests can monkeypatch it\n\n\n SideEffect.peek = function peek() {\n return state;\n };\n\n SideEffect.rewind = function rewind() {\n if (SideEffect.canUseDOM) {\n throw new Error('You may only call rewind() on the server. Call peek() to read the current state.');\n }\n\n var recordedState = state;\n state = undefined;\n mountedInstances = [];\n return recordedState;\n };\n\n var _proto = SideEffect.prototype;\n\n _proto.UNSAFE_componentWillMount = function UNSAFE_componentWillMount() {\n mountedInstances.push(this);\n emitChange();\n };\n\n _proto.componentDidUpdate = function componentDidUpdate() {\n emitChange();\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n var index = mountedInstances.indexOf(this);\n mountedInstances.splice(index, 1);\n emitChange();\n };\n\n _proto.render = function render() {\n return /*#__PURE__*/React__default.createElement(WrappedComponent, this.props);\n };\n\n return SideEffect;\n }(React.PureComponent);\n\n _defineProperty(SideEffect, \"displayName\", \"SideEffect(\" + getDisplayName(WrappedComponent) + \")\");\n\n _defineProperty(SideEffect, \"canUseDOM\", canUseDOM);\n\n return SideEffect;\n };\n}\n\nmodule.exports = withSideEffect;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1zaWRlLWVmZmVjdC9saWIvaW5kZXguanM/YjBkYyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7O0FBRUEsWUFBWSxtQkFBTyxDQUFDLElBQU87O0FBRTNCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiI0ODM5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBfaW50ZXJvcERlZmF1bHQoZXgpIHtcbiAgcmV0dXJuIGV4ICYmIHR5cGVvZiBleCA9PT0gJ29iamVjdCcgJiYgJ2RlZmF1bHQnIGluIGV4ID8gZXhbJ2RlZmF1bHQnXSA6IGV4O1xufVxuXG52YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgUmVhY3RfX2RlZmF1bHQgPSBfaW50ZXJvcERlZmF1bHQoUmVhY3QpO1xuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuZnVuY3Rpb24gX2luaGVyaXRzTG9vc2Uoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSk7XG4gIHN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzO1xuICBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzO1xufVxuXG52YXIgY2FuVXNlRE9NID0gISEodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmRvY3VtZW50ICYmIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcblxuZnVuY3Rpb24gd2l0aFNpZGVFZmZlY3QocmVkdWNlUHJvcHNUb1N0YXRlLCBoYW5kbGVTdGF0ZUNoYW5nZU9uQ2xpZW50LCBtYXBTdGF0ZU9uU2VydmVyKSB7XG4gIGlmICh0eXBlb2YgcmVkdWNlUHJvcHNUb1N0YXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCByZWR1Y2VQcm9wc1RvU3RhdGUgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgaGFuZGxlU3RhdGVDaGFuZ2VPbkNsaWVudCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgaGFuZGxlU3RhdGVDaGFuZ2VPbkNsaWVudCB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBtYXBTdGF0ZU9uU2VydmVyICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgbWFwU3RhdGVPblNlcnZlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgbWFwU3RhdGVPblNlcnZlciB0byBlaXRoZXIgYmUgdW5kZWZpbmVkIG9yIGEgZnVuY3Rpb24uJyk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXREaXNwbGF5TmFtZShXcmFwcGVkQ29tcG9uZW50KSB7XG4gICAgcmV0dXJuIFdyYXBwZWRDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgV3JhcHBlZENvbXBvbmVudC5uYW1lIHx8ICdDb21wb25lbnQnO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIHdyYXAoV3JhcHBlZENvbXBvbmVudCkge1xuICAgIGlmICh0eXBlb2YgV3JhcHBlZENvbXBvbmVudCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBXcmFwcGVkQ29tcG9uZW50IHRvIGJlIGEgUmVhY3QgY29tcG9uZW50LicpO1xuICAgIH1cblxuICAgIHZhciBtb3VudGVkSW5zdGFuY2VzID0gW107XG4gICAgdmFyIHN0YXRlO1xuXG4gICAgZnVuY3Rpb24gZW1pdENoYW5nZSgpIHtcbiAgICAgIHN0YXRlID0gcmVkdWNlUHJvcHNUb1N0YXRlKG1vdW50ZWRJbnN0YW5jZXMubWFwKGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICAgICAgICByZXR1cm4gaW5zdGFuY2UucHJvcHM7XG4gICAgICB9KSk7XG5cbiAgICAgIGlmIChTaWRlRWZmZWN0LmNhblVzZURPTSkge1xuICAgICAgICBoYW5kbGVTdGF0ZUNoYW5nZU9uQ2xpZW50KHN0YXRlKTtcbiAgICAgIH0gZWxzZSBpZiAobWFwU3RhdGVPblNlcnZlcikge1xuICAgICAgICBzdGF0ZSA9IG1hcFN0YXRlT25TZXJ2ZXIoc3RhdGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBTaWRlRWZmZWN0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUHVyZUNvbXBvbmVudCkge1xuICAgICAgX2luaGVyaXRzTG9vc2UoU2lkZUVmZmVjdCwgX1B1cmVDb21wb25lbnQpO1xuXG4gICAgICBmdW5jdGlvbiBTaWRlRWZmZWN0KCkge1xuICAgICAgICByZXR1cm4gX1B1cmVDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgfSAvLyBUcnkgdG8gdXNlIGRpc3BsYXlOYW1lIG9mIHdyYXBwZWQgY29tcG9uZW50XG4gICAgICAvLyBFeHBvc2UgY2FuVXNlRE9NIHNvIHRlc3RzIGNhbiBtb25rZXlwYXRjaCBpdFxuXG5cbiAgICAgIFNpZGVFZmZlY3QucGVlayA9IGZ1bmN0aW9uIHBlZWsoKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH07XG5cbiAgICAgIFNpZGVFZmZlY3QucmV3aW5kID0gZnVuY3Rpb24gcmV3aW5kKCkge1xuICAgICAgICBpZiAoU2lkZUVmZmVjdC5jYW5Vc2VET00pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtYXkgb25seSBjYWxsIHJld2luZCgpIG9uIHRoZSBzZXJ2ZXIuIENhbGwgcGVlaygpIHRvIHJlYWQgdGhlIGN1cnJlbnQgc3RhdGUuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcmVjb3JkZWRTdGF0ZSA9IHN0YXRlO1xuICAgICAgICBzdGF0ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgbW91bnRlZEluc3RhbmNlcyA9IFtdO1xuICAgICAgICByZXR1cm4gcmVjb3JkZWRTdGF0ZTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBfcHJvdG8gPSBTaWRlRWZmZWN0LnByb3RvdHlwZTtcblxuICAgICAgX3Byb3RvLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPSBmdW5jdGlvbiBVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCkge1xuICAgICAgICBtb3VudGVkSW5zdGFuY2VzLnB1c2godGhpcyk7XG4gICAgICAgIGVtaXRDaGFuZ2UoKTtcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5jb21wb25lbnREaWRVcGRhdGUgPSBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUoKSB7XG4gICAgICAgIGVtaXRDaGFuZ2UoKTtcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgICB2YXIgaW5kZXggPSBtb3VudGVkSW5zdGFuY2VzLmluZGV4T2YodGhpcyk7XG4gICAgICAgIG1vdW50ZWRJbnN0YW5jZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgZW1pdENoYW5nZSgpO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KFdyYXBwZWRDb21wb25lbnQsIHRoaXMucHJvcHMpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIFNpZGVFZmZlY3Q7XG4gICAgfShSZWFjdC5QdXJlQ29tcG9uZW50KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShTaWRlRWZmZWN0LCBcImRpc3BsYXlOYW1lXCIsIFwiU2lkZUVmZmVjdChcIiArIGdldERpc3BsYXlOYW1lKFdyYXBwZWRDb21wb25lbnQpICsgXCIpXCIpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KFNpZGVFZmZlY3QsIFwiY2FuVXNlRE9NXCIsIGNhblVzZURPTSk7XG5cbiAgICByZXR1cm4gU2lkZUVmZmVjdDtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB3aXRoU2lkZUVmZmVjdDsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///4839\n")},4734:function(module){"use strict";eval("\n\nmodule.exports = function (string, separator) {\n if (!(typeof string === 'string' && typeof separator === 'string')) {\n throw new TypeError('Expected the arguments to be of type `string`');\n }\n\n if (separator === '') {\n return [string];\n }\n\n var separatorIndex = string.indexOf(separator);\n\n if (separatorIndex === -1) {\n return [string];\n }\n\n return [string.slice(0, separatorIndex), string.slice(separatorIndex + separator.length)];\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9zcGxpdC1vbi1maXJzdC9pbmRleC5qcz8wMGI4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSIsImZpbGUiOiI0NzM0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzdHJpbmcsIHNlcGFyYXRvcikge1xuICBpZiAoISh0eXBlb2Ygc3RyaW5nID09PSAnc3RyaW5nJyAmJiB0eXBlb2Ygc2VwYXJhdG9yID09PSAnc3RyaW5nJykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCB0aGUgYXJndW1lbnRzIHRvIGJlIG9mIHR5cGUgYHN0cmluZ2AnKTtcbiAgfVxuXG4gIGlmIChzZXBhcmF0b3IgPT09ICcnKSB7XG4gICAgcmV0dXJuIFtzdHJpbmddO1xuICB9XG5cbiAgdmFyIHNlcGFyYXRvckluZGV4ID0gc3RyaW5nLmluZGV4T2Yoc2VwYXJhdG9yKTtcblxuICBpZiAoc2VwYXJhdG9ySW5kZXggPT09IC0xKSB7XG4gICAgcmV0dXJuIFtzdHJpbmddO1xuICB9XG5cbiAgcmV0dXJuIFtzdHJpbmcuc2xpY2UoMCwgc2VwYXJhdG9ySW5kZXgpLCBzdHJpbmcuc2xpY2Uoc2VwYXJhdG9ySW5kZXggKyBzZXBhcmF0b3IubGVuZ3RoKV07XG59OyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///4734\n")},8936:function(module){"use strict";eval('\n\nmodule.exports = function (str) {\n return encodeURIComponent(str).replace(/[!\'()*]/g, function (x) {\n return "%".concat(x.charCodeAt(0).toString(16).toUpperCase());\n });\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9zdHJpY3QtdXJpLWVuY29kZS9pbmRleC5qcz9jMWRmIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCIsImZpbGUiOiI4OTM2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChzdHIpLnJlcGxhY2UoL1shJygpKl0vZywgZnVuY3Rpb24gKHgpIHtcbiAgICByZXR1cm4gXCIlXCIuY29uY2F0KHguY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSk7XG4gIH0pO1xufTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///8936\n')},1857:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "Z": function() { return /* binding */ layout; }\n});\n\n// EXTERNAL MODULE: ./node_modules/react/index.js\nvar react = __webpack_require__(7294);\n// EXTERNAL MODULE: ./node_modules/@trussworks/react-uswds/lib/index.js\nvar lib = __webpack_require__(2593);\n// EXTERNAL MODULE: ./node_modules/gatsby-plugin-intl/index.js\nvar gatsby_plugin_intl = __webpack_require__(9703);\n// EXTERNAL MODULE: ./node_modules/prop-types/index.js\nvar prop_types = __webpack_require__(5697);\nvar prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);\n// EXTERNAL MODULE: ./node_modules/react-side-effect/lib/index.js\nvar react_side_effect_lib = __webpack_require__(4839);\nvar react_side_effect_lib_default = /*#__PURE__*/__webpack_require__.n(react_side_effect_lib);\n// EXTERNAL MODULE: ./node_modules/react-fast-compare/index.js\nvar react_fast_compare = __webpack_require__(2993);\nvar react_fast_compare_default = /*#__PURE__*/__webpack_require__.n(react_fast_compare);\n// EXTERNAL MODULE: ./node_modules/gatsby/dist/internal-plugins/bundle-optimisations/polyfills/object-assign.js\nvar object_assign = __webpack_require__(6494);\nvar object_assign_default = /*#__PURE__*/__webpack_require__.n(object_assign);\n;// CONCATENATED MODULE: ./node_modules/react-helmet/es/Helmet.js\n\n\n\n\n\nvar ATTRIBUTE_NAMES = {\n BODY: "bodyAttributes",\n HTML: "htmlAttributes",\n TITLE: "titleAttributes"\n};\nvar TAG_NAMES = {\n BASE: "base",\n BODY: "body",\n HEAD: "head",\n HTML: "html",\n LINK: "link",\n META: "meta",\n NOSCRIPT: "noscript",\n SCRIPT: "script",\n STYLE: "style",\n TITLE: "title"\n};\nvar VALID_TAG_NAMES = Object.keys(TAG_NAMES).map(function (name) {\n return TAG_NAMES[name];\n});\nvar TAG_PROPERTIES = {\n CHARSET: "charset",\n CSS_TEXT: "cssText",\n HREF: "href",\n HTTPEQUIV: "http-equiv",\n INNER_HTML: "innerHTML",\n ITEM_PROP: "itemprop",\n NAME: "name",\n PROPERTY: "property",\n REL: "rel",\n SRC: "src",\n TARGET: "target"\n};\nvar REACT_TAG_MAP = {\n accesskey: "accessKey",\n charset: "charSet",\n class: "className",\n contenteditable: "contentEditable",\n contextmenu: "contextMenu",\n "http-equiv": "httpEquiv",\n itemprop: "itemProp",\n tabindex: "tabIndex"\n};\nvar HELMET_PROPS = {\n DEFAULT_TITLE: "defaultTitle",\n DEFER: "defer",\n ENCODE_SPECIAL_CHARACTERS: "encodeSpecialCharacters",\n ON_CHANGE_CLIENT_STATE: "onChangeClientState",\n TITLE_TEMPLATE: "titleTemplate"\n};\nvar HTML_TAG_MAP = Object.keys(REACT_TAG_MAP).reduce(function (obj, key) {\n obj[REACT_TAG_MAP[key]] = key;\n return obj;\n}, {});\nvar SELF_CLOSING_TAGS = [TAG_NAMES.NOSCRIPT, TAG_NAMES.SCRIPT, TAG_NAMES.STYLE];\nvar HELMET_ATTRIBUTE = "data-react-helmet";\n\nvar _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) {\n return typeof obj;\n} : function (obj) {\n return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;\n};\n\nvar classCallCheck = function classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError("Cannot call a class as a function");\n }\n};\n\nvar createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if ("value" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\n\nvar _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\nvar inherits = function inherits(subClass, superClass) {\n if (typeof superClass !== "function" && superClass !== null) {\n throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n};\n\nvar objectWithoutProperties = function objectWithoutProperties(obj, keys) {\n var target = {};\n\n for (var i in obj) {\n if (keys.indexOf(i) >= 0) continue;\n if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;\n target[i] = obj[i];\n }\n\n return target;\n};\n\nvar possibleConstructorReturn = function possibleConstructorReturn(self, call) {\n if (!self) {\n throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called");\n }\n\n return call && (typeof call === "object" || typeof call === "function") ? call : self;\n};\n\nvar encodeSpecialCharacters = function encodeSpecialCharacters(str) {\n var encode = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n if (encode === false) {\n return String(str);\n }\n\n return String(str).replace(/&/g, "&").replace(//g, ">").replace(/"/g, """).replace(/\'/g, "'");\n};\n\nvar getTitleFromPropsList = function getTitleFromPropsList(propsList) {\n var innermostTitle = getInnermostProperty(propsList, TAG_NAMES.TITLE);\n var innermostTemplate = getInnermostProperty(propsList, HELMET_PROPS.TITLE_TEMPLATE);\n\n if (innermostTemplate && innermostTitle) {\n // use function arg to avoid need to escape $ characters\n return innermostTemplate.replace(/%s/g, function () {\n return Array.isArray(innermostTitle) ? innermostTitle.join("") : innermostTitle;\n });\n }\n\n var innermostDefaultTitle = getInnermostProperty(propsList, HELMET_PROPS.DEFAULT_TITLE);\n return innermostTitle || innermostDefaultTitle || undefined;\n};\n\nvar getOnChangeClientState = function getOnChangeClientState(propsList) {\n return getInnermostProperty(propsList, HELMET_PROPS.ON_CHANGE_CLIENT_STATE) || function () {};\n};\n\nvar getAttributesFromPropsList = function getAttributesFromPropsList(tagType, propsList) {\n return propsList.filter(function (props) {\n return typeof props[tagType] !== "undefined";\n }).map(function (props) {\n return props[tagType];\n }).reduce(function (tagAttrs, current) {\n return _extends({}, tagAttrs, current);\n }, {});\n};\n\nvar getBaseTagFromPropsList = function getBaseTagFromPropsList(primaryAttributes, propsList) {\n return propsList.filter(function (props) {\n return typeof props[TAG_NAMES.BASE] !== "undefined";\n }).map(function (props) {\n return props[TAG_NAMES.BASE];\n }).reverse().reduce(function (innermostBaseTag, tag) {\n if (!innermostBaseTag.length) {\n var keys = Object.keys(tag);\n\n for (var i = 0; i < keys.length; i++) {\n var attributeKey = keys[i];\n var lowerCaseAttributeKey = attributeKey.toLowerCase();\n\n if (primaryAttributes.indexOf(lowerCaseAttributeKey) !== -1 && tag[lowerCaseAttributeKey]) {\n return innermostBaseTag.concat(tag);\n }\n }\n }\n\n return innermostBaseTag;\n }, []);\n};\n\nvar getTagsFromPropsList = function getTagsFromPropsList(tagName, primaryAttributes, propsList) {\n // Calculate list of tags, giving priority innermost component (end of the propslist)\n var approvedSeenTags = {};\n return propsList.filter(function (props) {\n if (Array.isArray(props[tagName])) {\n return true;\n }\n\n if (typeof props[tagName] !== "undefined") {\n warn("Helmet: " + tagName + " should be of type \\"Array\\". Instead found type \\"" + _typeof(props[tagName]) + "\\"");\n }\n\n return false;\n }).map(function (props) {\n return props[tagName];\n }).reverse().reduce(function (approvedTags, instanceTags) {\n var instanceSeenTags = {};\n instanceTags.filter(function (tag) {\n var primaryAttributeKey = void 0;\n var keys = Object.keys(tag);\n\n for (var i = 0; i < keys.length; i++) {\n var attributeKey = keys[i];\n var lowerCaseAttributeKey = attributeKey.toLowerCase(); // Special rule with link tags, since rel and href are both primary tags, rel takes priority\n\n if (primaryAttributes.indexOf(lowerCaseAttributeKey) !== -1 && !(primaryAttributeKey === TAG_PROPERTIES.REL && tag[primaryAttributeKey].toLowerCase() === "canonical") && !(lowerCaseAttributeKey === TAG_PROPERTIES.REL && tag[lowerCaseAttributeKey].toLowerCase() === "stylesheet")) {\n primaryAttributeKey = lowerCaseAttributeKey;\n } // Special case for innerHTML which doesn\'t work lowercased\n\n\n if (primaryAttributes.indexOf(attributeKey) !== -1 && (attributeKey === TAG_PROPERTIES.INNER_HTML || attributeKey === TAG_PROPERTIES.CSS_TEXT || attributeKey === TAG_PROPERTIES.ITEM_PROP)) {\n primaryAttributeKey = attributeKey;\n }\n }\n\n if (!primaryAttributeKey || !tag[primaryAttributeKey]) {\n return false;\n }\n\n var value = tag[primaryAttributeKey].toLowerCase();\n\n if (!approvedSeenTags[primaryAttributeKey]) {\n approvedSeenTags[primaryAttributeKey] = {};\n }\n\n if (!instanceSeenTags[primaryAttributeKey]) {\n instanceSeenTags[primaryAttributeKey] = {};\n }\n\n if (!approvedSeenTags[primaryAttributeKey][value]) {\n instanceSeenTags[primaryAttributeKey][value] = true;\n return true;\n }\n\n return false;\n }).reverse().forEach(function (tag) {\n return approvedTags.push(tag);\n }); // Update seen tags with tags from this instance\n\n var keys = Object.keys(instanceSeenTags);\n\n for (var i = 0; i < keys.length; i++) {\n var attributeKey = keys[i];\n var tagUnion = object_assign_default()({}, approvedSeenTags[attributeKey], instanceSeenTags[attributeKey]);\n approvedSeenTags[attributeKey] = tagUnion;\n }\n\n return approvedTags;\n }, []).reverse();\n};\n\nvar getInnermostProperty = function getInnermostProperty(propsList, property) {\n for (var i = propsList.length - 1; i >= 0; i--) {\n var props = propsList[i];\n\n if (props.hasOwnProperty(property)) {\n return props[property];\n }\n }\n\n return null;\n};\n\nvar reducePropsToState = function reducePropsToState(propsList) {\n return {\n baseTag: getBaseTagFromPropsList([TAG_PROPERTIES.HREF, TAG_PROPERTIES.TARGET], propsList),\n bodyAttributes: getAttributesFromPropsList(ATTRIBUTE_NAMES.BODY, propsList),\n defer: getInnermostProperty(propsList, HELMET_PROPS.DEFER),\n encode: getInnermostProperty(propsList, HELMET_PROPS.ENCODE_SPECIAL_CHARACTERS),\n htmlAttributes: getAttributesFromPropsList(ATTRIBUTE_NAMES.HTML, propsList),\n linkTags: getTagsFromPropsList(TAG_NAMES.LINK, [TAG_PROPERTIES.REL, TAG_PROPERTIES.HREF], propsList),\n metaTags: getTagsFromPropsList(TAG_NAMES.META, [TAG_PROPERTIES.NAME, TAG_PROPERTIES.CHARSET, TAG_PROPERTIES.HTTPEQUIV, TAG_PROPERTIES.PROPERTY, TAG_PROPERTIES.ITEM_PROP], propsList),\n noscriptTags: getTagsFromPropsList(TAG_NAMES.NOSCRIPT, [TAG_PROPERTIES.INNER_HTML], propsList),\n onChangeClientState: getOnChangeClientState(propsList),\n scriptTags: getTagsFromPropsList(TAG_NAMES.SCRIPT, [TAG_PROPERTIES.SRC, TAG_PROPERTIES.INNER_HTML], propsList),\n styleTags: getTagsFromPropsList(TAG_NAMES.STYLE, [TAG_PROPERTIES.CSS_TEXT], propsList),\n title: getTitleFromPropsList(propsList),\n titleAttributes: getAttributesFromPropsList(ATTRIBUTE_NAMES.TITLE, propsList)\n };\n};\n\nvar rafPolyfill = function () {\n var clock = Date.now();\n return function (callback) {\n var currentTime = Date.now();\n\n if (currentTime - clock > 16) {\n clock = currentTime;\n callback(currentTime);\n } else {\n setTimeout(function () {\n rafPolyfill(callback);\n }, 0);\n }\n };\n}();\n\nvar cafPolyfill = function cafPolyfill(id) {\n return clearTimeout(id);\n};\n\nvar requestAnimationFrame = typeof window !== "undefined" ? window.requestAnimationFrame && window.requestAnimationFrame.bind(window) || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || rafPolyfill : __webpack_require__.g.requestAnimationFrame || rafPolyfill;\nvar cancelAnimationFrame = typeof window !== "undefined" ? window.cancelAnimationFrame || window.webkitCancelAnimationFrame || window.mozCancelAnimationFrame || cafPolyfill : __webpack_require__.g.cancelAnimationFrame || cafPolyfill;\n\nvar warn = function warn(msg) {\n return console && typeof console.warn === "function" && console.warn(msg);\n};\n\nvar _helmetCallback = null;\n\nvar handleClientStateChange = function handleClientStateChange(newState) {\n if (_helmetCallback) {\n cancelAnimationFrame(_helmetCallback);\n }\n\n if (newState.defer) {\n _helmetCallback = requestAnimationFrame(function () {\n commitTagChanges(newState, function () {\n _helmetCallback = null;\n });\n });\n } else {\n commitTagChanges(newState);\n _helmetCallback = null;\n }\n};\n\nvar commitTagChanges = function commitTagChanges(newState, cb) {\n var baseTag = newState.baseTag,\n bodyAttributes = newState.bodyAttributes,\n htmlAttributes = newState.htmlAttributes,\n linkTags = newState.linkTags,\n metaTags = newState.metaTags,\n noscriptTags = newState.noscriptTags,\n onChangeClientState = newState.onChangeClientState,\n scriptTags = newState.scriptTags,\n styleTags = newState.styleTags,\n title = newState.title,\n titleAttributes = newState.titleAttributes;\n updateAttributes(TAG_NAMES.BODY, bodyAttributes);\n updateAttributes(TAG_NAMES.HTML, htmlAttributes);\n updateTitle(title, titleAttributes);\n var tagUpdates = {\n baseTag: updateTags(TAG_NAMES.BASE, baseTag),\n linkTags: updateTags(TAG_NAMES.LINK, linkTags),\n metaTags: updateTags(TAG_NAMES.META, metaTags),\n noscriptTags: updateTags(TAG_NAMES.NOSCRIPT, noscriptTags),\n scriptTags: updateTags(TAG_NAMES.SCRIPT, scriptTags),\n styleTags: updateTags(TAG_NAMES.STYLE, styleTags)\n };\n var addedTags = {};\n var removedTags = {};\n Object.keys(tagUpdates).forEach(function (tagType) {\n var _tagUpdates$tagType = tagUpdates[tagType],\n newTags = _tagUpdates$tagType.newTags,\n oldTags = _tagUpdates$tagType.oldTags;\n\n if (newTags.length) {\n addedTags[tagType] = newTags;\n }\n\n if (oldTags.length) {\n removedTags[tagType] = tagUpdates[tagType].oldTags;\n }\n });\n cb && cb();\n onChangeClientState(newState, addedTags, removedTags);\n};\n\nvar flattenArray = function flattenArray(possibleArray) {\n return Array.isArray(possibleArray) ? possibleArray.join("") : possibleArray;\n};\n\nvar updateTitle = function updateTitle(title, attributes) {\n if (typeof title !== "undefined" && document.title !== title) {\n document.title = flattenArray(title);\n }\n\n updateAttributes(TAG_NAMES.TITLE, attributes);\n};\n\nvar updateAttributes = function updateAttributes(tagName, attributes) {\n var elementTag = document.getElementsByTagName(tagName)[0];\n\n if (!elementTag) {\n return;\n }\n\n var helmetAttributeString = elementTag.getAttribute(HELMET_ATTRIBUTE);\n var helmetAttributes = helmetAttributeString ? helmetAttributeString.split(",") : [];\n var attributesToRemove = [].concat(helmetAttributes);\n var attributeKeys = Object.keys(attributes);\n\n for (var i = 0; i < attributeKeys.length; i++) {\n var attribute = attributeKeys[i];\n var value = attributes[attribute] || "";\n\n if (elementTag.getAttribute(attribute) !== value) {\n elementTag.setAttribute(attribute, value);\n }\n\n if (helmetAttributes.indexOf(attribute) === -1) {\n helmetAttributes.push(attribute);\n }\n\n var indexToSave = attributesToRemove.indexOf(attribute);\n\n if (indexToSave !== -1) {\n attributesToRemove.splice(indexToSave, 1);\n }\n }\n\n for (var _i = attributesToRemove.length - 1; _i >= 0; _i--) {\n elementTag.removeAttribute(attributesToRemove[_i]);\n }\n\n if (helmetAttributes.length === attributesToRemove.length) {\n elementTag.removeAttribute(HELMET_ATTRIBUTE);\n } else if (elementTag.getAttribute(HELMET_ATTRIBUTE) !== attributeKeys.join(",")) {\n elementTag.setAttribute(HELMET_ATTRIBUTE, attributeKeys.join(","));\n }\n};\n\nvar updateTags = function updateTags(type, tags) {\n var headElement = document.head || document.querySelector(TAG_NAMES.HEAD);\n var tagNodes = headElement.querySelectorAll(type + "[" + HELMET_ATTRIBUTE + "]");\n var oldTags = Array.prototype.slice.call(tagNodes);\n var newTags = [];\n var indexToDelete = void 0;\n\n if (tags && tags.length) {\n tags.forEach(function (tag) {\n var newElement = document.createElement(type);\n\n for (var attribute in tag) {\n if (tag.hasOwnProperty(attribute)) {\n if (attribute === TAG_PROPERTIES.INNER_HTML) {\n newElement.innerHTML = tag.innerHTML;\n } else if (attribute === TAG_PROPERTIES.CSS_TEXT) {\n if (newElement.styleSheet) {\n newElement.styleSheet.cssText = tag.cssText;\n } else {\n newElement.appendChild(document.createTextNode(tag.cssText));\n }\n } else {\n var value = typeof tag[attribute] === "undefined" ? "" : tag[attribute];\n newElement.setAttribute(attribute, value);\n }\n }\n }\n\n newElement.setAttribute(HELMET_ATTRIBUTE, "true"); // Remove a duplicate tag from domTagstoRemove, so it isn\'t cleared.\n\n if (oldTags.some(function (existingTag, index) {\n indexToDelete = index;\n return newElement.isEqualNode(existingTag);\n })) {\n oldTags.splice(indexToDelete, 1);\n } else {\n newTags.push(newElement);\n }\n });\n }\n\n oldTags.forEach(function (tag) {\n return tag.parentNode.removeChild(tag);\n });\n newTags.forEach(function (tag) {\n return headElement.appendChild(tag);\n });\n return {\n oldTags: oldTags,\n newTags: newTags\n };\n};\n\nvar generateElementAttributesAsString = function generateElementAttributesAsString(attributes) {\n return Object.keys(attributes).reduce(function (str, key) {\n var attr = typeof attributes[key] !== "undefined" ? key + "=\\"" + attributes[key] + "\\"" : "" + key;\n return str ? str + " " + attr : attr;\n }, "");\n};\n\nvar generateTitleAsString = function generateTitleAsString(type, title, attributes, encode) {\n var attributeString = generateElementAttributesAsString(attributes);\n var flattenedTitle = flattenArray(title);\n return attributeString ? "<" + type + " " + HELMET_ATTRIBUTE + "=\\"true\\" " + attributeString + ">" + encodeSpecialCharacters(flattenedTitle, encode) + "" : "<" + type + " " + HELMET_ATTRIBUTE + "=\\"true\\">" + encodeSpecialCharacters(flattenedTitle, encode) + "";\n};\n\nvar generateTagsAsString = function generateTagsAsString(type, tags, encode) {\n return tags.reduce(function (str, tag) {\n var attributeHtml = Object.keys(tag).filter(function (attribute) {\n return !(attribute === TAG_PROPERTIES.INNER_HTML || attribute === TAG_PROPERTIES.CSS_TEXT);\n }).reduce(function (string, attribute) {\n var attr = typeof tag[attribute] === "undefined" ? attribute : attribute + "=\\"" + encodeSpecialCharacters(tag[attribute], encode) + "\\"";\n return string ? string + " " + attr : attr;\n }, "");\n var tagContent = tag.innerHTML || tag.cssText || "";\n var isSelfClosing = SELF_CLOSING_TAGS.indexOf(type) === -1;\n return str + "<" + type + " " + HELMET_ATTRIBUTE + "=\\"true\\" " + attributeHtml + (isSelfClosing ? "/>" : ">" + tagContent + "");\n }, "");\n};\n\nvar convertElementAttributestoReactProps = function convertElementAttributestoReactProps(attributes) {\n var initProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n return Object.keys(attributes).reduce(function (obj, key) {\n obj[REACT_TAG_MAP[key] || key] = attributes[key];\n return obj;\n }, initProps);\n};\n\nvar convertReactPropstoHtmlAttributes = function convertReactPropstoHtmlAttributes(props) {\n var initAttributes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n return Object.keys(props).reduce(function (obj, key) {\n obj[HTML_TAG_MAP[key] || key] = props[key];\n return obj;\n }, initAttributes);\n};\n\nvar generateTitleAsReactComponent = function generateTitleAsReactComponent(type, title, attributes) {\n var _initProps; // assigning into an array to define toString function on it\n\n\n var initProps = (_initProps = {\n key: title\n }, _initProps[HELMET_ATTRIBUTE] = true, _initProps);\n var props = convertElementAttributestoReactProps(attributes, initProps);\n return [react.createElement(TAG_NAMES.TITLE, props, title)];\n};\n\nvar generateTagsAsReactComponent = function generateTagsAsReactComponent(type, tags) {\n return tags.map(function (tag, i) {\n var _mappedTag;\n\n var mappedTag = (_mappedTag = {\n key: i\n }, _mappedTag[HELMET_ATTRIBUTE] = true, _mappedTag);\n Object.keys(tag).forEach(function (attribute) {\n var mappedAttribute = REACT_TAG_MAP[attribute] || attribute;\n\n if (mappedAttribute === TAG_PROPERTIES.INNER_HTML || mappedAttribute === TAG_PROPERTIES.CSS_TEXT) {\n var content = tag.innerHTML || tag.cssText;\n mappedTag.dangerouslySetInnerHTML = {\n __html: content\n };\n } else {\n mappedTag[mappedAttribute] = tag[attribute];\n }\n });\n return react.createElement(type, mappedTag);\n });\n};\n\nvar getMethodsForTag = function getMethodsForTag(type, tags, encode) {\n switch (type) {\n case TAG_NAMES.TITLE:\n return {\n toComponent: function toComponent() {\n return generateTitleAsReactComponent(type, tags.title, tags.titleAttributes, encode);\n },\n toString: function toString() {\n return generateTitleAsString(type, tags.title, tags.titleAttributes, encode);\n }\n };\n\n case ATTRIBUTE_NAMES.BODY:\n case ATTRIBUTE_NAMES.HTML:\n return {\n toComponent: function toComponent() {\n return convertElementAttributestoReactProps(tags);\n },\n toString: function toString() {\n return generateElementAttributesAsString(tags);\n }\n };\n\n default:\n return {\n toComponent: function toComponent() {\n return generateTagsAsReactComponent(type, tags);\n },\n toString: function toString() {\n return generateTagsAsString(type, tags, encode);\n }\n };\n }\n};\n\nvar mapStateOnServer = function mapStateOnServer(_ref) {\n var baseTag = _ref.baseTag,\n bodyAttributes = _ref.bodyAttributes,\n encode = _ref.encode,\n htmlAttributes = _ref.htmlAttributes,\n linkTags = _ref.linkTags,\n metaTags = _ref.metaTags,\n noscriptTags = _ref.noscriptTags,\n scriptTags = _ref.scriptTags,\n styleTags = _ref.styleTags,\n _ref$title = _ref.title,\n title = _ref$title === undefined ? "" : _ref$title,\n titleAttributes = _ref.titleAttributes;\n return {\n base: getMethodsForTag(TAG_NAMES.BASE, baseTag, encode),\n bodyAttributes: getMethodsForTag(ATTRIBUTE_NAMES.BODY, bodyAttributes, encode),\n htmlAttributes: getMethodsForTag(ATTRIBUTE_NAMES.HTML, htmlAttributes, encode),\n link: getMethodsForTag(TAG_NAMES.LINK, linkTags, encode),\n meta: getMethodsForTag(TAG_NAMES.META, metaTags, encode),\n noscript: getMethodsForTag(TAG_NAMES.NOSCRIPT, noscriptTags, encode),\n script: getMethodsForTag(TAG_NAMES.SCRIPT, scriptTags, encode),\n style: getMethodsForTag(TAG_NAMES.STYLE, styleTags, encode),\n title: getMethodsForTag(TAG_NAMES.TITLE, {\n title: title,\n titleAttributes: titleAttributes\n }, encode)\n };\n};\n\nvar Helmet = function Helmet(Component) {\n var _class, _temp;\n\n return _temp = _class = function (_React$Component) {\n inherits(HelmetWrapper, _React$Component);\n\n function HelmetWrapper() {\n classCallCheck(this, HelmetWrapper);\n return possibleConstructorReturn(this, _React$Component.apply(this, arguments));\n }\n\n HelmetWrapper.prototype.shouldComponentUpdate = function shouldComponentUpdate(nextProps) {\n return !react_fast_compare_default()(this.props, nextProps);\n };\n\n HelmetWrapper.prototype.mapNestedChildrenToProps = function mapNestedChildrenToProps(child, nestedChildren) {\n if (!nestedChildren) {\n return null;\n }\n\n switch (child.type) {\n case TAG_NAMES.SCRIPT:\n case TAG_NAMES.NOSCRIPT:\n return {\n innerHTML: nestedChildren\n };\n\n case TAG_NAMES.STYLE:\n return {\n cssText: nestedChildren\n };\n }\n\n throw new Error("<" + child.type + " /> elements are self-closing and can not contain children. Refer to our API for more information.");\n };\n\n HelmetWrapper.prototype.flattenArrayTypeChildren = function flattenArrayTypeChildren(_ref) {\n var _babelHelpers$extends;\n\n var child = _ref.child,\n arrayTypeChildren = _ref.arrayTypeChildren,\n newChildProps = _ref.newChildProps,\n nestedChildren = _ref.nestedChildren;\n return _extends({}, arrayTypeChildren, (_babelHelpers$extends = {}, _babelHelpers$extends[child.type] = [].concat(arrayTypeChildren[child.type] || [], [_extends({}, newChildProps, this.mapNestedChildrenToProps(child, nestedChildren))]), _babelHelpers$extends));\n };\n\n HelmetWrapper.prototype.mapObjectTypeChildren = function mapObjectTypeChildren(_ref2) {\n var _babelHelpers$extends2, _babelHelpers$extends3;\n\n var child = _ref2.child,\n newProps = _ref2.newProps,\n newChildProps = _ref2.newChildProps,\n nestedChildren = _ref2.nestedChildren;\n\n switch (child.type) {\n case TAG_NAMES.TITLE:\n return _extends({}, newProps, (_babelHelpers$extends2 = {}, _babelHelpers$extends2[child.type] = nestedChildren, _babelHelpers$extends2.titleAttributes = _extends({}, newChildProps), _babelHelpers$extends2));\n\n case TAG_NAMES.BODY:\n return _extends({}, newProps, {\n bodyAttributes: _extends({}, newChildProps)\n });\n\n case TAG_NAMES.HTML:\n return _extends({}, newProps, {\n htmlAttributes: _extends({}, newChildProps)\n });\n }\n\n return _extends({}, newProps, (_babelHelpers$extends3 = {}, _babelHelpers$extends3[child.type] = _extends({}, newChildProps), _babelHelpers$extends3));\n };\n\n HelmetWrapper.prototype.mapArrayTypeChildrenToProps = function mapArrayTypeChildrenToProps(arrayTypeChildren, newProps) {\n var newFlattenedProps = _extends({}, newProps);\n\n Object.keys(arrayTypeChildren).forEach(function (arrayChildName) {\n var _babelHelpers$extends4;\n\n newFlattenedProps = _extends({}, newFlattenedProps, (_babelHelpers$extends4 = {}, _babelHelpers$extends4[arrayChildName] = arrayTypeChildren[arrayChildName], _babelHelpers$extends4));\n });\n return newFlattenedProps;\n };\n\n HelmetWrapper.prototype.warnOnInvalidChildren = function warnOnInvalidChildren(child, nestedChildren) {\n if (false) {}\n\n return true;\n };\n\n HelmetWrapper.prototype.mapChildrenToProps = function mapChildrenToProps(children, newProps) {\n var _this2 = this;\n\n var arrayTypeChildren = {};\n react.Children.forEach(children, function (child) {\n if (!child || !child.props) {\n return;\n }\n\n var _child$props = child.props,\n nestedChildren = _child$props.children,\n childProps = objectWithoutProperties(_child$props, ["children"]);\n var newChildProps = convertReactPropstoHtmlAttributes(childProps);\n\n _this2.warnOnInvalidChildren(child, nestedChildren);\n\n switch (child.type) {\n case TAG_NAMES.LINK:\n case TAG_NAMES.META:\n case TAG_NAMES.NOSCRIPT:\n case TAG_NAMES.SCRIPT:\n case TAG_NAMES.STYLE:\n arrayTypeChildren = _this2.flattenArrayTypeChildren({\n child: child,\n arrayTypeChildren: arrayTypeChildren,\n newChildProps: newChildProps,\n nestedChildren: nestedChildren\n });\n break;\n\n default:\n newProps = _this2.mapObjectTypeChildren({\n child: child,\n newProps: newProps,\n newChildProps: newChildProps,\n nestedChildren: nestedChildren\n });\n break;\n }\n });\n newProps = this.mapArrayTypeChildrenToProps(arrayTypeChildren, newProps);\n return newProps;\n };\n\n HelmetWrapper.prototype.render = function render() {\n var _props = this.props,\n children = _props.children,\n props = objectWithoutProperties(_props, ["children"]);\n\n var newProps = _extends({}, props);\n\n if (children) {\n newProps = this.mapChildrenToProps(children, newProps);\n }\n\n return react.createElement(Component, newProps);\n };\n\n createClass(HelmetWrapper, null, [{\n key: "canUseDOM",\n // Component.peek comes from react-side-effect:\n // For testing, you may use a static peek() method available on the returned component.\n // It lets you get the current state without resetting the mounted instance stack.\n // Don’t use it for anything other than testing.\n\n /**\n * @param {Object} base: {"target": "_blank", "href": "http://mysite.com/"}\n * @param {Object} bodyAttributes: {"className": "root"}\n * @param {String} defaultTitle: "Default Title"\n * @param {Boolean} defer: true\n * @param {Boolean} encodeSpecialCharacters: true\n * @param {Object} htmlAttributes: {"lang": "en", "amp": undefined}\n * @param {Array} link: [{"rel": "canonical", "href": "http://mysite.com/example"}]\n * @param {Array} meta: [{"name": "description", "content": "Test description"}]\n * @param {Array} noscript: [{"innerHTML": " console.log(newState)"\n * @param {Array} script: [{"type": "text/javascript", "src": "http://mysite.com/js/test.js"}]\n * @param {Array} style: [{"type": "text/css", "cssText": "div { display: block; color: blue; }"}]\n * @param {String} title: "Title"\n * @param {Object} titleAttributes: {"itemprop": "name"}\n * @param {String} titleTemplate: "MySite.com - %s"\n */\n set: function set$$1(canUseDOM) {\n Component.canUseDOM = canUseDOM;\n }\n }]);\n return HelmetWrapper;\n }(react.Component), _class.propTypes = {\n base: (prop_types_default()).object,\n bodyAttributes: (prop_types_default()).object,\n children: prop_types_default().oneOfType([prop_types_default().arrayOf((prop_types_default()).node), (prop_types_default()).node]),\n defaultTitle: (prop_types_default()).string,\n defer: (prop_types_default()).bool,\n encodeSpecialCharacters: (prop_types_default()).bool,\n htmlAttributes: (prop_types_default()).object,\n link: prop_types_default().arrayOf((prop_types_default()).object),\n meta: prop_types_default().arrayOf((prop_types_default()).object),\n noscript: prop_types_default().arrayOf((prop_types_default()).object),\n onChangeClientState: (prop_types_default()).func,\n script: prop_types_default().arrayOf((prop_types_default()).object),\n style: prop_types_default().arrayOf((prop_types_default()).object),\n title: (prop_types_default()).string,\n titleAttributes: (prop_types_default()).object,\n titleTemplate: (prop_types_default()).string\n }, _class.defaultProps = {\n defer: true,\n encodeSpecialCharacters: true\n }, _class.peek = Component.peek, _class.rewind = function () {\n var mappedState = Component.rewind();\n\n if (!mappedState) {\n // provide fallback if mappedState is undefined\n mappedState = mapStateOnServer({\n baseTag: [],\n bodyAttributes: {},\n encodeSpecialCharacters: true,\n htmlAttributes: {},\n linkTags: [],\n metaTags: [],\n noscriptTags: [],\n scriptTags: [],\n styleTags: [],\n title: "",\n titleAttributes: {}\n });\n }\n\n return mappedState;\n }, _temp;\n};\n\nvar NullComponent = function NullComponent() {\n return null;\n};\n\nvar HelmetSideEffects = react_side_effect_lib_default()(reducePropsToState, handleClientStateChange, mapStateOnServer)(NullComponent);\nvar HelmetExport = Helmet(HelmetSideEffects);\nHelmetExport.renderStatic = HelmetExport.rewind;\n/* harmony default export */ var es_Helmet = ((/* unused pure expression or super */ null && (HelmetExport)));\n\n// EXTERNAL MODULE: ./src/contexts/FlagContext.tsx\nvar FlagContext = __webpack_require__(774);\n;// CONCATENATED MODULE: ./src/components/J40Header.tsx\nvar J40Header=function J40Header(){var flags=(0,FlagContext/* useFlags */.Vb)();var intl=(0,gatsby_plugin_intl.useIntl)();var title=intl.formatMessage({id:\'71L0pp\',defaultMessage:\'Justice40\',description:\'Title of the project\'});var _useState=(0,react.useState)(false),mobileNavOpen=_useState[0],setMobileNavOpen=_useState[1];var toggleMobileNav=function toggleMobileNav(){return setMobileNavOpen(function(prevOpen){return!prevOpen;});};var headerLinks=function headerLinks(flags){// static map of all possible menu items. Originally, it was all strings,\n// but we need to handle both onsite and offsite links.\nvar menuData=new Map([[\'about\',/*#__PURE__*/react.createElement(gatsby_plugin_intl.Link,{key:\'about\',className:\'j40-header\',to:\'/\'},"About")],[\'timeline\',/*#__PURE__*/react.createElement(gatsby_plugin_intl.Link,{to:\'/timeline\',key:\'timline\',className:\'j40-header\'},"Timeline")],[\'cejst\',/*#__PURE__*/react.createElement(gatsby_plugin_intl.Link,{to:\'/cejst\',key:\'cejst\',className:\'j40-header\'},"CEJST")]]);// select which items from the above map to show, right now it\'s only two\n// possibilities so it\'s simple. Note: strings are used as react keys\nvar menu=flags!==null&&flags!==void 0&&flags.includes(\'timeline\')?[\'about\',\'timeline\',\'cejst\']:[\'about\',\'timeline\',\'cejst\'];// [\'about\', \'cejst\'];\n// TODO: make feature flags flags work.\nreturn menu.map(function(key){return menuData.get(key);});};return/*#__PURE__*/react.createElement(react.Fragment,null,/*#__PURE__*/react.createElement(HelmetExport,{htmlAttributes:{lang:intl.locale}},/*#__PURE__*/react.createElement("meta",{charSet:"utf-8"}),/*#__PURE__*/react.createElement("title",null,title)),/*#__PURE__*/react.createElement(lib.SiteAlert,{variant:"info",className:\'j40-sitealert\'},/*#__PURE__*/react.createElement("b",null,"Welcome to Justice40\'s Temporary Home")," While Justice40 gets up and running, we are using GitHub Pages as a temporary website host. To learn more about GitHub Pages, click",/*#__PURE__*/react.createElement("a",{href:"https://pages.github.com/"},"here"),"."),/*#__PURE__*/react.createElement(lib.Header,{basic:true,role:\'banner\',className:\'usa-header j40-header\'},/*#__PURE__*/react.createElement("div",{className:"usa-nav-container"},/*#__PURE__*/react.createElement("div",{className:"usa-navbar"},/*#__PURE__*/react.createElement(lib.Title,null,title),/*#__PURE__*/react.createElement(lib.NavMenuButton,{key:\'mobileMenuButton\',onClick:toggleMobileNav,label:"Menu"})),/*#__PURE__*/react.createElement(lib.PrimaryNav,{items:headerLinks(flags),mobileExpanded:mobileNavOpen,onToggleMobileNav:toggleMobileNav,className:\'j40-header\'}))));};/* harmony default export */ var components_J40Header = (J40Header);\n;// CONCATENATED MODULE: ./src/images/eop-seal.svg\n/* harmony default export */ var eop_seal = (__webpack_require__.p + "static/eop-seal-12e5dcc4453cb3321515f50874d1f1f6.svg");\n;// CONCATENATED MODULE: ./src/components/J40Footer.tsx\n// @ts-ignore\nvar J40Footer=function J40Footer(){return/*#__PURE__*/react.createElement(react.Fragment,null,/*#__PURE__*/react.createElement(lib.Footer,{size:"big",className:\'j40-footer\',primary:/*#__PURE__*/react.createElement(react.Fragment,null),secondary:/*#__PURE__*/react.createElement(lib.FooterNav,{"aria-label":"Footer navigation",size:"big"// fyi you leave this off and it silently fails...\n,links:[[\'Agency Partners\',/*#__PURE__*/react.createElement("a",{href:\'https://www.epa.gov/\',target:\'_blank\',rel:\'noreferrer\',key:\'epalink\'},"Environmental Protection Agency"),/*#__PURE__*/react.createElement("a",{href:\'https://www.whitehouse.gov/omb\',target:\'_blank\',rel:\'noreferrer\',key:\'whitehouselink\'},"Office of Management and Budget"),/*#__PURE__*/react.createElement("a",{href:\'https://www.energy.gov/\',target:\'_blank\',rel:\'noreferrer\',key:\'energylink\'},"Department of Energy"),/*#__PURE__*/react.createElement("a",{href:\'https://www.hud.gov/\',target:\'_blank\',rel:\'noreferrer\',key:\'hudlink\'},"Department of Housing and Urban Development")],[\'More Information\',/*#__PURE__*/react.createElement("a",{href:\'https://www.whitehouse.gov/\',target:\'_blank\',rel:\'noreferrer\',key:\'whitehouselink2\'},"Whitehouse.gov"),/*#__PURE__*/react.createElement("a",{href:"#",key:\'accessibilitylink\'},"Accessibility Statement"),/*#__PURE__*/react.createElement("a",{href:"#",key:\'privacylink\'},"Privacy, Policies, and Legal Information")],[\'Have a question about government services?\',/*#__PURE__*/react.createElement("a",{href:"#",key:\'privacylink\'},"Find a contact at USA.gov")],[/*#__PURE__*/react.createElement(react.Fragment,null,/*#__PURE__*/react.createElement(lib.Logo,{size:"slim",key:\'logoimg\',className:\'j40-footer-logo\',image:/*#__PURE__*/react.createElement("img",{className:\'usa-footer__logo-img\',src:eop_seal,alt:\'Whitehouse logo\'}),heading:/*#__PURE__*/react.createElement("p",{className:\'j40-footer-logo-heading\'},"Council on Environmental Quality")})),/*#__PURE__*/react.createElement(react.Fragment,null,/*#__PURE__*/react.createElement(lib.Address,{key:\'footeraddress\',items:[\'730 Jackson Pl NW\',\'Washington, D.C. 20506\',\'(202) 395-5750\']}))]]})}));};/* harmony default export */ var components_J40Footer = (J40Footer);\n;// CONCATENATED MODULE: ./node_modules/uswds/dist/img/usa-icons/chat.svg\n/* harmony default export */ var chat = ("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0Ij48cGF0aCBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTIwIDJINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDIybDQtNGgxNGMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yek02IDloMTJ2Mkg2Vjl6bTggNUg2di0yaDh2MnptNC02SDZWNmgxMnYyeiIvPjwvc3ZnPg==");\n;// CONCATENATED MODULE: ./node_modules/uswds/dist/img/usa-icons/github.svg\n/* harmony default export */ var github = ("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsLXJ1bGU6ZXZlbm9kZDt9PC9zdHlsZT48L2RlZnM+PHBhdGggaWQ9IkdpdGh1YiIgY2xhc3M9ImNscy0xIiBkPSJNMTIsMkExMCwxMCwwLDAsMCw4Ljg0LDIxLjQ5Yy41LjA5LjY4LS4yMi42OC0uNDhzMC0uODcsMC0xLjdDNi43MywxOS45MSw2LjE0LDE4LDYuMTQsMThBMi42OSwyLjY5LDAsMCwwLDUsMTYuNWMtLjkxLS42Mi4wNy0uNjEuMDctLjYxYTIuMTMsMi4xMywwLDAsMSwxLjUzLDEsMi4xNCwyLjE0LDAsMCwwLDIuOTEuODMsMi4xNiwyLjE2LDAsMCwxLC42My0xLjM0QzgsMTYuMTcsNS42MiwxNS4zMSw1LjYyLDExLjQ4YTMuODksMy44OSwwLDAsMSwxLTIuNjksMy41NywzLjU3LDAsMCwxLC4xLTIuNjRzLjg0LS4yNywyLjc1LDFhOS42Myw5LjYzLDAsMCwxLDUsMGMxLjkxLTEuMjksMi43NS0xLDIuNzUtMWEzLjU3LDMuNTcsMCwwLDEsLjEsMi42NCwzLjg5LDMuODksMCwwLDEsMSwyLjY5YzAsMy44NC0yLjM0LDQuNjgtNC41Nyw0LjkzYTIuMzksMi4zOSwwLDAsMSwuNjgsMS44NWMwLDEuMzQsMCwyLjQyLDAsMi43NXMuMTguNTguNjkuNDhBMTAsMTAsMCwwLDAsMTIsMloiLz48L3N2Zz4=");\n;// CONCATENATED MODULE: ./src/components/J40Aside.tsx\n// @ts-ignore\n// @ts-ignore\nvar J40Aside=function J40Aside(){return/*#__PURE__*/react.createElement(react.Fragment,null,/*#__PURE__*/react.createElement("aside",{"aria-labelledby":"right-sidebar",className:\'j40-aside desktop:grid-col-3 usa-prose usa-section\',id:"right-sidebar"},/*#__PURE__*/react.createElement("h2",null,"Get Involved"),/*#__PURE__*/react.createElement("h3",null,/*#__PURE__*/react.createElement("img",{className:\'flex-align-self-center width-4 j40-aside-icon\',src:chat,alt:\'chat icon\'}),"Send Feedback"),/*#__PURE__*/react.createElement("p",{className:\'usa-prose site-prose\'},"Have ideas about how to acknowledge the on-the-ground experiences of your community?"),"Email: ",/*#__PURE__*/react.createElement("a",{href:"mailto: justice40open@usds.gov"},"justice40open@usds.gov"),/*#__PURE__*/react.createElement("p",null,"\\xA0"),/*#__PURE__*/react.createElement("h3",null,/*#__PURE__*/react.createElement("img",{className:\'flex-align-self-center width-4 j40-aside-icon\',src:github,alt:\'github icon\'}),"Join the open source community"),/*#__PURE__*/react.createElement("p",null,"Justice40\\u2019s code is open source, which means it is available for the public to view and contribute. Anyone can view and contribute on GitHub."),/*#__PURE__*/react.createElement("p",null,/*#__PURE__*/react.createElement("a",{href:\'https://github.com/usds/justice40-tool/\'+\'crisis-at-home-and-abroad/\',target:\'_blank\',rel:\'noreferrer\',key:\'github3\'},"Check it out on GitHub"))));};/* harmony default export */ var components_J40Aside = (J40Aside);\n;// CONCATENATED MODULE: ./src/components/layout.tsx\nvar Layout=function Layout(_ref){var children=_ref.children,location=_ref.location;var isWidthFullPage=location.pathname.match(/cejst\\/?/);var conditionalAside=isWidthFullPage?/*#__PURE__*/react.createElement(react.Fragment,null):/*#__PURE__*/react.createElement(components_J40Aside,null);var gridCssClass=isWidthFullPage?\' desktop:grid-col-12\':\'desktop:grid-col-9\';return/*#__PURE__*/react.createElement(FlagContext/* URLFlagProvider */.RE,{location:location},/*#__PURE__*/react.createElement(components_J40Header,null),/*#__PURE__*/react.createElement(lib.GridContainer,{containerSize:\'desktop-lg\',className:\'j40-grid-container\'},/*#__PURE__*/react.createElement(lib.Grid,{row:true},/*#__PURE__*/react.createElement("main",{id:\'main-content\',className:\'usa-layout-docs j40-main-content \'+gridCssClass},children),conditionalAside)),/*#__PURE__*/react.createElement(components_J40Footer,null));};/* harmony default export */ var layout = (Layout);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1oZWxtZXQvZXMvSGVsbWV0LmpzPzFmMGYiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9zcmMvY29tcG9uZW50cy9KNDBIZWFkZXIudHN4P2ZiNWQiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9zcmMvaW1hZ2VzL2VvcC1zZWFsLnN2Zz9lMjQ0Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vc3JjL2NvbXBvbmVudHMvSjQwRm9vdGVyLnRzeD9kZDc5Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3Vzd2RzL2Rpc3QvaW1nL3VzYS1pY29ucy9jaGF0LnN2Zz85ODgwIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3Vzd2RzL2Rpc3QvaW1nL3VzYS1pY29ucy9naXRodWIuc3ZnPzZiNDQiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9zcmMvY29tcG9uZW50cy9KNDBBc2lkZS50c3g/NzdiNSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL2xheW91dC50c3g/ZjQzOCJdLCJuYW1lcyI6WyJKNDBIZWFkZXIiLCJmbGFncyIsInVzZUZsYWdzIiwiaW50bCIsInVzZUludGwiLCJ0aXRsZSIsImZvcm1hdE1lc3NhZ2UiLCJpZCIsImRlZmF1bHRNZXNzYWdlIiwiZGVzY3JpcHRpb24iLCJ1c2VTdGF0ZSIsIm1vYmlsZU5hdk9wZW4iLCJzZXRNb2JpbGVOYXZPcGVuIiwidG9nZ2xlTW9iaWxlTmF2IiwicHJldk9wZW4iLCJoZWFkZXJMaW5rcyIsIm1lbnVEYXRhIiwiTWFwIiwibWVudSIsImluY2x1ZGVzIiwibWFwIiwia2V5IiwiZ2V0IiwibGFuZyIsImxvY2FsZSIsIko0MEZvb3RlciIsIndoaXRlaG91c2VJY29uIiwiSjQwQXNpZGUiLCJjaGF0SWNvbiIsImdpdGh1Ykljb24iLCJMYXlvdXQiLCJjaGlsZHJlbiIsImxvY2F0aW9uIiwiaXNXaWR0aEZ1bGxQYWdlIiwicGF0aG5hbWUiLCJtYXRjaCIsImNvbmRpdGlvbmFsQXNpZGUiLCJncmlkQ3NzQ2xhc3MiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBbUM7QUFDWTtBQUNOO0FBQ2Y7QUFDZTtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLElBQUk7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQkFBbUIsa0JBQWtCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0EsaUJBQWlCLHNCQUFzQjtBQUN2Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEseUNBQXlDLHNC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QUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQSxpQkFBaUI7OztBQUdqQjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsVUFBVSxtQkFBbUI7QUFDN0I7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsV0FBVyxtQkFBbUI7QUFDOUIsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGNBQWMsNEJBQU87QUFDckI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7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LHlCQUNFLElBQUksQ0FBRSwwQ0FDUiw0QkFGQSxDQUdFLE1BQU0sQ0FBRSxRQUhWLENBSUUsR0FBRyxDQUFFLFlBSlAsQ0FLRSxHQUFHLENBQUUsU0FMUCwyQkFERixDQXpCRixDQURGLENBREYsQ0FzQ0QsQ0F2Q0QsQ0F5Q0Esd0RBQWVGLFFBQWYsRTs7QUNwQ0EsR0FBTUcsT0FBTSxDQUFHLFFBQVRBLE9BQVMsTUFBd0MsSUFBdENDLFNBQXNDLE1BQXRDQSxRQUFzQyxDQUE1QkMsUUFBNEIsTUFBNUJBLFFBQTRCLENBQ3JELEdBQU1DLGdCQUFlLENBQUdELFFBQVEsQ0FBQ0UsUUFBVCxDQUFrQkMsS0FBbEIsQ0FBd0IsVUFBeEIsQ0FBeEIsQ0FDQSxHQUFNQyxpQkFBZ0IsQ0FBR0gsZUFBZSxjQUFHLHdDQUFILGNBQVcsb0JBQUMsbUJBQUQsTUFBbkQsQ0FDQSxHQUFNSSxhQUFZLENBQUdKLGVBQWUsQ0FBRyxzQkFBSCxDQUNsQyxvQkFERixDQUdBLG1CQUNFLG9CQUFDLG1DQUFELEVBQWlCLFFBQVEsQ0FBRUQsUUFBM0IsZUFDRSxvQkFBQyxvQkFBRCxNQURGLGNBRUUsb0JBQUMsaUJBQUQsRUFBZSxhQUFhLENBQUUsWUFBOUIsQ0FDRSxTQUFTLENBQUUsb0JBRGIsZUFFRSxvQkFBQyxRQUFELEVBQU0sR0FBRyxLQUFULGVBQ0UsNEJBQU0sRUFBRSxDQUFFLGNBQVYsQ0FDRSxTQUFTLENBQUUsb0NBQXNDSyxZQURuRCxFQUVHTixRQUZILENBREYsQ0FLR0ssZ0JBTEgsQ0FGRixDQUZGLGNBWUUsb0JBQUMsb0JBQUQsTUFaRixDQURGLENBZ0JELENBdEJELENBd0JBLDJDQUFlTixNQUFmIiwiZmlsZSI6IjE4NTcuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHdpdGhTaWRlRWZmZWN0IGZyb20gJ3JlYWN0LXNpZGUtZWZmZWN0JztcbmltcG9ydCBpc0VxdWFsIGZyb20gJ3JlYWN0LWZhc3QtY29tcGFyZSc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IG9iamVjdEFzc2lnbiBmcm9tICdvYmplY3QtYXNzaWduJztcbnZhciBBVFRSSUJVVEVfTkFNRVMgPSB7XG4gIEJPRFk6IFwiYm9keUF0dHJpYnV0ZXNcIixcbiAgSFRNTDogXCJodG1sQXR0cmlidXRlc1wiLFxuICBUSVRMRTogXCJ0aXRsZUF0dHJpYnV0ZXNcIlxufTtcbnZhciBUQUdfTkFNRVMgPSB7XG4gIEJBU0U6IFwiYmFzZVwiLFxuICBCT0RZOiBcImJvZHlcIixcbiAgSEVBRDogXCJoZWFkXCIsXG4gIEhUTUw6IFwiaHRtbFwiLFxuICBMSU5LOiBcImxpbmtcIixcbiAgTUVUQTogXCJtZXRhXCIsXG4gIE5PU0NSSVBUOiBcIm5vc2NyaXB0XCIsXG4gIFNDUklQVDogXCJzY3JpcHRcIixcbiAgU1RZTEU6IFwic3R5bGVcIixcbiAgVElUTEU6IFwidGl0bGVcIlxufTtcbnZhciBWQUxJRF9UQUdfTkFNRVMgPSBPYmplY3Qua2V5cyhUQUdfTkFNRVMpLm1hcChmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4gVEFHX05BTUVTW25hbWVdO1xufSk7XG52YXIgVEFHX1BST1BFUlRJRVMgPSB7XG4gIENIQVJTRVQ6IFwiY2hhcnNldFwiLFxuICBDU1NfVEVYVDogXCJjc3NUZXh0XCIsXG4gIEhSRUY6IFwiaHJlZlwiLFxuICBIVFRQRVFVSVY6IFwiaHR0cC1lcXVpdlwiLFxuICBJTk5FUl9IVE1MOiBcImlubmVySFRNTFwiLFxuICBJVEVNX1BST1A6IFwiaXRlbXByb3BcIixcbiAgTkFNRTogXCJuYW1lXCIsXG4gIFBST1BFUlRZOiBcInByb3BlcnR5XCIsXG4gIFJFTDogXCJyZWxcIixcbiAgU1JDOiBcInNyY1wiLFxuICBUQVJHRVQ6IFwidGFyZ2V0XCJcbn07XG52YXIgUkVBQ1RfVEFHX01BUCA9IHtcbiAgYWNjZXNza2V5OiBcImFjY2Vzc0tleVwiLFxuICBjaGFyc2V0OiBcImNoYXJTZXRcIixcbiAgY2xhc3M6IFwiY2xhc3NOYW1lXCIsXG4gIGNvbnRlbnRlZGl0YWJsZTogXCJjb250ZW50RWRpdGFibGVcIixcbiAgY29udGV4dG1lbnU6IFwiY29udGV4dE1lbnVcIixcbiAgXCJodHRwLWVxdWl2XCI6IFwiaHR0cEVxdWl2XCIsXG4gIGl0ZW1wcm9wOiBcIml0ZW1Qcm9wXCIsXG4gIHRhYmluZGV4OiBcInRhYkluZGV4XCJcbn07XG52YXIgSEVMTUVUX1BST1BTID0ge1xuICBERUZBVUxUX1RJVExFOiBcImRlZmF1bHRUaXRsZVwiLFxuICBERUZFUjogXCJkZWZlclwiLFxuICBFTkNPREVfU1BFQ0lBTF9DSEFSQUNURVJTOiBcImVuY29kZVNwZWNpYWxDaGFyYWN0ZXJzXCIsXG4gIE9OX0NIQU5HRV9DTElFTlRfU1RBVEU6IFwib25DaGFuZ2VDbGllbnRTdGF0ZVwiLFxuICBUSVRMRV9URU1QTEFURTogXCJ0aXRsZVRlbXBsYXRlXCJcbn07XG52YXIgSFRNTF9UQUdfTUFQID0gT2JqZWN0LmtleXMoUkVBQ1RfVEFHX01BUCkucmVkdWNlKGZ1bmN0aW9uIChvYmosIGtleSkge1xuICBvYmpbUkVBQ1RfVEFHX01BUFtrZXldXSA9IGtleTtcbiAgcmV0dXJuIG9iajtcbn0sIHt9KTtcbnZhciBTRUxGX0NMT1NJTkdfVEFHUyA9IFtUQUdfTkFNRVMuTk9TQ1JJUFQsIFRBR19OQU1FUy5TQ1JJUFQsIFRBR19OQU1FUy5TVFlMRV07XG52YXIgSEVMTUVUX0FUVFJJQlVURSA9IFwiZGF0YS1yZWFjdC1oZWxtZXRcIjtcblxudmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmo7XG59IDogZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajtcbn07XG5cbnZhciBjbGFzc0NhbGxDaGVjayA9IGZ1bmN0aW9uIGNsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn07XG5cbnZhciBjcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgICBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICAgIGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICAgIHJldHVybiBDb25zdHJ1Y3RvcjtcbiAgfTtcbn0oKTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcblxuICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn07XG5cbnZhciBpbmhlcml0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTtcbiAgfVxuXG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogc3ViQ2xhc3MsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfVxuICB9KTtcbiAgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzO1xufTtcblxudmFyIG9iamVjdFdpdGhvdXRQcm9wZXJ0aWVzID0gZnVuY3Rpb24gb2JqZWN0V2l0aG91dFByb3BlcnRpZXMob2JqLCBrZXlzKSB7XG4gIHZhciB0YXJnZXQgPSB7fTtcblxuICBmb3IgKHZhciBpIGluIG9iaikge1xuICAgIGlmIChrZXlzLmluZGV4T2YoaSkgPj0gMCkgY29udGludWU7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBpKSkgY29udGludWU7XG4gICAgdGFyZ2V0W2ldID0gb2JqW2ldO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn07XG5cbnZhciBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuID0gZnVuY3Rpb24gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7XG4gIGlmICghc2VsZikge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgfVxuXG4gIHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmO1xufTtcblxudmFyIGVuY29kZVNwZWNpYWxDaGFyYWN0ZXJzID0gZnVuY3Rpb24gZW5jb2RlU3BlY2lhbENoYXJhY3RlcnMoc3RyKSB7XG4gIHZhciBlbmNvZGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRydWU7XG5cbiAgaWYgKGVuY29kZSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gU3RyaW5nKHN0cik7XG4gIH1cblxuICByZXR1cm4gU3RyaW5nKHN0cikucmVwbGFjZSgvJi9nLCBcIiZhbXA7XCIpLnJlcGxhY2UoLzwvZywgXCImbHQ7XCIpLnJlcGxhY2UoLz4vZywgXCImZ3Q7XCIpLnJlcGxhY2UoL1wiL2csIFwiJnF1b3Q7XCIpLnJlcGxhY2UoLycvZywgXCImI3gyNztcIik7XG59O1xuXG52YXIgZ2V0VGl0bGVGcm9tUHJvcHNMaXN0ID0gZnVuY3Rpb24gZ2V0VGl0bGVGcm9tUHJvcHNMaXN0KHByb3BzTGlzdCkge1xuICB2YXIgaW5uZXJtb3N0VGl0bGUgPSBnZXRJbm5lcm1vc3RQcm9wZXJ0eShwcm9wc0xpc3QsIFRBR19OQU1FUy5USVRMRSk7XG4gIHZhciBpbm5lcm1vc3RUZW1wbGF0ZSA9IGdldElubmVybW9zdFByb3BlcnR5KHByb3BzTGlzdCwgSEVMTUVUX1BST1BTLlRJVExFX1RFTVBMQVRFKTtcblxuICBpZiAoaW5uZXJtb3N0VGVtcGxhdGUgJiYgaW5uZXJtb3N0VGl0bGUpIHtcbiAgICAvLyB1c2UgZnVuY3Rpb24gYXJnIHRvIGF2b2lkIG5lZWQgdG8gZXNjYXBlICQgY2hhcmFjdGVyc1xuICAgIHJldHVybiBpbm5lcm1vc3RUZW1wbGF0ZS5yZXBsYWNlKC8lcy9nLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShpbm5lcm1vc3RUaXRsZSkgPyBpbm5lcm1vc3RUaXRsZS5qb2luKFwiXCIpIDogaW5uZXJtb3N0VGl0bGU7XG4gICAgfSk7XG4gIH1cblxuICB2YXIgaW5uZXJtb3N0RGVmYXVsdFRpdGxlID0gZ2V0SW5uZXJtb3N0UHJvcGVydHkocHJvcHNMaXN0LCBIRUxNRVRfUFJPUFMuREVGQVVMVF9USVRMRSk7XG4gIHJldHVybiBpbm5lcm1vc3RUaXRsZSB8fCBpbm5lcm1vc3REZWZhdWx0VGl0bGUgfHwgdW5kZWZpbmVkO1xufTtcblxudmFyIGdldE9uQ2hhbmdlQ2xpZW50U3RhdGUgPSBmdW5jdGlvbiBnZXRPbkNoYW5nZUNsaWVudFN0YXRlKHByb3BzTGlzdCkge1xuICByZXR1cm4gZ2V0SW5uZXJtb3N0UHJvcGVydHkocHJvcHNMaXN0LCBIRUxNRVRfUFJPUFMuT05fQ0hBTkdFX0NMSUVOVF9TVEFURSkgfHwgZnVuY3Rpb24gKCkge307XG59O1xuXG52YXIgZ2V0QXR0cmlidXRlc0Zyb21Qcm9wc0xpc3QgPSBmdW5jdGlvbiBnZXRBdHRyaWJ1dGVzRnJvbVByb3BzTGlzdCh0YWdUeXBlLCBwcm9wc0xpc3QpIHtcbiAgcmV0dXJuIHByb3BzTGlzdC5maWx0ZXIoZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBwcm9wc1t0YWdUeXBlXSAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgfSkubWFwKGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHJldHVybiBwcm9wc1t0YWdUeXBlXTtcbiAgfSkucmVkdWNlKGZ1bmN0aW9uICh0YWdBdHRycywgY3VycmVudCkge1xuICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgdGFnQXR0cnMsIGN1cnJlbnQpO1xuICB9LCB7fSk7XG59O1xuXG52YXIgZ2V0QmFzZVRhZ0Zyb21Qcm9wc0xpc3QgPSBmdW5jdGlvbiBnZXRCYXNlVGFnRnJvbVByb3BzTGlzdChwcmltYXJ5QXR0cmlidXRlcywgcHJvcHNMaXN0KSB7XG4gIHJldHVybiBwcm9wc0xpc3QuZmlsdGVyKGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHJldHVybiB0eXBlb2YgcHJvcHNbVEFHX05BTUVTLkJBU0VdICE9PSBcInVuZGVmaW5lZFwiO1xuICB9KS5tYXAoZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIHByb3BzW1RBR19OQU1FUy5CQVNFXTtcbiAgfSkucmV2ZXJzZSgpLnJlZHVjZShmdW5jdGlvbiAoaW5uZXJtb3N0QmFzZVRhZywgdGFnKSB7XG4gICAgaWYgKCFpbm5lcm1vc3RCYXNlVGFnLmxlbmd0aCkge1xuICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh0YWcpO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGF0dHJpYnV0ZUtleSA9IGtleXNbaV07XG4gICAgICAgIHZhciBsb3dlckNhc2VBdHRyaWJ1dGVLZXkgPSBhdHRyaWJ1dGVLZXkudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBpZiAocHJpbWFyeUF0dHJpYnV0ZXMuaW5kZXhPZihsb3dlckNhc2VBdHRyaWJ1dGVLZXkpICE9PSAtMSAmJiB0YWdbbG93ZXJDYXNlQXR0cmlidXRlS2V5XSkge1xuICAgICAgICAgIHJldHVybiBpbm5lcm1vc3RCYXNlVGFnLmNvbmNhdCh0YWcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGlubmVybW9zdEJhc2VUYWc7XG4gIH0sIFtdKTtcbn07XG5cbnZhciBnZXRUYWdzRnJvbVByb3BzTGlzdCA9IGZ1bmN0aW9uIGdldFRhZ3NGcm9tUHJvcHNMaXN0KHRhZ05hbWUsIHByaW1hcnlBdHRyaWJ1dGVzLCBwcm9wc0xpc3QpIHtcbiAgLy8gQ2FsY3VsYXRlIGxpc3Qgb2YgdGFncywgZ2l2aW5nIHByaW9yaXR5IGlubmVybW9zdCBjb21wb25lbnQgKGVuZCBvZiB0aGUgcHJvcHNsaXN0KVxuICB2YXIgYXBwcm92ZWRTZWVuVGFncyA9IHt9O1xuICByZXR1cm4gcHJvcHNMaXN0LmZpbHRlcihmdW5jdGlvbiAocHJvcHMpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9wc1t0YWdOYW1lXSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcHJvcHNbdGFnTmFtZV0gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHdhcm4oXCJIZWxtZXQ6IFwiICsgdGFnTmFtZSArIFwiIHNob3VsZCBiZSBvZiB0eXBlIFxcXCJBcnJheVxcXCIuIEluc3RlYWQgZm91bmQgdHlwZSBcXFwiXCIgKyBfdHlwZW9mKHByb3BzW3RhZ05hbWVdKSArIFwiXFxcIlwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0pLm1hcChmdW5jdGlvbiAocHJvcHMpIHtcbiAgICByZXR1cm4gcHJvcHNbdGFnTmFtZV07XG4gIH0pLnJldmVyc2UoKS5yZWR1Y2UoZnVuY3Rpb24gKGFwcHJvdmVkVGFncywgaW5zdGFuY2VUYWdzKSB7XG4gICAgdmFyIGluc3RhbmNlU2VlblRhZ3MgPSB7fTtcbiAgICBpbnN0YW5jZVRhZ3MuZmlsdGVyKGZ1bmN0aW9uICh0YWcpIHtcbiAgICAgIHZhciBwcmltYXJ5QXR0cmlidXRlS2V5ID0gdm9pZCAwO1xuICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh0YWcpO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGF0dHJpYnV0ZUtleSA9IGtleXNbaV07XG4gICAgICAgIHZhciBsb3dlckNhc2VBdHRyaWJ1dGVLZXkgPSBhdHRyaWJ1dGVLZXkudG9Mb3dlckNhc2UoKTsgLy8gU3BlY2lhbCBydWxlIHdpdGggbGluayB0YWdzLCBzaW5jZSByZWwgYW5kIGhyZWYgYXJlIGJvdGggcHJpbWFyeSB0YWdzLCByZWwgdGFrZXMgcHJpb3JpdHlcblxuICAgICAgICBpZiAocHJpbWFyeUF0dHJpYnV0ZXMuaW5kZXhPZihsb3dlckNhc2VBdHRyaWJ1dGVLZXkpICE9PSAtMSAmJiAhKHByaW1hcnlBdHRyaWJ1dGVLZXkgPT09IFRBR19QUk9QRVJUSUVTLlJFTCAmJiB0YWdbcHJpbWFyeUF0dHJpYnV0ZUtleV0udG9Mb3dlckNhc2UoKSA9PT0gXCJjYW5vbmljYWxcIikgJiYgIShsb3dlckNhc2VBdHRyaWJ1dGVLZXkgPT09IFRBR19QUk9QRVJUSUVTLlJFTCAmJiB0YWdbbG93ZXJDYXNlQXR0cmlidXRlS2V5XS50b0xvd2VyQ2FzZSgpID09PSBcInN0eWxlc2hlZXRcIikpIHtcbiAgICAgICAgICBwcmltYXJ5QXR0cmlidXRlS2V5ID0gbG93ZXJDYXNlQXR0cmlidXRlS2V5O1xuICAgICAgICB9IC8vIFNwZWNpYWwgY2FzZSBmb3IgaW5uZXJIVE1MIHdoaWNoIGRvZXNuJ3Qgd29yayBsb3dlcmNhc2VkXG5cblxuICAgICAgICBpZiAocHJpbWFyeUF0dHJpYnV0ZXMuaW5kZXhPZihhdHRyaWJ1dGVLZXkpICE9PSAtMSAmJiAoYXR0cmlidXRlS2V5ID09PSBUQUdfUFJPUEVSVElFUy5JTk5FUl9IVE1MIHx8IGF0dHJpYnV0ZUtleSA9PT0gVEFHX1BST1BFUlRJRVMuQ1NTX1RFWFQgfHwgYXR0cmlidXRlS2V5ID09PSBUQUdfUFJPUEVSVElFUy5JVEVNX1BST1ApKSB7XG4gICAgICAgICAgcHJpbWFyeUF0dHJpYnV0ZUtleSA9IGF0dHJpYnV0ZUtleTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIXByaW1hcnlBdHRyaWJ1dGVLZXkgfHwgIXRhZ1twcmltYXJ5QXR0cmlidXRlS2V5XSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHZhciB2YWx1ZSA9IHRhZ1twcmltYXJ5QXR0cmlidXRlS2V5XS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICBpZiAoIWFwcHJvdmVkU2VlblRhZ3NbcHJpbWFyeUF0dHJpYnV0ZUtleV0pIHtcbiAgICAgICAgYXBwcm92ZWRTZWVuVGFnc1twcmltYXJ5QXR0cmlidXRlS2V5XSA9IHt9O1xuICAgICAgfVxuXG4gICAgICBpZiAoIWluc3RhbmNlU2VlblRhZ3NbcHJpbWFyeUF0dHJpYnV0ZUtleV0pIHtcbiAgICAgICAgaW5zdGFuY2VTZWVuVGFnc1twcmltYXJ5QXR0cmlidXRlS2V5XSA9IHt9O1xuICAgICAgfVxuXG4gICAgICBpZiAoIWFwcHJvdmVkU2VlblRhZ3NbcHJpbWFyeUF0dHJpYnV0ZUtleV1bdmFsdWVdKSB7XG4gICAgICAgIGluc3RhbmNlU2VlblRhZ3NbcHJpbWFyeUF0dHJpYnV0ZUtleV1bdmFsdWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KS5yZXZlcnNlKCkuZm9yRWFjaChmdW5jdGlvbiAodGFnKSB7XG4gICAgICByZXR1cm4gYXBwcm92ZWRUYWdzLnB1c2godGFnKTtcbiAgICB9KTsgLy8gVXBkYXRlIHNlZW4gdGFncyB3aXRoIHRhZ3MgZnJvbSB0aGlzIGluc3RhbmNlXG5cbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGluc3RhbmNlU2VlblRhZ3MpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgYXR0cmlidXRlS2V5ID0ga2V5c1tpXTtcbiAgICAgIHZhciB0YWdVbmlvbiA9IG9iamVjdEFzc2lnbih7fSwgYXBwcm92ZWRTZWVuVGFnc1thdHRyaWJ1dGVLZXldLCBpbnN0YW5jZVNlZW5UYWdzW2F0dHJpYnV0ZUtleV0pO1xuICAgICAgYXBwcm92ZWRTZWVuVGFnc1thdHRyaWJ1dGVLZXldID0gdGFnVW5pb247XG4gICAgfVxuXG4gICAgcmV0dXJuIGFwcHJvdmVkVGFncztcbiAgfSwgW10pLnJldmVyc2UoKTtcbn07XG5cbnZhciBnZXRJbm5lcm1vc3RQcm9wZXJ0eSA9IGZ1bmN0aW9uIGdldElubmVybW9zdFByb3BlcnR5KHByb3BzTGlzdCwgcHJvcGVydHkpIHtcbiAgZm9yICh2YXIgaSA9IHByb3BzTGlzdC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIHZhciBwcm9wcyA9IHByb3BzTGlzdFtpXTtcblxuICAgIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpIHtcbiAgICAgIHJldHVybiBwcm9wc1twcm9wZXJ0eV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59O1xuXG52YXIgcmVkdWNlUHJvcHNUb1N0YXRlID0gZnVuY3Rpb24gcmVkdWNlUHJvcHNUb1N0YXRlKHByb3BzTGlzdCkge1xuICByZXR1cm4ge1xuICAgIGJhc2VUYWc6IGdldEJhc2VUYWdGcm9tUHJvcHNMaXN0KFtUQUdfUFJPUEVSVElFUy5IUkVGLCBUQUdfUFJPUEVSVElFUy5UQVJHRVRdLCBwcm9wc0xpc3QpLFxuICAgIGJvZHlBdHRyaWJ1dGVzOiBnZXRBdHRyaWJ1dGVzRnJvbVByb3BzTGlzdChBVFRSSUJVVEVfTkFNRVMuQk9EWSwgcHJvcHNMaXN0KSxcbiAgICBkZWZlcjogZ2V0SW5uZXJtb3N0UHJvcGVydHkocHJvcHNMaXN0LCBIRUxNRVRfUFJPUFMuREVGRVIpLFxuICAgIGVuY29kZTogZ2V0SW5uZXJtb3N0UHJvcGVydHkocHJvcHNMaXN0LCBIRUxNRVRfUFJPUFMuRU5DT0RFX1NQRUNJQUxfQ0hBUkFDVEVSUyksXG4gICAgaHRtbEF0dHJpYnV0ZXM6IGdldEF0dHJpYnV0ZXNGcm9tUHJvcHNMaXN0KEFUVFJJQlVURV9OQU1FUy5IVE1MLCBwcm9wc0xpc3QpLFxuICAgIGxpbmtUYWdzOiBnZXRUYWdzRnJvbVByb3BzTGlzdChUQUdfTkFNRVMuTElOSywgW1RBR19QUk9QRVJUSUVTLlJFTCwgVEFHX1BST1BFUlRJRVMuSFJFRl0sIHByb3BzTGlzdCksXG4gICAgbWV0YVRhZ3M6IGdldFRhZ3NGcm9tUHJvcHNMaXN0KFRBR19OQU1FUy5NRVRBLCBbVEFHX1BST1BFUlRJRVMuTkFNRSwgVEFHX1BST1BFUlRJRVMuQ0hBUlNFVCwgVEFHX1BST1BFUlRJRVMuSFRUUEVRVUlWLCBUQUdfUFJPUEVSVElFUy5QUk9QRVJUWSwgVEFHX1BST1BFUlRJRVMuSVRFTV9QUk9QXSwgcHJvcHNMaXN0KSxcbiAgICBub3NjcmlwdFRhZ3M6IGdldFRhZ3NGcm9tUHJvcHNMaXN0KFRBR19OQU1FUy5OT1NDUklQVCwgW1RBR19QUk9QRVJUSUVTLklOTkVSX0hUTUxdLCBwcm9wc0xpc3QpLFxuICAgIG9uQ2hhbmdlQ2xpZW50U3RhdGU6IGdldE9uQ2hhbmdlQ2xpZW50U3RhdGUocHJvcHNMaXN0KSxcbiAgICBzY3JpcHRUYWdzOiBnZXRUYWdzRnJvbVByb3BzTGlzdChUQUdfTkFNRVMuU0NSSVBULCBbVEFHX1BST1BFUlRJRVMuU1JDLCBUQUdfUFJPUEVSVElFUy5JTk5FUl9IVE1MXSwgcHJvcHNMaXN0KSxcbiAgICBzdHlsZVRhZ3M6IGdldFRhZ3NGcm9tUHJvcHNMaXN0KFRBR19OQU1FUy5TVFlMRSwgW1RBR19QUk9QRVJUSUVTLkNTU19URVhUXSwgcHJvcHNMaXN0KSxcbiAgICB0aXRsZTogZ2V0VGl0bGVGcm9tUHJvcHNMaXN0KHByb3BzTGlzdCksXG4gICAgdGl0bGVBdHRyaWJ1dGVzOiBnZXRBdHRyaWJ1dGVzRnJvbVByb3BzTGlzdChBVFRSSUJVVEVfTkFNRVMuVElUTEUsIHByb3BzTGlzdClcbiAgfTtcbn07XG5cbnZhciByYWZQb2x5ZmlsbCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGNsb2NrID0gRGF0ZS5ub3coKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgIHZhciBjdXJyZW50VGltZSA9IERhdGUubm93KCk7XG5cbiAgICBpZiAoY3VycmVudFRpbWUgLSBjbG9jayA+IDE2KSB7XG4gICAgICBjbG9jayA9IGN1cnJlbnRUaW1lO1xuICAgICAgY2FsbGJhY2soY3VycmVudFRpbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmFmUG9seWZpbGwoY2FsbGJhY2spO1xuICAgICAgfSwgMCk7XG4gICAgfVxuICB9O1xufSgpO1xuXG52YXIgY2FmUG9seWZpbGwgPSBmdW5jdGlvbiBjYWZQb2x5ZmlsbChpZCkge1xuICByZXR1cm4gY2xlYXJUaW1lb3V0KGlkKTtcbn07XG5cbnZhciByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSAmJiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KSB8fCB3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8IHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgcmFmUG9seWZpbGwgOiBnbG9iYWwucmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8IHJhZlBvbHlmaWxsO1xudmFyIGNhbmNlbEFuaW1hdGlvbkZyYW1lID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSB8fCB3aW5kb3cud2Via2l0Q2FuY2VsQW5pbWF0aW9uRnJhbWUgfHwgd2luZG93Lm1vekNhbmNlbEFuaW1hdGlvbkZyYW1lIHx8IGNhZlBvbHlmaWxsIDogZ2xvYmFsLmNhbmNlbEFuaW1hdGlvbkZyYW1lIHx8IGNhZlBvbHlmaWxsO1xuXG52YXIgd2FybiA9IGZ1bmN0aW9uIHdhcm4obXNnKSB7XG4gIHJldHVybiBjb25zb2xlICYmIHR5cGVvZiBjb25zb2xlLndhcm4gPT09IFwiZnVuY3Rpb25cIiAmJiBjb25zb2xlLndhcm4obXNnKTtcbn07XG5cbnZhciBfaGVsbWV0Q2FsbGJhY2sgPSBudWxsO1xuXG52YXIgaGFuZGxlQ2xpZW50U3RhdGVDaGFuZ2UgPSBmdW5jdGlvbiBoYW5kbGVDbGllbnRTdGF0ZUNoYW5nZShuZXdTdGF0ZSkge1xuICBpZiAoX2hlbG1ldENhbGxiYWNrKSB7XG4gICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoX2hlbG1ldENhbGxiYWNrKTtcbiAgfVxuXG4gIGlmIChuZXdTdGF0ZS5kZWZlcikge1xuICAgIF9oZWxtZXRDYWxsYmFjayA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICBjb21taXRUYWdDaGFuZ2VzKG5ld1N0YXRlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF9oZWxtZXRDYWxsYmFjayA9IG51bGw7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBjb21taXRUYWdDaGFuZ2VzKG5ld1N0YXRlKTtcbiAgICBfaGVsbWV0Q2FsbGJhY2sgPSBudWxsO1xuICB9XG59O1xuXG52YXIgY29tbWl0VGFnQ2hhbmdlcyA9IGZ1bmN0aW9uIGNvbW1pdFRhZ0NoYW5nZXMobmV3U3RhdGUsIGNiKSB7XG4gIHZhciBiYXNlVGFnID0gbmV3U3RhdGUuYmFzZVRhZyxcbiAgICAgIGJvZHlBdHRyaWJ1dGVzID0gbmV3U3RhdGUuYm9keUF0dHJpYnV0ZXMsXG4gICAgICBodG1sQXR0cmlidXRlcyA9IG5ld1N0YXRlLmh0bWxBdHRyaWJ1dGVzLFxuICAgICAgbGlua1RhZ3MgPSBuZXdTdGF0ZS5saW5rVGFncyxcbiAgICAgIG1ldGFUYWdzID0gbmV3U3RhdGUubWV0YVRhZ3MsXG4gICAgICBub3NjcmlwdFRhZ3MgPSBuZXdTdGF0ZS5ub3NjcmlwdFRhZ3MsXG4gICAgICBvbkNoYW5nZUNsaWVudFN0YXRlID0gbmV3U3RhdGUub25DaGFuZ2VDbGllbnRTdGF0ZSxcbiAgICAgIHNjcmlwdFRhZ3MgPSBuZXdTdGF0ZS5zY3JpcHRUYWdzLFxuICAgICAgc3R5bGVUYWdzID0gbmV3U3RhdGUuc3R5bGVUYWdzLFxuICAgICAgdGl0bGUgPSBuZXdTdGF0ZS50aXRsZSxcbiAgICAgIHRpdGxlQXR0cmlidXRlcyA9IG5ld1N0YXRlLnRpdGxlQXR0cmlidXRlcztcbiAgdXBkYXRlQXR0cmlidXRlcyhUQUdfTkFNRVMuQk9EWSwgYm9keUF0dHJpYnV0ZXMpO1xuICB1cGRhdGVBdHRyaWJ1dGVzKFRBR19OQU1FUy5IVE1MLCBodG1sQXR0cmlidXRlcyk7XG4gIHVwZGF0ZVRpdGxlKHRpdGxlLCB0aXRsZUF0dHJpYnV0ZXMpO1xuICB2YXIgdGFnVXBkYXRlcyA9IHtcbiAgICBiYXNlVGFnOiB1cGRhdGVUYWdzKFRBR19OQU1FUy5CQVNFLCBiYXNlVGFnKSxcbiAgICBsaW5rVGFnczogdXBkYXRlVGFncyhUQUdfTkFNRVMuTElOSywgbGlua1RhZ3MpLFxuICAgIG1ldGFUYWdzOiB1cGRhdGVUYWdzKFRBR19OQU1FUy5NRVRBLCBtZXRhVGFncyksXG4gICAgbm9zY3JpcHRUYWdzOiB1cGRhdGVUYWdzKFRBR19OQU1FUy5OT1NDUklQVCwgbm9zY3JpcHRUYWdzKSxcbiAgICBzY3JpcHRUYWdzOiB1cGRhdGVUYWdzKFRBR19OQU1FUy5TQ1JJUFQsIHNjcmlwdFRhZ3MpLFxuICAgIHN0eWxlVGFnczogdXBkYXRlVGFncyhUQUdfTkFNRVMuU1RZTEUsIHN0eWxlVGFncylcbiAgfTtcbiAgdmFyIGFkZGVkVGFncyA9IHt9O1xuICB2YXIgcmVtb3ZlZFRhZ3MgPSB7fTtcbiAgT2JqZWN0LmtleXModGFnVXBkYXRlcykuZm9yRWFjaChmdW5jdGlvbiAodGFnVHlwZSkge1xuICAgIHZhciBfdGFnVXBkYXRlcyR0YWdUeXBlID0gdGFnVXBkYXRlc1t0YWdUeXBlXSxcbiAgICAgICAgbmV3VGFncyA9IF90YWdVcGRhdGVzJHRhZ1R5cGUubmV3VGFncyxcbiAgICAgICAgb2xkVGFncyA9IF90YWdVcGRhdGVzJHRhZ1R5cGUub2xkVGFncztcblxuICAgIGlmIChuZXdUYWdzLmxlbmd0aCkge1xuICAgICAgYWRkZWRUYWdzW3RhZ1R5cGVdID0gbmV3VGFncztcbiAgICB9XG5cbiAgICBpZiAob2xkVGFncy5sZW5ndGgpIHtcbiAgICAgIHJlbW92ZWRUYWdzW3RhZ1R5cGVdID0gdGFnVXBkYXRlc1t0YWdUeXBlXS5vbGRUYWdzO1xuICAgIH1cbiAgfSk7XG4gIGNiICYmIGNiKCk7XG4gIG9uQ2hhbmdlQ2xpZW50U3RhdGUobmV3U3RhdGUsIGFkZGVkVGFncywgcmVtb3ZlZFRhZ3MpO1xufTtcblxudmFyIGZsYXR0ZW5BcnJheSA9IGZ1bmN0aW9uIGZsYXR0ZW5BcnJheShwb3NzaWJsZUFycmF5KSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHBvc3NpYmxlQXJyYXkpID8gcG9zc2libGVBcnJheS5qb2luKFwiXCIpIDogcG9zc2libGVBcnJheTtcbn07XG5cbnZhciB1cGRhdGVUaXRsZSA9IGZ1bmN0aW9uIHVwZGF0ZVRpdGxlKHRpdGxlLCBhdHRyaWJ1dGVzKSB7XG4gIGlmICh0eXBlb2YgdGl0bGUgIT09IFwidW5kZWZpbmVkXCIgJiYgZG9jdW1lbnQudGl0bGUgIT09IHRpdGxlKSB7XG4gICAgZG9jdW1lbnQudGl0bGUgPSBmbGF0dGVuQXJyYXkodGl0bGUpO1xuICB9XG5cbiAgdXBkYXRlQXR0cmlidXRlcyhUQUdfTkFNRVMuVElUTEUsIGF0dHJpYnV0ZXMpO1xufTtcblxudmFyIHVwZGF0ZUF0dHJpYnV0ZXMgPSBmdW5jdGlvbiB1cGRhdGVBdHRyaWJ1dGVzKHRhZ05hbWUsIGF0dHJpYnV0ZXMpIHtcbiAgdmFyIGVsZW1lbnRUYWcgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWdOYW1lKVswXTtcblxuICBpZiAoIWVsZW1lbnRUYWcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgaGVsbWV0QXR0cmlidXRlU3RyaW5nID0gZWxlbWVudFRhZy5nZXRBdHRyaWJ1dGUoSEVMTUVUX0FUVFJJQlVURSk7XG4gIHZhciBoZWxtZXRBdHRyaWJ1dGVzID0gaGVsbWV0QXR0cmlidXRlU3RyaW5nID8gaGVsbWV0QXR0cmlidXRlU3RyaW5nLnNwbGl0KFwiLFwiKSA6IFtdO1xuICB2YXIgYXR0cmlidXRlc1RvUmVtb3ZlID0gW10uY29uY2F0KGhlbG1ldEF0dHJpYnV0ZXMpO1xuICB2YXIgYXR0cmlidXRlS2V5cyA9IE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXR0cmlidXRlS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVLZXlzW2ldO1xuICAgIHZhciB2YWx1ZSA9IGF0dHJpYnV0ZXNbYXR0cmlidXRlXSB8fCBcIlwiO1xuXG4gICAgaWYgKGVsZW1lbnRUYWcuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZSkgIT09IHZhbHVlKSB7XG4gICAgICBlbGVtZW50VGFnLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAoaGVsbWV0QXR0cmlidXRlcy5pbmRleE9mKGF0dHJpYnV0ZSkgPT09IC0xKSB7XG4gICAgICBoZWxtZXRBdHRyaWJ1dGVzLnB1c2goYXR0cmlidXRlKTtcbiAgICB9XG5cbiAgICB2YXIgaW5kZXhUb1NhdmUgPSBhdHRyaWJ1dGVzVG9SZW1vdmUuaW5kZXhPZihhdHRyaWJ1dGUpO1xuXG4gICAgaWYgKGluZGV4VG9TYXZlICE9PSAtMSkge1xuICAgICAgYXR0cmlidXRlc1RvUmVtb3ZlLnNwbGljZShpbmRleFRvU2F2ZSwgMSk7XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgX2kgPSBhdHRyaWJ1dGVzVG9SZW1vdmUubGVuZ3RoIC0gMTsgX2kgPj0gMDsgX2ktLSkge1xuICAgIGVsZW1lbnRUYWcucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZXNUb1JlbW92ZVtfaV0pO1xuICB9XG5cbiAgaWYgKGhlbG1ldEF0dHJpYnV0ZXMubGVuZ3RoID09PSBhdHRyaWJ1dGVzVG9SZW1vdmUubGVuZ3RoKSB7XG4gICAgZWxlbWVudFRhZy5yZW1vdmVBdHRyaWJ1dGUoSEVMTUVUX0FUVFJJQlVURSk7XG4gIH0gZWxzZSBpZiAoZWxlbWVudFRhZy5nZXRBdHRyaWJ1dGUoSEVMTUVUX0FUVFJJQlVURSkgIT09IGF0dHJpYnV0ZUtleXMuam9pbihcIixcIikpIHtcbiAgICBlbGVtZW50VGFnLnNldEF0dHJpYnV0ZShIRUxNRVRfQVRUUklCVVRFLCBhdHRyaWJ1dGVLZXlzLmpvaW4oXCIsXCIpKTtcbiAgfVxufTtcblxudmFyIHVwZGF0ZVRhZ3MgPSBmdW5jdGlvbiB1cGRhdGVUYWdzKHR5cGUsIHRhZ3MpIHtcbiAgdmFyIGhlYWRFbGVtZW50ID0gZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFRBR19OQU1FUy5IRUFEKTtcbiAgdmFyIHRhZ05vZGVzID0gaGVhZEVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCh0eXBlICsgXCJbXCIgKyBIRUxNRVRfQVRUUklCVVRFICsgXCJdXCIpO1xuICB2YXIgb2xkVGFncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRhZ05vZGVzKTtcbiAgdmFyIG5ld1RhZ3MgPSBbXTtcbiAgdmFyIGluZGV4VG9EZWxldGUgPSB2b2lkIDA7XG5cbiAgaWYgKHRhZ3MgJiYgdGFncy5sZW5ndGgpIHtcbiAgICB0YWdzLmZvckVhY2goZnVuY3Rpb24gKHRhZykge1xuICAgICAgdmFyIG5ld0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHR5cGUpO1xuXG4gICAgICBmb3IgKHZhciBhdHRyaWJ1dGUgaW4gdGFnKSB7XG4gICAgICAgIGlmICh0YWcuaGFzT3duUHJvcGVydHkoYXR0cmlidXRlKSkge1xuICAgICAgICAgIGlmIChhdHRyaWJ1dGUgPT09IFRBR19QUk9QRVJUSUVTLklOTkVSX0hUTUwpIHtcbiAgICAgICAgICAgIG5ld0VsZW1lbnQuaW5uZXJIVE1MID0gdGFnLmlubmVySFRNTDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGF0dHJpYnV0ZSA9PT0gVEFHX1BST1BFUlRJRVMuQ1NTX1RFWFQpIHtcbiAgICAgICAgICAgIGlmIChuZXdFbGVtZW50LnN0eWxlU2hlZXQpIHtcbiAgICAgICAgICAgICAgbmV3RWxlbWVudC5zdHlsZVNoZWV0LmNzc1RleHQgPSB0YWcuY3NzVGV4dDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGFnLmNzc1RleHQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gdHlwZW9mIHRhZ1thdHRyaWJ1dGVdID09PSBcInVuZGVmaW5lZFwiID8gXCJcIiA6IHRhZ1thdHRyaWJ1dGVdO1xuICAgICAgICAgICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCB2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKEhFTE1FVF9BVFRSSUJVVEUsIFwidHJ1ZVwiKTsgLy8gUmVtb3ZlIGEgZHVwbGljYXRlIHRhZyBmcm9tIGRvbVRhZ3N0b1JlbW92ZSwgc28gaXQgaXNuJ3QgY2xlYXJlZC5cblxuICAgICAgaWYgKG9sZFRhZ3Muc29tZShmdW5jdGlvbiAoZXhpc3RpbmdUYWcsIGluZGV4KSB7XG4gICAgICAgIGluZGV4VG9EZWxldGUgPSBpbmRleDtcbiAgICAgICAgcmV0dXJuIG5ld0VsZW1lbnQuaXNFcXVhbE5vZGUoZXhpc3RpbmdUYWcpO1xuICAgICAgfSkpIHtcbiAgICAgICAgb2xkVGFncy5zcGxpY2UoaW5kZXhUb0RlbGV0ZSwgMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdUYWdzLnB1c2gobmV3RWxlbWVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBvbGRUYWdzLmZvckVhY2goZnVuY3Rpb24gKHRhZykge1xuICAgIHJldHVybiB0YWcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0YWcpO1xuICB9KTtcbiAgbmV3VGFncy5mb3JFYWNoKGZ1bmN0aW9uICh0YWcpIHtcbiAgICByZXR1cm4gaGVhZEVsZW1lbnQuYXBwZW5kQ2hpbGQodGFnKTtcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgb2xkVGFnczogb2xkVGFncyxcbiAgICBuZXdUYWdzOiBuZXdUYWdzXG4gIH07XG59O1xuXG52YXIgZ2VuZXJhdGVFbGVtZW50QXR0cmlidXRlc0FzU3RyaW5nID0gZnVuY3Rpb24gZ2VuZXJhdGVFbGVtZW50QXR0cmlidXRlc0FzU3RyaW5nKGF0dHJpYnV0ZXMpIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLnJlZHVjZShmdW5jdGlvbiAoc3RyLCBrZXkpIHtcbiAgICB2YXIgYXR0ciA9IHR5cGVvZiBhdHRyaWJ1dGVzW2tleV0gIT09IFwidW5kZWZpbmVkXCIgPyBrZXkgKyBcIj1cXFwiXCIgKyBhdHRyaWJ1dGVzW2tleV0gKyBcIlxcXCJcIiA6IFwiXCIgKyBrZXk7XG4gICAgcmV0dXJuIHN0ciA/IHN0ciArIFwiIFwiICsgYXR0ciA6IGF0dHI7XG4gIH0sIFwiXCIpO1xufTtcblxudmFyIGdlbmVyYXRlVGl0bGVBc1N0cmluZyA9IGZ1bmN0aW9uIGdlbmVyYXRlVGl0bGVBc1N0cmluZyh0eXBlLCB0aXRsZSwgYXR0cmlidXRlcywgZW5jb2RlKSB7XG4gIHZhciBhdHRyaWJ1dGVTdHJpbmcgPSBnZW5lcmF0ZUVsZW1lbnRBdHRyaWJ1dGVzQXNTdHJpbmcoYXR0cmlidXRlcyk7XG4gIHZhciBmbGF0dGVuZWRUaXRsZSA9IGZsYXR0ZW5BcnJheSh0aXRsZSk7XG4gIHJldHVybiBhdHRyaWJ1dGVTdHJpbmcgPyBcIjxcIiArIHR5cGUgKyBcIiBcIiArIEhFTE1FVF9BVFRSSUJVVEUgKyBcIj1cXFwidHJ1ZVxcXCIgXCIgKyBhdHRyaWJ1dGVTdHJpbmcgKyBcIj5cIiArIGVuY29kZVNwZWNpYWxDaGFyYWN0ZXJzKGZsYXR0ZW5lZFRpdGxlLCBlbmNvZGUpICsgXCI8L1wiICsgdHlwZSArIFwiPlwiIDogXCI8XCIgKyB0eXBlICsgXCIgXCIgKyBIRUxNRVRfQVRUUklCVVRFICsgXCI9XFxcInRydWVcXFwiPlwiICsgZW5jb2RlU3BlY2lhbENoYXJhY3RlcnMoZmxhdHRlbmVkVGl0bGUsIGVuY29kZSkgKyBcIjwvXCIgKyB0eXBlICsgXCI+XCI7XG59O1xuXG52YXIgZ2VuZXJhdGVUYWdzQXNTdHJpbmcgPSBmdW5jdGlvbiBnZW5lcmF0ZVRhZ3NBc1N0cmluZyh0eXBlLCB0YWdzLCBlbmNvZGUpIHtcbiAgcmV0dXJuIHRhZ3MucmVkdWNlKGZ1bmN0aW9uIChzdHIsIHRhZykge1xuICAgIHZhciBhdHRyaWJ1dGVIdG1sID0gT2JqZWN0LmtleXModGFnKS5maWx0ZXIoZnVuY3Rpb24gKGF0dHJpYnV0ZSkge1xuICAgICAgcmV0dXJuICEoYXR0cmlidXRlID09PSBUQUdfUFJPUEVSVElFUy5JTk5FUl9IVE1MIHx8IGF0dHJpYnV0ZSA9PT0gVEFHX1BST1BFUlRJRVMuQ1NTX1RFWFQpO1xuICAgIH0pLnJlZHVjZShmdW5jdGlvbiAoc3RyaW5nLCBhdHRyaWJ1dGUpIHtcbiAgICAgIHZhciBhdHRyID0gdHlwZW9mIHRhZ1thdHRyaWJ1dGVdID09PSBcInVuZGVmaW5lZFwiID8gYXR0cmlidXRlIDogYXR0cmlidXRlICsgXCI9XFxcIlwiICsgZW5jb2RlU3BlY2lhbENoYXJhY3RlcnModGFnW2F0dHJpYnV0ZV0sIGVuY29kZSkgKyBcIlxcXCJcIjtcbiAgICAgIHJldHVybiBzdHJpbmcgPyBzdHJpbmcgKyBcIiBcIiArIGF0dHIgOiBhdHRyO1xuICAgIH0sIFwiXCIpO1xuICAgIHZhciB0YWdDb250ZW50ID0gdGFnLmlubmVySFRNTCB8fCB0YWcuY3NzVGV4dCB8fCBcIlwiO1xuICAgIHZhciBpc1NlbGZDbG9zaW5nID0gU0VMRl9DTE9TSU5HX1RBR1MuaW5kZXhPZih0eXBlKSA9PT0gLTE7XG4gICAgcmV0dXJuIHN0ciArIFwiPFwiICsgdHlwZSArIFwiIFwiICsgSEVMTUVUX0FUVFJJQlVURSArIFwiPVxcXCJ0cnVlXFxcIiBcIiArIGF0dHJpYnV0ZUh0bWwgKyAoaXNTZWxmQ2xvc2luZyA/IFwiLz5cIiA6IFwiPlwiICsgdGFnQ29udGVudCArIFwiPC9cIiArIHR5cGUgKyBcIj5cIik7XG4gIH0sIFwiXCIpO1xufTtcblxudmFyIGNvbnZlcnRFbGVtZW50QXR0cmlidXRlc3RvUmVhY3RQcm9wcyA9IGZ1bmN0aW9uIGNvbnZlcnRFbGVtZW50QXR0cmlidXRlc3RvUmVhY3RQcm9wcyhhdHRyaWJ1dGVzKSB7XG4gIHZhciBpbml0UHJvcHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICByZXR1cm4gT2JqZWN0LmtleXMoYXR0cmlidXRlcykucmVkdWNlKGZ1bmN0aW9uIChvYmosIGtleSkge1xuICAgIG9ialtSRUFDVF9UQUdfTUFQW2tleV0gfHwga2V5XSA9IGF0dHJpYnV0ZXNba2V5XTtcbiAgICByZXR1cm4gb2JqO1xuICB9LCBpbml0UHJvcHMpO1xufTtcblxudmFyIGNvbnZlcnRSZWFjdFByb3BzdG9IdG1sQXR0cmlidXRlcyA9IGZ1bmN0aW9uIGNvbnZlcnRSZWFjdFByb3BzdG9IdG1sQXR0cmlidXRlcyhwcm9wcykge1xuICB2YXIgaW5pdEF0dHJpYnV0ZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICByZXR1cm4gT2JqZWN0LmtleXMocHJvcHMpLnJlZHVjZShmdW5jdGlvbiAob2JqLCBrZXkpIHtcbiAgICBvYmpbSFRNTF9UQUdfTUFQW2tleV0gfHwga2V5XSA9IHByb3BzW2tleV07XG4gICAgcmV0dXJuIG9iajtcbiAgfSwgaW5pdEF0dHJpYnV0ZXMpO1xufTtcblxudmFyIGdlbmVyYXRlVGl0bGVBc1JlYWN0Q29tcG9uZW50ID0gZnVuY3Rpb24gZ2VuZXJhdGVUaXRsZUFzUmVhY3RDb21wb25lbnQodHlwZSwgdGl0bGUsIGF0dHJpYnV0ZXMpIHtcbiAgdmFyIF9pbml0UHJvcHM7IC8vIGFzc2lnbmluZyBpbnRvIGFuIGFycmF5IHRvIGRlZmluZSB0b1N0cmluZyBmdW5jdGlvbiBvbiBpdFxuXG5cbiAgdmFyIGluaXRQcm9wcyA9IChfaW5pdFByb3BzID0ge1xuICAgIGtleTogdGl0bGVcbiAgfSwgX2luaXRQcm9wc1tIRUxNRVRfQVRUUklCVVRFXSA9IHRydWUsIF9pbml0UHJvcHMpO1xuICB2YXIgcHJvcHMgPSBjb252ZXJ0RWxlbWVudEF0dHJpYnV0ZXN0b1JlYWN0UHJvcHMoYXR0cmlidXRlcywgaW5pdFByb3BzKTtcbiAgcmV0dXJuIFtSZWFjdC5jcmVhdGVFbGVtZW50KFRBR19OQU1FUy5USVRMRSwgcHJvcHMsIHRpdGxlKV07XG59O1xuXG52YXIgZ2VuZXJhdGVUYWdzQXNSZWFjdENvbXBvbmVudCA9IGZ1bmN0aW9uIGdlbmVyYXRlVGFnc0FzUmVhY3RDb21wb25lbnQodHlwZSwgdGFncykge1xuICByZXR1cm4gdGFncy5tYXAoZnVuY3Rpb24gKHRhZywgaSkge1xuICAgIHZhciBfbWFwcGVkVGFnO1xuXG4gICAgdmFyIG1hcHBlZFRhZyA9IChfbWFwcGVkVGFnID0ge1xuICAgICAga2V5OiBpXG4gICAgfSwgX21hcHBlZFRhZ1tIRUxNRVRfQVRUUklCVVRFXSA9IHRydWUsIF9tYXBwZWRUYWcpO1xuICAgIE9iamVjdC5rZXlzKHRhZykuZm9yRWFjaChmdW5jdGlvbiAoYXR0cmlidXRlKSB7XG4gICAgICB2YXIgbWFwcGVkQXR0cmlidXRlID0gUkVBQ1RfVEFHX01BUFthdHRyaWJ1dGVdIHx8IGF0dHJpYnV0ZTtcblxuICAgICAgaWYgKG1hcHBlZEF0dHJpYnV0ZSA9PT0gVEFHX1BST1BFUlRJRVMuSU5ORVJfSFRNTCB8fCBtYXBwZWRBdHRyaWJ1dGUgPT09IFRBR19QUk9QRVJUSUVTLkNTU19URVhUKSB7XG4gICAgICAgIHZhciBjb250ZW50ID0gdGFnLmlubmVySFRNTCB8fCB0YWcuY3NzVGV4dDtcbiAgICAgICAgbWFwcGVkVGFnLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MID0ge1xuICAgICAgICAgIF9faHRtbDogY29udGVudFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWFwcGVkVGFnW21hcHBlZEF0dHJpYnV0ZV0gPSB0YWdbYXR0cmlidXRlXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudCh0eXBlLCBtYXBwZWRUYWcpO1xuICB9KTtcbn07XG5cbnZhciBnZXRNZXRob2RzRm9yVGFnID0gZnVuY3Rpb24gZ2V0TWV0aG9kc0ZvclRhZyh0eXBlLCB0YWdzLCBlbmNvZGUpIHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBUQUdfTkFNRVMuVElUTEU6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0b0NvbXBvbmVudDogZnVuY3Rpb24gdG9Db21wb25lbnQoKSB7XG4gICAgICAgICAgcmV0dXJuIGdlbmVyYXRlVGl0bGVBc1JlYWN0Q29tcG9uZW50KHR5cGUsIHRhZ3MudGl0bGUsIHRhZ3MudGl0bGVBdHRyaWJ1dGVzLCBlbmNvZGUpO1xuICAgICAgICB9LFxuICAgICAgICB0b1N0cmluZzogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICAgICAgcmV0dXJuIGdlbmVyYXRlVGl0bGVBc1N0cmluZyh0eXBlLCB0YWdzLnRpdGxlLCB0YWdzLnRpdGxlQXR0cmlidXRlcywgZW5jb2RlKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgIGNhc2UgQVRUUklCVVRFX05BTUVTLkJPRFk6XG4gICAgY2FzZSBBVFRSSUJVVEVfTkFNRVMuSFRNTDpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRvQ29tcG9uZW50OiBmdW5jdGlvbiB0b0NvbXBvbmVudCgpIHtcbiAgICAgICAgICByZXR1cm4gY29udmVydEVsZW1lbnRBdHRyaWJ1dGVzdG9SZWFjdFByb3BzKHRhZ3MpO1xuICAgICAgICB9LFxuICAgICAgICB0b1N0cmluZzogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICAgICAgcmV0dXJuIGdlbmVyYXRlRWxlbWVudEF0dHJpYnV0ZXNBc1N0cmluZyh0YWdzKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0b0NvbXBvbmVudDogZnVuY3Rpb24gdG9Db21wb25lbnQoKSB7XG4gICAgICAgICAgcmV0dXJuIGdlbmVyYXRlVGFnc0FzUmVhY3RDb21wb25lbnQodHlwZSwgdGFncyk7XG4gICAgICAgIH0sXG4gICAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVUYWdzQXNTdHJpbmcodHlwZSwgdGFncywgZW5jb2RlKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgfVxufTtcblxudmFyIG1hcFN0YXRlT25TZXJ2ZXIgPSBmdW5jdGlvbiBtYXBTdGF0ZU9uU2VydmVyKF9yZWYpIHtcbiAgdmFyIGJhc2VUYWcgPSBfcmVmLmJhc2VUYWcsXG4gICAgICBib2R5QXR0cmlidXRlcyA9IF9yZWYuYm9keUF0dHJpYnV0ZXMsXG4gICAgICBlbmNvZGUgPSBfcmVmLmVuY29kZSxcbiAgICAgIGh0bWxBdHRyaWJ1dGVzID0gX3JlZi5odG1sQXR0cmlidXRlcyxcbiAgICAgIGxpbmtUYWdzID0gX3JlZi5saW5rVGFncyxcbiAgICAgIG1ldGFUYWdzID0gX3JlZi5tZXRhVGFncyxcbiAgICAgIG5vc2NyaXB0VGFncyA9IF9yZWYubm9zY3JpcHRUYWdzLFxuICAgICAgc2NyaXB0VGFncyA9IF9yZWYuc2NyaXB0VGFncyxcbiAgICAgIHN0eWxlVGFncyA9IF9yZWYuc3R5bGVUYWdzLFxuICAgICAgX3JlZiR0aXRsZSA9IF9yZWYudGl0bGUsXG4gICAgICB0aXRsZSA9IF9yZWYkdGl0bGUgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBfcmVmJHRpdGxlLFxuICAgICAgdGl0bGVBdHRyaWJ1dGVzID0gX3JlZi50aXRsZUF0dHJpYnV0ZXM7XG4gIHJldHVybiB7XG4gICAgYmFzZTogZ2V0TWV0aG9kc0ZvclRhZyhUQUdfTkFNRVMuQkFTRSwgYmFzZVRhZywgZW5jb2RlKSxcbiAgICBib2R5QXR0cmlidXRlczogZ2V0TWV0aG9kc0ZvclRhZyhBVFRSSUJVVEVfTkFNRVMuQk9EWSwgYm9keUF0dHJpYnV0ZXMsIGVuY29kZSksXG4gICAgaHRtbEF0dHJpYnV0ZXM6IGdldE1ldGhvZHNGb3JUYWcoQVRUUklCVVRFX05BTUVTLkhUTUwsIGh0bWxBdHRyaWJ1dGVzLCBlbmNvZGUpLFxuICAgIGxpbms6IGdldE1ldGhvZHNGb3JUYWcoVEFHX05BTUVTLkxJTkssIGxpbmtUYWdzLCBlbmNvZGUpLFxuICAgIG1ldGE6IGdldE1ldGhvZHNGb3JUYWcoVEFHX05BTUVTLk1FVEEsIG1ldGFUYWdzLCBlbmNvZGUpLFxuICAgIG5vc2NyaXB0OiBnZXRNZXRob2RzRm9yVGFnKFRBR19OQU1FUy5OT1NDUklQVCwgbm9zY3JpcHRUYWdzLCBlbmNvZGUpLFxuICAgIHNjcmlwdDogZ2V0TWV0aG9kc0ZvclRhZyhUQUdfTkFNRVMuU0NSSVBULCBzY3JpcHRUYWdzLCBlbmNvZGUpLFxuICAgIHN0eWxlOiBnZXRNZXRob2RzRm9yVGFnKFRBR19OQU1FUy5TVFlMRSwgc3R5bGVUYWdzLCBlbmNvZGUpLFxuICAgIHRpdGxlOiBnZXRNZXRob2RzRm9yVGFnKFRBR19OQU1FUy5USVRMRSwge1xuICAgICAgdGl0bGU6IHRpdGxlLFxuICAgICAgdGl0bGVBdHRyaWJ1dGVzOiB0aXRsZUF0dHJpYnV0ZXNcbiAgICB9LCBlbmNvZGUpXG4gIH07XG59O1xuXG52YXIgSGVsbWV0ID0gZnVuY3Rpb24gSGVsbWV0KENvbXBvbmVudCkge1xuICB2YXIgX2NsYXNzLCBfdGVtcDtcblxuICByZXR1cm4gX3RlbXAgPSBfY2xhc3MgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAgIGluaGVyaXRzKEhlbG1ldFdyYXBwZXIsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gICAgZnVuY3Rpb24gSGVsbWV0V3JhcHBlcigpIHtcbiAgICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEhlbG1ldFdyYXBwZXIpO1xuICAgICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgICB9XG5cbiAgICBIZWxtZXRXcmFwcGVyLnByb3RvdHlwZS5zaG91bGRDb21wb25lbnRVcGRhdGUgPSBmdW5jdGlvbiBzaG91bGRDb21wb25lbnRVcGRhdGUobmV4dFByb3BzKSB7XG4gICAgICByZXR1cm4gIWlzRXF1YWwodGhpcy5wcm9wcywgbmV4dFByb3BzKTtcbiAgICB9O1xuXG4gICAgSGVsbWV0V3JhcHBlci5wcm90b3R5cGUubWFwTmVzdGVkQ2hpbGRyZW5Ub1Byb3BzID0gZnVuY3Rpb24gbWFwTmVzdGVkQ2hpbGRyZW5Ub1Byb3BzKGNoaWxkLCBuZXN0ZWRDaGlsZHJlbikge1xuICAgICAgaWYgKCFuZXN0ZWRDaGlsZHJlbikge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChjaGlsZC50eXBlKSB7XG4gICAgICAgIGNhc2UgVEFHX05BTUVTLlNDUklQVDpcbiAgICAgICAgY2FzZSBUQUdfTkFNRVMuTk9TQ1JJUFQ6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlubmVySFRNTDogbmVzdGVkQ2hpbGRyZW5cbiAgICAgICAgICB9O1xuXG4gICAgICAgIGNhc2UgVEFHX05BTUVTLlNUWUxFOlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjc3NUZXh0OiBuZXN0ZWRDaGlsZHJlblxuICAgICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcIjxcIiArIGNoaWxkLnR5cGUgKyBcIiAvPiBlbGVtZW50cyBhcmUgc2VsZi1jbG9zaW5nIGFuZCBjYW4gbm90IGNvbnRhaW4gY2hpbGRyZW4uIFJlZmVyIHRvIG91ciBBUEkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXCIpO1xuICAgIH07XG5cbiAgICBIZWxtZXRXcmFwcGVyLnByb3RvdHlwZS5mbGF0dGVuQXJyYXlUeXBlQ2hpbGRyZW4gPSBmdW5jdGlvbiBmbGF0dGVuQXJyYXlUeXBlQ2hpbGRyZW4oX3JlZikge1xuICAgICAgdmFyIF9iYWJlbEhlbHBlcnMkZXh0ZW5kcztcblxuICAgICAgdmFyIGNoaWxkID0gX3JlZi5jaGlsZCxcbiAgICAgICAgICBhcnJheVR5cGVDaGlsZHJlbiA9IF9yZWYuYXJyYXlUeXBlQ2hpbGRyZW4sXG4gICAgICAgICAgbmV3Q2hpbGRQcm9wcyA9IF9yZWYubmV3Q2hpbGRQcm9wcyxcbiAgICAgICAgICBuZXN0ZWRDaGlsZHJlbiA9IF9yZWYubmVzdGVkQ2hpbGRyZW47XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIGFycmF5VHlwZUNoaWxkcmVuLCAoX2JhYmVsSGVscGVycyRleHRlbmRzID0ge30sIF9iYWJlbEhlbHBlcnMkZXh0ZW5kc1tjaGlsZC50eXBlXSA9IFtdLmNvbmNhdChhcnJheVR5cGVDaGlsZHJlbltjaGlsZC50eXBlXSB8fCBbXSwgW19leHRlbmRzKHt9LCBuZXdDaGlsZFByb3BzLCB0aGlzLm1hcE5lc3RlZENoaWxkcmVuVG9Qcm9wcyhjaGlsZCwgbmVzdGVkQ2hpbGRyZW4pKV0pLCBfYmFiZWxIZWxwZXJzJGV4dGVuZHMpKTtcbiAgICB9O1xuXG4gICAgSGVsbWV0V3JhcHBlci5wcm90b3R5cGUubWFwT2JqZWN0VHlwZUNoaWxkcmVuID0gZnVuY3Rpb24gbWFwT2JqZWN0VHlwZUNoaWxkcmVuKF9yZWYyKSB7XG4gICAgICB2YXIgX2JhYmVsSGVscGVycyRleHRlbmRzMiwgX2JhYmVsSGVscGVycyRleHRlbmRzMztcblxuICAgICAgdmFyIGNoaWxkID0gX3JlZjIuY2hpbGQsXG4gICAgICAgICAgbmV3UHJvcHMgPSBfcmVmMi5uZXdQcm9wcyxcbiAgICAgICAgICBuZXdDaGlsZFByb3BzID0gX3JlZjIubmV3Q2hpbGRQcm9wcyxcbiAgICAgICAgICBuZXN0ZWRDaGlsZHJlbiA9IF9yZWYyLm5lc3RlZENoaWxkcmVuO1xuXG4gICAgICBzd2l0Y2ggKGNoaWxkLnR5cGUpIHtcbiAgICAgICAgY2FzZSBUQUdfTkFNRVMuVElUTEU6XG4gICAgICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBuZXdQcm9wcywgKF9iYWJlbEhlbHBlcnMkZXh0ZW5kczIgPSB7fSwgX2JhYmVsSGVscGVycyRleHRlbmRzMltjaGlsZC50eXBlXSA9IG5lc3RlZENoaWxkcmVuLCBfYmFiZWxIZWxwZXJzJGV4dGVuZHMyLnRpdGxlQXR0cmlidXRlcyA9IF9leHRlbmRzKHt9LCBuZXdDaGlsZFByb3BzKSwgX2JhYmVsSGVscGVycyRleHRlbmRzMikpO1xuXG4gICAgICAgIGNhc2UgVEFHX05BTUVTLkJPRFk6XG4gICAgICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBuZXdQcm9wcywge1xuICAgICAgICAgICAgYm9keUF0dHJpYnV0ZXM6IF9leHRlbmRzKHt9LCBuZXdDaGlsZFByb3BzKVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGNhc2UgVEFHX05BTUVTLkhUTUw6XG4gICAgICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBuZXdQcm9wcywge1xuICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZXM6IF9leHRlbmRzKHt9LCBuZXdDaGlsZFByb3BzKVxuICAgICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIG5ld1Byb3BzLCAoX2JhYmVsSGVscGVycyRleHRlbmRzMyA9IHt9LCBfYmFiZWxIZWxwZXJzJGV4dGVuZHMzW2NoaWxkLnR5cGVdID0gX2V4dGVuZHMoe30sIG5ld0NoaWxkUHJvcHMpLCBfYmFiZWxIZWxwZXJzJGV4dGVuZHMzKSk7XG4gICAgfTtcblxuICAgIEhlbG1ldFdyYXBwZXIucHJvdG90eXBlLm1hcEFycmF5VHlwZUNoaWxkcmVuVG9Qcm9wcyA9IGZ1bmN0aW9uIG1hcEFycmF5VHlwZUNoaWxkcmVuVG9Qcm9wcyhhcnJheVR5cGVDaGlsZHJlbiwgbmV3UHJvcHMpIHtcbiAgICAgIHZhciBuZXdGbGF0dGVuZWRQcm9wcyA9IF9leHRlbmRzKHt9LCBuZXdQcm9wcyk7XG5cbiAgICAgIE9iamVjdC5rZXlzKGFycmF5VHlwZUNoaWxkcmVuKS5mb3JFYWNoKGZ1bmN0aW9uIChhcnJheUNoaWxkTmFtZSkge1xuICAgICAgICB2YXIgX2JhYmVsSGVscGVycyRleHRlbmRzNDtcblxuICAgICAgICBuZXdGbGF0dGVuZWRQcm9wcyA9IF9leHRlbmRzKHt9LCBuZXdGbGF0dGVuZWRQcm9wcywgKF9iYWJlbEhlbHBlcnMkZXh0ZW5kczQgPSB7fSwgX2JhYmVsSGVscGVycyRleHRlbmRzNFthcnJheUNoaWxkTmFtZV0gPSBhcnJheVR5cGVDaGlsZHJlblthcnJheUNoaWxkTmFtZV0sIF9iYWJlbEhlbHBlcnMkZXh0ZW5kczQpKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ld0ZsYXR0ZW5lZFByb3BzO1xuICAgIH07XG5cbiAgICBIZWxtZXRXcmFwcGVyLnByb3RvdHlwZS53YXJuT25JbnZhbGlkQ2hpbGRyZW4gPSBmdW5jdGlvbiB3YXJuT25JbnZhbGlkQ2hpbGRyZW4oY2hpbGQsIG5lc3RlZENoaWxkcmVuKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIGlmICghVkFMSURfVEFHX05BTUVTLnNvbWUoZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICByZXR1cm4gY2hpbGQudHlwZSA9PT0gbmFtZTtcbiAgICAgICAgfSkpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGNoaWxkLnR5cGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgcmV0dXJuIHdhcm4oXCJZb3UgbWF5IGJlIGF0dGVtcHRpbmcgdG8gbmVzdCA8SGVsbWV0PiBjb21wb25lbnRzIHdpdGhpbiBlYWNoIG90aGVyLCB3aGljaCBpcyBub3QgYWxsb3dlZC4gUmVmZXIgdG8gb3VyIEFQSSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHdhcm4oXCJPbmx5IGVsZW1lbnRzIHR5cGVzIFwiICsgVkFMSURfVEFHX05BTUVTLmpvaW4oXCIsIFwiKSArIFwiIGFyZSBhbGxvd2VkLiBIZWxtZXQgZG9lcyBub3Qgc3VwcG9ydCByZW5kZXJpbmcgPFwiICsgY2hpbGQudHlwZSArIFwiPiBlbGVtZW50cy4gUmVmZXIgdG8gb3VyIEFQSSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmVzdGVkQ2hpbGRyZW4gJiYgdHlwZW9mIG5lc3RlZENoaWxkcmVuICE9PSBcInN0cmluZ1wiICYmICghQXJyYXkuaXNBcnJheShuZXN0ZWRDaGlsZHJlbikgfHwgbmVzdGVkQ2hpbGRyZW4uc29tZShmdW5jdGlvbiAobmVzdGVkQ2hpbGQpIHtcbiAgICAgICAgICByZXR1cm4gdHlwZW9mIG5lc3RlZENoaWxkICE9PSBcInN0cmluZ1wiO1xuICAgICAgICB9KSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJIZWxtZXQgZXhwZWN0cyBhIHN0cmluZyBhcyBhIGNoaWxkIG9mIDxcIiArIGNoaWxkLnR5cGUgKyBcIj4uIERpZCB5b3UgZm9yZ2V0IHRvIHdyYXAgeW91ciBjaGlsZHJlbiBpbiBicmFjZXM/ICggPFwiICsgY2hpbGQudHlwZSArIFwiPntgYH08L1wiICsgY2hpbGQudHlwZSArIFwiPiApIFJlZmVyIHRvIG91ciBBUEkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXCIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICBIZWxtZXRXcmFwcGVyLnByb3RvdHlwZS5tYXBDaGlsZHJlblRvUHJvcHMgPSBmdW5jdGlvbiBtYXBDaGlsZHJlblRvUHJvcHMoY2hpbGRyZW4sIG5ld1Byb3BzKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIGFycmF5VHlwZUNoaWxkcmVuID0ge307XG4gICAgICBSZWFjdC5DaGlsZHJlbi5mb3JFYWNoKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgaWYgKCFjaGlsZCB8fCAhY2hpbGQucHJvcHMpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgX2NoaWxkJHByb3BzID0gY2hpbGQucHJvcHMsXG4gICAgICAgICAgICBuZXN0ZWRDaGlsZHJlbiA9IF9jaGlsZCRwcm9wcy5jaGlsZHJlbixcbiAgICAgICAgICAgIGNoaWxkUHJvcHMgPSBvYmplY3RXaXRob3V0UHJvcGVydGllcyhfY2hpbGQkcHJvcHMsIFtcImNoaWxkcmVuXCJdKTtcbiAgICAgICAgdmFyIG5ld0NoaWxkUHJvcHMgPSBjb252ZXJ0UmVhY3RQcm9wc3RvSHRtbEF0dHJpYnV0ZXMoY2hpbGRQcm9wcyk7XG5cbiAgICAgICAgX3RoaXMyLndhcm5PbkludmFsaWRDaGlsZHJlbihjaGlsZCwgbmVzdGVkQ2hpbGRyZW4pO1xuXG4gICAgICAgIHN3aXRjaCAoY2hpbGQudHlwZSkge1xuICAgICAgICAgIGNhc2UgVEFHX05BTUVTLkxJTks6XG4gICAgICAgICAgY2FzZSBUQUdfTkFNRVMuTUVUQTpcbiAgICAgICAgICBjYXNlIFRBR19OQU1FUy5OT1NDUklQVDpcbiAgICAgICAgICBjYXNlIFRBR19OQU1FUy5TQ1JJUFQ6XG4gICAgICAgICAgY2FzZSBUQUdfTkFNRVMuU1RZTEU6XG4gICAgICAgICAgICBhcnJheVR5cGVDaGlsZHJlbiA9IF90aGlzMi5mbGF0dGVuQXJyYXlUeXBlQ2hpbGRyZW4oe1xuICAgICAgICAgICAgICBjaGlsZDogY2hpbGQsXG4gICAgICAgICAgICAgIGFycmF5VHlwZUNoaWxkcmVuOiBhcnJheVR5cGVDaGlsZHJlbixcbiAgICAgICAgICAgICAgbmV3Q2hpbGRQcm9wczogbmV3Q2hpbGRQcm9wcyxcbiAgICAgICAgICAgICAgbmVzdGVkQ2hpbGRyZW46IG5lc3RlZENoaWxkcmVuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIG5ld1Byb3BzID0gX3RoaXMyLm1hcE9iamVjdFR5cGVDaGlsZHJlbih7XG4gICAgICAgICAgICAgIGNoaWxkOiBjaGlsZCxcbiAgICAgICAgICAgICAgbmV3UHJvcHM6IG5ld1Byb3BzLFxuICAgICAgICAgICAgICBuZXdDaGlsZFByb3BzOiBuZXdDaGlsZFByb3BzLFxuICAgICAgICAgICAgICBuZXN0ZWRDaGlsZHJlbjogbmVzdGVkQ2hpbGRyZW5cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgbmV3UHJvcHMgPSB0aGlzLm1hcEFycmF5VHlwZUNoaWxkcmVuVG9Qcm9wcyhhcnJheVR5cGVDaGlsZHJlbiwgbmV3UHJvcHMpO1xuICAgICAgcmV0dXJuIG5ld1Byb3BzO1xuICAgIH07XG5cbiAgICBIZWxtZXRXcmFwcGVyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbixcbiAgICAgICAgICBwcm9wcyA9IG9iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9wcm9wcywgW1wiY2hpbGRyZW5cIl0pO1xuXG4gICAgICB2YXIgbmV3UHJvcHMgPSBfZXh0ZW5kcyh7fSwgcHJvcHMpO1xuXG4gICAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgICAgbmV3UHJvcHMgPSB0aGlzLm1hcENoaWxkcmVuVG9Qcm9wcyhjaGlsZHJlbiwgbmV3UHJvcHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChDb21wb25lbnQsIG5ld1Byb3BzKTtcbiAgICB9O1xuXG4gICAgY3JlYXRlQ2xhc3MoSGVsbWV0V3JhcHBlciwgbnVsbCwgW3tcbiAgICAgIGtleTogXCJjYW5Vc2VET01cIixcbiAgICAgIC8vIENvbXBvbmVudC5wZWVrIGNvbWVzIGZyb20gcmVhY3Qtc2lkZS1lZmZlY3Q6XG4gICAgICAvLyBGb3IgdGVzdGluZywgeW91IG1heSB1c2UgYSBzdGF0aWMgcGVlaygpIG1ldGhvZCBhdmFpbGFibGUgb24gdGhlIHJldHVybmVkIGNvbXBvbmVudC5cbiAgICAgIC8vIEl0IGxldHMgeW91IGdldCB0aGUgY3VycmVudCBzdGF0ZSB3aXRob3V0IHJlc2V0dGluZyB0aGUgbW91bnRlZCBpbnN0YW5jZSBzdGFjay5cbiAgICAgIC8vIERvbuKAmXQgdXNlIGl0IGZvciBhbnl0aGluZyBvdGhlciB0aGFuIHRlc3RpbmcuXG5cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHtPYmplY3R9IGJhc2U6IHtcInRhcmdldFwiOiBcIl9ibGFua1wiLCBcImhyZWZcIjogXCJodHRwOi8vbXlzaXRlLmNvbS9cIn1cbiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBib2R5QXR0cmlidXRlczoge1wiY2xhc3NOYW1lXCI6IFwicm9vdFwifVxuICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGRlZmF1bHRUaXRsZTogXCJEZWZhdWx0IFRpdGxlXCJcbiAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZGVmZXI6IHRydWVcbiAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5jb2RlU3BlY2lhbENoYXJhY3RlcnM6IHRydWVcbiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBodG1sQXR0cmlidXRlczoge1wibGFuZ1wiOiBcImVuXCIsIFwiYW1wXCI6IHVuZGVmaW5lZH1cbiAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGxpbms6IFt7XCJyZWxcIjogXCJjYW5vbmljYWxcIiwgXCJocmVmXCI6IFwiaHR0cDovL215c2l0ZS5jb20vZXhhbXBsZVwifV1cbiAgICAgICAqIEBwYXJhbSB7QXJyYXl9IG1ldGE6IFt7XCJuYW1lXCI6IFwiZGVzY3JpcHRpb25cIiwgXCJjb250ZW50XCI6IFwiVGVzdCBkZXNjcmlwdGlvblwifV1cbiAgICAgICAqIEBwYXJhbSB7QXJyYXl9IG5vc2NyaXB0OiBbe1wiaW5uZXJIVE1MXCI6IFwiPGltZyBzcmM9J2h0dHA6Ly9teXNpdGUuY29tL2pzL3Rlc3QuanMnXCJ9XVxuICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25DaGFuZ2VDbGllbnRTdGF0ZTogXCIobmV3U3RhdGUpID0+IGNvbnNvbGUubG9nKG5ld1N0YXRlKVwiXG4gICAgICAgKiBAcGFyYW0ge0FycmF5fSBzY3JpcHQ6IFt7XCJ0eXBlXCI6IFwidGV4dC9qYXZhc2NyaXB0XCIsIFwic3JjXCI6IFwiaHR0cDovL215c2l0ZS5jb20vanMvdGVzdC5qc1wifV1cbiAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHN0eWxlOiBbe1widHlwZVwiOiBcInRleHQvY3NzXCIsIFwiY3NzVGV4dFwiOiBcImRpdiB7IGRpc3BsYXk6IGJsb2NrOyBjb2xvcjogYmx1ZTsgfVwifV1cbiAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0aXRsZTogXCJUaXRsZVwiXG4gICAgICAgKiBAcGFyYW0ge09iamVjdH0gdGl0bGVBdHRyaWJ1dGVzOiB7XCJpdGVtcHJvcFwiOiBcIm5hbWVcIn1cbiAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0aXRsZVRlbXBsYXRlOiBcIk15U2l0ZS5jb20gLSAlc1wiXG4gICAgICAgKi9cbiAgICAgIHNldDogZnVuY3Rpb24gc2V0JCQxKGNhblVzZURPTSkge1xuICAgICAgICBDb21wb25lbnQuY2FuVXNlRE9NID0gY2FuVXNlRE9NO1xuICAgICAgfVxuICAgIH1dKTtcbiAgICByZXR1cm4gSGVsbWV0V3JhcHBlcjtcbiAgfShSZWFjdC5Db21wb25lbnQpLCBfY2xhc3MucHJvcFR5cGVzID0ge1xuICAgIGJhc2U6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgYm9keUF0dHJpYnV0ZXM6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgY2hpbGRyZW46IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5ub2RlKSwgUHJvcFR5cGVzLm5vZGVdKSxcbiAgICBkZWZhdWx0VGl0bGU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgZGVmZXI6IFByb3BUeXBlcy5ib29sLFxuICAgIGVuY29kZVNwZWNpYWxDaGFyYWN0ZXJzOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBodG1sQXR0cmlidXRlczogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBsaW5rOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMub2JqZWN0KSxcbiAgICBtZXRhOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMub2JqZWN0KSxcbiAgICBub3NjcmlwdDogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm9iamVjdCksXG4gICAgb25DaGFuZ2VDbGllbnRTdGF0ZTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgc2NyaXB0OiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMub2JqZWN0KSxcbiAgICBzdHlsZTogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm9iamVjdCksXG4gICAgdGl0bGU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgdGl0bGVBdHRyaWJ1dGVzOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIHRpdGxlVGVtcGxhdGU6IFByb3BUeXBlcy5zdHJpbmdcbiAgfSwgX2NsYXNzLmRlZmF1bHRQcm9wcyA9IHtcbiAgICBkZWZlcjogdHJ1ZSxcbiAgICBlbmNvZGVTcGVjaWFsQ2hhcmFjdGVyczogdHJ1ZVxuICB9LCBfY2xhc3MucGVlayA9IENvbXBvbmVudC5wZWVrLCBfY2xhc3MucmV3aW5kID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBtYXBwZWRTdGF0ZSA9IENvbXBvbmVudC5yZXdpbmQoKTtcblxuICAgIGlmICghbWFwcGVkU3RhdGUpIHtcbiAgICAgIC8vIHByb3ZpZGUgZmFsbGJhY2sgaWYgbWFwcGVkU3RhdGUgaXMgdW5kZWZpbmVkXG4gICAgICBtYXBwZWRTdGF0ZSA9IG1hcFN0YXRlT25TZXJ2ZXIoe1xuICAgICAgICBiYXNlVGFnOiBbXSxcbiAgICAgICAgYm9keUF0dHJpYnV0ZXM6IHt9LFxuICAgICAgICBlbmNvZGVTcGVjaWFsQ2hhcmFjdGVyczogdHJ1ZSxcbiAgICAgICAgaHRtbEF0dHJpYnV0ZXM6IHt9LFxuICAgICAgICBsaW5rVGFnczogW10sXG4gICAgICAgIG1ldGFUYWdzOiBbXSxcbiAgICAgICAgbm9zY3JpcHRUYWdzOiBbXSxcbiAgICAgICAgc2NyaXB0VGFnczogW10sXG4gICAgICAgIHN0eWxlVGFnczogW10sXG4gICAgICAgIHRpdGxlOiBcIlwiLFxuICAgICAgICB0aXRsZUF0dHJpYnV0ZXM6IHt9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWFwcGVkU3RhdGU7XG4gIH0sIF90ZW1wO1xufTtcblxudmFyIE51bGxDb21wb25lbnQgPSBmdW5jdGlvbiBOdWxsQ29tcG9uZW50KCkge1xuICByZXR1cm4gbnVsbDtcbn07XG5cbnZhciBIZWxtZXRTaWRlRWZmZWN0cyA9IHdpdGhTaWRlRWZmZWN0KHJlZHVjZVByb3BzVG9TdGF0ZSwgaGFuZGxlQ2xpZW50U3RhdGVDaGFuZ2UsIG1hcFN0YXRlT25TZXJ2ZXIpKE51bGxDb21wb25lbnQpO1xudmFyIEhlbG1ldEV4cG9ydCA9IEhlbG1ldChIZWxtZXRTaWRlRWZmZWN0cyk7XG5IZWxtZXRFeHBvcnQucmVuZGVyU3RhdGljID0gSGVsbWV0RXhwb3J0LnJld2luZDtcbmV4cG9ydCBkZWZhdWx0IEhlbG1ldEV4cG9ydDtcbmV4cG9ydCB7IEhlbG1ldEV4cG9ydCBhcyBIZWxtZXQgfTsiLCJpbXBvcnQgUmVhY3QsIHt1c2VTdGF0ZX0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtMaW5rLCB1c2VJbnRsfSBmcm9tICdnYXRzYnktcGx1Z2luLWludGwnO1xuaW1wb3J0IHtcbiAgSGVhZGVyLFxuICBOYXZNZW51QnV0dG9uLFxuICBQcmltYXJ5TmF2LFxuICBTaXRlQWxlcnQsXG4gIFRpdGxlLFxufSBmcm9tICdAdHJ1c3N3b3Jrcy9yZWFjdC11c3dkcyc7XG5pbXBvcnQge0hlbG1ldH0gZnJvbSAncmVhY3QtaGVsbWV0JztcbmltcG9ydCB7dXNlRmxhZ3N9IGZyb20gJy4uL2NvbnRleHRzL0ZsYWdDb250ZXh0JztcblxuY29uc3QgSjQwSGVhZGVyID0gKCkgPT4ge1xuICBjb25zdCBmbGFncyA9IHVzZUZsYWdzKCk7XG4gIGNvbnN0IGludGwgPSB1c2VJbnRsKCk7XG4gIGNvbnN0IHRpdGxlID0gaW50bC5mb3JtYXRNZXNzYWdlKHtcbiAgICBpZDogJzcxTDBwcCcsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdKdXN0aWNlNDAnLFxuICAgIGRlc2NyaXB0aW9uOiAnVGl0bGUgb2YgdGhlIHByb2plY3QnLFxuICB9KTtcblxuICBjb25zdCBbbW9iaWxlTmF2T3Blbiwgc2V0TW9iaWxlTmF2T3Blbl0gPSB1c2VTdGF0ZShmYWxzZSk7XG5cbiAgY29uc3QgdG9nZ2xlTW9iaWxlTmF2ID0gKCk6IHZvaWQgPT5cbiAgICBzZXRNb2JpbGVOYXZPcGVuKChwcmV2T3BlbikgPT4gIXByZXZPcGVuKTtcblxuICBjb25zdCBoZWFkZXJMaW5rcyA9IChmbGFnczogc3RyaW5nW10gfCB1bmRlZmluZWQpID0+IHtcbiAgICAvLyBzdGF0aWMgbWFwIG9mIGFsbCBwb3NzaWJsZSBtZW51IGl0ZW1zLiBPcmlnaW5hbGx5LCBpdCB3YXMgYWxsIHN0cmluZ3MsXG4gICAgLy8gYnV0IHdlIG5lZWQgdG8gaGFuZGxlIGJvdGggb25zaXRlIGFuZCBvZmZzaXRlIGxpbmtzLlxuICAgIGNvbnN0IG1lbnVEYXRhID0gbmV3IE1hcDxzdHJpbmcsIEpTWC5FbGVtZW50PihbXG4gICAgICBbJ2Fib3V0JyxcbiAgICAgICAgPExpbmtcbiAgICAgICAgICBrZXk9eydhYm91dCd9IGNsYXNzTmFtZT17J2o0MC1oZWFkZXInfVxuICAgICAgICAgIHRvPXsnLyd9PkFib3V0PC9MaW5rPl0sXG4gICAgICBbJ3RpbWVsaW5lJyxcbiAgICAgICAgPExpbmtcbiAgICAgICAgICB0bz17Jy90aW1lbGluZSd9XG4gICAgICAgICAga2V5PXsndGltbGluZSd9XG4gICAgICAgICAgY2xhc3NOYW1lPXsnajQwLWhlYWRlcid9PlRpbWVsaW5lPC9MaW5rPl0sXG4gICAgICBbJ2NlanN0JyxcbiAgICAgICAgPExpbmtcbiAgICAgICAgICB0bz17Jy9jZWpzdCd9XG4gICAgICAgICAga2V5PXsnY2Vqc3QnfVxuICAgICAgICAgIGNsYXNzTmFtZT17J2o0MC1oZWFkZXInfT5DRUpTVDwvTGluaz5dLFxuICAgIF0pO1xuXG4gICAgLy8gc2VsZWN0IHdoaWNoIGl0ZW1zIGZyb20gdGhlIGFib3ZlIG1hcCB0byBzaG93LCByaWdodCBub3cgaXQncyBvbmx5IHR3b1xuICAgIC8vIHBvc3NpYmlsaXRpZXMgc28gaXQncyBzaW1wbGUuIE5vdGU6IHN0cmluZ3MgYXJlIHVzZWQgYXMgcmVhY3Qga2V5c1xuICAgIGNvbnN0IG1lbnUgPVxuICAgICAgZmxhZ3M/LmluY2x1ZGVzKCd0aW1lbGluZScpID9cbiAgICAgICAgWydhYm91dCcsICd0aW1lbGluZScsICdjZWpzdCddIDpcbiAgICAgICAgWydhYm91dCcsICd0aW1lbGluZScsICdjZWpzdCddOyAvLyBbJ2Fib3V0JywgJ2NlanN0J107XG4gICAgLy8gVE9ETzogbWFrZSBmZWF0dXJlIGZsYWdzIGZsYWdzIHdvcmsuXG4gICAgcmV0dXJuIG1lbnUubWFwKChrZXkpID0+IG1lbnVEYXRhLmdldChrZXkpKTtcbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8SGVsbWV0IGh0bWxBdHRyaWJ1dGVzPXt7bGFuZzogaW50bC5sb2NhbGV9fT5cbiAgICAgICAgPG1ldGEgY2hhclNldD1cInV0Zi04XCIvPlxuICAgICAgICA8dGl0bGU+e3RpdGxlfTwvdGl0bGU+XG4gICAgICA8L0hlbG1ldD5cbiAgICAgIHsvKiA8R292QmFubmVyLz4gKi99XG4gICAgICA8U2l0ZUFsZXJ0XG4gICAgICAgIHZhcmlhbnQ9XCJpbmZvXCJcbiAgICAgICAgY2xhc3NOYW1lPXsnajQwLXNpdGVhbGVydCd9PlxuICAgICAgICA8Yj5XZWxjb21lIHRvIEp1c3RpY2U0MCZhcG9zO3MgVGVtcG9yYXJ5IEhvbWU8L2I+IFdoaWxlIEp1c3RpY2U0MCBnZXRzXG4gICAgICAgIHVwIGFuZCBydW5uaW5nLCB3ZSBhcmUgdXNpbmcgR2l0SHViIFBhZ2VzIGFzIGEgdGVtcG9yYXJ5IHdlYnNpdGVcbiAgICAgICAgaG9zdC4gVG8gbGVhcm4gbW9yZSBhYm91dCBHaXRIdWIgUGFnZXMsIGNsaWNrXG4gICAgICAgIDxhIGhyZWY9XCJodHRwczovL3BhZ2VzLmdpdGh1Yi5jb20vXCI+aGVyZTwvYT4uXG4gICAgICA8L1NpdGVBbGVydD5cbiAgICAgIDxIZWFkZXJcbiAgICAgICAgYmFzaWM9e3RydWV9IHJvbGU9eydiYW5uZXInfVxuICAgICAgICBjbGFzc05hbWU9eyd1c2EtaGVhZGVyIGo0MC1oZWFkZXInfT5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ1c2EtbmF2LWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidXNhLW5hdmJhclwiPlxuICAgICAgICAgICAgPFRpdGxlPnt0aXRsZX08L1RpdGxlPlxuICAgICAgICAgICAgPE5hdk1lbnVCdXR0b25cbiAgICAgICAgICAgICAga2V5PXsnbW9iaWxlTWVudUJ1dHRvbid9XG4gICAgICAgICAgICAgIG9uQ2xpY2s9e3RvZ2dsZU1vYmlsZU5hdn1cbiAgICAgICAgICAgICAgbGFiZWw9XCJNZW51XCIvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxQcmltYXJ5TmF2XG4gICAgICAgICAgICBpdGVtcz17aGVhZGVyTGlua3MoZmxhZ3MpfVxuICAgICAgICAgICAgbW9iaWxlRXhwYW5kZWQ9e21vYmlsZU5hdk9wZW59XG4gICAgICAgICAgICBvblRvZ2dsZU1vYmlsZU5hdj17dG9nZ2xlTW9iaWxlTmF2fVxuICAgICAgICAgICAgY2xhc3NOYW1lPXsnajQwLWhlYWRlcid9XG4gICAgICAgICAgPlxuICAgICAgICAgIDwvUHJpbWFyeU5hdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L0hlYWRlcj5cbiAgICA8Lz5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEo0MEhlYWRlcjtcbiIsImV4cG9ydCBkZWZhdWx0IF9fd2VicGFja19wdWJsaWNfcGF0aF9fICsgXCJzdGF0aWMvZW9wLXNlYWwtMTJlNWRjYzQ0NTNjYjMzMjE1MTVmNTA4NzRkMWYxZjYuc3ZnXCI7IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7Rm9vdGVyLCBMb2dvLCBGb290ZXJOYXYsIEFkZHJlc3N9IGZyb20gJ0B0cnVzc3dvcmtzL3JlYWN0LXVzd2RzJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB3aGl0ZWhvdXNlSWNvbiBmcm9tICcuLi9pbWFnZXMvZW9wLXNlYWwuc3ZnJztcblxuY29uc3QgSjQwRm9vdGVyID0gKCkgPT4ge1xuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8Rm9vdGVyXG4gICAgICAgIHNpemU9XCJiaWdcIlxuICAgICAgICBjbGFzc05hbWU9eydqNDAtZm9vdGVyJ31cbiAgICAgICAgcHJpbWFyeT17PD48Lz59XG4gICAgICAgIHNlY29uZGFyeT17PEZvb3Rlck5hdlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJGb290ZXIgbmF2aWdhdGlvblwiXG4gICAgICAgICAgc2l6ZT1cImJpZ1wiIC8vIGZ5aSB5b3UgbGVhdmUgdGhpcyBvZmYgYW5kIGl0IHNpbGVudGx5IGZhaWxzLi4uXG4gICAgICAgICAgbGlua3M9e1tcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgJ0FnZW5jeSBQYXJ0bmVycycsXG4gICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgaHJlZj17J2h0dHBzOi8vd3d3LmVwYS5nb3YvJ31cbiAgICAgICAgICAgICAgICB0YXJnZXQ9eydfYmxhbmsnfVxuICAgICAgICAgICAgICAgIHJlbD17J25vcmVmZXJyZXInfVxuICAgICAgICAgICAgICAgIGtleT17J2VwYWxpbmsnfT5FbnZpcm9ubWVudGFsIFByb3RlY3Rpb24gQWdlbmN5PC9hPixcbiAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICBocmVmPXsnaHR0cHM6Ly93d3cud2hpdGVob3VzZS5nb3Yvb21iJ31cbiAgICAgICAgICAgICAgICB0YXJnZXQ9eydfYmxhbmsnfVxuICAgICAgICAgICAgICAgIHJlbD17J25vcmVmZXJyZXInfVxuICAgICAgICAgICAgICAgIGtleT17J3doaXRlaG91c2VsaW5rJ30+T2ZmaWNlIG9mIE1hbmFnZW1lbnRcbiAgICAgICAgICAgICAgICBhbmQgQnVkZ2V0PC9hPixcbiAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICBocmVmPXsnaHR0cHM6Ly93d3cuZW5lcmd5Lmdvdi8nfVxuICAgICAgICAgICAgICAgIHRhcmdldD17J19ibGFuayd9XG4gICAgICAgICAgICAgICAgcmVsPXsnbm9yZWZlcnJlcid9XG4gICAgICAgICAgICAgICAga2V5PXsnZW5lcmd5bGluayd9PkRlcGFydG1lbnQgb2YgRW5lcmd5PC9hPixcbiAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICBocmVmPXsnaHR0cHM6Ly93d3cuaHVkLmdvdi8nfVxuICAgICAgICAgICAgICAgIHRhcmdldD17J19ibGFuayd9XG4gICAgICAgICAgICAgICAgcmVsPXsnbm9yZWZlcnJlcid9XG4gICAgICAgICAgICAgICAga2V5PXsnaHVkbGluayd9PkRlcGFydG1lbnQgb2YgSG91c2luZyBhbmQgVXJiYW5cbiAgICAgICAgICAgICAgICBEZXZlbG9wbWVudDwvYT4sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAnTW9yZSBJbmZvcm1hdGlvbicsXG4gICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgaHJlZj17J2h0dHBzOi8vd3d3LndoaXRlaG91c2UuZ292Lyd9XG4gICAgICAgICAgICAgICAgdGFyZ2V0PXsnX2JsYW5rJ31cbiAgICAgICAgICAgICAgICByZWw9eydub3JlZmVycmVyJ31cbiAgICAgICAgICAgICAgICBrZXk9eyd3aGl0ZWhvdXNlbGluazInfT5XaGl0ZWhvdXNlLmdvdjwvYT4sXG4gICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIga2V5PXsnYWNjZXNzaWJpbGl0eWxpbmsnfT5BY2Nlc3NpYmlsaXR5IFN0YXRlbWVudDwvYT4sXG4gICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIga2V5PXsncHJpdmFjeWxpbmsnfT5Qcml2YWN5LCBQb2xpY2llcywgYW5kIExlZ2FsXG4gICAgICAgICAgICAgICAgSW5mb3JtYXRpb248L2E+LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgJ0hhdmUgYSBxdWVzdGlvbiBhYm91dCBnb3Zlcm5tZW50IHNlcnZpY2VzPycsXG4gICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIga2V5PXsncHJpdmFjeWxpbmsnfT5GaW5kIGEgY29udGFjdCBhdCBVU0EuZ292PC9hPixcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgPExvZ29cbiAgICAgICAgICAgICAgICAgIHNpemU9XCJzbGltXCJcbiAgICAgICAgICAgICAgICAgIGtleT17J2xvZ29pbWcnfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXsnajQwLWZvb3Rlci1sb2dvJ31cbiAgICAgICAgICAgICAgICAgIGltYWdlPXtcbiAgICAgICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17J3VzYS1mb290ZXJfX2xvZ28taW1nJ31cbiAgICAgICAgICAgICAgICAgICAgICBzcmM9e3doaXRlaG91c2VJY29ufVxuICAgICAgICAgICAgICAgICAgICAgIGFsdD17J1doaXRlaG91c2UgbG9nbyd9Lz5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGhlYWRpbmc9ezxwXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17J2o0MC1mb290ZXItbG9nby1oZWFkaW5nJ30+XG4gICAgICAgICAgICAgICAgICAgIENvdW5jaWwgb24gRW52aXJvbm1lbnRhbCBRdWFsaXR5PC9wPn1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8Lz4sXG4gICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgPEFkZHJlc3NcbiAgICAgICAgICAgICAgICAgIGtleT17J2Zvb3RlcmFkZHJlc3MnfVxuICAgICAgICAgICAgICAgICAgaXRlbXM9e1tcbiAgICAgICAgICAgICAgICAgICAgJzczMCBKYWNrc29uIFBsIE5XJyxcbiAgICAgICAgICAgICAgICAgICAgJ1dhc2hpbmd0b24sIEQuQy4gMjA1MDYnLFxuICAgICAgICAgICAgICAgICAgICAnKDIwMikgMzk1LTU3NTAnLFxuICAgICAgICAgICAgICAgICAgXX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8Lz4sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIF19XG4gICAgICAgIC8+fVxuICAgICAgLz5cbiAgICA8Lz5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEo0MEZvb3RlcjtcbiIsImV4cG9ydCBkZWZhdWx0IFwiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUdobGFXZG9kRDBpTWpRaUlIWnBaWGRDYjNnOUlqQWdNQ0F5TkNBeU5DSWdkMmxrZEdnOUlqSTBJajQ4Y0dGMGFDQmtQU0pOTUNBd2FESTBkakkwU0RCNklpQm1hV3hzUFNKdWIyNWxJaTgrUEhCaGRHZ2daRDBpVFRJd0lESklOR010TVM0eElEQXRNUzQ1T1M0NUxURXVPVGtnTWt3eUlESXliRFF0TkdneE5HTXhMakVnTUNBeUxTNDVJREl0TWxZMFl6QXRNUzR4TFM0NUxUSXRNaTB5ZWswMklEbG9NVEoyTWtnMlZqbDZiVGdnTlVnMmRpMHlhRGgyTW5wdE5DMDJTRFpXTm1neE1uWXllaUl2UGp3dmMzWm5QZz09XCIiLCJleHBvcnQgZGVmYXVsdCBcImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlIWnBaWGRDYjNnOUlqQWdNQ0F5TkNBeU5DSStQR1JsWm5NK1BITjBlV3hsUGk1amJITXRNWHRtYVd4c0xYSjFiR1U2WlhabGJtOWtaRHQ5UEM5emRIbHNaVDQ4TDJSbFpuTStQSEJoZEdnZ2FXUTlJa2RwZEdoMVlpSWdZMnhoYzNNOUltTnNjeTB4SWlCa1BTSk5NVElzTWtFeE1Dd3hNQ3d3TERBc01DdzRMamcwTERJeExqUTVZeTQxTGpBNUxqWTRMUzR5TWk0Mk9DMHVORGh6TUMwdU9EY3NNQzB4TGpkRE5pNDNNeXd4T1M0NU1TdzJMakUwTERFNExEWXVNVFFzTVRoQk1pNDJPU3d5TGpZNUxEQXNNQ3d3TERVc01UWXVOV010TGpreExTNDJNaTR3TnkwdU5qRXVNRGN0TGpZeFlUSXVNVE1zTWk0eE15d3dMREFzTVN3eExqVXpMREVzTWk0eE5Dd3lMakUwTERBc01Dd3dMREl1T1RFdU9ETXNNaTR4Tml3eUxqRTJMREFzTUN3eExDNDJNeTB4TGpNMFF6Z3NNVFl1TVRjc05TNDJNaXd4TlM0ek1TdzFMall5TERFeExqUTRZVE11T0Rrc015NDRPU3d3TERBc01Td3hMVEl1Tmprc015NDFOeXd6TGpVM0xEQXNNQ3d4TEM0eExUSXVOalJ6TGpnMExTNHlOeXd5TGpjMUxERmhPUzQyTXl3NUxqWXpMREFzTUN3eExEVXNNR014TGpreExURXVNamtzTWk0M05TMHhMREl1TnpVdE1XRXpMalUzTERNdU5UY3NNQ3d3TERFc0xqRXNNaTQyTkN3ekxqZzVMRE11T0Rrc01Dd3dMREVzTVN3eUxqWTVZekFzTXk0NE5DMHlMak0wTERRdU5qZ3ROQzQxTnl3MExqa3pZVEl1TXprc01pNHpPU3d3TERBc01Td3VOamdzTVM0NE5XTXdMREV1TXpRc01Dd3lMalF5TERBc01pNDNOWE11TVRndU5UZ3VOamt1TkRoQk1UQXNNVEFzTUN3d0xEQXNNVElzTWxvaUx6NDhMM04yWno0PVwiIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgY2hhdEljb24gZnJvbSAnL25vZGVfbW9kdWxlcy91c3dkcy9kaXN0L2ltZy91c2EtaWNvbnMvY2hhdC5zdmcnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IGdpdGh1Ykljb24gZnJvbSAnL25vZGVfbW9kdWxlcy91c3dkcy9kaXN0L2ltZy91c2EtaWNvbnMvZ2l0aHViLnN2Zyc7XG5cbmNvbnN0IEo0MEFzaWRlID0gKCkgPT4ge1xuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8YXNpZGVcbiAgICAgICAgYXJpYS1sYWJlbGxlZGJ5PVwicmlnaHQtc2lkZWJhclwiXG4gICAgICAgIGNsYXNzTmFtZT17J2o0MC1hc2lkZSBkZXNrdG9wOmdyaWQtY29sLTMgdXNhLXByb3NlIHVzYS1zZWN0aW9uJ31cbiAgICAgICAgaWQ9XCJyaWdodC1zaWRlYmFyXCI+XG4gICAgICAgIDxoMj5HZXQgSW52b2x2ZWQ8L2gyPlxuICAgICAgICA8aDM+PGltZ1xuICAgICAgICAgIGNsYXNzTmFtZT17J2ZsZXgtYWxpZ24tc2VsZi1jZW50ZXIgd2lkdGgtNCBqNDAtYXNpZGUtaWNvbid9XG4gICAgICAgICAgc3JjPXtjaGF0SWNvbn0gYWx0PXsnY2hhdCBpY29uJ30vPlxuICAgICAgICBTZW5kIEZlZWRiYWNrPC9oMz5cbiAgICAgICAgPHAgY2xhc3NOYW1lPXsndXNhLXByb3NlIHNpdGUtcHJvc2UnfT5IYXZlIGlkZWFzIGFib3V0IGhvdyB0b1xuICAgICAgICBhY2tub3dsZWRnZSB0aGUgb24tdGhlLWdyb3VuZCBleHBlcmllbmNlcyBvZiB5b3VyIGNvbW11bml0eT9cbiAgICAgICAgPC9wPlxuICAgICAgRW1haWw6IDxhIGhyZWY9XCJtYWlsdG86IGp1c3RpY2U0MG9wZW5AdXNkcy5nb3ZcIj5cbiAgICAgIGp1c3RpY2U0MG9wZW5AdXNkcy5nb3Y8L2E+XG4gICAgICAgIDxwPiZuYnNwOzwvcD5cbiAgICAgICAgPGgzPlxuICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgIGNsYXNzTmFtZT17J2ZsZXgtYWxpZ24tc2VsZi1jZW50ZXIgd2lkdGgtNCBqNDAtYXNpZGUtaWNvbid9XG4gICAgICAgICAgICBzcmM9e2dpdGh1Ykljb259IGFsdD17J2dpdGh1YiBpY29uJ30vPlxuICAgICAgICBKb2luIHRoZSBvcGVuIHNvdXJjZSBjb21tdW5pdHk8L2gzPlxuICAgICAgICA8cD5cbiAgICAgICAgSnVzdGljZTQw4oCZcyBjb2RlIGlzIG9wZW4gc291cmNlLCB3aGljaCBtZWFucyBpdCBpcyBhdmFpbGFibGUgZm9yXG4gICAgICAgIHRoZSBwdWJsaWMgdG8gdmlldyBhbmQgY29udHJpYnV0ZS4gQW55b25lIGNhbiB2aWV3IGFuZFxuICAgICAgICBjb250cmlidXRlIG9uIEdpdEh1Yi5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cD5cbiAgICAgICAgICA8YVxuICAgICAgICAgICAgaHJlZj17J2h0dHBzOi8vZ2l0aHViLmNvbS91c2RzL2p1c3RpY2U0MC10b29sLycgK1xuICAgICAgICAgICdjcmlzaXMtYXQtaG9tZS1hbmQtYWJyb2FkLyd9XG4gICAgICAgICAgICB0YXJnZXQ9eydfYmxhbmsnfVxuICAgICAgICAgICAgcmVsPXsnbm9yZWZlcnJlcid9XG4gICAgICAgICAgICBrZXk9eydnaXRodWIzJ30+Q2hlY2sgaXQgb3V0IG9uIEdpdEh1YjwvYT5cbiAgICAgICAgPC9wPlxuICAgICAgPC9hc2lkZT5cbiAgICA8Lz5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEo0MEFzaWRlO1xuIiwiaW1wb3J0IFJlYWN0LCB7UmVhY3ROb2RlfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge0dyaWRDb250YWluZXIsIEdyaWR9IGZyb20gJ0B0cnVzc3dvcmtzL3JlYWN0LXVzd2RzJztcbmltcG9ydCBKNDBIZWFkZXIgZnJvbSAnLi9KNDBIZWFkZXInO1xuaW1wb3J0IEo0MEZvb3RlciBmcm9tICcuL0o0MEZvb3Rlcic7XG5pbXBvcnQgSjQwQXNpZGUgZnJvbSAnLi4vY29tcG9uZW50cy9KNDBBc2lkZSc7XG5pbXBvcnQge1VSTEZsYWdQcm92aWRlcn0gZnJvbSAnLi4vY29udGV4dHMvRmxhZ0NvbnRleHQnO1xuXG5pbnRlcmZhY2UgSUxheW91dFByb3BzIHtcbiAgY2hpbGRyZW46IFJlYWN0Tm9kZSxcbiAgbG9jYXRpb246IExvY2F0aW9uXG59XG5cbmNvbnN0IExheW91dCA9ICh7Y2hpbGRyZW4sIGxvY2F0aW9ufTogSUxheW91dFByb3BzKSA9PiB7XG4gIGNvbnN0IGlzV2lkdGhGdWxsUGFnZSA9IGxvY2F0aW9uLnBhdGhuYW1lLm1hdGNoKC9jZWpzdFxcLz8vKTtcbiAgY29uc3QgY29uZGl0aW9uYWxBc2lkZSA9IGlzV2lkdGhGdWxsUGFnZSA/IDw+PC8+IDogPEo0MEFzaWRlLz47XG4gIGNvbnN0IGdyaWRDc3NDbGFzcyA9IGlzV2lkdGhGdWxsUGFnZSA/ICcgZGVza3RvcDpncmlkLWNvbC0xMicgOlxuICAgICdkZXNrdG9wOmdyaWQtY29sLTknO1xuXG4gIHJldHVybiAoXG4gICAgPFVSTEZsYWdQcm92aWRlciBsb2NhdGlvbj17bG9jYXRpb259PlxuICAgICAgPEo0MEhlYWRlci8+XG4gICAgICA8R3JpZENvbnRhaW5lciBjb250YWluZXJTaXplPXsnZGVza3RvcC1sZyd9XG4gICAgICAgIGNsYXNzTmFtZT17J2o0MC1ncmlkLWNvbnRhaW5lcid9PlxuICAgICAgICA8R3JpZCByb3c+XG4gICAgICAgICAgPG1haW4gaWQ9eydtYWluLWNvbnRlbnQnfVxuICAgICAgICAgICAgY2xhc3NOYW1lPXsndXNhLWxheW91dC1kb2NzIGo0MC1tYWluLWNvbnRlbnQgJyArIGdyaWRDc3NDbGFzc30+XG4gICAgICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgICAgPC9tYWluPlxuICAgICAgICAgIHtjb25kaXRpb25hbEFzaWRlfVxuICAgICAgICA8L0dyaWQ+XG4gICAgICA8L0dyaWRDb250YWluZXI+XG4gICAgICA8SjQwRm9vdGVyLz5cbiAgICA8L1VSTEZsYWdQcm92aWRlcj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IExheW91dDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///1857\n')},774:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "RE": function() { return /* binding */ URLFlagProvider; },\n/* harmony export */ "Vb": function() { return /* binding */ useFlags; }\n/* harmony export */ });\n/* unused harmony export FlagContext */\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7294);\n/* harmony import */ var query_string__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2203);\n/**\n * FlagContext stores feature flags and passes them to consumers\n */var FlagContext=/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createContext({flags:[]});/**\n * `useFlags` returns all feature flags.\n *\n * @return {Flags[]} flags All project feature flags\n */var useFlags=function useFlags(){var _React$useContext=react__WEBPACK_IMPORTED_MODULE_0__.useContext(FlagContext),flags=_React$useContext.flags;return flags;};/**\n * `URLFlagProvider` is a provider for FlagContext.\n * It is passed the current URL and parses the\n * "flags" parameter, assumed to be a comma-separated\n * list of currently-active flags.\n * @param {URL} location : the current URL object\n * @param {ReactNode} children : the children components\n * @return {ReactNode} URLFlagProvider component\n **/var URLFlagProvider=function URLFlagProvider(_ref){var children=_ref.children,location=_ref.location;var flagString=query_string__WEBPACK_IMPORTED_MODULE_1__.parse(location.search).flags;var flags=[];if(flagString&&typeof flagString===\'string\'){flags=flagString.split(\',\');}console.log(JSON.stringify(location),JSON.stringify(flags));return/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(FlagContext.Provider,{value:{flags:flags}},children);};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb250ZXh0cy9GbGFnQ29udGV4dC50c3g/YTM5OSJdLCJuYW1lcyI6WyJGbGFnQ29udGV4dCIsIlJlYWN0IiwiZmxhZ3MiLCJ1c2VGbGFncyIsIlVSTEZsYWdQcm92aWRlciIsImNoaWxkcmVuIiwibG9jYXRpb24iLCJmbGFnU3RyaW5nIiwicXVlcnlTdHJpbmciLCJzZWFyY2giLCJzcGxpdCIsImNvbnNvbGUiLCJsb2ciLCJKU09OIiwic3RyaW5naWZ5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBR0E7QUFDQTtBQUNBLEdBUUEsR0FBTUEsWUFBVyxjQUFHQyxnREFBQSxDQUFrQyxDQUFDQyxLQUFLLENBQUUsRUFBUixDQUFsQyxDQUFwQixDQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FDQSxHQUFNQyxTQUFRLENBQUcsUUFBWEEsU0FBVyxFQUFpQixDQUNoQyxzQkFBZ0JGLDZDQUFBLENBQWlCRCxXQUFqQixDQUFoQixDQUFPRSxLQUFQLG1CQUFPQSxLQUFQLENBQ0EsTUFBT0EsTUFBUCxDQUNELENBSEQsQ0FVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFDQSxHQUFNRSxnQkFBZSxDQUFHLFFBQWxCQSxnQkFBa0IsTUFBaUQsSUFBL0NDLFNBQStDLE1BQS9DQSxRQUErQyxDQUFyQ0MsUUFBcUMsTUFBckNBLFFBQXFDLENBQ3ZFLEdBQU1DLFdBQVUsQ0FBR0MsK0NBQUEsQ0FBa0JGLFFBQVEsQ0FBQ0csTUFBM0IsRUFBbUNQLEtBQXRELENBQ0EsR0FBSUEsTUFBZSxDQUFHLEVBQXRCLENBQ0EsR0FBSUssVUFBVSxFQUFJLE1BQU9BLFdBQVAsR0FBc0IsUUFBeEMsQ0FBa0QsQ0FDaERMLEtBQUssQ0FBSUssVUFBRCxDQUF1QkcsS0FBdkIsQ0FBNkIsR0FBN0IsQ0FBUixDQUNELENBQ0RDLE9BQU8sQ0FBQ0MsR0FBUixDQUFZQyxJQUFJLENBQUNDLFNBQUwsQ0FBZVIsUUFBZixDQUFaLENBQXNDTyxJQUFJLENBQUNDLFNBQUwsQ0FBZVosS0FBZixDQUF0QyxFQUVBLG1CQUNFLGlEQUFDLFdBQUQsQ0FBYSxRQUFiLEVBQ0UsS0FBSyxDQUFFLENBQUNBLEtBQUssQ0FBTEEsS0FBRCxDQURULEVBRUdHLFFBRkgsQ0FERixDQU1ELENBZEQiLCJmaWxlIjoiNzc0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0ICogYXMgcXVlcnlTdHJpbmcgZnJvbSAncXVlcnktc3RyaW5nJztcblxuLyoqXG4gKiBGbGFnQ29udGV4dCBzdG9yZXMgZmVhdHVyZSBmbGFncyBhbmQgcGFzc2VzIHRoZW0gdG8gY29uc3VtZXJzXG4gKi9cbiBpbnRlcmZhY2UgSUZsYWdDb250ZXh0IHtcbiAgLyoqXG4gICAqIENvbnRhaW5zIGEgbGlzdCBvZiBhbGwgY3VycmVudGx5LWFjdGl2ZSBmbGFnc1xuICAgKi9cbiAgZmxhZ3M6IHN0cmluZ1tdO1xufVxuXG5jb25zdCBGbGFnQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQ8SUZsYWdDb250ZXh0Pih7ZmxhZ3M6IFtdfSk7XG5cbi8qKlxuICogYHVzZUZsYWdzYCByZXR1cm5zIGFsbCBmZWF0dXJlIGZsYWdzLlxuICpcbiAqIEByZXR1cm4ge0ZsYWdzW119IGZsYWdzIEFsbCBwcm9qZWN0IGZlYXR1cmUgZmxhZ3NcbiAqL1xuY29uc3QgdXNlRmxhZ3MgPSAoKSA6IHN0cmluZ1tdID0+IHtcbiAgY29uc3Qge2ZsYWdzfSA9IFJlYWN0LnVzZUNvbnRleHQoRmxhZ0NvbnRleHQpO1xuICByZXR1cm4gZmxhZ3M7XG59O1xuXG5pbnRlcmZhY2UgSVVSTEZsYWdQcm92aWRlclByb3BzIHtcbiAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZSxcbiAgbG9jYXRpb246IExvY2F0aW9uXG59XG5cbi8qKlxuICogYFVSTEZsYWdQcm92aWRlcmAgaXMgYSBwcm92aWRlciBmb3IgRmxhZ0NvbnRleHQuXG4gKiAgIEl0IGlzIHBhc3NlZCB0aGUgY3VycmVudCBVUkwgYW5kIHBhcnNlcyB0aGVcbiAqICAgXCJmbGFnc1wiIHBhcmFtZXRlciwgYXNzdW1lZCB0byBiZSBhIGNvbW1hLXNlcGFyYXRlZFxuICogICBsaXN0IG9mIGN1cnJlbnRseS1hY3RpdmUgZmxhZ3MuXG4gKiBAcGFyYW0ge1VSTH0gbG9jYXRpb24gOiB0aGUgY3VycmVudCBVUkwgb2JqZWN0XG4gKiBAcGFyYW0ge1JlYWN0Tm9kZX0gY2hpbGRyZW4gOiB0aGUgY2hpbGRyZW4gY29tcG9uZW50c1xuICogQHJldHVybiB7UmVhY3ROb2RlfSBVUkxGbGFnUHJvdmlkZXIgY29tcG9uZW50XG4gKiovXG5jb25zdCBVUkxGbGFnUHJvdmlkZXIgPSAoe2NoaWxkcmVuLCBsb2NhdGlvbn06IElVUkxGbGFnUHJvdmlkZXJQcm9wcykgPT4ge1xuICBjb25zdCBmbGFnU3RyaW5nID0gcXVlcnlTdHJpbmcucGFyc2UobG9jYXRpb24uc2VhcmNoKS5mbGFncztcbiAgbGV0IGZsYWdzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAoZmxhZ1N0cmluZyAmJiB0eXBlb2YgZmxhZ1N0cmluZyA9PT0gJ3N0cmluZycpIHtcbiAgICBmbGFncyA9IChmbGFnU3RyaW5nIGFzIHN0cmluZykuc3BsaXQoJywnKTtcbiAgfVxuICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShsb2NhdGlvbiksIEpTT04uc3RyaW5naWZ5KGZsYWdzKSk7XG5cbiAgcmV0dXJuIChcbiAgICA8RmxhZ0NvbnRleHQuUHJvdmlkZXJcbiAgICAgIHZhbHVlPXt7ZmxhZ3N9fT5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L0ZsYWdDb250ZXh0LlByb3ZpZGVyPlxuICApO1xufTtcblxuZXhwb3J0IHtGbGFnQ29udGV4dCwgVVJMRmxhZ1Byb3ZpZGVyLCB1c2VGbGFnc307XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///774\n')},9703:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('var _interopRequireDefault=__webpack_require__(5318);var _interopRequireWildcard=__webpack_require__(862);exports.__esModule=true;var _exportNames={Link:true,withIntl:true,navigate:true,changeLocale:true,IntlContextProvider:true,IntlContextConsumer:true};exports.IntlContextConsumer=exports.IntlContextProvider=exports.changeLocale=exports.navigate=exports.withIntl=exports.Link=void 0;var _reactIntl=__webpack_require__(3160);Object.keys(_reactIntl).forEach(function(key){if(key==="default"||key==="__esModule")return;if(Object.prototype.hasOwnProperty.call(_exportNames,key))return;exports[key]=_reactIntl[key];});var _link=_interopRequireWildcard(__webpack_require__(4687));exports.Link=_link.default;exports.navigate=_link.navigate;exports.changeLocale=_link.changeLocale;var _withIntl=_interopRequireDefault(__webpack_require__(8770));exports.withIntl=_withIntl.default;var _intlContext=__webpack_require__(8368);exports.IntlContextProvider=_intlContext.IntlContextProvider;exports.IntlContextConsumer=_intlContext.IntlContextConsumer;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9nYXRzYnktcGx1Z2luLWludGwvaW5kZXguanM/OTAyMiJdLCJuYW1lcyI6WyJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiZXhwb3J0cyIsIl9leHBvcnROYW1lcyIsIkxpbmsiLCJ3aXRoSW50bCIsIm5hdmlnYXRlIiwiY2hhbmdlTG9jYWxlIiwiSW50bENvbnRleHRQcm92aWRlciIsIkludGxDb250ZXh0Q29uc3VtZXIiLCJfcmVhY3RJbnRsIiwiT2JqZWN0Iiwia2V5cyIsImZvckVhY2giLCJrZXkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJfbGluayIsImRlZmF1bHQiLCJfd2l0aEludGwiLCJfaW50bENvbnRleHQiXSwibWFwcGluZ3MiOiJBQUVBLEdBQUlBLHVCQUFzQixDQUFHQyxtQkFBTyxDQUFDLElBQUQsQ0FBcEMsQ0FFQSxHQUFJQyx3QkFBdUIsQ0FBR0QsbUJBQU8sQ0FBQyxHQUFELENBQXJDLENBRUFFLGtCQUFBLENBQXFCLElBQXJCLENBQ0EsR0FBSUMsYUFBWSxDQUFHLENBQ2pCQyxJQUFJLENBQUUsSUFEVyxDQUVqQkMsUUFBUSxDQUFFLElBRk8sQ0FHakJDLFFBQVEsQ0FBRSxJQUhPLENBSWpCQyxZQUFZLENBQUUsSUFKRyxDQUtqQkMsbUJBQW1CLENBQUUsSUFMSixDQU1qQkMsbUJBQW1CLENBQUUsSUFOSixDQUFuQixDQVFBUCwyQkFBQSxDQUE4QkEsMkJBQUEsQ0FBOEJBLG9CQUFBLENBQXVCQSxnQkFBQSxDQUFtQkEsZ0JBQUEsQ0FBbUJBLFlBQUEsQ0FBZSxJQUFLLEVBQTdJLENBRUEsR0FBSVEsV0FBVSxDQUFHVixtQkFBTyxDQUFDLElBQUQsQ0FBeEIsQ0FFQVcsTUFBTSxDQUFDQyxJQUFQLENBQVlGLFVBQVosRUFBd0JHLE9BQXhCLENBQWdDLFNBQVVDLEdBQVYsQ0FBZSxDQUM3QyxHQUFJQSxHQUFHLEdBQUssU0FBUixFQUFxQkEsR0FBRyxHQUFLLFlBQWpDLENBQStDLE9BQy9DLEdBQUlILE1BQU0sQ0FBQ0ksU0FBUCxDQUFpQkMsY0FBakIsQ0FBZ0NDLElBQWhDLENBQXFDZCxZQUFyQyxDQUFtRFcsR0FBbkQsQ0FBSixDQUE2RCxPQUM3RFosT0FBTyxDQUFDWSxHQUFELENBQVAsQ0FBZUosVUFBVSxDQUFDSSxHQUFELENBQXpCLENBQ0QsQ0FKRCxFQU1BLEdBQUlJLE1BQUssQ0FBR2pCLHVCQUF1QixDQUFDRCxtQkFBTyxDQUFDLElBQUQsQ0FBUixDQUFuQyxDQUVBRSxZQUFBLENBQWVnQixLQUFLLENBQUNDLE9BQXJCLENBQ0FqQixnQkFBQSxDQUFtQmdCLEtBQUssQ0FBQ1osUUFBekIsQ0FDQUosb0JBQUEsQ0FBdUJnQixLQUFLLENBQUNYLFlBQTdCLENBRUEsR0FBSWEsVUFBUyxDQUFHckIsc0JBQXNCLENBQUNDLG1CQUFPLENBQUMsSUFBRCxDQUFSLENBQXRDLENBRUFFLGdCQUFBLENBQW1Ca0IsU0FBUyxDQUFDRCxPQUE3QixDQUVBLEdBQUlFLGFBQVksQ0FBR3JCLG1CQUFPLENBQUMsSUFBRCxDQUExQixDQUVBRSwyQkFBQSxDQUE4Qm1CLFlBQVksQ0FBQ2IsbUJBQTNDLENBQ0FOLDJCQUFBLENBQThCbUIsWUFBWSxDQUFDWixtQkFBM0MiLCJmaWxlIjoiOTcwMy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbnZhciBfZXhwb3J0TmFtZXMgPSB7XG4gIExpbms6IHRydWUsXG4gIHdpdGhJbnRsOiB0cnVlLFxuICBuYXZpZ2F0ZTogdHJ1ZSxcbiAgY2hhbmdlTG9jYWxlOiB0cnVlLFxuICBJbnRsQ29udGV4dFByb3ZpZGVyOiB0cnVlLFxuICBJbnRsQ29udGV4dENvbnN1bWVyOiB0cnVlXG59O1xuZXhwb3J0cy5JbnRsQ29udGV4dENvbnN1bWVyID0gZXhwb3J0cy5JbnRsQ29udGV4dFByb3ZpZGVyID0gZXhwb3J0cy5jaGFuZ2VMb2NhbGUgPSBleHBvcnRzLm5hdmlnYXRlID0gZXhwb3J0cy53aXRoSW50bCA9IGV4cG9ydHMuTGluayA9IHZvaWQgMDtcblxudmFyIF9yZWFjdEludGwgPSByZXF1aXJlKFwicmVhY3QtaW50bFwiKTtcblxuT2JqZWN0LmtleXMoX3JlYWN0SW50bCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gIGlmIChrZXkgPT09IFwiZGVmYXVsdFwiIHx8IGtleSA9PT0gXCJfX2VzTW9kdWxlXCIpIHJldHVybjtcbiAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChfZXhwb3J0TmFtZXMsIGtleSkpIHJldHVybjtcbiAgZXhwb3J0c1trZXldID0gX3JlYWN0SW50bFtrZXldO1xufSk7XG5cbnZhciBfbGluayA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCIuL2xpbmtcIikpO1xuXG5leHBvcnRzLkxpbmsgPSBfbGluay5kZWZhdWx0O1xuZXhwb3J0cy5uYXZpZ2F0ZSA9IF9saW5rLm5hdmlnYXRlO1xuZXhwb3J0cy5jaGFuZ2VMb2NhbGUgPSBfbGluay5jaGFuZ2VMb2NhbGU7XG5cbnZhciBfd2l0aEludGwgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3dpdGgtaW50bFwiKSk7XG5cbmV4cG9ydHMud2l0aEludGwgPSBfd2l0aEludGwuZGVmYXVsdDtcblxudmFyIF9pbnRsQ29udGV4dCA9IHJlcXVpcmUoXCIuL2ludGwtY29udGV4dFwiKTtcblxuZXhwb3J0cy5JbnRsQ29udGV4dFByb3ZpZGVyID0gX2ludGxDb250ZXh0LkludGxDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLkludGxDb250ZXh0Q29uc3VtZXIgPSBfaW50bENvbnRleHQuSW50bENvbnRleHRDb25zdW1lcjsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///9703\n')},4687:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('var _interopRequireDefault=__webpack_require__(5318);exports.__esModule=true;exports.changeLocale=exports.navigate=exports.default=void 0;var _extends2=_interopRequireDefault(__webpack_require__(7154));var _objectWithoutPropertiesLoose2=_interopRequireDefault(__webpack_require__(7316));var _react=_interopRequireDefault(__webpack_require__(7294));var _propTypes=_interopRequireDefault(__webpack_require__(5697));var _gatsby=__webpack_require__(5444);var _intlContext=__webpack_require__(8368);var Link=function Link(_ref){var to=_ref.to,language=_ref.language,children=_ref.children,onClick=_ref.onClick,rest=(0,_objectWithoutPropertiesLoose2.default)(_ref,["to","language","children","onClick"]);return _react.default.createElement(_intlContext.IntlContextConsumer,null,function(intl){var languageLink=language||intl.language;var link=intl.routed||language?"/"+languageLink+to:""+to;var handleClick=function handleClick(e){if(language){localStorage.setItem("gatsby-intl-language",language);}if(onClick){onClick(e);}};return _react.default.createElement(_gatsby.Link,(0,_extends2.default)({},rest,{to:link,onClick:handleClick}),children);});};Link.propTypes={children:_propTypes.default.node.isRequired,to:_propTypes.default.string,language:_propTypes.default.string};Link.defaultProps={to:""};var _default=Link;exports.default=_default;var navigate=function navigate(to,options){if(typeof window==="undefined"){return;}var _window$___gatsbyIntl=window.___gatsbyIntl,language=_window$___gatsbyIntl.language,routed=_window$___gatsbyIntl.routed;var link=routed?"/"+language+to:""+to;(0,_gatsby.navigate)(link,options);};exports.navigate=navigate;var changeLocale=function changeLocale(language,to){if(typeof window==="undefined"){return;}var routed=window.___gatsbyIntl.routed;var removePrefix=function removePrefix(pathname){var base= true?"/justice40-tool/63e863":0;if(base&&pathname.indexOf(base)===0){pathname=pathname.slice(base.length);}return pathname;};var removeLocalePart=function removeLocalePart(pathname){if(!routed){return pathname;}var i=pathname.indexOf("/",1);return pathname.substring(i);};var pathname=to||removeLocalePart(removePrefix(window.location.pathname));// TODO: check slash\nvar link="/"+language+pathname+window.location.search;localStorage.setItem("gatsby-intl-language",language);(0,_gatsby.navigate)(link);};exports.changeLocale=changeLocale;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9nYXRzYnktcGx1Z2luLWludGwvbGluay5qcz8xODJiIl0sIm5hbWVzIjpbIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiZXhwb3J0cyIsIl9leHRlbmRzMiIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlMiIsIl9yZWFjdCIsIl9wcm9wVHlwZXMiLCJfZ2F0c2J5IiwiX2ludGxDb250ZXh0IiwiTGluayIsIl9yZWYiLCJ0byIsImxhbmd1YWdlIiwiY2hpbGRyZW4iLCJvbkNsaWNrIiwicmVzdCIsImRlZmF1bHQiLCJjcmVhdGVFbGVtZW50IiwiSW50bENvbnRleHRDb25zdW1lciIsImludGwiLCJsYW5ndWFnZUxpbmsiLCJsaW5rIiwicm91dGVkIiwiaGFuZGxlQ2xpY2siLCJlIiwibG9jYWxTdG9yYWdlIiwic2V0SXRlbSIsInByb3BUeXBlcyIsIm5vZGUiLCJpc1JlcXVpcmVkIiwic3RyaW5nIiwiZGVmYXVsdFByb3BzIiwiX2RlZmF1bHQiLCJuYXZpZ2F0ZSIsIm9wdGlvbnMiLCJ3aW5kb3ciLCJfd2luZG93JF9fX2dhdHNieUludGwiLCJfX19nYXRzYnlJbnRsIiwiY2hhbmdlTG9jYWxlIiwicmVtb3ZlUHJlZml4IiwicGF0aG5hbWUiLCJiYXNlIiwiX19CQVNFX1BBVEhfXyIsIl9fUEFUSF9QUkVGSVhfXyIsImluZGV4T2YiLCJzbGljZSIsImxlbmd0aCIsInJlbW92ZUxvY2FsZVBhcnQiLCJpIiwic3Vic3RyaW5nIiwibG9jYXRpb24iLCJzZWFyY2giXSwibWFwcGluZ3MiOiJBQUVBLEdBQUlBLHVCQUFzQixDQUFHQyxtQkFBTyxDQUFDLElBQUQsQ0FBcEMsQ0FFQUMsa0JBQUEsQ0FBcUIsSUFBckIsQ0FDQUEsb0JBQUEsQ0FBdUJBLGdCQUFBLENBQW1CQSxlQUFBLENBQWtCLElBQUssRUFBakUsQ0FFQSxHQUFJQyxVQUFTLENBQUdILHNCQUFzQixDQUFDQyxtQkFBTyxDQUFDLElBQUQsQ0FBUixDQUF0QyxDQUVBLEdBQUlHLCtCQUE4QixDQUFHSixzQkFBc0IsQ0FBQ0MsbUJBQU8sQ0FBQyxJQUFELENBQVIsQ0FBM0QsQ0FFQSxHQUFJSSxPQUFNLENBQUdMLHNCQUFzQixDQUFDQyxtQkFBTyxDQUFDLElBQUQsQ0FBUixDQUFuQyxDQUVBLEdBQUlLLFdBQVUsQ0FBR04sc0JBQXNCLENBQUNDLG1CQUFPLENBQUMsSUFBRCxDQUFSLENBQXZDLENBRUEsR0FBSU0sUUFBTyxDQUFHTixtQkFBTyxDQUFDLElBQUQsQ0FBckIsQ0FFQSxHQUFJTyxhQUFZLENBQUdQLG1CQUFPLENBQUMsSUFBRCxDQUExQixDQUVBLEdBQUlRLEtBQUksQ0FBRyxRQUFTQSxLQUFULENBQWNDLElBQWQsQ0FBb0IsQ0FDN0IsR0FBSUMsR0FBRSxDQUFHRCxJQUFJLENBQUNDLEVBQWQsQ0FDSUMsUUFBUSxDQUFHRixJQUFJLENBQUNFLFFBRHBCLENBRUlDLFFBQVEsQ0FBR0gsSUFBSSxDQUFDRyxRQUZwQixDQUdJQyxPQUFPLENBQUdKLElBQUksQ0FBQ0ksT0FIbkIsQ0FJSUMsSUFBSSxDQUFHLENBQUMsRUFBR1gsOEJBQThCLENBQUNZLE9BQW5DLEVBQTRDTixJQUE1QyxDQUFrRCxDQUFDLElBQUQsQ0FBTyxVQUFQLENBQW1CLFVBQW5CLENBQStCLFNBQS9CLENBQWxELENBSlgsQ0FLQSxNQUFPTCxPQUFNLENBQUNXLE9BQVAsQ0FBZUMsYUFBZixDQUE2QlQsWUFBWSxDQUFDVSxtQkFBMUMsQ0FBK0QsSUFBL0QsQ0FBcUUsU0FBVUMsSUFBVixDQUFnQixDQUMxRixHQUFJQyxhQUFZLENBQUdSLFFBQVEsRUFBSU8sSUFBSSxDQUFDUCxRQUFwQyxDQUNBLEdBQUlTLEtBQUksQ0FBR0YsSUFBSSxDQUFDRyxNQUFMLEVBQWVWLFFBQWYsQ0FBMEIsSUFBTVEsWUFBTixDQUFxQlQsRUFBL0MsQ0FBb0QsR0FBS0EsRUFBcEUsQ0FFQSxHQUFJWSxZQUFXLENBQUcsUUFBU0EsWUFBVCxDQUFxQkMsQ0FBckIsQ0FBd0IsQ0FDeEMsR0FBSVosUUFBSixDQUFjLENBQ1phLFlBQVksQ0FBQ0MsT0FBYixDQUFxQixzQkFBckIsQ0FBNkNkLFFBQTdDLEVBQ0QsQ0FFRCxHQUFJRSxPQUFKLENBQWEsQ0FDWEEsT0FBTyxDQUFDVSxDQUFELENBQVAsQ0FDRCxDQUNGLENBUkQsQ0FVQSxNQUFPbkIsT0FBTSxDQUFDVyxPQUFQLENBQWVDLGFBQWYsQ0FBNkJWLE9BQU8sQ0FBQ0UsSUFBckMsQ0FBMkMsQ0FBQyxFQUFHTixTQUFTLENBQUNhLE9BQWQsRUFBdUIsRUFBdkIsQ0FBMkJELElBQTNCLENBQWlDLENBQ2pGSixFQUFFLENBQUVVLElBRDZFLENBRWpGUCxPQUFPLENBQUVTLFdBRndFLENBQWpDLENBQTNDLENBR0hWLFFBSEcsQ0FBUCxDQUlELENBbEJNLENBQVAsQ0FtQkQsQ0F6QkQsQ0EyQkFKLElBQUksQ0FBQ2tCLFNBQUwsQ0FBaUIsQ0FDZmQsUUFBUSxDQUFFUCxVQUFVLENBQUNVLE9BQVgsQ0FBbUJZLElBQW5CLENBQXdCQyxVQURuQixDQUVmbEIsRUFBRSxDQUFFTCxVQUFVLENBQUNVLE9BQVgsQ0FBbUJjLE1BRlIsQ0FHZmxCLFFBQVEsQ0FBRU4sVUFBVSxDQUFDVSxPQUFYLENBQW1CYyxNQUhkLENBQWpCLENBS0FyQixJQUFJLENBQUNzQixZQUFMLENBQW9CLENBQ2xCcEIsRUFBRSxDQUFFLEVBRGMsQ0FBcEIsQ0FHQSxHQUFJcUIsU0FBUSxDQUFHdkIsSUFBZixDQUNBUCxlQUFBLENBQWtCOEIsUUFBbEIsQ0FFQSxHQUFJQyxTQUFRLENBQUcsUUFBU0EsU0FBVCxDQUFrQnRCLEVBQWxCLENBQXNCdUIsT0FBdEIsQ0FBK0IsQ0FDNUMsR0FBSSxNQUFPQyxPQUFQLEdBQWtCLFdBQXRCLENBQW1DLENBQ2pDLE9BQ0QsQ0FFRCxHQUFJQyxzQkFBcUIsQ0FBR0QsTUFBTSxDQUFDRSxhQUFuQyxDQUNJekIsUUFBUSxDQUFHd0IscUJBQXFCLENBQUN4QixRQURyQyxDQUVJVSxNQUFNLENBQUdjLHFCQUFxQixDQUFDZCxNQUZuQyxDQUdBLEdBQUlELEtBQUksQ0FBR0MsTUFBTSxDQUFHLElBQU1WLFFBQU4sQ0FBaUJELEVBQXBCLENBQXlCLEdBQUtBLEVBQS9DLENBQ0EsQ0FBQyxFQUFHSixPQUFPLENBQUMwQixRQUFaLEVBQXNCWixJQUF0QixDQUE0QmEsT0FBNUIsRUFDRCxDQVZELENBWUFoQyxnQkFBQSxDQUFtQitCLFFBQW5CLENBRUEsR0FBSUssYUFBWSxDQUFHLFFBQVNBLGFBQVQsQ0FBc0IxQixRQUF0QixDQUFnQ0QsRUFBaEMsQ0FBb0MsQ0FDckQsR0FBSSxNQUFPd0IsT0FBUCxHQUFrQixXQUF0QixDQUFtQyxDQUNqQyxPQUNELENBRUQsR0FBSWIsT0FBTSxDQUFHYSxNQUFNLENBQUNFLGFBQVAsQ0FBcUJmLE1BQWxDLENBRUEsR0FBSWlCLGFBQVksQ0FBRyxRQUFTQSxhQUFULENBQXNCQyxRQUF0QixDQUFnQyxDQUNqRCxHQUFJQyxLQUFJLENBQUcsTUFBdUNDLHdCQUF2QyxDQUF1REMsQ0FBbEUsQ0FFQSxHQUFJRixJQUFJLEVBQUlELFFBQVEsQ0FBQ0ksT0FBVCxDQUFpQkgsSUFBakIsSUFBMkIsQ0FBdkMsQ0FBMEMsQ0FDeENELFFBQVEsQ0FBR0EsUUFBUSxDQUFDSyxLQUFULENBQWVKLElBQUksQ0FBQ0ssTUFBcEIsQ0FBWCxDQUNELENBRUQsTUFBT04sU0FBUCxDQUNELENBUkQsQ0FVQSxHQUFJTyxpQkFBZ0IsQ0FBRyxRQUFTQSxpQkFBVCxDQUEwQlAsUUFBMUIsQ0FBb0MsQ0FDekQsR0FBSSxDQUFDbEIsTUFBTCxDQUFhLENBQ1gsTUFBT2tCLFNBQVAsQ0FDRCxDQUVELEdBQUlRLEVBQUMsQ0FBR1IsUUFBUSxDQUFDSSxPQUFULENBQWlCLEdBQWpCLENBQXNCLENBQXRCLENBQVIsQ0FDQSxNQUFPSixTQUFRLENBQUNTLFNBQVQsQ0FBbUJELENBQW5CLENBQVAsQ0FDRCxDQVBELENBU0EsR0FBSVIsU0FBUSxDQUFHN0IsRUFBRSxFQUFJb0MsZ0JBQWdCLENBQUNSLFlBQVksQ0FBQ0osTUFBTSxDQUFDZSxRQUFQLENBQWdCVixRQUFqQixDQUFiLENBQXJDLENBQStFO0FBRS9FLEdBQUluQixLQUFJLENBQUcsSUFBTVQsUUFBTixDQUFpQjRCLFFBQWpCLENBQTRCTCxNQUFNLENBQUNlLFFBQVAsQ0FBZ0JDLE1BQXZELENBQ0ExQixZQUFZLENBQUNDLE9BQWIsQ0FBcUIsc0JBQXJCLENBQTZDZCxRQUE3QyxFQUNBLENBQUMsRUFBR0wsT0FBTyxDQUFDMEIsUUFBWixFQUFzQlosSUFBdEIsRUFDRCxDQS9CRCxDQWlDQW5CLG9CQUFBLENBQXVCb0MsWUFBdkIiLCJmaWxlIjoiNDY4Ny5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuY2hhbmdlTG9jYWxlID0gZXhwb3J0cy5uYXZpZ2F0ZSA9IGV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2VcIikpO1xuXG52YXIgX3JlYWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3Byb3BUeXBlcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInByb3AtdHlwZXNcIikpO1xuXG52YXIgX2dhdHNieSA9IHJlcXVpcmUoXCJnYXRzYnlcIik7XG5cbnZhciBfaW50bENvbnRleHQgPSByZXF1aXJlKFwiLi9pbnRsLWNvbnRleHRcIik7XG5cbnZhciBMaW5rID0gZnVuY3Rpb24gTGluayhfcmVmKSB7XG4gIHZhciB0byA9IF9yZWYudG8sXG4gICAgICBsYW5ndWFnZSA9IF9yZWYubGFuZ3VhZ2UsXG4gICAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgICBvbkNsaWNrID0gX3JlZi5vbkNsaWNrLFxuICAgICAgcmVzdCA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZTIuZGVmYXVsdCkoX3JlZiwgW1widG9cIiwgXCJsYW5ndWFnZVwiLCBcImNoaWxkcmVuXCIsIFwib25DbGlja1wiXSk7XG4gIHJldHVybiBfcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KF9pbnRsQ29udGV4dC5JbnRsQ29udGV4dENvbnN1bWVyLCBudWxsLCBmdW5jdGlvbiAoaW50bCkge1xuICAgIHZhciBsYW5ndWFnZUxpbmsgPSBsYW5ndWFnZSB8fCBpbnRsLmxhbmd1YWdlO1xuICAgIHZhciBsaW5rID0gaW50bC5yb3V0ZWQgfHwgbGFuZ3VhZ2UgPyBcIi9cIiArIGxhbmd1YWdlTGluayArIHRvIDogXCJcIiArIHRvO1xuXG4gICAgdmFyIGhhbmRsZUNsaWNrID0gZnVuY3Rpb24gaGFuZGxlQ2xpY2soZSkge1xuICAgICAgaWYgKGxhbmd1YWdlKSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiZ2F0c2J5LWludGwtbGFuZ3VhZ2VcIiwgbGFuZ3VhZ2UpO1xuICAgICAgfVxuXG4gICAgICBpZiAob25DbGljaykge1xuICAgICAgICBvbkNsaWNrKGUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChfZ2F0c2J5LkxpbmssICgwLCBfZXh0ZW5kczIuZGVmYXVsdCkoe30sIHJlc3QsIHtcbiAgICAgIHRvOiBsaW5rLFxuICAgICAgb25DbGljazogaGFuZGxlQ2xpY2tcbiAgICB9KSwgY2hpbGRyZW4pO1xuICB9KTtcbn07XG5cbkxpbmsucHJvcFR5cGVzID0ge1xuICBjaGlsZHJlbjogX3Byb3BUeXBlcy5kZWZhdWx0Lm5vZGUuaXNSZXF1aXJlZCxcbiAgdG86IF9wcm9wVHlwZXMuZGVmYXVsdC5zdHJpbmcsXG4gIGxhbmd1YWdlOiBfcHJvcFR5cGVzLmRlZmF1bHQuc3RyaW5nXG59O1xuTGluay5kZWZhdWx0UHJvcHMgPSB7XG4gIHRvOiBcIlwiXG59O1xudmFyIF9kZWZhdWx0ID0gTGluaztcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0O1xuXG52YXIgbmF2aWdhdGUgPSBmdW5jdGlvbiBuYXZpZ2F0ZSh0bywgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBfd2luZG93JF9fX2dhdHNieUludGwgPSB3aW5kb3cuX19fZ2F0c2J5SW50bCxcbiAgICAgIGxhbmd1YWdlID0gX3dpbmRvdyRfX19nYXRzYnlJbnRsLmxhbmd1YWdlLFxuICAgICAgcm91dGVkID0gX3dpbmRvdyRfX19nYXRzYnlJbnRsLnJvdXRlZDtcbiAgdmFyIGxpbmsgPSByb3V0ZWQgPyBcIi9cIiArIGxhbmd1YWdlICsgdG8gOiBcIlwiICsgdG87XG4gICgwLCBfZ2F0c2J5Lm5hdmlnYXRlKShsaW5rLCBvcHRpb25zKTtcbn07XG5cbmV4cG9ydHMubmF2aWdhdGUgPSBuYXZpZ2F0ZTtcblxudmFyIGNoYW5nZUxvY2FsZSA9IGZ1bmN0aW9uIGNoYW5nZUxvY2FsZShsYW5ndWFnZSwgdG8pIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgcm91dGVkID0gd2luZG93Ll9fX2dhdHNieUludGwucm91dGVkO1xuXG4gIHZhciByZW1vdmVQcmVmaXggPSBmdW5jdGlvbiByZW1vdmVQcmVmaXgocGF0aG5hbWUpIHtcbiAgICB2YXIgYmFzZSA9IHR5cGVvZiBfX0JBU0VfUEFUSF9fICE9PSBcInVuZGVmaW5lZFwiID8gX19CQVNFX1BBVEhfXyA6IF9fUEFUSF9QUkVGSVhfXztcblxuICAgIGlmIChiYXNlICYmIHBhdGhuYW1lLmluZGV4T2YoYmFzZSkgPT09IDApIHtcbiAgICAgIHBhdGhuYW1lID0gcGF0aG5hbWUuc2xpY2UoYmFzZS5sZW5ndGgpO1xuICAgIH1cblxuICAgIHJldHVybiBwYXRobmFtZTtcbiAgfTtcblxuICB2YXIgcmVtb3ZlTG9jYWxlUGFydCA9IGZ1bmN0aW9uIHJlbW92ZUxvY2FsZVBhcnQocGF0aG5hbWUpIHtcbiAgICBpZiAoIXJvdXRlZCkge1xuICAgICAgcmV0dXJuIHBhdGhuYW1lO1xuICAgIH1cblxuICAgIHZhciBpID0gcGF0aG5hbWUuaW5kZXhPZihcIi9cIiwgMSk7XG4gICAgcmV0dXJuIHBhdGhuYW1lLnN1YnN0cmluZyhpKTtcbiAgfTtcblxuICB2YXIgcGF0aG5hbWUgPSB0byB8fCByZW1vdmVMb2NhbGVQYXJ0KHJlbW92ZVByZWZpeCh3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUpKTsgLy8gVE9ETzogY2hlY2sgc2xhc2hcblxuICB2YXIgbGluayA9IFwiL1wiICsgbGFuZ3VhZ2UgKyBwYXRobmFtZSArIHdpbmRvdy5sb2NhdGlvbi5zZWFyY2g7XG4gIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiZ2F0c2J5LWludGwtbGFuZ3VhZ2VcIiwgbGFuZ3VhZ2UpO1xuICAoMCwgX2dhdHNieS5uYXZpZ2F0ZSkobGluayk7XG59O1xuXG5leHBvcnRzLmNoYW5nZUxvY2FsZSA9IGNoYW5nZUxvY2FsZTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///4687\n')},8770:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('var _interopRequireDefault=__webpack_require__(5318);exports.__esModule=true;exports.default=void 0;var _react=_interopRequireDefault(__webpack_require__(7294));var _reactIntl=__webpack_require__(3160);var _default=function _default(Component){return function(props){console.warn("withIntl is deprecated. Please use injectIntl instead.");return _react.default.createElement((0,_reactIntl.injectIntl)(Component),props);};};exports.default=_default;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9nYXRzYnktcGx1Z2luLWludGwvd2l0aC1pbnRsLmpzPzdiNjgiXSwibmFtZXMiOlsiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJleHBvcnRzIiwiX3JlYWN0IiwiX3JlYWN0SW50bCIsIl9kZWZhdWx0IiwiQ29tcG9uZW50IiwicHJvcHMiLCJjb25zb2xlIiwid2FybiIsImRlZmF1bHQiLCJjcmVhdGVFbGVtZW50IiwiaW5qZWN0SW50bCJdLCJtYXBwaW5ncyI6IkFBRUEsR0FBSUEsdUJBQXNCLENBQUdDLG1CQUFPLENBQUMsSUFBRCxDQUFwQyxDQUVBQyxrQkFBQSxDQUFxQixJQUFyQixDQUNBQSxlQUFBLENBQWtCLElBQUssRUFBdkIsQ0FFQSxHQUFJQyxPQUFNLENBQUdILHNCQUFzQixDQUFDQyxtQkFBTyxDQUFDLElBQUQsQ0FBUixDQUFuQyxDQUVBLEdBQUlHLFdBQVUsQ0FBR0gsbUJBQU8sQ0FBQyxJQUFELENBQXhCLENBRUEsR0FBSUksU0FBUSxDQUFHLFFBQVNBLFNBQVQsQ0FBa0JDLFNBQWxCLENBQTZCLENBQzFDLE1BQU8sVUFBVUMsS0FBVixDQUFpQixDQUN0QkMsT0FBTyxDQUFDQyxJQUFSLENBQWEsd0RBQWIsRUFDQSxNQUFPTixPQUFNLENBQUNPLE9BQVAsQ0FBZUMsYUFBZixDQUE2QixDQUFDLEVBQUdQLFVBQVUsQ0FBQ1EsVUFBZixFQUEyQk4sU0FBM0IsQ0FBN0IsQ0FBb0VDLEtBQXBFLENBQVAsQ0FDRCxDQUhELENBSUQsQ0FMRCxDQU9BTCxlQUFBLENBQWtCRyxRQUFsQiIsImZpbGUiOiI4NzcwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX3JlYWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3JlYWN0SW50bCA9IHJlcXVpcmUoXCJyZWFjdC1pbnRsXCIpO1xuXG52YXIgX2RlZmF1bHQgPSBmdW5jdGlvbiBfZGVmYXVsdChDb21wb25lbnQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChwcm9wcykge1xuICAgIGNvbnNvbGUud2FybihcIndpdGhJbnRsIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgaW5qZWN0SW50bCBpbnN0ZWFkLlwiKTtcbiAgICByZXR1cm4gX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudCgoMCwgX3JlYWN0SW50bC5pbmplY3RJbnRsKShDb21wb25lbnQpLCBwcm9wcyk7XG4gIH07XG59O1xuXG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///8770\n')}}]); \ No newline at end of file diff --git a/63e863/app-a65ccd9aebded53964b1.js b/63e863/app-a65ccd9aebded53964b1.js new file mode 100644 index 00000000..6ec241b5 --- /dev/null +++ b/63e863/app-a65ccd9aebded53964b1.js @@ -0,0 +1 @@ +(self.webpackChunkjustice40_tool=self.webpackChunkjustice40_tool||[]).push([[143],{1506:function(module){eval("function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return self;\n}\n\nmodule.exports = _assertThisInitialized;\nmodule.exports.default = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2Fzc2VydFRoaXNJbml0aWFsaXplZC5qcz8zYzk2Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxzQkFBeUIsbUJBQW1CLHlCQUF5QiIsImZpbGUiOiIxNTA2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7XG4gIGlmIChzZWxmID09PSB2b2lkIDApIHtcbiAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7XG4gIH1cblxuICByZXR1cm4gc2VsZjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfYXNzZXJ0VGhpc0luaXRpYWxpemVkO1xubW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///1506\n")},676:function(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "Z": function() { return /* binding */ _arrayLikeToArray; }\n/* harmony export */ });\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n\n return arr2;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hcnJheUxpa2VUb0FycmF5LmpzPzZiNzUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQWU7QUFDZjs7QUFFQSx3Q0FBd0MsU0FBUztBQUNqRDtBQUNBOztBQUVBO0FBQ0EiLCJmaWxlIjoiNjc2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHtcbiAgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgYXJyMltpXSA9IGFycltpXTtcbiAgfVxuXG4gIHJldHVybiBhcnIyO1xufSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///676\n')},6610:function(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "Z": function() { return /* binding */ _classCallCheck; }\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError("Cannot call a class as a function");\n }\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVjay5qcz9kNGVjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiNjYxMC5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///6610\n')},5991:function(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "Z": function() { return /* binding */ _createClass; }\n/* harmony export */ });\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if ("value" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzcy5qcz9iZWUyIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBO0FBQ0EsaUJBQWlCLGtCQUFrQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFZTtBQUNmO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjU5OTEuanMiLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICByZXR1cm4gQ29uc3RydWN0b3I7XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///5991\n')},7608:function(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "Z": function() { return /* binding */ _getPrototypeOf; }\n/* harmony export */ });\nfunction _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9nZXRQcm90b3R5cGVPZi5qcz83ZTg0Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiI3NjA4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHtcbiAgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHtcbiAgICByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pO1xuICB9O1xuICByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pO1xufSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///7608\n')},379:function(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "Z": function() { return /* binding */ _inherits; }\n/* harmony export */ });\n/* harmony import */ var _setPrototypeOf_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4665);\n\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== "function" && superClass !== null) {\n throw new TypeError("Super expression must either be null or a function");\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) (0,_setPrototypeOf_js__WEBPACK_IMPORTED_MODULE_0__/* .default */ .Z)(subClass, superClass);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0cy5qcz8yNjJlIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBaUQ7QUFDbEM7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILGtCQUFrQixvRUFBYztBQUNoQyIsImZpbGUiOiIzNzkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc2V0UHJvdG90eXBlT2YgZnJvbSBcIi4vc2V0UHJvdG90eXBlT2YuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykge1xuICBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO1xuICB9XG5cbiAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7XG4gICAgY29uc3RydWN0b3I6IHtcbiAgICAgIHZhbHVlOiBzdWJDbGFzcyxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfVxuICB9KTtcbiAgaWYgKHN1cGVyQ2xhc3MpIHNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTtcbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///379\n')},1788:function(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "Z": function() { return /* binding */ _inheritsLoose; }\n/* harmony export */ });\n/* harmony import */ var _setPrototypeOf_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4665);\n\nfunction _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n (0,_setPrototypeOf_js__WEBPACK_IMPORTED_MODULE_0__/* .default */ .Z)(subClass, superClass);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c0xvb3NlLmpzPzc0OGUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFpRDtBQUNsQztBQUNmO0FBQ0E7QUFDQSxFQUFFLG9FQUFjO0FBQ2hCIiwiZmlsZSI6IjE3ODguanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc2V0UHJvdG90eXBlT2YgZnJvbSBcIi4vc2V0UHJvdG90eXBlT2YuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcy5wcm90b3R5cGUpO1xuICBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzcztcbiAgc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpO1xufSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///1788\n')},6410:function(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "Z": function() { return /* binding */ _iterableToArray; }\n/* harmony export */ });\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pdGVyYWJsZVRvQXJyYXkuanM/ZGI5MCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBZTtBQUNmO0FBQ0EiLCJmaWxlIjoiNjQxMC5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikge1xuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBpdGVyW1N5bWJvbC5pdGVyYXRvcl0gIT0gbnVsbCB8fCBpdGVyW1wiQEBpdGVyYXRvclwiXSAhPSBudWxsKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTtcbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///6410\n')},6616:function(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__){"use strict";eval('\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "Z": function() { return /* binding */ _possibleConstructorReturn; }\n});\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/typeof.js\nvar helpers_typeof = __webpack_require__(8);\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js\nfunction _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called");\n }\n\n return self;\n}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js\n\n\nfunction _possibleConstructorReturn(self, call) {\n if (call && (helpers_typeof(call) === "object" || typeof call === "function")) {\n return call;\n }\n\n return _assertThisInitialized(self);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQuanM/MjU3ZSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuLmpzPzk5ZGUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDOztBQ05vRDtBQUNXO0FBQ2hEO0FBQ2YsZUFBZSxjQUFPO0FBQ3RCO0FBQ0E7O0FBRUEsU0FBUyxzQkFBcUI7QUFDOUIiLCJmaWxlIjoiNjYxNi5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikge1xuICBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7XG4gICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO1xuICB9XG5cbiAgcmV0dXJuIHNlbGY7XG59IiwiaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mXCI7XG5pbXBvcnQgYXNzZXJ0VGhpc0luaXRpYWxpemVkIGZyb20gXCIuL2Fzc2VydFRoaXNJbml0aWFsaXplZC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkge1xuICBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkge1xuICAgIHJldHVybiBjYWxsO1xuICB9XG5cbiAgcmV0dXJuIGFzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTtcbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///6616\n')},4665:function(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "Z": function() { return /* binding */ _setPrototypeOf; }\n/* harmony export */ });\nfunction _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zZXRQcm90b3R5cGVPZi5qcz9iMzgwIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSIsImZpbGUiOiI0NjY1LmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gICAgby5fX3Byb3RvX18gPSBwO1xuICAgIHJldHVybiBvO1xuICB9O1xuXG4gIHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4665\n')},5061:function(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__){"use strict";eval('\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "Z": function() { return /* binding */ _toConsumableArray; }\n});\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js\nvar arrayLikeToArray = __webpack_require__(676);\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js\n\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return (0,arrayLikeToArray/* default */.Z)(arr);\n}\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/iterableToArray.js\nvar iterableToArray = __webpack_require__(6410);\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js\nvar unsupportedIterableToArray = __webpack_require__(2961);\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js\nfunction _nonIterableSpread() {\n throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");\n}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js\n\n\n\n\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || (0,iterableToArray/* default */.Z)(arr) || (0,unsupportedIterableToArray/* default */.Z)(arr) || _nonIterableSpread();\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hcnJheVdpdGhvdXRIb2xlcy5qcz82MDA1Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL25vbkl0ZXJhYmxlU3ByZWFkLmpzPzM0MjciLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXkuanM/MjkwOSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBcUQ7QUFDdEM7QUFDZixpQ0FBaUMsbUNBQWdCO0FBQ2pELEM7Ozs7OztBQ0hlO0FBQ2Y7QUFDQSxDOztBQ0Z1RDtBQUNKO0FBQ3NCO0FBQ2xCO0FBQ3hDO0FBQ2YsU0FBUyxrQkFBaUIsU0FBUyxrQ0FBZSxTQUFTLDZDQUEwQixTQUFTLGtCQUFpQjtBQUMvRyIsImZpbGUiOiI1MDYxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFycmF5TGlrZVRvQXJyYXkgZnJvbSBcIi4vYXJyYXlMaWtlVG9BcnJheS5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyYXlMaWtlVG9BcnJheShhcnIpO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59IiwiaW1wb3J0IGFycmF5V2l0aG91dEhvbGVzIGZyb20gXCIuL2FycmF5V2l0aG91dEhvbGVzLmpzXCI7XG5pbXBvcnQgaXRlcmFibGVUb0FycmF5IGZyb20gXCIuL2l0ZXJhYmxlVG9BcnJheS5qc1wiO1xuaW1wb3J0IHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IGZyb20gXCIuL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5LmpzXCI7XG5pbXBvcnQgbm9uSXRlcmFibGVTcHJlYWQgZnJvbSBcIi4vbm9uSXRlcmFibGVTcHJlYWQuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHtcbiAgcmV0dXJuIGFycmF5V2l0aG91dEhvbGVzKGFycikgfHwgaXRlcmFibGVUb0FycmF5KGFycikgfHwgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBub25JdGVyYWJsZVNwcmVhZCgpO1xufSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///5061\n')},2961:function(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "Z": function() { return /* binding */ _unsupportedIterableToArray; }\n/* harmony export */ });\n/* harmony import */ var _arrayLikeToArray_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(676);\n\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === "string") return (0,_arrayLikeToArray_js__WEBPACK_IMPORTED_MODULE_0__/* .default */ .Z)(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === "Object" && o.constructor) n = o.constructor.name;\n if (n === "Map" || n === "Set") return Array.from(o);\n if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return (0,_arrayLikeToArray_js__WEBPACK_IMPORTED_MODULE_0__/* .default */ .Z)(o, minLen);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qcz8wNmM1Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBcUQ7QUFDdEM7QUFDZjtBQUNBLG9DQUFvQyxzRUFBZ0I7QUFDcEQ7QUFDQTtBQUNBO0FBQ0Esc0ZBQXNGLHNFQUFnQjtBQUN0RyIsImZpbGUiOiIyOTYxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFycmF5TGlrZVRvQXJyYXkgZnJvbSBcIi4vYXJyYXlMaWtlVG9BcnJheS5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikge1xuICBpZiAoIW8pIHJldHVybjtcbiAgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xuICB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7XG4gIGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7XG4gIGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pO1xuICBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///2961\n')},7154:function(module){eval("function _extends() {\n module.exports = _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n module.exports.default = module.exports, module.exports.__esModule = true;\n return _extends.apply(this, arguments);\n}\n\nmodule.exports = _extends;\nmodule.exports.default = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHMuanM/YTU1OSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0EsbUJBQW1CLHNCQUFzQjtBQUN6Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxFQUFFLHNCQUF5QixtQkFBbUIseUJBQXlCO0FBQ3ZFO0FBQ0E7O0FBRUE7QUFDQSxzQkFBeUIsbUJBQW1CLHlCQUF5QiIsImZpbGUiOiI3MTU0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX2V4dGVuZHMoKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcblxuICAgICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xuXG4gIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbiAgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2V4dGVuZHM7XG5tb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///7154\n")},5354:function(module,__unused_webpack_exports,__webpack_require__){eval("var setPrototypeOf = __webpack_require__(9489);\n\nfunction _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n setPrototypeOf(subClass, superClass);\n}\n\nmodule.exports = _inheritsLoose;\nmodule.exports.default = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzTG9vc2UuanM/NTViNSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxxQkFBcUIsbUJBQU8sQ0FBQyxJQUFxQjs7QUFFbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNCQUF5QixtQkFBbUIseUJBQXlCIiwiZmlsZSI6IjUzNTQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKFwiLi9zZXRQcm90b3R5cGVPZi5qc1wiKTtcblxuZnVuY3Rpb24gX2luaGVyaXRzTG9vc2Uoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSk7XG4gIHN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzO1xuICBzZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2luaGVyaXRzTG9vc2U7XG5tb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///5354\n")},5318:function(module){eval('function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n "default": obj\n };\n}\n\nmodule.exports = _interopRequireDefault;\nmodule.exports.default = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdC5qcz80ZWE0Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxzQkFBeUIsbUJBQW1CLHlCQUF5QiIsImZpbGUiOiI1MzE4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHtcbiAgICBcImRlZmF1bHRcIjogb2JqXG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdDtcbm1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5318\n')},7316:function(module){eval("function _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}\n\nmodule.exports = _objectWithoutPropertiesLoose;\nmodule.exports.default = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UuanM/ZjBlNCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGFBQWEsdUJBQXVCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxzQkFBeUIsbUJBQW1CLHlCQUF5QiIsImZpbGUiOiI3MzE2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkge1xuICBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTtcbiAgdmFyIHRhcmdldCA9IHt9O1xuICB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG4gIHZhciBrZXksIGk7XG5cbiAgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBrZXkgPSBzb3VyY2VLZXlzW2ldO1xuICAgIGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7XG4gICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2U7XG5tb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///7316\n")},9489:function(module){eval("function _setPrototypeOf(o, p) {\n module.exports = _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n module.exports.default = module.exports, module.exports.__esModule = true;\n return _setPrototypeOf(o, p);\n}\n\nmodule.exports = _setPrototypeOf;\nmodule.exports.default = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3NldFByb3RvdHlwZU9mLmpzPzRhNGIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxFQUFFLHNCQUF5QixtQkFBbUIseUJBQXlCO0FBQ3ZFO0FBQ0E7O0FBRUE7QUFDQSxzQkFBeUIsbUJBQW1CLHlCQUF5QiIsImZpbGUiOiI5NDg5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgICBvLl9fcHJvdG9fXyA9IHA7XG4gICAgcmV0dXJuIG87XG4gIH07XG5cbiAgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuICByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9zZXRQcm90b3R5cGVPZjtcbm1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///9489\n")},8:function(module){eval('function _typeof(obj) {\n "@babel/helpers - typeof";\n\n if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {\n module.exports = _typeof = function _typeof(obj) {\n return typeof obj;\n };\n\n module.exports.default = module.exports, module.exports.__esModule = true;\n } else {\n module.exports = _typeof = function _typeof(obj) {\n return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;\n };\n\n module.exports.default = module.exports, module.exports.__esModule = true;\n }\n\n return _typeof(obj);\n}\n\nmodule.exports = _typeof;\nmodule.exports.default = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZi5qcz83MDM3Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSSxzQkFBeUIsbUJBQW1CLHlCQUF5QjtBQUN6RSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBLElBQUksc0JBQXlCLG1CQUFtQix5QkFBeUI7QUFDekU7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHNCQUF5QixtQkFBbUIseUJBQXlCIiwiZmlsZSI6IjguanMiLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7XG5cbiAgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgICAgIHJldHVybiB0eXBlb2Ygb2JqO1xuICAgIH07XG5cbiAgICBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgICAgIHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqO1xuICAgIH07XG5cbiAgICBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG4gIH1cblxuICByZXR1cm4gX3R5cGVvZihvYmopO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF90eXBlb2Y7XG5tb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///8\n')},7625:function(I,g,n){var C={"./en":4574,"./en.js":4574,"./es":3745,"./es.js":3745,"./ses":6867,"./ses.js":6867};function c(I){var g=e(I);return n(g)}function e(I){if(!n.o(C,I)){var g=new Error("Cannot find module '"+I+"'");throw g.code="MODULE_NOT_FOUND",g}return C[I]}c.keys=function(){return Object.keys(C)},c.resolve=e,I.exports=c,c.id=7625},7991:function(I){"use strict";I.exports=JSON.parse('{"data":{"en-001":{"year-short":{"0":"this yr","1":"next yr","future":{"one":"in {0} yr","other":"in {0} yr"},"past":{"one":"{0} yr ago","other":"{0} yr ago"},"-1":"last yr"},"year-narrow":{"0":"this yr","1":"next yr","future":{"one":"in {0} yr","other":"in {0} yr"},"past":{"one":"{0} yr ago","other":"{0} yr ago"},"-1":"last yr"},"quarter-short":{"0":"this qtr.","1":"next qtr.","future":{"one":"in {0} qtr","other":"in {0} qtr"},"past":{"one":"{0} qtr ago","other":"{0} qtr ago"},"-1":"last qtr."},"quarter-narrow":{"0":"this qtr.","1":"next qtr.","future":{"one":"in {0} qtr","other":"in {0} qtr"},"past":{"one":"{0} qtr ago","other":"{0} qtr ago"},"-1":"last qtr."},"month-short":{"0":"this mo","1":"next mo","future":{"one":"in {0} mo","other":"in {0} mo"},"past":{"one":"{0} mo ago","other":"{0} mo ago"},"-1":"last mo"},"month-narrow":{"0":"this mo","1":"next mo","future":{"one":"in {0} mo","other":"in {0} mo"},"past":{"one":"{0} mo ago","other":"{0} mo ago"},"-1":"last mo"},"week-short":{"0":"this wk","1":"next wk","future":{"one":"in {0} wk","other":"in {0} wk"},"past":{"one":"{0} wk ago","other":"{0} wk ago"},"-1":"last wk"},"week-narrow":{"0":"this wk","1":"next wk","future":{"one":"in {0} wk","other":"in {0} wk"},"past":{"one":"{0} wk ago","other":"{0} wk ago"},"-1":"last wk"},"hour-short":{"0":"this hour","future":{"one":"in {0} hr","other":"in {0} hr"},"past":{"one":"{0} hr ago","other":"{0} hr ago"}},"hour-narrow":{"0":"this hour","future":{"one":"in {0} hr","other":"in {0} hr"},"past":{"one":"{0} hr ago","other":"{0} hr ago"}},"minute-short":{"0":"this minute","future":{"one":"in {0} min","other":"in {0} min"},"past":{"one":"{0} min ago","other":"{0} min ago"}},"minute-narrow":{"0":"this minute","future":{"one":"in {0} min","other":"in {0} min"},"past":{"one":"{0} min ago","other":"{0} min ago"}},"second-short":{"0":"now","future":{"one":"in {0} sec","other":"in {0} sec"},"past":{"one":"{0} sec ago","other":"{0} sec ago"}},"second-narrow":{"0":"now","future":{"one":"in {0} sec","other":"in {0} sec"},"past":{"one":"{0} sec ago","other":"{0} sec ago"}}},"en-150":{"year-short":{"0":"this yr","1":"next yr","future":{"one":"in {0} yr","other":"in {0} yr"},"past":{"one":"{0} yr ago","other":"{0} yr ago"},"-1":"last yr"},"year-narrow":{"0":"this yr","1":"next yr","future":{"one":"in {0} yr","other":"in {0} yr"},"past":{"one":"{0} yr ago","other":"{0} yr ago"},"-1":"last yr"},"quarter-short":{"0":"this qtr.","1":"next qtr.","future":{"one":"in {0} qtr","other":"in {0} qtr"},"past":{"one":"{0} qtr ago","other":"{0} qtr ago"},"-1":"last qtr."},"quarter-narrow":{"0":"this qtr.","1":"next qtr.","future":{"one":"in {0} qtr","other":"in {0} qtr"},"past":{"one":"{0} qtr ago","other":"{0} qtr ago"},"-1":"last qtr."},"month-short":{"0":"this mo","1":"next mo","future":{"one":"in {0} mo","other":"in {0} mo"},"past":{"one":"{0} mo ago","other":"{0} mo ago"},"-1":"last mo"},"month-narrow":{"0":"this mo","1":"next mo","future":{"one":"in {0} mo","other":"in {0} mo"},"past":{"one":"{0} mo ago","other":"{0} mo ago"},"-1":"last mo"},"week-short":{"0":"this wk","1":"next wk","future":{"one":"in {0} wk","other":"in {0} wk"},"past":{"one":"{0} wk ago","other":"{0} wk ago"},"-1":"last wk"},"week-narrow":{"0":"this wk","1":"next wk","future":{"one":"in {0} wk","other":"in {0} wk"},"past":{"one":"{0} wk ago","other":"{0} wk ago"},"-1":"last wk"},"hour-short":{"0":"this hour","future":{"one":"in {0} hr","other":"in {0} hr"},"past":{"one":"{0} hr ago","other":"{0} hr ago"}},"hour-narrow":{"0":"this hour","future":{"one":"in {0} hr","other":"in {0} hr"},"past":{"one":"{0} hr ago","other":"{0} hr ago"}},"minute-short":{"0":"this minute","future":{"one":"in {0} min","other":"in {0} min"},"past":{"one":"{0} min ago","other":"{0} min ago"}},"minute-narrow":{"0":"this minute","future":{"one":"in {0} min","other":"in {0} min"},"past":{"one":"{0} min ago","other":"{0} min ago"}},"second-short":{"0":"now","future":{"one":"in {0} sec","other":"in {0} sec"},"past":{"one":"{0} sec ago","other":"{0} sec ago"}},"second-narrow":{"0":"now","future":{"one":"in {0} sec","other":"in {0} sec"},"past":{"one":"{0} sec ago","other":"{0} sec ago"}}},"en-AU":{"year-short":{"0":"this yr","1":"next yr","future":{"one":"in {0} yr","other":"in {0} yrs"},"past":{"one":"{0} yr ago","other":"{0} yrs ago"},"-1":"last yr"},"year-narrow":{"0":"this yr","1":"next yr","future":{"one":"in {0} yr","other":"in {0} yrs"},"past":{"one":"{0} yr ago","other":"{0} yrs ago"},"-1":"last yr"},"quarter-short":{"0":"this qtr.","1":"next qtr.","future":{"one":"in {0} qtr","other":"in {0} qtrs"},"past":{"one":"{0} qtr ago","other":"{0} qtrs ago"},"-1":"last qtr."},"quarter-narrow":{"0":"this qtr.","1":"next qtr.","future":{"one":"in {0} qtr","other":"in {0} qtrs"},"past":{"one":"in {0} qtr ago","other":"{0} qtrs ago"},"-1":"last qtr."},"month-short":{"0":"this mo","1":"next mo","future":{"one":"in {0} mo.","other":"in {0} mo."},"past":{"one":"{0} mo. ago","other":"{0} mo. ago"},"-1":"last mo"},"month-narrow":{"0":"this mo","1":"next mo","future":{"one":"in {0} mo.","other":"in {0} mo."},"past":{"one":"{0} mo. ago","other":"{0} mo. ago"},"-1":"last mo"},"week-short":{"0":"this wk","1":"next wk","future":{"one":"in {0} wk","other":"in {0} wks"},"past":{"one":"{0} wk ago","other":"{0} wks ago"},"-1":"last wk"},"week-narrow":{"0":"this wk","1":"next wk","future":{"one":"in {0} wk","other":"in {0} wks"},"past":{"one":"{0} wk ago","other":"{0} wks ago"},"-1":"last wk"},"hour-short":{"0":"this hour","future":{"one":"in {0} hr","other":"in {0} hrs"},"past":{"one":"{0} hr ago","other":"{0} hrs ago"}},"hour-narrow":{"0":"this hour","future":{"one":"in {0} hr","other":"in {0} hrs"},"past":{"one":"{0} hr ago","other":"{0} hrs ago"}},"minute-short":{"0":"this minute","future":{"one":"in {0} min.","other":"in {0} mins"},"past":{"one":"{0} min. ago","other":"{0} mins ago"}},"minute-narrow":{"0":"this minute","future":{"one":"in {0} min.","other":"in {0} mins"},"past":{"one":"{0} min. ago","other":"{0} mins ago"}},"second-short":{"0":"now","future":{"one":"in {0} sec.","other":"in {0} secs"},"past":{"one":"{0} sec. ago","other":"{0} secs ago"}},"second-narrow":{"0":"now","future":{"one":"in {0} sec.","other":"in {0} secs"},"past":{"one":"{0} sec. ago","other":"{0} secs ago"}}},"en-CA":{"year-short":{"0":"this yr","1":"next yr","future":{"one":"in {0} yr.","other":"in {0} yrs."},"past":{"one":"{0} yr. ago","other":"{0} yrs. ago"},"-1":"last yr"},"year-narrow":{"0":"this yr","1":"next yr","future":{"one":"in {0} yr.","other":"in {0} yrs."},"past":{"one":"{0} yr. ago","other":"{0} yrs. ago"},"-1":"last yr"},"quarter-short":{"0":"this qtr.","1":"next qtr.","future":{"one":"in {0} qtr.","other":"in {0} qtrs."},"past":{"one":"{0} qtr. ago","other":"{0} qtrs. ago"},"-1":"last qtr."},"quarter-narrow":{"0":"this qtr.","1":"next qtr.","future":{"one":"in {0} qtr.","other":"in {0} qtrs."},"past":{"one":"{0} qtr. ago","other":"{0} qtrs. ago"},"-1":"last qtr."},"month-short":{"0":"this mo","1":"next mo","future":{"one":"in {0} mo.","other":"in {0} mos."},"past":{"one":"{0} mo. ago","other":"{0} mos. ago"},"-1":"last mo"},"month-narrow":{"0":"this mo","1":"next mo","future":{"one":"in {0} mo.","other":"in {0} mos."},"past":{"one":"{0} mo. ago","other":"{0} mos. ago"},"-1":"last mo"},"week-short":{"0":"this wk","1":"next wk","future":{"one":"in {0} wk.","other":"in {0} wks."},"past":{"one":"{0} wk. ago","other":"{0} wks. ago"},"-1":"last wk"},"week-narrow":{"0":"this wk","1":"next wk","future":{"one":"in {0} wk.","other":"in {0} wks."},"past":{"one":"{0} wk. ago","other":"{0} wks. ago"},"-1":"last wk"},"hour-short":{"0":"this hour","future":{"one":"in {0} hr.","other":"in {0} hrs."},"past":{"one":"{0} hr. ago","other":"{0} hrs. ago"}},"hour-narrow":{"0":"this hour","future":{"one":"in {0} hr.","other":"in {0} hrs."},"past":{"one":"{0} hr. ago","other":"{0} hrs. ago"}},"minute-short":{"0":"this minute","future":{"one":"in {0} min.","other":"in {0} mins."},"past":{"one":"{0} min. ago","other":"{0} mins. ago"}},"minute-narrow":{"0":"this minute","future":{"one":"in {0} min.","other":"in {0} mins."},"past":{"one":"{0} min. ago","other":"{0} mins. ago"}},"second-short":{"0":"now","future":{"one":"in {0} sec.","other":"in {0} secs."},"past":{"one":"{0} sec. ago","other":"{0} secs. ago"}},"second-narrow":{"0":"now","future":{"one":"in {0} sec.","other":"in {0} secs."},"past":{"one":"{0} sec. ago","other":"{0} secs. ago"}}},"en-SG":{"quarter-short":{"0":"this qtr","1":"next qtr","future":{"one":"in {0} qtr","other":"in {0} qtrs"},"past":{"one":"{0} qtr ago","other":"{0} qtrs ago"},"-1":"last qtr"},"quarter-narrow":{"0":"this qtr","1":"next qtr","future":{"one":"in {0} qtr","other":"in {0} qtr"},"past":{"one":"{0} qtr ago","other":"{0} qtr ago"},"-1":"last qtr"},"month-short":{"0":"this mth","1":"next mth","future":{"one":"in {0} mth","other":"in {0} mth"},"past":{"one":"{0} mth ago","other":"{0} mth ago"},"-1":"last mth"}},"en":{"nu":["latn"],"year":{"0":"this year","1":"next year","future":{"one":"in {0} year","other":"in {0} years"},"past":{"one":"{0} year ago","other":"{0} years ago"},"-1":"last year"},"year-short":{"0":"this yr.","1":"next yr.","future":{"one":"in {0} yr.","other":"in {0} yr."},"past":{"one":"{0} yr. ago","other":"{0} yr. ago"},"-1":"last yr."},"year-narrow":{"0":"this yr.","1":"next yr.","future":{"one":"in {0} yr.","other":"in {0} yr."},"past":{"one":"{0} yr. ago","other":"{0} yr. ago"},"-1":"last yr."},"quarter":{"0":"this quarter","1":"next quarter","future":{"one":"in {0} quarter","other":"in {0} quarters"},"past":{"one":"{0} quarter ago","other":"{0} quarters ago"},"-1":"last quarter"},"quarter-short":{"0":"this qtr.","1":"next qtr.","future":{"one":"in {0} qtr.","other":"in {0} qtrs."},"past":{"one":"{0} qtr. ago","other":"{0} qtrs. ago"},"-1":"last qtr."},"quarter-narrow":{"0":"this qtr.","1":"next qtr.","future":{"one":"in {0} qtr.","other":"in {0} qtrs."},"past":{"one":"{0} qtr. ago","other":"{0} qtrs. ago"},"-1":"last qtr."},"month":{"0":"this month","1":"next month","future":{"one":"in {0} month","other":"in {0} months"},"past":{"one":"{0} month ago","other":"{0} months ago"},"-1":"last month"},"month-short":{"0":"this mo.","1":"next mo.","future":{"one":"in {0} mo.","other":"in {0} mo."},"past":{"one":"{0} mo. ago","other":"{0} mo. ago"},"-1":"last mo."},"month-narrow":{"0":"this mo.","1":"next mo.","future":{"one":"in {0} mo.","other":"in {0} mo."},"past":{"one":"{0} mo. ago","other":"{0} mo. ago"},"-1":"last mo."},"week":{"0":"this week","1":"next week","future":{"one":"in {0} week","other":"in {0} weeks"},"past":{"one":"{0} week ago","other":"{0} weeks ago"},"-1":"last week"},"week-short":{"0":"this wk.","1":"next wk.","future":{"one":"in {0} wk.","other":"in {0} wk."},"past":{"one":"{0} wk. ago","other":"{0} wk. ago"},"-1":"last wk."},"week-narrow":{"0":"this wk.","1":"next wk.","future":{"one":"in {0} wk.","other":"in {0} wk."},"past":{"one":"{0} wk. ago","other":"{0} wk. ago"},"-1":"last wk."},"day":{"0":"today","1":"tomorrow","future":{"one":"in {0} day","other":"in {0} days"},"past":{"one":"{0} day ago","other":"{0} days ago"},"-1":"yesterday"},"day-short":{"0":"today","1":"tomorrow","future":{"one":"in {0} day","other":"in {0} days"},"past":{"one":"{0} day ago","other":"{0} days ago"},"-1":"yesterday"},"day-narrow":{"0":"today","1":"tomorrow","future":{"one":"in {0} day","other":"in {0} days"},"past":{"one":"{0} day ago","other":"{0} days ago"},"-1":"yesterday"},"hour":{"0":"this hour","future":{"one":"in {0} hour","other":"in {0} hours"},"past":{"one":"{0} hour ago","other":"{0} hours ago"}},"hour-short":{"0":"this hour","future":{"one":"in {0} hr.","other":"in {0} hr."},"past":{"one":"{0} hr. ago","other":"{0} hr. ago"}},"hour-narrow":{"0":"this hour","future":{"one":"in {0} hr.","other":"in {0} hr."},"past":{"one":"{0} hr. ago","other":"{0} hr. ago"}},"minute":{"0":"this minute","future":{"one":"in {0} minute","other":"in {0} minutes"},"past":{"one":"{0} minute ago","other":"{0} minutes ago"}},"minute-short":{"0":"this minute","future":{"one":"in {0} min.","other":"in {0} min."},"past":{"one":"{0} min. ago","other":"{0} min. ago"}},"minute-narrow":{"0":"this minute","future":{"one":"in {0} min.","other":"in {0} min."},"past":{"one":"{0} min. ago","other":"{0} min. ago"}},"second":{"0":"now","future":{"one":"in {0} second","other":"in {0} seconds"},"past":{"one":"{0} second ago","other":"{0} seconds ago"}},"second-short":{"0":"now","future":{"one":"in {0} sec.","other":"in {0} sec."},"past":{"one":"{0} sec. ago","other":"{0} sec. ago"}},"second-narrow":{"0":"now","future":{"one":"in {0} sec.","other":"in {0} sec."},"past":{"one":"{0} sec. ago","other":"{0} sec. ago"}}}},"availableLocales":["en-001","en-150","en-AE","en-AG","en-AI","en-AS","en-AT","en-AU","en-BB","en-BE","en-BI","en-BM","en-BS","en-BW","en-BZ","en-CA","en-CC","en-CH","en-CK","en-CM","en-CX","en-CY","en-DE","en-DG","en-DK","en-DM","en-ER","en-FI","en-FJ","en-FK","en-FM","en-GB","en-GD","en-GG","en-GH","en-GI","en-GM","en-GU","en-GY","en-HK","en-IE","en-IL","en-IM","en-IN","en-IO","en-JE","en-JM","en-KE","en-KI","en-KN","en-KY","en-LC","en-LR","en-LS","en-MG","en-MH","en-MO","en-MP","en-MS","en-MT","en-MU","en-MW","en-MY","en-NA","en-NF","en-NG","en-NL","en-NR","en-NU","en-NZ","en-PG","en-PH","en-PK","en-PN","en-PR","en-PW","en-RW","en-SB","en-SC","en-SD","en-SE","en-SG","en-SH","en-SI","en-SL","en-SS","en-SX","en-SZ","en-TC","en-TK","en-TO","en-TT","en-TV","en-TZ","en-UG","en-UM","en-US-POSIX","en-US","en-VC","en-VG","en-VI","en-VU","en-WS","en-ZA","en-ZM","en-ZW","en"],"aliases":{},"parentLocales":{"en-150":"en-001","en-AG":"en-001","en-AI":"en-001","en-AU":"en-001","en-BB":"en-001","en-BM":"en-001","en-BS":"en-001","en-BW":"en-001","en-BZ":"en-001","en-CA":"en-001","en-CC":"en-001","en-CK":"en-001","en-CM":"en-001","en-CX":"en-001","en-CY":"en-001","en-DG":"en-001","en-DM":"en-001","en-ER":"en-001","en-FJ":"en-001","en-FK":"en-001","en-FM":"en-001","en-GB":"en-001","en-GD":"en-001","en-GG":"en-001","en-GH":"en-001","en-GI":"en-001","en-GM":"en-001","en-GY":"en-001","en-HK":"en-001","en-IE":"en-001","en-IL":"en-001","en-IM":"en-001","en-IN":"en-001","en-IO":"en-001","en-JE":"en-001","en-JM":"en-001","en-KE":"en-001","en-KI":"en-001","en-KN":"en-001","en-KY":"en-001","en-LC":"en-001","en-LR":"en-001","en-LS":"en-001","en-MG":"en-001","en-MO":"en-001","en-MS":"en-001","en-MT":"en-001","en-MU":"en-001","en-MW":"en-001","en-MY":"en-001","en-NA":"en-001","en-NF":"en-001","en-NG":"en-001","en-NR":"en-001","en-NU":"en-001","en-NZ":"en-001","en-PG":"en-001","en-PH":"en-001","en-PK":"en-001","en-PN":"en-001","en-PW":"en-001","en-RW":"en-001","en-SB":"en-001","en-SC":"en-001","en-SD":"en-001","en-SG":"en-001","en-SH":"en-001","en-SL":"en-001","en-SS":"en-001","en-SX":"en-001","en-SZ":"en-001","en-TC":"en-001","en-TK":"en-001","en-TO":"en-001","en-TT":"en-001","en-TV":"en-001","en-TZ":"en-001","en-UG":"en-001","en-VC":"en-001","en-VG":"en-001","en-VU":"en-001","en-WS":"en-001","en-ZA":"en-001","en-ZM":"en-001","en-ZW":"en-001","en-AT":"en-150","en-BE":"en-150","en-CH":"en-150","en-DE":"en-150","en-DK":"en-150","en-FI":"en-150","en-NL":"en-150","en-SE":"en-150","en-SI":"en-150"}}')},7684:function(I){"use strict";I.exports=JSON.parse('{"data":{"es-419":{"week-short":{"0":"esta sem.","1":"próx. sem.","future":{"one":"dentro de {0} sem.","other":"dentro de {0} sem."},"past":{"one":"hace {0} sem.","other":"hace {0} sem."},"-1":"sem. pas."},"week-narrow":{"0":"esta sem.","1":"próx. sem.","future":{"one":"dentro de {0} sem.","other":"dentro de {0} sem."},"past":{"one":"hace {0} sem.","other":"hace {0} sem."},"-1":"sem. pas."}},"es-AR":{"day-short":{"0":"hoy","1":"mañana","2":"pasado mañana","future":{"one":"dentro de {0} días","other":"dentro de {0} días"},"past":{"one":"hace {0} días","other":"hace {0} días"},"-2":"anteayer","-1":"ayer"},"day-narrow":{"0":"hoy","1":"mañana","2":"pasado mañana","future":{"one":"dentro de {0} días","other":"dentro de {0} días"},"past":{"one":"hace {0} días","other":"hace {0} días"},"-2":"anteayer","-1":"ayer"},"second-short":{"0":"ahora","future":{"one":"dentro de {0} seg.","other":"dentro de {0} seg."},"past":{"one":"hace {0} seg.","other":"hace {0} seg."}},"second-narrow":{"0":"ahora","future":{"one":"dentro de {0} seg.","other":"dentro de {0} seg."},"past":{"one":"hace {0} seg.","other":"hace {0} seg."}}},"es-MX":{"year":{"0":"este año","1":"el año próximo","future":{"one":"dentro de {0} año","other":"dentro de {0} años"},"past":{"one":"hace {0} año","other":"hace {0} años"},"-1":"el año pasado"},"year-short":{"0":"este año","1":"el próximo año","future":{"one":"en {0} a","other":"en {0} a"},"past":{"one":"hace {0} a","other":"hace {0} a"},"-1":"el año pasado"},"year-narrow":{"0":"este año","1":"el próximo año","future":{"one":"en {0} a","other":"en {0} a"},"past":{"one":"-{0} a","other":"-{0} a"},"-1":"el año pasado"},"quarter":{"0":"este trimestre","1":"el próximo trimestre","future":{"one":"en {0} trimestre","other":"dentro de {0} trimetres"},"past":{"one":"hace {0} trimestre","other":"hace {0} trimestres"},"-1":"el trimestre pasado"},"quarter-short":{"0":"este trimestre","1":"el próximo trimestre","future":{"one":"en {0} trim.","other":"en {0} trim"},"past":{"one":"hace {0} trim.","other":"hace {0} trim."},"-1":"el trimestre pasado"},"quarter-narrow":{"0":"este trimestre","1":"el próximo trimestre","future":{"one":"en {0} trim.","other":"en {0} trim."},"past":{"one":"-{0} T","other":"-{0} T"},"-1":"el trimestre pasado"},"month":{"0":"este mes","1":"el mes próximo","future":{"one":"en {0} mes","other":"en {0} meses"},"past":{"one":"hace {0} mes","other":"hace {0} meses"},"-1":"el mes pasado"},"month-short":{"0":"este mes","1":"el próximo mes","future":{"one":"en {0} m","other":"en {0} m"},"past":{"one":"hace {0} m","other":"hace {0} m"},"-1":"el mes pasado"},"month-narrow":{"0":"este mes","1":"el próximo mes","future":{"one":"+{0} m","other":"+{0} m"},"past":{"one":"-{0} m","other":"-{0} m"},"-1":"el mes pasado"},"week":{"0":"esta semana","1":"la semana próxima","future":{"one":"dentro de {0} semana","other":"dentro de {0} semanas"},"past":{"one":"hace {0} semana","other":"hace {0} semanas"},"-1":"la semana pasada"},"week-short":{"0":"esta sem.","1":"próx. sem.","future":{"one":"en {0} sem.","other":"en {0} sem."},"past":{"one":"hace {0} sem.","other":"hace {0} sem."},"-1":"sem. pas."},"day-short":{"0":"hoy","1":"mañana","2":"pasado mañana","future":{"one":"en {0} día","other":"en {0} días"},"past":{"one":"hace {0} día","other":"hace {0} días"},"-2":"anteayer","-1":"ayer"},"day-narrow":{"0":"hoy","1":"mañana","2":"pasado mañana","future":{"one":"+{0} día","other":"en {0} días"},"past":{"one":"hace {0} día","other":"hace {0} días"},"-2":"anteayer","-1":"ayer"},"hour-short":{"0":"esta hora","future":{"one":"en {0} h","other":"en {0} n"},"past":{"one":"hace {0} h","other":"hace {0} h"}},"minute-short":{"0":"este minuto","future":{"one":"en {0} min","other":"en {0} min"},"past":{"one":"hace {0} min","other":"hace {0} min"}},"minute-narrow":{"0":"este minuto","future":{"one":"en {0} min","other":"en {0} min"},"past":{"one":"hace {0} min","other":"hace {0} min"}},"second-short":{"0":"ahora","future":{"one":"en {0} s","other":"en {0} s"},"past":{"one":"hace {0} s","other":"hace {0} s"}},"second-narrow":{"0":"ahora","future":{"one":"+{0} s","other":"+{0} s"},"past":{"one":"hace {0} s","other":"hace {0} s"}}},"es-PY":{"second-short":{"0":"ahora","future":{"one":"dentro de {0} seg.","other":"dentro de {0} seg."},"past":{"one":"hace {0} seg.","other":"hace {0} seg."}},"second-narrow":{"0":"ahora","future":{"one":"dentro de {0} seg.","other":"dentro de {0} seg."},"past":{"one":"hace {0} seg.","other":"hace {0} seg."}}},"es-SV":{"day":{"0":"hoy","1":"mañana","2":"pasado mañana","future":{"one":"dentro de {0} día","other":"dentro de {0} días"},"past":{"one":"hace {0} día","other":"hace {0} días"},"-2":"antier","-1":"ayer"}},"es-US":{"year":{"0":"este año","1":"el año próximo","future":{"one":"dentro de {0} año","other":"dentro de {0} años"},"past":{"one":"hace {0} año","other":"hace {0} años"},"-1":"el año pasado"},"quarter":{"0":"este trimestre","1":"el próximo trimestre","future":{"one":"dentro de {0} trimetre","other":"dentro de {0} trimetres"},"past":{"one":"hace {0} trimestre","other":"hace {0} trimestres"},"-1":"el trimestre pasado"},"month":{"0":"este mes","1":"el mes próximo","future":{"one":"dentro de {0} mes","other":"dentro de {0} meses"},"past":{"one":"hace {0} mes","other":"hace {0} meses"},"-1":"el mes pasado"},"week":{"0":"esta semana","1":"la semana próxima","future":{"one":"dentro de {0} semana","other":"dentro de {0} semanas"},"past":{"one":"hace {0} semana","other":"hace {0} semanas"},"-1":"la semana pasada"}},"es":{"nu":["latn"],"year":{"0":"este año","1":"el próximo año","future":{"one":"dentro de {0} año","other":"dentro de {0} años"},"past":{"one":"hace {0} año","other":"hace {0} años"},"-1":"el año pasado"},"year-short":{"0":"este año","1":"el próximo año","future":{"one":"dentro de {0} a","other":"dentro de {0} a"},"past":{"one":"hace {0} a","other":"hace {0} a"},"-1":"el año pasado"},"year-narrow":{"0":"este año","1":"el próximo año","future":{"one":"dentro de {0} a","other":"dentro de {0} a"},"past":{"one":"hace {0} a","other":"hace {0} a"},"-1":"el año pasado"},"quarter":{"0":"este trimestre","1":"el próximo trimestre","future":{"one":"dentro de {0} trimestre","other":"dentro de {0} trimestres"},"past":{"one":"hace {0} trimestre","other":"hace {0} trimestres"},"-1":"el trimestre pasado"},"quarter-short":{"0":"este trimestre","1":"el próximo trimestre","future":{"one":"dentro de {0} trim.","other":"dentro de {0} trim."},"past":{"one":"hace {0} trim.","other":"hace {0} trim."},"-1":"el trimestre pasado"},"quarter-narrow":{"0":"este trimestre","1":"el próximo trimestre","future":{"one":"dentro de {0} trim.","other":"dentro de {0} trim."},"past":{"one":"hace {0} trim.","other":"hace {0} trim."},"-1":"el trimestre pasado"},"month":{"0":"este mes","1":"el próximo mes","future":{"one":"dentro de {0} mes","other":"dentro de {0} meses"},"past":{"one":"hace {0} mes","other":"hace {0} meses"},"-1":"el mes pasado"},"month-short":{"0":"este mes","1":"el próximo mes","future":{"one":"dentro de {0} m","other":"dentro de {0} m"},"past":{"one":"hace {0} m","other":"hace {0} m"},"-1":"el mes pasado"},"month-narrow":{"0":"este mes","1":"el próximo mes","future":{"one":"dentro de {0} m","other":"dentro de {0} m"},"past":{"one":"hace {0} m","other":"hace {0} m"},"-1":"el mes pasado"},"week":{"0":"esta semana","1":"la próxima semana","future":{"one":"dentro de {0} semana","other":"dentro de {0} semanas"},"past":{"one":"hace {0} semana","other":"hace {0} semanas"},"-1":"la semana pasada"},"week-short":{"0":"esta sem.","1":"próx. sem.","future":{"one":"dentro de {0} sem.","other":"dentro de {0} sem."},"past":{"one":"hace {0} sem.","other":"hace {0} sem."},"-1":"sem. ant."},"week-narrow":{"0":"esta sem.","1":"próx. sem.","future":{"one":"dentro de {0} sem.","other":"dentro de {0} sem."},"past":{"one":"hace {0} sem.","other":"hace {0} sem."},"-1":"sem. ant."},"day":{"0":"hoy","1":"mañana","2":"pasado mañana","future":{"one":"dentro de {0} día","other":"dentro de {0} días"},"past":{"one":"hace {0} día","other":"hace {0} días"},"-2":"anteayer","-1":"ayer"},"day-short":{"0":"hoy","1":"mañana","2":"pasado mañana","future":{"one":"dentro de {0} día","other":"dentro de {0} días"},"past":{"one":"hace {0} día","other":"hace {0} días"},"-2":"anteayer","-1":"ayer"},"day-narrow":{"0":"hoy","1":"mañana","2":"pasado mañana","future":{"one":"dentro de {0} día","other":"dentro de {0} días"},"past":{"one":"hace {0} día","other":"hace {0} días"},"-2":"anteayer","-1":"ayer"},"hour":{"0":"esta hora","future":{"one":"dentro de {0} hora","other":"dentro de {0} horas"},"past":{"one":"hace {0} hora","other":"hace {0} horas"}},"hour-short":{"0":"esta hora","future":{"one":"dentro de {0} h","other":"dentro de {0} h"},"past":{"one":"hace {0} h","other":"hace {0} h"}},"hour-narrow":{"0":"esta hora","future":{"one":"dentro de {0} h","other":"dentro de {0} h"},"past":{"one":"hace {0} h","other":"hace {0} h"}},"minute":{"0":"este minuto","future":{"one":"dentro de {0} minuto","other":"dentro de {0} minutos"},"past":{"one":"hace {0} minuto","other":"hace {0} minutos"}},"minute-short":{"0":"este minuto","future":{"one":"dentro de {0} min","other":"dentro de {0} min"},"past":{"one":"hace {0} min","other":"hace {0} min"}},"minute-narrow":{"0":"este minuto","future":{"one":"dentro de {0} min","other":"dentro de {0} min"},"past":{"one":"hace {0} min","other":"hace {0} min"}},"second":{"0":"ahora","future":{"one":"dentro de {0} segundo","other":"dentro de {0} segundos"},"past":{"one":"hace {0} segundo","other":"hace {0} segundos"}},"second-short":{"0":"ahora","future":{"one":"dentro de {0} s","other":"dentro de {0} s"},"past":{"one":"hace {0} s","other":"hace {0} s"}},"second-narrow":{"0":"ahora","future":{"one":"dentro de {0} s","other":"dentro de {0} s"},"past":{"one":"hace {0} s","other":"hace {0} s"}}}},"availableLocales":["es-419","es-AR","es-BO","es-BR","es-BZ","es-CL","es-CO","es-CR","es-CU","es-DO","es-EA","es-EC","es-GQ","es-GT","es-HN","es-IC","es-MX","es-NI","es-PA","es-PE","es-PH","es-PR","es-PY","es-SV","es-US","es-UY","es-VE","es"],"aliases":{},"parentLocales":{"es-AR":"es-419","es-BO":"es-419","es-BR":"es-419","es-BZ":"es-419","es-CL":"es-419","es-CO":"es-419","es-CR":"es-419","es-CU":"es-419","es-DO":"es-419","es-EC":"es-419","es-GT":"es-419","es-HN":"es-419","es-MX":"es-419","es-NI":"es-419","es-PA":"es-419","es-PE":"es-419","es-PR":"es-419","es-PY":"es-419","es-SV":"es-419","es-US":"es-419","es-UY":"es-419","es-VE":"es-419"}}')},8385:function(I){"use strict";I.exports=JSON.parse('{"data":{"ses":{"nu":["latn"],"year":{"0":"this year","1":"next year","future":{"other":"+{0} y"},"past":{"other":"-{0} y"},"-1":"last year"},"year-short":{"0":"this year","1":"next year","future":{"other":"+{0} y"},"past":{"other":"-{0} y"},"-1":"last year"},"year-narrow":{"0":"this year","1":"next year","future":{"other":"+{0} y"},"past":{"other":"-{0} y"},"-1":"last year"},"quarter":{"0":"this quarter","1":"next quarter","future":{"other":"+{0} Q"},"past":{"other":"-{0} Q"},"-1":"last quarter"},"quarter-short":{"0":"this quarter","1":"next quarter","future":{"other":"+{0} Q"},"past":{"other":"-{0} Q"},"-1":"last quarter"},"quarter-narrow":{"0":"this quarter","1":"next quarter","future":{"other":"+{0} Q"},"past":{"other":"-{0} Q"},"-1":"last quarter"},"month":{"0":"this month","1":"next month","future":{"other":"+{0} m"},"past":{"other":"-{0} m"},"-1":"last month"},"month-short":{"0":"this month","1":"next month","future":{"other":"+{0} m"},"past":{"other":"-{0} m"},"-1":"last month"},"month-narrow":{"0":"this month","1":"next month","future":{"other":"+{0} m"},"past":{"other":"-{0} m"},"-1":"last month"},"week":{"0":"this week","1":"next week","future":{"other":"+{0} w"},"past":{"other":"-{0} w"},"-1":"last week"},"week-short":{"0":"this week","1":"next week","future":{"other":"+{0} w"},"past":{"other":"-{0} w"},"-1":"last week"},"week-narrow":{"0":"this week","1":"next week","future":{"other":"+{0} w"},"past":{"other":"-{0} w"},"-1":"last week"},"day":{"0":"Hõo","1":"Suba","future":{"other":"+{0} d"},"past":{"other":"-{0} d"},"-1":"Bi"},"day-short":{"0":"Hõo","1":"Suba","future":{"other":"+{0} d"},"past":{"other":"-{0} d"},"-1":"Bi"},"day-narrow":{"0":"Hõo","1":"Suba","future":{"other":"+{0} d"},"past":{"other":"-{0} d"},"-1":"Bi"},"hour":{"0":"this hour","future":{"other":"+{0} h"},"past":{"other":"-{0} h"}},"hour-short":{"0":"this hour","future":{"other":"+{0} h"},"past":{"other":"-{0} h"}},"hour-narrow":{"0":"this hour","future":{"other":"+{0} h"},"past":{"other":"-{0} h"}},"minute":{"0":"this minute","future":{"other":"+{0} min"},"past":{"other":"-{0} min"}},"minute-short":{"0":"this minute","future":{"other":"+{0} min"},"past":{"other":"-{0} min"}},"minute-narrow":{"0":"this minute","future":{"other":"+{0} min"},"past":{"other":"-{0} min"}},"second":{"0":"now","future":{"other":"+{0} s"},"past":{"other":"-{0} s"}},"second-short":{"0":"now","future":{"other":"+{0} s"},"past":{"other":"-{0} s"}},"second-narrow":{"0":"now","future":{"other":"+{0} s"},"past":{"other":"-{0} s"}}}},"availableLocales":["ses"],"aliases":{},"parentLocales":{}}')},1666:function(I,g,n){var C={"./en":8079,"./en.js":8079,"./en.json":7991,"./es":4033,"./es.js":4033,"./es.json":7684,"./ses":9584,"./ses.js":9584,"./ses.json":8385};function c(I){var g=e(I);return n(g)}function e(I){if(!n.o(C,I)){var g=new Error("Cannot find module '"+I+"'");throw g.code="MODULE_NOT_FOUND",g}return C[I]}c.keys=function(){return Object.keys(C)},c.resolve=e,I.exports=c,c.id=1666},3012:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("\n\nvar __spreadArrays = this && this.__spreadArrays || function () {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) {\n s += arguments[i].length;\n }\n\n for (var r = Array(s), k = 0, i = 0; i < il; i++) {\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) {\n r[k] = a[j];\n }\n }\n\n return r;\n};\n\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\n\nvar intl_utils_1 = __webpack_require__(2650);\n\nfunction validateInstance(instance, method) {\n if (!(instance instanceof PluralRules)) {\n throw new TypeError(\"Method Intl.PluralRules.prototype.\" + method + \" called on incompatible receiver \" + String(instance));\n }\n}\n/**\n * https://tc39.es/ecma402/#sec-torawprecision\n * @param x\n * @param minPrecision\n * @param maxPrecision\n */\n\n\nfunction toRawPrecision(x, minPrecision, maxPrecision) {\n var m = x.toPrecision(maxPrecision);\n\n if (~m.indexOf('.') && maxPrecision > minPrecision) {\n var cut = maxPrecision - minPrecision;\n\n while (cut > 0 && m[m.length - 1] === '0') {\n m = m.slice(0, m.length - 1);\n cut--;\n }\n\n if (m[m.length - 1] === '.') {\n return m.slice(0, m.length - 1);\n }\n }\n\n return m;\n}\n/**\n * https://tc39.es/ecma402/#sec-torawfixed\n * @param x\n * @param minInteger\n * @param minFraction\n * @param maxFraction\n */\n\n\nfunction toRawFixed(x, minInteger, minFraction, maxFraction) {\n var cut = maxFraction - minFraction;\n var m = x.toFixed(maxFraction);\n\n while (cut > 0 && m[m.length - 1] === '0') {\n m = m.slice(0, m.length - 1);\n cut--;\n }\n\n if (m[m.length - 1] === '.') {\n m = m.slice(0, m.length - 1);\n }\n\n var int = m.split('.')[0].length;\n\n if (int < minInteger) {\n var z = '';\n\n for (; z.length < minInteger - int; z += '0') {\n ;\n }\n\n m = z + m;\n }\n\n return m;\n}\n\nfunction formatNumericToString(internalSlotMap, pl, x) {\n var minimumSignificantDigits = intl_utils_1.getInternalSlot(internalSlotMap, pl, 'minimumSignificantDigits');\n var maximumSignificantDigits = intl_utils_1.getInternalSlot(internalSlotMap, pl, 'maximumSignificantDigits');\n\n if (minimumSignificantDigits !== undefined && maximumSignificantDigits !== undefined) {\n return toRawPrecision(x, minimumSignificantDigits, maximumSignificantDigits);\n }\n\n return toRawFixed(x, intl_utils_1.getInternalSlot(internalSlotMap, pl, 'minimumIntegerDigits'), intl_utils_1.getInternalSlot(internalSlotMap, pl, 'minimumFractionDigits'), intl_utils_1.getInternalSlot(internalSlotMap, pl, 'maximumFractionDigits'));\n}\n\nvar PluralRules =\n/** @class */\nfunction () {\n function PluralRules(locales, options) {\n // test262/test/intl402/RelativeTimeFormat/constructor/constructor/newtarget-undefined.js\n // Cannot use `new.target` bc of IE11 & TS transpiles it to something else\n var newTarget = this && this instanceof PluralRules ? this.constructor : void 0;\n\n if (!newTarget) {\n throw new TypeError(\"Intl.PluralRules must be called with 'new'\");\n }\n\n var requestedLocales = intl_utils_1.getCanonicalLocales(locales);\n var opt = Object.create(null);\n var opts = options === undefined ? Object.create(null) : intl_utils_1.toObject(options);\n intl_utils_1.setInternalSlot(PluralRules.__INTERNAL_SLOT_MAP__, this, 'initializedPluralRules', true);\n var matcher = intl_utils_1.getOption(opts, 'localeMatcher', 'string', ['best fit', 'lookup'], 'best fit');\n opt.localeMatcher = matcher;\n intl_utils_1.setInternalSlot(PluralRules.__INTERNAL_SLOT_MAP__, this, 'type', intl_utils_1.getOption(opts, 'type', 'string', ['cardinal', 'ordinal'], 'cardinal'));\n intl_utils_1.setNumberFormatDigitOptions(PluralRules.__INTERNAL_SLOT_MAP__, this, opts, 0, 3);\n var r = intl_utils_1.createResolveLocale(PluralRules.getDefaultLocale)(PluralRules.availableLocales, requestedLocales, opt, PluralRules.relevantExtensionKeys, PluralRules.localeData);\n intl_utils_1.setInternalSlot(PluralRules.__INTERNAL_SLOT_MAP__, this, 'locale', r.locale);\n }\n\n PluralRules.prototype.resolvedOptions = function () {\n var _this = this;\n\n validateInstance(this, 'resolvedOptions');\n var opts = Object.create(null);\n opts.locale = intl_utils_1.getInternalSlot(PluralRules.__INTERNAL_SLOT_MAP__, this, 'locale');\n opts.type = intl_utils_1.getInternalSlot(PluralRules.__INTERNAL_SLOT_MAP__, this, 'type');\n ['minimumIntegerDigits', 'minimumFractionDigits', 'maximumFractionDigits', 'minimumSignificantDigits', 'maximumSignificantDigits'].forEach(function (field) {\n var val = intl_utils_1.getInternalSlot(PluralRules.__INTERNAL_SLOT_MAP__, _this, field);\n\n if (val !== undefined) {\n opts[field] = val;\n }\n });\n opts.pluralCategories = __spreadArrays(PluralRules.localeData[opts.locale].categories[opts.type]);\n return opts;\n };\n\n PluralRules.prototype.select = function (val) {\n validateInstance(this, 'select');\n var locale = intl_utils_1.getInternalSlot(PluralRules.__INTERNAL_SLOT_MAP__, this, 'locale');\n var type = intl_utils_1.getInternalSlot(PluralRules.__INTERNAL_SLOT_MAP__, this, 'type');\n return PluralRules.localeData[locale].fn(formatNumericToString(PluralRules.__INTERNAL_SLOT_MAP__, this, Math.abs(Number(val))), type == 'ordinal');\n };\n\n PluralRules.prototype.toString = function () {\n return '[object Intl.PluralRules]';\n };\n\n PluralRules.supportedLocalesOf = function (locales, options) {\n return intl_utils_1.supportedLocales(PluralRules.availableLocales, intl_utils_1.getCanonicalLocales(locales), options);\n };\n\n PluralRules.__addLocaleData = function () {\n var data = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n data[_i] = arguments[_i];\n }\n\n var _loop_1 = function _loop_1(datum) {\n var availableLocales = Object.keys(__spreadArrays(datum.availableLocales, Object.keys(datum.aliases), Object.keys(datum.parentLocales)).reduce(function (all, k) {\n all[k] = true;\n return all;\n }, {}));\n availableLocales.forEach(function (locale) {\n try {\n PluralRules.localeData[locale] = intl_utils_1.unpackData(locale, datum);\n } catch (e) {\n if (intl_utils_1.isMissingLocaleDataError(e)) {\n // If we just don't have data for certain locale, that's ok\n return;\n }\n\n throw e;\n }\n });\n };\n\n for (var _a = 0, data_1 = data; _a < data_1.length; _a++) {\n var datum = data_1[_a];\n\n _loop_1(datum);\n }\n\n PluralRules.availableLocales = Object.keys(PluralRules.localeData);\n\n if (!PluralRules.__defaultLocale) {\n PluralRules.__defaultLocale = PluralRules.availableLocales[0];\n }\n };\n\n PluralRules.getDefaultLocale = function () {\n return PluralRules.__defaultLocale;\n };\n\n PluralRules.localeData = {};\n PluralRules.availableLocales = [];\n PluralRules.__defaultLocale = 'en';\n PluralRules.relevantExtensionKeys = [];\n PluralRules.polyfilled = true;\n PluralRules.__INTERNAL_SLOT_MAP__ = new WeakMap();\n return PluralRules;\n}();\n\nexports.PluralRules = PluralRules;\n\ntry {\n // https://github.com/tc39/test262/blob/master/test/intl402/PluralRules/length.js\n Object.defineProperty(PluralRules, 'length', {\n value: 0,\n writable: false,\n enumerable: false,\n configurable: true\n }); // https://github.com/tc39/test262/blob/master/test/intl402/RelativeTimeFormat/constructor/length.js\n\n Object.defineProperty(PluralRules.prototype.constructor, 'length', {\n value: 0,\n writable: false,\n enumerable: false,\n configurable: true\n }); // https://github.com/tc39/test262/blob/master/test/intl402/RelativeTimeFormat/constructor/supportedLocalesOf/length.js\n\n Object.defineProperty(PluralRules.supportedLocalesOf, 'length', {\n value: 1,\n writable: false,\n enumerable: false,\n configurable: true\n });\n} catch (ex) {// Meta fixes for test262\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZm9ybWF0anMvaW50bC1wbHVyYWxydWxlcy9kaXN0L2NvcmUuanM/NjIxMiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBLCtDQUErQyxRQUFRO0FBQ3ZEO0FBQ0E7O0FBRUEsc0NBQXNDLFFBQVE7QUFDOUMsb0RBQW9ELFFBQVE7QUFDNUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsOENBQTZDO0FBQzdDO0FBQ0EsQ0FBQyxFQUFDOztBQUVGLG1CQUFtQixtQkFBTyxDQUFDLElBQXNCOztBQUVqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUEsVUFBVSw2QkFBNkI7QUFDdkM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxvQkFBb0IsdUJBQXVCO0FBQzNDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLElBQUk7QUFDWDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQSxtQ0FBbUMsb0JBQW9CO0FBQ3ZEOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRCxtQkFBbUI7O0FBRW5CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyxFQUFFOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLEVBQUU7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDLGFBQWE7QUFDZCIsImZpbGUiOiIzMDEyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfX3NwcmVhZEFycmF5cyA9IHRoaXMgJiYgdGhpcy5fX3NwcmVhZEFycmF5cyB8fCBmdW5jdGlvbiAoKSB7XG4gIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykge1xuICAgIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcbiAgfVxuXG4gIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKykge1xuICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKSB7XG4gICAgICByW2tdID0gYVtqXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcjtcbn07XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBpbnRsX3V0aWxzXzEgPSByZXF1aXJlKFwiQGZvcm1hdGpzL2ludGwtdXRpbHNcIik7XG5cbmZ1bmN0aW9uIHZhbGlkYXRlSW5zdGFuY2UoaW5zdGFuY2UsIG1ldGhvZCkge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIFBsdXJhbFJ1bGVzKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJNZXRob2QgSW50bC5QbHVyYWxSdWxlcy5wcm90b3R5cGUuXCIgKyBtZXRob2QgKyBcIiBjYWxsZWQgb24gaW5jb21wYXRpYmxlIHJlY2VpdmVyIFwiICsgU3RyaW5nKGluc3RhbmNlKSk7XG4gIH1cbn1cbi8qKlxuICogaHR0cHM6Ly90YzM5LmVzL2VjbWE0MDIvI3NlYy10b3Jhd3ByZWNpc2lvblxuICogQHBhcmFtIHhcbiAqIEBwYXJhbSBtaW5QcmVjaXNpb25cbiAqIEBwYXJhbSBtYXhQcmVjaXNpb25cbiAqL1xuXG5cbmZ1bmN0aW9uIHRvUmF3UHJlY2lzaW9uKHgsIG1pblByZWNpc2lvbiwgbWF4UHJlY2lzaW9uKSB7XG4gIHZhciBtID0geC50b1ByZWNpc2lvbihtYXhQcmVjaXNpb24pO1xuXG4gIGlmICh+bS5pbmRleE9mKCcuJykgJiYgbWF4UHJlY2lzaW9uID4gbWluUHJlY2lzaW9uKSB7XG4gICAgdmFyIGN1dCA9IG1heFByZWNpc2lvbiAtIG1pblByZWNpc2lvbjtcblxuICAgIHdoaWxlIChjdXQgPiAwICYmIG1bbS5sZW5ndGggLSAxXSA9PT0gJzAnKSB7XG4gICAgICBtID0gbS5zbGljZSgwLCBtLmxlbmd0aCAtIDEpO1xuICAgICAgY3V0LS07XG4gICAgfVxuXG4gICAgaWYgKG1bbS5sZW5ndGggLSAxXSA9PT0gJy4nKSB7XG4gICAgICByZXR1cm4gbS5zbGljZSgwLCBtLmxlbmd0aCAtIDEpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtO1xufVxuLyoqXG4gKiBodHRwczovL3RjMzkuZXMvZWNtYTQwMi8jc2VjLXRvcmF3Zml4ZWRcbiAqIEBwYXJhbSB4XG4gKiBAcGFyYW0gbWluSW50ZWdlclxuICogQHBhcmFtIG1pbkZyYWN0aW9uXG4gKiBAcGFyYW0gbWF4RnJhY3Rpb25cbiAqL1xuXG5cbmZ1bmN0aW9uIHRvUmF3Rml4ZWQoeCwgbWluSW50ZWdlciwgbWluRnJhY3Rpb24sIG1heEZyYWN0aW9uKSB7XG4gIHZhciBjdXQgPSBtYXhGcmFjdGlvbiAtIG1pbkZyYWN0aW9uO1xuICB2YXIgbSA9IHgudG9GaXhlZChtYXhGcmFjdGlvbik7XG5cbiAgd2hpbGUgKGN1dCA+IDAgJiYgbVttLmxlbmd0aCAtIDFdID09PSAnMCcpIHtcbiAgICBtID0gbS5zbGljZSgwLCBtLmxlbmd0aCAtIDEpO1xuICAgIGN1dC0tO1xuICB9XG5cbiAgaWYgKG1bbS5sZW5ndGggLSAxXSA9PT0gJy4nKSB7XG4gICAgbSA9IG0uc2xpY2UoMCwgbS5sZW5ndGggLSAxKTtcbiAgfVxuXG4gIHZhciBpbnQgPSBtLnNwbGl0KCcuJylbMF0ubGVuZ3RoO1xuXG4gIGlmIChpbnQgPCBtaW5JbnRlZ2VyKSB7XG4gICAgdmFyIHogPSAnJztcblxuICAgIGZvciAoOyB6Lmxlbmd0aCA8IG1pbkludGVnZXIgLSBpbnQ7IHogKz0gJzAnKSB7XG4gICAgICA7XG4gICAgfVxuXG4gICAgbSA9IHogKyBtO1xuICB9XG5cbiAgcmV0dXJuIG07XG59XG5cbmZ1bmN0aW9uIGZvcm1hdE51bWVyaWNUb1N0cmluZyhpbnRlcm5hbFNsb3RNYXAsIHBsLCB4KSB7XG4gIHZhciBtaW5pbXVtU2lnbmlmaWNhbnREaWdpdHMgPSBpbnRsX3V0aWxzXzEuZ2V0SW50ZXJuYWxTbG90KGludGVybmFsU2xvdE1hcCwgcGwsICdtaW5pbXVtU2lnbmlmaWNhbnREaWdpdHMnKTtcbiAgdmFyIG1heGltdW1TaWduaWZpY2FudERpZ2l0cyA9IGludGxfdXRpbHNfMS5nZXRJbnRlcm5hbFNsb3QoaW50ZXJuYWxTbG90TWFwLCBwbCwgJ21heGltdW1TaWduaWZpY2FudERpZ2l0cycpO1xuXG4gIGlmIChtaW5pbXVtU2lnbmlmaWNhbnREaWdpdHMgIT09IHVuZGVmaW5lZCAmJiBtYXhpbXVtU2lnbmlmaWNhbnREaWdpdHMgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB0b1Jhd1ByZWNpc2lvbih4LCBtaW5pbXVtU2lnbmlmaWNhbnREaWdpdHMsIG1heGltdW1TaWduaWZpY2FudERpZ2l0cyk7XG4gIH1cblxuICByZXR1cm4gdG9SYXdGaXhlZCh4LCBpbnRsX3V0aWxzXzEuZ2V0SW50ZXJuYWxTbG90KGludGVybmFsU2xvdE1hcCwgcGwsICdtaW5pbXVtSW50ZWdlckRpZ2l0cycpLCBpbnRsX3V0aWxzXzEuZ2V0SW50ZXJuYWxTbG90KGludGVybmFsU2xvdE1hcCwgcGwsICdtaW5pbXVtRnJhY3Rpb25EaWdpdHMnKSwgaW50bF91dGlsc18xLmdldEludGVybmFsU2xvdChpbnRlcm5hbFNsb3RNYXAsIHBsLCAnbWF4aW11bUZyYWN0aW9uRGlnaXRzJykpO1xufVxuXG52YXIgUGx1cmFsUnVsZXMgPVxuLyoqIEBjbGFzcyAqL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBQbHVyYWxSdWxlcyhsb2NhbGVzLCBvcHRpb25zKSB7XG4gICAgLy8gdGVzdDI2Mi90ZXN0L2ludGw0MDIvUmVsYXRpdmVUaW1lRm9ybWF0L2NvbnN0cnVjdG9yL2NvbnN0cnVjdG9yL25ld3RhcmdldC11bmRlZmluZWQuanNcbiAgICAvLyBDYW5ub3QgdXNlIGBuZXcudGFyZ2V0YCBiYyBvZiBJRTExICYgVFMgdHJhbnNwaWxlcyBpdCB0byBzb21ldGhpbmcgZWxzZVxuICAgIHZhciBuZXdUYXJnZXQgPSB0aGlzICYmIHRoaXMgaW5zdGFuY2VvZiBQbHVyYWxSdWxlcyA/IHRoaXMuY29uc3RydWN0b3IgOiB2b2lkIDA7XG5cbiAgICBpZiAoIW5ld1RhcmdldCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludGwuUGx1cmFsUnVsZXMgbXVzdCBiZSBjYWxsZWQgd2l0aCAnbmV3J1wiKTtcbiAgICB9XG5cbiAgICB2YXIgcmVxdWVzdGVkTG9jYWxlcyA9IGludGxfdXRpbHNfMS5nZXRDYW5vbmljYWxMb2NhbGVzKGxvY2FsZXMpO1xuICAgIHZhciBvcHQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHZhciBvcHRzID0gb3B0aW9ucyA9PT0gdW5kZWZpbmVkID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IGludGxfdXRpbHNfMS50b09iamVjdChvcHRpb25zKTtcbiAgICBpbnRsX3V0aWxzXzEuc2V0SW50ZXJuYWxTbG90KFBsdXJhbFJ1bGVzLl9fSU5URVJOQUxfU0xPVF9NQVBfXywgdGhpcywgJ2luaXRpYWxpemVkUGx1cmFsUnVsZXMnLCB0cnVlKTtcbiAgICB2YXIgbWF0Y2hlciA9IGludGxfdXRpbHNfMS5nZXRPcHRpb24ob3B0cywgJ2xvY2FsZU1hdGNoZXInLCAnc3RyaW5nJywgWydiZXN0IGZpdCcsICdsb29rdXAnXSwgJ2Jlc3QgZml0Jyk7XG4gICAgb3B0LmxvY2FsZU1hdGNoZXIgPSBtYXRjaGVyO1xuICAgIGludGxfdXRpbHNfMS5zZXRJbnRlcm5hbFNsb3QoUGx1cmFsUnVsZXMuX19JTlRFUk5BTF9TTE9UX01BUF9fLCB0aGlzLCAndHlwZScsIGludGxfdXRpbHNfMS5nZXRPcHRpb24ob3B0cywgJ3R5cGUnLCAnc3RyaW5nJywgWydjYXJkaW5hbCcsICdvcmRpbmFsJ10sICdjYXJkaW5hbCcpKTtcbiAgICBpbnRsX3V0aWxzXzEuc2V0TnVtYmVyRm9ybWF0RGlnaXRPcHRpb25zKFBsdXJhbFJ1bGVzLl9fSU5URVJOQUxfU0xPVF9NQVBfXywgdGhpcywgb3B0cywgMCwgMyk7XG4gICAgdmFyIHIgPSBpbnRsX3V0aWxzXzEuY3JlYXRlUmVzb2x2ZUxvY2FsZShQbHVyYWxSdWxlcy5nZXREZWZhdWx0TG9jYWxlKShQbHVyYWxSdWxlcy5hdmFpbGFibGVMb2NhbGVzLCByZXF1ZXN0ZWRMb2NhbGVzLCBvcHQsIFBsdXJhbFJ1bGVzLnJlbGV2YW50RXh0ZW5zaW9uS2V5cywgUGx1cmFsUnVsZXMubG9jYWxlRGF0YSk7XG4gICAgaW50bF91dGlsc18xLnNldEludGVybmFsU2xvdChQbHVyYWxSdWxlcy5fX0lOVEVSTkFMX1NMT1RfTUFQX18sIHRoaXMsICdsb2NhbGUnLCByLmxvY2FsZSk7XG4gIH1cblxuICBQbHVyYWxSdWxlcy5wcm90b3R5cGUucmVzb2x2ZWRPcHRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YWxpZGF0ZUluc3RhbmNlKHRoaXMsICdyZXNvbHZlZE9wdGlvbnMnKTtcbiAgICB2YXIgb3B0cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgb3B0cy5sb2NhbGUgPSBpbnRsX3V0aWxzXzEuZ2V0SW50ZXJuYWxTbG90KFBsdXJhbFJ1bGVzLl9fSU5URVJOQUxfU0xPVF9NQVBfXywgdGhpcywgJ2xvY2FsZScpO1xuICAgIG9wdHMudHlwZSA9IGludGxfdXRpbHNfMS5nZXRJbnRlcm5hbFNsb3QoUGx1cmFsUnVsZXMuX19JTlRFUk5BTF9TTE9UX01BUF9fLCB0aGlzLCAndHlwZScpO1xuICAgIFsnbWluaW11bUludGVnZXJEaWdpdHMnLCAnbWluaW11bUZyYWN0aW9uRGlnaXRzJywgJ21heGltdW1GcmFjdGlvbkRpZ2l0cycsICdtaW5pbXVtU2lnbmlmaWNhbnREaWdpdHMnLCAnbWF4aW11bVNpZ25pZmljYW50RGlnaXRzJ10uZm9yRWFjaChmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgIHZhciB2YWwgPSBpbnRsX3V0aWxzXzEuZ2V0SW50ZXJuYWxTbG90KFBsdXJhbFJ1bGVzLl9fSU5URVJOQUxfU0xPVF9NQVBfXywgX3RoaXMsIGZpZWxkKTtcblxuICAgICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdHNbZmllbGRdID0gdmFsO1xuICAgICAgfVxuICAgIH0pO1xuICAgIG9wdHMucGx1cmFsQ2F0ZWdvcmllcyA9IF9fc3ByZWFkQXJyYXlzKFBsdXJhbFJ1bGVzLmxvY2FsZURhdGFbb3B0cy5sb2NhbGVdLmNhdGVnb3JpZXNbb3B0cy50eXBlXSk7XG4gICAgcmV0dXJuIG9wdHM7XG4gIH07XG5cbiAgUGx1cmFsUnVsZXMucHJvdG90eXBlLnNlbGVjdCA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICB2YWxpZGF0ZUluc3RhbmNlKHRoaXMsICdzZWxlY3QnKTtcbiAgICB2YXIgbG9jYWxlID0gaW50bF91dGlsc18xLmdldEludGVybmFsU2xvdChQbHVyYWxSdWxlcy5fX0lOVEVSTkFMX1NMT1RfTUFQX18sIHRoaXMsICdsb2NhbGUnKTtcbiAgICB2YXIgdHlwZSA9IGludGxfdXRpbHNfMS5nZXRJbnRlcm5hbFNsb3QoUGx1cmFsUnVsZXMuX19JTlRFUk5BTF9TTE9UX01BUF9fLCB0aGlzLCAndHlwZScpO1xuICAgIHJldHVybiBQbHVyYWxSdWxlcy5sb2NhbGVEYXRhW2xvY2FsZV0uZm4oZm9ybWF0TnVtZXJpY1RvU3RyaW5nKFBsdXJhbFJ1bGVzLl9fSU5URVJOQUxfU0xPVF9NQVBfXywgdGhpcywgTWF0aC5hYnMoTnVtYmVyKHZhbCkpKSwgdHlwZSA9PSAnb3JkaW5hbCcpO1xuICB9O1xuXG4gIFBsdXJhbFJ1bGVzLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gJ1tvYmplY3QgSW50bC5QbHVyYWxSdWxlc10nO1xuICB9O1xuXG4gIFBsdXJhbFJ1bGVzLnN1cHBvcnRlZExvY2FsZXNPZiA9IGZ1bmN0aW9uIChsb2NhbGVzLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGludGxfdXRpbHNfMS5zdXBwb3J0ZWRMb2NhbGVzKFBsdXJhbFJ1bGVzLmF2YWlsYWJsZUxvY2FsZXMsIGludGxfdXRpbHNfMS5nZXRDYW5vbmljYWxMb2NhbGVzKGxvY2FsZXMpLCBvcHRpb25zKTtcbiAgfTtcblxuICBQbHVyYWxSdWxlcy5fX2FkZExvY2FsZURhdGEgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGRhdGEgPSBbXTtcblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICBkYXRhW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuXG4gICAgdmFyIF9sb29wXzEgPSBmdW5jdGlvbiBfbG9vcF8xKGRhdHVtKSB7XG4gICAgICB2YXIgYXZhaWxhYmxlTG9jYWxlcyA9IE9iamVjdC5rZXlzKF9fc3ByZWFkQXJyYXlzKGRhdHVtLmF2YWlsYWJsZUxvY2FsZXMsIE9iamVjdC5rZXlzKGRhdHVtLmFsaWFzZXMpLCBPYmplY3Qua2V5cyhkYXR1bS5wYXJlbnRMb2NhbGVzKSkucmVkdWNlKGZ1bmN0aW9uIChhbGwsIGspIHtcbiAgICAgICAgYWxsW2tdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGFsbDtcbiAgICAgIH0sIHt9KSk7XG4gICAgICBhdmFpbGFibGVMb2NhbGVzLmZvckVhY2goZnVuY3Rpb24gKGxvY2FsZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIFBsdXJhbFJ1bGVzLmxvY2FsZURhdGFbbG9jYWxlXSA9IGludGxfdXRpbHNfMS51bnBhY2tEYXRhKGxvY2FsZSwgZGF0dW0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGludGxfdXRpbHNfMS5pc01pc3NpbmdMb2NhbGVEYXRhRXJyb3IoZSkpIHtcbiAgICAgICAgICAgIC8vIElmIHdlIGp1c3QgZG9uJ3QgaGF2ZSBkYXRhIGZvciBjZXJ0YWluIGxvY2FsZSwgdGhhdCdzIG9rXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGZvciAodmFyIF9hID0gMCwgZGF0YV8xID0gZGF0YTsgX2EgPCBkYXRhXzEubGVuZ3RoOyBfYSsrKSB7XG4gICAgICB2YXIgZGF0dW0gPSBkYXRhXzFbX2FdO1xuXG4gICAgICBfbG9vcF8xKGRhdHVtKTtcbiAgICB9XG5cbiAgICBQbHVyYWxSdWxlcy5hdmFpbGFibGVMb2NhbGVzID0gT2JqZWN0LmtleXMoUGx1cmFsUnVsZXMubG9jYWxlRGF0YSk7XG5cbiAgICBpZiAoIVBsdXJhbFJ1bGVzLl9fZGVmYXVsdExvY2FsZSkge1xuICAgICAgUGx1cmFsUnVsZXMuX19kZWZhdWx0TG9jYWxlID0gUGx1cmFsUnVsZXMuYXZhaWxhYmxlTG9jYWxlc1swXTtcbiAgICB9XG4gIH07XG5cbiAgUGx1cmFsUnVsZXMuZ2V0RGVmYXVsdExvY2FsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gUGx1cmFsUnVsZXMuX19kZWZhdWx0TG9jYWxlO1xuICB9O1xuXG4gIFBsdXJhbFJ1bGVzLmxvY2FsZURhdGEgPSB7fTtcbiAgUGx1cmFsUnVsZXMuYXZhaWxhYmxlTG9jYWxlcyA9IFtdO1xuICBQbHVyYWxSdWxlcy5fX2RlZmF1bHRMb2NhbGUgPSAnZW4nO1xuICBQbHVyYWxSdWxlcy5yZWxldmFudEV4dGVuc2lvbktleXMgPSBbXTtcbiAgUGx1cmFsUnVsZXMucG9seWZpbGxlZCA9IHRydWU7XG4gIFBsdXJhbFJ1bGVzLl9fSU5URVJOQUxfU0xPVF9NQVBfXyA9IG5ldyBXZWFrTWFwKCk7XG4gIHJldHVybiBQbHVyYWxSdWxlcztcbn0oKTtcblxuZXhwb3J0cy5QbHVyYWxSdWxlcyA9IFBsdXJhbFJ1bGVzO1xuXG50cnkge1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS90ZXN0MjYyL2Jsb2IvbWFzdGVyL3Rlc3QvaW50bDQwMi9QbHVyYWxSdWxlcy9sZW5ndGguanNcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFBsdXJhbFJ1bGVzLCAnbGVuZ3RoJywge1xuICAgIHZhbHVlOiAwLFxuICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Rlc3QyNjIvYmxvYi9tYXN0ZXIvdGVzdC9pbnRsNDAyL1JlbGF0aXZlVGltZUZvcm1hdC9jb25zdHJ1Y3Rvci9sZW5ndGguanNcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUGx1cmFsUnVsZXMucHJvdG90eXBlLmNvbnN0cnVjdG9yLCAnbGVuZ3RoJywge1xuICAgIHZhbHVlOiAwLFxuICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Rlc3QyNjIvYmxvYi9tYXN0ZXIvdGVzdC9pbnRsNDAyL1JlbGF0aXZlVGltZUZvcm1hdC9jb25zdHJ1Y3Rvci9zdXBwb3J0ZWRMb2NhbGVzT2YvbGVuZ3RoLmpzXG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFBsdXJhbFJ1bGVzLnN1cHBvcnRlZExvY2FsZXNPZiwgJ2xlbmd0aCcsIHtcbiAgICB2YWx1ZTogMSxcbiAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xufSBjYXRjaCAoZXgpIHsvLyBNZXRhIGZpeGVzIGZvciB0ZXN0MjYyXG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///3012\n")},4574:function(){eval('/* @generated */\n// prettier-ignore\nif (Intl.PluralRules && typeof Intl.PluralRules.__addLocaleData === \'function\') {\n Intl.PluralRules.__addLocaleData({\n "data": {\n "en": {\n "categories": {\n "cardinal": ["one", "other"],\n "ordinal": ["one", "two", "few", "other"]\n },\n "fn": function fn(n, ord) {\n var s = String(n).split(\'.\'),\n v0 = !s[1],\n t0 = Number(s[0]) == n,\n n10 = t0 && s[0].slice(-1),\n n100 = t0 && s[0].slice(-2);\n if (ord) return n10 == 1 && n100 != 11 ? \'one\' : n10 == 2 && n100 != 12 ? \'two\' : n10 == 3 && n100 != 13 ? \'few\' : \'other\';\n return n == 1 && v0 ? \'one\' : \'other\';\n }\n }\n },\n "aliases": {},\n "parentLocales": {\n "en-150": "en-001",\n "en-AG": "en-001",\n "en-AI": "en-001",\n "en-AU": "en-001",\n "en-BB": "en-001",\n "en-BM": "en-001",\n "en-BS": "en-001",\n "en-BW": "en-001",\n "en-BZ": "en-001",\n "en-CA": "en-001",\n "en-CC": "en-001",\n "en-CK": "en-001",\n "en-CM": "en-001",\n "en-CX": "en-001",\n "en-CY": "en-001",\n "en-DG": "en-001",\n "en-DM": "en-001",\n "en-ER": "en-001",\n "en-FJ": "en-001",\n "en-FK": "en-001",\n "en-FM": "en-001",\n "en-GB": "en-001",\n "en-GD": "en-001",\n "en-GG": "en-001",\n "en-GH": "en-001",\n "en-GI": "en-001",\n "en-GM": "en-001",\n "en-GY": "en-001",\n "en-HK": "en-001",\n "en-IE": "en-001",\n "en-IL": "en-001",\n "en-IM": "en-001",\n "en-IN": "en-001",\n "en-IO": "en-001",\n "en-JE": "en-001",\n "en-JM": "en-001",\n "en-KE": "en-001",\n "en-KI": "en-001",\n "en-KN": "en-001",\n "en-KY": "en-001",\n "en-LC": "en-001",\n "en-LR": "en-001",\n "en-LS": "en-001",\n "en-MG": "en-001",\n "en-MO": "en-001",\n "en-MS": "en-001",\n "en-MT": "en-001",\n "en-MU": "en-001",\n "en-MW": "en-001",\n "en-MY": "en-001",\n "en-NA": "en-001",\n "en-NF": "en-001",\n "en-NG": "en-001",\n "en-NR": "en-001",\n "en-NU": "en-001",\n "en-NZ": "en-001",\n "en-PG": "en-001",\n "en-PH": "en-001",\n "en-PK": "en-001",\n "en-PN": "en-001",\n "en-PW": "en-001",\n "en-RW": "en-001",\n "en-SB": "en-001",\n "en-SC": "en-001",\n "en-SD": "en-001",\n "en-SG": "en-001",\n "en-SH": "en-001",\n "en-SL": "en-001",\n "en-SS": "en-001",\n "en-SX": "en-001",\n "en-SZ": "en-001",\n "en-TC": "en-001",\n "en-TK": "en-001",\n "en-TO": "en-001",\n "en-TT": "en-001",\n "en-TV": "en-001",\n "en-TZ": "en-001",\n "en-UG": "en-001",\n "en-VC": "en-001",\n "en-VG": "en-001",\n "en-VU": "en-001",\n "en-WS": "en-001",\n "en-ZA": "en-001",\n "en-ZM": "en-001",\n "en-ZW": "en-001",\n "en-AT": "en-150",\n "en-BE": "en-150",\n "en-CH": "en-150",\n "en-DE": "en-150",\n "en-DK": "en-150",\n "en-FI": "en-150",\n "en-NL": "en-150",\n "en-SE": "en-150",\n "en-SI": "en-150"\n },\n "availableLocales": ["en"]\n });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZm9ybWF0anMvaW50bC1wbHVyYWxydWxlcy9kaXN0L2xvY2FsZS1kYXRhL2VuLmpzPzQ3N2MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRztBQUNIIiwiZmlsZSI6IjQ1NzQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBAZ2VuZXJhdGVkICovXG4vLyBwcmV0dGllci1pZ25vcmVcbmlmIChJbnRsLlBsdXJhbFJ1bGVzICYmIHR5cGVvZiBJbnRsLlBsdXJhbFJ1bGVzLl9fYWRkTG9jYWxlRGF0YSA9PT0gJ2Z1bmN0aW9uJykge1xuICBJbnRsLlBsdXJhbFJ1bGVzLl9fYWRkTG9jYWxlRGF0YSh7XG4gICAgXCJkYXRhXCI6IHtcbiAgICAgIFwiZW5cIjoge1xuICAgICAgICBcImNhdGVnb3JpZXNcIjoge1xuICAgICAgICAgIFwiY2FyZGluYWxcIjogW1wib25lXCIsIFwib3RoZXJcIl0sXG4gICAgICAgICAgXCJvcmRpbmFsXCI6IFtcIm9uZVwiLCBcInR3b1wiLCBcImZld1wiLCBcIm90aGVyXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZm5cIjogZnVuY3Rpb24gZm4obiwgb3JkKSB7XG4gICAgICAgICAgdmFyIHMgPSBTdHJpbmcobikuc3BsaXQoJy4nKSxcbiAgICAgICAgICAgICAgdjAgPSAhc1sxXSxcbiAgICAgICAgICAgICAgdDAgPSBOdW1iZXIoc1swXSkgPT0gbixcbiAgICAgICAgICAgICAgbjEwID0gdDAgJiYgc1swXS5zbGljZSgtMSksXG4gICAgICAgICAgICAgIG4xMDAgPSB0MCAmJiBzWzBdLnNsaWNlKC0yKTtcbiAgICAgICAgICBpZiAob3JkKSByZXR1cm4gbjEwID09IDEgJiYgbjEwMCAhPSAxMSA/ICdvbmUnIDogbjEwID09IDIgJiYgbjEwMCAhPSAxMiA/ICd0d28nIDogbjEwID09IDMgJiYgbjEwMCAhPSAxMyA/ICdmZXcnIDogJ290aGVyJztcbiAgICAgICAgICByZXR1cm4gbiA9PSAxICYmIHYwID8gJ29uZScgOiAnb3RoZXInO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBcImFsaWFzZXNcIjoge30sXG4gICAgXCJwYXJlbnRMb2NhbGVzXCI6IHtcbiAgICAgIFwiZW4tMTUwXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUFHXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUFJXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUFVXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUJCXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUJNXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUJTXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUJXXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUJaXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUNBXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUNDXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUNLXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUNNXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUNYXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUNZXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLURHXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLURNXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUVSXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUZKXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUZLXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUZNXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUdCXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUdEXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUdHXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUdIXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUdJXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUdNXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUdZXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUhLXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUlFXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUlMXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUlNXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUlOXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUlPXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUpFXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUpNXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUtFXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUtJXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUtOXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUtZXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUxDXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUxSXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUxTXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLU1HXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLU1PXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLU1TXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLU1UXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLU1VXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLU1XXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLU1ZXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLU5BXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLU5GXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLU5HXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLU5SXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLU5VXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLU5aXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVBHXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVBIXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVBLXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVBOXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVBXXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVJXXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVNCXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVNDXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVNEXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVNHXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVNIXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVNMXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVNTXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVNYXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVNaXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVRDXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVRLXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVRPXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVRUXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVRWXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVRaXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVVHXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVZDXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVZHXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVZVXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVdTXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVpBXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVpNXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVpXXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUFUXCI6IFwiZW4tMTUwXCIsXG4gICAgICBcImVuLUJFXCI6IFwiZW4tMTUwXCIsXG4gICAgICBcImVuLUNIXCI6IFwiZW4tMTUwXCIsXG4gICAgICBcImVuLURFXCI6IFwiZW4tMTUwXCIsXG4gICAgICBcImVuLURLXCI6IFwiZW4tMTUwXCIsXG4gICAgICBcImVuLUZJXCI6IFwiZW4tMTUwXCIsXG4gICAgICBcImVuLU5MXCI6IFwiZW4tMTUwXCIsXG4gICAgICBcImVuLVNFXCI6IFwiZW4tMTUwXCIsXG4gICAgICBcImVuLVNJXCI6IFwiZW4tMTUwXCJcbiAgICB9LFxuICAgIFwiYXZhaWxhYmxlTG9jYWxlc1wiOiBbXCJlblwiXVxuICB9KTtcbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///4574\n')},3745:function(){eval('/* @generated */\n// prettier-ignore\nif (Intl.PluralRules && typeof Intl.PluralRules.__addLocaleData === \'function\') {\n Intl.PluralRules.__addLocaleData({\n "data": {\n "es": {\n "categories": {\n "cardinal": ["one", "other"],\n "ordinal": ["other"]\n },\n "fn": function fn(n, ord) {\n if (ord) return \'other\';\n return n == 1 ? \'one\' : \'other\';\n }\n }\n },\n "aliases": {},\n "parentLocales": {\n "es-AR": "es-419",\n "es-BO": "es-419",\n "es-BR": "es-419",\n "es-BZ": "es-419",\n "es-CL": "es-419",\n "es-CO": "es-419",\n "es-CR": "es-419",\n "es-CU": "es-419",\n "es-DO": "es-419",\n "es-EC": "es-419",\n "es-GT": "es-419",\n "es-HN": "es-419",\n "es-MX": "es-419",\n "es-NI": "es-419",\n "es-PA": "es-419",\n "es-PE": "es-419",\n "es-PR": "es-419",\n "es-PY": "es-419",\n "es-SV": "es-419",\n "es-US": "es-419",\n "es-UY": "es-419",\n "es-VE": "es-419"\n },\n "availableLocales": ["es"]\n });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZm9ybWF0anMvaW50bC1wbHVyYWxydWxlcy9kaXN0L2xvY2FsZS1kYXRhL2VzLmpzPzNmZTYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0giLCJmaWxlIjoiMzc0NS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qIEBnZW5lcmF0ZWQgKi9cbi8vIHByZXR0aWVyLWlnbm9yZVxuaWYgKEludGwuUGx1cmFsUnVsZXMgJiYgdHlwZW9mIEludGwuUGx1cmFsUnVsZXMuX19hZGRMb2NhbGVEYXRhID09PSAnZnVuY3Rpb24nKSB7XG4gIEludGwuUGx1cmFsUnVsZXMuX19hZGRMb2NhbGVEYXRhKHtcbiAgICBcImRhdGFcIjoge1xuICAgICAgXCJlc1wiOiB7XG4gICAgICAgIFwiY2F0ZWdvcmllc1wiOiB7XG4gICAgICAgICAgXCJjYXJkaW5hbFwiOiBbXCJvbmVcIiwgXCJvdGhlclwiXSxcbiAgICAgICAgICBcIm9yZGluYWxcIjogW1wib3RoZXJcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJmblwiOiBmdW5jdGlvbiBmbihuLCBvcmQpIHtcbiAgICAgICAgICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgICAgICAgICByZXR1cm4gbiA9PSAxID8gJ29uZScgOiAnb3RoZXInO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBcImFsaWFzZXNcIjoge30sXG4gICAgXCJwYXJlbnRMb2NhbGVzXCI6IHtcbiAgICAgIFwiZXMtQVJcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtQk9cIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtQlJcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtQlpcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtQ0xcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtQ09cIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtQ1JcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtQ1VcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtRE9cIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtRUNcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtR1RcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtSE5cIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtTVhcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtTklcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtUEFcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtUEVcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtUFJcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtUFlcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtU1ZcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtVVNcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtVVlcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtVkVcIjogXCJlcy00MTlcIlxuICAgIH0sXG4gICAgXCJhdmFpbGFibGVMb2NhbGVzXCI6IFtcImVzXCJdXG4gIH0pO1xufSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///3745\n')},6867:function(){eval('/* @generated */\n// prettier-ignore\nif (Intl.PluralRules && typeof Intl.PluralRules.__addLocaleData === \'function\') {\n Intl.PluralRules.__addLocaleData({\n "data": {\n "ses": {\n "categories": {\n "cardinal": ["other"],\n "ordinal": ["other"]\n },\n "fn": function fn(n, ord) {\n return \'other\';\n }\n }\n },\n "aliases": {},\n "parentLocales": {},\n "availableLocales": ["ses"]\n });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZm9ybWF0anMvaW50bC1wbHVyYWxydWxlcy9kaXN0L2xvY2FsZS1kYXRhL3Nlcy5qcz8yOTM5Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxpQkFBaUI7QUFDakIsdUJBQXVCO0FBQ3ZCO0FBQ0EsR0FBRztBQUNIIiwiZmlsZSI6IjY4NjcuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBAZ2VuZXJhdGVkICovXG4vLyBwcmV0dGllci1pZ25vcmVcbmlmIChJbnRsLlBsdXJhbFJ1bGVzICYmIHR5cGVvZiBJbnRsLlBsdXJhbFJ1bGVzLl9fYWRkTG9jYWxlRGF0YSA9PT0gJ2Z1bmN0aW9uJykge1xuICBJbnRsLlBsdXJhbFJ1bGVzLl9fYWRkTG9jYWxlRGF0YSh7XG4gICAgXCJkYXRhXCI6IHtcbiAgICAgIFwic2VzXCI6IHtcbiAgICAgICAgXCJjYXRlZ29yaWVzXCI6IHtcbiAgICAgICAgICBcImNhcmRpbmFsXCI6IFtcIm90aGVyXCJdLFxuICAgICAgICAgIFwib3JkaW5hbFwiOiBbXCJvdGhlclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImZuXCI6IGZ1bmN0aW9uIGZuKG4sIG9yZCkge1xuICAgICAgICAgIHJldHVybiAnb3RoZXInO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBcImFsaWFzZXNcIjoge30sXG4gICAgXCJwYXJlbnRMb2NhbGVzXCI6IHt9LFxuICAgIFwiYXZhaWxhYmxlTG9jYWxlc1wiOiBbXCJzZXNcIl1cbiAgfSk7XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///6867\n')},2157:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("\n\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\n\nvar core_1 = __webpack_require__(3012);\n\nif (typeof Intl.PluralRules === 'undefined' || !Intl.PluralRules.polyfilled && new Intl.PluralRules('en', {\n minimumFractionDigits: 2\n}).select(1) === 'one') {\n Object.defineProperty(Intl, 'PluralRules', {\n value: core_1.PluralRules,\n writable: true,\n enumerable: false,\n configurable: true\n });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZm9ybWF0anMvaW50bC1wbHVyYWxydWxlcy9kaXN0L3BvbHlmaWxsLmpzP2FkY2QiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsOENBQTZDO0FBQzdDO0FBQ0EsQ0FBQyxFQUFDOztBQUVGLGFBQWEsbUJBQU8sQ0FBQyxJQUFROztBQUU3QjtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0giLCJmaWxlIjoiMjE1Ny5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgY29yZV8xID0gcmVxdWlyZShcIi4vY29yZVwiKTtcblxuaWYgKHR5cGVvZiBJbnRsLlBsdXJhbFJ1bGVzID09PSAndW5kZWZpbmVkJyB8fCAhSW50bC5QbHVyYWxSdWxlcy5wb2x5ZmlsbGVkICYmIG5ldyBJbnRsLlBsdXJhbFJ1bGVzKCdlbicsIHtcbiAgbWluaW11bUZyYWN0aW9uRGlnaXRzOiAyXG59KS5zZWxlY3QoMSkgPT09ICdvbmUnKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJbnRsLCAnUGx1cmFsUnVsZXMnLCB7XG4gICAgdmFsdWU6IGNvcmVfMS5QbHVyYWxSdWxlcyxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///2157\n")},3228:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("__webpack_require__(2157);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZm9ybWF0anMvaW50bC1wbHVyYWxydWxlcy9wb2x5ZmlsbC5qcz8xYTM5Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG1CQUFPLENBQUMsSUFBaUIiLCJmaWxlIjoiMzIyOC5qcyIsInNvdXJjZXNDb250ZW50IjpbInJlcXVpcmUoJy4vZGlzdC9wb2x5ZmlsbCcpOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///3228\n")},9905:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("\n\nvar __assign = this && this.__assign || function () {\n __assign = Object.assign || function (t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n\n for (var p in s) {\n if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n }\n\n return t;\n };\n\n return __assign.apply(this, arguments);\n};\n\nvar __values = this && this.__values || function (o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator,\n m = s && o[s],\n i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function next() {\n if (o && i >= o.length) o = void 0;\n return {\n value: o && o[i++],\n done: !o\n };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n};\n\nvar __read = this && this.__read || function (o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o),\n r,\n ar = [],\n e;\n\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) {\n ar.push(r.value);\n }\n } catch (error) {\n e = {\n error: error\n };\n } finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n } finally {\n if (e) throw e.error;\n }\n }\n\n return ar;\n};\n\nvar __spread = this && this.__spread || function () {\n for (var ar = [], i = 0; i < arguments.length; i++) {\n ar = ar.concat(__read(arguments[i]));\n }\n\n return ar;\n};\n\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\n\nvar intl_utils_1 = __webpack_require__(2650);\n\nfunction unpackData(locale, localeData) {\n var localeHierarchy = intl_utils_1.getLocaleHierarchy(locale, localeData.aliases, localeData.parentLocales);\n var dataToMerge = localeHierarchy.map(function (l) {\n return localeData.data[l];\n }).filter(Boolean);\n\n if (!dataToMerge.length) {\n throw new Error(\"Missing locale data for \\\"\" + locale + \"\\\", lookup hierarchy: \" + localeHierarchy.join(', '));\n }\n\n dataToMerge.reverse();\n return dataToMerge.reduce(function (all, d) {\n return __assign(__assign({}, all), d);\n }, {\n nu: []\n });\n}\n/**\n * https://tc39.es/proposal-intl-relative-time/#sec-singularrelativetimeunit\n * @param unit\n */\n\n\nfunction singularRelativeTimeUnit(unit) {\n intl_utils_1.invariant(typeof unit === 'string', \"unit must be a string, instead got \" + typeof unit, TypeError);\n if (unit === 'seconds') return 'second';\n if (unit === 'minutes') return 'minute';\n if (unit === 'hours') return 'hour';\n if (unit === 'days') return 'day';\n if (unit === 'weeks') return 'week';\n if (unit === 'months') return 'month';\n if (unit === 'quarters') return 'quarter';\n if (unit === 'years') return 'year';\n\n if (unit !== 'second' && unit !== 'minute' && unit !== 'hour' && unit !== 'day' && unit !== 'week' && unit !== 'month' && unit !== 'quarter' && unit !== 'year') {\n throw new RangeError(\"Invalid unit \" + unit);\n }\n\n return unit;\n}\n\nvar NUMBERING_SYSTEM_REGEX = /^[a-z0-9]{3,8}(-[a-z0-9]{3,8})*$/i;\n/**\n * https://tc39.es/proposal-intl-relative-time/#sec-makepartslist\n * @param pattern\n * @param unit\n * @param parts\n */\n\nfunction makePartsList(pattern, unit, parts) {\n var e_1, _a, e_2, _b;\n\n var patternParts = intl_utils_1.partitionPattern(pattern);\n var result = [];\n\n try {\n for (var patternParts_1 = __values(patternParts), patternParts_1_1 = patternParts_1.next(); !patternParts_1_1.done; patternParts_1_1 = patternParts_1.next()) {\n var patternPart = patternParts_1_1.value;\n\n if (intl_utils_1.isLiteralPart(patternPart)) {\n result.push({\n type: 'literal',\n value: patternPart.value\n });\n } else {\n intl_utils_1.invariant(patternPart.type === '0', \"Malformed pattern \" + pattern);\n\n try {\n for (var parts_1 = (e_2 = void 0, __values(parts)), parts_1_1 = parts_1.next(); !parts_1_1.done; parts_1_1 = parts_1.next()) {\n var part = parts_1_1.value;\n result.push({\n type: part.type,\n value: part.value,\n unit: unit\n });\n }\n } catch (e_2_1) {\n e_2 = {\n error: e_2_1\n };\n } finally {\n try {\n if (parts_1_1 && !parts_1_1.done && (_b = parts_1.return)) _b.call(parts_1);\n } finally {\n if (e_2) throw e_2.error;\n }\n }\n }\n }\n } catch (e_1_1) {\n e_1 = {\n error: e_1_1\n };\n } finally {\n try {\n if (patternParts_1_1 && !patternParts_1_1.done && (_a = patternParts_1.return)) _a.call(patternParts_1);\n } finally {\n if (e_1) throw e_1.error;\n }\n }\n\n return result;\n}\n\nfunction objectIs(x, y) {\n if (Object.is) {\n return Object.is(x, y);\n } // SameValue algorithm\n\n\n if (x === y) {\n // Steps 1-5, 7-10\n // Steps 6.b-6.e: +0 != -0\n return x !== 0 || 1 / x === 1 / y;\n } // Step 6.a: NaN == NaN\n\n\n return x !== x && y !== y;\n}\n\nfunction toString(arg) {\n return arg + '';\n}\n/**\n * PartitionRelativeTimePattern\n * @param rtf\n * @param value\n * @param unit\n */\n\n\nfunction partitionRelativeTimePattern(internalSlotMap, rtf, value, unit) {\n intl_utils_1.invariant(typeof value === 'number', \"value must be number, instead got \" + typeof value, TypeError);\n intl_utils_1.invariant(typeof unit === 'string', \"unit must be number, instead got \" + typeof value, TypeError);\n\n if (isNaN(value) || value === Infinity || value === -Infinity) {\n throw new RangeError(\"Invalid value \" + value);\n }\n\n var resolvedUnit = singularRelativeTimeUnit(unit);\n var fields = intl_utils_1.getInternalSlot(internalSlotMap, rtf, 'fields');\n var style = intl_utils_1.getInternalSlot(internalSlotMap, rtf, 'style');\n var entry = resolvedUnit;\n\n if (style === 'short') {\n entry = unit + \"-short\";\n } else if (style === 'narrow') {\n entry = unit + \"-narrow\";\n }\n\n if (!(entry in fields)) {\n entry = unit;\n }\n\n var patterns = fields[entry];\n var numeric = intl_utils_1.getInternalSlot(internalSlotMap, rtf, 'numeric');\n\n if (numeric === 'auto') {\n if (toString(value) in patterns) {\n return [{\n type: 'literal',\n value: patterns[toString(value)]\n }];\n }\n }\n\n var tl = 'future';\n\n if (objectIs(value, -0) || value < 0) {\n tl = 'past';\n }\n\n var po = patterns[tl];\n var pluralRules = intl_utils_1.getInternalSlot(internalSlotMap, rtf, 'pluralRules');\n var numberFormat = intl_utils_1.getInternalSlot(internalSlotMap, rtf, 'numberFormat');\n var fv = typeof numberFormat.formatToParts === 'function' ? numberFormat.formatToParts(Math.abs(value)) : // TODO: If formatToParts is not supported, we assume the whole formatted\n // number is a part\n [{\n type: 'literal',\n value: numberFormat.format(Math.abs(value)),\n unit: unit\n }];\n var pr = pluralRules.select(value);\n var pattern = po[pr];\n return makePartsList(pattern, resolvedUnit, fv);\n}\n\nvar RelativeTimeFormat =\n/** @class */\nfunction () {\n function RelativeTimeFormat(locales, options) {\n // test262/test/intl402/RelativeTimeFormat/constructor/constructor/newtarget-undefined.js\n // Cannot use `new.target` bc of IE11 & TS transpiles it to something else\n var newTarget = this && this instanceof RelativeTimeFormat ? this.constructor : void 0;\n\n if (!newTarget) {\n throw new TypeError(\"Intl.RelativeTimeFormat must be called with 'new'\");\n }\n\n intl_utils_1.setInternalSlot(RelativeTimeFormat.__INTERNAL_SLOT_MAP__, this, 'initializedRelativeTimeFormat', true);\n var requestedLocales = intl_utils_1.getCanonicalLocales(locales);\n var opt = Object.create(null);\n var opts = options === undefined ? Object.create(null) : intl_utils_1.toObject(options);\n var matcher = intl_utils_1.getOption(opts, 'localeMatcher', 'string', ['best fit', 'lookup'], 'best fit');\n opt.localeMatcher = matcher;\n var numberingSystem = intl_utils_1.getOption(opts, 'numberingSystem', 'string', undefined, undefined);\n\n if (numberingSystem !== undefined) {\n if (!NUMBERING_SYSTEM_REGEX.test(numberingSystem)) {\n throw new RangeError(\"Invalid numbering system \" + numberingSystem);\n }\n }\n\n opt.nu = numberingSystem;\n var r = intl_utils_1.createResolveLocale(RelativeTimeFormat.getDefaultLocale)(RelativeTimeFormat.availableLocales, requestedLocales, opt, RelativeTimeFormat.relevantExtensionKeys, RelativeTimeFormat.localeData);\n var locale = r.locale,\n nu = r.nu;\n intl_utils_1.setInternalSlot(RelativeTimeFormat.__INTERNAL_SLOT_MAP__, this, 'locale', locale);\n intl_utils_1.setInternalSlot(RelativeTimeFormat.__INTERNAL_SLOT_MAP__, this, 'style', intl_utils_1.getOption(opts, 'style', 'string', ['long', 'narrow', 'short'], 'long'));\n intl_utils_1.setInternalSlot(RelativeTimeFormat.__INTERNAL_SLOT_MAP__, this, 'numeric', intl_utils_1.getOption(opts, 'numeric', 'string', ['always', 'auto'], 'always'));\n intl_utils_1.setInternalSlot(RelativeTimeFormat.__INTERNAL_SLOT_MAP__, this, 'fields', RelativeTimeFormat.localeData[locale]);\n intl_utils_1.setInternalSlot(RelativeTimeFormat.__INTERNAL_SLOT_MAP__, this, 'numberFormat', new Intl.NumberFormat(locales));\n intl_utils_1.setInternalSlot(RelativeTimeFormat.__INTERNAL_SLOT_MAP__, this, 'pluralRules', new Intl.PluralRules(locales));\n intl_utils_1.setInternalSlot(RelativeTimeFormat.__INTERNAL_SLOT_MAP__, this, 'numberingSystem', nu);\n }\n\n RelativeTimeFormat.prototype.format = function (value, unit) {\n if (typeof this !== 'object') {\n throw new TypeError('format was called on a non-object');\n }\n\n if (!intl_utils_1.getInternalSlot(RelativeTimeFormat.__INTERNAL_SLOT_MAP__, this, 'initializedRelativeTimeFormat')) {\n throw new TypeError('format was called on a invalid context');\n }\n\n return partitionRelativeTimePattern(RelativeTimeFormat.__INTERNAL_SLOT_MAP__, this, Number(value), toString(unit)).map(function (el) {\n return el.value;\n }).join('');\n };\n\n RelativeTimeFormat.prototype.formatToParts = function (value, unit) {\n if (typeof this !== 'object') {\n throw new TypeError('formatToParts was called on a non-object');\n }\n\n if (!intl_utils_1.getInternalSlot(RelativeTimeFormat.__INTERNAL_SLOT_MAP__, this, 'initializedRelativeTimeFormat')) {\n throw new TypeError('formatToParts was called on a invalid context');\n }\n\n return partitionRelativeTimePattern(RelativeTimeFormat.__INTERNAL_SLOT_MAP__, this, Number(value), toString(unit));\n };\n\n RelativeTimeFormat.prototype.resolvedOptions = function () {\n if (typeof this !== 'object') {\n throw new TypeError('resolvedOptions was called on a non-object');\n }\n\n if (!intl_utils_1.getInternalSlot(RelativeTimeFormat.__INTERNAL_SLOT_MAP__, this, 'initializedRelativeTimeFormat')) {\n throw new TypeError('resolvedOptions was called on a invalid context');\n } // test262/test/intl402/RelativeTimeFormat/prototype/resolvedOptions/type.js\n\n\n return {\n locale: intl_utils_1.getInternalSlot(RelativeTimeFormat.__INTERNAL_SLOT_MAP__, this, 'locale'),\n style: intl_utils_1.getInternalSlot(RelativeTimeFormat.__INTERNAL_SLOT_MAP__, this, 'style'),\n numeric: intl_utils_1.getInternalSlot(RelativeTimeFormat.__INTERNAL_SLOT_MAP__, this, 'numeric'),\n numberingSystem: intl_utils_1.getInternalSlot(RelativeTimeFormat.__INTERNAL_SLOT_MAP__, this, 'numberingSystem')\n };\n };\n\n RelativeTimeFormat.supportedLocalesOf = function (locales, options) {\n return intl_utils_1.supportedLocales(RelativeTimeFormat.availableLocales, intl_utils_1.getCanonicalLocales(locales), options);\n };\n\n RelativeTimeFormat.__addLocaleData = function () {\n var e_3, _a;\n\n var data = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n data[_i] = arguments[_i];\n }\n\n var _loop_1 = function _loop_1(datum) {\n var availableLocales = Object.keys(__spread(datum.availableLocales, Object.keys(datum.aliases), Object.keys(datum.parentLocales)).reduce(function (all, k) {\n all[k] = true;\n return all;\n }, {}));\n availableLocales.forEach(function (locale) {\n try {\n RelativeTimeFormat.localeData[locale] = unpackData(locale, datum);\n } catch (e) {// If we can't unpack this data, ignore the locale\n }\n });\n };\n\n try {\n for (var data_1 = __values(data), data_1_1 = data_1.next(); !data_1_1.done; data_1_1 = data_1.next()) {\n var datum = data_1_1.value;\n\n _loop_1(datum);\n }\n } catch (e_3_1) {\n e_3 = {\n error: e_3_1\n };\n } finally {\n try {\n if (data_1_1 && !data_1_1.done && (_a = data_1.return)) _a.call(data_1);\n } finally {\n if (e_3) throw e_3.error;\n }\n }\n\n RelativeTimeFormat.availableLocales = Object.keys(RelativeTimeFormat.localeData);\n\n if (!RelativeTimeFormat.__defaultLocale) {\n RelativeTimeFormat.__defaultLocale = RelativeTimeFormat.availableLocales[0];\n }\n };\n\n RelativeTimeFormat.getDefaultLocale = function () {\n return RelativeTimeFormat.__defaultLocale;\n };\n\n RelativeTimeFormat.localeData = {};\n RelativeTimeFormat.availableLocales = [];\n RelativeTimeFormat.__defaultLocale = 'en';\n RelativeTimeFormat.relevantExtensionKeys = ['nu'];\n RelativeTimeFormat.polyfilled = true;\n RelativeTimeFormat.__INTERNAL_SLOT_MAP__ = new WeakMap();\n return RelativeTimeFormat;\n}();\n\nexports.default = RelativeTimeFormat;\n\ntry {\n // IE11 does not have Symbol\n if (typeof Symbol !== 'undefined') {\n Object.defineProperty(RelativeTimeFormat.prototype, Symbol.toStringTag, {\n value: 'Intl.RelativeTimeFormat',\n writable: false,\n enumerable: false,\n configurable: true\n });\n } // https://github.com/tc39/test262/blob/master/test/intl402/RelativeTimeFormat/constructor/length.js\n\n\n Object.defineProperty(RelativeTimeFormat.prototype.constructor, 'length', {\n value: 0,\n writable: false,\n enumerable: false,\n configurable: true\n }); // https://github.com/tc39/test262/blob/master/test/intl402/RelativeTimeFormat/constructor/supportedLocalesOf/length.js\n\n Object.defineProperty(RelativeTimeFormat.supportedLocalesOf, 'length', {\n value: 1,\n writable: false,\n enumerable: false,\n configurable: true\n });\n} catch (e) {// Meta fix so we're test262-compliant, not important\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZm9ybWF0anMvaW50bC1yZWxhdGl2ZXRpbWVmb3JtYXQvZGlzdC9jb3JlLmpzPzcyNDIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBLDRDQUE0QyxPQUFPO0FBQ25EOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDBCQUEwQixzQkFBc0I7QUFDaEQ7QUFDQTs7QUFFQTtBQUNBOztBQUVBLDhDQUE2QztBQUM3QztBQUNBLENBQUMsRUFBQzs7QUFFRixtQkFBbUIsbUJBQU8sQ0FBQyxJQUFzQjs7QUFFakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSx3Q0FBd0MsSUFBSSxXQUFXLElBQUk7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLCtGQUErRix3QkFBd0I7QUFDdkg7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQOztBQUVBO0FBQ0EseUZBQXlGLGlCQUFpQjtBQUMxRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQSxvQkFBb0IsdUJBQXVCO0FBQzNDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLElBQUk7QUFDWDtBQUNBO0FBQ0E7QUFDQSxTQUFTLFlBQVk7QUFDckI7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQSxpRUFBaUUsZ0JBQWdCO0FBQ2pGOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQsZUFBZTs7QUFFZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLEVBQUU7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDLFlBQVk7QUFDYiIsImZpbGUiOiI5OTA1LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfX2Fzc2lnbiA9IHRoaXMgJiYgdGhpcy5fX2Fzc2lnbiB8fCBmdW5jdGlvbiAoKSB7XG4gIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodCkge1xuICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcblxuICAgICAgZm9yICh2YXIgcCBpbiBzKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0O1xuICB9O1xuXG4gIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcblxudmFyIF9fdmFsdWVzID0gdGhpcyAmJiB0aGlzLl9fdmFsdWVzIHx8IGZ1bmN0aW9uIChvKSB7XG4gIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvcixcbiAgICAgIG0gPSBzICYmIG9bc10sXG4gICAgICBpID0gMDtcbiAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XG4gIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcbiAgICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBvICYmIG9baSsrXSxcbiAgICAgICAgZG9uZTogIW9cbiAgICAgIH07XG4gICAgfVxuICB9O1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG59O1xuXG52YXIgX19yZWFkID0gdGhpcyAmJiB0aGlzLl9fcmVhZCB8fCBmdW5jdGlvbiAobywgbikge1xuICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XG4gIGlmICghbSkgcmV0dXJuIG87XG4gIHZhciBpID0gbS5jYWxsKG8pLFxuICAgICAgcixcbiAgICAgIGFyID0gW10sXG4gICAgICBlO1xuXG4gIHRyeSB7XG4gICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIHtcbiAgICAgIGFyLnB1c2goci52YWx1ZSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGUgPSB7XG4gICAgICBlcnJvcjogZXJyb3JcbiAgICB9O1xuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKGUpIHRocm93IGUuZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFyO1xufTtcblxudmFyIF9fc3ByZWFkID0gdGhpcyAmJiB0aGlzLl9fc3ByZWFkIHx8IGZ1bmN0aW9uICgpIHtcbiAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XG4gIH1cblxuICByZXR1cm4gYXI7XG59O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgaW50bF91dGlsc18xID0gcmVxdWlyZShcIkBmb3JtYXRqcy9pbnRsLXV0aWxzXCIpO1xuXG5mdW5jdGlvbiB1bnBhY2tEYXRhKGxvY2FsZSwgbG9jYWxlRGF0YSkge1xuICB2YXIgbG9jYWxlSGllcmFyY2h5ID0gaW50bF91dGlsc18xLmdldExvY2FsZUhpZXJhcmNoeShsb2NhbGUsIGxvY2FsZURhdGEuYWxpYXNlcywgbG9jYWxlRGF0YS5wYXJlbnRMb2NhbGVzKTtcbiAgdmFyIGRhdGFUb01lcmdlID0gbG9jYWxlSGllcmFyY2h5Lm1hcChmdW5jdGlvbiAobCkge1xuICAgIHJldHVybiBsb2NhbGVEYXRhLmRhdGFbbF07XG4gIH0pLmZpbHRlcihCb29sZWFuKTtcblxuICBpZiAoIWRhdGFUb01lcmdlLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgbG9jYWxlIGRhdGEgZm9yIFxcXCJcIiArIGxvY2FsZSArIFwiXFxcIiwgbG9va3VwIGhpZXJhcmNoeTogXCIgKyBsb2NhbGVIaWVyYXJjaHkuam9pbignLCAnKSk7XG4gIH1cblxuICBkYXRhVG9NZXJnZS5yZXZlcnNlKCk7XG4gIHJldHVybiBkYXRhVG9NZXJnZS5yZWR1Y2UoZnVuY3Rpb24gKGFsbCwgZCkge1xuICAgIHJldHVybiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgYWxsKSwgZCk7XG4gIH0sIHtcbiAgICBudTogW11cbiAgfSk7XG59XG4vKipcbiAqIGh0dHBzOi8vdGMzOS5lcy9wcm9wb3NhbC1pbnRsLXJlbGF0aXZlLXRpbWUvI3NlYy1zaW5ndWxhcnJlbGF0aXZldGltZXVuaXRcbiAqIEBwYXJhbSB1bml0XG4gKi9cblxuXG5mdW5jdGlvbiBzaW5ndWxhclJlbGF0aXZlVGltZVVuaXQodW5pdCkge1xuICBpbnRsX3V0aWxzXzEuaW52YXJpYW50KHR5cGVvZiB1bml0ID09PSAnc3RyaW5nJywgXCJ1bml0IG11c3QgYmUgYSBzdHJpbmcsIGluc3RlYWQgZ290IFwiICsgdHlwZW9mIHVuaXQsIFR5cGVFcnJvcik7XG4gIGlmICh1bml0ID09PSAnc2Vjb25kcycpIHJldHVybiAnc2Vjb25kJztcbiAgaWYgKHVuaXQgPT09ICdtaW51dGVzJykgcmV0dXJuICdtaW51dGUnO1xuICBpZiAodW5pdCA9PT0gJ2hvdXJzJykgcmV0dXJuICdob3VyJztcbiAgaWYgKHVuaXQgPT09ICdkYXlzJykgcmV0dXJuICdkYXknO1xuICBpZiAodW5pdCA9PT0gJ3dlZWtzJykgcmV0dXJuICd3ZWVrJztcbiAgaWYgKHVuaXQgPT09ICdtb250aHMnKSByZXR1cm4gJ21vbnRoJztcbiAgaWYgKHVuaXQgPT09ICdxdWFydGVycycpIHJldHVybiAncXVhcnRlcic7XG4gIGlmICh1bml0ID09PSAneWVhcnMnKSByZXR1cm4gJ3llYXInO1xuXG4gIGlmICh1bml0ICE9PSAnc2Vjb25kJyAmJiB1bml0ICE9PSAnbWludXRlJyAmJiB1bml0ICE9PSAnaG91cicgJiYgdW5pdCAhPT0gJ2RheScgJiYgdW5pdCAhPT0gJ3dlZWsnICYmIHVuaXQgIT09ICdtb250aCcgJiYgdW5pdCAhPT0gJ3F1YXJ0ZXInICYmIHVuaXQgIT09ICd5ZWFyJykge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCB1bml0IFwiICsgdW5pdCk7XG4gIH1cblxuICByZXR1cm4gdW5pdDtcbn1cblxudmFyIE5VTUJFUklOR19TWVNURU1fUkVHRVggPSAvXlthLXowLTldezMsOH0oLVthLXowLTldezMsOH0pKiQvaTtcbi8qKlxuICogaHR0cHM6Ly90YzM5LmVzL3Byb3Bvc2FsLWludGwtcmVsYXRpdmUtdGltZS8jc2VjLW1ha2VwYXJ0c2xpc3RcbiAqIEBwYXJhbSBwYXR0ZXJuXG4gKiBAcGFyYW0gdW5pdFxuICogQHBhcmFtIHBhcnRzXG4gKi9cblxuZnVuY3Rpb24gbWFrZVBhcnRzTGlzdChwYXR0ZXJuLCB1bml0LCBwYXJ0cykge1xuICB2YXIgZV8xLCBfYSwgZV8yLCBfYjtcblxuICB2YXIgcGF0dGVyblBhcnRzID0gaW50bF91dGlsc18xLnBhcnRpdGlvblBhdHRlcm4ocGF0dGVybik7XG4gIHZhciByZXN1bHQgPSBbXTtcblxuICB0cnkge1xuICAgIGZvciAodmFyIHBhdHRlcm5QYXJ0c18xID0gX192YWx1ZXMocGF0dGVyblBhcnRzKSwgcGF0dGVyblBhcnRzXzFfMSA9IHBhdHRlcm5QYXJ0c18xLm5leHQoKTsgIXBhdHRlcm5QYXJ0c18xXzEuZG9uZTsgcGF0dGVyblBhcnRzXzFfMSA9IHBhdHRlcm5QYXJ0c18xLm5leHQoKSkge1xuICAgICAgdmFyIHBhdHRlcm5QYXJ0ID0gcGF0dGVyblBhcnRzXzFfMS52YWx1ZTtcblxuICAgICAgaWYgKGludGxfdXRpbHNfMS5pc0xpdGVyYWxQYXJ0KHBhdHRlcm5QYXJ0KSkge1xuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ2xpdGVyYWwnLFxuICAgICAgICAgIHZhbHVlOiBwYXR0ZXJuUGFydC52YWx1ZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGludGxfdXRpbHNfMS5pbnZhcmlhbnQocGF0dGVyblBhcnQudHlwZSA9PT0gJzAnLCBcIk1hbGZvcm1lZCBwYXR0ZXJuIFwiICsgcGF0dGVybik7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKHZhciBwYXJ0c18xID0gKGVfMiA9IHZvaWQgMCwgX192YWx1ZXMocGFydHMpKSwgcGFydHNfMV8xID0gcGFydHNfMS5uZXh0KCk7ICFwYXJ0c18xXzEuZG9uZTsgcGFydHNfMV8xID0gcGFydHNfMS5uZXh0KCkpIHtcbiAgICAgICAgICAgIHZhciBwYXJ0ID0gcGFydHNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgICAgICB0eXBlOiBwYXJ0LnR5cGUsXG4gICAgICAgICAgICAgIHZhbHVlOiBwYXJ0LnZhbHVlLFxuICAgICAgICAgICAgICB1bml0OiB1bml0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVfMl8xKSB7XG4gICAgICAgICAgZV8yID0ge1xuICAgICAgICAgICAgZXJyb3I6IGVfMl8xXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHBhcnRzXzFfMSAmJiAhcGFydHNfMV8xLmRvbmUgJiYgKF9iID0gcGFydHNfMS5yZXR1cm4pKSBfYi5jYWxsKHBhcnRzXzEpO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoZV8yKSB0aHJvdyBlXzIuZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlXzFfMSkge1xuICAgIGVfMSA9IHtcbiAgICAgIGVycm9yOiBlXzFfMVxuICAgIH07XG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChwYXR0ZXJuUGFydHNfMV8xICYmICFwYXR0ZXJuUGFydHNfMV8xLmRvbmUgJiYgKF9hID0gcGF0dGVyblBhcnRzXzEucmV0dXJuKSkgX2EuY2FsbChwYXR0ZXJuUGFydHNfMSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBvYmplY3RJcyh4LCB5KSB7XG4gIGlmIChPYmplY3QuaXMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmlzKHgsIHkpO1xuICB9IC8vIFNhbWVWYWx1ZSBhbGdvcml0aG1cblxuXG4gIGlmICh4ID09PSB5KSB7XG4gICAgLy8gU3RlcHMgMS01LCA3LTEwXG4gICAgLy8gU3RlcHMgNi5iLTYuZTogKzAgIT0gLTBcbiAgICByZXR1cm4geCAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHk7XG4gIH0gLy8gU3RlcCA2LmE6IE5hTiA9PSBOYU5cblxuXG4gIHJldHVybiB4ICE9PSB4ICYmIHkgIT09IHk7XG59XG5cbmZ1bmN0aW9uIHRvU3RyaW5nKGFyZykge1xuICByZXR1cm4gYXJnICsgJyc7XG59XG4vKipcbiAqIFBhcnRpdGlvblJlbGF0aXZlVGltZVBhdHRlcm5cbiAqIEBwYXJhbSBydGZcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHBhcmFtIHVuaXRcbiAqL1xuXG5cbmZ1bmN0aW9uIHBhcnRpdGlvblJlbGF0aXZlVGltZVBhdHRlcm4oaW50ZXJuYWxTbG90TWFwLCBydGYsIHZhbHVlLCB1bml0KSB7XG4gIGludGxfdXRpbHNfMS5pbnZhcmlhbnQodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJywgXCJ2YWx1ZSBtdXN0IGJlIG51bWJlciwgaW5zdGVhZCBnb3QgXCIgKyB0eXBlb2YgdmFsdWUsIFR5cGVFcnJvcik7XG4gIGludGxfdXRpbHNfMS5pbnZhcmlhbnQodHlwZW9mIHVuaXQgPT09ICdzdHJpbmcnLCBcInVuaXQgbXVzdCBiZSBudW1iZXIsIGluc3RlYWQgZ290IFwiICsgdHlwZW9mIHZhbHVlLCBUeXBlRXJyb3IpO1xuXG4gIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPT09IEluZmluaXR5IHx8IHZhbHVlID09PSAtSW5maW5pdHkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgdmFsdWUgXCIgKyB2YWx1ZSk7XG4gIH1cblxuICB2YXIgcmVzb2x2ZWRVbml0ID0gc2luZ3VsYXJSZWxhdGl2ZVRpbWVVbml0KHVuaXQpO1xuICB2YXIgZmllbGRzID0gaW50bF91dGlsc18xLmdldEludGVybmFsU2xvdChpbnRlcm5hbFNsb3RNYXAsIHJ0ZiwgJ2ZpZWxkcycpO1xuICB2YXIgc3R5bGUgPSBpbnRsX3V0aWxzXzEuZ2V0SW50ZXJuYWxTbG90KGludGVybmFsU2xvdE1hcCwgcnRmLCAnc3R5bGUnKTtcbiAgdmFyIGVudHJ5ID0gcmVzb2x2ZWRVbml0O1xuXG4gIGlmIChzdHlsZSA9PT0gJ3Nob3J0Jykge1xuICAgIGVudHJ5ID0gdW5pdCArIFwiLXNob3J0XCI7XG4gIH0gZWxzZSBpZiAoc3R5bGUgPT09ICduYXJyb3cnKSB7XG4gICAgZW50cnkgPSB1bml0ICsgXCItbmFycm93XCI7XG4gIH1cblxuICBpZiAoIShlbnRyeSBpbiBmaWVsZHMpKSB7XG4gICAgZW50cnkgPSB1bml0O1xuICB9XG5cbiAgdmFyIHBhdHRlcm5zID0gZmllbGRzW2VudHJ5XTtcbiAgdmFyIG51bWVyaWMgPSBpbnRsX3V0aWxzXzEuZ2V0SW50ZXJuYWxTbG90KGludGVybmFsU2xvdE1hcCwgcnRmLCAnbnVtZXJpYycpO1xuXG4gIGlmIChudW1lcmljID09PSAnYXV0bycpIHtcbiAgICBpZiAodG9TdHJpbmcodmFsdWUpIGluIHBhdHRlcm5zKSB7XG4gICAgICByZXR1cm4gW3tcbiAgICAgICAgdHlwZTogJ2xpdGVyYWwnLFxuICAgICAgICB2YWx1ZTogcGF0dGVybnNbdG9TdHJpbmcodmFsdWUpXVxuICAgICAgfV07XG4gICAgfVxuICB9XG5cbiAgdmFyIHRsID0gJ2Z1dHVyZSc7XG5cbiAgaWYgKG9iamVjdElzKHZhbHVlLCAtMCkgfHwgdmFsdWUgPCAwKSB7XG4gICAgdGwgPSAncGFzdCc7XG4gIH1cblxuICB2YXIgcG8gPSBwYXR0ZXJuc1t0bF07XG4gIHZhciBwbHVyYWxSdWxlcyA9IGludGxfdXRpbHNfMS5nZXRJbnRlcm5hbFNsb3QoaW50ZXJuYWxTbG90TWFwLCBydGYsICdwbHVyYWxSdWxlcycpO1xuICB2YXIgbnVtYmVyRm9ybWF0ID0gaW50bF91dGlsc18xLmdldEludGVybmFsU2xvdChpbnRlcm5hbFNsb3RNYXAsIHJ0ZiwgJ251bWJlckZvcm1hdCcpO1xuICB2YXIgZnYgPSB0eXBlb2YgbnVtYmVyRm9ybWF0LmZvcm1hdFRvUGFydHMgPT09ICdmdW5jdGlvbicgPyBudW1iZXJGb3JtYXQuZm9ybWF0VG9QYXJ0cyhNYXRoLmFicyh2YWx1ZSkpIDogLy8gVE9ETzogSWYgZm9ybWF0VG9QYXJ0cyBpcyBub3Qgc3VwcG9ydGVkLCB3ZSBhc3N1bWUgdGhlIHdob2xlIGZvcm1hdHRlZFxuICAvLyBudW1iZXIgaXMgYSBwYXJ0XG4gIFt7XG4gICAgdHlwZTogJ2xpdGVyYWwnLFxuICAgIHZhbHVlOiBudW1iZXJGb3JtYXQuZm9ybWF0KE1hdGguYWJzKHZhbHVlKSksXG4gICAgdW5pdDogdW5pdFxuICB9XTtcbiAgdmFyIHByID0gcGx1cmFsUnVsZXMuc2VsZWN0KHZhbHVlKTtcbiAgdmFyIHBhdHRlcm4gPSBwb1twcl07XG4gIHJldHVybiBtYWtlUGFydHNMaXN0KHBhdHRlcm4sIHJlc29sdmVkVW5pdCwgZnYpO1xufVxuXG52YXIgUmVsYXRpdmVUaW1lRm9ybWF0ID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUmVsYXRpdmVUaW1lRm9ybWF0KGxvY2FsZXMsIG9wdGlvbnMpIHtcbiAgICAvLyB0ZXN0MjYyL3Rlc3QvaW50bDQwMi9SZWxhdGl2ZVRpbWVGb3JtYXQvY29uc3RydWN0b3IvY29uc3RydWN0b3IvbmV3dGFyZ2V0LXVuZGVmaW5lZC5qc1xuICAgIC8vIENhbm5vdCB1c2UgYG5ldy50YXJnZXRgIGJjIG9mIElFMTEgJiBUUyB0cmFuc3BpbGVzIGl0IHRvIHNvbWV0aGluZyBlbHNlXG4gICAgdmFyIG5ld1RhcmdldCA9IHRoaXMgJiYgdGhpcyBpbnN0YW5jZW9mIFJlbGF0aXZlVGltZUZvcm1hdCA/IHRoaXMuY29uc3RydWN0b3IgOiB2b2lkIDA7XG5cbiAgICBpZiAoIW5ld1RhcmdldCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludGwuUmVsYXRpdmVUaW1lRm9ybWF0IG11c3QgYmUgY2FsbGVkIHdpdGggJ25ldydcIik7XG4gICAgfVxuXG4gICAgaW50bF91dGlsc18xLnNldEludGVybmFsU2xvdChSZWxhdGl2ZVRpbWVGb3JtYXQuX19JTlRFUk5BTF9TTE9UX01BUF9fLCB0aGlzLCAnaW5pdGlhbGl6ZWRSZWxhdGl2ZVRpbWVGb3JtYXQnLCB0cnVlKTtcbiAgICB2YXIgcmVxdWVzdGVkTG9jYWxlcyA9IGludGxfdXRpbHNfMS5nZXRDYW5vbmljYWxMb2NhbGVzKGxvY2FsZXMpO1xuICAgIHZhciBvcHQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHZhciBvcHRzID0gb3B0aW9ucyA9PT0gdW5kZWZpbmVkID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IGludGxfdXRpbHNfMS50b09iamVjdChvcHRpb25zKTtcbiAgICB2YXIgbWF0Y2hlciA9IGludGxfdXRpbHNfMS5nZXRPcHRpb24ob3B0cywgJ2xvY2FsZU1hdGNoZXInLCAnc3RyaW5nJywgWydiZXN0IGZpdCcsICdsb29rdXAnXSwgJ2Jlc3QgZml0Jyk7XG4gICAgb3B0LmxvY2FsZU1hdGNoZXIgPSBtYXRjaGVyO1xuICAgIHZhciBudW1iZXJpbmdTeXN0ZW0gPSBpbnRsX3V0aWxzXzEuZ2V0T3B0aW9uKG9wdHMsICdudW1iZXJpbmdTeXN0ZW0nLCAnc3RyaW5nJywgdW5kZWZpbmVkLCB1bmRlZmluZWQpO1xuXG4gICAgaWYgKG51bWJlcmluZ1N5c3RlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoIU5VTUJFUklOR19TWVNURU1fUkVHRVgudGVzdChudW1iZXJpbmdTeXN0ZW0pKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBudW1iZXJpbmcgc3lzdGVtIFwiICsgbnVtYmVyaW5nU3lzdGVtKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBvcHQubnUgPSBudW1iZXJpbmdTeXN0ZW07XG4gICAgdmFyIHIgPSBpbnRsX3V0aWxzXzEuY3JlYXRlUmVzb2x2ZUxvY2FsZShSZWxhdGl2ZVRpbWVGb3JtYXQuZ2V0RGVmYXVsdExvY2FsZSkoUmVsYXRpdmVUaW1lRm9ybWF0LmF2YWlsYWJsZUxvY2FsZXMsIHJlcXVlc3RlZExvY2FsZXMsIG9wdCwgUmVsYXRpdmVUaW1lRm9ybWF0LnJlbGV2YW50RXh0ZW5zaW9uS2V5cywgUmVsYXRpdmVUaW1lRm9ybWF0LmxvY2FsZURhdGEpO1xuICAgIHZhciBsb2NhbGUgPSByLmxvY2FsZSxcbiAgICAgICAgbnUgPSByLm51O1xuICAgIGludGxfdXRpbHNfMS5zZXRJbnRlcm5hbFNsb3QoUmVsYXRpdmVUaW1lRm9ybWF0Ll9fSU5URVJOQUxfU0xPVF9NQVBfXywgdGhpcywgJ2xvY2FsZScsIGxvY2FsZSk7XG4gICAgaW50bF91dGlsc18xLnNldEludGVybmFsU2xvdChSZWxhdGl2ZVRpbWVGb3JtYXQuX19JTlRFUk5BTF9TTE9UX01BUF9fLCB0aGlzLCAnc3R5bGUnLCBpbnRsX3V0aWxzXzEuZ2V0T3B0aW9uKG9wdHMsICdzdHlsZScsICdzdHJpbmcnLCBbJ2xvbmcnLCAnbmFycm93JywgJ3Nob3J0J10sICdsb25nJykpO1xuICAgIGludGxfdXRpbHNfMS5zZXRJbnRlcm5hbFNsb3QoUmVsYXRpdmVUaW1lRm9ybWF0Ll9fSU5URVJOQUxfU0xPVF9NQVBfXywgdGhpcywgJ251bWVyaWMnLCBpbnRsX3V0aWxzXzEuZ2V0T3B0aW9uKG9wdHMsICdudW1lcmljJywgJ3N0cmluZycsIFsnYWx3YXlzJywgJ2F1dG8nXSwgJ2Fsd2F5cycpKTtcbiAgICBpbnRsX3V0aWxzXzEuc2V0SW50ZXJuYWxTbG90KFJlbGF0aXZlVGltZUZvcm1hdC5fX0lOVEVSTkFMX1NMT1RfTUFQX18sIHRoaXMsICdmaWVsZHMnLCBSZWxhdGl2ZVRpbWVGb3JtYXQubG9jYWxlRGF0YVtsb2NhbGVdKTtcbiAgICBpbnRsX3V0aWxzXzEuc2V0SW50ZXJuYWxTbG90KFJlbGF0aXZlVGltZUZvcm1hdC5fX0lOVEVSTkFMX1NMT1RfTUFQX18sIHRoaXMsICdudW1iZXJGb3JtYXQnLCBuZXcgSW50bC5OdW1iZXJGb3JtYXQobG9jYWxlcykpO1xuICAgIGludGxfdXRpbHNfMS5zZXRJbnRlcm5hbFNsb3QoUmVsYXRpdmVUaW1lRm9ybWF0Ll9fSU5URVJOQUxfU0xPVF9NQVBfXywgdGhpcywgJ3BsdXJhbFJ1bGVzJywgbmV3IEludGwuUGx1cmFsUnVsZXMobG9jYWxlcykpO1xuICAgIGludGxfdXRpbHNfMS5zZXRJbnRlcm5hbFNsb3QoUmVsYXRpdmVUaW1lRm9ybWF0Ll9fSU5URVJOQUxfU0xPVF9NQVBfXywgdGhpcywgJ251bWJlcmluZ1N5c3RlbScsIG51KTtcbiAgfVxuXG4gIFJlbGF0aXZlVGltZUZvcm1hdC5wcm90b3R5cGUuZm9ybWF0ID0gZnVuY3Rpb24gKHZhbHVlLCB1bml0KSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZm9ybWF0IHdhcyBjYWxsZWQgb24gYSBub24tb2JqZWN0Jyk7XG4gICAgfVxuXG4gICAgaWYgKCFpbnRsX3V0aWxzXzEuZ2V0SW50ZXJuYWxTbG90KFJlbGF0aXZlVGltZUZvcm1hdC5fX0lOVEVSTkFMX1NMT1RfTUFQX18sIHRoaXMsICdpbml0aWFsaXplZFJlbGF0aXZlVGltZUZvcm1hdCcpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdmb3JtYXQgd2FzIGNhbGxlZCBvbiBhIGludmFsaWQgY29udGV4dCcpO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJ0aXRpb25SZWxhdGl2ZVRpbWVQYXR0ZXJuKFJlbGF0aXZlVGltZUZvcm1hdC5fX0lOVEVSTkFMX1NMT1RfTUFQX18sIHRoaXMsIE51bWJlcih2YWx1ZSksIHRvU3RyaW5nKHVuaXQpKS5tYXAoZnVuY3Rpb24gKGVsKSB7XG4gICAgICByZXR1cm4gZWwudmFsdWU7XG4gICAgfSkuam9pbignJyk7XG4gIH07XG5cbiAgUmVsYXRpdmVUaW1lRm9ybWF0LnByb3RvdHlwZS5mb3JtYXRUb1BhcnRzID0gZnVuY3Rpb24gKHZhbHVlLCB1bml0KSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZm9ybWF0VG9QYXJ0cyB3YXMgY2FsbGVkIG9uIGEgbm9uLW9iamVjdCcpO1xuICAgIH1cblxuICAgIGlmICghaW50bF91dGlsc18xLmdldEludGVybmFsU2xvdChSZWxhdGl2ZVRpbWVGb3JtYXQuX19JTlRFUk5BTF9TTE9UX01BUF9fLCB0aGlzLCAnaW5pdGlhbGl6ZWRSZWxhdGl2ZVRpbWVGb3JtYXQnKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZm9ybWF0VG9QYXJ0cyB3YXMgY2FsbGVkIG9uIGEgaW52YWxpZCBjb250ZXh0Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnRpdGlvblJlbGF0aXZlVGltZVBhdHRlcm4oUmVsYXRpdmVUaW1lRm9ybWF0Ll9fSU5URVJOQUxfU0xPVF9NQVBfXywgdGhpcywgTnVtYmVyKHZhbHVlKSwgdG9TdHJpbmcodW5pdCkpO1xuICB9O1xuXG4gIFJlbGF0aXZlVGltZUZvcm1hdC5wcm90b3R5cGUucmVzb2x2ZWRPcHRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3Jlc29sdmVkT3B0aW9ucyB3YXMgY2FsbGVkIG9uIGEgbm9uLW9iamVjdCcpO1xuICAgIH1cblxuICAgIGlmICghaW50bF91dGlsc18xLmdldEludGVybmFsU2xvdChSZWxhdGl2ZVRpbWVGb3JtYXQuX19JTlRFUk5BTF9TTE9UX01BUF9fLCB0aGlzLCAnaW5pdGlhbGl6ZWRSZWxhdGl2ZVRpbWVGb3JtYXQnKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncmVzb2x2ZWRPcHRpb25zIHdhcyBjYWxsZWQgb24gYSBpbnZhbGlkIGNvbnRleHQnKTtcbiAgICB9IC8vIHRlc3QyNjIvdGVzdC9pbnRsNDAyL1JlbGF0aXZlVGltZUZvcm1hdC9wcm90b3R5cGUvcmVzb2x2ZWRPcHRpb25zL3R5cGUuanNcblxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxvY2FsZTogaW50bF91dGlsc18xLmdldEludGVybmFsU2xvdChSZWxhdGl2ZVRpbWVGb3JtYXQuX19JTlRFUk5BTF9TTE9UX01BUF9fLCB0aGlzLCAnbG9jYWxlJyksXG4gICAgICBzdHlsZTogaW50bF91dGlsc18xLmdldEludGVybmFsU2xvdChSZWxhdGl2ZVRpbWVGb3JtYXQuX19JTlRFUk5BTF9TTE9UX01BUF9fLCB0aGlzLCAnc3R5bGUnKSxcbiAgICAgIG51bWVyaWM6IGludGxfdXRpbHNfMS5nZXRJbnRlcm5hbFNsb3QoUmVsYXRpdmVUaW1lRm9ybWF0Ll9fSU5URVJOQUxfU0xPVF9NQVBfXywgdGhpcywgJ251bWVyaWMnKSxcbiAgICAgIG51bWJlcmluZ1N5c3RlbTogaW50bF91dGlsc18xLmdldEludGVybmFsU2xvdChSZWxhdGl2ZVRpbWVGb3JtYXQuX19JTlRFUk5BTF9TTE9UX01BUF9fLCB0aGlzLCAnbnVtYmVyaW5nU3lzdGVtJylcbiAgICB9O1xuICB9O1xuXG4gIFJlbGF0aXZlVGltZUZvcm1hdC5zdXBwb3J0ZWRMb2NhbGVzT2YgPSBmdW5jdGlvbiAobG9jYWxlcywgb3B0aW9ucykge1xuICAgIHJldHVybiBpbnRsX3V0aWxzXzEuc3VwcG9ydGVkTG9jYWxlcyhSZWxhdGl2ZVRpbWVGb3JtYXQuYXZhaWxhYmxlTG9jYWxlcywgaW50bF91dGlsc18xLmdldENhbm9uaWNhbExvY2FsZXMobG9jYWxlcyksIG9wdGlvbnMpO1xuICB9O1xuXG4gIFJlbGF0aXZlVGltZUZvcm1hdC5fX2FkZExvY2FsZURhdGEgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGVfMywgX2E7XG5cbiAgICB2YXIgZGF0YSA9IFtdO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIGRhdGFbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICB9XG5cbiAgICB2YXIgX2xvb3BfMSA9IGZ1bmN0aW9uIF9sb29wXzEoZGF0dW0pIHtcbiAgICAgIHZhciBhdmFpbGFibGVMb2NhbGVzID0gT2JqZWN0LmtleXMoX19zcHJlYWQoZGF0dW0uYXZhaWxhYmxlTG9jYWxlcywgT2JqZWN0LmtleXMoZGF0dW0uYWxpYXNlcyksIE9iamVjdC5rZXlzKGRhdHVtLnBhcmVudExvY2FsZXMpKS5yZWR1Y2UoZnVuY3Rpb24gKGFsbCwgaykge1xuICAgICAgICBhbGxba10gPSB0cnVlO1xuICAgICAgICByZXR1cm4gYWxsO1xuICAgICAgfSwge30pKTtcbiAgICAgIGF2YWlsYWJsZUxvY2FsZXMuZm9yRWFjaChmdW5jdGlvbiAobG9jYWxlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgUmVsYXRpdmVUaW1lRm9ybWF0LmxvY2FsZURhdGFbbG9jYWxlXSA9IHVucGFja0RhdGEobG9jYWxlLCBkYXR1bSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHsvLyBJZiB3ZSBjYW4ndCB1bnBhY2sgdGhpcyBkYXRhLCBpZ25vcmUgdGhlIGxvY2FsZVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAodmFyIGRhdGFfMSA9IF9fdmFsdWVzKGRhdGEpLCBkYXRhXzFfMSA9IGRhdGFfMS5uZXh0KCk7ICFkYXRhXzFfMS5kb25lOyBkYXRhXzFfMSA9IGRhdGFfMS5uZXh0KCkpIHtcbiAgICAgICAgdmFyIGRhdHVtID0gZGF0YV8xXzEudmFsdWU7XG5cbiAgICAgICAgX2xvb3BfMShkYXR1bSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZV8zXzEpIHtcbiAgICAgIGVfMyA9IHtcbiAgICAgICAgZXJyb3I6IGVfM18xXG4gICAgICB9O1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoZGF0YV8xXzEgJiYgIWRhdGFfMV8xLmRvbmUgJiYgKF9hID0gZGF0YV8xLnJldHVybikpIF9hLmNhbGwoZGF0YV8xKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChlXzMpIHRocm93IGVfMy5lcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBSZWxhdGl2ZVRpbWVGb3JtYXQuYXZhaWxhYmxlTG9jYWxlcyA9IE9iamVjdC5rZXlzKFJlbGF0aXZlVGltZUZvcm1hdC5sb2NhbGVEYXRhKTtcblxuICAgIGlmICghUmVsYXRpdmVUaW1lRm9ybWF0Ll9fZGVmYXVsdExvY2FsZSkge1xuICAgICAgUmVsYXRpdmVUaW1lRm9ybWF0Ll9fZGVmYXVsdExvY2FsZSA9IFJlbGF0aXZlVGltZUZvcm1hdC5hdmFpbGFibGVMb2NhbGVzWzBdO1xuICAgIH1cbiAgfTtcblxuICBSZWxhdGl2ZVRpbWVGb3JtYXQuZ2V0RGVmYXVsdExvY2FsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gUmVsYXRpdmVUaW1lRm9ybWF0Ll9fZGVmYXVsdExvY2FsZTtcbiAgfTtcblxuICBSZWxhdGl2ZVRpbWVGb3JtYXQubG9jYWxlRGF0YSA9IHt9O1xuICBSZWxhdGl2ZVRpbWVGb3JtYXQuYXZhaWxhYmxlTG9jYWxlcyA9IFtdO1xuICBSZWxhdGl2ZVRpbWVGb3JtYXQuX19kZWZhdWx0TG9jYWxlID0gJ2VuJztcbiAgUmVsYXRpdmVUaW1lRm9ybWF0LnJlbGV2YW50RXh0ZW5zaW9uS2V5cyA9IFsnbnUnXTtcbiAgUmVsYXRpdmVUaW1lRm9ybWF0LnBvbHlmaWxsZWQgPSB0cnVlO1xuICBSZWxhdGl2ZVRpbWVGb3JtYXQuX19JTlRFUk5BTF9TTE9UX01BUF9fID0gbmV3IFdlYWtNYXAoKTtcbiAgcmV0dXJuIFJlbGF0aXZlVGltZUZvcm1hdDtcbn0oKTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gUmVsYXRpdmVUaW1lRm9ybWF0O1xuXG50cnkge1xuICAvLyBJRTExIGRvZXMgbm90IGhhdmUgU3ltYm9sXG4gIGlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWxhdGl2ZVRpbWVGb3JtYXQucHJvdG90eXBlLCBTeW1ib2wudG9TdHJpbmdUYWcsIHtcbiAgICAgIHZhbHVlOiAnSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQnLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgfSAvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS90ZXN0MjYyL2Jsb2IvbWFzdGVyL3Rlc3QvaW50bDQwMi9SZWxhdGl2ZVRpbWVGb3JtYXQvY29uc3RydWN0b3IvbGVuZ3RoLmpzXG5cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVsYXRpdmVUaW1lRm9ybWF0LnByb3RvdHlwZS5jb25zdHJ1Y3RvciwgJ2xlbmd0aCcsIHtcbiAgICB2YWx1ZTogMCxcbiAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pOyAvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS90ZXN0MjYyL2Jsb2IvbWFzdGVyL3Rlc3QvaW50bDQwMi9SZWxhdGl2ZVRpbWVGb3JtYXQvY29uc3RydWN0b3Ivc3VwcG9ydGVkTG9jYWxlc09mL2xlbmd0aC5qc1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWxhdGl2ZVRpbWVGb3JtYXQuc3VwcG9ydGVkTG9jYWxlc09mLCAnbGVuZ3RoJywge1xuICAgIHZhbHVlOiAxLFxuICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG59IGNhdGNoIChlKSB7Ly8gTWV0YSBmaXggc28gd2UncmUgdGVzdDI2Mi1jb21wbGlhbnQsIG5vdCBpbXBvcnRhbnRcbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///9905\n")},8079:function(){eval('/* @generated */\n// prettier-ignore\nif (Intl.RelativeTimeFormat && typeof Intl.RelativeTimeFormat.__addLocaleData === \'function\') {\n Intl.RelativeTimeFormat.__addLocaleData({\n "data": {\n "en-001": {\n "year-short": {\n "0": "this yr",\n "1": "next yr",\n "future": {\n "one": "in {0} yr",\n "other": "in {0} yr"\n },\n "past": {\n "one": "{0} yr ago",\n "other": "{0} yr ago"\n },\n "-1": "last yr"\n },\n "year-narrow": {\n "0": "this yr",\n "1": "next yr",\n "future": {\n "one": "in {0} yr",\n "other": "in {0} yr"\n },\n "past": {\n "one": "{0} yr ago",\n "other": "{0} yr ago"\n },\n "-1": "last yr"\n },\n "quarter-short": {\n "0": "this qtr.",\n "1": "next qtr.",\n "future": {\n "one": "in {0} qtr",\n "other": "in {0} qtr"\n },\n "past": {\n "one": "{0} qtr ago",\n "other": "{0} qtr ago"\n },\n "-1": "last qtr."\n },\n "quarter-narrow": {\n "0": "this qtr.",\n "1": "next qtr.",\n "future": {\n "one": "in {0} qtr",\n "other": "in {0} qtr"\n },\n "past": {\n "one": "{0} qtr ago",\n "other": "{0} qtr ago"\n },\n "-1": "last qtr."\n },\n "month-short": {\n "0": "this mo",\n "1": "next mo",\n "future": {\n "one": "in {0} mo",\n "other": "in {0} mo"\n },\n "past": {\n "one": "{0} mo ago",\n "other": "{0} mo ago"\n },\n "-1": "last mo"\n },\n "month-narrow": {\n "0": "this mo",\n "1": "next mo",\n "future": {\n "one": "in {0} mo",\n "other": "in {0} mo"\n },\n "past": {\n "one": "{0} mo ago",\n "other": "{0} mo ago"\n },\n "-1": "last mo"\n },\n "week-short": {\n "0": "this wk",\n "1": "next wk",\n "future": {\n "one": "in {0} wk",\n "other": "in {0} wk"\n },\n "past": {\n "one": "{0} wk ago",\n "other": "{0} wk ago"\n },\n "-1": "last wk"\n },\n "week-narrow": {\n "0": "this wk",\n "1": "next wk",\n "future": {\n "one": "in {0} wk",\n "other": "in {0} wk"\n },\n "past": {\n "one": "{0} wk ago",\n "other": "{0} wk ago"\n },\n "-1": "last wk"\n },\n "hour-short": {\n "0": "this hour",\n "future": {\n "one": "in {0} hr",\n "other": "in {0} hr"\n },\n "past": {\n "one": "{0} hr ago",\n "other": "{0} hr ago"\n }\n },\n "hour-narrow": {\n "0": "this hour",\n "future": {\n "one": "in {0} hr",\n "other": "in {0} hr"\n },\n "past": {\n "one": "{0} hr ago",\n "other": "{0} hr ago"\n }\n },\n "minute-short": {\n "0": "this minute",\n "future": {\n "one": "in {0} min",\n "other": "in {0} min"\n },\n "past": {\n "one": "{0} min ago",\n "other": "{0} min ago"\n }\n },\n "minute-narrow": {\n "0": "this minute",\n "future": {\n "one": "in {0} min",\n "other": "in {0} min"\n },\n "past": {\n "one": "{0} min ago",\n "other": "{0} min ago"\n }\n },\n "second-short": {\n "0": "now",\n "future": {\n "one": "in {0} sec",\n "other": "in {0} sec"\n },\n "past": {\n "one": "{0} sec ago",\n "other": "{0} sec ago"\n }\n },\n "second-narrow": {\n "0": "now",\n "future": {\n "one": "in {0} sec",\n "other": "in {0} sec"\n },\n "past": {\n "one": "{0} sec ago",\n "other": "{0} sec ago"\n }\n }\n },\n "en-150": {\n "year-short": {\n "0": "this yr",\n "1": "next yr",\n "future": {\n "one": "in {0} yr",\n "other": "in {0} yr"\n },\n "past": {\n "one": "{0} yr ago",\n "other": "{0} yr ago"\n },\n "-1": "last yr"\n },\n "year-narrow": {\n "0": "this yr",\n "1": "next yr",\n "future": {\n "one": "in {0} yr",\n "other": "in {0} yr"\n },\n "past": {\n "one": "{0} yr ago",\n "other": "{0} yr ago"\n },\n "-1": "last yr"\n },\n "quarter-short": {\n "0": "this qtr.",\n "1": "next qtr.",\n "future": {\n "one": "in {0} qtr",\n "other": "in {0} qtr"\n },\n "past": {\n "one": "{0} qtr ago",\n "other": "{0} qtr ago"\n },\n "-1": "last qtr."\n },\n "quarter-narrow": {\n "0": "this qtr.",\n "1": "next qtr.",\n "future": {\n "one": "in {0} qtr",\n "other": "in {0} qtr"\n },\n "past": {\n "one": "{0} qtr ago",\n "other": "{0} qtr ago"\n },\n "-1": "last qtr."\n },\n "month-short": {\n "0": "this mo",\n "1": "next mo",\n "future": {\n "one": "in {0} mo",\n "other": "in {0} mo"\n },\n "past": {\n "one": "{0} mo ago",\n "other": "{0} mo ago"\n },\n "-1": "last mo"\n },\n "month-narrow": {\n "0": "this mo",\n "1": "next mo",\n "future": {\n "one": "in {0} mo",\n "other": "in {0} mo"\n },\n "past": {\n "one": "{0} mo ago",\n "other": "{0} mo ago"\n },\n "-1": "last mo"\n },\n "week-short": {\n "0": "this wk",\n "1": "next wk",\n "future": {\n "one": "in {0} wk",\n "other": "in {0} wk"\n },\n "past": {\n "one": "{0} wk ago",\n "other": "{0} wk ago"\n },\n "-1": "last wk"\n },\n "week-narrow": {\n "0": "this wk",\n "1": "next wk",\n "future": {\n "one": "in {0} wk",\n "other": "in {0} wk"\n },\n "past": {\n "one": "{0} wk ago",\n "other": "{0} wk ago"\n },\n "-1": "last wk"\n },\n "hour-short": {\n "0": "this hour",\n "future": {\n "one": "in {0} hr",\n "other": "in {0} hr"\n },\n "past": {\n "one": "{0} hr ago",\n "other": "{0} hr ago"\n }\n },\n "hour-narrow": {\n "0": "this hour",\n "future": {\n "one": "in {0} hr",\n "other": "in {0} hr"\n },\n "past": {\n "one": "{0} hr ago",\n "other": "{0} hr ago"\n }\n },\n "minute-short": {\n "0": "this minute",\n "future": {\n "one": "in {0} min",\n "other": "in {0} min"\n },\n "past": {\n "one": "{0} min ago",\n "other": "{0} min ago"\n }\n },\n "minute-narrow": {\n "0": "this minute",\n "future": {\n "one": "in {0} min",\n "other": "in {0} min"\n },\n "past": {\n "one": "{0} min ago",\n "other": "{0} min ago"\n }\n },\n "second-short": {\n "0": "now",\n "future": {\n "one": "in {0} sec",\n "other": "in {0} sec"\n },\n "past": {\n "one": "{0} sec ago",\n "other": "{0} sec ago"\n }\n },\n "second-narrow": {\n "0": "now",\n "future": {\n "one": "in {0} sec",\n "other": "in {0} sec"\n },\n "past": {\n "one": "{0} sec ago",\n "other": "{0} sec ago"\n }\n }\n },\n "en-AU": {\n "year-short": {\n "0": "this yr",\n "1": "next yr",\n "future": {\n "one": "in {0} yr",\n "other": "in {0} yrs"\n },\n "past": {\n "one": "{0} yr ago",\n "other": "{0} yrs ago"\n },\n "-1": "last yr"\n },\n "year-narrow": {\n "0": "this yr",\n "1": "next yr",\n "future": {\n "one": "in {0} yr",\n "other": "in {0} yrs"\n },\n "past": {\n "one": "{0} yr ago",\n "other": "{0} yrs ago"\n },\n "-1": "last yr"\n },\n "quarter-short": {\n "0": "this qtr.",\n "1": "next qtr.",\n "future": {\n "one": "in {0} qtr",\n "other": "in {0} qtrs"\n },\n "past": {\n "one": "{0} qtr ago",\n "other": "{0} qtrs ago"\n },\n "-1": "last qtr."\n },\n "quarter-narrow": {\n "0": "this qtr.",\n "1": "next qtr.",\n "future": {\n "one": "in {0} qtr",\n "other": "in {0} qtrs"\n },\n "past": {\n "one": "in {0} qtr ago",\n "other": "{0} qtrs ago"\n },\n "-1": "last qtr."\n },\n "month-short": {\n "0": "this mo",\n "1": "next mo",\n "future": {\n "one": "in {0} mo.",\n "other": "in {0} mo."\n },\n "past": {\n "one": "{0} mo. ago",\n "other": "{0} mo. ago"\n },\n "-1": "last mo"\n },\n "month-narrow": {\n "0": "this mo",\n "1": "next mo",\n "future": {\n "one": "in {0} mo.",\n "other": "in {0} mo."\n },\n "past": {\n "one": "{0} mo. ago",\n "other": "{0} mo. ago"\n },\n "-1": "last mo"\n },\n "week-short": {\n "0": "this wk",\n "1": "next wk",\n "future": {\n "one": "in {0} wk",\n "other": "in {0} wks"\n },\n "past": {\n "one": "{0} wk ago",\n "other": "{0} wks ago"\n },\n "-1": "last wk"\n },\n "week-narrow": {\n "0": "this wk",\n "1": "next wk",\n "future": {\n "one": "in {0} wk",\n "other": "in {0} wks"\n },\n "past": {\n "one": "{0} wk ago",\n "other": "{0} wks ago"\n },\n "-1": "last wk"\n },\n "hour-short": {\n "0": "this hour",\n "future": {\n "one": "in {0} hr",\n "other": "in {0} hrs"\n },\n "past": {\n "one": "{0} hr ago",\n "other": "{0} hrs ago"\n }\n },\n "hour-narrow": {\n "0": "this hour",\n "future": {\n "one": "in {0} hr",\n "other": "in {0} hrs"\n },\n "past": {\n "one": "{0} hr ago",\n "other": "{0} hrs ago"\n }\n },\n "minute-short": {\n "0": "this minute",\n "future": {\n "one": "in {0} min.",\n "other": "in {0} mins"\n },\n "past": {\n "one": "{0} min. ago",\n "other": "{0} mins ago"\n }\n },\n "minute-narrow": {\n "0": "this minute",\n "future": {\n "one": "in {0} min.",\n "other": "in {0} mins"\n },\n "past": {\n "one": "{0} min. ago",\n "other": "{0} mins ago"\n }\n },\n "second-short": {\n "0": "now",\n "future": {\n "one": "in {0} sec.",\n "other": "in {0} secs"\n },\n "past": {\n "one": "{0} sec. ago",\n "other": "{0} secs ago"\n }\n },\n "second-narrow": {\n "0": "now",\n "future": {\n "one": "in {0} sec.",\n "other": "in {0} secs"\n },\n "past": {\n "one": "{0} sec. ago",\n "other": "{0} secs ago"\n }\n }\n },\n "en-CA": {\n "year-short": {\n "0": "this yr",\n "1": "next yr",\n "future": {\n "one": "in {0} yr.",\n "other": "in {0} yrs."\n },\n "past": {\n "one": "{0} yr. ago",\n "other": "{0} yrs. ago"\n },\n "-1": "last yr"\n },\n "year-narrow": {\n "0": "this yr",\n "1": "next yr",\n "future": {\n "one": "in {0} yr.",\n "other": "in {0} yrs."\n },\n "past": {\n "one": "{0} yr. ago",\n "other": "{0} yrs. ago"\n },\n "-1": "last yr"\n },\n "quarter-short": {\n "0": "this qtr.",\n "1": "next qtr.",\n "future": {\n "one": "in {0} qtr.",\n "other": "in {0} qtrs."\n },\n "past": {\n "one": "{0} qtr. ago",\n "other": "{0} qtrs. ago"\n },\n "-1": "last qtr."\n },\n "quarter-narrow": {\n "0": "this qtr.",\n "1": "next qtr.",\n "future": {\n "one": "in {0} qtr.",\n "other": "in {0} qtrs."\n },\n "past": {\n "one": "{0} qtr. ago",\n "other": "{0} qtrs. ago"\n },\n "-1": "last qtr."\n },\n "month-short": {\n "0": "this mo",\n "1": "next mo",\n "future": {\n "one": "in {0} mo.",\n "other": "in {0} mos."\n },\n "past": {\n "one": "{0} mo. ago",\n "other": "{0} mos. ago"\n },\n "-1": "last mo"\n },\n "month-narrow": {\n "0": "this mo",\n "1": "next mo",\n "future": {\n "one": "in {0} mo.",\n "other": "in {0} mos."\n },\n "past": {\n "one": "{0} mo. ago",\n "other": "{0} mos. ago"\n },\n "-1": "last mo"\n },\n "week-short": {\n "0": "this wk",\n "1": "next wk",\n "future": {\n "one": "in {0} wk.",\n "other": "in {0} wks."\n },\n "past": {\n "one": "{0} wk. ago",\n "other": "{0} wks. ago"\n },\n "-1": "last wk"\n },\n "week-narrow": {\n "0": "this wk",\n "1": "next wk",\n "future": {\n "one": "in {0} wk.",\n "other": "in {0} wks."\n },\n "past": {\n "one": "{0} wk. ago",\n "other": "{0} wks. ago"\n },\n "-1": "last wk"\n },\n "hour-short": {\n "0": "this hour",\n "future": {\n "one": "in {0} hr.",\n "other": "in {0} hrs."\n },\n "past": {\n "one": "{0} hr. ago",\n "other": "{0} hrs. ago"\n }\n },\n "hour-narrow": {\n "0": "this hour",\n "future": {\n "one": "in {0} hr.",\n "other": "in {0} hrs."\n },\n "past": {\n "one": "{0} hr. ago",\n "other": "{0} hrs. ago"\n }\n },\n "minute-short": {\n "0": "this minute",\n "future": {\n "one": "in {0} min.",\n "other": "in {0} mins."\n },\n "past": {\n "one": "{0} min. ago",\n "other": "{0} mins. ago"\n }\n },\n "minute-narrow": {\n "0": "this minute",\n "future": {\n "one": "in {0} min.",\n "other": "in {0} mins."\n },\n "past": {\n "one": "{0} min. ago",\n "other": "{0} mins. ago"\n }\n },\n "second-short": {\n "0": "now",\n "future": {\n "one": "in {0} sec.",\n "other": "in {0} secs."\n },\n "past": {\n "one": "{0} sec. ago",\n "other": "{0} secs. ago"\n }\n },\n "second-narrow": {\n "0": "now",\n "future": {\n "one": "in {0} sec.",\n "other": "in {0} secs."\n },\n "past": {\n "one": "{0} sec. ago",\n "other": "{0} secs. ago"\n }\n }\n },\n "en-SG": {\n "quarter-short": {\n "0": "this qtr",\n "1": "next qtr",\n "future": {\n "one": "in {0} qtr",\n "other": "in {0} qtrs"\n },\n "past": {\n "one": "{0} qtr ago",\n "other": "{0} qtrs ago"\n },\n "-1": "last qtr"\n },\n "quarter-narrow": {\n "0": "this qtr",\n "1": "next qtr",\n "future": {\n "one": "in {0} qtr",\n "other": "in {0} qtr"\n },\n "past": {\n "one": "{0} qtr ago",\n "other": "{0} qtr ago"\n },\n "-1": "last qtr"\n },\n "month-short": {\n "0": "this mth",\n "1": "next mth",\n "future": {\n "one": "in {0} mth",\n "other": "in {0} mth"\n },\n "past": {\n "one": "{0} mth ago",\n "other": "{0} mth ago"\n },\n "-1": "last mth"\n }\n },\n "en": {\n "nu": ["latn"],\n "year": {\n "0": "this year",\n "1": "next year",\n "future": {\n "one": "in {0} year",\n "other": "in {0} years"\n },\n "past": {\n "one": "{0} year ago",\n "other": "{0} years ago"\n },\n "-1": "last year"\n },\n "year-short": {\n "0": "this yr.",\n "1": "next yr.",\n "future": {\n "one": "in {0} yr.",\n "other": "in {0} yr."\n },\n "past": {\n "one": "{0} yr. ago",\n "other": "{0} yr. ago"\n },\n "-1": "last yr."\n },\n "year-narrow": {\n "0": "this yr.",\n "1": "next yr.",\n "future": {\n "one": "in {0} yr.",\n "other": "in {0} yr."\n },\n "past": {\n "one": "{0} yr. ago",\n "other": "{0} yr. ago"\n },\n "-1": "last yr."\n },\n "quarter": {\n "0": "this quarter",\n "1": "next quarter",\n "future": {\n "one": "in {0} quarter",\n "other": "in {0} quarters"\n },\n "past": {\n "one": "{0} quarter ago",\n "other": "{0} quarters ago"\n },\n "-1": "last quarter"\n },\n "quarter-short": {\n "0": "this qtr.",\n "1": "next qtr.",\n "future": {\n "one": "in {0} qtr.",\n "other": "in {0} qtrs."\n },\n "past": {\n "one": "{0} qtr. ago",\n "other": "{0} qtrs. ago"\n },\n "-1": "last qtr."\n },\n "quarter-narrow": {\n "0": "this qtr.",\n "1": "next qtr.",\n "future": {\n "one": "in {0} qtr.",\n "other": "in {0} qtrs."\n },\n "past": {\n "one": "{0} qtr. ago",\n "other": "{0} qtrs. ago"\n },\n "-1": "last qtr."\n },\n "month": {\n "0": "this month",\n "1": "next month",\n "future": {\n "one": "in {0} month",\n "other": "in {0} months"\n },\n "past": {\n "one": "{0} month ago",\n "other": "{0} months ago"\n },\n "-1": "last month"\n },\n "month-short": {\n "0": "this mo.",\n "1": "next mo.",\n "future": {\n "one": "in {0} mo.",\n "other": "in {0} mo."\n },\n "past": {\n "one": "{0} mo. ago",\n "other": "{0} mo. ago"\n },\n "-1": "last mo."\n },\n "month-narrow": {\n "0": "this mo.",\n "1": "next mo.",\n "future": {\n "one": "in {0} mo.",\n "other": "in {0} mo."\n },\n "past": {\n "one": "{0} mo. ago",\n "other": "{0} mo. ago"\n },\n "-1": "last mo."\n },\n "week": {\n "0": "this week",\n "1": "next week",\n "future": {\n "one": "in {0} week",\n "other": "in {0} weeks"\n },\n "past": {\n "one": "{0} week ago",\n "other": "{0} weeks ago"\n },\n "-1": "last week"\n },\n "week-short": {\n "0": "this wk.",\n "1": "next wk.",\n "future": {\n "one": "in {0} wk.",\n "other": "in {0} wk."\n },\n "past": {\n "one": "{0} wk. ago",\n "other": "{0} wk. ago"\n },\n "-1": "last wk."\n },\n "week-narrow": {\n "0": "this wk.",\n "1": "next wk.",\n "future": {\n "one": "in {0} wk.",\n "other": "in {0} wk."\n },\n "past": {\n "one": "{0} wk. ago",\n "other": "{0} wk. ago"\n },\n "-1": "last wk."\n },\n "day": {\n "0": "today",\n "1": "tomorrow",\n "future": {\n "one": "in {0} day",\n "other": "in {0} days"\n },\n "past": {\n "one": "{0} day ago",\n "other": "{0} days ago"\n },\n "-1": "yesterday"\n },\n "day-short": {\n "0": "today",\n "1": "tomorrow",\n "future": {\n "one": "in {0} day",\n "other": "in {0} days"\n },\n "past": {\n "one": "{0} day ago",\n "other": "{0} days ago"\n },\n "-1": "yesterday"\n },\n "day-narrow": {\n "0": "today",\n "1": "tomorrow",\n "future": {\n "one": "in {0} day",\n "other": "in {0} days"\n },\n "past": {\n "one": "{0} day ago",\n "other": "{0} days ago"\n },\n "-1": "yesterday"\n },\n "hour": {\n "0": "this hour",\n "future": {\n "one": "in {0} hour",\n "other": "in {0} hours"\n },\n "past": {\n "one": "{0} hour ago",\n "other": "{0} hours ago"\n }\n },\n "hour-short": {\n "0": "this hour",\n "future": {\n "one": "in {0} hr.",\n "other": "in {0} hr."\n },\n "past": {\n "one": "{0} hr. ago",\n "other": "{0} hr. ago"\n }\n },\n "hour-narrow": {\n "0": "this hour",\n "future": {\n "one": "in {0} hr.",\n "other": "in {0} hr."\n },\n "past": {\n "one": "{0} hr. ago",\n "other": "{0} hr. ago"\n }\n },\n "minute": {\n "0": "this minute",\n "future": {\n "one": "in {0} minute",\n "other": "in {0} minutes"\n },\n "past": {\n "one": "{0} minute ago",\n "other": "{0} minutes ago"\n }\n },\n "minute-short": {\n "0": "this minute",\n "future": {\n "one": "in {0} min.",\n "other": "in {0} min."\n },\n "past": {\n "one": "{0} min. ago",\n "other": "{0} min. ago"\n }\n },\n "minute-narrow": {\n "0": "this minute",\n "future": {\n "one": "in {0} min.",\n "other": "in {0} min."\n },\n "past": {\n "one": "{0} min. ago",\n "other": "{0} min. ago"\n }\n },\n "second": {\n "0": "now",\n "future": {\n "one": "in {0} second",\n "other": "in {0} seconds"\n },\n "past": {\n "one": "{0} second ago",\n "other": "{0} seconds ago"\n }\n },\n "second-short": {\n "0": "now",\n "future": {\n "one": "in {0} sec.",\n "other": "in {0} sec."\n },\n "past": {\n "one": "{0} sec. ago",\n "other": "{0} sec. ago"\n }\n },\n "second-narrow": {\n "0": "now",\n "future": {\n "one": "in {0} sec.",\n "other": "in {0} sec."\n },\n "past": {\n "one": "{0} sec. ago",\n "other": "{0} sec. ago"\n }\n }\n }\n },\n "availableLocales": ["en-001", "en-150", "en-AE", "en-AG", "en-AI", "en-AS", "en-AT", "en-AU", "en-BB", "en-BE", "en-BI", "en-BM", "en-BS", "en-BW", "en-BZ", "en-CA", "en-CC", "en-CH", "en-CK", "en-CM", "en-CX", "en-CY", "en-DE", "en-DG", "en-DK", "en-DM", "en-ER", "en-FI", "en-FJ", "en-FK", "en-FM", "en-GB", "en-GD", "en-GG", "en-GH", "en-GI", "en-GM", "en-GU", "en-GY", "en-HK", "en-IE", "en-IL", "en-IM", "en-IN", "en-IO", "en-JE", "en-JM", "en-KE", "en-KI", "en-KN", "en-KY", "en-LC", "en-LR", "en-LS", "en-MG", "en-MH", "en-MO", "en-MP", "en-MS", "en-MT", "en-MU", "en-MW", "en-MY", "en-NA", "en-NF", "en-NG", "en-NL", "en-NR", "en-NU", "en-NZ", "en-PG", "en-PH", "en-PK", "en-PN", "en-PR", "en-PW", "en-RW", "en-SB", "en-SC", "en-SD", "en-SE", "en-SG", "en-SH", "en-SI", "en-SL", "en-SS", "en-SX", "en-SZ", "en-TC", "en-TK", "en-TO", "en-TT", "en-TV", "en-TZ", "en-UG", "en-UM", "en-US-POSIX", "en-US", "en-VC", "en-VG", "en-VI", "en-VU", "en-WS", "en-ZA", "en-ZM", "en-ZW", "en"],\n "aliases": {},\n "parentLocales": {\n "en-150": "en-001",\n "en-AG": "en-001",\n "en-AI": "en-001",\n "en-AU": "en-001",\n "en-BB": "en-001",\n "en-BM": "en-001",\n "en-BS": "en-001",\n "en-BW": "en-001",\n "en-BZ": "en-001",\n "en-CA": "en-001",\n "en-CC": "en-001",\n "en-CK": "en-001",\n "en-CM": "en-001",\n "en-CX": "en-001",\n "en-CY": "en-001",\n "en-DG": "en-001",\n "en-DM": "en-001",\n "en-ER": "en-001",\n "en-FJ": "en-001",\n "en-FK": "en-001",\n "en-FM": "en-001",\n "en-GB": "en-001",\n "en-GD": "en-001",\n "en-GG": "en-001",\n "en-GH": "en-001",\n "en-GI": "en-001",\n "en-GM": "en-001",\n "en-GY": "en-001",\n "en-HK": "en-001",\n "en-IE": "en-001",\n "en-IL": "en-001",\n "en-IM": "en-001",\n "en-IN": "en-001",\n "en-IO": "en-001",\n "en-JE": "en-001",\n "en-JM": "en-001",\n "en-KE": "en-001",\n "en-KI": "en-001",\n "en-KN": "en-001",\n "en-KY": "en-001",\n "en-LC": "en-001",\n "en-LR": "en-001",\n "en-LS": "en-001",\n "en-MG": "en-001",\n "en-MO": "en-001",\n "en-MS": "en-001",\n "en-MT": "en-001",\n "en-MU": "en-001",\n "en-MW": "en-001",\n "en-MY": "en-001",\n "en-NA": "en-001",\n "en-NF": "en-001",\n "en-NG": "en-001",\n "en-NR": "en-001",\n "en-NU": "en-001",\n "en-NZ": "en-001",\n "en-PG": "en-001",\n "en-PH": "en-001",\n "en-PK": "en-001",\n "en-PN": "en-001",\n "en-PW": "en-001",\n "en-RW": "en-001",\n "en-SB": "en-001",\n "en-SC": "en-001",\n "en-SD": "en-001",\n "en-SG": "en-001",\n "en-SH": "en-001",\n "en-SL": "en-001",\n "en-SS": "en-001",\n "en-SX": "en-001",\n "en-SZ": "en-001",\n "en-TC": "en-001",\n "en-TK": "en-001",\n "en-TO": "en-001",\n "en-TT": "en-001",\n "en-TV": "en-001",\n "en-TZ": "en-001",\n "en-UG": "en-001",\n "en-VC": "en-001",\n "en-VG": "en-001",\n "en-VU": "en-001",\n "en-WS": "en-001",\n "en-ZA": "en-001",\n "en-ZM": "en-001",\n "en-ZW": "en-001",\n "en-AT": "en-150",\n "en-BE": "en-150",\n "en-CH": "en-150",\n "en-DE": "en-150",\n "en-DK": "en-150",\n "en-FI": "en-150",\n "en-NL": "en-150",\n "en-SE": "en-150",\n "en-SI": "en-150"\n }\n });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZm9ybWF0anMvaW50bC1yZWxhdGl2ZXRpbWVmb3JtYXQvZGlzdC9sb2NhbGUtZGF0YS9lbi5qcz8zZTMyIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QixXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QixXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QixXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQix1QkFBdUIsRUFBRTtBQUN6QixXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QixXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QixXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QixXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QixXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekI7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIIiwiZmlsZSI6IjgwNzkuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBAZ2VuZXJhdGVkICovXG4vLyBwcmV0dGllci1pZ25vcmVcbmlmIChJbnRsLlJlbGF0aXZlVGltZUZvcm1hdCAmJiB0eXBlb2YgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQuX19hZGRMb2NhbGVEYXRhID09PSAnZnVuY3Rpb24nKSB7XG4gIEludGwuUmVsYXRpdmVUaW1lRm9ybWF0Ll9fYWRkTG9jYWxlRGF0YSh7XG4gICAgXCJkYXRhXCI6IHtcbiAgICAgIFwiZW4tMDAxXCI6IHtcbiAgICAgICAgXCJ5ZWFyLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIHlyXCIsXG4gICAgICAgICAgXCIxXCI6IFwibmV4dCB5clwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IHlyXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IHlyXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSB5ciBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0geXIgYWdvXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IHlyXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ5ZWFyLW5hcnJvd1wiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyB5clwiLFxuICAgICAgICAgIFwiMVwiOiBcIm5leHQgeXJcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSB5clwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSB5clwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0geXIgYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHlyIGFnb1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwibGFzdCB5clwiXG4gICAgICAgIH0sXG4gICAgICAgIFwicXVhcnRlci1zaG9ydFwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyBxdHIuXCIsXG4gICAgICAgICAgXCIxXCI6IFwibmV4dCBxdHIuXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gcXRyXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IHF0clwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gcXRyIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSBxdHIgYWdvXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IHF0ci5cIlxuICAgICAgICB9LFxuICAgICAgICBcInF1YXJ0ZXItbmFycm93XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIHF0ci5cIixcbiAgICAgICAgICBcIjFcIjogXCJuZXh0IHF0ci5cIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSBxdHJcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gcXRyXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBxdHIgYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHF0ciBhZ29cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImxhc3QgcXRyLlwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibW9udGgtc2hvcnRcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgbW9cIixcbiAgICAgICAgICBcIjFcIjogXCJuZXh0IG1vXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gbW9cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gbW9cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IG1vIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSBtbyBhZ29cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImxhc3QgbW9cIlxuICAgICAgICB9LFxuICAgICAgICBcIm1vbnRoLW5hcnJvd1wiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyBtb1wiLFxuICAgICAgICAgIFwiMVwiOiBcIm5leHQgbW9cIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSBtb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBtb1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gbW8gYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IG1vIGFnb1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwibGFzdCBtb1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwid2Vlay1zaG9ydFwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyB3a1wiLFxuICAgICAgICAgIFwiMVwiOiBcIm5leHQgd2tcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSB3a1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSB3a1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gd2sgYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHdrIGFnb1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwibGFzdCB3a1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwid2Vlay1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgd2tcIixcbiAgICAgICAgICBcIjFcIjogXCJuZXh0IHdrXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gd2tcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gd2tcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IHdrIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSB3ayBhZ29cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImxhc3Qgd2tcIlxuICAgICAgICB9LFxuICAgICAgICBcImhvdXItc2hvcnRcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgaG91clwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IGhyXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IGhyXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBociBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0gaHIgYWdvXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiaG91ci1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgaG91clwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IGhyXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IGhyXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBociBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0gaHIgYWdvXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwibWludXRlLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIG1pbnV0ZVwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IG1pblwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBtaW5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IG1pbiBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0gbWluIGFnb1wiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcIm1pbnV0ZS1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgbWludXRlXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gbWluXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IG1pblwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gbWluIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSBtaW4gYWdvXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwic2Vjb25kLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJub3dcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSBzZWNcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gc2VjXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBzZWMgYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHNlYyBhZ29cIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzZWNvbmQtbmFycm93XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJub3dcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSBzZWNcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gc2VjXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBzZWMgYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHNlYyBhZ29cIlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFwiZW4tMTUwXCI6IHtcbiAgICAgICAgXCJ5ZWFyLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIHlyXCIsXG4gICAgICAgICAgXCIxXCI6IFwibmV4dCB5clwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IHlyXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IHlyXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSB5ciBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0geXIgYWdvXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IHlyXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ5ZWFyLW5hcnJvd1wiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyB5clwiLFxuICAgICAgICAgIFwiMVwiOiBcIm5leHQgeXJcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSB5clwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSB5clwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0geXIgYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHlyIGFnb1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwibGFzdCB5clwiXG4gICAgICAgIH0sXG4gICAgICAgIFwicXVhcnRlci1zaG9ydFwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyBxdHIuXCIsXG4gICAgICAgICAgXCIxXCI6IFwibmV4dCBxdHIuXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gcXRyXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IHF0clwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gcXRyIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSBxdHIgYWdvXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IHF0ci5cIlxuICAgICAgICB9LFxuICAgICAgICBcInF1YXJ0ZXItbmFycm93XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIHF0ci5cIixcbiAgICAgICAgICBcIjFcIjogXCJuZXh0IHF0ci5cIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSBxdHJcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gcXRyXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBxdHIgYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHF0ciBhZ29cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImxhc3QgcXRyLlwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibW9udGgtc2hvcnRcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgbW9cIixcbiAgICAgICAgICBcIjFcIjogXCJuZXh0IG1vXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gbW9cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gbW9cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IG1vIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSBtbyBhZ29cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImxhc3QgbW9cIlxuICAgICAgICB9LFxuICAgICAgICBcIm1vbnRoLW5hcnJvd1wiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyBtb1wiLFxuICAgICAgICAgIFwiMVwiOiBcIm5leHQgbW9cIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSBtb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBtb1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gbW8gYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IG1vIGFnb1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwibGFzdCBtb1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwid2Vlay1zaG9ydFwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyB3a1wiLFxuICAgICAgICAgIFwiMVwiOiBcIm5leHQgd2tcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSB3a1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSB3a1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gd2sgYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHdrIGFnb1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwibGFzdCB3a1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwid2Vlay1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgd2tcIixcbiAgICAgICAgICBcIjFcIjogXCJuZXh0IHdrXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gd2tcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gd2tcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IHdrIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSB3ayBhZ29cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImxhc3Qgd2tcIlxuICAgICAgICB9LFxuICAgICAgICBcImhvdXItc2hvcnRcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgaG91clwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IGhyXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IGhyXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBociBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0gaHIgYWdvXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiaG91ci1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgaG91clwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IGhyXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IGhyXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBociBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0gaHIgYWdvXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwibWludXRlLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIG1pbnV0ZVwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IG1pblwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBtaW5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IG1pbiBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0gbWluIGFnb1wiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcIm1pbnV0ZS1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgbWludXRlXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gbWluXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IG1pblwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gbWluIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSBtaW4gYWdvXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwic2Vjb25kLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJub3dcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSBzZWNcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gc2VjXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBzZWMgYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHNlYyBhZ29cIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzZWNvbmQtbmFycm93XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJub3dcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSBzZWNcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gc2VjXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBzZWMgYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHNlYyBhZ29cIlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFwiZW4tQVVcIjoge1xuICAgICAgICBcInllYXItc2hvcnRcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgeXJcIixcbiAgICAgICAgICBcIjFcIjogXCJuZXh0IHlyXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0geXJcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0geXJzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSB5ciBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0geXJzIGFnb1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwibGFzdCB5clwiXG4gICAgICAgIH0sXG4gICAgICAgIFwieWVhci1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgeXJcIixcbiAgICAgICAgICBcIjFcIjogXCJuZXh0IHlyXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0geXJcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0geXJzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSB5ciBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0geXJzIGFnb1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwibGFzdCB5clwiXG4gICAgICAgIH0sXG4gICAgICAgIFwicXVhcnRlci1zaG9ydFwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyBxdHIuXCIsXG4gICAgICAgICAgXCIxXCI6IFwibmV4dCBxdHIuXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gcXRyXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IHF0cnNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IHF0ciBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0gcXRycyBhZ29cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImxhc3QgcXRyLlwiXG4gICAgICAgIH0sXG4gICAgICAgIFwicXVhcnRlci1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgcXRyLlwiLFxuICAgICAgICAgIFwiMVwiOiBcIm5leHQgcXRyLlwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IHF0clwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBxdHJzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSBxdHIgYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHF0cnMgYWdvXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IHF0ci5cIlxuICAgICAgICB9LFxuICAgICAgICBcIm1vbnRoLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIG1vXCIsXG4gICAgICAgICAgXCIxXCI6IFwibmV4dCBtb1wiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IG1vLlwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBtby5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IG1vLiBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0gbW8uIGFnb1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwibGFzdCBtb1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwibW9udGgtbmFycm93XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIG1vXCIsXG4gICAgICAgICAgXCIxXCI6IFwibmV4dCBtb1wiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IG1vLlwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBtby5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IG1vLiBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0gbW8uIGFnb1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwibGFzdCBtb1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwid2Vlay1zaG9ydFwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyB3a1wiLFxuICAgICAgICAgIFwiMVwiOiBcIm5leHQgd2tcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSB3a1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSB3a3NcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IHdrIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSB3a3MgYWdvXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IHdrXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ3ZWVrLW5hcnJvd1wiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyB3a1wiLFxuICAgICAgICAgIFwiMVwiOiBcIm5leHQgd2tcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSB3a1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSB3a3NcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IHdrIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSB3a3MgYWdvXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IHdrXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJob3VyLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIGhvdXJcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSBoclwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBocnNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IGhyIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSBocnMgYWdvXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiaG91ci1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgaG91clwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IGhyXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IGhyc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gaHIgYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IGhycyBhZ29cIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJtaW51dGUtc2hvcnRcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgbWludXRlXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gbWluLlwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBtaW5zXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBtaW4uIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSBtaW5zIGFnb1wiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcIm1pbnV0ZS1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgbWludXRlXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gbWluLlwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBtaW5zXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBtaW4uIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSBtaW5zIGFnb1wiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInNlY29uZC1zaG9ydFwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwibm93XCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gc2VjLlwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBzZWNzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBzZWMuIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSBzZWNzIGFnb1wiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInNlY29uZC1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcIm5vd1wiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IHNlYy5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gc2Vjc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gc2VjLiBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0gc2VjcyBhZ29cIlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFwiZW4tQ0FcIjoge1xuICAgICAgICBcInllYXItc2hvcnRcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgeXJcIixcbiAgICAgICAgICBcIjFcIjogXCJuZXh0IHlyXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0geXIuXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IHlycy5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IHlyLiBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0geXJzLiBhZ29cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImxhc3QgeXJcIlxuICAgICAgICB9LFxuICAgICAgICBcInllYXItbmFycm93XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIHlyXCIsXG4gICAgICAgICAgXCIxXCI6IFwibmV4dCB5clwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IHlyLlwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSB5cnMuXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSB5ci4gYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHlycy4gYWdvXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IHlyXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJxdWFydGVyLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIHF0ci5cIixcbiAgICAgICAgICBcIjFcIjogXCJuZXh0IHF0ci5cIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSBxdHIuXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IHF0cnMuXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBxdHIuIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSBxdHJzLiBhZ29cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImxhc3QgcXRyLlwiXG4gICAgICAgIH0sXG4gICAgICAgIFwicXVhcnRlci1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgcXRyLlwiLFxuICAgICAgICAgIFwiMVwiOiBcIm5leHQgcXRyLlwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IHF0ci5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gcXRycy5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IHF0ci4gYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHF0cnMuIGFnb1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwibGFzdCBxdHIuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJtb250aC1zaG9ydFwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyBtb1wiLFxuICAgICAgICAgIFwiMVwiOiBcIm5leHQgbW9cIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSBtby5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gbW9zLlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gbW8uIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSBtb3MuIGFnb1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwibGFzdCBtb1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwibW9udGgtbmFycm93XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIG1vXCIsXG4gICAgICAgICAgXCIxXCI6IFwibmV4dCBtb1wiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IG1vLlwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBtb3MuXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBtby4gYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IG1vcy4gYWdvXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IG1vXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ3ZWVrLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIHdrXCIsXG4gICAgICAgICAgXCIxXCI6IFwibmV4dCB3a1wiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IHdrLlwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSB3a3MuXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSB3ay4gYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHdrcy4gYWdvXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IHdrXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ3ZWVrLW5hcnJvd1wiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyB3a1wiLFxuICAgICAgICAgIFwiMVwiOiBcIm5leHQgd2tcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSB3ay5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gd2tzLlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gd2suIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSB3a3MuIGFnb1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwibGFzdCB3a1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwiaG91ci1zaG9ydFwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyBob3VyXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gaHIuXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IGhycy5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IGhyLiBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0gaHJzLiBhZ29cIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJob3VyLW5hcnJvd1wiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyBob3VyXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gaHIuXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IGhycy5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IGhyLiBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0gaHJzLiBhZ29cIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJtaW51dGUtc2hvcnRcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgbWludXRlXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gbWluLlwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBtaW5zLlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gbWluLiBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0gbWlucy4gYWdvXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwibWludXRlLW5hcnJvd1wiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyBtaW51dGVcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSBtaW4uXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IG1pbnMuXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBtaW4uIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSBtaW5zLiBhZ29cIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzZWNvbmQtc2hvcnRcIjoge1xuICAgICAgICAgIFwiMFwiOiBcIm5vd1wiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IHNlYy5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gc2Vjcy5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IHNlYy4gYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHNlY3MuIGFnb1wiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInNlY29uZC1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcIm5vd1wiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IHNlYy5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gc2Vjcy5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IHNlYy4gYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHNlY3MuIGFnb1wiXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJlbi1TR1wiOiB7XG4gICAgICAgIFwicXVhcnRlci1zaG9ydFwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyBxdHJcIixcbiAgICAgICAgICBcIjFcIjogXCJuZXh0IHF0clwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IHF0clwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBxdHJzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBxdHIgYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHF0cnMgYWdvXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IHF0clwiXG4gICAgICAgIH0sXG4gICAgICAgIFwicXVhcnRlci1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgcXRyXCIsXG4gICAgICAgICAgXCIxXCI6IFwibmV4dCBxdHJcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSBxdHJcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gcXRyXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBxdHIgYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHF0ciBhZ29cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImxhc3QgcXRyXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJtb250aC1zaG9ydFwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyBtdGhcIixcbiAgICAgICAgICBcIjFcIjogXCJuZXh0IG10aFwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IG10aFwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBtdGhcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IG10aCBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0gbXRoIGFnb1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwibGFzdCBtdGhcIlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJlblwiOiB7XG4gICAgICAgIFwibnVcIjogW1wibGF0blwiXSxcbiAgICAgICAgXCJ5ZWFyXCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIHllYXJcIixcbiAgICAgICAgICBcIjFcIjogXCJuZXh0IHllYXJcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSB5ZWFyXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IHllYXJzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSB5ZWFyIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSB5ZWFycyBhZ29cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImxhc3QgeWVhclwiXG4gICAgICAgIH0sXG4gICAgICAgIFwieWVhci1zaG9ydFwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyB5ci5cIixcbiAgICAgICAgICBcIjFcIjogXCJuZXh0IHlyLlwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IHlyLlwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSB5ci5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IHlyLiBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0geXIuIGFnb1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwibGFzdCB5ci5cIlxuICAgICAgICB9LFxuICAgICAgICBcInllYXItbmFycm93XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIHlyLlwiLFxuICAgICAgICAgIFwiMVwiOiBcIm5leHQgeXIuXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0geXIuXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IHlyLlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0geXIuIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSB5ci4gYWdvXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IHlyLlwiXG4gICAgICAgIH0sXG4gICAgICAgIFwicXVhcnRlclwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyBxdWFydGVyXCIsXG4gICAgICAgICAgXCIxXCI6IFwibmV4dCBxdWFydGVyXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gcXVhcnRlclwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBxdWFydGVyc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gcXVhcnRlciBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0gcXVhcnRlcnMgYWdvXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IHF1YXJ0ZXJcIlxuICAgICAgICB9LFxuICAgICAgICBcInF1YXJ0ZXItc2hvcnRcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgcXRyLlwiLFxuICAgICAgICAgIFwiMVwiOiBcIm5leHQgcXRyLlwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IHF0ci5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gcXRycy5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IHF0ci4gYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHF0cnMuIGFnb1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwibGFzdCBxdHIuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJxdWFydGVyLW5hcnJvd1wiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyBxdHIuXCIsXG4gICAgICAgICAgXCIxXCI6IFwibmV4dCBxdHIuXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gcXRyLlwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBxdHJzLlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gcXRyLiBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0gcXRycy4gYWdvXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IHF0ci5cIlxuICAgICAgICB9LFxuICAgICAgICBcIm1vbnRoXCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIG1vbnRoXCIsXG4gICAgICAgICAgXCIxXCI6IFwibmV4dCBtb250aFwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IG1vbnRoXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IG1vbnRoc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gbW9udGggYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IG1vbnRocyBhZ29cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImxhc3QgbW9udGhcIlxuICAgICAgICB9LFxuICAgICAgICBcIm1vbnRoLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIG1vLlwiLFxuICAgICAgICAgIFwiMVwiOiBcIm5leHQgbW8uXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gbW8uXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IG1vLlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gbW8uIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSBtby4gYWdvXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IG1vLlwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibW9udGgtbmFycm93XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIG1vLlwiLFxuICAgICAgICAgIFwiMVwiOiBcIm5leHQgbW8uXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gbW8uXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IG1vLlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gbW8uIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSBtby4gYWdvXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IG1vLlwiXG4gICAgICAgIH0sXG4gICAgICAgIFwid2Vla1wiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyB3ZWVrXCIsXG4gICAgICAgICAgXCIxXCI6IFwibmV4dCB3ZWVrXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gd2Vla1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSB3ZWVrc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gd2VlayBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0gd2Vla3MgYWdvXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IHdlZWtcIlxuICAgICAgICB9LFxuICAgICAgICBcIndlZWstc2hvcnRcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgd2suXCIsXG4gICAgICAgICAgXCIxXCI6IFwibmV4dCB3ay5cIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSB3ay5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gd2suXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSB3ay4gYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHdrLiBhZ29cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImxhc3Qgd2suXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ3ZWVrLW5hcnJvd1wiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyB3ay5cIixcbiAgICAgICAgICBcIjFcIjogXCJuZXh0IHdrLlwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IHdrLlwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSB3ay5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IHdrLiBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0gd2suIGFnb1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwibGFzdCB3ay5cIlxuICAgICAgICB9LFxuICAgICAgICBcImRheVwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidG9kYXlcIixcbiAgICAgICAgICBcIjFcIjogXCJ0b21vcnJvd1wiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IGRheVwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBkYXlzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBkYXkgYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IGRheXMgYWdvXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJ5ZXN0ZXJkYXlcIlxuICAgICAgICB9LFxuICAgICAgICBcImRheS1zaG9ydFwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidG9kYXlcIixcbiAgICAgICAgICBcIjFcIjogXCJ0b21vcnJvd1wiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IGRheVwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBkYXlzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBkYXkgYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IGRheXMgYWdvXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJ5ZXN0ZXJkYXlcIlxuICAgICAgICB9LFxuICAgICAgICBcImRheS1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRvZGF5XCIsXG4gICAgICAgICAgXCIxXCI6IFwidG9tb3Jyb3dcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSBkYXlcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gZGF5c1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gZGF5IGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSBkYXlzIGFnb1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwieWVzdGVyZGF5XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJob3VyXCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIGhvdXJcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSBob3VyXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IGhvdXJzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBob3VyIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSBob3VycyBhZ29cIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJob3VyLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIGhvdXJcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSBoci5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gaHIuXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBoci4gYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IGhyLiBhZ29cIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJob3VyLW5hcnJvd1wiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyBob3VyXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gaHIuXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IGhyLlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gaHIuIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSBoci4gYWdvXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwibWludXRlXCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIG1pbnV0ZVwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IG1pbnV0ZVwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBtaW51dGVzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBtaW51dGUgYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IG1pbnV0ZXMgYWdvXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwibWludXRlLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIG1pbnV0ZVwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IG1pbi5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gbWluLlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gbWluLiBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0gbWluLiBhZ29cIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJtaW51dGUtbmFycm93XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIG1pbnV0ZVwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IG1pbi5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gbWluLlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gbWluLiBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0gbWluLiBhZ29cIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzZWNvbmRcIjoge1xuICAgICAgICAgIFwiMFwiOiBcIm5vd1wiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IHNlY29uZFwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBzZWNvbmRzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBzZWNvbmQgYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHNlY29uZHMgYWdvXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwic2Vjb25kLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJub3dcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSBzZWMuXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IHNlYy5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IHNlYy4gYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHNlYy4gYWdvXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwic2Vjb25kLW5hcnJvd1wiOiB7XG4gICAgICAgICAgXCIwXCI6IFwibm93XCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gc2VjLlwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBzZWMuXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBzZWMuIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSBzZWMuIGFnb1wiXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBcImF2YWlsYWJsZUxvY2FsZXNcIjogW1wiZW4tMDAxXCIsIFwiZW4tMTUwXCIsIFwiZW4tQUVcIiwgXCJlbi1BR1wiLCBcImVuLUFJXCIsIFwiZW4tQVNcIiwgXCJlbi1BVFwiLCBcImVuLUFVXCIsIFwiZW4tQkJcIiwgXCJlbi1CRVwiLCBcImVuLUJJXCIsIFwiZW4tQk1cIiwgXCJlbi1CU1wiLCBcImVuLUJXXCIsIFwiZW4tQlpcIiwgXCJlbi1DQVwiLCBcImVuLUNDXCIsIFwiZW4tQ0hcIiwgXCJlbi1DS1wiLCBcImVuLUNNXCIsIFwiZW4tQ1hcIiwgXCJlbi1DWVwiLCBcImVuLURFXCIsIFwiZW4tREdcIiwgXCJlbi1ES1wiLCBcImVuLURNXCIsIFwiZW4tRVJcIiwgXCJlbi1GSVwiLCBcImVuLUZKXCIsIFwiZW4tRktcIiwgXCJlbi1GTVwiLCBcImVuLUdCXCIsIFwiZW4tR0RcIiwgXCJlbi1HR1wiLCBcImVuLUdIXCIsIFwiZW4tR0lcIiwgXCJlbi1HTVwiLCBcImVuLUdVXCIsIFwiZW4tR1lcIiwgXCJlbi1IS1wiLCBcImVuLUlFXCIsIFwiZW4tSUxcIiwgXCJlbi1JTVwiLCBcImVuLUlOXCIsIFwiZW4tSU9cIiwgXCJlbi1KRVwiLCBcImVuLUpNXCIsIFwiZW4tS0VcIiwgXCJlbi1LSVwiLCBcImVuLUtOXCIsIFwiZW4tS1lcIiwgXCJlbi1MQ1wiLCBcImVuLUxSXCIsIFwiZW4tTFNcIiwgXCJlbi1NR1wiLCBcImVuLU1IXCIsIFwiZW4tTU9cIiwgXCJlbi1NUFwiLCBcImVuLU1TXCIsIFwiZW4tTVRcIiwgXCJlbi1NVVwiLCBcImVuLU1XXCIsIFwiZW4tTVlcIiwgXCJlbi1OQVwiLCBcImVuLU5GXCIsIFwiZW4tTkdcIiwgXCJlbi1OTFwiLCBcImVuLU5SXCIsIFwiZW4tTlVcIiwgXCJlbi1OWlwiLCBcImVuLVBHXCIsIFwiZW4tUEhcIiwgXCJlbi1QS1wiLCBcImVuLVBOXCIsIFwiZW4tUFJcIiwgXCJlbi1QV1wiLCBcImVuLVJXXCIsIFwiZW4tU0JcIiwgXCJlbi1TQ1wiLCBcImVuLVNEXCIsIFwiZW4tU0VcIiwgXCJlbi1TR1wiLCBcImVuLVNIXCIsIFwiZW4tU0lcIiwgXCJlbi1TTFwiLCBcImVuLVNTXCIsIFwiZW4tU1hcIiwgXCJlbi1TWlwiLCBcImVuLVRDXCIsIFwiZW4tVEtcIiwgXCJlbi1UT1wiLCBcImVuLVRUXCIsIFwiZW4tVFZcIiwgXCJlbi1UWlwiLCBcImVuLVVHXCIsIFwiZW4tVU1cIiwgXCJlbi1VUy1QT1NJWFwiLCBcImVuLVVTXCIsIFwiZW4tVkNcIiwgXCJlbi1WR1wiLCBcImVuLVZJXCIsIFwiZW4tVlVcIiwgXCJlbi1XU1wiLCBcImVuLVpBXCIsIFwiZW4tWk1cIiwgXCJlbi1aV1wiLCBcImVuXCJdLFxuICAgIFwiYWxpYXNlc1wiOiB7fSxcbiAgICBcInBhcmVudExvY2FsZXNcIjoge1xuICAgICAgXCJlbi0xNTBcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tQUdcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tQUlcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tQVVcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tQkJcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tQk1cIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tQlNcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tQldcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tQlpcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tQ0FcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tQ0NcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tQ0tcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tQ01cIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tQ1hcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tQ1lcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tREdcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tRE1cIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tRVJcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tRkpcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tRktcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tRk1cIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tR0JcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tR0RcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tR0dcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tR0hcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tR0lcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tR01cIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tR1lcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tSEtcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tSUVcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tSUxcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tSU1cIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tSU5cIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tSU9cIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tSkVcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tSk1cIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tS0VcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tS0lcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tS05cIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tS1lcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tTENcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tTFJcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tTFNcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tTUdcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tTU9cIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tTVNcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tTVRcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tTVVcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tTVdcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tTVlcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tTkFcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tTkZcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tTkdcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tTlJcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tTlVcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tTlpcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tUEdcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tUEhcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tUEtcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tUE5cIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tUFdcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tUldcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tU0JcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tU0NcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tU0RcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tU0dcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tU0hcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tU0xcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tU1NcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tU1hcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tU1pcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tVENcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tVEtcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tVE9cIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tVFRcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tVFZcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tVFpcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tVUdcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tVkNcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tVkdcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tVlVcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tV1NcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tWkFcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tWk1cIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tWldcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tQVRcIjogXCJlbi0xNTBcIixcbiAgICAgIFwiZW4tQkVcIjogXCJlbi0xNTBcIixcbiAgICAgIFwiZW4tQ0hcIjogXCJlbi0xNTBcIixcbiAgICAgIFwiZW4tREVcIjogXCJlbi0xNTBcIixcbiAgICAgIFwiZW4tREtcIjogXCJlbi0xNTBcIixcbiAgICAgIFwiZW4tRklcIjogXCJlbi0xNTBcIixcbiAgICAgIFwiZW4tTkxcIjogXCJlbi0xNTBcIixcbiAgICAgIFwiZW4tU0VcIjogXCJlbi0xNTBcIixcbiAgICAgIFwiZW4tU0lcIjogXCJlbi0xNTBcIlxuICAgIH1cbiAgfSk7XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///8079\n')},4033:function(){eval('/* @generated */\n// prettier-ignore\nif (Intl.RelativeTimeFormat && typeof Intl.RelativeTimeFormat.__addLocaleData === \'function\') {\n Intl.RelativeTimeFormat.__addLocaleData({\n "data": {\n "es-419": {\n "week-short": {\n "0": "esta sem.",\n "1": "próx. sem.",\n "future": {\n "one": "dentro de {0} sem.",\n "other": "dentro de {0} sem."\n },\n "past": {\n "one": "hace {0} sem.",\n "other": "hace {0} sem."\n },\n "-1": "sem. pas."\n },\n "week-narrow": {\n "0": "esta sem.",\n "1": "próx. sem.",\n "future": {\n "one": "dentro de {0} sem.",\n "other": "dentro de {0} sem."\n },\n "past": {\n "one": "hace {0} sem.",\n "other": "hace {0} sem."\n },\n "-1": "sem. pas."\n }\n },\n "es-AR": {\n "day-short": {\n "0": "hoy",\n "1": "mañana",\n "2": "pasado mañana",\n "future": {\n "one": "dentro de {0} días",\n "other": "dentro de {0} días"\n },\n "past": {\n "one": "hace {0} días",\n "other": "hace {0} días"\n },\n "-2": "anteayer",\n "-1": "ayer"\n },\n "day-narrow": {\n "0": "hoy",\n "1": "mañana",\n "2": "pasado mañana",\n "future": {\n "one": "dentro de {0} días",\n "other": "dentro de {0} días"\n },\n "past": {\n "one": "hace {0} días",\n "other": "hace {0} días"\n },\n "-2": "anteayer",\n "-1": "ayer"\n },\n "second-short": {\n "0": "ahora",\n "future": {\n "one": "dentro de {0} seg.",\n "other": "dentro de {0} seg."\n },\n "past": {\n "one": "hace {0} seg.",\n "other": "hace {0} seg."\n }\n },\n "second-narrow": {\n "0": "ahora",\n "future": {\n "one": "dentro de {0} seg.",\n "other": "dentro de {0} seg."\n },\n "past": {\n "one": "hace {0} seg.",\n "other": "hace {0} seg."\n }\n }\n },\n "es-MX": {\n "year": {\n "0": "este año",\n "1": "el año próximo",\n "future": {\n "one": "dentro de {0} año",\n "other": "dentro de {0} años"\n },\n "past": {\n "one": "hace {0} año",\n "other": "hace {0} años"\n },\n "-1": "el año pasado"\n },\n "year-short": {\n "0": "este año",\n "1": "el próximo año",\n "future": {\n "one": "en {0} a",\n "other": "en {0} a"\n },\n "past": {\n "one": "hace {0} a",\n "other": "hace {0} a"\n },\n "-1": "el año pasado"\n },\n "year-narrow": {\n "0": "este año",\n "1": "el próximo año",\n "future": {\n "one": "en {0} a",\n "other": "en {0} a"\n },\n "past": {\n "one": "-{0} a",\n "other": "-{0} a"\n },\n "-1": "el año pasado"\n },\n "quarter": {\n "0": "este trimestre",\n "1": "el próximo trimestre",\n "future": {\n "one": "en {0} trimestre",\n "other": "dentro de {0} trimetres"\n },\n "past": {\n "one": "hace {0} trimestre",\n "other": "hace {0} trimestres"\n },\n "-1": "el trimestre pasado"\n },\n "quarter-short": {\n "0": "este trimestre",\n "1": "el próximo trimestre",\n "future": {\n "one": "en {0} trim.",\n "other": "en {0} trim"\n },\n "past": {\n "one": "hace {0} trim.",\n "other": "hace {0} trim."\n },\n "-1": "el trimestre pasado"\n },\n "quarter-narrow": {\n "0": "este trimestre",\n "1": "el próximo trimestre",\n "future": {\n "one": "en {0} trim.",\n "other": "en {0} trim."\n },\n "past": {\n "one": "-{0} T",\n "other": "-{0} T"\n },\n "-1": "el trimestre pasado"\n },\n "month": {\n "0": "este mes",\n "1": "el mes próximo",\n "future": {\n "one": "en {0} mes",\n "other": "en {0} meses"\n },\n "past": {\n "one": "hace {0} mes",\n "other": "hace {0} meses"\n },\n "-1": "el mes pasado"\n },\n "month-short": {\n "0": "este mes",\n "1": "el próximo mes",\n "future": {\n "one": "en {0} m",\n "other": "en {0} m"\n },\n "past": {\n "one": "hace {0} m",\n "other": "hace {0} m"\n },\n "-1": "el mes pasado"\n },\n "month-narrow": {\n "0": "este mes",\n "1": "el próximo mes",\n "future": {\n "one": "+{0} m",\n "other": "+{0} m"\n },\n "past": {\n "one": "-{0} m",\n "other": "-{0} m"\n },\n "-1": "el mes pasado"\n },\n "week": {\n "0": "esta semana",\n "1": "la semana próxima",\n "future": {\n "one": "dentro de {0} semana",\n "other": "dentro de {0} semanas"\n },\n "past": {\n "one": "hace {0} semana",\n "other": "hace {0} semanas"\n },\n "-1": "la semana pasada"\n },\n "week-short": {\n "0": "esta sem.",\n "1": "próx. sem.",\n "future": {\n "one": "en {0} sem.",\n "other": "en {0} sem."\n },\n "past": {\n "one": "hace {0} sem.",\n "other": "hace {0} sem."\n },\n "-1": "sem. pas."\n },\n "day-short": {\n "0": "hoy",\n "1": "mañana",\n "2": "pasado mañana",\n "future": {\n "one": "en {0} día",\n "other": "en {0} días"\n },\n "past": {\n "one": "hace {0} día",\n "other": "hace {0} días"\n },\n "-2": "anteayer",\n "-1": "ayer"\n },\n "day-narrow": {\n "0": "hoy",\n "1": "mañana",\n "2": "pasado mañana",\n "future": {\n "one": "+{0} día",\n "other": "en {0} días"\n },\n "past": {\n "one": "hace {0} día",\n "other": "hace {0} días"\n },\n "-2": "anteayer",\n "-1": "ayer"\n },\n "hour-short": {\n "0": "esta hora",\n "future": {\n "one": "en {0} h",\n "other": "en {0} n"\n },\n "past": {\n "one": "hace {0} h",\n "other": "hace {0} h"\n }\n },\n "minute-short": {\n "0": "este minuto",\n "future": {\n "one": "en {0} min",\n "other": "en {0} min"\n },\n "past": {\n "one": "hace {0} min",\n "other": "hace {0} min"\n }\n },\n "minute-narrow": {\n "0": "este minuto",\n "future": {\n "one": "en {0} min",\n "other": "en {0} min"\n },\n "past": {\n "one": "hace {0} min",\n "other": "hace {0} min"\n }\n },\n "second-short": {\n "0": "ahora",\n "future": {\n "one": "en {0} s",\n "other": "en {0} s"\n },\n "past": {\n "one": "hace {0} s",\n "other": "hace {0} s"\n }\n },\n "second-narrow": {\n "0": "ahora",\n "future": {\n "one": "+{0} s",\n "other": "+{0} s"\n },\n "past": {\n "one": "hace {0} s",\n "other": "hace {0} s"\n }\n }\n },\n "es-PY": {\n "second-short": {\n "0": "ahora",\n "future": {\n "one": "dentro de {0} seg.",\n "other": "dentro de {0} seg."\n },\n "past": {\n "one": "hace {0} seg.",\n "other": "hace {0} seg."\n }\n },\n "second-narrow": {\n "0": "ahora",\n "future": {\n "one": "dentro de {0} seg.",\n "other": "dentro de {0} seg."\n },\n "past": {\n "one": "hace {0} seg.",\n "other": "hace {0} seg."\n }\n }\n },\n "es-SV": {\n "day": {\n "0": "hoy",\n "1": "mañana",\n "2": "pasado mañana",\n "future": {\n "one": "dentro de {0} día",\n "other": "dentro de {0} días"\n },\n "past": {\n "one": "hace {0} día",\n "other": "hace {0} días"\n },\n "-2": "antier",\n "-1": "ayer"\n }\n },\n "es-US": {\n "year": {\n "0": "este año",\n "1": "el año próximo",\n "future": {\n "one": "dentro de {0} año",\n "other": "dentro de {0} años"\n },\n "past": {\n "one": "hace {0} año",\n "other": "hace {0} años"\n },\n "-1": "el año pasado"\n },\n "quarter": {\n "0": "este trimestre",\n "1": "el próximo trimestre",\n "future": {\n "one": "dentro de {0} trimetre",\n "other": "dentro de {0} trimetres"\n },\n "past": {\n "one": "hace {0} trimestre",\n "other": "hace {0} trimestres"\n },\n "-1": "el trimestre pasado"\n },\n "month": {\n "0": "este mes",\n "1": "el mes próximo",\n "future": {\n "one": "dentro de {0} mes",\n "other": "dentro de {0} meses"\n },\n "past": {\n "one": "hace {0} mes",\n "other": "hace {0} meses"\n },\n "-1": "el mes pasado"\n },\n "week": {\n "0": "esta semana",\n "1": "la semana próxima",\n "future": {\n "one": "dentro de {0} semana",\n "other": "dentro de {0} semanas"\n },\n "past": {\n "one": "hace {0} semana",\n "other": "hace {0} semanas"\n },\n "-1": "la semana pasada"\n }\n },\n "es": {\n "nu": ["latn"],\n "year": {\n "0": "este año",\n "1": "el próximo año",\n "future": {\n "one": "dentro de {0} año",\n "other": "dentro de {0} años"\n },\n "past": {\n "one": "hace {0} año",\n "other": "hace {0} años"\n },\n "-1": "el año pasado"\n },\n "year-short": {\n "0": "este año",\n "1": "el próximo año",\n "future": {\n "one": "dentro de {0} a",\n "other": "dentro de {0} a"\n },\n "past": {\n "one": "hace {0} a",\n "other": "hace {0} a"\n },\n "-1": "el año pasado"\n },\n "year-narrow": {\n "0": "este año",\n "1": "el próximo año",\n "future": {\n "one": "dentro de {0} a",\n "other": "dentro de {0} a"\n },\n "past": {\n "one": "hace {0} a",\n "other": "hace {0} a"\n },\n "-1": "el año pasado"\n },\n "quarter": {\n "0": "este trimestre",\n "1": "el próximo trimestre",\n "future": {\n "one": "dentro de {0} trimestre",\n "other": "dentro de {0} trimestres"\n },\n "past": {\n "one": "hace {0} trimestre",\n "other": "hace {0} trimestres"\n },\n "-1": "el trimestre pasado"\n },\n "quarter-short": {\n "0": "este trimestre",\n "1": "el próximo trimestre",\n "future": {\n "one": "dentro de {0} trim.",\n "other": "dentro de {0} trim."\n },\n "past": {\n "one": "hace {0} trim.",\n "other": "hace {0} trim."\n },\n "-1": "el trimestre pasado"\n },\n "quarter-narrow": {\n "0": "este trimestre",\n "1": "el próximo trimestre",\n "future": {\n "one": "dentro de {0} trim.",\n "other": "dentro de {0} trim."\n },\n "past": {\n "one": "hace {0} trim.",\n "other": "hace {0} trim."\n },\n "-1": "el trimestre pasado"\n },\n "month": {\n "0": "este mes",\n "1": "el próximo mes",\n "future": {\n "one": "dentro de {0} mes",\n "other": "dentro de {0} meses"\n },\n "past": {\n "one": "hace {0} mes",\n "other": "hace {0} meses"\n },\n "-1": "el mes pasado"\n },\n "month-short": {\n "0": "este mes",\n "1": "el próximo mes",\n "future": {\n "one": "dentro de {0} m",\n "other": "dentro de {0} m"\n },\n "past": {\n "one": "hace {0} m",\n "other": "hace {0} m"\n },\n "-1": "el mes pasado"\n },\n "month-narrow": {\n "0": "este mes",\n "1": "el próximo mes",\n "future": {\n "one": "dentro de {0} m",\n "other": "dentro de {0} m"\n },\n "past": {\n "one": "hace {0} m",\n "other": "hace {0} m"\n },\n "-1": "el mes pasado"\n },\n "week": {\n "0": "esta semana",\n "1": "la próxima semana",\n "future": {\n "one": "dentro de {0} semana",\n "other": "dentro de {0} semanas"\n },\n "past": {\n "one": "hace {0} semana",\n "other": "hace {0} semanas"\n },\n "-1": "la semana pasada"\n },\n "week-short": {\n "0": "esta sem.",\n "1": "próx. sem.",\n "future": {\n "one": "dentro de {0} sem.",\n "other": "dentro de {0} sem."\n },\n "past": {\n "one": "hace {0} sem.",\n "other": "hace {0} sem."\n },\n "-1": "sem. ant."\n },\n "week-narrow": {\n "0": "esta sem.",\n "1": "próx. sem.",\n "future": {\n "one": "dentro de {0} sem.",\n "other": "dentro de {0} sem."\n },\n "past": {\n "one": "hace {0} sem.",\n "other": "hace {0} sem."\n },\n "-1": "sem. ant."\n },\n "day": {\n "0": "hoy",\n "1": "mañana",\n "2": "pasado mañana",\n "future": {\n "one": "dentro de {0} día",\n "other": "dentro de {0} días"\n },\n "past": {\n "one": "hace {0} día",\n "other": "hace {0} días"\n },\n "-2": "anteayer",\n "-1": "ayer"\n },\n "day-short": {\n "0": "hoy",\n "1": "mañana",\n "2": "pasado mañana",\n "future": {\n "one": "dentro de {0} día",\n "other": "dentro de {0} días"\n },\n "past": {\n "one": "hace {0} día",\n "other": "hace {0} días"\n },\n "-2": "anteayer",\n "-1": "ayer"\n },\n "day-narrow": {\n "0": "hoy",\n "1": "mañana",\n "2": "pasado mañana",\n "future": {\n "one": "dentro de {0} día",\n "other": "dentro de {0} días"\n },\n "past": {\n "one": "hace {0} día",\n "other": "hace {0} días"\n },\n "-2": "anteayer",\n "-1": "ayer"\n },\n "hour": {\n "0": "esta hora",\n "future": {\n "one": "dentro de {0} hora",\n "other": "dentro de {0} horas"\n },\n "past": {\n "one": "hace {0} hora",\n "other": "hace {0} horas"\n }\n },\n "hour-short": {\n "0": "esta hora",\n "future": {\n "one": "dentro de {0} h",\n "other": "dentro de {0} h"\n },\n "past": {\n "one": "hace {0} h",\n "other": "hace {0} h"\n }\n },\n "hour-narrow": {\n "0": "esta hora",\n "future": {\n "one": "dentro de {0} h",\n "other": "dentro de {0} h"\n },\n "past": {\n "one": "hace {0} h",\n "other": "hace {0} h"\n }\n },\n "minute": {\n "0": "este minuto",\n "future": {\n "one": "dentro de {0} minuto",\n "other": "dentro de {0} minutos"\n },\n "past": {\n "one": "hace {0} minuto",\n "other": "hace {0} minutos"\n }\n },\n "minute-short": {\n "0": "este minuto",\n "future": {\n "one": "dentro de {0} min",\n "other": "dentro de {0} min"\n },\n "past": {\n "one": "hace {0} min",\n "other": "hace {0} min"\n }\n },\n "minute-narrow": {\n "0": "este minuto",\n "future": {\n "one": "dentro de {0} min",\n "other": "dentro de {0} min"\n },\n "past": {\n "one": "hace {0} min",\n "other": "hace {0} min"\n }\n },\n "second": {\n "0": "ahora",\n "future": {\n "one": "dentro de {0} segundo",\n "other": "dentro de {0} segundos"\n },\n "past": {\n "one": "hace {0} segundo",\n "other": "hace {0} segundos"\n }\n },\n "second-short": {\n "0": "ahora",\n "future": {\n "one": "dentro de {0} s",\n "other": "dentro de {0} s"\n },\n "past": {\n "one": "hace {0} s",\n "other": "hace {0} s"\n }\n },\n "second-narrow": {\n "0": "ahora",\n "future": {\n "one": "dentro de {0} s",\n "other": "dentro de {0} s"\n },\n "past": {\n "one": "hace {0} s",\n "other": "hace {0} s"\n }\n }\n }\n },\n "availableLocales": ["es-419", "es-AR", "es-BO", "es-BR", "es-BZ", "es-CL", "es-CO", "es-CR", "es-CU", "es-DO", "es-EA", "es-EC", "es-GQ", "es-GT", "es-HN", "es-IC", "es-MX", "es-NI", "es-PA", "es-PE", "es-PH", "es-PR", "es-PY", "es-SV", "es-US", "es-UY", "es-VE", "es"],\n "aliases": {},\n "parentLocales": {\n "es-AR": "es-419",\n "es-BO": "es-419",\n "es-BR": "es-419",\n "es-BZ": "es-419",\n "es-CL": "es-419",\n "es-CO": "es-419",\n "es-CR": "es-419",\n "es-CU": "es-419",\n "es-DO": "es-419",\n "es-EC": "es-419",\n "es-GT": "es-419",\n "es-HN": "es-419",\n "es-MX": "es-419",\n "es-NI": "es-419",\n "es-PA": "es-419",\n "es-PE": "es-419",\n "es-PR": "es-419",\n "es-PY": "es-419",\n "es-SV": "es-419",\n "es-US": "es-419",\n "es-UY": "es-419",\n "es-VE": "es-419"\n }\n });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZm9ybWF0anMvaW50bC1yZWxhdGl2ZXRpbWVmb3JtYXQvZGlzdC9sb2NhbGUtZGF0YS9lcy5qcz9mY2VlIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLEVBQUU7QUFDakMsaUNBQWlDLEVBQUU7QUFDbkMsV0FBVztBQUNYO0FBQ0EsMEJBQTBCLEVBQUU7QUFDNUIsNEJBQTRCLEVBQUU7QUFDOUIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLEVBQUU7QUFDakMsaUNBQWlDLEVBQUU7QUFDbkMsV0FBVztBQUNYO0FBQ0EsMEJBQTBCLEVBQUU7QUFDNUIsNEJBQTRCLEVBQUU7QUFDOUIsV0FBVztBQUNYO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLEVBQUU7QUFDakMsaUNBQWlDLEVBQUU7QUFDbkMsV0FBVztBQUNYO0FBQ0EsMEJBQTBCLEVBQUU7QUFDNUIsNEJBQTRCLEVBQUU7QUFDOUIsV0FBVztBQUNYO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHNCQUFzQixFQUFFO0FBQ3hCLHdCQUF3QixFQUFFO0FBQzFCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHNCQUFzQixFQUFFO0FBQ3hCLHdCQUF3QixFQUFFO0FBQzFCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNB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O0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLEVBQUU7QUFDakMsaUNBQWlDLEVBQUU7QUFDbkMsV0FBVztBQUNYO0FBQ0EsMEJBQTBCLEVBQUU7QUFDNUIsNEJBQTRCLEVBQUU7QUFDOUIsV0FBVztBQUNYO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsRUFBRTtBQUNqQyxpQ0FBaUMsRUFBRTtBQUNuQyxXQUFXO0FBQ1g7QUFDQSwwQkFBMEIsRUFBRTtBQUM1Qiw0QkFBNEIsRUFBRTtBQUM5QixXQUFXO0FBQ1g7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsRUFBRTtBQUNqQyxpQ0FBaUMsRUFBRTtBQUNuQyxXQUFXO0FBQ1g7QUFDQSwwQkFBMEIsRUFBRTtBQUM1Qiw0QkFBNEIsRUFBRTtBQUM5QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsRUFBRTtBQUNqQyxpQ0FBaUMsRUFBRTtBQUNuQyxXQUFXO0FBQ1g7QUFDQSwwQkFBMEIsRUFBRTtBQUM1Qiw0QkFBNEIsRUFBRTtBQUM5QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsRUFBRTtBQUNqQyxpQ0FBaUMsRUFBRTtBQUNuQyxXQUFXO0FBQ1g7QUFDQSwwQkFBMEIsRUFBRTtBQUM1Qiw0QkFBNEIsRUFBRTtBQUM5QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsRUFBRTtBQUNqQyxpQ0FBaUMsRUFBRTtBQUNuQyxXQUFXO0FBQ1g7QUFDQSwwQkFBMEIsRUFBRTtBQUM1Qiw0QkFBNEIsRUFBRTtBQUM5QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsRUFBRTtBQUNqQyxpQ0FBaUMsRUFBRTtBQUNuQyxXQUFXO0FBQ1g7QUFDQSwwQkFBMEIsRUFBRTtBQUM1Qiw0QkFBNEIsRUFBRTtBQUM5QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsRUFBRTtBQUNqQyxpQ0FBaUMsRUFBRTtBQUNuQyxXQUFXO0FBQ1g7QUFDQSwwQkFBMEIsRUFBRTtBQUM1Qiw0QkFBNEIsRUFBRTtBQUM5QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsRUFBRTtBQUNqQyxpQ0FBaUMsRUFBRTtBQUNuQyxXQUFXO0FBQ1g7QUFDQSwwQkFBMEIsRUFBRTtBQUM1Qiw0QkFBNEIsRUFBRTtBQUM5QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsRUFBRTtBQUNqQyxpQ0FBaUMsRUFBRTtBQUNuQyxXQUFXO0FBQ1g7QUFDQSwwQkFBMEIsRUFBRTtBQUM1Qiw0QkFBNEIsRUFBRTtBQUM5QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsRUFBRTtBQUNqQyxpQ0FBaUMsRUFBRTtBQUNuQyxXQUFXO0FBQ1g7QUFDQSwwQkFBMEIsRUFBRTtBQUM1Qiw0QkFBNEIsRUFBRTtBQUM5QjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIIiwiZmlsZSI6IjQwMzMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBAZ2VuZXJhdGVkICovXG4vLyBwcmV0dGllci1pZ25vcmVcbmlmIChJbnRsLlJlbGF0aXZlVGltZUZvcm1hdCAmJiB0eXBlb2YgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQuX19hZGRMb2NhbGVEYXRhID09PSAnZnVuY3Rpb24nKSB7XG4gIEludGwuUmVsYXRpdmVUaW1lRm9ybWF0Ll9fYWRkTG9jYWxlRGF0YSh7XG4gICAgXCJkYXRhXCI6IHtcbiAgICAgIFwiZXMtNDE5XCI6IHtcbiAgICAgICAgXCJ3ZWVrLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJlc3RhIHNlbS5cIixcbiAgICAgICAgICBcIjFcIjogXCJwcsOzeC4gc2VtLlwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiZGVudHJvIGRlIHswfSBzZW0uXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiZGVudHJvIGRlIHswfSBzZW0uXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImhhY2UgezB9IHNlbS5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSBzZW0uXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJzZW0uIHBhcy5cIlxuICAgICAgICB9LFxuICAgICAgICBcIndlZWstbmFycm93XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJlc3RhIHNlbS5cIixcbiAgICAgICAgICBcIjFcIjogXCJwcsOzeC4gc2VtLlwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiZGVudHJvIGRlIHswfSBzZW0uXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiZGVudHJvIGRlIHswfSBzZW0uXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImhhY2UgezB9IHNlbS5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSBzZW0uXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJzZW0uIHBhcy5cIlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJlcy1BUlwiOiB7XG4gICAgICAgIFwiZGF5LXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJob3lcIixcbiAgICAgICAgICBcIjFcIjogXCJtYcOxYW5hXCIsXG4gICAgICAgICAgXCIyXCI6IFwicGFzYWRvIG1hw7FhbmFcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImRlbnRybyBkZSB7MH0gZMOtYXNcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJkZW50cm8gZGUgezB9IGTDrWFzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImhhY2UgezB9IGTDrWFzXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaGFjZSB7MH0gZMOtYXNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMlwiOiBcImFudGVheWVyXCIsXG4gICAgICAgICAgXCItMVwiOiBcImF5ZXJcIlxuICAgICAgICB9LFxuICAgICAgICBcImRheS1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcImhveVwiLFxuICAgICAgICAgIFwiMVwiOiBcIm1hw7FhbmFcIixcbiAgICAgICAgICBcIjJcIjogXCJwYXNhZG8gbWHDsWFuYVwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiZGVudHJvIGRlIHswfSBkw61hc1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImRlbnRybyBkZSB7MH0gZMOtYXNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaGFjZSB7MH0gZMOtYXNcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSBkw61hc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0yXCI6IFwiYW50ZWF5ZXJcIixcbiAgICAgICAgICBcIi0xXCI6IFwiYXllclwiXG4gICAgICAgIH0sXG4gICAgICAgIFwic2Vjb25kLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJhaG9yYVwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiZGVudHJvIGRlIHswfSBzZWcuXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiZGVudHJvIGRlIHswfSBzZWcuXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImhhY2UgezB9IHNlZy5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSBzZWcuXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwic2Vjb25kLW5hcnJvd1wiOiB7XG4gICAgICAgICAgXCIwXCI6IFwiYWhvcmFcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImRlbnRybyBkZSB7MH0gc2VnLlwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImRlbnRybyBkZSB7MH0gc2VnLlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJoYWNlIHswfSBzZWcuXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaGFjZSB7MH0gc2VnLlwiXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJlcy1NWFwiOiB7XG4gICAgICAgIFwieWVhclwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwiZXN0ZSBhw7FvXCIsXG4gICAgICAgICAgXCIxXCI6IFwiZWwgYcOxbyBwcsOzeGltb1wiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiZGVudHJvIGRlIHswfSBhw7FvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiZGVudHJvIGRlIHswfSBhw7Fvc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJoYWNlIHswfSBhw7FvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaGFjZSB7MH0gYcOxb3NcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImVsIGHDsW8gcGFzYWRvXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ5ZWFyLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJlc3RlIGHDsW9cIixcbiAgICAgICAgICBcIjFcIjogXCJlbCBwcsOzeGltbyBhw7FvXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJlbiB7MH0gYVwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImVuIHswfSBhXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImhhY2UgezB9IGFcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSBhXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJlbCBhw7FvIHBhc2Fkb1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwieWVhci1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcImVzdGUgYcOxb1wiLFxuICAgICAgICAgIFwiMVwiOiBcImVsIHByw7N4aW1vIGHDsW9cIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImVuIHswfSBhXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiZW4gezB9IGFcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiLXswfSBhXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiLXswfSBhXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJlbCBhw7FvIHBhc2Fkb1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwicXVhcnRlclwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwiZXN0ZSB0cmltZXN0cmVcIixcbiAgICAgICAgICBcIjFcIjogXCJlbCBwcsOzeGltbyB0cmltZXN0cmVcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImVuIHswfSB0cmltZXN0cmVcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJkZW50cm8gZGUgezB9IHRyaW1ldHJlc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJoYWNlIHswfSB0cmltZXN0cmVcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSB0cmltZXN0cmVzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJlbCB0cmltZXN0cmUgcGFzYWRvXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJxdWFydGVyLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJlc3RlIHRyaW1lc3RyZVwiLFxuICAgICAgICAgIFwiMVwiOiBcImVsIHByw7N4aW1vIHRyaW1lc3RyZVwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiZW4gezB9IHRyaW0uXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiZW4gezB9IHRyaW1cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaGFjZSB7MH0gdHJpbS5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSB0cmltLlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwiZWwgdHJpbWVzdHJlIHBhc2Fkb1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwicXVhcnRlci1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcImVzdGUgdHJpbWVzdHJlXCIsXG4gICAgICAgICAgXCIxXCI6IFwiZWwgcHLDs3hpbW8gdHJpbWVzdHJlXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJlbiB7MH0gdHJpbS5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJlbiB7MH0gdHJpbS5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiLXswfSBUXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiLXswfSBUXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJlbCB0cmltZXN0cmUgcGFzYWRvXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJtb250aFwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwiZXN0ZSBtZXNcIixcbiAgICAgICAgICBcIjFcIjogXCJlbCBtZXMgcHLDs3hpbW9cIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImVuIHswfSBtZXNcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJlbiB7MH0gbWVzZXNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaGFjZSB7MH0gbWVzXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaGFjZSB7MH0gbWVzZXNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImVsIG1lcyBwYXNhZG9cIlxuICAgICAgICB9LFxuICAgICAgICBcIm1vbnRoLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJlc3RlIG1lc1wiLFxuICAgICAgICAgIFwiMVwiOiBcImVsIHByw7N4aW1vIG1lc1wiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiZW4gezB9IG1cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJlbiB7MH0gbVwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJoYWNlIHswfSBtXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaGFjZSB7MH0gbVwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwiZWwgbWVzIHBhc2Fkb1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwibW9udGgtbmFycm93XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJlc3RlIG1lc1wiLFxuICAgICAgICAgIFwiMVwiOiBcImVsIHByw7N4aW1vIG1lc1wiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiK3swfSBtXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiK3swfSBtXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcIi17MH0gbVwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcIi17MH0gbVwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwiZWwgbWVzIHBhc2Fkb1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwid2Vla1wiOiB7XG4gICAgICAgICAgXCIwXCI6IFwiZXN0YSBzZW1hbmFcIixcbiAgICAgICAgICBcIjFcIjogXCJsYSBzZW1hbmEgcHLDs3hpbWFcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImRlbnRybyBkZSB7MH0gc2VtYW5hXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiZGVudHJvIGRlIHswfSBzZW1hbmFzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImhhY2UgezB9IHNlbWFuYVwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImhhY2UgezB9IHNlbWFuYXNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImxhIHNlbWFuYSBwYXNhZGFcIlxuICAgICAgICB9LFxuICAgICAgICBcIndlZWstc2hvcnRcIjoge1xuICAgICAgICAgIFwiMFwiOiBcImVzdGEgc2VtLlwiLFxuICAgICAgICAgIFwiMVwiOiBcInByw7N4LiBzZW0uXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJlbiB7MH0gc2VtLlwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImVuIHswfSBzZW0uXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImhhY2UgezB9IHNlbS5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSBzZW0uXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJzZW0uIHBhcy5cIlxuICAgICAgICB9LFxuICAgICAgICBcImRheS1zaG9ydFwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwiaG95XCIsXG4gICAgICAgICAgXCIxXCI6IFwibWHDsWFuYVwiLFxuICAgICAgICAgIFwiMlwiOiBcInBhc2FkbyBtYcOxYW5hXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJlbiB7MH0gZMOtYVwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImVuIHswfSBkw61hc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJoYWNlIHswfSBkw61hXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaGFjZSB7MH0gZMOtYXNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMlwiOiBcImFudGVheWVyXCIsXG4gICAgICAgICAgXCItMVwiOiBcImF5ZXJcIlxuICAgICAgICB9LFxuICAgICAgICBcImRheS1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcImhveVwiLFxuICAgICAgICAgIFwiMVwiOiBcIm1hw7FhbmFcIixcbiAgICAgICAgICBcIjJcIjogXCJwYXNhZG8gbWHDsWFuYVwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiK3swfSBkw61hXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiZW4gezB9IGTDrWFzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImhhY2UgezB9IGTDrWFcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSBkw61hc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0yXCI6IFwiYW50ZWF5ZXJcIixcbiAgICAgICAgICBcIi0xXCI6IFwiYXllclwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiaG91ci1zaG9ydFwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwiZXN0YSBob3JhXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJlbiB7MH0gaFwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImVuIHswfSBuXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImhhY2UgezB9IGhcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSBoXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwibWludXRlLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJlc3RlIG1pbnV0b1wiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiZW4gezB9IG1pblwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImVuIHswfSBtaW5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaGFjZSB7MH0gbWluXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaGFjZSB7MH0gbWluXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwibWludXRlLW5hcnJvd1wiOiB7XG4gICAgICAgICAgXCIwXCI6IFwiZXN0ZSBtaW51dG9cIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImVuIHswfSBtaW5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJlbiB7MH0gbWluXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImhhY2UgezB9IG1pblwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImhhY2UgezB9IG1pblwiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInNlY29uZC1zaG9ydFwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwiYWhvcmFcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImVuIHswfSBzXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiZW4gezB9IHNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaGFjZSB7MH0gc1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImhhY2UgezB9IHNcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzZWNvbmQtbmFycm93XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJhaG9yYVwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiK3swfSBzXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiK3swfSBzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImhhY2UgezB9IHNcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSBzXCJcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcImVzLVBZXCI6IHtcbiAgICAgICAgXCJzZWNvbmQtc2hvcnRcIjoge1xuICAgICAgICAgIFwiMFwiOiBcImFob3JhXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJkZW50cm8gZGUgezB9IHNlZy5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJkZW50cm8gZGUgezB9IHNlZy5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaGFjZSB7MH0gc2VnLlwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImhhY2UgezB9IHNlZy5cIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzZWNvbmQtbmFycm93XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJhaG9yYVwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiZGVudHJvIGRlIHswfSBzZWcuXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiZGVudHJvIGRlIHswfSBzZWcuXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImhhY2UgezB9IHNlZy5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSBzZWcuXCJcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcImVzLVNWXCI6IHtcbiAgICAgICAgXCJkYXlcIjoge1xuICAgICAgICAgIFwiMFwiOiBcImhveVwiLFxuICAgICAgICAgIFwiMVwiOiBcIm1hw7FhbmFcIixcbiAgICAgICAgICBcIjJcIjogXCJwYXNhZG8gbWHDsWFuYVwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiZGVudHJvIGRlIHswfSBkw61hXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiZGVudHJvIGRlIHswfSBkw61hc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJoYWNlIHswfSBkw61hXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaGFjZSB7MH0gZMOtYXNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMlwiOiBcImFudGllclwiLFxuICAgICAgICAgIFwiLTFcIjogXCJheWVyXCJcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFwiZXMtVVNcIjoge1xuICAgICAgICBcInllYXJcIjoge1xuICAgICAgICAgIFwiMFwiOiBcImVzdGUgYcOxb1wiLFxuICAgICAgICAgIFwiMVwiOiBcImVsIGHDsW8gcHLDs3hpbW9cIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImRlbnRybyBkZSB7MH0gYcOxb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImRlbnRybyBkZSB7MH0gYcOxb3NcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaGFjZSB7MH0gYcOxb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImhhY2UgezB9IGHDsW9zXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJlbCBhw7FvIHBhc2Fkb1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwicXVhcnRlclwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwiZXN0ZSB0cmltZXN0cmVcIixcbiAgICAgICAgICBcIjFcIjogXCJlbCBwcsOzeGltbyB0cmltZXN0cmVcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImRlbnRybyBkZSB7MH0gdHJpbWV0cmVcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJkZW50cm8gZGUgezB9IHRyaW1ldHJlc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJoYWNlIHswfSB0cmltZXN0cmVcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSB0cmltZXN0cmVzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJlbCB0cmltZXN0cmUgcGFzYWRvXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJtb250aFwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwiZXN0ZSBtZXNcIixcbiAgICAgICAgICBcIjFcIjogXCJlbCBtZXMgcHLDs3hpbW9cIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImRlbnRybyBkZSB7MH0gbWVzXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiZGVudHJvIGRlIHswfSBtZXNlc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJoYWNlIHswfSBtZXNcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSBtZXNlc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwiZWwgbWVzIHBhc2Fkb1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwid2Vla1wiOiB7XG4gICAgICAgICAgXCIwXCI6IFwiZXN0YSBzZW1hbmFcIixcbiAgICAgICAgICBcIjFcIjogXCJsYSBzZW1hbmEgcHLDs3hpbWFcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImRlbnRybyBkZSB7MH0gc2VtYW5hXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiZGVudHJvIGRlIHswfSBzZW1hbmFzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImhhY2UgezB9IHNlbWFuYVwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImhhY2UgezB9IHNlbWFuYXNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImxhIHNlbWFuYSBwYXNhZGFcIlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJlc1wiOiB7XG4gICAgICAgIFwibnVcIjogW1wibGF0blwiXSxcbiAgICAgICAgXCJ5ZWFyXCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJlc3RlIGHDsW9cIixcbiAgICAgICAgICBcIjFcIjogXCJlbCBwcsOzeGltbyBhw7FvXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJkZW50cm8gZGUgezB9IGHDsW9cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJkZW50cm8gZGUgezB9IGHDsW9zXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImhhY2UgezB9IGHDsW9cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSBhw7Fvc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwiZWwgYcOxbyBwYXNhZG9cIlxuICAgICAgICB9LFxuICAgICAgICBcInllYXItc2hvcnRcIjoge1xuICAgICAgICAgIFwiMFwiOiBcImVzdGUgYcOxb1wiLFxuICAgICAgICAgIFwiMVwiOiBcImVsIHByw7N4aW1vIGHDsW9cIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImRlbnRybyBkZSB7MH0gYVwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImRlbnRybyBkZSB7MH0gYVwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJoYWNlIHswfSBhXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaGFjZSB7MH0gYVwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwiZWwgYcOxbyBwYXNhZG9cIlxuICAgICAgICB9LFxuICAgICAgICBcInllYXItbmFycm93XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJlc3RlIGHDsW9cIixcbiAgICAgICAgICBcIjFcIjogXCJlbCBwcsOzeGltbyBhw7FvXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJkZW50cm8gZGUgezB9IGFcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJkZW50cm8gZGUgezB9IGFcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaGFjZSB7MH0gYVwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImhhY2UgezB9IGFcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImVsIGHDsW8gcGFzYWRvXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJxdWFydGVyXCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJlc3RlIHRyaW1lc3RyZVwiLFxuICAgICAgICAgIFwiMVwiOiBcImVsIHByw7N4aW1vIHRyaW1lc3RyZVwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiZGVudHJvIGRlIHswfSB0cmltZXN0cmVcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJkZW50cm8gZGUgezB9IHRyaW1lc3RyZXNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaGFjZSB7MH0gdHJpbWVzdHJlXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaGFjZSB7MH0gdHJpbWVzdHJlc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwiZWwgdHJpbWVzdHJlIHBhc2Fkb1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwicXVhcnRlci1zaG9ydFwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwiZXN0ZSB0cmltZXN0cmVcIixcbiAgICAgICAgICBcIjFcIjogXCJlbCBwcsOzeGltbyB0cmltZXN0cmVcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImRlbnRybyBkZSB7MH0gdHJpbS5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJkZW50cm8gZGUgezB9IHRyaW0uXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImhhY2UgezB9IHRyaW0uXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaGFjZSB7MH0gdHJpbS5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImVsIHRyaW1lc3RyZSBwYXNhZG9cIlxuICAgICAgICB9LFxuICAgICAgICBcInF1YXJ0ZXItbmFycm93XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJlc3RlIHRyaW1lc3RyZVwiLFxuICAgICAgICAgIFwiMVwiOiBcImVsIHByw7N4aW1vIHRyaW1lc3RyZVwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiZGVudHJvIGRlIHswfSB0cmltLlwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImRlbnRybyBkZSB7MH0gdHJpbS5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaGFjZSB7MH0gdHJpbS5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSB0cmltLlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwiZWwgdHJpbWVzdHJlIHBhc2Fkb1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwibW9udGhcIjoge1xuICAgICAgICAgIFwiMFwiOiBcImVzdGUgbWVzXCIsXG4gICAgICAgICAgXCIxXCI6IFwiZWwgcHLDs3hpbW8gbWVzXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJkZW50cm8gZGUgezB9IG1lc1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImRlbnRybyBkZSB7MH0gbWVzZXNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaGFjZSB7MH0gbWVzXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaGFjZSB7MH0gbWVzZXNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImVsIG1lcyBwYXNhZG9cIlxuICAgICAgICB9LFxuICAgICAgICBcIm1vbnRoLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJlc3RlIG1lc1wiLFxuICAgICAgICAgIFwiMVwiOiBcImVsIHByw7N4aW1vIG1lc1wiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiZGVudHJvIGRlIHswfSBtXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiZGVudHJvIGRlIHswfSBtXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImhhY2UgezB9IG1cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSBtXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJlbCBtZXMgcGFzYWRvXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJtb250aC1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcImVzdGUgbWVzXCIsXG4gICAgICAgICAgXCIxXCI6IFwiZWwgcHLDs3hpbW8gbWVzXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJkZW50cm8gZGUgezB9IG1cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJkZW50cm8gZGUgezB9IG1cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaGFjZSB7MH0gbVwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImhhY2UgezB9IG1cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImVsIG1lcyBwYXNhZG9cIlxuICAgICAgICB9LFxuICAgICAgICBcIndlZWtcIjoge1xuICAgICAgICAgIFwiMFwiOiBcImVzdGEgc2VtYW5hXCIsXG4gICAgICAgICAgXCIxXCI6IFwibGEgcHLDs3hpbWEgc2VtYW5hXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJkZW50cm8gZGUgezB9IHNlbWFuYVwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImRlbnRybyBkZSB7MH0gc2VtYW5hc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJoYWNlIHswfSBzZW1hbmFcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSBzZW1hbmFzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYSBzZW1hbmEgcGFzYWRhXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ3ZWVrLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJlc3RhIHNlbS5cIixcbiAgICAgICAgICBcIjFcIjogXCJwcsOzeC4gc2VtLlwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiZGVudHJvIGRlIHswfSBzZW0uXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiZGVudHJvIGRlIHswfSBzZW0uXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImhhY2UgezB9IHNlbS5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSBzZW0uXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJzZW0uIGFudC5cIlxuICAgICAgICB9LFxuICAgICAgICBcIndlZWstbmFycm93XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJlc3RhIHNlbS5cIixcbiAgICAgICAgICBcIjFcIjogXCJwcsOzeC4gc2VtLlwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiZGVudHJvIGRlIHswfSBzZW0uXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiZGVudHJvIGRlIHswfSBzZW0uXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImhhY2UgezB9IHNlbS5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSBzZW0uXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJzZW0uIGFudC5cIlxuICAgICAgICB9LFxuICAgICAgICBcImRheVwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwiaG95XCIsXG4gICAgICAgICAgXCIxXCI6IFwibWHDsWFuYVwiLFxuICAgICAgICAgIFwiMlwiOiBcInBhc2FkbyBtYcOxYW5hXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJkZW50cm8gZGUgezB9IGTDrWFcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJkZW50cm8gZGUgezB9IGTDrWFzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImhhY2UgezB9IGTDrWFcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSBkw61hc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0yXCI6IFwiYW50ZWF5ZXJcIixcbiAgICAgICAgICBcIi0xXCI6IFwiYXllclwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiZGF5LXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJob3lcIixcbiAgICAgICAgICBcIjFcIjogXCJtYcOxYW5hXCIsXG4gICAgICAgICAgXCIyXCI6IFwicGFzYWRvIG1hw7FhbmFcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImRlbnRybyBkZSB7MH0gZMOtYVwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImRlbnRybyBkZSB7MH0gZMOtYXNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaGFjZSB7MH0gZMOtYVwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImhhY2UgezB9IGTDrWFzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTJcIjogXCJhbnRlYXllclwiLFxuICAgICAgICAgIFwiLTFcIjogXCJheWVyXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJkYXktbmFycm93XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJob3lcIixcbiAgICAgICAgICBcIjFcIjogXCJtYcOxYW5hXCIsXG4gICAgICAgICAgXCIyXCI6IFwicGFzYWRvIG1hw7FhbmFcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImRlbnRybyBkZSB7MH0gZMOtYVwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImRlbnRybyBkZSB7MH0gZMOtYXNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaGFjZSB7MH0gZMOtYVwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImhhY2UgezB9IGTDrWFzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTJcIjogXCJhbnRlYXllclwiLFxuICAgICAgICAgIFwiLTFcIjogXCJheWVyXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJob3VyXCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJlc3RhIGhvcmFcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImRlbnRybyBkZSB7MH0gaG9yYVwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImRlbnRybyBkZSB7MH0gaG9yYXNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaGFjZSB7MH0gaG9yYVwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImhhY2UgezB9IGhvcmFzXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiaG91ci1zaG9ydFwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwiZXN0YSBob3JhXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJkZW50cm8gZGUgezB9IGhcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJkZW50cm8gZGUgezB9IGhcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaGFjZSB7MH0gaFwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImhhY2UgezB9IGhcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJob3VyLW5hcnJvd1wiOiB7XG4gICAgICAgICAgXCIwXCI6IFwiZXN0YSBob3JhXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJkZW50cm8gZGUgezB9IGhcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJkZW50cm8gZGUgezB9IGhcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaGFjZSB7MH0gaFwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImhhY2UgezB9IGhcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJtaW51dGVcIjoge1xuICAgICAgICAgIFwiMFwiOiBcImVzdGUgbWludXRvXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJkZW50cm8gZGUgezB9IG1pbnV0b1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImRlbnRybyBkZSB7MH0gbWludXRvc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJoYWNlIHswfSBtaW51dG9cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSBtaW51dG9zXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwibWludXRlLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJlc3RlIG1pbnV0b1wiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiZGVudHJvIGRlIHswfSBtaW5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJkZW50cm8gZGUgezB9IG1pblwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJoYWNlIHswfSBtaW5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSBtaW5cIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJtaW51dGUtbmFycm93XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJlc3RlIG1pbnV0b1wiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiZGVudHJvIGRlIHswfSBtaW5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJkZW50cm8gZGUgezB9IG1pblwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJoYWNlIHswfSBtaW5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSBtaW5cIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzZWNvbmRcIjoge1xuICAgICAgICAgIFwiMFwiOiBcImFob3JhXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJkZW50cm8gZGUgezB9IHNlZ3VuZG9cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJkZW50cm8gZGUgezB9IHNlZ3VuZG9zXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImhhY2UgezB9IHNlZ3VuZG9cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSBzZWd1bmRvc1wiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInNlY29uZC1zaG9ydFwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwiYWhvcmFcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImRlbnRybyBkZSB7MH0gc1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImRlbnRybyBkZSB7MH0gc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJoYWNlIHswfSBzXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaGFjZSB7MH0gc1wiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInNlY29uZC1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcImFob3JhXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJkZW50cm8gZGUgezB9IHNcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJkZW50cm8gZGUgezB9IHNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaGFjZSB7MH0gc1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImhhY2UgezB9IHNcIlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgXCJhdmFpbGFibGVMb2NhbGVzXCI6IFtcImVzLTQxOVwiLCBcImVzLUFSXCIsIFwiZXMtQk9cIiwgXCJlcy1CUlwiLCBcImVzLUJaXCIsIFwiZXMtQ0xcIiwgXCJlcy1DT1wiLCBcImVzLUNSXCIsIFwiZXMtQ1VcIiwgXCJlcy1ET1wiLCBcImVzLUVBXCIsIFwiZXMtRUNcIiwgXCJlcy1HUVwiLCBcImVzLUdUXCIsIFwiZXMtSE5cIiwgXCJlcy1JQ1wiLCBcImVzLU1YXCIsIFwiZXMtTklcIiwgXCJlcy1QQVwiLCBcImVzLVBFXCIsIFwiZXMtUEhcIiwgXCJlcy1QUlwiLCBcImVzLVBZXCIsIFwiZXMtU1ZcIiwgXCJlcy1VU1wiLCBcImVzLVVZXCIsIFwiZXMtVkVcIiwgXCJlc1wiXSxcbiAgICBcImFsaWFzZXNcIjoge30sXG4gICAgXCJwYXJlbnRMb2NhbGVzXCI6IHtcbiAgICAgIFwiZXMtQVJcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtQk9cIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtQlJcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtQlpcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtQ0xcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtQ09cIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtQ1JcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtQ1VcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtRE9cIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtRUNcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtR1RcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtSE5cIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtTVhcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtTklcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtUEFcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtUEVcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtUFJcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtUFlcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtU1ZcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtVVNcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtVVlcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtVkVcIjogXCJlcy00MTlcIlxuICAgIH1cbiAgfSk7XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4033\n')},9584:function(){eval('/* @generated */\n// prettier-ignore\nif (Intl.RelativeTimeFormat && typeof Intl.RelativeTimeFormat.__addLocaleData === \'function\') {\n Intl.RelativeTimeFormat.__addLocaleData({\n "data": {\n "ses": {\n "nu": ["latn"],\n "year": {\n "0": "this year",\n "1": "next year",\n "future": {\n "other": "+{0} y"\n },\n "past": {\n "other": "-{0} y"\n },\n "-1": "last year"\n },\n "year-short": {\n "0": "this year",\n "1": "next year",\n "future": {\n "other": "+{0} y"\n },\n "past": {\n "other": "-{0} y"\n },\n "-1": "last year"\n },\n "year-narrow": {\n "0": "this year",\n "1": "next year",\n "future": {\n "other": "+{0} y"\n },\n "past": {\n "other": "-{0} y"\n },\n "-1": "last year"\n },\n "quarter": {\n "0": "this quarter",\n "1": "next quarter",\n "future": {\n "other": "+{0} Q"\n },\n "past": {\n "other": "-{0} Q"\n },\n "-1": "last quarter"\n },\n "quarter-short": {\n "0": "this quarter",\n "1": "next quarter",\n "future": {\n "other": "+{0} Q"\n },\n "past": {\n "other": "-{0} Q"\n },\n "-1": "last quarter"\n },\n "quarter-narrow": {\n "0": "this quarter",\n "1": "next quarter",\n "future": {\n "other": "+{0} Q"\n },\n "past": {\n "other": "-{0} Q"\n },\n "-1": "last quarter"\n },\n "month": {\n "0": "this month",\n "1": "next month",\n "future": {\n "other": "+{0} m"\n },\n "past": {\n "other": "-{0} m"\n },\n "-1": "last month"\n },\n "month-short": {\n "0": "this month",\n "1": "next month",\n "future": {\n "other": "+{0} m"\n },\n "past": {\n "other": "-{0} m"\n },\n "-1": "last month"\n },\n "month-narrow": {\n "0": "this month",\n "1": "next month",\n "future": {\n "other": "+{0} m"\n },\n "past": {\n "other": "-{0} m"\n },\n "-1": "last month"\n },\n "week": {\n "0": "this week",\n "1": "next week",\n "future": {\n "other": "+{0} w"\n },\n "past": {\n "other": "-{0} w"\n },\n "-1": "last week"\n },\n "week-short": {\n "0": "this week",\n "1": "next week",\n "future": {\n "other": "+{0} w"\n },\n "past": {\n "other": "-{0} w"\n },\n "-1": "last week"\n },\n "week-narrow": {\n "0": "this week",\n "1": "next week",\n "future": {\n "other": "+{0} w"\n },\n "past": {\n "other": "-{0} w"\n },\n "-1": "last week"\n },\n "day": {\n "0": "Hõo",\n "1": "Suba",\n "future": {\n "other": "+{0} d"\n },\n "past": {\n "other": "-{0} d"\n },\n "-1": "Bi"\n },\n "day-short": {\n "0": "Hõo",\n "1": "Suba",\n "future": {\n "other": "+{0} d"\n },\n "past": {\n "other": "-{0} d"\n },\n "-1": "Bi"\n },\n "day-narrow": {\n "0": "Hõo",\n "1": "Suba",\n "future": {\n "other": "+{0} d"\n },\n "past": {\n "other": "-{0} d"\n },\n "-1": "Bi"\n },\n "hour": {\n "0": "this hour",\n "future": {\n "other": "+{0} h"\n },\n "past": {\n "other": "-{0} h"\n }\n },\n "hour-short": {\n "0": "this hour",\n "future": {\n "other": "+{0} h"\n },\n "past": {\n "other": "-{0} h"\n }\n },\n "hour-narrow": {\n "0": "this hour",\n "future": {\n "other": "+{0} h"\n },\n "past": {\n "other": "-{0} h"\n }\n },\n "minute": {\n "0": "this minute",\n "future": {\n "other": "+{0} min"\n },\n "past": {\n "other": "-{0} min"\n }\n },\n "minute-short": {\n "0": "this minute",\n "future": {\n "other": "+{0} min"\n },\n "past": {\n "other": "-{0} min"\n }\n },\n "minute-narrow": {\n "0": "this minute",\n "future": {\n "other": "+{0} min"\n },\n "past": {\n "other": "-{0} min"\n }\n },\n "second": {\n "0": "now",\n "future": {\n "other": "+{0} s"\n },\n "past": {\n "other": "-{0} s"\n }\n },\n "second-short": {\n "0": "now",\n "future": {\n "other": "+{0} s"\n },\n "past": {\n "other": "-{0} s"\n }\n },\n "second-narrow": {\n "0": "now",\n "future": {\n "other": "+{0} s"\n },\n "past": {\n "other": "-{0} s"\n }\n }\n }\n },\n "availableLocales": ["ses"],\n "aliases": {},\n "parentLocales": {}\n });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZm9ybWF0anMvaW50bC1yZWxhdGl2ZXRpbWVmb3JtYXQvZGlzdC9sb2NhbGUtZGF0YS9zZXMuanM/Mjg4ZCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLFdBQVc7QUFDWDtBQUNBLHdCQUF3QixFQUFFO0FBQzFCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLFdBQVc7QUFDWDtBQUNBLHdCQUF3QixFQUFFO0FBQzFCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLFdBQVc7QUFDWDtBQUNBLHdCQUF3QixFQUFFO0FBQzFCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLFdBQVc7QUFDWDtBQUNBLHdCQUF3QixFQUFFO0FBQzFCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLFdBQVc7QUFDWDtBQUNBLHdCQUF3QixFQUFFO0FBQzFCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLFdBQVc7QUFDWDtBQUNBLHdCQUF3QixFQUFFO0FBQzFCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLFdBQVc7QUFDWDtBQUNBLHdCQUF3QixFQUFFO0FBQzFCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLFdBQVc7QUFDWDtBQUNBLHdCQUF3QixFQUFFO0FBQzFCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLFdBQVc7QUFDWDtBQUNBLHdCQUF3QixFQUFFO0FBQzFCO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLEdBQUc7QUFDSCIsImZpbGUiOiI5NTg0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyogQGdlbmVyYXRlZCAqL1xuLy8gcHJldHRpZXItaWdub3JlXG5pZiAoSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQgJiYgdHlwZW9mIEludGwuUmVsYXRpdmVUaW1lRm9ybWF0Ll9fYWRkTG9jYWxlRGF0YSA9PT0gJ2Z1bmN0aW9uJykge1xuICBJbnRsLlJlbGF0aXZlVGltZUZvcm1hdC5fX2FkZExvY2FsZURhdGEoe1xuICAgIFwiZGF0YVwiOiB7XG4gICAgICBcInNlc1wiOiB7XG4gICAgICAgIFwibnVcIjogW1wibGF0blwiXSxcbiAgICAgICAgXCJ5ZWFyXCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIHllYXJcIixcbiAgICAgICAgICBcIjFcIjogXCJuZXh0IHllYXJcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiK3swfSB5XCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiLXswfSB5XCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IHllYXJcIlxuICAgICAgICB9LFxuICAgICAgICBcInllYXItc2hvcnRcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgeWVhclwiLFxuICAgICAgICAgIFwiMVwiOiBcIm5leHQgeWVhclwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCIrezB9IHlcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCItezB9IHlcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImxhc3QgeWVhclwiXG4gICAgICAgIH0sXG4gICAgICAgIFwieWVhci1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgeWVhclwiLFxuICAgICAgICAgIFwiMVwiOiBcIm5leHQgeWVhclwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCIrezB9IHlcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCItezB9IHlcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImxhc3QgeWVhclwiXG4gICAgICAgIH0sXG4gICAgICAgIFwicXVhcnRlclwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyBxdWFydGVyXCIsXG4gICAgICAgICAgXCIxXCI6IFwibmV4dCBxdWFydGVyXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvdGhlclwiOiBcIit7MH0gUVwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvdGhlclwiOiBcIi17MH0gUVwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwibGFzdCBxdWFydGVyXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJxdWFydGVyLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIHF1YXJ0ZXJcIixcbiAgICAgICAgICBcIjFcIjogXCJuZXh0IHF1YXJ0ZXJcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiK3swfSBRXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiLXswfSBRXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IHF1YXJ0ZXJcIlxuICAgICAgICB9LFxuICAgICAgICBcInF1YXJ0ZXItbmFycm93XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIHF1YXJ0ZXJcIixcbiAgICAgICAgICBcIjFcIjogXCJuZXh0IHF1YXJ0ZXJcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiK3swfSBRXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiLXswfSBRXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IHF1YXJ0ZXJcIlxuICAgICAgICB9LFxuICAgICAgICBcIm1vbnRoXCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIG1vbnRoXCIsXG4gICAgICAgICAgXCIxXCI6IFwibmV4dCBtb250aFwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCIrezB9IG1cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCItezB9IG1cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImxhc3QgbW9udGhcIlxuICAgICAgICB9LFxuICAgICAgICBcIm1vbnRoLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIG1vbnRoXCIsXG4gICAgICAgICAgXCIxXCI6IFwibmV4dCBtb250aFwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCIrezB9IG1cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCItezB9IG1cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImxhc3QgbW9udGhcIlxuICAgICAgICB9LFxuICAgICAgICBcIm1vbnRoLW5hcnJvd1wiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyBtb250aFwiLFxuICAgICAgICAgIFwiMVwiOiBcIm5leHQgbW9udGhcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiK3swfSBtXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiLXswfSBtXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IG1vbnRoXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ3ZWVrXCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIHdlZWtcIixcbiAgICAgICAgICBcIjFcIjogXCJuZXh0IHdlZWtcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiK3swfSB3XCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiLXswfSB3XCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IHdlZWtcIlxuICAgICAgICB9LFxuICAgICAgICBcIndlZWstc2hvcnRcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgd2Vla1wiLFxuICAgICAgICAgIFwiMVwiOiBcIm5leHQgd2Vla1wiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCIrezB9IHdcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCItezB9IHdcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImxhc3Qgd2Vla1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwid2Vlay1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgd2Vla1wiLFxuICAgICAgICAgIFwiMVwiOiBcIm5leHQgd2Vla1wiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCIrezB9IHdcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCItezB9IHdcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImxhc3Qgd2Vla1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwiZGF5XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJIw7VvXCIsXG4gICAgICAgICAgXCIxXCI6IFwiU3ViYVwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCIrezB9IGRcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCItezB9IGRcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcIkJpXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJkYXktc2hvcnRcIjoge1xuICAgICAgICAgIFwiMFwiOiBcIkjDtW9cIixcbiAgICAgICAgICBcIjFcIjogXCJTdWJhXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvdGhlclwiOiBcIit7MH0gZFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvdGhlclwiOiBcIi17MH0gZFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwiQmlcIlxuICAgICAgICB9LFxuICAgICAgICBcImRheS1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcIkjDtW9cIixcbiAgICAgICAgICBcIjFcIjogXCJTdWJhXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvdGhlclwiOiBcIit7MH0gZFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvdGhlclwiOiBcIi17MH0gZFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwiQmlcIlxuICAgICAgICB9LFxuICAgICAgICBcImhvdXJcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgaG91clwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCIrezB9IGhcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCItezB9IGhcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJob3VyLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIGhvdXJcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiK3swfSBoXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiLXswfSBoXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiaG91ci1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgaG91clwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCIrezB9IGhcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCItezB9IGhcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJtaW51dGVcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgbWludXRlXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvdGhlclwiOiBcIit7MH0gbWluXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiLXswfSBtaW5cIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJtaW51dGUtc2hvcnRcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgbWludXRlXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvdGhlclwiOiBcIit7MH0gbWluXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiLXswfSBtaW5cIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJtaW51dGUtbmFycm93XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIG1pbnV0ZVwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCIrezB9IG1pblwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvdGhlclwiOiBcIi17MH0gbWluXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwic2Vjb25kXCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJub3dcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiK3swfSBzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiLXswfSBzXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwic2Vjb25kLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJub3dcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiK3swfSBzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiLXswfSBzXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwic2Vjb25kLW5hcnJvd1wiOiB7XG4gICAgICAgICAgXCIwXCI6IFwibm93XCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvdGhlclwiOiBcIit7MH0gc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvdGhlclwiOiBcIi17MH0gc1wiXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBcImF2YWlsYWJsZUxvY2FsZXNcIjogW1wic2VzXCJdLFxuICAgIFwiYWxpYXNlc1wiOiB7fSxcbiAgICBcInBhcmVudExvY2FsZXNcIjoge31cbiAgfSk7XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///9584\n')},8709:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("\n\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\n\nvar core_1 = __webpack_require__(9905);\n\nif (!('RelativeTimeFormat' in Intl)) {\n Object.defineProperty(Intl, 'RelativeTimeFormat', {\n value: core_1.default,\n writable: true,\n enumerable: false,\n configurable: true\n });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZm9ybWF0anMvaW50bC1yZWxhdGl2ZXRpbWVmb3JtYXQvZGlzdC9wb2x5ZmlsbC5qcz83ODNjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViLDhDQUE2QztBQUM3QztBQUNBLENBQUMsRUFBQzs7QUFFRixhQUFhLG1CQUFPLENBQUMsSUFBUTs7QUFFN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIIiwiZmlsZSI6Ijg3MDkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIGNvcmVfMSA9IHJlcXVpcmUoXCIuL2NvcmVcIik7XG5cbmlmICghKCdSZWxhdGl2ZVRpbWVGb3JtYXQnIGluIEludGwpKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJbnRsLCAnUmVsYXRpdmVUaW1lRm9ybWF0Jywge1xuICAgIHZhbHVlOiBjb3JlXzEuZGVmYXVsdCxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///8709\n")},5316:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("__webpack_require__(8709);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZm9ybWF0anMvaW50bC1yZWxhdGl2ZXRpbWVmb3JtYXQvcG9seWZpbGwuanM/OWM0ZSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxtQkFBTyxDQUFDLElBQWlCIiwiZmlsZSI6IjUzMTYuanMiLCJzb3VyY2VzQ29udGVudCI6WyJyZXF1aXJlKCcuL2Rpc3QvcG9seWZpbGwnKTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5316\n")},2650:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "InternalSlotToken": function() { return /* reexport */ InternalSlotToken; },\n "SANCTIONED_UNITS": function() { return /* reexport */ SANCTIONED_UNITS; },\n "createResolveLocale": function() { return /* reexport */ createResolveLocale; },\n "defaultNumberOption": function() { return /* reexport */ defaultNumberOption; },\n "getAliasesByLang": function() { return /* reexport */ getAliasesByLang; },\n "getCanonicalLocales": function() { return /* reexport */ getCanonicalLocales; },\n "getInternalSlot": function() { return /* reexport */ getInternalSlot; },\n "getLocaleHierarchy": function() { return /* reexport */ getLocaleHierarchy; },\n "getMultiInternalSlots": function() { return /* reexport */ getMultiInternalSlots; },\n "getNumberOption": function() { return /* reexport */ getNumberOption; },\n "getOption": function() { return /* reexport */ getOption; },\n "getParentLocalesByLang": function() { return /* reexport */ getParentLocalesByLang; },\n "invariant": function() { return /* reexport */ invariant/* invariant */.k; },\n "isLiteralPart": function() { return /* reexport */ isLiteralPart; },\n "isMissingLocaleDataError": function() { return /* reexport */ isMissingLocaleDataError; },\n "isWellFormedCurrencyCode": function() { return /* reexport */ isWellFormedCurrencyCode; },\n "objectIs": function() { return /* reexport */ objectIs; },\n "partitionPattern": function() { return /* reexport */ partitionPattern; },\n "removeUnitNamespace": function() { return /* reexport */ removeUnitNamespace; },\n "selectUnit": function() { return /* reexport */ selectUnit; },\n "setInternalSlot": function() { return /* reexport */ setInternalSlot; },\n "setMultiInternalSlots": function() { return /* reexport */ setMultiInternalSlots; },\n "setNumberFormatDigitOptions": function() { return /* reexport */ setNumberFormatDigitOptions; },\n "supportedLocales": function() { return /* reexport */ supportedLocales; },\n "toObject": function() { return /* reexport */ toObject; },\n "toString": function() { return /* reexport */ polyfill_utils_toString; },\n "unpackData": function() { return /* reexport */ unpackData; }\n});\n\n;// CONCATENATED MODULE: ./node_modules/@formatjs/intl-utils/lib/diff.js\nvar __assign = undefined && undefined.__assign || function () {\n __assign = Object.assign || function (t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n\n for (var p in s) {\n if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n }\n\n return t;\n };\n\n return __assign.apply(this, arguments);\n};\n\nvar MS_PER_SECOND = 1e3;\nvar SECS_PER_MIN = 60;\nvar SECS_PER_HOUR = SECS_PER_MIN * 60;\nvar SECS_PER_DAY = SECS_PER_HOUR * 24;\nvar SECS_PER_WEEK = SECS_PER_DAY * 7;\nfunction selectUnit(from, to, thresholds) {\n if (to === void 0) {\n to = Date.now();\n }\n\n if (thresholds === void 0) {\n thresholds = {};\n }\n\n var resolvedThresholds = __assign(__assign({}, DEFAULT_THRESHOLDS), thresholds || {});\n\n var secs = (+from - +to) / MS_PER_SECOND;\n\n if (Math.abs(secs) < resolvedThresholds.second) {\n return {\n value: Math.round(secs),\n unit: \'second\'\n };\n }\n\n var mins = secs / SECS_PER_MIN;\n\n if (Math.abs(mins) < resolvedThresholds.minute) {\n return {\n value: Math.round(mins),\n unit: \'minute\'\n };\n }\n\n var hours = secs / SECS_PER_HOUR;\n\n if (Math.abs(hours) < resolvedThresholds.hour) {\n return {\n value: Math.round(hours),\n unit: \'hour\'\n };\n }\n\n var days = secs / SECS_PER_DAY;\n\n if (Math.abs(days) < resolvedThresholds.day) {\n return {\n value: Math.round(days),\n unit: \'day\'\n };\n }\n\n var fromDate = new Date(from);\n var toDate = new Date(to);\n var years = fromDate.getFullYear() - toDate.getFullYear();\n\n if (Math.round(Math.abs(years)) > 0) {\n return {\n value: Math.round(years),\n unit: \'year\'\n };\n }\n\n var months = years * 12 + fromDate.getMonth() - toDate.getMonth();\n\n if (Math.round(Math.abs(months)) > 0) {\n return {\n value: Math.round(months),\n unit: \'month\'\n };\n }\n\n var weeks = secs / SECS_PER_WEEK;\n return {\n value: Math.round(weeks),\n unit: \'week\'\n };\n}\nvar DEFAULT_THRESHOLDS = {\n second: 45,\n minute: 45,\n hour: 22,\n day: 5\n};\n;// CONCATENATED MODULE: ./node_modules/@formatjs/intl-utils/lib/aliases.js\n/* @generated */\n// prettier-ignore \n/* harmony default export */ var aliases = ({\n "aa-SAAHO": "ssy",\n "aam": "aas",\n "aar": "aa",\n "abk": "ab",\n "adp": "dz",\n "afr": "af",\n "aju": "jrb",\n "aka": "ak",\n "alb": "sq",\n "als": "sq",\n "amh": "am",\n "ara": "ar",\n "arb": "ar",\n "arg": "an",\n "arm": "hy",\n "art-lojban": "jbo",\n "asd": "snz",\n "asm": "as",\n "aue": "ktz",\n "ava": "av",\n "ave": "ae",\n "aym": "ay",\n "ayr": "ay",\n "ayx": "nun",\n "az-AZ": "az-Latn-AZ",\n "aze": "az",\n "azj": "az",\n "bak": "ba",\n "bam": "bm",\n "baq": "eu",\n "bcc": "bal",\n "bcl": "bik",\n "bel": "be",\n "ben": "bn",\n "bgm": "bcg",\n "bh": "bho",\n "bih": "bho",\n "bis": "bi",\n "bjd": "drl",\n "bod": "bo",\n "bos": "bs",\n "bre": "br",\n "bs-BA": "bs-Latn-BA",\n "bul": "bg",\n "bur": "my",\n "bxk": "luy",\n "bxr": "bua",\n "cat": "ca",\n "ccq": "rki",\n "cel-gaulish": "xtg-x-cel-gaulish",\n "ces": "cs",\n "cha": "ch",\n "che": "ce",\n "chi": "zh",\n "chu": "cu",\n "chv": "cv",\n "cjr": "mom",\n "cka": "cmr",\n "cld": "syr",\n "cmk": "xch",\n "cmn": "zh",\n "cnr": "sr-ME",\n "cor": "kw",\n "cos": "co",\n "coy": "pij",\n "cqu": "quh",\n "cre": "cr",\n "cwd": "cr",\n "cym": "cy",\n "cze": "cs",\n "dan": "da",\n "deu": "de",\n "dgo": "doi",\n "dhd": "mwr",\n "dik": "din",\n "diq": "zza",\n "dit": "dif",\n "div": "dv",\n "drh": "mn",\n "drw": "fa-af",\n "dut": "nl",\n "dzo": "dz",\n "ekk": "et",\n "ell": "el",\n "emk": "man",\n "eng": "en",\n "epo": "eo",\n "esk": "ik",\n "est": "et",\n "eus": "eu",\n "ewe": "ee",\n "fao": "fo",\n "fas": "fa",\n "fat": "ak",\n "fij": "fj",\n "fin": "fi",\n "fra": "fr",\n "fre": "fr",\n "fry": "fy",\n "fuc": "ff",\n "ful": "ff",\n "gav": "dev",\n "gaz": "om",\n "gbo": "grb",\n "geo": "ka",\n "ger": "de",\n "gfx": "vaj",\n "ggn": "gvr",\n "gla": "gd",\n "gle": "ga",\n "glg": "gl",\n "glv": "gv",\n "gno": "gon",\n "gre": "el",\n "grn": "gn",\n "gti": "nyc",\n "gug": "gn",\n "guj": "gu",\n "guv": "duz",\n "gya": "gba",\n "ha-Latn-GH": "ha-GH",\n "ha-Latn-NE": "ha-NE",\n "ha-Latn-NG": "ha-NG",\n "hat": "ht",\n "hau": "ha",\n "hbs": "sr-Latn",\n "hdn": "hai",\n "hea": "hmn",\n "heb": "he",\n "her": "hz",\n "him": "srx",\n "hin": "hi",\n "hmo": "ho",\n "hrr": "jal",\n "hrv": "hr",\n "hun": "hu",\n "hye": "hy",\n "i-ami": "ami",\n "i-bnn": "bnn",\n "i-hak": "hak",\n "i-klingon": "tlh",\n "i-lux": "lb",\n "i-navajo": "nv",\n "i-pwn": "pwn",\n "i-tao": "tao",\n "i-tay": "tay",\n "i-tsu": "tsu",\n "i-default": "en-x-i-default",\n "i-enochian": "und-x-i-enochian",\n "i-mingo": "see-x-i-mingo",\n "ibi": "opa",\n "ibo": "ig",\n "ice": "is",\n "ido": "io",\n "iii": "ii",\n "ike": "iu",\n "iku": "iu",\n "ile": "ie",\n "ilw": "gal",\n "in": "id",\n "ina": "ia",\n "ind": "id",\n "ipk": "ik",\n "isl": "is",\n "ita": "it",\n "iw": "he",\n "jav": "jv",\n "jeg": "oyb",\n "ji": "yi",\n "jpn": "ja",\n "jw": "jv",\n "kal": "kl",\n "kan": "kn",\n "kas": "ks",\n "kat": "ka",\n "kau": "kr",\n "kaz": "kk",\n "kgc": "tdf",\n "kgh": "kml",\n "khk": "mn",\n "khm": "km",\n "kik": "ki",\n "kin": "rw",\n "kir": "ky",\n "kk-Cyrl-KZ": "kk-KZ",\n "kmr": "ku",\n "knc": "kr",\n "kng": "kg",\n "knn": "kok",\n "koj": "kwv",\n "kom": "kv",\n "kon": "kg",\n "kor": "ko",\n "kpv": "kv",\n "krm": "bmf",\n "ks-Arab-IN": "ks-IN",\n "ktr": "dtp",\n "kua": "kj",\n "kur": "ku",\n "kvs": "gdj",\n "kwq": "yam",\n "kxe": "tvd",\n "ky-Cyrl-KG": "ky-KG",\n "kzj": "dtp",\n "kzt": "dtp",\n "lao": "lo",\n "lat": "la",\n "lav": "lv",\n "lbk": "bnc",\n "lii": "raq",\n "lim": "li",\n "lin": "ln",\n "lit": "lt",\n "llo": "ngt",\n "lmm": "rmx",\n "ltz": "lb",\n "lub": "lu",\n "lug": "lg",\n "lvs": "lv",\n "mac": "mk",\n "mah": "mh",\n "mal": "ml",\n "mao": "mi",\n "mar": "mr",\n "may": "ms",\n "meg": "cir",\n "mhr": "chm",\n "mkd": "mk",\n "mlg": "mg",\n "mlt": "mt",\n "mn-Cyrl-MN": "mn-MN",\n "mnk": "man",\n "mo": "ro",\n "mol": "ro",\n "mon": "mn",\n "mri": "mi",\n "ms-Latn-BN": "ms-BN",\n "ms-Latn-MY": "ms-MY",\n "ms-Latn-SG": "ms-SG",\n "msa": "ms",\n "mst": "mry",\n "mup": "raj",\n "mwj": "vaj",\n "mya": "my",\n "myd": "aog",\n "myt": "mry",\n "nad": "xny",\n "nau": "na",\n "nav": "nv",\n "nbl": "nr",\n "ncp": "kdz",\n "nde": "nd",\n "ndo": "ng",\n "nep": "ne",\n "nld": "nl",\n "nno": "nn",\n "nns": "nbr",\n "nnx": "ngv",\n "no": "nb",\n "no-bok": "nb",\n "no-BOKMAL": "nb",\n "no-nyn": "nn",\n "no-NYNORSK": "nn",\n "nob": "nb",\n "nor": "nb",\n "npi": "ne",\n "nts": "pij",\n "nya": "ny",\n "oci": "oc",\n "ojg": "oj",\n "oji": "oj",\n "ori": "or",\n "orm": "om",\n "ory": "or",\n "oss": "os",\n "oun": "vaj",\n "pa-IN": "pa-Guru-IN",\n "pa-PK": "pa-Arab-PK",\n "pan": "pa",\n "pbu": "ps",\n "pcr": "adx",\n "per": "fa",\n "pes": "fa",\n "pli": "pi",\n "plt": "mg",\n "pmc": "huw",\n "pmu": "phr",\n "pnb": "lah",\n "pol": "pl",\n "por": "pt",\n "ppa": "bfy",\n "ppr": "lcq",\n "prs": "fa-AF",\n "pry": "prt",\n "pus": "ps",\n "puz": "pub",\n "que": "qu",\n "quz": "qu",\n "rmy": "rom",\n "roh": "rm",\n "ron": "ro",\n "rum": "ro",\n "run": "rn",\n "rus": "ru",\n "sag": "sg",\n "san": "sa",\n "sca": "hle",\n "scc": "sr",\n "scr": "hr",\n "sgn-BE-FR": "sfb",\n "sgn-BE-NL": "vgt",\n "sgn-CH-DE": "sgg",\n "sh": "sr-Latn",\n "shi-MA": "shi-Tfng-MA",\n "sin": "si",\n "skk": "oyb",\n "slk": "sk",\n "slo": "sk",\n "slv": "sl",\n "sme": "se",\n "smo": "sm",\n "sna": "sn",\n "snd": "sd",\n "som": "so",\n "sot": "st",\n "spa": "es",\n "spy": "kln",\n "sqi": "sq",\n "sr-BA": "sr-Cyrl-BA",\n "sr-ME": "sr-Latn-ME",\n "sr-RS": "sr-Cyrl-RS",\n "sr-XK": "sr-Cyrl-XK",\n "src": "sc",\n "srd": "sc",\n "srp": "sr",\n "ssw": "ss",\n "sun": "su",\n "swa": "sw",\n "swc": "sw-CD",\n "swe": "sv",\n "swh": "sw",\n "tah": "ty",\n "tam": "ta",\n "tat": "tt",\n "tdu": "dtp",\n "tel": "te",\n "tgk": "tg",\n "tgl": "fil",\n "tha": "th",\n "thc": "tpo",\n "thx": "oyb",\n "tib": "bo",\n "tie": "ras",\n "tir": "ti",\n "tkk": "twm",\n "tl": "fil",\n "tlw": "weo",\n "tmp": "tyj",\n "tne": "kak",\n "tnf": "fa-af",\n "ton": "to",\n "tsf": "taj",\n "tsn": "tn",\n "tso": "ts",\n "ttq": "tmh",\n "tuk": "tk",\n "tur": "tr",\n "tw": "ak",\n "twi": "ak",\n "tzm-Latn-MA": "tzm-MA",\n "ug-Arab-CN": "ug-CN",\n "uig": "ug",\n "ukr": "uk",\n "umu": "del",\n "uok": "ema",\n "urd": "ur",\n "uz-AF": "uz-Arab-AF",\n "uz-UZ": "uz-Latn-UZ",\n "uzb": "uz",\n "uzn": "uz",\n "vai-LR": "vai-Vaii-LR",\n "ven": "ve",\n "vie": "vi",\n "vol": "vo",\n "wel": "cy",\n "wln": "wa",\n "wol": "wo",\n "xba": "cax",\n "xho": "xh",\n "xia": "acn",\n "xkh": "waw",\n "xpe": "kpe",\n "xsj": "suj",\n "xsl": "den",\n "ybd": "rki",\n "ydd": "yi",\n "yid": "yi",\n "yma": "lrr",\n "ymt": "mtm",\n "yor": "yo",\n "yos": "zom",\n "yue-CN": "yue-Hans-CN",\n "yue-HK": "yue-Hant-HK",\n "yuu": "yug",\n "zai": "zap",\n "zh-CN": "zh-Hans-CN",\n "zh-guoyu": "zh",\n "zh-hakka": "hak",\n "zh-HK": "zh-Hant-HK",\n "zh-min-nan": "nan",\n "zh-MO": "zh-Hant-MO",\n "zh-SG": "zh-Hans-SG",\n "zh-TW": "zh-Hant-TW",\n "zh-xiang": "hsn",\n "zh-min": "nan-x-zh-min",\n "zha": "za",\n "zho": "zh",\n "zsm": "ms",\n "zul": "zu",\n "zyb": "za"\n});\n;// CONCATENATED MODULE: ./node_modules/@formatjs/intl-utils/lib/parentLocales.js\n/* @generated */\n// prettier-ignore \n/* harmony default export */ var parentLocales = ({\n "en-150": "en-001",\n "en-AG": "en-001",\n "en-AI": "en-001",\n "en-AU": "en-001",\n "en-BB": "en-001",\n "en-BM": "en-001",\n "en-BS": "en-001",\n "en-BW": "en-001",\n "en-BZ": "en-001",\n "en-CA": "en-001",\n "en-CC": "en-001",\n "en-CK": "en-001",\n "en-CM": "en-001",\n "en-CX": "en-001",\n "en-CY": "en-001",\n "en-DG": "en-001",\n "en-DM": "en-001",\n "en-ER": "en-001",\n "en-FJ": "en-001",\n "en-FK": "en-001",\n "en-FM": "en-001",\n "en-GB": "en-001",\n "en-GD": "en-001",\n "en-GG": "en-001",\n "en-GH": "en-001",\n "en-GI": "en-001",\n "en-GM": "en-001",\n "en-GY": "en-001",\n "en-HK": "en-001",\n "en-IE": "en-001",\n "en-IL": "en-001",\n "en-IM": "en-001",\n "en-IN": "en-001",\n "en-IO": "en-001",\n "en-JE": "en-001",\n "en-JM": "en-001",\n "en-KE": "en-001",\n "en-KI": "en-001",\n "en-KN": "en-001",\n "en-KY": "en-001",\n "en-LC": "en-001",\n "en-LR": "en-001",\n "en-LS": "en-001",\n "en-MG": "en-001",\n "en-MO": "en-001",\n "en-MS": "en-001",\n "en-MT": "en-001",\n "en-MU": "en-001",\n "en-MW": "en-001",\n "en-MY": "en-001",\n "en-NA": "en-001",\n "en-NF": "en-001",\n "en-NG": "en-001",\n "en-NR": "en-001",\n "en-NU": "en-001",\n "en-NZ": "en-001",\n "en-PG": "en-001",\n "en-PH": "en-001",\n "en-PK": "en-001",\n "en-PN": "en-001",\n "en-PW": "en-001",\n "en-RW": "en-001",\n "en-SB": "en-001",\n "en-SC": "en-001",\n "en-SD": "en-001",\n "en-SG": "en-001",\n "en-SH": "en-001",\n "en-SL": "en-001",\n "en-SS": "en-001",\n "en-SX": "en-001",\n "en-SZ": "en-001",\n "en-TC": "en-001",\n "en-TK": "en-001",\n "en-TO": "en-001",\n "en-TT": "en-001",\n "en-TV": "en-001",\n "en-TZ": "en-001",\n "en-UG": "en-001",\n "en-VC": "en-001",\n "en-VG": "en-001",\n "en-VU": "en-001",\n "en-WS": "en-001",\n "en-ZA": "en-001",\n "en-ZM": "en-001",\n "en-ZW": "en-001",\n "en-AT": "en-150",\n "en-BE": "en-150",\n "en-CH": "en-150",\n "en-DE": "en-150",\n "en-DK": "en-150",\n "en-FI": "en-150",\n "en-NL": "en-150",\n "en-SE": "en-150",\n "en-SI": "en-150",\n "es-AR": "es-419",\n "es-BO": "es-419",\n "es-BR": "es-419",\n "es-BZ": "es-419",\n "es-CL": "es-419",\n "es-CO": "es-419",\n "es-CR": "es-419",\n "es-CU": "es-419",\n "es-DO": "es-419",\n "es-EC": "es-419",\n "es-GT": "es-419",\n "es-HN": "es-419",\n "es-MX": "es-419",\n "es-NI": "es-419",\n "es-PA": "es-419",\n "es-PE": "es-419",\n "es-PR": "es-419",\n "es-PY": "es-419",\n "es-SV": "es-419",\n "es-US": "es-419",\n "es-UY": "es-419",\n "es-VE": "es-419",\n "pt-AO": "pt-PT",\n "pt-CH": "pt-PT",\n "pt-CV": "pt-PT",\n "pt-FR": "pt-PT",\n "pt-GQ": "pt-PT",\n "pt-GW": "pt-PT",\n "pt-LU": "pt-PT",\n "pt-MO": "pt-PT",\n "pt-MZ": "pt-PT",\n "pt-ST": "pt-PT",\n "pt-TL": "pt-PT",\n "zh-Hant-MO": "zh-Hant-HK"\n});\n// EXTERNAL MODULE: ./node_modules/@formatjs/intl-utils/lib/invariant.js\nvar invariant = __webpack_require__(5981);\n;// CONCATENATED MODULE: ./node_modules/@formatjs/intl-utils/lib/polyfill-utils.js\n\n\n\n/**\n * https://tc39.es/ecma262/#sec-toobject\n * @param arg\n */\n\nfunction toObject(arg) {\n if (arg == null) {\n throw new TypeError(\'undefined/null cannot be converted to object\');\n }\n\n return Object(arg);\n}\n/**\n * https://tc39.es/ecma262/#sec-tostring\n */\n\nfunction polyfill_utils_toString(o) {\n // Only symbol is irregular...\n if (typeof o === \'symbol\') {\n throw TypeError(\'Cannot convert a Symbol value to a string\');\n }\n\n return String(o);\n}\n/**\n * https://tc39.es/ecma402/#sec-getoption\n * @param opts\n * @param prop\n * @param type\n * @param values\n * @param fallback\n */\n\nfunction getOption(opts, prop, type, values, fallback) {\n // const descriptor = Object.getOwnPropertyDescriptor(opts, prop);\n var value = opts[prop];\n\n if (value !== undefined) {\n if (type !== \'boolean\' && type !== \'string\') {\n throw new TypeError(\'invalid type\');\n }\n\n if (type === \'boolean\') {\n value = Boolean(value);\n }\n\n if (type === \'string\') {\n value = polyfill_utils_toString(value);\n }\n\n if (values !== undefined && !values.filter(function (val) {\n return val == value;\n }).length) {\n throw new RangeError(value + " is not within " + values.join(\', \'));\n }\n\n return value;\n }\n\n return fallback;\n}\n/**\n * https://tc39.es/ecma402/#sec-defaultnumberoption\n * @param val\n * @param min\n * @param max\n * @param fallback\n */\n\nfunction defaultNumberOption(val, min, max, fallback) {\n if (val !== undefined) {\n val = Number(val);\n\n if (isNaN(val) || val < min || val > max) {\n throw new RangeError(val + " is outside of range [" + min + ", " + max + "]");\n }\n\n return Math.floor(val);\n }\n\n return fallback;\n}\n/**\n * https://tc39.es/ecma402/#sec-getnumberoption\n * @param options\n * @param property\n * @param min\n * @param max\n * @param fallback\n */\n\nfunction getNumberOption(options, property, minimum, maximum, fallback) {\n var val = options[property];\n return defaultNumberOption(val, minimum, maximum, fallback);\n}\nfunction getAliasesByLang(lang) {\n return Object.keys(aliases).reduce(function (all, locale) {\n if (locale.split(\'-\')[0] === lang) {\n all[locale] = aliases[locale];\n }\n\n return all;\n }, {});\n}\nfunction getParentLocalesByLang(lang) {\n return Object.keys(parentLocales).reduce(function (all, locale) {\n if (locale.split(\'-\')[0] === lang) {\n all[locale] = parentLocales[locale];\n }\n\n return all;\n }, {});\n}\nfunction setInternalSlot(map, pl, field, value) {\n if (!map.get(pl)) {\n map.set(pl, Object.create(null));\n }\n\n var slots = map.get(pl);\n slots[field] = value;\n}\nfunction setMultiInternalSlots(map, pl, props) {\n for (var _i = 0, _a = Object.keys(props); _i < _a.length; _i++) {\n var k = _a[_i];\n setInternalSlot(map, pl, k, props[k]);\n }\n}\nfunction getInternalSlot(map, pl, field) {\n return getMultiInternalSlots(map, pl, field)[field];\n}\nfunction getMultiInternalSlots(map, pl) {\n var fields = [];\n\n for (var _i = 2; _i < arguments.length; _i++) {\n fields[_i - 2] = arguments[_i];\n }\n\n var slots = map.get(pl);\n\n if (!slots) {\n throw new TypeError(pl + " InternalSlot has not been initialized");\n }\n\n return fields.reduce(function (all, f) {\n all[f] = slots[f];\n return all;\n }, Object.create(null));\n}\nfunction isLiteralPart(patternPart) {\n return patternPart.type === \'literal\';\n}\nfunction partitionPattern(pattern) {\n var result = [];\n var beginIndex = pattern.indexOf(\'{\');\n var endIndex = 0;\n var nextIndex = 0;\n var length = pattern.length;\n\n while (beginIndex < pattern.length && beginIndex > -1) {\n endIndex = pattern.indexOf(\'}\', beginIndex);\n (0,invariant/* invariant */.k)(endIndex > beginIndex, "Invalid pattern " + pattern);\n\n if (beginIndex > nextIndex) {\n result.push({\n type: \'literal\',\n value: pattern.substring(nextIndex, beginIndex)\n });\n }\n\n result.push({\n type: pattern.substring(beginIndex + 1, endIndex),\n value: undefined\n });\n nextIndex = endIndex + 1;\n beginIndex = pattern.indexOf(\'{\', nextIndex);\n }\n\n if (nextIndex < length) {\n result.push({\n type: \'literal\',\n value: pattern.substring(nextIndex, length)\n });\n }\n\n return result;\n}\n/**\n * https://tc39.es/ecma402/#sec-setnfdigitoptions\n * https://tc39.es/proposal-unified-intl-numberformat/section11/numberformat_diff_out.html#sec-setnfdigitoptions\n * @param intlObj\n * @param opts\n * @param mnfdDefault\n * @param mxfdDefault\n */\n\nfunction setNumberFormatDigitOptions(internalSlotMap, intlObj, opts, mnfdDefault, mxfdDefault) {\n var mnid = getNumberOption(opts, \'minimumIntegerDigits\', 1, 21, 1);\n var mnfd = opts.minimumFractionDigits;\n var mxfd = opts.maximumFractionDigits;\n var mnsd = opts.minimumSignificantDigits;\n var mxsd = opts.maximumSignificantDigits;\n setInternalSlot(internalSlotMap, intlObj, \'minimumIntegerDigits\', mnid);\n\n if (mnsd !== undefined || mxsd !== undefined) {\n setInternalSlot(internalSlotMap, intlObj, \'roundingType\', \'significantDigits\');\n mnsd = defaultNumberOption(mnsd, 1, 21, 1);\n mxsd = defaultNumberOption(mxsd, mnsd, 21, 21);\n setInternalSlot(internalSlotMap, intlObj, \'minimumSignificantDigits\', mnsd);\n setInternalSlot(internalSlotMap, intlObj, \'maximumSignificantDigits\', mxsd);\n } else if (mnfd !== undefined || mxfd !== undefined) {\n setInternalSlot(internalSlotMap, intlObj, \'roundingType\', \'fractionDigits\');\n mnfd = defaultNumberOption(mnfd, 0, 20, mnfdDefault);\n var mxfdActualDefault = Math.max(mnfd, mxfdDefault);\n mxfd = defaultNumberOption(mxfd, mnfd, 20, mxfdActualDefault);\n setInternalSlot(internalSlotMap, intlObj, \'minimumFractionDigits\', mnfd);\n setInternalSlot(internalSlotMap, intlObj, \'maximumFractionDigits\', mxfd);\n } else if (getInternalSlot(internalSlotMap, intlObj, \'notation\') === \'compact\') {\n setInternalSlot(internalSlotMap, intlObj, \'roundingType\', \'compactRounding\');\n } else {\n setInternalSlot(internalSlotMap, intlObj, \'roundingType\', \'fractionDigits\');\n setInternalSlot(internalSlotMap, intlObj, \'minimumFractionDigits\', mnfdDefault);\n setInternalSlot(internalSlotMap, intlObj, \'maximumFractionDigits\', mxfdDefault);\n }\n}\nfunction objectIs(x, y) {\n if (Object.is) {\n return Object.is(x, y);\n } // SameValue algorithm\n\n\n if (x === y) {\n // Steps 1-5, 7-10\n // Steps 6.b-6.e: +0 != -0\n return x !== 0 || 1 / x === 1 / y;\n } // Step 6.a: NaN == NaN\n\n\n return x !== x && y !== y;\n}\nvar NOT_A_Z_REGEX = /[^A-Z]/;\n/**\n * This follows https://tc39.es/ecma402/#sec-case-sensitivity-and-case-mapping\n * @param str string to convert\n */\n\nfunction toUpperCase(str) {\n return str.replace(/([a-z])/g, function (_, c) {\n return c.toUpperCase();\n });\n}\n/**\n * https://tc39.es/proposal-unified-intl-numberformat/section6/locales-currencies-tz_proposed_out.html#sec-iswellformedcurrencycode\n * @param currency\n */\n\n\nfunction isWellFormedCurrencyCode(currency) {\n currency = toUpperCase(currency);\n\n if (currency.length !== 3) {\n return false;\n }\n\n if (NOT_A_Z_REGEX.test(currency)) {\n return false;\n }\n\n return true;\n}\n;// CONCATENATED MODULE: ./node_modules/@formatjs/intl-utils/lib/get-canonical-locales.js\n/**\n * IE11-safe version of getCanonicalLocales since it\'s ES2016\n * @param locales locales\n */\nfunction getCanonicalLocales(locales) {\n // IE11\n var getCanonicalLocales = Intl.getCanonicalLocales;\n\n if (typeof getCanonicalLocales === \'function\') {\n return getCanonicalLocales(locales);\n } // NOTE: we must NOT call `supportedLocalesOf` of a formatjs polyfill, or their implementation\n // will even eventually call this method recursively. Here we use `Intl.DateTimeFormat` since it\n // is not polyfilled by `@formatjs`.\n // TODO: Fix TypeScript type def for this bc undefined is just fine\n\n\n return Intl.DateTimeFormat.supportedLocalesOf(locales);\n}\n;// CONCATENATED MODULE: ./node_modules/@formatjs/intl-utils/lib/resolve-locale.js\nvar __extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (b.hasOwnProperty(p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n\nvar resolve_locale_assign = undefined && undefined.__assign || function () {\n resolve_locale_assign = Object.assign || function (t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n\n for (var p in s) {\n if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n }\n\n return t;\n };\n\n return resolve_locale_assign.apply(this, arguments);\n};\n\n\n\n\nfunction createResolveLocale(getDefaultLocale) {\n var lookupMatcher = createLookupMatcher(getDefaultLocale);\n var bestFitMatcher = createBestFitMatcher(getDefaultLocale);\n /**\n * https://tc39.es/ecma402/#sec-resolvelocale\n */\n\n return function resolveLocale(availableLocales, requestedLocales, options, relevantExtensionKeys, localeData) {\n var matcher = options.localeMatcher;\n var r;\n\n if (matcher === \'lookup\') {\n r = lookupMatcher(availableLocales, requestedLocales);\n } else {\n r = bestFitMatcher(availableLocales, requestedLocales);\n }\n\n var foundLocale = r.locale;\n var result = {\n locale: \'\',\n dataLocale: foundLocale\n };\n var supportedExtension = \'-u\';\n\n for (var _i = 0, relevantExtensionKeys_1 = relevantExtensionKeys; _i < relevantExtensionKeys_1.length; _i++) {\n var key = relevantExtensionKeys_1[_i];\n var foundLocaleData = localeData[foundLocale];\n (0,invariant/* invariant */.k)(typeof foundLocaleData === \'object\' && foundLocaleData !== null, "locale data " + key + " must be an object");\n var keyLocaleData = foundLocaleData[key];\n (0,invariant/* invariant */.k)(Array.isArray(keyLocaleData), "keyLocaleData for " + key + " must be an array");\n var value = keyLocaleData[0];\n (0,invariant/* invariant */.k)(typeof value === \'string\' || value === null, \'value must be string or null\');\n var supportedExtensionAddition = \'\';\n\n if (r.extension) {\n var requestedValue = unicodeExtensionValue(r.extension, key);\n\n if (requestedValue !== undefined) {\n if (requestedValue !== \'\') {\n if (~keyLocaleData.indexOf(requestedValue)) {\n value = requestedValue;\n supportedExtensionAddition = "-" + key + "-" + value;\n }\n } else if (~requestedValue.indexOf(\'true\')) {\n value = \'true\';\n supportedExtensionAddition = "-" + key;\n }\n }\n }\n\n if (key in options) {\n var optionsValue = options[key];\n (0,invariant/* invariant */.k)(typeof optionsValue === \'string\' || typeof optionsValue === \'undefined\' || optionsValue === null, \'optionsValue must be String, Undefined or Null\');\n\n if (~keyLocaleData.indexOf(optionsValue)) {\n if (optionsValue !== value) {\n value = optionsValue;\n supportedExtensionAddition = \'\';\n }\n }\n }\n\n result[key] = value;\n supportedExtension += supportedExtensionAddition;\n }\n\n if (supportedExtension.length > 2) {\n var privateIndex = foundLocale.indexOf(\'-x-\');\n\n if (privateIndex === -1) {\n foundLocale = foundLocale + supportedExtension;\n } else {\n var preExtension = foundLocale.slice(0, privateIndex);\n var postExtension = foundLocale.slice(privateIndex, foundLocale.length);\n foundLocale = preExtension + supportedExtension + postExtension;\n }\n\n foundLocale = getCanonicalLocales(foundLocale)[0];\n }\n\n result.locale = foundLocale;\n return result;\n };\n}\n/**\n * https://tc39.es/ecma402/#sec-unicodeextensionvalue\n * @param extension\n * @param key\n */\n\nfunction unicodeExtensionValue(extension, key) {\n (0,invariant/* invariant */.k)(key.length === 2, \'key must have 2 elements\');\n var size = extension.length;\n var searchValue = "-" + key + "-";\n var pos = extension.indexOf(searchValue);\n\n if (pos !== -1) {\n var start = pos + 4;\n var end = start;\n var k = start;\n var done = false;\n\n while (!done) {\n var e = extension.indexOf(\'-\', k);\n var len = void 0;\n\n if (e === -1) {\n len = size - k;\n } else {\n len = e - k;\n }\n\n if (len === 2) {\n done = true;\n } else if (e === -1) {\n end = size;\n done = true;\n } else {\n end = e;\n k = e + 1;\n }\n }\n\n return extension.slice(start, end);\n }\n\n searchValue = "-" + key;\n pos = extension.indexOf(searchValue);\n\n if (pos !== -1 && pos + 3 === size) {\n return \'\';\n }\n\n return undefined;\n}\n\nvar UNICODE_EXTENSION_SEQUENCE_REGEX = /-u(?:-[0-9a-z]{2,8})+/gi;\n/**\n * https://tc39.es/ecma402/#sec-bestavailablelocale\n * @param availableLocales\n * @param locale\n */\n\nfunction bestAvailableLocale(availableLocales, locale) {\n var candidate = locale;\n\n while (true) {\n if (~availableLocales.indexOf(candidate)) {\n return candidate;\n }\n\n var pos = candidate.lastIndexOf(\'-\');\n\n if (!~pos) {\n return undefined;\n }\n\n if (pos >= 2 && candidate[pos - 2] === \'-\') {\n pos -= 2;\n }\n\n candidate = candidate.slice(0, pos);\n }\n}\n\nfunction createLookupMatcher(getDefaultLocale) {\n /**\n * https://tc39.es/ecma402/#sec-lookupmatcher\n */\n return function lookupMatcher(availableLocales, requestedLocales) {\n var result = {\n locale: \'\'\n };\n\n for (var _i = 0, requestedLocales_1 = requestedLocales; _i < requestedLocales_1.length; _i++) {\n var locale = requestedLocales_1[_i];\n var noExtensionLocale = locale.replace(UNICODE_EXTENSION_SEQUENCE_REGEX, \'\');\n var availableLocale = bestAvailableLocale(availableLocales, noExtensionLocale);\n\n if (availableLocale) {\n result.locale = availableLocale;\n\n if (locale !== noExtensionLocale) {\n result.extension = locale.slice(noExtensionLocale.length + 1, locale.length);\n }\n\n return result;\n }\n }\n\n result.locale = getDefaultLocale();\n return result;\n };\n}\n\nfunction createBestFitMatcher(getDefaultLocale) {\n return function bestFitMatcher(availableLocales, requestedLocales) {\n var result = {\n locale: \'\'\n };\n\n for (var _i = 0, requestedLocales_2 = requestedLocales; _i < requestedLocales_2.length; _i++) {\n var locale = requestedLocales_2[_i];\n var noExtensionLocale = locale.replace(UNICODE_EXTENSION_SEQUENCE_REGEX, \'\');\n var availableLocale = bestAvailableLocale(availableLocales, noExtensionLocale);\n\n if (availableLocale) {\n result.locale = availableLocale;\n\n if (locale !== noExtensionLocale) {\n result.extension = locale.slice(noExtensionLocale.length + 1, locale.length);\n }\n\n return result;\n }\n }\n\n result.locale = getDefaultLocale();\n return result;\n };\n}\n\nfunction getLocaleHierarchy(locale, aliases, parentLocales) {\n var results = [locale];\n\n if (aliases[locale]) {\n locale = aliases[locale];\n results.push(locale);\n }\n\n var parentLocale = parentLocales[locale];\n\n if (parentLocale) {\n results.push(parentLocale);\n }\n\n var localeParts = locale.split(\'-\');\n\n for (var i = localeParts.length; i > 1; i--) {\n results.push(localeParts.slice(0, i - 1).join(\'-\'));\n }\n\n return results;\n}\n\nfunction lookupSupportedLocales(availableLocales, requestedLocales) {\n var subset = [];\n\n for (var _i = 0, requestedLocales_3 = requestedLocales; _i < requestedLocales_3.length; _i++) {\n var locale = requestedLocales_3[_i];\n var noExtensionLocale = locale.replace(UNICODE_EXTENSION_SEQUENCE_REGEX, \'\');\n var availableLocale = bestAvailableLocale(availableLocales, noExtensionLocale);\n\n if (availableLocale) {\n subset.push(availableLocale);\n }\n }\n\n return subset;\n}\n\nfunction supportedLocales(availableLocales, requestedLocales, options) {\n var matcher = \'best fit\';\n\n if (options !== undefined) {\n options = toObject(options);\n matcher = getOption(options, \'localeMatcher\', \'string\', [\'lookup\', \'best fit\'], \'best fit\');\n }\n\n if (matcher === \'best fit\') {\n return lookupSupportedLocales(availableLocales, requestedLocales);\n }\n\n return lookupSupportedLocales(availableLocales, requestedLocales);\n}\n\nvar MissingLocaleDataError =\n/** @class */\nfunction (_super) {\n __extends(MissingLocaleDataError, _super);\n\n function MissingLocaleDataError() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n\n _this.type = \'MISSING_LOCALE_DATA\';\n return _this;\n }\n\n return MissingLocaleDataError;\n}(Error);\n\nfunction isMissingLocaleDataError(e) {\n return e.type === \'MISSING_LOCALE_DATA\';\n}\nfunction unpackData(locale, localeData,\n/** By default shallow merge the dictionaries. */\nreducer) {\n if (reducer === void 0) {\n reducer = function reducer(all, d) {\n return resolve_locale_assign(resolve_locale_assign({}, all), d);\n };\n }\n\n var localeHierarchy = getLocaleHierarchy(locale, localeData.aliases, localeData.parentLocales);\n var dataToMerge = localeHierarchy.map(function (l) {\n return localeData.data[l];\n }).filter(Boolean);\n\n if (!dataToMerge.length) {\n throw new MissingLocaleDataError("Missing locale data for \\"" + locale + "\\", lookup hierarchy: " + localeHierarchy.join(\', \'));\n }\n\n dataToMerge.reverse();\n return dataToMerge.reduce(reducer, {});\n}\n;// CONCATENATED MODULE: ./node_modules/@formatjs/intl-utils/lib/units.js\n// https://tc39.es/proposal-unified-intl-numberformat/section6/locales-currencies-tz_diff_out.html#sec-issanctionedsimpleunitidentifier\nvar SANCTIONED_UNITS = [\'angle-degree\', \'area-acre\', \'area-hectare\', \'concentr-percent\', \'digital-bit\', \'digital-byte\', \'digital-gigabit\', \'digital-gigabyte\', \'digital-kilobit\', \'digital-kilobyte\', \'digital-megabit\', \'digital-megabyte\', \'digital-petabyte\', \'digital-terabit\', \'digital-terabyte\', \'duration-day\', \'duration-hour\', \'duration-millisecond\', \'duration-minute\', \'duration-month\', \'duration-second\', \'duration-week\', \'duration-year\', \'length-centimeter\', \'length-foot\', \'length-inch\', \'length-kilometer\', \'length-meter\', \'length-mile-scandinavian\', \'length-mile\', \'length-millimeter\', \'length-yard\', \'mass-gram\', \'mass-kilogram\', \'mass-ounce\', \'mass-pound\', \'mass-stone\', \'temperature-celsius\', \'temperature-fahrenheit\', \'volume-fluid-ounce\', \'volume-gallon\', \'volume-liter\', \'volume-milliliter\']; // In CLDR, the unit name always follows the form `namespace-unit` pattern.\n// For example: `digital-bit` instead of `bit`. This function removes the namespace prefix.\n\nfunction removeUnitNamespace(unit) {\n return unit.replace(/^(.*?)-/, \'\');\n}\n;// CONCATENATED MODULE: ./node_modules/@formatjs/intl-utils/lib/number-types.js\nvar InternalSlotToken;\n\n(function (InternalSlotToken) {\n // To prevent collision with {0} in CLDR\n InternalSlotToken["compactName"] = "compactName";\n InternalSlotToken["compactSymbol"] = "compactSymbol";\n InternalSlotToken["currencyCode"] = "currencyCode";\n InternalSlotToken["currencyName"] = "currencyName";\n InternalSlotToken["currencyNarrowSymbol"] = "currencyNarrowSymbol";\n InternalSlotToken["currencySymbol"] = "currencySymbol";\n InternalSlotToken["minusSign"] = "minusSign";\n InternalSlotToken["number"] = "number";\n InternalSlotToken["percentSign"] = "percentSign";\n InternalSlotToken["plusSign"] = "plusSign";\n InternalSlotToken["scientificExponent"] = "scientificExponent";\n InternalSlotToken["scientificSeparator"] = "scientificSeparator";\n InternalSlotToken["unitName"] = "unitName";\n InternalSlotToken["unitNarrowSymbol"] = "unitNarrowSymbol";\n InternalSlotToken["unitSymbol"] = "unitSymbol";\n})(InternalSlotToken || (InternalSlotToken = {}));\n;// CONCATENATED MODULE: ./node_modules/@formatjs/intl-utils/lib/index.js\n\n\n\n\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZm9ybWF0anMvaW50bC11dGlscy9saWIvZGlmZi5qcz83Y2M4Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0Bmb3JtYXRqcy9pbnRsLXV0aWxzL2xpYi9hbGlhc2VzLmpzPzU5OTYiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQGZvcm1hdGpzL2ludGwtdXRpbHMvbGliL3BhcmVudExvY2FsZXMuanM/ZTYzMCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZm9ybWF0anMvaW50bC11dGlscy9saWIvcG9seWZpbGwtdXRpbHMuanM/YzlkMiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZm9ybWF0anMvaW50bC11dGlscy9saWIvZ2V0LWNhbm9uaWNhbC1sb2NhbGVzLmpzP2VmMWMiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQGZvcm1hdGpzL2ludGwtdXRpbHMvbGliL3Jlc29sdmUtbG9jYWxlLmpzPzQyNmQiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQGZvcm1hdGpzL2ludGwtdXRpbHMvbGliL3VuaXRzLmpzPzEyYTYiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQGZvcm1hdGpzL2ludGwtdXRpbHMvbGliL251bWJlci10eXBlcy5qcz85M2U0Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0Bmb3JtYXRqcy9pbnRsLXV0aWxzL2xpYi9pbmRleC5qcz80MGYyIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsZUFBZSxTQUFJLElBQUksU0FBSTtBQUMzQjtBQUNBLDRDQUE0QyxPQUFPO0FBQ25EOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLCtDQUErQyx1Q0FBdUM7O0FBRXRGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRTs7QUNuR0E7QUFDQTtBQUNBLDRDQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxFOztBQ3ZhRDtBQUNBO0FBQ0Esa0RBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxFOzs7O0FDbkkrQjtBQUNZO0FBQ0o7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTyxTQUFTLHVCQUFRO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxjQUFjLHVCQUFRO0FBQ3RCOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztB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QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVPO0FBQ1A7O0FBRUE7QUFDQSxjQUFjLFFBQVE7QUFDdEIsY0FBYyxTQUFTO0FBQ3ZCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFTTtBQUNQO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxxQkFBUSxDQUFDLHFCQUFRLEdBQUc7QUFDakM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHVDQUF1QztBQUN2QyxDOztBQ3ZXQTtBQUNPLHN5QkFBc3lCO0FBQzd5Qjs7QUFFTztBQUNQO0FBQ0EsQzs7QUNOTzs7QUFFUDtBQUNBLGdDQUFnQyxFQUFFO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsOENBQThDLEc7O0FDbkJYO0FBQytSO0FBQ2hNO0FBQzNHO0FBQ087QUFDK0IiLCJmaWxlIjoiMjY1MC5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBfX2Fzc2lnbiA9IHRoaXMgJiYgdGhpcy5fX2Fzc2lnbiB8fCBmdW5jdGlvbiAoKSB7XG4gIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodCkge1xuICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcblxuICAgICAgZm9yICh2YXIgcCBpbiBzKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0O1xuICB9O1xuXG4gIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcblxudmFyIE1TX1BFUl9TRUNPTkQgPSAxZTM7XG52YXIgU0VDU19QRVJfTUlOID0gNjA7XG52YXIgU0VDU19QRVJfSE9VUiA9IFNFQ1NfUEVSX01JTiAqIDYwO1xudmFyIFNFQ1NfUEVSX0RBWSA9IFNFQ1NfUEVSX0hPVVIgKiAyNDtcbnZhciBTRUNTX1BFUl9XRUVLID0gU0VDU19QRVJfREFZICogNztcbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RVbml0KGZyb20sIHRvLCB0aHJlc2hvbGRzKSB7XG4gIGlmICh0byA9PT0gdm9pZCAwKSB7XG4gICAgdG8gPSBEYXRlLm5vdygpO1xuICB9XG5cbiAgaWYgKHRocmVzaG9sZHMgPT09IHZvaWQgMCkge1xuICAgIHRocmVzaG9sZHMgPSB7fTtcbiAgfVxuXG4gIHZhciByZXNvbHZlZFRocmVzaG9sZHMgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgREVGQVVMVF9USFJFU0hPTERTKSwgdGhyZXNob2xkcyB8fCB7fSk7XG5cbiAgdmFyIHNlY3MgPSAoK2Zyb20gLSArdG8pIC8gTVNfUEVSX1NFQ09ORDtcblxuICBpZiAoTWF0aC5hYnMoc2VjcykgPCByZXNvbHZlZFRocmVzaG9sZHMuc2Vjb25kKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiBNYXRoLnJvdW5kKHNlY3MpLFxuICAgICAgdW5pdDogJ3NlY29uZCdcbiAgICB9O1xuICB9XG5cbiAgdmFyIG1pbnMgPSBzZWNzIC8gU0VDU19QRVJfTUlOO1xuXG4gIGlmIChNYXRoLmFicyhtaW5zKSA8IHJlc29sdmVkVGhyZXNob2xkcy5taW51dGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IE1hdGgucm91bmQobWlucyksXG4gICAgICB1bml0OiAnbWludXRlJ1xuICAgIH07XG4gIH1cblxuICB2YXIgaG91cnMgPSBzZWNzIC8gU0VDU19QRVJfSE9VUjtcblxuICBpZiAoTWF0aC5hYnMoaG91cnMpIDwgcmVzb2x2ZWRUaHJlc2hvbGRzLmhvdXIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IE1hdGgucm91bmQoaG91cnMpLFxuICAgICAgdW5pdDogJ2hvdXInXG4gICAgfTtcbiAgfVxuXG4gIHZhciBkYXlzID0gc2VjcyAvIFNFQ1NfUEVSX0RBWTtcblxuICBpZiAoTWF0aC5hYnMoZGF5cykgPCByZXNvbHZlZFRocmVzaG9sZHMuZGF5KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiBNYXRoLnJvdW5kKGRheXMpLFxuICAgICAgdW5pdDogJ2RheSdcbiAgICB9O1xuICB9XG5cbiAgdmFyIGZyb21EYXRlID0gbmV3IERhdGUoZnJvbSk7XG4gIHZhciB0b0RhdGUgPSBuZXcgRGF0ZSh0byk7XG4gIHZhciB5ZWFycyA9IGZyb21EYXRlLmdldEZ1bGxZZWFyKCkgLSB0b0RhdGUuZ2V0RnVsbFllYXIoKTtcblxuICBpZiAoTWF0aC5yb3VuZChNYXRoLmFicyh5ZWFycykpID4gMCkge1xuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogTWF0aC5yb3VuZCh5ZWFycyksXG4gICAgICB1bml0OiAneWVhcidcbiAgICB9O1xuICB9XG5cbiAgdmFyIG1vbnRocyA9IHllYXJzICogMTIgKyBmcm9tRGF0ZS5nZXRNb250aCgpIC0gdG9EYXRlLmdldE1vbnRoKCk7XG5cbiAgaWYgKE1hdGgucm91bmQoTWF0aC5hYnMobW9udGhzKSkgPiAwKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiBNYXRoLnJvdW5kKG1vbnRocyksXG4gICAgICB1bml0OiAnbW9udGgnXG4gICAgfTtcbiAgfVxuXG4gIHZhciB3ZWVrcyA9IHNlY3MgLyBTRUNTX1BFUl9XRUVLO1xuICByZXR1cm4ge1xuICAgIHZhbHVlOiBNYXRoLnJvdW5kKHdlZWtzKSxcbiAgICB1bml0OiAnd2VlaydcbiAgfTtcbn1cbmV4cG9ydCB2YXIgREVGQVVMVF9USFJFU0hPTERTID0ge1xuICBzZWNvbmQ6IDQ1LFxuICBtaW51dGU6IDQ1LFxuICBob3VyOiAyMixcbiAgZGF5OiA1XG59OyIsIi8qIEBnZW5lcmF0ZWQgKi9cbi8vIHByZXR0aWVyLWlnbm9yZSAgXG5leHBvcnQgZGVmYXVsdCB7XG4gIFwiYWEtU0FBSE9cIjogXCJzc3lcIixcbiAgXCJhYW1cIjogXCJhYXNcIixcbiAgXCJhYXJcIjogXCJhYVwiLFxuICBcImFia1wiOiBcImFiXCIsXG4gIFwiYWRwXCI6IFwiZHpcIixcbiAgXCJhZnJcIjogXCJhZlwiLFxuICBcImFqdVwiOiBcImpyYlwiLFxuICBcImFrYVwiOiBcImFrXCIsXG4gIFwiYWxiXCI6IFwic3FcIixcbiAgXCJhbHNcIjogXCJzcVwiLFxuICBcImFtaFwiOiBcImFtXCIsXG4gIFwiYXJhXCI6IFwiYXJcIixcbiAgXCJhcmJcIjogXCJhclwiLFxuICBcImFyZ1wiOiBcImFuXCIsXG4gIFwiYXJtXCI6IFwiaHlcIixcbiAgXCJhcnQtbG9qYmFuXCI6IFwiamJvXCIsXG4gIFwiYXNkXCI6IFwic256XCIsXG4gIFwiYXNtXCI6IFwiYXNcIixcbiAgXCJhdWVcIjogXCJrdHpcIixcbiAgXCJhdmFcIjogXCJhdlwiLFxuICBcImF2ZVwiOiBcImFlXCIsXG4gIFwiYXltXCI6IFwiYXlcIixcbiAgXCJheXJcIjogXCJheVwiLFxuICBcImF5eFwiOiBcIm51blwiLFxuICBcImF6LUFaXCI6IFwiYXotTGF0bi1BWlwiLFxuICBcImF6ZVwiOiBcImF6XCIsXG4gIFwiYXpqXCI6IFwiYXpcIixcbiAgXCJiYWtcIjogXCJiYVwiLFxuICBcImJhbVwiOiBcImJtXCIsXG4gIFwiYmFxXCI6IFwiZXVcIixcbiAgXCJiY2NcIjogXCJiYWxcIixcbiAgXCJiY2xcIjogXCJiaWtcIixcbiAgXCJiZWxcIjogXCJiZVwiLFxuICBcImJlblwiOiBcImJuXCIsXG4gIFwiYmdtXCI6IFwiYmNnXCIsXG4gIFwiYmhcIjogXCJiaG9cIixcbiAgXCJiaWhcIjogXCJiaG9cIixcbiAgXCJiaXNcIjogXCJiaVwiLFxuICBcImJqZFwiOiBcImRybFwiLFxuICBcImJvZFwiOiBcImJvXCIsXG4gIFwiYm9zXCI6IFwiYnNcIixcbiAgXCJicmVcIjogXCJiclwiLFxuICBcImJzLUJBXCI6IFwiYnMtTGF0bi1CQVwiLFxuICBcImJ1bFwiOiBcImJnXCIsXG4gIFwiYnVyXCI6IFwibXlcIixcbiAgXCJieGtcIjogXCJsdXlcIixcbiAgXCJieHJcIjogXCJidWFcIixcbiAgXCJjYXRcIjogXCJjYVwiLFxuICBcImNjcVwiOiBcInJraVwiLFxuICBcImNlbC1nYXVsaXNoXCI6IFwieHRnLXgtY2VsLWdhdWxpc2hcIixcbiAgXCJjZXNcIjogXCJjc1wiLFxuICBcImNoYVwiOiBcImNoXCIsXG4gIFwiY2hlXCI6IFwiY2VcIixcbiAgXCJjaGlcIjogXCJ6aFwiLFxuICBcImNodVwiOiBcImN1XCIsXG4gIFwiY2h2XCI6IFwiY3ZcIixcbiAgXCJjanJcIjogXCJtb21cIixcbiAgXCJja2FcIjogXCJjbXJcIixcbiAgXCJjbGRcIjogXCJzeXJcIixcbiAgXCJjbWtcIjogXCJ4Y2hcIixcbiAgXCJjbW5cIjogXCJ6aFwiLFxuICBcImNuclwiOiBcInNyLU1FXCIsXG4gIFwiY29yXCI6IFwia3dcIixcbiAgXCJjb3NcIjogXCJjb1wiLFxuICBcImNveVwiOiBcInBpalwiLFxuICBcImNxdVwiOiBcInF1aFwiLFxuICBcImNyZVwiOiBcImNyXCIsXG4gIFwiY3dkXCI6IFwiY3JcIixcbiAgXCJjeW1cIjogXCJjeVwiLFxuICBcImN6ZVwiOiBcImNzXCIsXG4gIFwiZGFuXCI6IFwiZGFcIixcbiAgXCJkZXVcIjogXCJkZVwiLFxuICBcImRnb1wiOiBcImRvaVwiLFxuICBcImRoZFwiOiBcIm13clwiLFxuICBcImRpa1wiOiBcImRpblwiLFxuICBcImRpcVwiOiBcInp6YVwiLFxuICBcImRpdFwiOiBcImRpZlwiLFxuICBcImRpdlwiOiBcImR2XCIsXG4gIFwiZHJoXCI6IFwibW5cIixcbiAgXCJkcndcIjogXCJmYS1hZlwiLFxuICBcImR1dFwiOiBcIm5sXCIsXG4gIFwiZHpvXCI6IFwiZHpcIixcbiAgXCJla2tcIjogXCJldFwiLFxuICBcImVsbFwiOiBcImVsXCIsXG4gIFwiZW1rXCI6IFwibWFuXCIsXG4gIFwiZW5nXCI6IFwiZW5cIixcbiAgXCJlcG9cIjogXCJlb1wiLFxuICBcImVza1wiOiBcImlrXCIsXG4gIFwiZXN0XCI6IFwiZXRcIixcbiAgXCJldXNcIjogXCJldVwiLFxuICBcImV3ZVwiOiBcImVlXCIsXG4gIFwiZmFvXCI6IFwiZm9cIixcbiAgXCJmYXNcIjogXCJmYVwiLFxuICBcImZhdFwiOiBcImFrXCIsXG4gIFwiZmlqXCI6IFwiZmpcIixcbiAgXCJmaW5cIjogXCJmaVwiLFxuICBcImZyYVwiOiBcImZyXCIsXG4gIFwiZnJlXCI6IFwiZnJcIixcbiAgXCJmcnlcIjogXCJmeVwiLFxuICBcImZ1Y1wiOiBcImZmXCIsXG4gIFwiZnVsXCI6IFwiZmZcIixcbiAgXCJnYXZcIjogXCJkZXZcIixcbiAgXCJnYXpcIjogXCJvbVwiLFxuICBcImdib1wiOiBcImdyYlwiLFxuICBcImdlb1wiOiBcImthXCIsXG4gIFwiZ2VyXCI6IFwiZGVcIixcbiAgXCJnZnhcIjogXCJ2YWpcIixcbiAgXCJnZ25cIjogXCJndnJcIixcbiAgXCJnbGFcIjogXCJnZFwiLFxuICBcImdsZVwiOiBcImdhXCIsXG4gIFwiZ2xnXCI6IFwiZ2xcIixcbiAgXCJnbHZcIjogXCJndlwiLFxuICBcImdub1wiOiBcImdvblwiLFxuICBcImdyZVwiOiBcImVsXCIsXG4gIFwiZ3JuXCI6IFwiZ25cIixcbiAgXCJndGlcIjogXCJueWNcIixcbiAgXCJndWdcIjogXCJnblwiLFxuICBcImd1alwiOiBcImd1XCIsXG4gIFwiZ3V2XCI6IFwiZHV6XCIsXG4gIFwiZ3lhXCI6IFwiZ2JhXCIsXG4gIFwiaGEtTGF0bi1HSFwiOiBcImhhLUdIXCIsXG4gIFwiaGEtTGF0bi1ORVwiOiBcImhhLU5FXCIsXG4gIFwiaGEtTGF0bi1OR1wiOiBcImhhLU5HXCIsXG4gIFwiaGF0XCI6IFwiaHRcIixcbiAgXCJoYXVcIjogXCJoYVwiLFxuICBcImhic1wiOiBcInNyLUxhdG5cIixcbiAgXCJoZG5cIjogXCJoYWlcIixcbiAgXCJoZWFcIjogXCJobW5cIixcbiAgXCJoZWJcIjogXCJoZVwiLFxuICBcImhlclwiOiBcImh6XCIsXG4gIFwiaGltXCI6IFwic3J4XCIsXG4gIFwiaGluXCI6IFwiaGlcIixcbiAgXCJobW9cIjogXCJob1wiLFxuICBcImhyclwiOiBcImphbFwiLFxuICBcImhydlwiOiBcImhyXCIsXG4gIFwiaHVuXCI6IFwiaHVcIixcbiAgXCJoeWVcIjogXCJoeVwiLFxuICBcImktYW1pXCI6IFwiYW1pXCIsXG4gIFwiaS1ibm5cIjogXCJibm5cIixcbiAgXCJpLWhha1wiOiBcImhha1wiLFxuICBcImkta2xpbmdvblwiOiBcInRsaFwiLFxuICBcImktbHV4XCI6IFwibGJcIixcbiAgXCJpLW5hdmFqb1wiOiBcIm52XCIsXG4gIFwiaS1wd25cIjogXCJwd25cIixcbiAgXCJpLXRhb1wiOiBcInRhb1wiLFxuICBcImktdGF5XCI6IFwidGF5XCIsXG4gIFwiaS10c3VcIjogXCJ0c3VcIixcbiAgXCJpLWRlZmF1bHRcIjogXCJlbi14LWktZGVmYXVsdFwiLFxuICBcImktZW5vY2hpYW5cIjogXCJ1bmQteC1pLWVub2NoaWFuXCIsXG4gIFwiaS1taW5nb1wiOiBcInNlZS14LWktbWluZ29cIixcbiAgXCJpYmlcIjogXCJvcGFcIixcbiAgXCJpYm9cIjogXCJpZ1wiLFxuICBcImljZVwiOiBcImlzXCIsXG4gIFwiaWRvXCI6IFwiaW9cIixcbiAgXCJpaWlcIjogXCJpaVwiLFxuICBcImlrZVwiOiBcIml1XCIsXG4gIFwiaWt1XCI6IFwiaXVcIixcbiAgXCJpbGVcIjogXCJpZVwiLFxuICBcImlsd1wiOiBcImdhbFwiLFxuICBcImluXCI6IFwiaWRcIixcbiAgXCJpbmFcIjogXCJpYVwiLFxuICBcImluZFwiOiBcImlkXCIsXG4gIFwiaXBrXCI6IFwiaWtcIixcbiAgXCJpc2xcIjogXCJpc1wiLFxuICBcIml0YVwiOiBcIml0XCIsXG4gIFwiaXdcIjogXCJoZVwiLFxuICBcImphdlwiOiBcImp2XCIsXG4gIFwiamVnXCI6IFwib3liXCIsXG4gIFwiamlcIjogXCJ5aVwiLFxuICBcImpwblwiOiBcImphXCIsXG4gIFwiandcIjogXCJqdlwiLFxuICBcImthbFwiOiBcImtsXCIsXG4gIFwia2FuXCI6IFwia25cIixcbiAgXCJrYXNcIjogXCJrc1wiLFxuICBcImthdFwiOiBcImthXCIsXG4gIFwia2F1XCI6IFwia3JcIixcbiAgXCJrYXpcIjogXCJra1wiLFxuICBcImtnY1wiOiBcInRkZlwiLFxuICBcImtnaFwiOiBcImttbFwiLFxuICBcImtoa1wiOiBcIm1uXCIsXG4gIFwia2htXCI6IFwia21cIixcbiAgXCJraWtcIjogXCJraVwiLFxuICBcImtpblwiOiBcInJ3XCIsXG4gIFwia2lyXCI6IFwia3lcIixcbiAgXCJray1DeXJsLUtaXCI6IFwia2stS1pcIixcbiAgXCJrbXJcIjogXCJrdVwiLFxuICBcImtuY1wiOiBcImtyXCIsXG4gIFwia25nXCI6IFwia2dcIixcbiAgXCJrbm5cIjogXCJrb2tcIixcbiAgXCJrb2pcIjogXCJrd3ZcIixcbiAgXCJrb21cIjogXCJrdlwiLFxuICBcImtvblwiOiBcImtnXCIsXG4gIFwia29yXCI6IFwia29cIixcbiAgXCJrcHZcIjogXCJrdlwiLFxuICBcImtybVwiOiBcImJtZlwiLFxuICBcImtzLUFyYWItSU5cIjogXCJrcy1JTlwiLFxuICBcImt0clwiOiBcImR0cFwiLFxuICBcImt1YVwiOiBcImtqXCIsXG4gIFwia3VyXCI6IFwia3VcIixcbiAgXCJrdnNcIjogXCJnZGpcIixcbiAgXCJrd3FcIjogXCJ5YW1cIixcbiAgXCJreGVcIjogXCJ0dmRcIixcbiAgXCJreS1DeXJsLUtHXCI6IFwia3ktS0dcIixcbiAgXCJrempcIjogXCJkdHBcIixcbiAgXCJrenRcIjogXCJkdHBcIixcbiAgXCJsYW9cIjogXCJsb1wiLFxuICBcImxhdFwiOiBcImxhXCIsXG4gIFwibGF2XCI6IFwibHZcIixcbiAgXCJsYmtcIjogXCJibmNcIixcbiAgXCJsaWlcIjogXCJyYXFcIixcbiAgXCJsaW1cIjogXCJsaVwiLFxuICBcImxpblwiOiBcImxuXCIsXG4gIFwibGl0XCI6IFwibHRcIixcbiAgXCJsbG9cIjogXCJuZ3RcIixcbiAgXCJsbW1cIjogXCJybXhcIixcbiAgXCJsdHpcIjogXCJsYlwiLFxuICBcImx1YlwiOiBcImx1XCIsXG4gIFwibHVnXCI6IFwibGdcIixcbiAgXCJsdnNcIjogXCJsdlwiLFxuICBcIm1hY1wiOiBcIm1rXCIsXG4gIFwibWFoXCI6IFwibWhcIixcbiAgXCJtYWxcIjogXCJtbFwiLFxuICBcIm1hb1wiOiBcIm1pXCIsXG4gIFwibWFyXCI6IFwibXJcIixcbiAgXCJtYXlcIjogXCJtc1wiLFxuICBcIm1lZ1wiOiBcImNpclwiLFxuICBcIm1oclwiOiBcImNobVwiLFxuICBcIm1rZFwiOiBcIm1rXCIsXG4gIFwibWxnXCI6IFwibWdcIixcbiAgXCJtbHRcIjogXCJtdFwiLFxuICBcIm1uLUN5cmwtTU5cIjogXCJtbi1NTlwiLFxuICBcIm1ua1wiOiBcIm1hblwiLFxuICBcIm1vXCI6IFwicm9cIixcbiAgXCJtb2xcIjogXCJyb1wiLFxuICBcIm1vblwiOiBcIm1uXCIsXG4gIFwibXJpXCI6IFwibWlcIixcbiAgXCJtcy1MYXRuLUJOXCI6IFwibXMtQk5cIixcbiAgXCJtcy1MYXRuLU1ZXCI6IFwibXMtTVlcIixcbiAgXCJtcy1MYXRuLVNHXCI6IFwibXMtU0dcIixcbiAgXCJtc2FcIjogXCJtc1wiLFxuICBcIm1zdFwiOiBcIm1yeVwiLFxuICBcIm11cFwiOiBcInJhalwiLFxuICBcIm13alwiOiBcInZhalwiLFxuICBcIm15YVwiOiBcIm15XCIsXG4gIFwibXlkXCI6IFwiYW9nXCIsXG4gIFwibXl0XCI6IFwibXJ5XCIsXG4gIFwibmFkXCI6IFwieG55XCIsXG4gIFwibmF1XCI6IFwibmFcIixcbiAgXCJuYXZcIjogXCJudlwiLFxuICBcIm5ibFwiOiBcIm5yXCIsXG4gIFwibmNwXCI6IFwia2R6XCIsXG4gIFwibmRlXCI6IFwibmRcIixcbiAgXCJuZG9cIjogXCJuZ1wiLFxuICBcIm5lcFwiOiBcIm5lXCIsXG4gIFwibmxkXCI6IFwibmxcIixcbiAgXCJubm9cIjogXCJublwiLFxuICBcIm5uc1wiOiBcIm5iclwiLFxuICBcIm5ueFwiOiBcIm5ndlwiLFxuICBcIm5vXCI6IFwibmJcIixcbiAgXCJuby1ib2tcIjogXCJuYlwiLFxuICBcIm5vLUJPS01BTFwiOiBcIm5iXCIsXG4gIFwibm8tbnluXCI6IFwibm5cIixcbiAgXCJuby1OWU5PUlNLXCI6IFwibm5cIixcbiAgXCJub2JcIjogXCJuYlwiLFxuICBcIm5vclwiOiBcIm5iXCIsXG4gIFwibnBpXCI6IFwibmVcIixcbiAgXCJudHNcIjogXCJwaWpcIixcbiAgXCJueWFcIjogXCJueVwiLFxuICBcIm9jaVwiOiBcIm9jXCIsXG4gIFwib2pnXCI6IFwib2pcIixcbiAgXCJvamlcIjogXCJvalwiLFxuICBcIm9yaVwiOiBcIm9yXCIsXG4gIFwib3JtXCI6IFwib21cIixcbiAgXCJvcnlcIjogXCJvclwiLFxuICBcIm9zc1wiOiBcIm9zXCIsXG4gIFwib3VuXCI6IFwidmFqXCIsXG4gIFwicGEtSU5cIjogXCJwYS1HdXJ1LUlOXCIsXG4gIFwicGEtUEtcIjogXCJwYS1BcmFiLVBLXCIsXG4gIFwicGFuXCI6IFwicGFcIixcbiAgXCJwYnVcIjogXCJwc1wiLFxuICBcInBjclwiOiBcImFkeFwiLFxuICBcInBlclwiOiBcImZhXCIsXG4gIFwicGVzXCI6IFwiZmFcIixcbiAgXCJwbGlcIjogXCJwaVwiLFxuICBcInBsdFwiOiBcIm1nXCIsXG4gIFwicG1jXCI6IFwiaHV3XCIsXG4gIFwicG11XCI6IFwicGhyXCIsXG4gIFwicG5iXCI6IFwibGFoXCIsXG4gIFwicG9sXCI6IFwicGxcIixcbiAgXCJwb3JcIjogXCJwdFwiLFxuICBcInBwYVwiOiBcImJmeVwiLFxuICBcInBwclwiOiBcImxjcVwiLFxuICBcInByc1wiOiBcImZhLUFGXCIsXG4gIFwicHJ5XCI6IFwicHJ0XCIsXG4gIFwicHVzXCI6IFwicHNcIixcbiAgXCJwdXpcIjogXCJwdWJcIixcbiAgXCJxdWVcIjogXCJxdVwiLFxuICBcInF1elwiOiBcInF1XCIsXG4gIFwicm15XCI6IFwicm9tXCIsXG4gIFwicm9oXCI6IFwicm1cIixcbiAgXCJyb25cIjogXCJyb1wiLFxuICBcInJ1bVwiOiBcInJvXCIsXG4gIFwicnVuXCI6IFwicm5cIixcbiAgXCJydXNcIjogXCJydVwiLFxuICBcInNhZ1wiOiBcInNnXCIsXG4gIFwic2FuXCI6IFwic2FcIixcbiAgXCJzY2FcIjogXCJobGVcIixcbiAgXCJzY2NcIjogXCJzclwiLFxuICBcInNjclwiOiBcImhyXCIsXG4gIFwic2duLUJFLUZSXCI6IFwic2ZiXCIsXG4gIFwic2duLUJFLU5MXCI6IFwidmd0XCIsXG4gIFwic2duLUNILURFXCI6IFwic2dnXCIsXG4gIFwic2hcIjogXCJzci1MYXRuXCIsXG4gIFwic2hpLU1BXCI6IFwic2hpLVRmbmctTUFcIixcbiAgXCJzaW5cIjogXCJzaVwiLFxuICBcInNra1wiOiBcIm95YlwiLFxuICBcInNsa1wiOiBcInNrXCIsXG4gIFwic2xvXCI6IFwic2tcIixcbiAgXCJzbHZcIjogXCJzbFwiLFxuICBcInNtZVwiOiBcInNlXCIsXG4gIFwic21vXCI6IFwic21cIixcbiAgXCJzbmFcIjogXCJzblwiLFxuICBcInNuZFwiOiBcInNkXCIsXG4gIFwic29tXCI6IFwic29cIixcbiAgXCJzb3RcIjogXCJzdFwiLFxuICBcInNwYVwiOiBcImVzXCIsXG4gIFwic3B5XCI6IFwia2xuXCIsXG4gIFwic3FpXCI6IFwic3FcIixcbiAgXCJzci1CQVwiOiBcInNyLUN5cmwtQkFcIixcbiAgXCJzci1NRVwiOiBcInNyLUxhdG4tTUVcIixcbiAgXCJzci1SU1wiOiBcInNyLUN5cmwtUlNcIixcbiAgXCJzci1YS1wiOiBcInNyLUN5cmwtWEtcIixcbiAgXCJzcmNcIjogXCJzY1wiLFxuICBcInNyZFwiOiBcInNjXCIsXG4gIFwic3JwXCI6IFwic3JcIixcbiAgXCJzc3dcIjogXCJzc1wiLFxuICBcInN1blwiOiBcInN1XCIsXG4gIFwic3dhXCI6IFwic3dcIixcbiAgXCJzd2NcIjogXCJzdy1DRFwiLFxuICBcInN3ZVwiOiBcInN2XCIsXG4gIFwic3doXCI6IFwic3dcIixcbiAgXCJ0YWhcIjogXCJ0eVwiLFxuICBcInRhbVwiOiBcInRhXCIsXG4gIFwidGF0XCI6IFwidHRcIixcbiAgXCJ0ZHVcIjogXCJkdHBcIixcbiAgXCJ0ZWxcIjogXCJ0ZVwiLFxuICBcInRna1wiOiBcInRnXCIsXG4gIFwidGdsXCI6IFwiZmlsXCIsXG4gIFwidGhhXCI6IFwidGhcIixcbiAgXCJ0aGNcIjogXCJ0cG9cIixcbiAgXCJ0aHhcIjogXCJveWJcIixcbiAgXCJ0aWJcIjogXCJib1wiLFxuICBcInRpZVwiOiBcInJhc1wiLFxuICBcInRpclwiOiBcInRpXCIsXG4gIFwidGtrXCI6IFwidHdtXCIsXG4gIFwidGxcIjogXCJmaWxcIixcbiAgXCJ0bHdcIjogXCJ3ZW9cIixcbiAgXCJ0bXBcIjogXCJ0eWpcIixcbiAgXCJ0bmVcIjogXCJrYWtcIixcbiAgXCJ0bmZcIjogXCJmYS1hZlwiLFxuICBcInRvblwiOiBcInRvXCIsXG4gIFwidHNmXCI6IFwidGFqXCIsXG4gIFwidHNuXCI6IFwidG5cIixcbiAgXCJ0c29cIjogXCJ0c1wiLFxuICBcInR0cVwiOiBcInRtaFwiLFxuICBcInR1a1wiOiBcInRrXCIsXG4gIFwidHVyXCI6IFwidHJcIixcbiAgXCJ0d1wiOiBcImFrXCIsXG4gIFwidHdpXCI6IFwiYWtcIixcbiAgXCJ0em0tTGF0bi1NQVwiOiBcInR6bS1NQVwiLFxuICBcInVnLUFyYWItQ05cIjogXCJ1Zy1DTlwiLFxuICBcInVpZ1wiOiBcInVnXCIsXG4gIFwidWtyXCI6IFwidWtcIixcbiAgXCJ1bXVcIjogXCJkZWxcIixcbiAgXCJ1b2tcIjogXCJlbWFcIixcbiAgXCJ1cmRcIjogXCJ1clwiLFxuICBcInV6LUFGXCI6IFwidXotQXJhYi1BRlwiLFxuICBcInV6LVVaXCI6IFwidXotTGF0bi1VWlwiLFxuICBcInV6YlwiOiBcInV6XCIsXG4gIFwidXpuXCI6IFwidXpcIixcbiAgXCJ2YWktTFJcIjogXCJ2YWktVmFpaS1MUlwiLFxuICBcInZlblwiOiBcInZlXCIsXG4gIFwidmllXCI6IFwidmlcIixcbiAgXCJ2b2xcIjogXCJ2b1wiLFxuICBcIndlbFwiOiBcImN5XCIsXG4gIFwid2xuXCI6IFwid2FcIixcbiAgXCJ3b2xcIjogXCJ3b1wiLFxuICBcInhiYVwiOiBcImNheFwiLFxuICBcInhob1wiOiBcInhoXCIsXG4gIFwieGlhXCI6IFwiYWNuXCIsXG4gIFwieGtoXCI6IFwid2F3XCIsXG4gIFwieHBlXCI6IFwia3BlXCIsXG4gIFwieHNqXCI6IFwic3VqXCIsXG4gIFwieHNsXCI6IFwiZGVuXCIsXG4gIFwieWJkXCI6IFwicmtpXCIsXG4gIFwieWRkXCI6IFwieWlcIixcbiAgXCJ5aWRcIjogXCJ5aVwiLFxuICBcInltYVwiOiBcImxyclwiLFxuICBcInltdFwiOiBcIm10bVwiLFxuICBcInlvclwiOiBcInlvXCIsXG4gIFwieW9zXCI6IFwiem9tXCIsXG4gIFwieXVlLUNOXCI6IFwieXVlLUhhbnMtQ05cIixcbiAgXCJ5dWUtSEtcIjogXCJ5dWUtSGFudC1IS1wiLFxuICBcInl1dVwiOiBcInl1Z1wiLFxuICBcInphaVwiOiBcInphcFwiLFxuICBcInpoLUNOXCI6IFwiemgtSGFucy1DTlwiLFxuICBcInpoLWd1b3l1XCI6IFwiemhcIixcbiAgXCJ6aC1oYWtrYVwiOiBcImhha1wiLFxuICBcInpoLUhLXCI6IFwiemgtSGFudC1IS1wiLFxuICBcInpoLW1pbi1uYW5cIjogXCJuYW5cIixcbiAgXCJ6aC1NT1wiOiBcInpoLUhhbnQtTU9cIixcbiAgXCJ6aC1TR1wiOiBcInpoLUhhbnMtU0dcIixcbiAgXCJ6aC1UV1wiOiBcInpoLUhhbnQtVFdcIixcbiAgXCJ6aC14aWFuZ1wiOiBcImhzblwiLFxuICBcInpoLW1pblwiOiBcIm5hbi14LXpoLW1pblwiLFxuICBcInpoYVwiOiBcInphXCIsXG4gIFwiemhvXCI6IFwiemhcIixcbiAgXCJ6c21cIjogXCJtc1wiLFxuICBcInp1bFwiOiBcInp1XCIsXG4gIFwienliXCI6IFwiemFcIlxufTsiLCIvKiBAZ2VuZXJhdGVkICovXG4vLyBwcmV0dGllci1pZ25vcmUgIFxuZXhwb3J0IGRlZmF1bHQge1xuICBcImVuLTE1MFwiOiBcImVuLTAwMVwiLFxuICBcImVuLUFHXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tQUlcIjogXCJlbi0wMDFcIixcbiAgXCJlbi1BVVwiOiBcImVuLTAwMVwiLFxuICBcImVuLUJCXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tQk1cIjogXCJlbi0wMDFcIixcbiAgXCJlbi1CU1wiOiBcImVuLTAwMVwiLFxuICBcImVuLUJXXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tQlpcIjogXCJlbi0wMDFcIixcbiAgXCJlbi1DQVwiOiBcImVuLTAwMVwiLFxuICBcImVuLUNDXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tQ0tcIjogXCJlbi0wMDFcIixcbiAgXCJlbi1DTVwiOiBcImVuLTAwMVwiLFxuICBcImVuLUNYXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tQ1lcIjogXCJlbi0wMDFcIixcbiAgXCJlbi1ER1wiOiBcImVuLTAwMVwiLFxuICBcImVuLURNXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tRVJcIjogXCJlbi0wMDFcIixcbiAgXCJlbi1GSlwiOiBcImVuLTAwMVwiLFxuICBcImVuLUZLXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tRk1cIjogXCJlbi0wMDFcIixcbiAgXCJlbi1HQlwiOiBcImVuLTAwMVwiLFxuICBcImVuLUdEXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tR0dcIjogXCJlbi0wMDFcIixcbiAgXCJlbi1HSFwiOiBcImVuLTAwMVwiLFxuICBcImVuLUdJXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tR01cIjogXCJlbi0wMDFcIixcbiAgXCJlbi1HWVwiOiBcImVuLTAwMVwiLFxuICBcImVuLUhLXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tSUVcIjogXCJlbi0wMDFcIixcbiAgXCJlbi1JTFwiOiBcImVuLTAwMVwiLFxuICBcImVuLUlNXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tSU5cIjogXCJlbi0wMDFcIixcbiAgXCJlbi1JT1wiOiBcImVuLTAwMVwiLFxuICBcImVuLUpFXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tSk1cIjogXCJlbi0wMDFcIixcbiAgXCJlbi1LRVwiOiBcImVuLTAwMVwiLFxuICBcImVuLUtJXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tS05cIjogXCJlbi0wMDFcIixcbiAgXCJlbi1LWVwiOiBcImVuLTAwMVwiLFxuICBcImVuLUxDXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tTFJcIjogXCJlbi0wMDFcIixcbiAgXCJlbi1MU1wiOiBcImVuLTAwMVwiLFxuICBcImVuLU1HXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tTU9cIjogXCJlbi0wMDFcIixcbiAgXCJlbi1NU1wiOiBcImVuLTAwMVwiLFxuICBcImVuLU1UXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tTVVcIjogXCJlbi0wMDFcIixcbiAgXCJlbi1NV1wiOiBcImVuLTAwMVwiLFxuICBcImVuLU1ZXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tTkFcIjogXCJlbi0wMDFcIixcbiAgXCJlbi1ORlwiOiBcImVuLTAwMVwiLFxuICBcImVuLU5HXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tTlJcIjogXCJlbi0wMDFcIixcbiAgXCJlbi1OVVwiOiBcImVuLTAwMVwiLFxuICBcImVuLU5aXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tUEdcIjogXCJlbi0wMDFcIixcbiAgXCJlbi1QSFwiOiBcImVuLTAwMVwiLFxuICBcImVuLVBLXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tUE5cIjogXCJlbi0wMDFcIixcbiAgXCJlbi1QV1wiOiBcImVuLTAwMVwiLFxuICBcImVuLVJXXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tU0JcIjogXCJlbi0wMDFcIixcbiAgXCJlbi1TQ1wiOiBcImVuLTAwMVwiLFxuICBcImVuLVNEXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tU0dcIjogXCJlbi0wMDFcIixcbiAgXCJlbi1TSFwiOiBcImVuLTAwMVwiLFxuICBcImVuLVNMXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tU1NcIjogXCJlbi0wMDFcIixcbiAgXCJlbi1TWFwiOiBcImVuLTAwMVwiLFxuICBcImVuLVNaXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tVENcIjogXCJlbi0wMDFcIixcbiAgXCJlbi1US1wiOiBcImVuLTAwMVwiLFxuICBcImVuLVRPXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tVFRcIjogXCJlbi0wMDFcIixcbiAgXCJlbi1UVlwiOiBcImVuLTAwMVwiLFxuICBcImVuLVRaXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tVUdcIjogXCJlbi0wMDFcIixcbiAgXCJlbi1WQ1wiOiBcImVuLTAwMVwiLFxuICBcImVuLVZHXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tVlVcIjogXCJlbi0wMDFcIixcbiAgXCJlbi1XU1wiOiBcImVuLTAwMVwiLFxuICBcImVuLVpBXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tWk1cIjogXCJlbi0wMDFcIixcbiAgXCJlbi1aV1wiOiBcImVuLTAwMVwiLFxuICBcImVuLUFUXCI6IFwiZW4tMTUwXCIsXG4gIFwiZW4tQkVcIjogXCJlbi0xNTBcIixcbiAgXCJlbi1DSFwiOiBcImVuLTE1MFwiLFxuICBcImVuLURFXCI6IFwiZW4tMTUwXCIsXG4gIFwiZW4tREtcIjogXCJlbi0xNTBcIixcbiAgXCJlbi1GSVwiOiBcImVuLTE1MFwiLFxuICBcImVuLU5MXCI6IFwiZW4tMTUwXCIsXG4gIFwiZW4tU0VcIjogXCJlbi0xNTBcIixcbiAgXCJlbi1TSVwiOiBcImVuLTE1MFwiLFxuICBcImVzLUFSXCI6IFwiZXMtNDE5XCIsXG4gIFwiZXMtQk9cIjogXCJlcy00MTlcIixcbiAgXCJlcy1CUlwiOiBcImVzLTQxOVwiLFxuICBcImVzLUJaXCI6IFwiZXMtNDE5XCIsXG4gIFwiZXMtQ0xcIjogXCJlcy00MTlcIixcbiAgXCJlcy1DT1wiOiBcImVzLTQxOVwiLFxuICBcImVzLUNSXCI6IFwiZXMtNDE5XCIsXG4gIFwiZXMtQ1VcIjogXCJlcy00MTlcIixcbiAgXCJlcy1ET1wiOiBcImVzLTQxOVwiLFxuICBcImVzLUVDXCI6IFwiZXMtNDE5XCIsXG4gIFwiZXMtR1RcIjogXCJlcy00MTlcIixcbiAgXCJlcy1ITlwiOiBcImVzLTQxOVwiLFxuICBcImVzLU1YXCI6IFwiZXMtNDE5XCIsXG4gIFwiZXMtTklcIjogXCJlcy00MTlcIixcbiAgXCJlcy1QQVwiOiBcImVzLTQxOVwiLFxuICBcImVzLVBFXCI6IFwiZXMtNDE5XCIsXG4gIFwiZXMtUFJcIjogXCJlcy00MTlcIixcbiAgXCJlcy1QWVwiOiBcImVzLTQxOVwiLFxuICBcImVzLVNWXCI6IFwiZXMtNDE5XCIsXG4gIFwiZXMtVVNcIjogXCJlcy00MTlcIixcbiAgXCJlcy1VWVwiOiBcImVzLTQxOVwiLFxuICBcImVzLVZFXCI6IFwiZXMtNDE5XCIsXG4gIFwicHQtQU9cIjogXCJwdC1QVFwiLFxuICBcInB0LUNIXCI6IFwicHQtUFRcIixcbiAgXCJwdC1DVlwiOiBcInB0LVBUXCIsXG4gIFwicHQtRlJcIjogXCJwdC1QVFwiLFxuICBcInB0LUdRXCI6IFwicHQtUFRcIixcbiAgXCJwdC1HV1wiOiBcInB0LVBUXCIsXG4gIFwicHQtTFVcIjogXCJwdC1QVFwiLFxuICBcInB0LU1PXCI6IFwicHQtUFRcIixcbiAgXCJwdC1NWlwiOiBcInB0LVBUXCIsXG4gIFwicHQtU1RcIjogXCJwdC1QVFwiLFxuICBcInB0LVRMXCI6IFwicHQtUFRcIixcbiAgXCJ6aC1IYW50LU1PXCI6IFwiemgtSGFudC1IS1wiXG59OyIsImltcG9ydCBhbGlhc2VzIGZyb20gJy4vYWxpYXNlcyc7XG5pbXBvcnQgcGFyZW50TG9jYWxlcyBmcm9tICcuL3BhcmVudExvY2FsZXMnO1xuaW1wb3J0IHsgaW52YXJpYW50IH0gZnJvbSAnLi9pbnZhcmlhbnQnO1xuLyoqXG4gKiBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvb2JqZWN0XG4gKiBAcGFyYW0gYXJnXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRvT2JqZWN0KGFyZykge1xuICBpZiAoYXJnID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd1bmRlZmluZWQvbnVsbCBjYW5ub3QgYmUgY29udmVydGVkIHRvIG9iamVjdCcpO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdChhcmcpO1xufVxuLyoqXG4gKiBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvc3RyaW5nXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRvU3RyaW5nKG8pIHtcbiAgLy8gT25seSBzeW1ib2wgaXMgaXJyZWd1bGFyLi4uXG4gIGlmICh0eXBlb2YgbyA9PT0gJ3N5bWJvbCcpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IGEgU3ltYm9sIHZhbHVlIHRvIGEgc3RyaW5nJyk7XG4gIH1cblxuICByZXR1cm4gU3RyaW5nKG8pO1xufVxuLyoqXG4gKiBodHRwczovL3RjMzkuZXMvZWNtYTQwMi8jc2VjLWdldG9wdGlvblxuICogQHBhcmFtIG9wdHNcbiAqIEBwYXJhbSBwcm9wXG4gKiBAcGFyYW0gdHlwZVxuICogQHBhcmFtIHZhbHVlc1xuICogQHBhcmFtIGZhbGxiYWNrXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE9wdGlvbihvcHRzLCBwcm9wLCB0eXBlLCB2YWx1ZXMsIGZhbGxiYWNrKSB7XG4gIC8vIGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9wdHMsIHByb3ApO1xuICB2YXIgdmFsdWUgPSBvcHRzW3Byb3BdO1xuXG4gIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHR5cGUgIT09ICdib29sZWFuJyAmJiB0eXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCB0eXBlJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgdmFsdWUgPSBCb29sZWFuKHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHZhbHVlID0gdG9TdHJpbmcodmFsdWUpO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZXMgIT09IHVuZGVmaW5lZCAmJiAhdmFsdWVzLmZpbHRlcihmdW5jdGlvbiAodmFsKSB7XG4gICAgICByZXR1cm4gdmFsID09IHZhbHVlO1xuICAgIH0pLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IodmFsdWUgKyBcIiBpcyBub3Qgd2l0aGluIFwiICsgdmFsdWVzLmpvaW4oJywgJykpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxsYmFjaztcbn1cbi8qKlxuICogaHR0cHM6Ly90YzM5LmVzL2VjbWE0MDIvI3NlYy1kZWZhdWx0bnVtYmVyb3B0aW9uXG4gKiBAcGFyYW0gdmFsXG4gKiBAcGFyYW0gbWluXG4gKiBAcGFyYW0gbWF4XG4gKiBAcGFyYW0gZmFsbGJhY2tcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdE51bWJlck9wdGlvbih2YWwsIG1pbiwgbWF4LCBmYWxsYmFjaykge1xuICBpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YWwgPSBOdW1iZXIodmFsKTtcblxuICAgIGlmIChpc05hTih2YWwpIHx8IHZhbCA8IG1pbiB8fCB2YWwgPiBtYXgpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKHZhbCArIFwiIGlzIG91dHNpZGUgb2YgcmFuZ2UgW1wiICsgbWluICsgXCIsIFwiICsgbWF4ICsgXCJdXCIpO1xuICAgIH1cblxuICAgIHJldHVybiBNYXRoLmZsb29yKHZhbCk7XG4gIH1cblxuICByZXR1cm4gZmFsbGJhY2s7XG59XG4vKipcbiAqIGh0dHBzOi8vdGMzOS5lcy9lY21hNDAyLyNzZWMtZ2V0bnVtYmVyb3B0aW9uXG4gKiBAcGFyYW0gb3B0aW9uc1xuICogQHBhcmFtIHByb3BlcnR5XG4gKiBAcGFyYW0gbWluXG4gKiBAcGFyYW0gbWF4XG4gKiBAcGFyYW0gZmFsbGJhY2tcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TnVtYmVyT3B0aW9uKG9wdGlvbnMsIHByb3BlcnR5LCBtaW5pbXVtLCBtYXhpbXVtLCBmYWxsYmFjaykge1xuICB2YXIgdmFsID0gb3B0aW9uc1twcm9wZXJ0eV07XG4gIHJldHVybiBkZWZhdWx0TnVtYmVyT3B0aW9uKHZhbCwgbWluaW11bSwgbWF4aW11bSwgZmFsbGJhY2spO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEFsaWFzZXNCeUxhbmcobGFuZykge1xuICByZXR1cm4gT2JqZWN0LmtleXMoYWxpYXNlcykucmVkdWNlKGZ1bmN0aW9uIChhbGwsIGxvY2FsZSkge1xuICAgIGlmIChsb2NhbGUuc3BsaXQoJy0nKVswXSA9PT0gbGFuZykge1xuICAgICAgYWxsW2xvY2FsZV0gPSBhbGlhc2VzW2xvY2FsZV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGFsbDtcbiAgfSwge30pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmVudExvY2FsZXNCeUxhbmcobGFuZykge1xuICByZXR1cm4gT2JqZWN0LmtleXMocGFyZW50TG9jYWxlcykucmVkdWNlKGZ1bmN0aW9uIChhbGwsIGxvY2FsZSkge1xuICAgIGlmIChsb2NhbGUuc3BsaXQoJy0nKVswXSA9PT0gbGFuZykge1xuICAgICAgYWxsW2xvY2FsZV0gPSBwYXJlbnRMb2NhbGVzW2xvY2FsZV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGFsbDtcbiAgfSwge30pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNldEludGVybmFsU2xvdChtYXAsIHBsLCBmaWVsZCwgdmFsdWUpIHtcbiAgaWYgKCFtYXAuZ2V0KHBsKSkge1xuICAgIG1hcC5zZXQocGwsIE9iamVjdC5jcmVhdGUobnVsbCkpO1xuICB9XG5cbiAgdmFyIHNsb3RzID0gbWFwLmdldChwbCk7XG4gIHNsb3RzW2ZpZWxkXSA9IHZhbHVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNldE11bHRpSW50ZXJuYWxTbG90cyhtYXAsIHBsLCBwcm9wcykge1xuICBmb3IgKHZhciBfaSA9IDAsIF9hID0gT2JqZWN0LmtleXMocHJvcHMpOyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xuICAgIHZhciBrID0gX2FbX2ldO1xuICAgIHNldEludGVybmFsU2xvdChtYXAsIHBsLCBrLCBwcm9wc1trXSk7XG4gIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnRlcm5hbFNsb3QobWFwLCBwbCwgZmllbGQpIHtcbiAgcmV0dXJuIGdldE11bHRpSW50ZXJuYWxTbG90cyhtYXAsIHBsLCBmaWVsZClbZmllbGRdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldE11bHRpSW50ZXJuYWxTbG90cyhtYXAsIHBsKSB7XG4gIHZhciBmaWVsZHMgPSBbXTtcblxuICBmb3IgKHZhciBfaSA9IDI7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgIGZpZWxkc1tfaSAtIDJdID0gYXJndW1lbnRzW19pXTtcbiAgfVxuXG4gIHZhciBzbG90cyA9IG1hcC5nZXQocGwpO1xuXG4gIGlmICghc2xvdHMpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHBsICsgXCIgSW50ZXJuYWxTbG90IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgfVxuXG4gIHJldHVybiBmaWVsZHMucmVkdWNlKGZ1bmN0aW9uIChhbGwsIGYpIHtcbiAgICBhbGxbZl0gPSBzbG90c1tmXTtcbiAgICByZXR1cm4gYWxsO1xuICB9LCBPYmplY3QuY3JlYXRlKG51bGwpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0xpdGVyYWxQYXJ0KHBhdHRlcm5QYXJ0KSB7XG4gIHJldHVybiBwYXR0ZXJuUGFydC50eXBlID09PSAnbGl0ZXJhbCc7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFydGl0aW9uUGF0dGVybihwYXR0ZXJuKSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGJlZ2luSW5kZXggPSBwYXR0ZXJuLmluZGV4T2YoJ3snKTtcbiAgdmFyIGVuZEluZGV4ID0gMDtcbiAgdmFyIG5leHRJbmRleCA9IDA7XG4gIHZhciBsZW5ndGggPSBwYXR0ZXJuLmxlbmd0aDtcblxuICB3aGlsZSAoYmVnaW5JbmRleCA8IHBhdHRlcm4ubGVuZ3RoICYmIGJlZ2luSW5kZXggPiAtMSkge1xuICAgIGVuZEluZGV4ID0gcGF0dGVybi5pbmRleE9mKCd9JywgYmVnaW5JbmRleCk7XG4gICAgaW52YXJpYW50KGVuZEluZGV4ID4gYmVnaW5JbmRleCwgXCJJbnZhbGlkIHBhdHRlcm4gXCIgKyBwYXR0ZXJuKTtcblxuICAgIGlmIChiZWdpbkluZGV4ID4gbmV4dEluZGV4KSB7XG4gICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgIHR5cGU6ICdsaXRlcmFsJyxcbiAgICAgICAgdmFsdWU6IHBhdHRlcm4uc3Vic3RyaW5nKG5leHRJbmRleCwgYmVnaW5JbmRleClcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgIHR5cGU6IHBhdHRlcm4uc3Vic3RyaW5nKGJlZ2luSW5kZXggKyAxLCBlbmRJbmRleCksXG4gICAgICB2YWx1ZTogdW5kZWZpbmVkXG4gICAgfSk7XG4gICAgbmV4dEluZGV4ID0gZW5kSW5kZXggKyAxO1xuICAgIGJlZ2luSW5kZXggPSBwYXR0ZXJuLmluZGV4T2YoJ3snLCBuZXh0SW5kZXgpO1xuICB9XG5cbiAgaWYgKG5leHRJbmRleCA8IGxlbmd0aCkge1xuICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgIHR5cGU6ICdsaXRlcmFsJyxcbiAgICAgIHZhbHVlOiBwYXR0ZXJuLnN1YnN0cmluZyhuZXh0SW5kZXgsIGxlbmd0aClcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIGh0dHBzOi8vdGMzOS5lcy9lY21hNDAyLyNzZWMtc2V0bmZkaWdpdG9wdGlvbnNcbiAqIGh0dHBzOi8vdGMzOS5lcy9wcm9wb3NhbC11bmlmaWVkLWludGwtbnVtYmVyZm9ybWF0L3NlY3Rpb24xMS9udW1iZXJmb3JtYXRfZGlmZl9vdXQuaHRtbCNzZWMtc2V0bmZkaWdpdG9wdGlvbnNcbiAqIEBwYXJhbSBpbnRsT2JqXG4gKiBAcGFyYW0gb3B0c1xuICogQHBhcmFtIG1uZmREZWZhdWx0XG4gKiBAcGFyYW0gbXhmZERlZmF1bHRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0TnVtYmVyRm9ybWF0RGlnaXRPcHRpb25zKGludGVybmFsU2xvdE1hcCwgaW50bE9iaiwgb3B0cywgbW5mZERlZmF1bHQsIG14ZmREZWZhdWx0KSB7XG4gIHZhciBtbmlkID0gZ2V0TnVtYmVyT3B0aW9uKG9wdHMsICdtaW5pbXVtSW50ZWdlckRpZ2l0cycsIDEsIDIxLCAxKTtcbiAgdmFyIG1uZmQgPSBvcHRzLm1pbmltdW1GcmFjdGlvbkRpZ2l0cztcbiAgdmFyIG14ZmQgPSBvcHRzLm1heGltdW1GcmFjdGlvbkRpZ2l0cztcbiAgdmFyIG1uc2QgPSBvcHRzLm1pbmltdW1TaWduaWZpY2FudERpZ2l0cztcbiAgdmFyIG14c2QgPSBvcHRzLm1heGltdW1TaWduaWZpY2FudERpZ2l0cztcbiAgc2V0SW50ZXJuYWxTbG90KGludGVybmFsU2xvdE1hcCwgaW50bE9iaiwgJ21pbmltdW1JbnRlZ2VyRGlnaXRzJywgbW5pZCk7XG5cbiAgaWYgKG1uc2QgIT09IHVuZGVmaW5lZCB8fCBteHNkICE9PSB1bmRlZmluZWQpIHtcbiAgICBzZXRJbnRlcm5hbFNsb3QoaW50ZXJuYWxTbG90TWFwLCBpbnRsT2JqLCAncm91bmRpbmdUeXBlJywgJ3NpZ25pZmljYW50RGlnaXRzJyk7XG4gICAgbW5zZCA9IGRlZmF1bHROdW1iZXJPcHRpb24obW5zZCwgMSwgMjEsIDEpO1xuICAgIG14c2QgPSBkZWZhdWx0TnVtYmVyT3B0aW9uKG14c2QsIG1uc2QsIDIxLCAyMSk7XG4gICAgc2V0SW50ZXJuYWxTbG90KGludGVybmFsU2xvdE1hcCwgaW50bE9iaiwgJ21pbmltdW1TaWduaWZpY2FudERpZ2l0cycsIG1uc2QpO1xuICAgIHNldEludGVybmFsU2xvdChpbnRlcm5hbFNsb3RNYXAsIGludGxPYmosICdtYXhpbXVtU2lnbmlmaWNhbnREaWdpdHMnLCBteHNkKTtcbiAgfSBlbHNlIGlmIChtbmZkICE9PSB1bmRlZmluZWQgfHwgbXhmZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgc2V0SW50ZXJuYWxTbG90KGludGVybmFsU2xvdE1hcCwgaW50bE9iaiwgJ3JvdW5kaW5nVHlwZScsICdmcmFjdGlvbkRpZ2l0cycpO1xuICAgIG1uZmQgPSBkZWZhdWx0TnVtYmVyT3B0aW9uKG1uZmQsIDAsIDIwLCBtbmZkRGVmYXVsdCk7XG4gICAgdmFyIG14ZmRBY3R1YWxEZWZhdWx0ID0gTWF0aC5tYXgobW5mZCwgbXhmZERlZmF1bHQpO1xuICAgIG14ZmQgPSBkZWZhdWx0TnVtYmVyT3B0aW9uKG14ZmQsIG1uZmQsIDIwLCBteGZkQWN0dWFsRGVmYXVsdCk7XG4gICAgc2V0SW50ZXJuYWxTbG90KGludGVybmFsU2xvdE1hcCwgaW50bE9iaiwgJ21pbmltdW1GcmFjdGlvbkRpZ2l0cycsIG1uZmQpO1xuICAgIHNldEludGVybmFsU2xvdChpbnRlcm5hbFNsb3RNYXAsIGludGxPYmosICdtYXhpbXVtRnJhY3Rpb25EaWdpdHMnLCBteGZkKTtcbiAgfSBlbHNlIGlmIChnZXRJbnRlcm5hbFNsb3QoaW50ZXJuYWxTbG90TWFwLCBpbnRsT2JqLCAnbm90YXRpb24nKSA9PT0gJ2NvbXBhY3QnKSB7XG4gICAgc2V0SW50ZXJuYWxTbG90KGludGVybmFsU2xvdE1hcCwgaW50bE9iaiwgJ3JvdW5kaW5nVHlwZScsICdjb21wYWN0Um91bmRpbmcnKTtcbiAgfSBlbHNlIHtcbiAgICBzZXRJbnRlcm5hbFNsb3QoaW50ZXJuYWxTbG90TWFwLCBpbnRsT2JqLCAncm91bmRpbmdUeXBlJywgJ2ZyYWN0aW9uRGlnaXRzJyk7XG4gICAgc2V0SW50ZXJuYWxTbG90KGludGVybmFsU2xvdE1hcCwgaW50bE9iaiwgJ21pbmltdW1GcmFjdGlvbkRpZ2l0cycsIG1uZmREZWZhdWx0KTtcbiAgICBzZXRJbnRlcm5hbFNsb3QoaW50ZXJuYWxTbG90TWFwLCBpbnRsT2JqLCAnbWF4aW11bUZyYWN0aW9uRGlnaXRzJywgbXhmZERlZmF1bHQpO1xuICB9XG59XG5leHBvcnQgZnVuY3Rpb24gb2JqZWN0SXMoeCwgeSkge1xuICBpZiAoT2JqZWN0LmlzKSB7XG4gICAgcmV0dXJuIE9iamVjdC5pcyh4LCB5KTtcbiAgfSAvLyBTYW1lVmFsdWUgYWxnb3JpdGhtXG5cblxuICBpZiAoeCA9PT0geSkge1xuICAgIC8vIFN0ZXBzIDEtNSwgNy0xMFxuICAgIC8vIFN0ZXBzIDYuYi02LmU6ICswICE9IC0wXG4gICAgcmV0dXJuIHggIT09IDAgfHwgMSAvIHggPT09IDEgLyB5O1xuICB9IC8vIFN0ZXAgNi5hOiBOYU4gPT0gTmFOXG5cblxuICByZXR1cm4geCAhPT0geCAmJiB5ICE9PSB5O1xufVxudmFyIE5PVF9BX1pfUkVHRVggPSAvW15BLVpdLztcbi8qKlxuICogVGhpcyBmb2xsb3dzIGh0dHBzOi8vdGMzOS5lcy9lY21hNDAyLyNzZWMtY2FzZS1zZW5zaXRpdml0eS1hbmQtY2FzZS1tYXBwaW5nXG4gKiBAcGFyYW0gc3RyIHN0cmluZyB0byBjb252ZXJ0XG4gKi9cblxuZnVuY3Rpb24gdG9VcHBlckNhc2Uoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvKFthLXpdKS9nLCBmdW5jdGlvbiAoXywgYykge1xuICAgIHJldHVybiBjLnRvVXBwZXJDYXNlKCk7XG4gIH0pO1xufVxuLyoqXG4gKiBodHRwczovL3RjMzkuZXMvcHJvcG9zYWwtdW5pZmllZC1pbnRsLW51bWJlcmZvcm1hdC9zZWN0aW9uNi9sb2NhbGVzLWN1cnJlbmNpZXMtdHpfcHJvcG9zZWRfb3V0Lmh0bWwjc2VjLWlzd2VsbGZvcm1lZGN1cnJlbmN5Y29kZVxuICogQHBhcmFtIGN1cnJlbmN5XG4gKi9cblxuXG5leHBvcnQgZnVuY3Rpb24gaXNXZWxsRm9ybWVkQ3VycmVuY3lDb2RlKGN1cnJlbmN5KSB7XG4gIGN1cnJlbmN5ID0gdG9VcHBlckNhc2UoY3VycmVuY3kpO1xuXG4gIGlmIChjdXJyZW5jeS5sZW5ndGggIT09IDMpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoTk9UX0FfWl9SRUdFWC50ZXN0KGN1cnJlbmN5KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufSIsIi8qKlxuICogSUUxMS1zYWZlIHZlcnNpb24gb2YgZ2V0Q2Fub25pY2FsTG9jYWxlcyBzaW5jZSBpdCdzIEVTMjAxNlxuICogQHBhcmFtIGxvY2FsZXMgbG9jYWxlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2Fub25pY2FsTG9jYWxlcyhsb2NhbGVzKSB7XG4gIC8vIElFMTFcbiAgdmFyIGdldENhbm9uaWNhbExvY2FsZXMgPSBJbnRsLmdldENhbm9uaWNhbExvY2FsZXM7XG5cbiAgaWYgKHR5cGVvZiBnZXRDYW5vbmljYWxMb2NhbGVzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGdldENhbm9uaWNhbExvY2FsZXMobG9jYWxlcyk7XG4gIH0gLy8gTk9URTogd2UgbXVzdCBOT1QgY2FsbCBgc3VwcG9ydGVkTG9jYWxlc09mYCBvZiBhIGZvcm1hdGpzIHBvbHlmaWxsLCBvciB0aGVpciBpbXBsZW1lbnRhdGlvblxuICAvLyB3aWxsIGV2ZW4gZXZlbnR1YWxseSBjYWxsIHRoaXMgbWV0aG9kIHJlY3Vyc2l2ZWx5LiBIZXJlIHdlIHVzZSBgSW50bC5EYXRlVGltZUZvcm1hdGAgc2luY2UgaXRcbiAgLy8gaXMgbm90IHBvbHlmaWxsZWQgYnkgYEBmb3JtYXRqc2AuXG4gIC8vIFRPRE86IEZpeCBUeXBlU2NyaXB0IHR5cGUgZGVmIGZvciB0aGlzIGJjIHVuZGVmaW5lZCBpcyBqdXN0IGZpbmVcblxuXG4gIHJldHVybiBJbnRsLkRhdGVUaW1lRm9ybWF0LnN1cHBvcnRlZExvY2FsZXNPZihsb2NhbGVzKTtcbn0iLCJ2YXIgX19leHRlbmRzID0gdGhpcyAmJiB0aGlzLl9fZXh0ZW5kcyB8fCBmdW5jdGlvbiAoKSB7XG4gIHZhciBfZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIGV4dGVuZFN0YXRpY3MoZCwgYikge1xuICAgIF9leHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IHtcbiAgICAgIF9fcHJvdG9fXzogW11cbiAgICB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgIGQuX19wcm90b19fID0gYjtcbiAgICB9IHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICBmb3IgKHZhciBwIGluIGIpIHtcbiAgICAgICAgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gX2V4dGVuZFN0YXRpY3MoZCwgYik7XG4gIH07XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgX2V4dGVuZFN0YXRpY3MoZCwgYik7XG5cbiAgICBmdW5jdGlvbiBfXygpIHtcbiAgICAgIHRoaXMuY29uc3RydWN0b3IgPSBkO1xuICAgIH1cblxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgfTtcbn0oKTtcblxudmFyIF9fYXNzaWduID0gdGhpcyAmJiB0aGlzLl9fYXNzaWduIHx8IGZ1bmN0aW9uICgpIHtcbiAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0KSB7XG4gICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICBzID0gYXJndW1lbnRzW2ldO1xuXG4gICAgICBmb3IgKHZhciBwIGluIHMpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHQ7XG4gIH07XG5cbiAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xuXG5pbXBvcnQgeyBnZXRDYW5vbmljYWxMb2NhbGVzIH0gZnJvbSAnLi9nZXQtY2Fub25pY2FsLWxvY2FsZXMnO1xuaW1wb3J0IHsgaW52YXJpYW50IH0gZnJvbSAnLi9pbnZhcmlhbnQnO1xuaW1wb3J0IHsgdG9PYmplY3QsIGdldE9wdGlvbiB9IGZyb20gJy4vcG9seWZpbGwtdXRpbHMnO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlc29sdmVMb2NhbGUoZ2V0RGVmYXVsdExvY2FsZSkge1xuICB2YXIgbG9va3VwTWF0Y2hlciA9IGNyZWF0ZUxvb2t1cE1hdGNoZXIoZ2V0RGVmYXVsdExvY2FsZSk7XG4gIHZhciBiZXN0Rml0TWF0Y2hlciA9IGNyZWF0ZUJlc3RGaXRNYXRjaGVyKGdldERlZmF1bHRMb2NhbGUpO1xuICAvKipcbiAgICogaHR0cHM6Ly90YzM5LmVzL2VjbWE0MDIvI3NlYy1yZXNvbHZlbG9jYWxlXG4gICAqL1xuXG4gIHJldHVybiBmdW5jdGlvbiByZXNvbHZlTG9jYWxlKGF2YWlsYWJsZUxvY2FsZXMsIHJlcXVlc3RlZExvY2FsZXMsIG9wdGlvbnMsIHJlbGV2YW50RXh0ZW5zaW9uS2V5cywgbG9jYWxlRGF0YSkge1xuICAgIHZhciBtYXRjaGVyID0gb3B0aW9ucy5sb2NhbGVNYXRjaGVyO1xuICAgIHZhciByO1xuXG4gICAgaWYgKG1hdGNoZXIgPT09ICdsb29rdXAnKSB7XG4gICAgICByID0gbG9va3VwTWF0Y2hlcihhdmFpbGFibGVMb2NhbGVzLCByZXF1ZXN0ZWRMb2NhbGVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgciA9IGJlc3RGaXRNYXRjaGVyKGF2YWlsYWJsZUxvY2FsZXMsIHJlcXVlc3RlZExvY2FsZXMpO1xuICAgIH1cblxuICAgIHZhciBmb3VuZExvY2FsZSA9IHIubG9jYWxlO1xuICAgIHZhciByZXN1bHQgPSB7XG4gICAgICBsb2NhbGU6ICcnLFxuICAgICAgZGF0YUxvY2FsZTogZm91bmRMb2NhbGVcbiAgICB9O1xuICAgIHZhciBzdXBwb3J0ZWRFeHRlbnNpb24gPSAnLXUnO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwLCByZWxldmFudEV4dGVuc2lvbktleXNfMSA9IHJlbGV2YW50RXh0ZW5zaW9uS2V5czsgX2kgPCByZWxldmFudEV4dGVuc2lvbktleXNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBrZXkgPSByZWxldmFudEV4dGVuc2lvbktleXNfMVtfaV07XG4gICAgICB2YXIgZm91bmRMb2NhbGVEYXRhID0gbG9jYWxlRGF0YVtmb3VuZExvY2FsZV07XG4gICAgICBpbnZhcmlhbnQodHlwZW9mIGZvdW5kTG9jYWxlRGF0YSA9PT0gJ29iamVjdCcgJiYgZm91bmRMb2NhbGVEYXRhICE9PSBudWxsLCBcImxvY2FsZSBkYXRhIFwiICsga2V5ICsgXCIgbXVzdCBiZSBhbiBvYmplY3RcIik7XG4gICAgICB2YXIga2V5TG9jYWxlRGF0YSA9IGZvdW5kTG9jYWxlRGF0YVtrZXldO1xuICAgICAgaW52YXJpYW50KEFycmF5LmlzQXJyYXkoa2V5TG9jYWxlRGF0YSksIFwia2V5TG9jYWxlRGF0YSBmb3IgXCIgKyBrZXkgKyBcIiBtdXN0IGJlIGFuIGFycmF5XCIpO1xuICAgICAgdmFyIHZhbHVlID0ga2V5TG9jYWxlRGF0YVswXTtcbiAgICAgIGludmFyaWFudCh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHZhbHVlID09PSBudWxsLCAndmFsdWUgbXVzdCBiZSBzdHJpbmcgb3IgbnVsbCcpO1xuICAgICAgdmFyIHN1cHBvcnRlZEV4dGVuc2lvbkFkZGl0aW9uID0gJyc7XG5cbiAgICAgIGlmIChyLmV4dGVuc2lvbikge1xuICAgICAgICB2YXIgcmVxdWVzdGVkVmFsdWUgPSB1bmljb2RlRXh0ZW5zaW9uVmFsdWUoci5leHRlbnNpb24sIGtleSk7XG5cbiAgICAgICAgaWYgKHJlcXVlc3RlZFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAocmVxdWVzdGVkVmFsdWUgIT09ICcnKSB7XG4gICAgICAgICAgICBpZiAofmtleUxvY2FsZURhdGEuaW5kZXhPZihyZXF1ZXN0ZWRWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSByZXF1ZXN0ZWRWYWx1ZTtcbiAgICAgICAgICAgICAgc3VwcG9ydGVkRXh0ZW5zaW9uQWRkaXRpb24gPSBcIi1cIiArIGtleSArIFwiLVwiICsgdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICh+cmVxdWVzdGVkVmFsdWUuaW5kZXhPZigndHJ1ZScpKSB7XG4gICAgICAgICAgICB2YWx1ZSA9ICd0cnVlJztcbiAgICAgICAgICAgIHN1cHBvcnRlZEV4dGVuc2lvbkFkZGl0aW9uID0gXCItXCIgKyBrZXk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChrZXkgaW4gb3B0aW9ucykge1xuICAgICAgICB2YXIgb3B0aW9uc1ZhbHVlID0gb3B0aW9uc1trZXldO1xuICAgICAgICBpbnZhcmlhbnQodHlwZW9mIG9wdGlvbnNWYWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG9wdGlvbnNWYWx1ZSA9PT0gJ3VuZGVmaW5lZCcgfHwgb3B0aW9uc1ZhbHVlID09PSBudWxsLCAnb3B0aW9uc1ZhbHVlIG11c3QgYmUgU3RyaW5nLCBVbmRlZmluZWQgb3IgTnVsbCcpO1xuXG4gICAgICAgIGlmICh+a2V5TG9jYWxlRGF0YS5pbmRleE9mKG9wdGlvbnNWYWx1ZSkpIHtcbiAgICAgICAgICBpZiAob3B0aW9uc1ZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgdmFsdWUgPSBvcHRpb25zVmFsdWU7XG4gICAgICAgICAgICBzdXBwb3J0ZWRFeHRlbnNpb25BZGRpdGlvbiA9ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgICAgc3VwcG9ydGVkRXh0ZW5zaW9uICs9IHN1cHBvcnRlZEV4dGVuc2lvbkFkZGl0aW9uO1xuICAgIH1cblxuICAgIGlmIChzdXBwb3J0ZWRFeHRlbnNpb24ubGVuZ3RoID4gMikge1xuICAgICAgdmFyIHByaXZhdGVJbmRleCA9IGZvdW5kTG9jYWxlLmluZGV4T2YoJy14LScpO1xuXG4gICAgICBpZiAocHJpdmF0ZUluZGV4ID09PSAtMSkge1xuICAgICAgICBmb3VuZExvY2FsZSA9IGZvdW5kTG9jYWxlICsgc3VwcG9ydGVkRXh0ZW5zaW9uO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHByZUV4dGVuc2lvbiA9IGZvdW5kTG9jYWxlLnNsaWNlKDAsIHByaXZhdGVJbmRleCk7XG4gICAgICAgIHZhciBwb3N0RXh0ZW5zaW9uID0gZm91bmRMb2NhbGUuc2xpY2UocHJpdmF0ZUluZGV4LCBmb3VuZExvY2FsZS5sZW5ndGgpO1xuICAgICAgICBmb3VuZExvY2FsZSA9IHByZUV4dGVuc2lvbiArIHN1cHBvcnRlZEV4dGVuc2lvbiArIHBvc3RFeHRlbnNpb247XG4gICAgICB9XG5cbiAgICAgIGZvdW5kTG9jYWxlID0gZ2V0Q2Fub25pY2FsTG9jYWxlcyhmb3VuZExvY2FsZSlbMF07XG4gICAgfVxuXG4gICAgcmVzdWx0LmxvY2FsZSA9IGZvdW5kTG9jYWxlO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59XG4vKipcbiAqIGh0dHBzOi8vdGMzOS5lcy9lY21hNDAyLyNzZWMtdW5pY29kZWV4dGVuc2lvbnZhbHVlXG4gKiBAcGFyYW0gZXh0ZW5zaW9uXG4gKiBAcGFyYW0ga2V5XG4gKi9cblxuZnVuY3Rpb24gdW5pY29kZUV4dGVuc2lvblZhbHVlKGV4dGVuc2lvbiwga2V5KSB7XG4gIGludmFyaWFudChrZXkubGVuZ3RoID09PSAyLCAna2V5IG11c3QgaGF2ZSAyIGVsZW1lbnRzJyk7XG4gIHZhciBzaXplID0gZXh0ZW5zaW9uLmxlbmd0aDtcbiAgdmFyIHNlYXJjaFZhbHVlID0gXCItXCIgKyBrZXkgKyBcIi1cIjtcbiAgdmFyIHBvcyA9IGV4dGVuc2lvbi5pbmRleE9mKHNlYXJjaFZhbHVlKTtcblxuICBpZiAocG9zICE9PSAtMSkge1xuICAgIHZhciBzdGFydCA9IHBvcyArIDQ7XG4gICAgdmFyIGVuZCA9IHN0YXJ0O1xuICAgIHZhciBrID0gc3RhcnQ7XG4gICAgdmFyIGRvbmUgPSBmYWxzZTtcblxuICAgIHdoaWxlICghZG9uZSkge1xuICAgICAgdmFyIGUgPSBleHRlbnNpb24uaW5kZXhPZignLScsIGspO1xuICAgICAgdmFyIGxlbiA9IHZvaWQgMDtcblxuICAgICAgaWYgKGUgPT09IC0xKSB7XG4gICAgICAgIGxlbiA9IHNpemUgLSBrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGVuID0gZSAtIGs7XG4gICAgICB9XG5cbiAgICAgIGlmIChsZW4gPT09IDIpIHtcbiAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKGUgPT09IC0xKSB7XG4gICAgICAgIGVuZCA9IHNpemU7XG4gICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW5kID0gZTtcbiAgICAgICAgayA9IGUgKyAxO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBleHRlbnNpb24uc2xpY2Uoc3RhcnQsIGVuZCk7XG4gIH1cblxuICBzZWFyY2hWYWx1ZSA9IFwiLVwiICsga2V5O1xuICBwb3MgPSBleHRlbnNpb24uaW5kZXhPZihzZWFyY2hWYWx1ZSk7XG5cbiAgaWYgKHBvcyAhPT0gLTEgJiYgcG9zICsgMyA9PT0gc2l6ZSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbnZhciBVTklDT0RFX0VYVEVOU0lPTl9TRVFVRU5DRV9SRUdFWCA9IC8tdSg/Oi1bMC05YS16XXsyLDh9KSsvZ2k7XG4vKipcbiAqIGh0dHBzOi8vdGMzOS5lcy9lY21hNDAyLyNzZWMtYmVzdGF2YWlsYWJsZWxvY2FsZVxuICogQHBhcmFtIGF2YWlsYWJsZUxvY2FsZXNcbiAqIEBwYXJhbSBsb2NhbGVcbiAqL1xuXG5mdW5jdGlvbiBiZXN0QXZhaWxhYmxlTG9jYWxlKGF2YWlsYWJsZUxvY2FsZXMsIGxvY2FsZSkge1xuICB2YXIgY2FuZGlkYXRlID0gbG9jYWxlO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgaWYgKH5hdmFpbGFibGVMb2NhbGVzLmluZGV4T2YoY2FuZGlkYXRlKSkge1xuICAgICAgcmV0dXJuIGNhbmRpZGF0ZTtcbiAgICB9XG5cbiAgICB2YXIgcG9zID0gY2FuZGlkYXRlLmxhc3RJbmRleE9mKCctJyk7XG5cbiAgICBpZiAoIX5wb3MpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKHBvcyA+PSAyICYmIGNhbmRpZGF0ZVtwb3MgLSAyXSA9PT0gJy0nKSB7XG4gICAgICBwb3MgLT0gMjtcbiAgICB9XG5cbiAgICBjYW5kaWRhdGUgPSBjYW5kaWRhdGUuc2xpY2UoMCwgcG9zKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVMb29rdXBNYXRjaGVyKGdldERlZmF1bHRMb2NhbGUpIHtcbiAgLyoqXG4gICAqIGh0dHBzOi8vdGMzOS5lcy9lY21hNDAyLyNzZWMtbG9va3VwbWF0Y2hlclxuICAgKi9cbiAgcmV0dXJuIGZ1bmN0aW9uIGxvb2t1cE1hdGNoZXIoYXZhaWxhYmxlTG9jYWxlcywgcmVxdWVzdGVkTG9jYWxlcykge1xuICAgIHZhciByZXN1bHQgPSB7XG4gICAgICBsb2NhbGU6ICcnXG4gICAgfTtcblxuICAgIGZvciAodmFyIF9pID0gMCwgcmVxdWVzdGVkTG9jYWxlc18xID0gcmVxdWVzdGVkTG9jYWxlczsgX2kgPCByZXF1ZXN0ZWRMb2NhbGVzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgbG9jYWxlID0gcmVxdWVzdGVkTG9jYWxlc18xW19pXTtcbiAgICAgIHZhciBub0V4dGVuc2lvbkxvY2FsZSA9IGxvY2FsZS5yZXBsYWNlKFVOSUNPREVfRVhURU5TSU9OX1NFUVVFTkNFX1JFR0VYLCAnJyk7XG4gICAgICB2YXIgYXZhaWxhYmxlTG9jYWxlID0gYmVzdEF2YWlsYWJsZUxvY2FsZShhdmFpbGFibGVMb2NhbGVzLCBub0V4dGVuc2lvbkxvY2FsZSk7XG5cbiAgICAgIGlmIChhdmFpbGFibGVMb2NhbGUpIHtcbiAgICAgICAgcmVzdWx0LmxvY2FsZSA9IGF2YWlsYWJsZUxvY2FsZTtcblxuICAgICAgICBpZiAobG9jYWxlICE9PSBub0V4dGVuc2lvbkxvY2FsZSkge1xuICAgICAgICAgIHJlc3VsdC5leHRlbnNpb24gPSBsb2NhbGUuc2xpY2Uobm9FeHRlbnNpb25Mb2NhbGUubGVuZ3RoICsgMSwgbG9jYWxlLmxlbmd0aCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlc3VsdC5sb2NhbGUgPSBnZXREZWZhdWx0TG9jYWxlKCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQmVzdEZpdE1hdGNoZXIoZ2V0RGVmYXVsdExvY2FsZSkge1xuICByZXR1cm4gZnVuY3Rpb24gYmVzdEZpdE1hdGNoZXIoYXZhaWxhYmxlTG9jYWxlcywgcmVxdWVzdGVkTG9jYWxlcykge1xuICAgIHZhciByZXN1bHQgPSB7XG4gICAgICBsb2NhbGU6ICcnXG4gICAgfTtcblxuICAgIGZvciAodmFyIF9pID0gMCwgcmVxdWVzdGVkTG9jYWxlc18yID0gcmVxdWVzdGVkTG9jYWxlczsgX2kgPCByZXF1ZXN0ZWRMb2NhbGVzXzIubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgbG9jYWxlID0gcmVxdWVzdGVkTG9jYWxlc18yW19pXTtcbiAgICAgIHZhciBub0V4dGVuc2lvbkxvY2FsZSA9IGxvY2FsZS5yZXBsYWNlKFVOSUNPREVfRVhURU5TSU9OX1NFUVVFTkNFX1JFR0VYLCAnJyk7XG4gICAgICB2YXIgYXZhaWxhYmxlTG9jYWxlID0gYmVzdEF2YWlsYWJsZUxvY2FsZShhdmFpbGFibGVMb2NhbGVzLCBub0V4dGVuc2lvbkxvY2FsZSk7XG5cbiAgICAgIGlmIChhdmFpbGFibGVMb2NhbGUpIHtcbiAgICAgICAgcmVzdWx0LmxvY2FsZSA9IGF2YWlsYWJsZUxvY2FsZTtcblxuICAgICAgICBpZiAobG9jYWxlICE9PSBub0V4dGVuc2lvbkxvY2FsZSkge1xuICAgICAgICAgIHJlc3VsdC5leHRlbnNpb24gPSBsb2NhbGUuc2xpY2Uobm9FeHRlbnNpb25Mb2NhbGUubGVuZ3RoICsgMSwgbG9jYWxlLmxlbmd0aCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlc3VsdC5sb2NhbGUgPSBnZXREZWZhdWx0TG9jYWxlKCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExvY2FsZUhpZXJhcmNoeShsb2NhbGUsIGFsaWFzZXMsIHBhcmVudExvY2FsZXMpIHtcbiAgdmFyIHJlc3VsdHMgPSBbbG9jYWxlXTtcblxuICBpZiAoYWxpYXNlc1tsb2NhbGVdKSB7XG4gICAgbG9jYWxlID0gYWxpYXNlc1tsb2NhbGVdO1xuICAgIHJlc3VsdHMucHVzaChsb2NhbGUpO1xuICB9XG5cbiAgdmFyIHBhcmVudExvY2FsZSA9IHBhcmVudExvY2FsZXNbbG9jYWxlXTtcblxuICBpZiAocGFyZW50TG9jYWxlKSB7XG4gICAgcmVzdWx0cy5wdXNoKHBhcmVudExvY2FsZSk7XG4gIH1cblxuICB2YXIgbG9jYWxlUGFydHMgPSBsb2NhbGUuc3BsaXQoJy0nKTtcblxuICBmb3IgKHZhciBpID0gbG9jYWxlUGFydHMubGVuZ3RoOyBpID4gMTsgaS0tKSB7XG4gICAgcmVzdWx0cy5wdXNoKGxvY2FsZVBhcnRzLnNsaWNlKDAsIGkgLSAxKS5qb2luKCctJykpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbmZ1bmN0aW9uIGxvb2t1cFN1cHBvcnRlZExvY2FsZXMoYXZhaWxhYmxlTG9jYWxlcywgcmVxdWVzdGVkTG9jYWxlcykge1xuICB2YXIgc3Vic2V0ID0gW107XG5cbiAgZm9yICh2YXIgX2kgPSAwLCByZXF1ZXN0ZWRMb2NhbGVzXzMgPSByZXF1ZXN0ZWRMb2NhbGVzOyBfaSA8IHJlcXVlc3RlZExvY2FsZXNfMy5sZW5ndGg7IF9pKyspIHtcbiAgICB2YXIgbG9jYWxlID0gcmVxdWVzdGVkTG9jYWxlc18zW19pXTtcbiAgICB2YXIgbm9FeHRlbnNpb25Mb2NhbGUgPSBsb2NhbGUucmVwbGFjZShVTklDT0RFX0VYVEVOU0lPTl9TRVFVRU5DRV9SRUdFWCwgJycpO1xuICAgIHZhciBhdmFpbGFibGVMb2NhbGUgPSBiZXN0QXZhaWxhYmxlTG9jYWxlKGF2YWlsYWJsZUxvY2FsZXMsIG5vRXh0ZW5zaW9uTG9jYWxlKTtcblxuICAgIGlmIChhdmFpbGFibGVMb2NhbGUpIHtcbiAgICAgIHN1YnNldC5wdXNoKGF2YWlsYWJsZUxvY2FsZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN1YnNldDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRlZExvY2FsZXMoYXZhaWxhYmxlTG9jYWxlcywgcmVxdWVzdGVkTG9jYWxlcywgb3B0aW9ucykge1xuICB2YXIgbWF0Y2hlciA9ICdiZXN0IGZpdCc7XG5cbiAgaWYgKG9wdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgIG9wdGlvbnMgPSB0b09iamVjdChvcHRpb25zKTtcbiAgICBtYXRjaGVyID0gZ2V0T3B0aW9uKG9wdGlvbnMsICdsb2NhbGVNYXRjaGVyJywgJ3N0cmluZycsIFsnbG9va3VwJywgJ2Jlc3QgZml0J10sICdiZXN0IGZpdCcpO1xuICB9XG5cbiAgaWYgKG1hdGNoZXIgPT09ICdiZXN0IGZpdCcpIHtcbiAgICByZXR1cm4gbG9va3VwU3VwcG9ydGVkTG9jYWxlcyhhdmFpbGFibGVMb2NhbGVzLCByZXF1ZXN0ZWRMb2NhbGVzKTtcbiAgfVxuXG4gIHJldHVybiBsb29rdXBTdXBwb3J0ZWRMb2NhbGVzKGF2YWlsYWJsZUxvY2FsZXMsIHJlcXVlc3RlZExvY2FsZXMpO1xufVxuXG52YXIgTWlzc2luZ0xvY2FsZURhdGFFcnJvciA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoX3N1cGVyKSB7XG4gIF9fZXh0ZW5kcyhNaXNzaW5nTG9jYWxlRGF0YUVycm9yLCBfc3VwZXIpO1xuXG4gIGZ1bmN0aW9uIE1pc3NpbmdMb2NhbGVEYXRhRXJyb3IoKSB7XG4gICAgdmFyIF90aGlzID0gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG5cbiAgICBfdGhpcy50eXBlID0gJ01JU1NJTkdfTE9DQUxFX0RBVEEnO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHJldHVybiBNaXNzaW5nTG9jYWxlRGF0YUVycm9yO1xufShFcnJvcik7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc01pc3NpbmdMb2NhbGVEYXRhRXJyb3IoZSkge1xuICByZXR1cm4gZS50eXBlID09PSAnTUlTU0lOR19MT0NBTEVfREFUQSc7XG59XG5leHBvcnQgZnVuY3Rpb24gdW5wYWNrRGF0YShsb2NhbGUsIGxvY2FsZURhdGEsXG4vKiogQnkgZGVmYXVsdCBzaGFsbG93IG1lcmdlIHRoZSBkaWN0aW9uYXJpZXMuICovXG5yZWR1Y2VyKSB7XG4gIGlmIChyZWR1Y2VyID09PSB2b2lkIDApIHtcbiAgICByZWR1Y2VyID0gZnVuY3Rpb24gcmVkdWNlcihhbGwsIGQpIHtcbiAgICAgIHJldHVybiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgYWxsKSwgZCk7XG4gICAgfTtcbiAgfVxuXG4gIHZhciBsb2NhbGVIaWVyYXJjaHkgPSBnZXRMb2NhbGVIaWVyYXJjaHkobG9jYWxlLCBsb2NhbGVEYXRhLmFsaWFzZXMsIGxvY2FsZURhdGEucGFyZW50TG9jYWxlcyk7XG4gIHZhciBkYXRhVG9NZXJnZSA9IGxvY2FsZUhpZXJhcmNoeS5tYXAoZnVuY3Rpb24gKGwpIHtcbiAgICByZXR1cm4gbG9jYWxlRGF0YS5kYXRhW2xdO1xuICB9KS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgaWYgKCFkYXRhVG9NZXJnZS5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgTWlzc2luZ0xvY2FsZURhdGFFcnJvcihcIk1pc3NpbmcgbG9jYWxlIGRhdGEgZm9yIFxcXCJcIiArIGxvY2FsZSArIFwiXFxcIiwgbG9va3VwIGhpZXJhcmNoeTogXCIgKyBsb2NhbGVIaWVyYXJjaHkuam9pbignLCAnKSk7XG4gIH1cblxuICBkYXRhVG9NZXJnZS5yZXZlcnNlKCk7XG4gIHJldHVybiBkYXRhVG9NZXJnZS5yZWR1Y2UocmVkdWNlciwge30pO1xufSIsIi8vIGh0dHBzOi8vdGMzOS5lcy9wcm9wb3NhbC11bmlmaWVkLWludGwtbnVtYmVyZm9ybWF0L3NlY3Rpb242L2xvY2FsZXMtY3VycmVuY2llcy10el9kaWZmX291dC5odG1sI3NlYy1pc3NhbmN0aW9uZWRzaW1wbGV1bml0aWRlbnRpZmllclxuZXhwb3J0IHZhciBTQU5DVElPTkVEX1VOSVRTID0gWydhbmdsZS1kZWdyZWUnLCAnYXJlYS1hY3JlJywgJ2FyZWEtaGVjdGFyZScsICdjb25jZW50ci1wZXJjZW50JywgJ2RpZ2l0YWwtYml0JywgJ2RpZ2l0YWwtYnl0ZScsICdkaWdpdGFsLWdpZ2FiaXQnLCAnZGlnaXRhbC1naWdhYnl0ZScsICdkaWdpdGFsLWtpbG9iaXQnLCAnZGlnaXRhbC1raWxvYnl0ZScsICdkaWdpdGFsLW1lZ2FiaXQnLCAnZGlnaXRhbC1tZWdhYnl0ZScsICdkaWdpdGFsLXBldGFieXRlJywgJ2RpZ2l0YWwtdGVyYWJpdCcsICdkaWdpdGFsLXRlcmFieXRlJywgJ2R1cmF0aW9uLWRheScsICdkdXJhdGlvbi1ob3VyJywgJ2R1cmF0aW9uLW1pbGxpc2Vjb25kJywgJ2R1cmF0aW9uLW1pbnV0ZScsICdkdXJhdGlvbi1tb250aCcsICdkdXJhdGlvbi1zZWNvbmQnLCAnZHVyYXRpb24td2VlaycsICdkdXJhdGlvbi15ZWFyJywgJ2xlbmd0aC1jZW50aW1ldGVyJywgJ2xlbmd0aC1mb290JywgJ2xlbmd0aC1pbmNoJywgJ2xlbmd0aC1raWxvbWV0ZXInLCAnbGVuZ3RoLW1ldGVyJywgJ2xlbmd0aC1taWxlLXNjYW5kaW5hdmlhbicsICdsZW5ndGgtbWlsZScsICdsZW5ndGgtbWlsbGltZXRlcicsICdsZW5ndGgteWFyZCcsICdtYXNzLWdyYW0nLCAnbWFzcy1raWxvZ3JhbScsICdtYXNzLW91bmNlJywgJ21hc3MtcG91bmQnLCAnbWFzcy1zdG9uZScsICd0ZW1wZXJhdHVyZS1jZWxzaXVzJywgJ3RlbXBlcmF0dXJlLWZhaHJlbmhlaXQnLCAndm9sdW1lLWZsdWlkLW91bmNlJywgJ3ZvbHVtZS1nYWxsb24nLCAndm9sdW1lLWxpdGVyJywgJ3ZvbHVtZS1taWxsaWxpdGVyJ107IC8vIEluIENMRFIsIHRoZSB1bml0IG5hbWUgYWx3YXlzIGZvbGxvd3MgdGhlIGZvcm0gYG5hbWVzcGFjZS11bml0YCBwYXR0ZXJuLlxuLy8gRm9yIGV4YW1wbGU6IGBkaWdpdGFsLWJpdGAgaW5zdGVhZCBvZiBgYml0YC4gVGhpcyBmdW5jdGlvbiByZW1vdmVzIHRoZSBuYW1lc3BhY2UgcHJlZml4LlxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlVW5pdE5hbWVzcGFjZSh1bml0KSB7XG4gIHJldHVybiB1bml0LnJlcGxhY2UoL14oLio/KS0vLCAnJyk7XG59IiwiZXhwb3J0IHZhciBJbnRlcm5hbFNsb3RUb2tlbjtcblxuKGZ1bmN0aW9uIChJbnRlcm5hbFNsb3RUb2tlbikge1xuICAvLyBUbyBwcmV2ZW50IGNvbGxpc2lvbiB3aXRoIHswfSBpbiBDTERSXG4gIEludGVybmFsU2xvdFRva2VuW1wiY29tcGFjdE5hbWVcIl0gPSBcImNvbXBhY3ROYW1lXCI7XG4gIEludGVybmFsU2xvdFRva2VuW1wiY29tcGFjdFN5bWJvbFwiXSA9IFwiY29tcGFjdFN5bWJvbFwiO1xuICBJbnRlcm5hbFNsb3RUb2tlbltcImN1cnJlbmN5Q29kZVwiXSA9IFwiY3VycmVuY3lDb2RlXCI7XG4gIEludGVybmFsU2xvdFRva2VuW1wiY3VycmVuY3lOYW1lXCJdID0gXCJjdXJyZW5jeU5hbWVcIjtcbiAgSW50ZXJuYWxTbG90VG9rZW5bXCJjdXJyZW5jeU5hcnJvd1N5bWJvbFwiXSA9IFwiY3VycmVuY3lOYXJyb3dTeW1ib2xcIjtcbiAgSW50ZXJuYWxTbG90VG9rZW5bXCJjdXJyZW5jeVN5bWJvbFwiXSA9IFwiY3VycmVuY3lTeW1ib2xcIjtcbiAgSW50ZXJuYWxTbG90VG9rZW5bXCJtaW51c1NpZ25cIl0gPSBcIm1pbnVzU2lnblwiO1xuICBJbnRlcm5hbFNsb3RUb2tlbltcIm51bWJlclwiXSA9IFwibnVtYmVyXCI7XG4gIEludGVybmFsU2xvdFRva2VuW1wicGVyY2VudFNpZ25cIl0gPSBcInBlcmNlbnRTaWduXCI7XG4gIEludGVybmFsU2xvdFRva2VuW1wicGx1c1NpZ25cIl0gPSBcInBsdXNTaWduXCI7XG4gIEludGVybmFsU2xvdFRva2VuW1wic2NpZW50aWZpY0V4cG9uZW50XCJdID0gXCJzY2llbnRpZmljRXhwb25lbnRcIjtcbiAgSW50ZXJuYWxTbG90VG9rZW5bXCJzY2llbnRpZmljU2VwYXJhdG9yXCJdID0gXCJzY2llbnRpZmljU2VwYXJhdG9yXCI7XG4gIEludGVybmFsU2xvdFRva2VuW1widW5pdE5hbWVcIl0gPSBcInVuaXROYW1lXCI7XG4gIEludGVybmFsU2xvdFRva2VuW1widW5pdE5hcnJvd1N5bWJvbFwiXSA9IFwidW5pdE5hcnJvd1N5bWJvbFwiO1xuICBJbnRlcm5hbFNsb3RUb2tlbltcInVuaXRTeW1ib2xcIl0gPSBcInVuaXRTeW1ib2xcIjtcbn0pKEludGVybmFsU2xvdFRva2VuIHx8IChJbnRlcm5hbFNsb3RUb2tlbiA9IHt9KSk7IiwiZXhwb3J0IHsgc2VsZWN0VW5pdCB9IGZyb20gJy4vZGlmZic7XG5leHBvcnQgeyBkZWZhdWx0TnVtYmVyT3B0aW9uLCBnZXRBbGlhc2VzQnlMYW5nLCBnZXRJbnRlcm5hbFNsb3QsIGdldE11bHRpSW50ZXJuYWxTbG90cywgZ2V0TnVtYmVyT3B0aW9uLCBnZXRPcHRpb24sIGdldFBhcmVudExvY2FsZXNCeUxhbmcsIGlzTGl0ZXJhbFBhcnQsIHBhcnRpdGlvblBhdHRlcm4sIHNldEludGVybmFsU2xvdCwgc2V0TXVsdGlJbnRlcm5hbFNsb3RzLCBzZXROdW1iZXJGb3JtYXREaWdpdE9wdGlvbnMsIHRvT2JqZWN0LCBvYmplY3RJcywgaXNXZWxsRm9ybWVkQ3VycmVuY3lDb2RlLCB0b1N0cmluZyB9IGZyb20gJy4vcG9seWZpbGwtdXRpbHMnO1xuZXhwb3J0IHsgY3JlYXRlUmVzb2x2ZUxvY2FsZSwgZ2V0TG9jYWxlSGllcmFyY2h5LCBzdXBwb3J0ZWRMb2NhbGVzLCB1bnBhY2tEYXRhLCBpc01pc3NpbmdMb2NhbGVEYXRhRXJyb3IgfSBmcm9tICcuL3Jlc29sdmUtbG9jYWxlJztcbmV4cG9ydCAqIGZyb20gJy4vdW5pdHMnO1xuZXhwb3J0ICogZnJvbSAnLi9udW1iZXItdHlwZXMnO1xuZXhwb3J0IHsgZ2V0Q2Fub25pY2FsTG9jYWxlcyB9IGZyb20gJy4vZ2V0LWNhbm9uaWNhbC1sb2NhbGVzJztcbmV4cG9ydCB7IGludmFyaWFudCB9IGZyb20gJy4vaW52YXJpYW50JzsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///2650\n')},5981:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "k": function() { return /* binding */ invariant; }\n/* harmony export */ });\nfunction invariant(condition, message, Err) {\n if (Err === void 0) {\n Err = Error;\n }\n\n if (!condition) {\n throw new Err(message);\n }\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZm9ybWF0anMvaW50bC11dGlscy9saWIvaW52YXJpYW50LmpzPzQ5NWIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiNTk4MS5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBmdW5jdGlvbiBpbnZhcmlhbnQoY29uZGl0aW9uLCBtZXNzYWdlLCBFcnIpIHtcbiAgaWYgKEVyciA9PT0gdm9pZCAwKSB7XG4gICAgRXJyID0gRXJyb3I7XG4gIH1cblxuICBpZiAoIWNvbmRpdGlvbikge1xuICAgIHRocm93IG5ldyBFcnIobWVzc2FnZSk7XG4gIH1cbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5981\n')},2393:function(__unused_webpack_module,exports){"use strict";eval('var __webpack_unused_export__;\n\n\n__webpack_unused_export__ = true;\n\nvar _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\nvar getLocation = function getLocation(source) {\n var _source$location = source.location,\n search = _source$location.search,\n hash = _source$location.hash,\n href = _source$location.href,\n origin = _source$location.origin,\n protocol = _source$location.protocol,\n host = _source$location.host,\n hostname = _source$location.hostname,\n port = _source$location.port;\n var pathname = source.location.pathname;\n\n if (!pathname && href && canUseDOM) {\n var url = new URL(href);\n pathname = url.pathname;\n }\n\n return {\n pathname: encodeURI(decodeURI(pathname)),\n search: search,\n hash: hash,\n href: href,\n origin: origin,\n protocol: protocol,\n host: host,\n hostname: hostname,\n port: port,\n state: source.history.state,\n key: source.history.state && source.history.state.key || "initial"\n };\n};\n\nvar createHistory = function createHistory(source, options) {\n var listeners = [];\n var location = getLocation(source);\n var transitioning = false;\n\n var resolveTransition = function resolveTransition() {};\n\n return {\n get location() {\n return location;\n },\n\n get transitioning() {\n return transitioning;\n },\n\n _onTransitionComplete: function _onTransitionComplete() {\n transitioning = false;\n resolveTransition();\n },\n listen: function listen(listener) {\n listeners.push(listener);\n\n var popstateListener = function popstateListener() {\n location = getLocation(source);\n listener({\n location: location,\n action: "POP"\n });\n };\n\n source.addEventListener("popstate", popstateListener);\n return function () {\n source.removeEventListener("popstate", popstateListener);\n listeners = listeners.filter(function (fn) {\n return fn !== listener;\n });\n };\n },\n navigate: function navigate(to) {\n var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n state = _ref.state,\n _ref$replace = _ref.replace,\n replace = _ref$replace === undefined ? false : _ref$replace;\n\n if (typeof to === "number") {\n source.history.go(to);\n } else {\n state = _extends({}, state, {\n key: Date.now() + ""\n }); // try...catch iOS Safari limits to 100 pushState calls\n\n try {\n if (transitioning || replace) {\n source.history.replaceState(state, null, to);\n } else {\n source.history.pushState(state, null, to);\n }\n } catch (e) {\n source.location[replace ? "replace" : "assign"](to);\n }\n }\n\n location = getLocation(source);\n transitioning = true;\n var transition = new Promise(function (res) {\n return resolveTransition = res;\n });\n listeners.forEach(function (listener) {\n return listener({\n location: location,\n action: "PUSH"\n });\n });\n return transition;\n }\n };\n}; ////////////////////////////////////////////////////////////////////////////////\n// Stores history entries in memory for testing or other platforms like Native\n\n\nvar createMemorySource = function createMemorySource() {\n var initialPath = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "/";\n var searchIndex = initialPath.indexOf("?");\n var initialLocation = {\n pathname: searchIndex > -1 ? initialPath.substr(0, searchIndex) : initialPath,\n search: searchIndex > -1 ? initialPath.substr(searchIndex) : ""\n };\n var index = 0;\n var stack = [initialLocation];\n var states = [null];\n return {\n get location() {\n return stack[index];\n },\n\n addEventListener: function addEventListener(name, fn) {},\n removeEventListener: function removeEventListener(name, fn) {},\n history: {\n get entries() {\n return stack;\n },\n\n get index() {\n return index;\n },\n\n get state() {\n return states[index];\n },\n\n pushState: function pushState(state, _, uri) {\n var _uri$split = uri.split("?"),\n pathname = _uri$split[0],\n _uri$split$ = _uri$split[1],\n search = _uri$split$ === undefined ? "" : _uri$split$;\n\n index++;\n stack.push({\n pathname: pathname,\n search: search.length ? "?" + search : search\n });\n states.push(state);\n },\n replaceState: function replaceState(state, _, uri) {\n var _uri$split2 = uri.split("?"),\n pathname = _uri$split2[0],\n _uri$split2$ = _uri$split2[1],\n search = _uri$split2$ === undefined ? "" : _uri$split2$;\n\n stack[index] = {\n pathname: pathname,\n search: search\n };\n states[index] = state;\n },\n go: function go(to) {\n var newIndex = index + to;\n\n if (newIndex < 0 || newIndex > states.length - 1) {\n return;\n }\n\n index = newIndex;\n }\n }\n };\n}; ////////////////////////////////////////////////////////////////////////////////\n// global history - uses window.history as the source if available, otherwise a\n// memory history\n\n\nvar canUseDOM = !!(typeof window !== "undefined" && window.document && window.document.createElement);\n\nvar getSource = function getSource() {\n return canUseDOM ? window : createMemorySource();\n};\n\nvar globalHistory = createHistory(getSource());\nvar navigate = globalHistory.navigate; ////////////////////////////////////////////////////////////////////////////////\n\nexports.V5 = globalHistory;\n__webpack_unused_export__ = navigate;\n__webpack_unused_export__ = createHistory;\n__webpack_unused_export__ = createMemorySource;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZ2F0c2J5anMvcmVhY2gtcm91dGVyL2xpYi9oaXN0b3J5LmpzPzZiMDgiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFhOztBQUViLHlCQUFrQjs7QUFFbEI7QUFDQSxpQkFBaUIsc0JBQXNCO0FBQ3ZDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDtBQUNBLHVGQUF1RjtBQUN2RjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUCwyQkFBMkI7QUFDM0I7QUFDQSxTQUFTLEVBQUU7O0FBRVg7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTCw0REFBNEQ7QUFDNUQsa0VBQWtFO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0NBQXNDOztBQUV0QyxVQUFxQjtBQUNyQix5QkFBZ0I7QUFDaEIseUJBQXFCO0FBQ3JCLHlCQUEwQiIsImZpbGUiOiIyMzkzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59O1xuXG52YXIgZ2V0TG9jYXRpb24gPSBmdW5jdGlvbiBnZXRMb2NhdGlvbihzb3VyY2UpIHtcbiAgdmFyIF9zb3VyY2UkbG9jYXRpb24gPSBzb3VyY2UubG9jYXRpb24sXG4gICAgICBzZWFyY2ggPSBfc291cmNlJGxvY2F0aW9uLnNlYXJjaCxcbiAgICAgIGhhc2ggPSBfc291cmNlJGxvY2F0aW9uLmhhc2gsXG4gICAgICBocmVmID0gX3NvdXJjZSRsb2NhdGlvbi5ocmVmLFxuICAgICAgb3JpZ2luID0gX3NvdXJjZSRsb2NhdGlvbi5vcmlnaW4sXG4gICAgICBwcm90b2NvbCA9IF9zb3VyY2UkbG9jYXRpb24ucHJvdG9jb2wsXG4gICAgICBob3N0ID0gX3NvdXJjZSRsb2NhdGlvbi5ob3N0LFxuICAgICAgaG9zdG5hbWUgPSBfc291cmNlJGxvY2F0aW9uLmhvc3RuYW1lLFxuICAgICAgcG9ydCA9IF9zb3VyY2UkbG9jYXRpb24ucG9ydDtcbiAgdmFyIHBhdGhuYW1lID0gc291cmNlLmxvY2F0aW9uLnBhdGhuYW1lO1xuXG4gIGlmICghcGF0aG5hbWUgJiYgaHJlZiAmJiBjYW5Vc2VET00pIHtcbiAgICB2YXIgdXJsID0gbmV3IFVSTChocmVmKTtcbiAgICBwYXRobmFtZSA9IHVybC5wYXRobmFtZTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcGF0aG5hbWU6IGVuY29kZVVSSShkZWNvZGVVUkkocGF0aG5hbWUpKSxcbiAgICBzZWFyY2g6IHNlYXJjaCxcbiAgICBoYXNoOiBoYXNoLFxuICAgIGhyZWY6IGhyZWYsXG4gICAgb3JpZ2luOiBvcmlnaW4sXG4gICAgcHJvdG9jb2w6IHByb3RvY29sLFxuICAgIGhvc3Q6IGhvc3QsXG4gICAgaG9zdG5hbWU6IGhvc3RuYW1lLFxuICAgIHBvcnQ6IHBvcnQsXG4gICAgc3RhdGU6IHNvdXJjZS5oaXN0b3J5LnN0YXRlLFxuICAgIGtleTogc291cmNlLmhpc3Rvcnkuc3RhdGUgJiYgc291cmNlLmhpc3Rvcnkuc3RhdGUua2V5IHx8IFwiaW5pdGlhbFwiXG4gIH07XG59O1xuXG52YXIgY3JlYXRlSGlzdG9yeSA9IGZ1bmN0aW9uIGNyZWF0ZUhpc3Rvcnkoc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBsaXN0ZW5lcnMgPSBbXTtcbiAgdmFyIGxvY2F0aW9uID0gZ2V0TG9jYXRpb24oc291cmNlKTtcbiAgdmFyIHRyYW5zaXRpb25pbmcgPSBmYWxzZTtcblxuICB2YXIgcmVzb2x2ZVRyYW5zaXRpb24gPSBmdW5jdGlvbiByZXNvbHZlVHJhbnNpdGlvbigpIHt9O1xuXG4gIHJldHVybiB7XG4gICAgZ2V0IGxvY2F0aW9uKCkge1xuICAgICAgcmV0dXJuIGxvY2F0aW9uO1xuICAgIH0sXG5cbiAgICBnZXQgdHJhbnNpdGlvbmluZygpIHtcbiAgICAgIHJldHVybiB0cmFuc2l0aW9uaW5nO1xuICAgIH0sXG5cbiAgICBfb25UcmFuc2l0aW9uQ29tcGxldGU6IGZ1bmN0aW9uIF9vblRyYW5zaXRpb25Db21wbGV0ZSgpIHtcbiAgICAgIHRyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgICAgIHJlc29sdmVUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICBsaXN0ZW46IGZ1bmN0aW9uIGxpc3RlbihsaXN0ZW5lcikge1xuICAgICAgbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuXG4gICAgICB2YXIgcG9wc3RhdGVMaXN0ZW5lciA9IGZ1bmN0aW9uIHBvcHN0YXRlTGlzdGVuZXIoKSB7XG4gICAgICAgIGxvY2F0aW9uID0gZ2V0TG9jYXRpb24oc291cmNlKTtcbiAgICAgICAgbGlzdGVuZXIoe1xuICAgICAgICAgIGxvY2F0aW9uOiBsb2NhdGlvbixcbiAgICAgICAgICBhY3Rpb246IFwiUE9QXCJcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBzb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcihcInBvcHN0YXRlXCIsIHBvcHN0YXRlTGlzdGVuZXIpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc291cmNlLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb3BzdGF0ZVwiLCBwb3BzdGF0ZUxpc3RlbmVyKTtcbiAgICAgICAgbGlzdGVuZXJzID0gbGlzdGVuZXJzLmZpbHRlcihmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgICByZXR1cm4gZm4gIT09IGxpc3RlbmVyO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfSxcbiAgICBuYXZpZ2F0ZTogZnVuY3Rpb24gbmF2aWdhdGUodG8pIHtcbiAgICAgIHZhciBfcmVmID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fSxcbiAgICAgICAgICBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICAgICAgX3JlZiRyZXBsYWNlID0gX3JlZi5yZXBsYWNlLFxuICAgICAgICAgIHJlcGxhY2UgPSBfcmVmJHJlcGxhY2UgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogX3JlZiRyZXBsYWNlO1xuXG4gICAgICBpZiAodHlwZW9mIHRvID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHNvdXJjZS5oaXN0b3J5LmdvKHRvKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlID0gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgICAga2V5OiBEYXRlLm5vdygpICsgXCJcIlxuICAgICAgICB9KTsgLy8gdHJ5Li4uY2F0Y2ggaU9TIFNhZmFyaSBsaW1pdHMgdG8gMTAwIHB1c2hTdGF0ZSBjYWxsc1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKHRyYW5zaXRpb25pbmcgfHwgcmVwbGFjZSkge1xuICAgICAgICAgICAgc291cmNlLmhpc3RvcnkucmVwbGFjZVN0YXRlKHN0YXRlLCBudWxsLCB0byk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNvdXJjZS5oaXN0b3J5LnB1c2hTdGF0ZShzdGF0ZSwgbnVsbCwgdG8pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHNvdXJjZS5sb2NhdGlvbltyZXBsYWNlID8gXCJyZXBsYWNlXCIgOiBcImFzc2lnblwiXSh0byk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbG9jYXRpb24gPSBnZXRMb2NhdGlvbihzb3VyY2UpO1xuICAgICAgdHJhbnNpdGlvbmluZyA9IHRydWU7XG4gICAgICB2YXIgdHJhbnNpdGlvbiA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVUcmFuc2l0aW9uID0gcmVzO1xuICAgICAgfSk7XG4gICAgICBsaXN0ZW5lcnMuZm9yRWFjaChmdW5jdGlvbiAobGlzdGVuZXIpIHtcbiAgICAgICAgcmV0dXJuIGxpc3RlbmVyKHtcbiAgICAgICAgICBsb2NhdGlvbjogbG9jYXRpb24sXG4gICAgICAgICAgYWN0aW9uOiBcIlBVU0hcIlxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRyYW5zaXRpb247XG4gICAgfVxuICB9O1xufTsgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFN0b3JlcyBoaXN0b3J5IGVudHJpZXMgaW4gbWVtb3J5IGZvciB0ZXN0aW5nIG9yIG90aGVyIHBsYXRmb3JtcyBsaWtlIE5hdGl2ZVxuXG5cbnZhciBjcmVhdGVNZW1vcnlTb3VyY2UgPSBmdW5jdGlvbiBjcmVhdGVNZW1vcnlTb3VyY2UoKSB7XG4gIHZhciBpbml0aWFsUGF0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogXCIvXCI7XG4gIHZhciBzZWFyY2hJbmRleCA9IGluaXRpYWxQYXRoLmluZGV4T2YoXCI/XCIpO1xuICB2YXIgaW5pdGlhbExvY2F0aW9uID0ge1xuICAgIHBhdGhuYW1lOiBzZWFyY2hJbmRleCA+IC0xID8gaW5pdGlhbFBhdGguc3Vic3RyKDAsIHNlYXJjaEluZGV4KSA6IGluaXRpYWxQYXRoLFxuICAgIHNlYXJjaDogc2VhcmNoSW5kZXggPiAtMSA/IGluaXRpYWxQYXRoLnN1YnN0cihzZWFyY2hJbmRleCkgOiBcIlwiXG4gIH07XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBzdGFjayA9IFtpbml0aWFsTG9jYXRpb25dO1xuICB2YXIgc3RhdGVzID0gW251bGxdO1xuICByZXR1cm4ge1xuICAgIGdldCBsb2NhdGlvbigpIHtcbiAgICAgIHJldHVybiBzdGFja1tpbmRleF07XG4gICAgfSxcblxuICAgIGFkZEV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIobmFtZSwgZm4pIHt9LFxuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgZm4pIHt9LFxuICAgIGhpc3Rvcnk6IHtcbiAgICAgIGdldCBlbnRyaWVzKCkge1xuICAgICAgICByZXR1cm4gc3RhY2s7XG4gICAgICB9LFxuXG4gICAgICBnZXQgaW5kZXgoKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgIH0sXG5cbiAgICAgIGdldCBzdGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlc1tpbmRleF07XG4gICAgICB9LFxuXG4gICAgICBwdXNoU3RhdGU6IGZ1bmN0aW9uIHB1c2hTdGF0ZShzdGF0ZSwgXywgdXJpKSB7XG4gICAgICAgIHZhciBfdXJpJHNwbGl0ID0gdXJpLnNwbGl0KFwiP1wiKSxcbiAgICAgICAgICAgIHBhdGhuYW1lID0gX3VyaSRzcGxpdFswXSxcbiAgICAgICAgICAgIF91cmkkc3BsaXQkID0gX3VyaSRzcGxpdFsxXSxcbiAgICAgICAgICAgIHNlYXJjaCA9IF91cmkkc3BsaXQkID09PSB1bmRlZmluZWQgPyBcIlwiIDogX3VyaSRzcGxpdCQ7XG5cbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgICAgcGF0aG5hbWU6IHBhdGhuYW1lLFxuICAgICAgICAgIHNlYXJjaDogc2VhcmNoLmxlbmd0aCA/IFwiP1wiICsgc2VhcmNoIDogc2VhcmNoXG4gICAgICAgIH0pO1xuICAgICAgICBzdGF0ZXMucHVzaChzdGF0ZSk7XG4gICAgICB9LFxuICAgICAgcmVwbGFjZVN0YXRlOiBmdW5jdGlvbiByZXBsYWNlU3RhdGUoc3RhdGUsIF8sIHVyaSkge1xuICAgICAgICB2YXIgX3VyaSRzcGxpdDIgPSB1cmkuc3BsaXQoXCI/XCIpLFxuICAgICAgICAgICAgcGF0aG5hbWUgPSBfdXJpJHNwbGl0MlswXSxcbiAgICAgICAgICAgIF91cmkkc3BsaXQyJCA9IF91cmkkc3BsaXQyWzFdLFxuICAgICAgICAgICAgc2VhcmNoID0gX3VyaSRzcGxpdDIkID09PSB1bmRlZmluZWQgPyBcIlwiIDogX3VyaSRzcGxpdDIkO1xuXG4gICAgICAgIHN0YWNrW2luZGV4XSA9IHtcbiAgICAgICAgICBwYXRobmFtZTogcGF0aG5hbWUsXG4gICAgICAgICAgc2VhcmNoOiBzZWFyY2hcbiAgICAgICAgfTtcbiAgICAgICAgc3RhdGVzW2luZGV4XSA9IHN0YXRlO1xuICAgICAgfSxcbiAgICAgIGdvOiBmdW5jdGlvbiBnbyh0bykge1xuICAgICAgICB2YXIgbmV3SW5kZXggPSBpbmRleCArIHRvO1xuXG4gICAgICAgIGlmIChuZXdJbmRleCA8IDAgfHwgbmV3SW5kZXggPiBzdGF0ZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGluZGV4ID0gbmV3SW5kZXg7XG4gICAgICB9XG4gICAgfVxuICB9O1xufTsgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIGdsb2JhbCBoaXN0b3J5IC0gdXNlcyB3aW5kb3cuaGlzdG9yeSBhcyB0aGUgc291cmNlIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGFcbi8vIG1lbW9yeSBoaXN0b3J5XG5cblxudmFyIGNhblVzZURPTSA9ICEhKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93LmRvY3VtZW50ICYmIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcblxudmFyIGdldFNvdXJjZSA9IGZ1bmN0aW9uIGdldFNvdXJjZSgpIHtcbiAgcmV0dXJuIGNhblVzZURPTSA/IHdpbmRvdyA6IGNyZWF0ZU1lbW9yeVNvdXJjZSgpO1xufTtcblxudmFyIGdsb2JhbEhpc3RvcnkgPSBjcmVhdGVIaXN0b3J5KGdldFNvdXJjZSgpKTtcbnZhciBuYXZpZ2F0ZSA9IGdsb2JhbEhpc3RvcnkubmF2aWdhdGU7IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbmV4cG9ydHMuZ2xvYmFsSGlzdG9yeSA9IGdsb2JhbEhpc3Rvcnk7XG5leHBvcnRzLm5hdmlnYXRlID0gbmF2aWdhdGU7XG5leHBvcnRzLmNyZWF0ZUhpc3RvcnkgPSBjcmVhdGVIaXN0b3J5O1xuZXhwb3J0cy5jcmVhdGVNZW1vcnlTb3VyY2UgPSBjcmVhdGVNZW1vcnlTb3VyY2U7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///2393\n')},2098:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('\n\nexports.__esModule = true;\nexports.shallowCompare = exports.validateRedirect = exports.insertParams = exports.resolve = exports.match = exports.pick = exports.startsWith = undefined;\n\nvar _invariant = __webpack_require__(1143);\n\nvar _invariant2 = _interopRequireDefault(_invariant);\n\nfunction _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n default: obj\n };\n} ////////////////////////////////////////////////////////////////////////////////\n// startsWith(string, search) - Check if `string` starts with `search`\n\n\nvar startsWith = function startsWith(string, search) {\n return string.substr(0, search.length) === search;\n}; ////////////////////////////////////////////////////////////////////////////////\n// pick(routes, uri)\n//\n// Ranks and picks the best route to match. Each segment gets the highest\n// amount of points, then the type of segment gets an additional amount of\n// points where\n//\n// static > dynamic > splat > root\n//\n// This way we don\'t have to worry about the order of our routes, let the\n// computers do it.\n//\n// A route looks like this\n//\n// { path, default, value }\n//\n// And a returned match looks like:\n//\n// { route, params, uri }\n//\n// I know, I should use TypeScript not comments for these types.\n\n\nvar pick = function pick(routes, uri) {\n var match = void 0;\n var default_ = void 0;\n\n var _uri$split = uri.split("?"),\n uriPathname = _uri$split[0];\n\n var uriSegments = segmentize(uriPathname);\n var isRootUri = uriSegments[0] === "";\n var ranked = rankRoutes(routes);\n\n for (var i = 0, l = ranked.length; i < l; i++) {\n var missed = false;\n var route = ranked[i].route;\n\n if (route.default) {\n default_ = {\n route: route,\n params: {},\n uri: uri\n };\n continue;\n }\n\n var routeSegments = segmentize(route.path);\n var params = {};\n var max = Math.max(uriSegments.length, routeSegments.length);\n var index = 0;\n\n for (; index < max; index++) {\n var routeSegment = routeSegments[index];\n var uriSegment = uriSegments[index];\n\n if (isSplat(routeSegment)) {\n // Hit a splat, just grab the rest, and return a match\n // uri: /files/documents/work\n // route: /files/*\n var param = routeSegment.slice(1) || "*";\n params[param] = uriSegments.slice(index).map(decodeURIComponent).join("/");\n break;\n }\n\n if (uriSegment === undefined) {\n // URI is shorter than the route, no match\n // uri: /users\n // route: /users/:userId\n missed = true;\n break;\n }\n\n var dynamicMatch = paramRe.exec(routeSegment);\n\n if (dynamicMatch && !isRootUri) {\n var matchIsNotReserved = reservedNames.indexOf(dynamicMatch[1]) === -1;\n !matchIsNotReserved ? false ? 0 : (0, _invariant2.default)(false) : void 0;\n var value = decodeURIComponent(uriSegment);\n params[dynamicMatch[1]] = value;\n } else if (routeSegment !== uriSegment) {\n // Current segments don\'t match, not dynamic, not splat, so no match\n // uri: /users/123/settings\n // route: /users/:id/profile\n missed = true;\n break;\n }\n }\n\n if (!missed) {\n match = {\n route: route,\n params: params,\n uri: "/" + uriSegments.slice(0, index).join("/")\n };\n break;\n }\n }\n\n return match || default_ || null;\n}; ////////////////////////////////////////////////////////////////////////////////\n// match(path, uri) - Matches just one path to a uri, also lol\n\n\nvar match = function match(path, uri) {\n return pick([{\n path: path\n }], uri);\n}; ////////////////////////////////////////////////////////////////////////////////\n// resolve(to, basepath)\n//\n// Resolves URIs as though every path is a directory, no files. Relative URIs\n// in the browser can feel awkward because not only can you be "in a directory"\n// you can be "at a file", too. For example\n//\n// browserSpecResolve(\'foo\', \'/bar/\') => /bar/foo\n// browserSpecResolve(\'foo\', \'/bar\') => /foo\n//\n// But on the command line of a file system, it\'s not as complicated, you can\'t\n// `cd` from a file, only directories. This way, links have to know less about\n// their current path. To go deeper you can do this:\n//\n// \n// // instead of\n// \n//\n// Just like `cd`, if you want to go deeper from the command line, you do this:\n//\n// cd deeper\n// # not\n// cd $(pwd)/deeper\n//\n// By treating every path as a directory, linking to relative paths should\n// require less contextual information and (fingers crossed) be more intuitive.\n\n\nvar resolve = function resolve(to, base) {\n // /foo/bar, /baz/qux => /foo/bar\n if (startsWith(to, "/")) {\n return to;\n }\n\n var _to$split = to.split("?"),\n toPathname = _to$split[0],\n toQuery = _to$split[1];\n\n var _base$split = base.split("?"),\n basePathname = _base$split[0];\n\n var toSegments = segmentize(toPathname);\n var baseSegments = segmentize(basePathname); // ?a=b, /users?b=c => /users?a=b\n\n if (toSegments[0] === "") {\n return addQuery(basePathname, toQuery);\n } // profile, /users/789 => /users/789/profile\n\n\n if (!startsWith(toSegments[0], ".")) {\n var pathname = baseSegments.concat(toSegments).join("/");\n return addQuery((basePathname === "/" ? "" : "/") + pathname, toQuery);\n } // ./ /users/123 => /users/123\n // ../ /users/123 => /users\n // ../.. /users/123 => /\n // ../../one /a/b/c/d => /a/b/one\n // .././one /a/b/c/d => /a/b/c/one\n\n\n var allSegments = baseSegments.concat(toSegments);\n var segments = [];\n\n for (var i = 0, l = allSegments.length; i < l; i++) {\n var segment = allSegments[i];\n if (segment === "..") segments.pop();else if (segment !== ".") segments.push(segment);\n }\n\n return addQuery("/" + segments.join("/"), toQuery);\n}; ////////////////////////////////////////////////////////////////////////////////\n// insertParams(path, params)\n\n\nvar insertParams = function insertParams(path, params) {\n var _path$split = path.split("?"),\n pathBase = _path$split[0],\n _path$split$ = _path$split[1],\n query = _path$split$ === undefined ? "" : _path$split$;\n\n var segments = segmentize(pathBase);\n var constructedPath = "/" + segments.map(function (segment) {\n var match = paramRe.exec(segment);\n return match ? params[match[1]] : segment;\n }).join("/");\n var _params$location = params.location;\n _params$location = _params$location === undefined ? {} : _params$location;\n var _params$location$sear = _params$location.search,\n search = _params$location$sear === undefined ? "" : _params$location$sear;\n var searchSplit = search.split("?")[1] || "";\n constructedPath = addQuery(constructedPath, query, searchSplit);\n return constructedPath;\n};\n\nvar validateRedirect = function validateRedirect(from, to) {\n var filter = function filter(segment) {\n return isDynamic(segment);\n };\n\n var fromString = segmentize(from).filter(filter).sort().join("/");\n var toString = segmentize(to).filter(filter).sort().join("/");\n return fromString === toString;\n}; ////////////////////////////////////////////////////////////////////////////////\n// Junk\n\n\nvar paramRe = /^:(.+)/;\nvar SEGMENT_POINTS = 4;\nvar STATIC_POINTS = 3;\nvar DYNAMIC_POINTS = 2;\nvar SPLAT_PENALTY = 1;\nvar ROOT_POINTS = 1;\n\nvar isRootSegment = function isRootSegment(segment) {\n return segment === "";\n};\n\nvar isDynamic = function isDynamic(segment) {\n return paramRe.test(segment);\n};\n\nvar isSplat = function isSplat(segment) {\n return segment && segment[0] === "*";\n};\n\nvar rankRoute = function rankRoute(route, index) {\n var score = route.default ? 0 : segmentize(route.path).reduce(function (score, segment) {\n score += SEGMENT_POINTS;\n if (isRootSegment(segment)) score += ROOT_POINTS;else if (isDynamic(segment)) score += DYNAMIC_POINTS;else if (isSplat(segment)) score -= SEGMENT_POINTS + SPLAT_PENALTY;else score += STATIC_POINTS;\n return score;\n }, 0);\n return {\n route: route,\n score: score,\n index: index\n };\n};\n\nvar rankRoutes = function rankRoutes(routes) {\n return routes.map(rankRoute).sort(function (a, b) {\n return a.score < b.score ? 1 : a.score > b.score ? -1 : a.index - b.index;\n });\n};\n\nvar segmentize = function segmentize(uri) {\n return uri // strip starting/ending slashes\n .replace(/(^\\/+|\\/+$)/g, "").split("/");\n};\n\nvar addQuery = function addQuery(pathname) {\n for (var _len = arguments.length, query = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n query[_key - 1] = arguments[_key];\n }\n\n query = query.filter(function (q) {\n return q && q.length > 0;\n });\n return pathname + (query && query.length > 0 ? "?" + query.join("&") : "");\n};\n\nvar reservedNames = ["uri", "path"];\n/**\n * Shallow compares two objects.\n * @param {Object} obj1 The first object to compare.\n * @param {Object} obj2 The second object to compare.\n */\n\nvar shallowCompare = function shallowCompare(obj1, obj2) {\n var obj1Keys = Object.keys(obj1);\n return obj1Keys.length === Object.keys(obj2).length && obj1Keys.every(function (key) {\n return obj2.hasOwnProperty(key) && obj1[key] === obj2[key];\n });\n}; ////////////////////////////////////////////////////////////////////////////////\n\n\nexports.startsWith = startsWith;\nexports.pick = pick;\nexports.match = match;\nexports.resolve = resolve;\nexports.insertParams = insertParams;\nexports.validateRedirect = validateRedirect;\nexports.shallowCompare = shallowCompare;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZ2F0c2J5anMvcmVhY2gtcm91dGVyL2xpYi91dGlscy5qcz9hNDIyIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViLGtCQUFrQjtBQUNsQixzQkFBc0IsR0FBRyx3QkFBd0IsR0FBRyxvQkFBb0IsR0FBRyxlQUFlLEdBQUcsYUFBYSxHQUFHLFlBQVksR0FBRyxrQkFBa0I7O0FBRTlJLGlCQUFpQixtQkFBTyxDQUFDLElBQVc7O0FBRXBDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOzs7QUFHQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsb0NBQW9DLE9BQU87QUFDM0M7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsVUFBVSxhQUFhO0FBQ3ZCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsOEJBQThCLE1BQXFDLEdBQUcsQ0FBdUs7QUFDN087QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFO0FBQ0Y7OztBQUdBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLEVBQUUsVUFBVSxRQUFRO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDhDQUE4Qzs7QUFFOUM7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQSx5Q0FBeUMsT0FBTztBQUNoRDtBQUNBLHlDQUF5QztBQUN6Qzs7QUFFQTtBQUNBLEVBQUU7QUFDRjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLHdEQUF3RDtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EscURBQXFELHFEQUFxRCxtRUFBbUU7QUFDN0s7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHFGQUFxRixhQUFhO0FBQ2xHO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsRUFBRTs7O0FBR0Ysa0JBQWtCO0FBQ2xCLFlBQVk7QUFDWixhQUFhO0FBQ2IsZUFBZTtBQUNmLG9CQUFvQjtBQUNwQix3QkFBd0I7QUFDeEIsc0JBQXNCIiwiZmlsZSI6IjIwOTguanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuc2hhbGxvd0NvbXBhcmUgPSBleHBvcnRzLnZhbGlkYXRlUmVkaXJlY3QgPSBleHBvcnRzLmluc2VydFBhcmFtcyA9IGV4cG9ydHMucmVzb2x2ZSA9IGV4cG9ydHMubWF0Y2ggPSBleHBvcnRzLnBpY2sgPSBleHBvcnRzLnN0YXJ0c1dpdGggPSB1bmRlZmluZWQ7XG5cbnZhciBfaW52YXJpYW50ID0gcmVxdWlyZShcImludmFyaWFudFwiKTtcblxudmFyIF9pbnZhcmlhbnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW52YXJpYW50KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHtcbiAgICBkZWZhdWx0OiBvYmpcbiAgfTtcbn0gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIHN0YXJ0c1dpdGgoc3RyaW5nLCBzZWFyY2gpIC0gQ2hlY2sgaWYgYHN0cmluZ2Agc3RhcnRzIHdpdGggYHNlYXJjaGBcblxuXG52YXIgc3RhcnRzV2l0aCA9IGZ1bmN0aW9uIHN0YXJ0c1dpdGgoc3RyaW5nLCBzZWFyY2gpIHtcbiAgcmV0dXJuIHN0cmluZy5zdWJzdHIoMCwgc2VhcmNoLmxlbmd0aCkgPT09IHNlYXJjaDtcbn07IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBwaWNrKHJvdXRlcywgdXJpKVxuLy9cbi8vIFJhbmtzIGFuZCBwaWNrcyB0aGUgYmVzdCByb3V0ZSB0byBtYXRjaC4gRWFjaCBzZWdtZW50IGdldHMgdGhlIGhpZ2hlc3Rcbi8vIGFtb3VudCBvZiBwb2ludHMsIHRoZW4gdGhlIHR5cGUgb2Ygc2VnbWVudCBnZXRzIGFuIGFkZGl0aW9uYWwgYW1vdW50IG9mXG4vLyBwb2ludHMgd2hlcmVcbi8vXG4vLyAgICAgc3RhdGljID4gZHluYW1pYyA+IHNwbGF0ID4gcm9vdFxuLy9cbi8vIFRoaXMgd2F5IHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhlIG9yZGVyIG9mIG91ciByb3V0ZXMsIGxldCB0aGVcbi8vIGNvbXB1dGVycyBkbyBpdC5cbi8vXG4vLyBBIHJvdXRlIGxvb2tzIGxpa2UgdGhpc1xuLy9cbi8vICAgICB7IHBhdGgsIGRlZmF1bHQsIHZhbHVlIH1cbi8vXG4vLyBBbmQgYSByZXR1cm5lZCBtYXRjaCBsb29rcyBsaWtlOlxuLy9cbi8vICAgICB7IHJvdXRlLCBwYXJhbXMsIHVyaSB9XG4vL1xuLy8gSSBrbm93LCBJIHNob3VsZCB1c2UgVHlwZVNjcmlwdCBub3QgY29tbWVudHMgZm9yIHRoZXNlIHR5cGVzLlxuXG5cbnZhciBwaWNrID0gZnVuY3Rpb24gcGljayhyb3V0ZXMsIHVyaSkge1xuICB2YXIgbWF0Y2ggPSB2b2lkIDA7XG4gIHZhciBkZWZhdWx0XyA9IHZvaWQgMDtcblxuICB2YXIgX3VyaSRzcGxpdCA9IHVyaS5zcGxpdChcIj9cIiksXG4gICAgICB1cmlQYXRobmFtZSA9IF91cmkkc3BsaXRbMF07XG5cbiAgdmFyIHVyaVNlZ21lbnRzID0gc2VnbWVudGl6ZSh1cmlQYXRobmFtZSk7XG4gIHZhciBpc1Jvb3RVcmkgPSB1cmlTZWdtZW50c1swXSA9PT0gXCJcIjtcbiAgdmFyIHJhbmtlZCA9IHJhbmtSb3V0ZXMocm91dGVzKTtcblxuICBmb3IgKHZhciBpID0gMCwgbCA9IHJhbmtlZC5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICB2YXIgbWlzc2VkID0gZmFsc2U7XG4gICAgdmFyIHJvdXRlID0gcmFua2VkW2ldLnJvdXRlO1xuXG4gICAgaWYgKHJvdXRlLmRlZmF1bHQpIHtcbiAgICAgIGRlZmF1bHRfID0ge1xuICAgICAgICByb3V0ZTogcm91dGUsXG4gICAgICAgIHBhcmFtczoge30sXG4gICAgICAgIHVyaTogdXJpXG4gICAgICB9O1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIHJvdXRlU2VnbWVudHMgPSBzZWdtZW50aXplKHJvdXRlLnBhdGgpO1xuICAgIHZhciBwYXJhbXMgPSB7fTtcbiAgICB2YXIgbWF4ID0gTWF0aC5tYXgodXJpU2VnbWVudHMubGVuZ3RoLCByb3V0ZVNlZ21lbnRzLmxlbmd0aCk7XG4gICAgdmFyIGluZGV4ID0gMDtcblxuICAgIGZvciAoOyBpbmRleCA8IG1heDsgaW5kZXgrKykge1xuICAgICAgdmFyIHJvdXRlU2VnbWVudCA9IHJvdXRlU2VnbWVudHNbaW5kZXhdO1xuICAgICAgdmFyIHVyaVNlZ21lbnQgPSB1cmlTZWdtZW50c1tpbmRleF07XG5cbiAgICAgIGlmIChpc1NwbGF0KHJvdXRlU2VnbWVudCkpIHtcbiAgICAgICAgLy8gSGl0IGEgc3BsYXQsIGp1c3QgZ3JhYiB0aGUgcmVzdCwgYW5kIHJldHVybiBhIG1hdGNoXG4gICAgICAgIC8vIHVyaTogICAvZmlsZXMvZG9jdW1lbnRzL3dvcmtcbiAgICAgICAgLy8gcm91dGU6IC9maWxlcy8qXG4gICAgICAgIHZhciBwYXJhbSA9IHJvdXRlU2VnbWVudC5zbGljZSgxKSB8fCBcIipcIjtcbiAgICAgICAgcGFyYW1zW3BhcmFtXSA9IHVyaVNlZ21lbnRzLnNsaWNlKGluZGV4KS5tYXAoZGVjb2RlVVJJQ29tcG9uZW50KS5qb2luKFwiL1wiKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmICh1cmlTZWdtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gVVJJIGlzIHNob3J0ZXIgdGhhbiB0aGUgcm91dGUsIG5vIG1hdGNoXG4gICAgICAgIC8vIHVyaTogICAvdXNlcnNcbiAgICAgICAgLy8gcm91dGU6IC91c2Vycy86dXNlcklkXG4gICAgICAgIG1pc3NlZCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICB2YXIgZHluYW1pY01hdGNoID0gcGFyYW1SZS5leGVjKHJvdXRlU2VnbWVudCk7XG5cbiAgICAgIGlmIChkeW5hbWljTWF0Y2ggJiYgIWlzUm9vdFVyaSkge1xuICAgICAgICB2YXIgbWF0Y2hJc05vdFJlc2VydmVkID0gcmVzZXJ2ZWROYW1lcy5pbmRleE9mKGR5bmFtaWNNYXRjaFsxXSkgPT09IC0xO1xuICAgICAgICAhbWF0Y2hJc05vdFJlc2VydmVkID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gKDAsIF9pbnZhcmlhbnQyLmRlZmF1bHQpKGZhbHNlLCBcIjxSb3V0ZXI+IGR5bmFtaWMgc2VnbWVudCBcXFwiXCIgKyBkeW5hbWljTWF0Y2hbMV0gKyBcIlxcXCIgaXMgYSByZXNlcnZlZCBuYW1lLiBQbGVhc2UgdXNlIGEgZGlmZmVyZW50IG5hbWUgaW4gcGF0aCBcXFwiXCIgKyByb3V0ZS5wYXRoICsgXCJcXFwiLlwiKSA6ICgwLCBfaW52YXJpYW50Mi5kZWZhdWx0KShmYWxzZSkgOiB2b2lkIDA7XG4gICAgICAgIHZhciB2YWx1ZSA9IGRlY29kZVVSSUNvbXBvbmVudCh1cmlTZWdtZW50KTtcbiAgICAgICAgcGFyYW1zW2R5bmFtaWNNYXRjaFsxXV0gPSB2YWx1ZTtcbiAgICAgIH0gZWxzZSBpZiAocm91dGVTZWdtZW50ICE9PSB1cmlTZWdtZW50KSB7XG4gICAgICAgIC8vIEN1cnJlbnQgc2VnbWVudHMgZG9uJ3QgbWF0Y2gsIG5vdCBkeW5hbWljLCBub3Qgc3BsYXQsIHNvIG5vIG1hdGNoXG4gICAgICAgIC8vIHVyaTogICAvdXNlcnMvMTIzL3NldHRpbmdzXG4gICAgICAgIC8vIHJvdXRlOiAvdXNlcnMvOmlkL3Byb2ZpbGVcbiAgICAgICAgbWlzc2VkID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFtaXNzZWQpIHtcbiAgICAgIG1hdGNoID0ge1xuICAgICAgICByb3V0ZTogcm91dGUsXG4gICAgICAgIHBhcmFtczogcGFyYW1zLFxuICAgICAgICB1cmk6IFwiL1wiICsgdXJpU2VnbWVudHMuc2xpY2UoMCwgaW5kZXgpLmpvaW4oXCIvXCIpXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1hdGNoIHx8IGRlZmF1bHRfIHx8IG51bGw7XG59OyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gbWF0Y2gocGF0aCwgdXJpKSAtIE1hdGNoZXMganVzdCBvbmUgcGF0aCB0byBhIHVyaSwgYWxzbyBsb2xcblxuXG52YXIgbWF0Y2ggPSBmdW5jdGlvbiBtYXRjaChwYXRoLCB1cmkpIHtcbiAgcmV0dXJuIHBpY2soW3tcbiAgICBwYXRoOiBwYXRoXG4gIH1dLCB1cmkpO1xufTsgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIHJlc29sdmUodG8sIGJhc2VwYXRoKVxuLy9cbi8vIFJlc29sdmVzIFVSSXMgYXMgdGhvdWdoIGV2ZXJ5IHBhdGggaXMgYSBkaXJlY3RvcnksIG5vIGZpbGVzLiAgUmVsYXRpdmUgVVJJc1xuLy8gaW4gdGhlIGJyb3dzZXIgY2FuIGZlZWwgYXdrd2FyZCBiZWNhdXNlIG5vdCBvbmx5IGNhbiB5b3UgYmUgXCJpbiBhIGRpcmVjdG9yeVwiXG4vLyB5b3UgY2FuIGJlIFwiYXQgYSBmaWxlXCIsIHRvby4gRm9yIGV4YW1wbGVcbi8vXG4vLyAgICAgYnJvd3NlclNwZWNSZXNvbHZlKCdmb28nLCAnL2Jhci8nKSA9PiAvYmFyL2Zvb1xuLy8gICAgIGJyb3dzZXJTcGVjUmVzb2x2ZSgnZm9vJywgJy9iYXInKSA9PiAvZm9vXG4vL1xuLy8gQnV0IG9uIHRoZSBjb21tYW5kIGxpbmUgb2YgYSBmaWxlIHN5c3RlbSwgaXQncyBub3QgYXMgY29tcGxpY2F0ZWQsIHlvdSBjYW4ndFxuLy8gYGNkYCBmcm9tIGEgZmlsZSwgb25seSBkaXJlY3Rvcmllcy4gIFRoaXMgd2F5LCBsaW5rcyBoYXZlIHRvIGtub3cgbGVzcyBhYm91dFxuLy8gdGhlaXIgY3VycmVudCBwYXRoLiBUbyBnbyBkZWVwZXIgeW91IGNhbiBkbyB0aGlzOlxuLy9cbi8vICAgICA8TGluayB0bz1cImRlZXBlclwiLz5cbi8vICAgICAvLyBpbnN0ZWFkIG9mXG4vLyAgICAgPExpbmsgdG89YHske3Byb3BzLnVyaX0vZGVlcGVyfWAvPlxuLy9cbi8vIEp1c3QgbGlrZSBgY2RgLCBpZiB5b3Ugd2FudCB0byBnbyBkZWVwZXIgZnJvbSB0aGUgY29tbWFuZCBsaW5lLCB5b3UgZG8gdGhpczpcbi8vXG4vLyAgICAgY2QgZGVlcGVyXG4vLyAgICAgIyBub3Rcbi8vICAgICBjZCAkKHB3ZCkvZGVlcGVyXG4vL1xuLy8gQnkgdHJlYXRpbmcgZXZlcnkgcGF0aCBhcyBhIGRpcmVjdG9yeSwgbGlua2luZyB0byByZWxhdGl2ZSBwYXRocyBzaG91bGRcbi8vIHJlcXVpcmUgbGVzcyBjb250ZXh0dWFsIGluZm9ybWF0aW9uIGFuZCAoZmluZ2VycyBjcm9zc2VkKSBiZSBtb3JlIGludHVpdGl2ZS5cblxuXG52YXIgcmVzb2x2ZSA9IGZ1bmN0aW9uIHJlc29sdmUodG8sIGJhc2UpIHtcbiAgLy8gL2Zvby9iYXIsIC9iYXovcXV4ID0+IC9mb28vYmFyXG4gIGlmIChzdGFydHNXaXRoKHRvLCBcIi9cIikpIHtcbiAgICByZXR1cm4gdG87XG4gIH1cblxuICB2YXIgX3RvJHNwbGl0ID0gdG8uc3BsaXQoXCI/XCIpLFxuICAgICAgdG9QYXRobmFtZSA9IF90byRzcGxpdFswXSxcbiAgICAgIHRvUXVlcnkgPSBfdG8kc3BsaXRbMV07XG5cbiAgdmFyIF9iYXNlJHNwbGl0ID0gYmFzZS5zcGxpdChcIj9cIiksXG4gICAgICBiYXNlUGF0aG5hbWUgPSBfYmFzZSRzcGxpdFswXTtcblxuICB2YXIgdG9TZWdtZW50cyA9IHNlZ21lbnRpemUodG9QYXRobmFtZSk7XG4gIHZhciBiYXNlU2VnbWVudHMgPSBzZWdtZW50aXplKGJhc2VQYXRobmFtZSk7IC8vID9hPWIsIC91c2Vycz9iPWMgPT4gL3VzZXJzP2E9YlxuXG4gIGlmICh0b1NlZ21lbnRzWzBdID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIGFkZFF1ZXJ5KGJhc2VQYXRobmFtZSwgdG9RdWVyeSk7XG4gIH0gLy8gcHJvZmlsZSwgL3VzZXJzLzc4OSA9PiAvdXNlcnMvNzg5L3Byb2ZpbGVcblxuXG4gIGlmICghc3RhcnRzV2l0aCh0b1NlZ21lbnRzWzBdLCBcIi5cIikpIHtcbiAgICB2YXIgcGF0aG5hbWUgPSBiYXNlU2VnbWVudHMuY29uY2F0KHRvU2VnbWVudHMpLmpvaW4oXCIvXCIpO1xuICAgIHJldHVybiBhZGRRdWVyeSgoYmFzZVBhdGhuYW1lID09PSBcIi9cIiA/IFwiXCIgOiBcIi9cIikgKyBwYXRobmFtZSwgdG9RdWVyeSk7XG4gIH0gLy8gLi8gICAgICAgICAvdXNlcnMvMTIzICA9PiAgL3VzZXJzLzEyM1xuICAvLyAuLi8gICAgICAgIC91c2Vycy8xMjMgID0+ICAvdXNlcnNcbiAgLy8gLi4vLi4gICAgICAvdXNlcnMvMTIzICA9PiAgL1xuICAvLyAuLi8uLi9vbmUgIC9hL2IvYy9kICAgID0+ICAvYS9iL29uZVxuICAvLyAuLi8uL29uZSAgIC9hL2IvYy9kICAgID0+ICAvYS9iL2Mvb25lXG5cblxuICB2YXIgYWxsU2VnbWVudHMgPSBiYXNlU2VnbWVudHMuY29uY2F0KHRvU2VnbWVudHMpO1xuICB2YXIgc2VnbWVudHMgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMCwgbCA9IGFsbFNlZ21lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIHZhciBzZWdtZW50ID0gYWxsU2VnbWVudHNbaV07XG4gICAgaWYgKHNlZ21lbnQgPT09IFwiLi5cIikgc2VnbWVudHMucG9wKCk7ZWxzZSBpZiAoc2VnbWVudCAhPT0gXCIuXCIpIHNlZ21lbnRzLnB1c2goc2VnbWVudCk7XG4gIH1cblxuICByZXR1cm4gYWRkUXVlcnkoXCIvXCIgKyBzZWdtZW50cy5qb2luKFwiL1wiKSwgdG9RdWVyeSk7XG59OyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gaW5zZXJ0UGFyYW1zKHBhdGgsIHBhcmFtcylcblxuXG52YXIgaW5zZXJ0UGFyYW1zID0gZnVuY3Rpb24gaW5zZXJ0UGFyYW1zKHBhdGgsIHBhcmFtcykge1xuICB2YXIgX3BhdGgkc3BsaXQgPSBwYXRoLnNwbGl0KFwiP1wiKSxcbiAgICAgIHBhdGhCYXNlID0gX3BhdGgkc3BsaXRbMF0sXG4gICAgICBfcGF0aCRzcGxpdCQgPSBfcGF0aCRzcGxpdFsxXSxcbiAgICAgIHF1ZXJ5ID0gX3BhdGgkc3BsaXQkID09PSB1bmRlZmluZWQgPyBcIlwiIDogX3BhdGgkc3BsaXQkO1xuXG4gIHZhciBzZWdtZW50cyA9IHNlZ21lbnRpemUocGF0aEJhc2UpO1xuICB2YXIgY29uc3RydWN0ZWRQYXRoID0gXCIvXCIgKyBzZWdtZW50cy5tYXAoZnVuY3Rpb24gKHNlZ21lbnQpIHtcbiAgICB2YXIgbWF0Y2ggPSBwYXJhbVJlLmV4ZWMoc2VnbWVudCk7XG4gICAgcmV0dXJuIG1hdGNoID8gcGFyYW1zW21hdGNoWzFdXSA6IHNlZ21lbnQ7XG4gIH0pLmpvaW4oXCIvXCIpO1xuICB2YXIgX3BhcmFtcyRsb2NhdGlvbiA9IHBhcmFtcy5sb2NhdGlvbjtcbiAgX3BhcmFtcyRsb2NhdGlvbiA9IF9wYXJhbXMkbG9jYXRpb24gPT09IHVuZGVmaW5lZCA/IHt9IDogX3BhcmFtcyRsb2NhdGlvbjtcbiAgdmFyIF9wYXJhbXMkbG9jYXRpb24kc2VhciA9IF9wYXJhbXMkbG9jYXRpb24uc2VhcmNoLFxuICAgICAgc2VhcmNoID0gX3BhcmFtcyRsb2NhdGlvbiRzZWFyID09PSB1bmRlZmluZWQgPyBcIlwiIDogX3BhcmFtcyRsb2NhdGlvbiRzZWFyO1xuICB2YXIgc2VhcmNoU3BsaXQgPSBzZWFyY2guc3BsaXQoXCI/XCIpWzFdIHx8IFwiXCI7XG4gIGNvbnN0cnVjdGVkUGF0aCA9IGFkZFF1ZXJ5KGNvbnN0cnVjdGVkUGF0aCwgcXVlcnksIHNlYXJjaFNwbGl0KTtcbiAgcmV0dXJuIGNvbnN0cnVjdGVkUGF0aDtcbn07XG5cbnZhciB2YWxpZGF0ZVJlZGlyZWN0ID0gZnVuY3Rpb24gdmFsaWRhdGVSZWRpcmVjdChmcm9tLCB0bykge1xuICB2YXIgZmlsdGVyID0gZnVuY3Rpb24gZmlsdGVyKHNlZ21lbnQpIHtcbiAgICByZXR1cm4gaXNEeW5hbWljKHNlZ21lbnQpO1xuICB9O1xuXG4gIHZhciBmcm9tU3RyaW5nID0gc2VnbWVudGl6ZShmcm9tKS5maWx0ZXIoZmlsdGVyKS5zb3J0KCkuam9pbihcIi9cIik7XG4gIHZhciB0b1N0cmluZyA9IHNlZ21lbnRpemUodG8pLmZpbHRlcihmaWx0ZXIpLnNvcnQoKS5qb2luKFwiL1wiKTtcbiAgcmV0dXJuIGZyb21TdHJpbmcgPT09IHRvU3RyaW5nO1xufTsgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIEp1bmtcblxuXG52YXIgcGFyYW1SZSA9IC9eOiguKykvO1xudmFyIFNFR01FTlRfUE9JTlRTID0gNDtcbnZhciBTVEFUSUNfUE9JTlRTID0gMztcbnZhciBEWU5BTUlDX1BPSU5UUyA9IDI7XG52YXIgU1BMQVRfUEVOQUxUWSA9IDE7XG52YXIgUk9PVF9QT0lOVFMgPSAxO1xuXG52YXIgaXNSb290U2VnbWVudCA9IGZ1bmN0aW9uIGlzUm9vdFNlZ21lbnQoc2VnbWVudCkge1xuICByZXR1cm4gc2VnbWVudCA9PT0gXCJcIjtcbn07XG5cbnZhciBpc0R5bmFtaWMgPSBmdW5jdGlvbiBpc0R5bmFtaWMoc2VnbWVudCkge1xuICByZXR1cm4gcGFyYW1SZS50ZXN0KHNlZ21lbnQpO1xufTtcblxudmFyIGlzU3BsYXQgPSBmdW5jdGlvbiBpc1NwbGF0KHNlZ21lbnQpIHtcbiAgcmV0dXJuIHNlZ21lbnQgJiYgc2VnbWVudFswXSA9PT0gXCIqXCI7XG59O1xuXG52YXIgcmFua1JvdXRlID0gZnVuY3Rpb24gcmFua1JvdXRlKHJvdXRlLCBpbmRleCkge1xuICB2YXIgc2NvcmUgPSByb3V0ZS5kZWZhdWx0ID8gMCA6IHNlZ21lbnRpemUocm91dGUucGF0aCkucmVkdWNlKGZ1bmN0aW9uIChzY29yZSwgc2VnbWVudCkge1xuICAgIHNjb3JlICs9IFNFR01FTlRfUE9JTlRTO1xuICAgIGlmIChpc1Jvb3RTZWdtZW50KHNlZ21lbnQpKSBzY29yZSArPSBST09UX1BPSU5UUztlbHNlIGlmIChpc0R5bmFtaWMoc2VnbWVudCkpIHNjb3JlICs9IERZTkFNSUNfUE9JTlRTO2Vsc2UgaWYgKGlzU3BsYXQoc2VnbWVudCkpIHNjb3JlIC09IFNFR01FTlRfUE9JTlRTICsgU1BMQVRfUEVOQUxUWTtlbHNlIHNjb3JlICs9IFNUQVRJQ19QT0lOVFM7XG4gICAgcmV0dXJuIHNjb3JlO1xuICB9LCAwKTtcbiAgcmV0dXJuIHtcbiAgICByb3V0ZTogcm91dGUsXG4gICAgc2NvcmU6IHNjb3JlLFxuICAgIGluZGV4OiBpbmRleFxuICB9O1xufTtcblxudmFyIHJhbmtSb3V0ZXMgPSBmdW5jdGlvbiByYW5rUm91dGVzKHJvdXRlcykge1xuICByZXR1cm4gcm91dGVzLm1hcChyYW5rUm91dGUpLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gYS5zY29yZSA8IGIuc2NvcmUgPyAxIDogYS5zY29yZSA+IGIuc2NvcmUgPyAtMSA6IGEuaW5kZXggLSBiLmluZGV4O1xuICB9KTtcbn07XG5cbnZhciBzZWdtZW50aXplID0gZnVuY3Rpb24gc2VnbWVudGl6ZSh1cmkpIHtcbiAgcmV0dXJuIHVyaSAvLyBzdHJpcCBzdGFydGluZy9lbmRpbmcgc2xhc2hlc1xuICAucmVwbGFjZSgvKF5cXC8rfFxcLyskKS9nLCBcIlwiKS5zcGxpdChcIi9cIik7XG59O1xuXG52YXIgYWRkUXVlcnkgPSBmdW5jdGlvbiBhZGRRdWVyeShwYXRobmFtZSkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgcXVlcnkgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgcXVlcnlbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgcXVlcnkgPSBxdWVyeS5maWx0ZXIoZnVuY3Rpb24gKHEpIHtcbiAgICByZXR1cm4gcSAmJiBxLmxlbmd0aCA+IDA7XG4gIH0pO1xuICByZXR1cm4gcGF0aG5hbWUgKyAocXVlcnkgJiYgcXVlcnkubGVuZ3RoID4gMCA/IFwiP1wiICsgcXVlcnkuam9pbihcIiZcIikgOiBcIlwiKTtcbn07XG5cbnZhciByZXNlcnZlZE5hbWVzID0gW1widXJpXCIsIFwicGF0aFwiXTtcbi8qKlxuICogU2hhbGxvdyBjb21wYXJlcyB0d28gb2JqZWN0cy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmoxIFRoZSBmaXJzdCBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmoyIFRoZSBzZWNvbmQgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKi9cblxudmFyIHNoYWxsb3dDb21wYXJlID0gZnVuY3Rpb24gc2hhbGxvd0NvbXBhcmUob2JqMSwgb2JqMikge1xuICB2YXIgb2JqMUtleXMgPSBPYmplY3Qua2V5cyhvYmoxKTtcbiAgcmV0dXJuIG9iajFLZXlzLmxlbmd0aCA9PT0gT2JqZWN0LmtleXMob2JqMikubGVuZ3RoICYmIG9iajFLZXlzLmV2ZXJ5KGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gb2JqMi5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIG9iajFba2V5XSA9PT0gb2JqMltrZXldO1xuICB9KTtcbn07IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblxuZXhwb3J0cy5zdGFydHNXaXRoID0gc3RhcnRzV2l0aDtcbmV4cG9ydHMucGljayA9IHBpY2s7XG5leHBvcnRzLm1hdGNoID0gbWF0Y2g7XG5leHBvcnRzLnJlc29sdmUgPSByZXNvbHZlO1xuZXhwb3J0cy5pbnNlcnRQYXJhbXMgPSBpbnNlcnRQYXJhbXM7XG5leHBvcnRzLnZhbGlkYXRlUmVkaXJlY3QgPSB2YWxpZGF0ZVJlZGlyZWN0O1xuZXhwb3J0cy5zaGFsbG93Q29tcGFyZSA9IHNoYWxsb3dDb21wYXJlOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///2098\n')},9771:function(__unused_webpack_module,exports){"use strict";eval('\n\nObject.defineProperty(exports, "__esModule", ({\n value: true\n}));\nexports.default = void 0;\n\nfunction startsWith(string, target, position) {\n var length = string.length;\n position = position == null ? 0 : position;\n\n if (position < 0) {\n position = 0;\n } else if (position > length) {\n position = length;\n }\n\n target = "".concat(target);\n return string.slice(position, position + target.length) == target;\n}\n\nfunction getBrowserLang() {\n if (typeof window === "undefined") {\n return null;\n }\n\n var lang = window.navigator.languages && window.navigator.languages[0] || window.navigator.language || window.navigator.browserLanguage || window.navigator.userLanguage || window.navigator.systemLanguage || null;\n return lang;\n}\n\nfunction normalizeCode(code) {\n return code.toLowerCase().replace(/-/, "_");\n}\n\nfunction getPreferredLanguage(options) {\n if (!options) {\n return getBrowserLang();\n }\n\n var languages = options.languages,\n fallback = options.fallback;\n\n if (!options.languages) {\n return fallback;\n } // some browsers report language as en-US instead of en_US\n\n\n var browserLanguage = normalizeCode(getBrowserLang());\n\n if (!browserLanguage) {\n return fallback;\n }\n\n var match = languages.filter(function (lang) {\n return normalizeCode(lang) === browserLanguage;\n });\n\n if (match.length > 0) {\n return match[0] || fallback;\n } // en == en_US\n\n\n var matchCodeOnly = languages.filter(function (lang) {\n return startsWith(browserLanguage, lang);\n });\n return matchCodeOnly[0] || fallback;\n}\n\nvar _default = getPreferredLanguage;\nexports.default = _default;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9icm93c2VyLWxhbmcvZGlzdC9pbmRleC5qcz9iNmY0Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViLDhDQUE2QztBQUM3QztBQUNBLENBQUMsRUFBQztBQUNGLGVBQWU7O0FBRWY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBLGVBQWUiLCJmaWxlIjoiOTc3MS5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG5mdW5jdGlvbiBzdGFydHNXaXRoKHN0cmluZywgdGFyZ2V0LCBwb3NpdGlvbikge1xuICB2YXIgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aDtcbiAgcG9zaXRpb24gPSBwb3NpdGlvbiA9PSBudWxsID8gMCA6IHBvc2l0aW9uO1xuXG4gIGlmIChwb3NpdGlvbiA8IDApIHtcbiAgICBwb3NpdGlvbiA9IDA7XG4gIH0gZWxzZSBpZiAocG9zaXRpb24gPiBsZW5ndGgpIHtcbiAgICBwb3NpdGlvbiA9IGxlbmd0aDtcbiAgfVxuXG4gIHRhcmdldCA9IFwiXCIuY29uY2F0KHRhcmdldCk7XG4gIHJldHVybiBzdHJpbmcuc2xpY2UocG9zaXRpb24sIHBvc2l0aW9uICsgdGFyZ2V0Lmxlbmd0aCkgPT0gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBnZXRCcm93c2VyTGFuZygpIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBsYW5nID0gd2luZG93Lm5hdmlnYXRvci5sYW5ndWFnZXMgJiYgd2luZG93Lm5hdmlnYXRvci5sYW5ndWFnZXNbMF0gfHwgd2luZG93Lm5hdmlnYXRvci5sYW5ndWFnZSB8fCB3aW5kb3cubmF2aWdhdG9yLmJyb3dzZXJMYW5ndWFnZSB8fCB3aW5kb3cubmF2aWdhdG9yLnVzZXJMYW5ndWFnZSB8fCB3aW5kb3cubmF2aWdhdG9yLnN5c3RlbUxhbmd1YWdlIHx8IG51bGw7XG4gIHJldHVybiBsYW5nO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVDb2RlKGNvZGUpIHtcbiAgcmV0dXJuIGNvZGUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC8tLywgXCJfXCIpO1xufVxuXG5mdW5jdGlvbiBnZXRQcmVmZXJyZWRMYW5ndWFnZShvcHRpb25zKSB7XG4gIGlmICghb3B0aW9ucykge1xuICAgIHJldHVybiBnZXRCcm93c2VyTGFuZygpO1xuICB9XG5cbiAgdmFyIGxhbmd1YWdlcyA9IG9wdGlvbnMubGFuZ3VhZ2VzLFxuICAgICAgZmFsbGJhY2sgPSBvcHRpb25zLmZhbGxiYWNrO1xuXG4gIGlmICghb3B0aW9ucy5sYW5ndWFnZXMpIHtcbiAgICByZXR1cm4gZmFsbGJhY2s7XG4gIH0gLy8gc29tZSBicm93c2VycyByZXBvcnQgbGFuZ3VhZ2UgYXMgZW4tVVMgaW5zdGVhZCBvZiBlbl9VU1xuXG5cbiAgdmFyIGJyb3dzZXJMYW5ndWFnZSA9IG5vcm1hbGl6ZUNvZGUoZ2V0QnJvd3NlckxhbmcoKSk7XG5cbiAgaWYgKCFicm93c2VyTGFuZ3VhZ2UpIHtcbiAgICByZXR1cm4gZmFsbGJhY2s7XG4gIH1cblxuICB2YXIgbWF0Y2ggPSBsYW5ndWFnZXMuZmlsdGVyKGZ1bmN0aW9uIChsYW5nKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZUNvZGUobGFuZykgPT09IGJyb3dzZXJMYW5ndWFnZTtcbiAgfSk7XG5cbiAgaWYgKG1hdGNoLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gbWF0Y2hbMF0gfHwgZmFsbGJhY2s7XG4gIH0gLy8gZW4gPT0gZW5fVVNcblxuXG4gIHZhciBtYXRjaENvZGVPbmx5ID0gbGFuZ3VhZ2VzLmZpbHRlcihmdW5jdGlvbiAobGFuZykge1xuICAgIHJldHVybiBzdGFydHNXaXRoKGJyb3dzZXJMYW5ndWFnZSwgbGFuZyk7XG4gIH0pO1xuICByZXR1cm4gbWF0Y2hDb2RlT25seVswXSB8fCBmYWxsYmFjaztcbn1cblxudmFyIF9kZWZhdWx0ID0gZ2V0UHJlZmVycmVkTGFuZ3VhZ2U7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///9771\n')},6494:function(module){"use strict";eval("\n\nmodule.exports = Object.assign;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9nYXRzYnkvZGlzdC9pbnRlcm5hbC1wbHVnaW5zL2J1bmRsZS1vcHRpbWlzYXRpb25zL3BvbHlmaWxscy9vYmplY3QtYXNzaWduLmpzP2ViZmIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIiLCJmaWxlIjoiNjQ5NC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5hc3NpZ247Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///6494\n")},5706:function(module,__unused_webpack_exports,__webpack_require__){"use strict";eval("\n\nvar reactIs = __webpack_require__(8812);\n/**\n * Copyright 2015, Yahoo! Inc.\n * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.\n */\n\n\nvar REACT_STATICS = {\n childContextTypes: true,\n contextType: true,\n contextTypes: true,\n defaultProps: true,\n displayName: true,\n getDefaultProps: true,\n getDerivedStateFromError: true,\n getDerivedStateFromProps: true,\n mixins: true,\n propTypes: true,\n type: true\n};\nvar KNOWN_STATICS = {\n name: true,\n length: true,\n prototype: true,\n caller: true,\n callee: true,\n arguments: true,\n arity: true\n};\nvar FORWARD_REF_STATICS = {\n '$$typeof': true,\n render: true,\n defaultProps: true,\n displayName: true,\n propTypes: true\n};\nvar MEMO_STATICS = {\n '$$typeof': true,\n compare: true,\n defaultProps: true,\n displayName: true,\n propTypes: true,\n type: true\n};\nvar TYPE_STATICS = {};\nTYPE_STATICS[reactIs.ForwardRef] = FORWARD_REF_STATICS;\nTYPE_STATICS[reactIs.Memo] = MEMO_STATICS;\n\nfunction getStatics(component) {\n // React v16.11 and below\n if (reactIs.isMemo(component)) {\n return MEMO_STATICS;\n } // React v16.12 and above\n\n\n return TYPE_STATICS[component['$$typeof']] || REACT_STATICS;\n}\n\nvar defineProperty = Object.defineProperty;\nvar getOwnPropertyNames = Object.getOwnPropertyNames;\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nvar getPrototypeOf = Object.getPrototypeOf;\nvar objectPrototype = Object.prototype;\n\nfunction hoistNonReactStatics(targetComponent, sourceComponent, blacklist) {\n if (typeof sourceComponent !== 'string') {\n // don't hoist over string (html) components\n if (objectPrototype) {\n var inheritedComponent = getPrototypeOf(sourceComponent);\n\n if (inheritedComponent && inheritedComponent !== objectPrototype) {\n hoistNonReactStatics(targetComponent, inheritedComponent, blacklist);\n }\n }\n\n var keys = getOwnPropertyNames(sourceComponent);\n\n if (getOwnPropertySymbols) {\n keys = keys.concat(getOwnPropertySymbols(sourceComponent));\n }\n\n var targetStatics = getStatics(targetComponent);\n var sourceStatics = getStatics(sourceComponent);\n\n for (var i = 0; i < keys.length; ++i) {\n var key = keys[i];\n\n if (!KNOWN_STATICS[key] && !(blacklist && blacklist[key]) && !(sourceStatics && sourceStatics[key]) && !(targetStatics && targetStatics[key])) {\n var descriptor = getOwnPropertyDescriptor(sourceComponent, key);\n\n try {\n // Avoid failures from read-only properties\n defineProperty(targetComponent, key, descriptor);\n } catch (e) {}\n }\n }\n }\n\n return targetComponent;\n}\n\nmodule.exports = hoistNonReactStatics;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9ob2lzdC1ub24tcmVhY3Qtc3RhdGljcy9kaXN0L2hvaXN0LW5vbi1yZWFjdC1zdGF0aWNzLmNqcy5qcz83MzFjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViLGNBQWMsbUJBQU8sQ0FBQyxJQUFVO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsbUJBQW1CLGlCQUFpQjtBQUNwQzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSIsImZpbGUiOiI1NzA2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmVhY3RJcyA9IHJlcXVpcmUoJ3JlYWN0LWlzJyk7XG4vKipcbiAqIENvcHlyaWdodCAyMDE1LCBZYWhvbyEgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5cblxudmFyIFJFQUNUX1NUQVRJQ1MgPSB7XG4gIGNoaWxkQ29udGV4dFR5cGVzOiB0cnVlLFxuICBjb250ZXh0VHlwZTogdHJ1ZSxcbiAgY29udGV4dFR5cGVzOiB0cnVlLFxuICBkZWZhdWx0UHJvcHM6IHRydWUsXG4gIGRpc3BsYXlOYW1lOiB0cnVlLFxuICBnZXREZWZhdWx0UHJvcHM6IHRydWUsXG4gIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcjogdHJ1ZSxcbiAgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzOiB0cnVlLFxuICBtaXhpbnM6IHRydWUsXG4gIHByb3BUeXBlczogdHJ1ZSxcbiAgdHlwZTogdHJ1ZVxufTtcbnZhciBLTk9XTl9TVEFUSUNTID0ge1xuICBuYW1lOiB0cnVlLFxuICBsZW5ndGg6IHRydWUsXG4gIHByb3RvdHlwZTogdHJ1ZSxcbiAgY2FsbGVyOiB0cnVlLFxuICBjYWxsZWU6IHRydWUsXG4gIGFyZ3VtZW50czogdHJ1ZSxcbiAgYXJpdHk6IHRydWVcbn07XG52YXIgRk9SV0FSRF9SRUZfU1RBVElDUyA9IHtcbiAgJyQkdHlwZW9mJzogdHJ1ZSxcbiAgcmVuZGVyOiB0cnVlLFxuICBkZWZhdWx0UHJvcHM6IHRydWUsXG4gIGRpc3BsYXlOYW1lOiB0cnVlLFxuICBwcm9wVHlwZXM6IHRydWVcbn07XG52YXIgTUVNT19TVEFUSUNTID0ge1xuICAnJCR0eXBlb2YnOiB0cnVlLFxuICBjb21wYXJlOiB0cnVlLFxuICBkZWZhdWx0UHJvcHM6IHRydWUsXG4gIGRpc3BsYXlOYW1lOiB0cnVlLFxuICBwcm9wVHlwZXM6IHRydWUsXG4gIHR5cGU6IHRydWVcbn07XG52YXIgVFlQRV9TVEFUSUNTID0ge307XG5UWVBFX1NUQVRJQ1NbcmVhY3RJcy5Gb3J3YXJkUmVmXSA9IEZPUldBUkRfUkVGX1NUQVRJQ1M7XG5UWVBFX1NUQVRJQ1NbcmVhY3RJcy5NZW1vXSA9IE1FTU9fU1RBVElDUztcblxuZnVuY3Rpb24gZ2V0U3RhdGljcyhjb21wb25lbnQpIHtcbiAgLy8gUmVhY3QgdjE2LjExIGFuZCBiZWxvd1xuICBpZiAocmVhY3RJcy5pc01lbW8oY29tcG9uZW50KSkge1xuICAgIHJldHVybiBNRU1PX1NUQVRJQ1M7XG4gIH0gLy8gUmVhY3QgdjE2LjEyIGFuZCBhYm92ZVxuXG5cbiAgcmV0dXJuIFRZUEVfU1RBVElDU1tjb21wb25lbnRbJyQkdHlwZW9mJ11dIHx8IFJFQUNUX1NUQVRJQ1M7XG59XG5cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7XG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xudmFyIGdldFByb3RvdHlwZU9mID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xudmFyIG9iamVjdFByb3RvdHlwZSA9IE9iamVjdC5wcm90b3R5cGU7XG5cbmZ1bmN0aW9uIGhvaXN0Tm9uUmVhY3RTdGF0aWNzKHRhcmdldENvbXBvbmVudCwgc291cmNlQ29tcG9uZW50LCBibGFja2xpc3QpIHtcbiAgaWYgKHR5cGVvZiBzb3VyY2VDb21wb25lbnQgIT09ICdzdHJpbmcnKSB7XG4gICAgLy8gZG9uJ3QgaG9pc3Qgb3ZlciBzdHJpbmcgKGh0bWwpIGNvbXBvbmVudHNcbiAgICBpZiAob2JqZWN0UHJvdG90eXBlKSB7XG4gICAgICB2YXIgaW5oZXJpdGVkQ29tcG9uZW50ID0gZ2V0UHJvdG90eXBlT2Yoc291cmNlQ29tcG9uZW50KTtcblxuICAgICAgaWYgKGluaGVyaXRlZENvbXBvbmVudCAmJiBpbmhlcml0ZWRDb21wb25lbnQgIT09IG9iamVjdFByb3RvdHlwZSkge1xuICAgICAgICBob2lzdE5vblJlYWN0U3RhdGljcyh0YXJnZXRDb21wb25lbnQsIGluaGVyaXRlZENvbXBvbmVudCwgYmxhY2tsaXN0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIga2V5cyA9IGdldE93blByb3BlcnR5TmFtZXMoc291cmNlQ29tcG9uZW50KTtcblxuICAgIGlmIChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgIGtleXMgPSBrZXlzLmNvbmNhdChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlQ29tcG9uZW50KSk7XG4gICAgfVxuXG4gICAgdmFyIHRhcmdldFN0YXRpY3MgPSBnZXRTdGF0aWNzKHRhcmdldENvbXBvbmVudCk7XG4gICAgdmFyIHNvdXJjZVN0YXRpY3MgPSBnZXRTdGF0aWNzKHNvdXJjZUNvbXBvbmVudCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuXG4gICAgICBpZiAoIUtOT1dOX1NUQVRJQ1Nba2V5XSAmJiAhKGJsYWNrbGlzdCAmJiBibGFja2xpc3Rba2V5XSkgJiYgIShzb3VyY2VTdGF0aWNzICYmIHNvdXJjZVN0YXRpY3Nba2V5XSkgJiYgISh0YXJnZXRTdGF0aWNzICYmIHRhcmdldFN0YXRpY3Nba2V5XSkpIHtcbiAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlQ29tcG9uZW50LCBrZXkpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gQXZvaWQgZmFpbHVyZXMgZnJvbSByZWFkLW9ubHkgcHJvcGVydGllc1xuICAgICAgICAgIGRlZmluZVByb3BlcnR5KHRhcmdldENvbXBvbmVudCwga2V5LCBkZXNjcmlwdG9yKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0Q29tcG9uZW50O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhvaXN0Tm9uUmVhY3RTdGF0aWNzOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///5706\n")},3160:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"FormattedDate\": function() { return /* binding */ FormattedDate; },\n \"FormattedDateParts\": function() { return /* binding */ FormattedDateParts; },\n \"FormattedDisplayName\": function() { return /* binding */ FormattedDisplayName; },\n \"FormattedHTMLMessage\": function() { return /* reexport */ html_message; },\n \"FormattedList\": function() { return /* binding */ FormattedList; },\n \"FormattedMessage\": function() { return /* reexport */ message; },\n \"FormattedNumber\": function() { return /* binding */ FormattedNumber; },\n \"FormattedNumberParts\": function() { return /* reexport */ FormattedNumberParts; },\n \"FormattedPlural\": function() { return /* reexport */ plural; },\n \"FormattedRelativeTime\": function() { return /* reexport */ relative; },\n \"FormattedTime\": function() { return /* binding */ FormattedTime; },\n \"FormattedTimeParts\": function() { return /* binding */ FormattedTimeParts; },\n \"IntlContext\": function() { return /* reexport */ Context; },\n \"IntlProvider\": function() { return /* reexport */ provider_IntlProvider; },\n \"RawIntlProvider\": function() { return /* reexport */ Provider; },\n \"createIntl\": function() { return /* reexport */ createIntl; },\n \"createIntlCache\": function() { return /* reexport */ createIntlCache; },\n \"defineMessages\": function() { return /* binding */ defineMessages; },\n \"injectIntl\": function() { return /* reexport */ injectIntl; },\n \"useIntl\": function() { return /* reexport */ useIntl; }\n});\n\n// EXTERNAL MODULE: ./node_modules/react/index.js\nvar react = __webpack_require__(7294);\nvar react_namespaceObject = /*#__PURE__*/__webpack_require__.t(react, 2);\n;// CONCATENATED MODULE: ./node_modules/intl-messageformat-parser/lib/types.js\nvar TYPE;\n\n(function (TYPE) {\n /**\n * Raw text\n */\n TYPE[TYPE[\"literal\"] = 0] = \"literal\";\n /**\n * Variable w/o any format, e.g `var` in `this is a {var}`\n */\n\n TYPE[TYPE[\"argument\"] = 1] = \"argument\";\n /**\n * Variable w/ number format\n */\n\n TYPE[TYPE[\"number\"] = 2] = \"number\";\n /**\n * Variable w/ date format\n */\n\n TYPE[TYPE[\"date\"] = 3] = \"date\";\n /**\n * Variable w/ time format\n */\n\n TYPE[TYPE[\"time\"] = 4] = \"time\";\n /**\n * Variable w/ select format\n */\n\n TYPE[TYPE[\"select\"] = 5] = \"select\";\n /**\n * Variable w/ plural format\n */\n\n TYPE[TYPE[\"plural\"] = 6] = \"plural\";\n /**\n * Only possible within plural argument.\n * This is the `#` symbol that will be substituted with the count.\n */\n\n TYPE[TYPE[\"pound\"] = 7] = \"pound\";\n})(TYPE || (TYPE = {}));\n/**\n * Type Guards\n */\n\n\nfunction isLiteralElement(el) {\n return el.type === TYPE.literal;\n}\nfunction isArgumentElement(el) {\n return el.type === TYPE.argument;\n}\nfunction isNumberElement(el) {\n return el.type === TYPE.number;\n}\nfunction isDateElement(el) {\n return el.type === TYPE.date;\n}\nfunction isTimeElement(el) {\n return el.type === TYPE.time;\n}\nfunction isSelectElement(el) {\n return el.type === TYPE.select;\n}\nfunction isPluralElement(el) {\n return el.type === TYPE.plural;\n}\nfunction isPoundElement(el) {\n return el.type === TYPE.pound;\n}\nfunction isNumberSkeleton(el) {\n return !!(el && typeof el === 'object' && el.type === 0\n /* number */\n );\n}\nfunction isDateTimeSkeleton(el) {\n return !!(el && typeof el === 'object' && el.type === 1\n /* dateTime */\n );\n}\nfunction createLiteralElement(value) {\n return {\n type: TYPE.literal,\n value: value\n };\n}\nfunction createNumberElement(value, style) {\n return {\n type: TYPE.number,\n value: value,\n style: style\n };\n}\n;// CONCATENATED MODULE: ./node_modules/intl-messageformat-parser/lib/parser.js\n// tslint:disable:only-arrow-functions\n// tslint:disable:object-literal-shorthand\n// tslint:disable:trailing-comma\n// tslint:disable:object-literal-sort-keys\n// tslint:disable:one-variable-per-declaration\n// tslint:disable:max-line-length\n// tslint:disable:no-consecutive-blank-lines\n// tslint:disable:align\nvar __extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (b.hasOwnProperty(p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n\nvar __assign = undefined && undefined.__assign || function () {\n __assign = Object.assign || function (t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n\n for (var p in s) {\n if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n }\n\n return t;\n };\n\n return __assign.apply(this, arguments);\n}; // Generated by PEG.js v. 0.10.0 (ts-pegjs plugin v. 0.2.6 )\n//\n// https://pegjs.org/ https://github.com/metadevpro/ts-pegjs\n\n\n\n\nvar SyntaxError =\n/** @class */\nfunction (_super) {\n __extends(SyntaxError, _super);\n\n function SyntaxError(message, expected, found, location) {\n var _this = _super.call(this) || this;\n\n _this.message = message;\n _this.expected = expected;\n _this.found = found;\n _this.location = location;\n _this.name = \"SyntaxError\";\n\n if (typeof Error.captureStackTrace === \"function\") {\n Error.captureStackTrace(_this, SyntaxError);\n }\n\n return _this;\n }\n\n SyntaxError.buildMessage = function (expected, found) {\n function hex(ch) {\n return ch.charCodeAt(0).toString(16).toUpperCase();\n }\n\n function literalEscape(s) {\n return s.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, \"\\\\\\\"\").replace(/\\0/g, \"\\\\0\").replace(/\\t/g, \"\\\\t\").replace(/\\n/g, \"\\\\n\").replace(/\\r/g, \"\\\\r\").replace(/[\\x00-\\x0F]/g, function (ch) {\n return \"\\\\x0\" + hex(ch);\n }).replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function (ch) {\n return \"\\\\x\" + hex(ch);\n });\n }\n\n function classEscape(s) {\n return s.replace(/\\\\/g, \"\\\\\\\\\").replace(/\\]/g, \"\\\\]\").replace(/\\^/g, \"\\\\^\").replace(/-/g, \"\\\\-\").replace(/\\0/g, \"\\\\0\").replace(/\\t/g, \"\\\\t\").replace(/\\n/g, \"\\\\n\").replace(/\\r/g, \"\\\\r\").replace(/[\\x00-\\x0F]/g, function (ch) {\n return \"\\\\x0\" + hex(ch);\n }).replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function (ch) {\n return \"\\\\x\" + hex(ch);\n });\n }\n\n function describeExpectation(expectation) {\n switch (expectation.type) {\n case \"literal\":\n return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n\n case \"class\":\n var escapedParts = expectation.parts.map(function (part) {\n return Array.isArray(part) ? classEscape(part[0]) + \"-\" + classEscape(part[1]) : classEscape(part);\n });\n return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts + \"]\";\n\n case \"any\":\n return \"any character\";\n\n case \"end\":\n return \"end of input\";\n\n case \"other\":\n return expectation.description;\n }\n }\n\n function describeExpected(expected1) {\n var descriptions = expected1.map(describeExpectation);\n var i;\n var j;\n descriptions.sort();\n\n if (descriptions.length > 0) {\n for (i = 1, j = 1; i < descriptions.length; i++) {\n if (descriptions[i - 1] !== descriptions[i]) {\n descriptions[j] = descriptions[i];\n j++;\n }\n }\n\n descriptions.length = j;\n }\n\n switch (descriptions.length) {\n case 1:\n return descriptions[0];\n\n case 2:\n return descriptions[0] + \" or \" + descriptions[1];\n\n default:\n return descriptions.slice(0, -1).join(\", \") + \", or \" + descriptions[descriptions.length - 1];\n }\n }\n\n function describeFound(found1) {\n return found1 ? \"\\\"\" + literalEscape(found1) + \"\\\"\" : \"end of input\";\n }\n\n return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n };\n\n return SyntaxError;\n}(Error);\n\n\n\nfunction peg$parse(input, options) {\n options = options !== undefined ? options : {};\n var peg$FAILED = {};\n var peg$startRuleFunctions = {\n start: peg$parsestart\n };\n var peg$startRuleFunction = peg$parsestart;\n\n var peg$c0 = function peg$c0(parts) {\n return parts.join('');\n };\n\n var peg$c1 = function peg$c1(messageText) {\n return __assign({\n type: TYPE.literal,\n value: messageText\n }, insertLocation());\n };\n\n var peg$c2 = \"#\";\n var peg$c3 = peg$literalExpectation(\"#\", false);\n\n var peg$c4 = function peg$c4() {\n return __assign({\n type: TYPE.pound\n }, insertLocation());\n };\n\n var peg$c5 = peg$otherExpectation(\"argumentElement\");\n var peg$c6 = \"{\";\n var peg$c7 = peg$literalExpectation(\"{\", false);\n var peg$c8 = \"}\";\n var peg$c9 = peg$literalExpectation(\"}\", false);\n\n var peg$c10 = function peg$c10(value) {\n return __assign({\n type: TYPE.argument,\n value: value\n }, insertLocation());\n };\n\n var peg$c11 = peg$otherExpectation(\"numberSkeletonId\");\n var peg$c12 = /^['\\/{}]/;\n var peg$c13 = peg$classExpectation([\"'\", \"/\", \"{\", \"}\"], false, false);\n var peg$c14 = peg$anyExpectation();\n var peg$c15 = peg$otherExpectation(\"numberSkeletonTokenOption\");\n var peg$c16 = \"/\";\n var peg$c17 = peg$literalExpectation(\"/\", false);\n\n var peg$c18 = function peg$c18(option) {\n return option;\n };\n\n var peg$c19 = peg$otherExpectation(\"numberSkeletonToken\");\n\n var peg$c20 = function peg$c20(stem, options) {\n return {\n stem: stem,\n options: options\n };\n };\n\n var peg$c21 = function peg$c21(tokens) {\n return __assign({\n type: 0\n /* number */\n ,\n tokens: tokens\n }, insertLocation());\n };\n\n var peg$c22 = \"::\";\n var peg$c23 = peg$literalExpectation(\"::\", false);\n\n var peg$c24 = function peg$c24(skeleton) {\n return skeleton;\n };\n\n var peg$c25 = function peg$c25() {\n messageCtx.push('numberArgStyle');\n return true;\n };\n\n var peg$c26 = function peg$c26(style) {\n messageCtx.pop();\n return style.replace(/\\s*$/, '');\n };\n\n var peg$c27 = \",\";\n var peg$c28 = peg$literalExpectation(\",\", false);\n var peg$c29 = \"number\";\n var peg$c30 = peg$literalExpectation(\"number\", false);\n\n var peg$c31 = function peg$c31(value, type, style) {\n return __assign({\n type: type === 'number' ? TYPE.number : type === 'date' ? TYPE.date : TYPE.time,\n style: style && style[2],\n value: value\n }, insertLocation());\n };\n\n var peg$c32 = \"'\";\n var peg$c33 = peg$literalExpectation(\"'\", false);\n var peg$c34 = /^[^']/;\n var peg$c35 = peg$classExpectation([\"'\"], true, false);\n var peg$c36 = /^[^a-zA-Z'{}]/;\n var peg$c37 = peg$classExpectation([[\"a\", \"z\"], [\"A\", \"Z\"], \"'\", \"{\", \"}\"], true, false);\n var peg$c38 = /^[a-zA-Z]/;\n var peg$c39 = peg$classExpectation([[\"a\", \"z\"], [\"A\", \"Z\"]], false, false);\n\n var peg$c40 = function peg$c40(pattern) {\n return __assign({\n type: 1\n /* dateTime */\n ,\n pattern: pattern\n }, insertLocation());\n };\n\n var peg$c41 = function peg$c41() {\n messageCtx.push('dateOrTimeArgStyle');\n return true;\n };\n\n var peg$c42 = \"date\";\n var peg$c43 = peg$literalExpectation(\"date\", false);\n var peg$c44 = \"time\";\n var peg$c45 = peg$literalExpectation(\"time\", false);\n var peg$c46 = \"plural\";\n var peg$c47 = peg$literalExpectation(\"plural\", false);\n var peg$c48 = \"selectordinal\";\n var peg$c49 = peg$literalExpectation(\"selectordinal\", false);\n var peg$c50 = \"offset:\";\n var peg$c51 = peg$literalExpectation(\"offset:\", false);\n\n var peg$c52 = function peg$c52(value, pluralType, offset, options) {\n return __assign({\n type: TYPE.plural,\n pluralType: pluralType === 'plural' ? 'cardinal' : 'ordinal',\n value: value,\n offset: offset ? offset[2] : 0,\n options: options.reduce(function (all, _a) {\n var id = _a.id,\n value = _a.value,\n optionLocation = _a.location;\n\n if (id in all) {\n error(\"Duplicate option \\\"\" + id + \"\\\" in plural element: \\\"\" + text() + \"\\\"\", location());\n }\n\n all[id] = {\n value: value,\n location: optionLocation\n };\n return all;\n }, {})\n }, insertLocation());\n };\n\n var peg$c53 = \"select\";\n var peg$c54 = peg$literalExpectation(\"select\", false);\n\n var peg$c55 = function peg$c55(value, options) {\n return __assign({\n type: TYPE.select,\n value: value,\n options: options.reduce(function (all, _a) {\n var id = _a.id,\n value = _a.value,\n optionLocation = _a.location;\n\n if (id in all) {\n error(\"Duplicate option \\\"\" + id + \"\\\" in select element: \\\"\" + text() + \"\\\"\", location());\n }\n\n all[id] = {\n value: value,\n location: optionLocation\n };\n return all;\n }, {})\n }, insertLocation());\n };\n\n var peg$c56 = \"=\";\n var peg$c57 = peg$literalExpectation(\"=\", false);\n\n var peg$c58 = function peg$c58(id) {\n messageCtx.push('select');\n return true;\n };\n\n var peg$c59 = function peg$c59(id, value) {\n messageCtx.pop();\n return __assign({\n id: id,\n value: value\n }, insertLocation());\n };\n\n var peg$c60 = function peg$c60(id) {\n messageCtx.push('plural');\n return true;\n };\n\n var peg$c61 = function peg$c61(id, value) {\n messageCtx.pop();\n return __assign({\n id: id,\n value: value\n }, insertLocation());\n };\n\n var peg$c62 = peg$otherExpectation(\"whitespace\");\n var peg$c63 = /^[\\t-\\r \\x85\\xA0\\u1680\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000]/;\n var peg$c64 = peg$classExpectation([[\"\\t\", \"\\r\"], \" \", \"\\x85\", \"\\xA0\", \"\\u1680\", [\"\\u2000\", \"\\u200A\"], \"\\u2028\", \"\\u2029\", \"\\u202F\", \"\\u205F\", \"\\u3000\"], false, false);\n var peg$c65 = peg$otherExpectation(\"syntax pattern\");\n var peg$c66 = /^[!-\\/:-@[-\\^`{-~\\xA1-\\xA7\\xA9\\xAB\\xAC\\xAE\\xB0\\xB1\\xB6\\xBB\\xBF\\xD7\\xF7\\u2010-\\u2027\\u2030-\\u203E\\u2041-\\u2053\\u2055-\\u205E\\u2190-\\u245F\\u2500-\\u2775\\u2794-\\u2BFF\\u2E00-\\u2E7F\\u3001-\\u3003\\u3008-\\u3020\\u3030\\uFD3E\\uFD3F\\uFE45\\uFE46]/;\n var peg$c67 = peg$classExpectation([[\"!\", \"/\"], [\":\", \"@\"], [\"[\", \"^\"], \"`\", [\"{\", \"~\"], [\"\\xA1\", \"\\xA7\"], \"\\xA9\", \"\\xAB\", \"\\xAC\", \"\\xAE\", \"\\xB0\", \"\\xB1\", \"\\xB6\", \"\\xBB\", \"\\xBF\", \"\\xD7\", \"\\xF7\", [\"\\u2010\", \"\\u2027\"], [\"\\u2030\", \"\\u203E\"], [\"\\u2041\", \"\\u2053\"], [\"\\u2055\", \"\\u205E\"], [\"\\u2190\", \"\\u245F\"], [\"\\u2500\", \"\\u2775\"], [\"\\u2794\", \"\\u2BFF\"], [\"\\u2E00\", \"\\u2E7F\"], [\"\\u3001\", \"\\u3003\"], [\"\\u3008\", \"\\u3020\"], \"\\u3030\", \"\\uFD3E\", \"\\uFD3F\", \"\\uFE45\", \"\\uFE46\"], false, false);\n var peg$c68 = peg$otherExpectation(\"optional whitespace\");\n var peg$c69 = peg$otherExpectation(\"number\");\n var peg$c70 = \"-\";\n var peg$c71 = peg$literalExpectation(\"-\", false);\n\n var peg$c72 = function peg$c72(negative, num) {\n return num ? negative ? -num : num : 0;\n };\n\n var peg$c73 = peg$otherExpectation(\"apostrophe\");\n var peg$c74 = peg$otherExpectation(\"double apostrophes\");\n var peg$c75 = \"''\";\n var peg$c76 = peg$literalExpectation(\"''\", false);\n\n var peg$c77 = function peg$c77() {\n return \"'\";\n };\n\n var peg$c78 = function peg$c78(escapedChar, quotedChars) {\n return escapedChar + quotedChars.replace(\"''\", \"'\");\n };\n\n var peg$c79 = function peg$c79(x) {\n return x !== '{' && !(isInPluralOption() && x === '#') && !(isNestedMessageText() && x === '}');\n };\n\n var peg$c80 = \"\\n\";\n var peg$c81 = peg$literalExpectation(\"\\n\", false);\n\n var peg$c82 = function peg$c82(x) {\n return x === '{' || x === '}' || isInPluralOption() && x === '#';\n };\n\n var peg$c83 = peg$otherExpectation(\"argNameOrNumber\");\n var peg$c84 = peg$otherExpectation(\"argNumber\");\n var peg$c85 = \"0\";\n var peg$c86 = peg$literalExpectation(\"0\", false);\n\n var peg$c87 = function peg$c87() {\n return 0;\n };\n\n var peg$c88 = /^[1-9]/;\n var peg$c89 = peg$classExpectation([[\"1\", \"9\"]], false, false);\n var peg$c90 = /^[0-9]/;\n var peg$c91 = peg$classExpectation([[\"0\", \"9\"]], false, false);\n\n var peg$c92 = function peg$c92(digits) {\n return parseInt(digits.join(''), 10);\n };\n\n var peg$c93 = peg$otherExpectation(\"argName\");\n var peg$currPos = 0;\n var peg$savedPos = 0;\n var peg$posDetailsCache = [{\n line: 1,\n column: 1\n }];\n var peg$maxFailPos = 0;\n var peg$maxFailExpected = [];\n var peg$silentFails = 0;\n var peg$result;\n\n if (options.startRule !== undefined) {\n if (!(options.startRule in peg$startRuleFunctions)) {\n throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n }\n\n peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n }\n\n function text() {\n return input.substring(peg$savedPos, peg$currPos);\n }\n\n function location() {\n return peg$computeLocation(peg$savedPos, peg$currPos);\n }\n\n function expected(description, location1) {\n location1 = location1 !== undefined ? location1 : peg$computeLocation(peg$savedPos, peg$currPos);\n throw peg$buildStructuredError([peg$otherExpectation(description)], input.substring(peg$savedPos, peg$currPos), location1);\n }\n\n function error(message, location1) {\n location1 = location1 !== undefined ? location1 : peg$computeLocation(peg$savedPos, peg$currPos);\n throw peg$buildSimpleError(message, location1);\n }\n\n function peg$literalExpectation(text1, ignoreCase) {\n return {\n type: \"literal\",\n text: text1,\n ignoreCase: ignoreCase\n };\n }\n\n function peg$classExpectation(parts, inverted, ignoreCase) {\n return {\n type: \"class\",\n parts: parts,\n inverted: inverted,\n ignoreCase: ignoreCase\n };\n }\n\n function peg$anyExpectation() {\n return {\n type: \"any\"\n };\n }\n\n function peg$endExpectation() {\n return {\n type: \"end\"\n };\n }\n\n function peg$otherExpectation(description) {\n return {\n type: \"other\",\n description: description\n };\n }\n\n function peg$computePosDetails(pos) {\n var details = peg$posDetailsCache[pos];\n var p;\n\n if (details) {\n return details;\n } else {\n p = pos - 1;\n\n while (!peg$posDetailsCache[p]) {\n p--;\n }\n\n details = peg$posDetailsCache[p];\n details = {\n line: details.line,\n column: details.column\n };\n\n while (p < pos) {\n if (input.charCodeAt(p) === 10) {\n details.line++;\n details.column = 1;\n } else {\n details.column++;\n }\n\n p++;\n }\n\n peg$posDetailsCache[pos] = details;\n return details;\n }\n }\n\n function peg$computeLocation(startPos, endPos) {\n var startPosDetails = peg$computePosDetails(startPos);\n var endPosDetails = peg$computePosDetails(endPos);\n return {\n start: {\n offset: startPos,\n line: startPosDetails.line,\n column: startPosDetails.column\n },\n end: {\n offset: endPos,\n line: endPosDetails.line,\n column: endPosDetails.column\n }\n };\n }\n\n function peg$fail(expected1) {\n if (peg$currPos < peg$maxFailPos) {\n return;\n }\n\n if (peg$currPos > peg$maxFailPos) {\n peg$maxFailPos = peg$currPos;\n peg$maxFailExpected = [];\n }\n\n peg$maxFailExpected.push(expected1);\n }\n\n function peg$buildSimpleError(message, location1) {\n return new SyntaxError(message, [], \"\", location1);\n }\n\n function peg$buildStructuredError(expected1, found, location1) {\n return new SyntaxError(SyntaxError.buildMessage(expected1, found), expected1, found, location1);\n }\n\n function peg$parsestart() {\n var s0;\n s0 = peg$parsemessage();\n return s0;\n }\n\n function peg$parsemessage() {\n var s0, s1;\n s0 = [];\n s1 = peg$parsemessageElement();\n\n while (s1 !== peg$FAILED) {\n s0.push(s1);\n s1 = peg$parsemessageElement();\n }\n\n return s0;\n }\n\n function peg$parsemessageElement() {\n var s0;\n s0 = peg$parseliteralElement();\n\n if (s0 === peg$FAILED) {\n s0 = peg$parseargumentElement();\n\n if (s0 === peg$FAILED) {\n s0 = peg$parsesimpleFormatElement();\n\n if (s0 === peg$FAILED) {\n s0 = peg$parsepluralElement();\n\n if (s0 === peg$FAILED) {\n s0 = peg$parseselectElement();\n\n if (s0 === peg$FAILED) {\n s0 = peg$parsepoundElement();\n }\n }\n }\n }\n }\n\n return s0;\n }\n\n function peg$parsemessageText() {\n var s0, s1, s2;\n s0 = peg$currPos;\n s1 = [];\n s2 = peg$parsedoubleApostrophes();\n\n if (s2 === peg$FAILED) {\n s2 = peg$parsequotedString();\n\n if (s2 === peg$FAILED) {\n s2 = peg$parseunquotedString();\n }\n }\n\n if (s2 !== peg$FAILED) {\n while (s2 !== peg$FAILED) {\n s1.push(s2);\n s2 = peg$parsedoubleApostrophes();\n\n if (s2 === peg$FAILED) {\n s2 = peg$parsequotedString();\n\n if (s2 === peg$FAILED) {\n s2 = peg$parseunquotedString();\n }\n }\n }\n } else {\n s1 = peg$FAILED;\n }\n\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c0(s1);\n }\n\n s0 = s1;\n return s0;\n }\n\n function peg$parseliteralElement() {\n var s0, s1;\n s0 = peg$currPos;\n s1 = peg$parsemessageText();\n\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c1(s1);\n }\n\n s0 = s1;\n return s0;\n }\n\n function peg$parsepoundElement() {\n var s0, s1;\n s0 = peg$currPos;\n\n if (input.charCodeAt(peg$currPos) === 35) {\n s1 = peg$c2;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c3);\n }\n }\n\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c4();\n }\n\n s0 = s1;\n return s0;\n }\n\n function peg$parseargumentElement() {\n var s0, s1, s2, s3, s4, s5;\n peg$silentFails++;\n s0 = peg$currPos;\n\n if (input.charCodeAt(peg$currPos) === 123) {\n s1 = peg$c6;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c7);\n }\n }\n\n if (s1 !== peg$FAILED) {\n s2 = peg$parse_();\n\n if (s2 !== peg$FAILED) {\n s3 = peg$parseargNameOrNumber();\n\n if (s3 !== peg$FAILED) {\n s4 = peg$parse_();\n\n if (s4 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 125) {\n s5 = peg$c8;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c9);\n }\n }\n\n if (s5 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c10(s3);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n peg$silentFails--;\n\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c5);\n }\n }\n\n return s0;\n }\n\n function peg$parsenumberSkeletonId() {\n var s0, s1, s2, s3, s4;\n peg$silentFails++;\n s0 = peg$currPos;\n s1 = [];\n s2 = peg$currPos;\n s3 = peg$currPos;\n peg$silentFails++;\n s4 = peg$parsewhiteSpace();\n\n if (s4 === peg$FAILED) {\n if (peg$c12.test(input.charAt(peg$currPos))) {\n s4 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c13);\n }\n }\n }\n\n peg$silentFails--;\n\n if (s4 === peg$FAILED) {\n s3 = undefined;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n\n if (s3 !== peg$FAILED) {\n if (input.length > peg$currPos) {\n s4 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c14);\n }\n }\n\n if (s4 !== peg$FAILED) {\n s3 = [s3, s4];\n s2 = s3;\n } else {\n peg$currPos = s2;\n s2 = peg$FAILED;\n }\n } else {\n peg$currPos = s2;\n s2 = peg$FAILED;\n }\n\n if (s2 !== peg$FAILED) {\n while (s2 !== peg$FAILED) {\n s1.push(s2);\n s2 = peg$currPos;\n s3 = peg$currPos;\n peg$silentFails++;\n s4 = peg$parsewhiteSpace();\n\n if (s4 === peg$FAILED) {\n if (peg$c12.test(input.charAt(peg$currPos))) {\n s4 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c13);\n }\n }\n }\n\n peg$silentFails--;\n\n if (s4 === peg$FAILED) {\n s3 = undefined;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n\n if (s3 !== peg$FAILED) {\n if (input.length > peg$currPos) {\n s4 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c14);\n }\n }\n\n if (s4 !== peg$FAILED) {\n s3 = [s3, s4];\n s2 = s3;\n } else {\n peg$currPos = s2;\n s2 = peg$FAILED;\n }\n } else {\n peg$currPos = s2;\n s2 = peg$FAILED;\n }\n }\n } else {\n s1 = peg$FAILED;\n }\n\n if (s1 !== peg$FAILED) {\n s0 = input.substring(s0, peg$currPos);\n } else {\n s0 = s1;\n }\n\n peg$silentFails--;\n\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c11);\n }\n }\n\n return s0;\n }\n\n function peg$parsenumberSkeletonTokenOption() {\n var s0, s1, s2;\n peg$silentFails++;\n s0 = peg$currPos;\n\n if (input.charCodeAt(peg$currPos) === 47) {\n s1 = peg$c16;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c17);\n }\n }\n\n if (s1 !== peg$FAILED) {\n s2 = peg$parsenumberSkeletonId();\n\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c18(s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n peg$silentFails--;\n\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c15);\n }\n }\n\n return s0;\n }\n\n function peg$parsenumberSkeletonToken() {\n var s0, s1, s2, s3, s4;\n peg$silentFails++;\n s0 = peg$currPos;\n s1 = peg$parse_();\n\n if (s1 !== peg$FAILED) {\n s2 = peg$parsenumberSkeletonId();\n\n if (s2 !== peg$FAILED) {\n s3 = [];\n s4 = peg$parsenumberSkeletonTokenOption();\n\n while (s4 !== peg$FAILED) {\n s3.push(s4);\n s4 = peg$parsenumberSkeletonTokenOption();\n }\n\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c20(s2, s3);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n peg$silentFails--;\n\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c19);\n }\n }\n\n return s0;\n }\n\n function peg$parsenumberSkeleton() {\n var s0, s1, s2;\n s0 = peg$currPos;\n s1 = [];\n s2 = peg$parsenumberSkeletonToken();\n\n if (s2 !== peg$FAILED) {\n while (s2 !== peg$FAILED) {\n s1.push(s2);\n s2 = peg$parsenumberSkeletonToken();\n }\n } else {\n s1 = peg$FAILED;\n }\n\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c21(s1);\n }\n\n s0 = s1;\n return s0;\n }\n\n function peg$parsenumberArgStyle() {\n var s0, s1, s2;\n s0 = peg$currPos;\n\n if (input.substr(peg$currPos, 2) === peg$c22) {\n s1 = peg$c22;\n peg$currPos += 2;\n } else {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c23);\n }\n }\n\n if (s1 !== peg$FAILED) {\n s2 = peg$parsenumberSkeleton();\n\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c24(s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n peg$savedPos = peg$currPos;\n s1 = peg$c25();\n\n if (s1) {\n s1 = undefined;\n } else {\n s1 = peg$FAILED;\n }\n\n if (s1 !== peg$FAILED) {\n s2 = peg$parsemessageText();\n\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c26(s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n\n return s0;\n }\n\n function peg$parsenumberFormatElement() {\n var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12;\n s0 = peg$currPos;\n\n if (input.charCodeAt(peg$currPos) === 123) {\n s1 = peg$c6;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c7);\n }\n }\n\n if (s1 !== peg$FAILED) {\n s2 = peg$parse_();\n\n if (s2 !== peg$FAILED) {\n s3 = peg$parseargNameOrNumber();\n\n if (s3 !== peg$FAILED) {\n s4 = peg$parse_();\n\n if (s4 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 44) {\n s5 = peg$c27;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c28);\n }\n }\n\n if (s5 !== peg$FAILED) {\n s6 = peg$parse_();\n\n if (s6 !== peg$FAILED) {\n if (input.substr(peg$currPos, 6) === peg$c29) {\n s7 = peg$c29;\n peg$currPos += 6;\n } else {\n s7 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c30);\n }\n }\n\n if (s7 !== peg$FAILED) {\n s8 = peg$parse_();\n\n if (s8 !== peg$FAILED) {\n s9 = peg$currPos;\n\n if (input.charCodeAt(peg$currPos) === 44) {\n s10 = peg$c27;\n peg$currPos++;\n } else {\n s10 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c28);\n }\n }\n\n if (s10 !== peg$FAILED) {\n s11 = peg$parse_();\n\n if (s11 !== peg$FAILED) {\n s12 = peg$parsenumberArgStyle();\n\n if (s12 !== peg$FAILED) {\n s10 = [s10, s11, s12];\n s9 = s10;\n } else {\n peg$currPos = s9;\n s9 = peg$FAILED;\n }\n } else {\n peg$currPos = s9;\n s9 = peg$FAILED;\n }\n } else {\n peg$currPos = s9;\n s9 = peg$FAILED;\n }\n\n if (s9 === peg$FAILED) {\n s9 = null;\n }\n\n if (s9 !== peg$FAILED) {\n s10 = peg$parse_();\n\n if (s10 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 125) {\n s11 = peg$c8;\n peg$currPos++;\n } else {\n s11 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c9);\n }\n }\n\n if (s11 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c31(s3, s7, s9);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parsedateTimeSkeletonLiteral() {\n var s0, s1, s2, s3;\n s0 = peg$currPos;\n\n if (input.charCodeAt(peg$currPos) === 39) {\n s1 = peg$c32;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c33);\n }\n }\n\n if (s1 !== peg$FAILED) {\n s2 = [];\n s3 = peg$parsedoubleApostrophes();\n\n if (s3 === peg$FAILED) {\n if (peg$c34.test(input.charAt(peg$currPos))) {\n s3 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s3 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c35);\n }\n }\n }\n\n if (s3 !== peg$FAILED) {\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n s3 = peg$parsedoubleApostrophes();\n\n if (s3 === peg$FAILED) {\n if (peg$c34.test(input.charAt(peg$currPos))) {\n s3 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s3 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c35);\n }\n }\n }\n }\n } else {\n s2 = peg$FAILED;\n }\n\n if (s2 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 39) {\n s3 = peg$c32;\n peg$currPos++;\n } else {\n s3 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c33);\n }\n }\n\n if (s3 !== peg$FAILED) {\n s1 = [s1, s2, s3];\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n if (s0 === peg$FAILED) {\n s0 = [];\n s1 = peg$parsedoubleApostrophes();\n\n if (s1 === peg$FAILED) {\n if (peg$c36.test(input.charAt(peg$currPos))) {\n s1 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c37);\n }\n }\n }\n\n if (s1 !== peg$FAILED) {\n while (s1 !== peg$FAILED) {\n s0.push(s1);\n s1 = peg$parsedoubleApostrophes();\n\n if (s1 === peg$FAILED) {\n if (peg$c36.test(input.charAt(peg$currPos))) {\n s1 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c37);\n }\n }\n }\n }\n } else {\n s0 = peg$FAILED;\n }\n }\n\n return s0;\n }\n\n function peg$parsedateTimeSkeletonPattern() {\n var s0, s1;\n s0 = [];\n\n if (peg$c38.test(input.charAt(peg$currPos))) {\n s1 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c39);\n }\n }\n\n if (s1 !== peg$FAILED) {\n while (s1 !== peg$FAILED) {\n s0.push(s1);\n\n if (peg$c38.test(input.charAt(peg$currPos))) {\n s1 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c39);\n }\n }\n }\n } else {\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parsedateTimeSkeleton() {\n var s0, s1, s2, s3;\n s0 = peg$currPos;\n s1 = peg$currPos;\n s2 = [];\n s3 = peg$parsedateTimeSkeletonLiteral();\n\n if (s3 === peg$FAILED) {\n s3 = peg$parsedateTimeSkeletonPattern();\n }\n\n if (s3 !== peg$FAILED) {\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n s3 = peg$parsedateTimeSkeletonLiteral();\n\n if (s3 === peg$FAILED) {\n s3 = peg$parsedateTimeSkeletonPattern();\n }\n }\n } else {\n s2 = peg$FAILED;\n }\n\n if (s2 !== peg$FAILED) {\n s1 = input.substring(s1, peg$currPos);\n } else {\n s1 = s2;\n }\n\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c40(s1);\n }\n\n s0 = s1;\n return s0;\n }\n\n function peg$parsedateOrTimeArgStyle() {\n var s0, s1, s2;\n s0 = peg$currPos;\n\n if (input.substr(peg$currPos, 2) === peg$c22) {\n s1 = peg$c22;\n peg$currPos += 2;\n } else {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c23);\n }\n }\n\n if (s1 !== peg$FAILED) {\n s2 = peg$parsedateTimeSkeleton();\n\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c24(s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n peg$savedPos = peg$currPos;\n s1 = peg$c41();\n\n if (s1) {\n s1 = undefined;\n } else {\n s1 = peg$FAILED;\n }\n\n if (s1 !== peg$FAILED) {\n s2 = peg$parsemessageText();\n\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c26(s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n\n return s0;\n }\n\n function peg$parsedateOrTimeFormatElement() {\n var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12;\n s0 = peg$currPos;\n\n if (input.charCodeAt(peg$currPos) === 123) {\n s1 = peg$c6;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c7);\n }\n }\n\n if (s1 !== peg$FAILED) {\n s2 = peg$parse_();\n\n if (s2 !== peg$FAILED) {\n s3 = peg$parseargNameOrNumber();\n\n if (s3 !== peg$FAILED) {\n s4 = peg$parse_();\n\n if (s4 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 44) {\n s5 = peg$c27;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c28);\n }\n }\n\n if (s5 !== peg$FAILED) {\n s6 = peg$parse_();\n\n if (s6 !== peg$FAILED) {\n if (input.substr(peg$currPos, 4) === peg$c42) {\n s7 = peg$c42;\n peg$currPos += 4;\n } else {\n s7 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c43);\n }\n }\n\n if (s7 === peg$FAILED) {\n if (input.substr(peg$currPos, 4) === peg$c44) {\n s7 = peg$c44;\n peg$currPos += 4;\n } else {\n s7 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c45);\n }\n }\n }\n\n if (s7 !== peg$FAILED) {\n s8 = peg$parse_();\n\n if (s8 !== peg$FAILED) {\n s9 = peg$currPos;\n\n if (input.charCodeAt(peg$currPos) === 44) {\n s10 = peg$c27;\n peg$currPos++;\n } else {\n s10 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c28);\n }\n }\n\n if (s10 !== peg$FAILED) {\n s11 = peg$parse_();\n\n if (s11 !== peg$FAILED) {\n s12 = peg$parsedateOrTimeArgStyle();\n\n if (s12 !== peg$FAILED) {\n s10 = [s10, s11, s12];\n s9 = s10;\n } else {\n peg$currPos = s9;\n s9 = peg$FAILED;\n }\n } else {\n peg$currPos = s9;\n s9 = peg$FAILED;\n }\n } else {\n peg$currPos = s9;\n s9 = peg$FAILED;\n }\n\n if (s9 === peg$FAILED) {\n s9 = null;\n }\n\n if (s9 !== peg$FAILED) {\n s10 = peg$parse_();\n\n if (s10 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 125) {\n s11 = peg$c8;\n peg$currPos++;\n } else {\n s11 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c9);\n }\n }\n\n if (s11 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c31(s3, s7, s9);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parsesimpleFormatElement() {\n var s0;\n s0 = peg$parsenumberFormatElement();\n\n if (s0 === peg$FAILED) {\n s0 = peg$parsedateOrTimeFormatElement();\n }\n\n return s0;\n }\n\n function peg$parsepluralElement() {\n var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15;\n s0 = peg$currPos;\n\n if (input.charCodeAt(peg$currPos) === 123) {\n s1 = peg$c6;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c7);\n }\n }\n\n if (s1 !== peg$FAILED) {\n s2 = peg$parse_();\n\n if (s2 !== peg$FAILED) {\n s3 = peg$parseargNameOrNumber();\n\n if (s3 !== peg$FAILED) {\n s4 = peg$parse_();\n\n if (s4 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 44) {\n s5 = peg$c27;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c28);\n }\n }\n\n if (s5 !== peg$FAILED) {\n s6 = peg$parse_();\n\n if (s6 !== peg$FAILED) {\n if (input.substr(peg$currPos, 6) === peg$c46) {\n s7 = peg$c46;\n peg$currPos += 6;\n } else {\n s7 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c47);\n }\n }\n\n if (s7 === peg$FAILED) {\n if (input.substr(peg$currPos, 13) === peg$c48) {\n s7 = peg$c48;\n peg$currPos += 13;\n } else {\n s7 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c49);\n }\n }\n }\n\n if (s7 !== peg$FAILED) {\n s8 = peg$parse_();\n\n if (s8 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 44) {\n s9 = peg$c27;\n peg$currPos++;\n } else {\n s9 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c28);\n }\n }\n\n if (s9 !== peg$FAILED) {\n s10 = peg$parse_();\n\n if (s10 !== peg$FAILED) {\n s11 = peg$currPos;\n\n if (input.substr(peg$currPos, 7) === peg$c50) {\n s12 = peg$c50;\n peg$currPos += 7;\n } else {\n s12 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c51);\n }\n }\n\n if (s12 !== peg$FAILED) {\n s13 = peg$parse_();\n\n if (s13 !== peg$FAILED) {\n s14 = peg$parsenumber();\n\n if (s14 !== peg$FAILED) {\n s12 = [s12, s13, s14];\n s11 = s12;\n } else {\n peg$currPos = s11;\n s11 = peg$FAILED;\n }\n } else {\n peg$currPos = s11;\n s11 = peg$FAILED;\n }\n } else {\n peg$currPos = s11;\n s11 = peg$FAILED;\n }\n\n if (s11 === peg$FAILED) {\n s11 = null;\n }\n\n if (s11 !== peg$FAILED) {\n s12 = peg$parse_();\n\n if (s12 !== peg$FAILED) {\n s13 = [];\n s14 = peg$parsepluralOption();\n\n if (s14 !== peg$FAILED) {\n while (s14 !== peg$FAILED) {\n s13.push(s14);\n s14 = peg$parsepluralOption();\n }\n } else {\n s13 = peg$FAILED;\n }\n\n if (s13 !== peg$FAILED) {\n s14 = peg$parse_();\n\n if (s14 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 125) {\n s15 = peg$c8;\n peg$currPos++;\n } else {\n s15 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c9);\n }\n }\n\n if (s15 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c52(s3, s7, s11, s13);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parseselectElement() {\n var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13;\n s0 = peg$currPos;\n\n if (input.charCodeAt(peg$currPos) === 123) {\n s1 = peg$c6;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c7);\n }\n }\n\n if (s1 !== peg$FAILED) {\n s2 = peg$parse_();\n\n if (s2 !== peg$FAILED) {\n s3 = peg$parseargNameOrNumber();\n\n if (s3 !== peg$FAILED) {\n s4 = peg$parse_();\n\n if (s4 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 44) {\n s5 = peg$c27;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c28);\n }\n }\n\n if (s5 !== peg$FAILED) {\n s6 = peg$parse_();\n\n if (s6 !== peg$FAILED) {\n if (input.substr(peg$currPos, 6) === peg$c53) {\n s7 = peg$c53;\n peg$currPos += 6;\n } else {\n s7 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c54);\n }\n }\n\n if (s7 !== peg$FAILED) {\n s8 = peg$parse_();\n\n if (s8 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 44) {\n s9 = peg$c27;\n peg$currPos++;\n } else {\n s9 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c28);\n }\n }\n\n if (s9 !== peg$FAILED) {\n s10 = peg$parse_();\n\n if (s10 !== peg$FAILED) {\n s11 = [];\n s12 = peg$parseselectOption();\n\n if (s12 !== peg$FAILED) {\n while (s12 !== peg$FAILED) {\n s11.push(s12);\n s12 = peg$parseselectOption();\n }\n } else {\n s11 = peg$FAILED;\n }\n\n if (s11 !== peg$FAILED) {\n s12 = peg$parse_();\n\n if (s12 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 125) {\n s13 = peg$c8;\n peg$currPos++;\n } else {\n s13 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c9);\n }\n }\n\n if (s13 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c55(s3, s11);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parsepluralRuleSelectValue() {\n var s0, s1, s2, s3;\n s0 = peg$currPos;\n s1 = peg$currPos;\n\n if (input.charCodeAt(peg$currPos) === 61) {\n s2 = peg$c56;\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c57);\n }\n }\n\n if (s2 !== peg$FAILED) {\n s3 = peg$parsenumber();\n\n if (s3 !== peg$FAILED) {\n s2 = [s2, s3];\n s1 = s2;\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n\n if (s1 !== peg$FAILED) {\n s0 = input.substring(s0, peg$currPos);\n } else {\n s0 = s1;\n }\n\n if (s0 === peg$FAILED) {\n s0 = peg$parseargName();\n }\n\n return s0;\n }\n\n function peg$parseselectOption() {\n var s0, s1, s2, s3, s4, s5, s6, s7;\n s0 = peg$currPos;\n s1 = peg$parse_();\n\n if (s1 !== peg$FAILED) {\n s2 = peg$parseargName();\n\n if (s2 !== peg$FAILED) {\n s3 = peg$parse_();\n\n if (s3 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 123) {\n s4 = peg$c6;\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c7);\n }\n }\n\n if (s4 !== peg$FAILED) {\n peg$savedPos = peg$currPos;\n s5 = peg$c58(s2);\n\n if (s5) {\n s5 = undefined;\n } else {\n s5 = peg$FAILED;\n }\n\n if (s5 !== peg$FAILED) {\n s6 = peg$parsemessage();\n\n if (s6 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 125) {\n s7 = peg$c8;\n peg$currPos++;\n } else {\n s7 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c9);\n }\n }\n\n if (s7 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c59(s2, s6);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parsepluralOption() {\n var s0, s1, s2, s3, s4, s5, s6, s7;\n s0 = peg$currPos;\n s1 = peg$parse_();\n\n if (s1 !== peg$FAILED) {\n s2 = peg$parsepluralRuleSelectValue();\n\n if (s2 !== peg$FAILED) {\n s3 = peg$parse_();\n\n if (s3 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 123) {\n s4 = peg$c6;\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c7);\n }\n }\n\n if (s4 !== peg$FAILED) {\n peg$savedPos = peg$currPos;\n s5 = peg$c60(s2);\n\n if (s5) {\n s5 = undefined;\n } else {\n s5 = peg$FAILED;\n }\n\n if (s5 !== peg$FAILED) {\n s6 = peg$parsemessage();\n\n if (s6 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 125) {\n s7 = peg$c8;\n peg$currPos++;\n } else {\n s7 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c9);\n }\n }\n\n if (s7 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c61(s2, s6);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parsewhiteSpace() {\n var s0, s1;\n peg$silentFails++;\n\n if (peg$c63.test(input.charAt(peg$currPos))) {\n s0 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c64);\n }\n }\n\n peg$silentFails--;\n\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c62);\n }\n }\n\n return s0;\n }\n\n function peg$parsepatternSyntax() {\n var s0, s1;\n peg$silentFails++;\n\n if (peg$c66.test(input.charAt(peg$currPos))) {\n s0 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c67);\n }\n }\n\n peg$silentFails--;\n\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c65);\n }\n }\n\n return s0;\n }\n\n function peg$parse_() {\n var s0, s1, s2;\n peg$silentFails++;\n s0 = peg$currPos;\n s1 = [];\n s2 = peg$parsewhiteSpace();\n\n while (s2 !== peg$FAILED) {\n s1.push(s2);\n s2 = peg$parsewhiteSpace();\n }\n\n if (s1 !== peg$FAILED) {\n s0 = input.substring(s0, peg$currPos);\n } else {\n s0 = s1;\n }\n\n peg$silentFails--;\n\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c68);\n }\n }\n\n return s0;\n }\n\n function peg$parsenumber() {\n var s0, s1, s2;\n peg$silentFails++;\n s0 = peg$currPos;\n\n if (input.charCodeAt(peg$currPos) === 45) {\n s1 = peg$c70;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c71);\n }\n }\n\n if (s1 === peg$FAILED) {\n s1 = null;\n }\n\n if (s1 !== peg$FAILED) {\n s2 = peg$parseargNumber();\n\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c72(s1, s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n peg$silentFails--;\n\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c69);\n }\n }\n\n return s0;\n }\n\n function peg$parseapostrophe() {\n var s0, s1;\n peg$silentFails++;\n\n if (input.charCodeAt(peg$currPos) === 39) {\n s0 = peg$c32;\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c33);\n }\n }\n\n peg$silentFails--;\n\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c73);\n }\n }\n\n return s0;\n }\n\n function peg$parsedoubleApostrophes() {\n var s0, s1;\n peg$silentFails++;\n s0 = peg$currPos;\n\n if (input.substr(peg$currPos, 2) === peg$c75) {\n s1 = peg$c75;\n peg$currPos += 2;\n } else {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c76);\n }\n }\n\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c77();\n }\n\n s0 = s1;\n peg$silentFails--;\n\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c74);\n }\n }\n\n return s0;\n }\n\n function peg$parsequotedString() {\n var s0, s1, s2, s3, s4, s5;\n s0 = peg$currPos;\n\n if (input.charCodeAt(peg$currPos) === 39) {\n s1 = peg$c32;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c33);\n }\n }\n\n if (s1 !== peg$FAILED) {\n s2 = peg$parseescapedChar();\n\n if (s2 !== peg$FAILED) {\n s3 = peg$currPos;\n s4 = [];\n\n if (input.substr(peg$currPos, 2) === peg$c75) {\n s5 = peg$c75;\n peg$currPos += 2;\n } else {\n s5 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c76);\n }\n }\n\n if (s5 === peg$FAILED) {\n if (peg$c34.test(input.charAt(peg$currPos))) {\n s5 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c35);\n }\n }\n }\n\n while (s5 !== peg$FAILED) {\n s4.push(s5);\n\n if (input.substr(peg$currPos, 2) === peg$c75) {\n s5 = peg$c75;\n peg$currPos += 2;\n } else {\n s5 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c76);\n }\n }\n\n if (s5 === peg$FAILED) {\n if (peg$c34.test(input.charAt(peg$currPos))) {\n s5 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c35);\n }\n }\n }\n }\n\n if (s4 !== peg$FAILED) {\n s3 = input.substring(s3, peg$currPos);\n } else {\n s3 = s4;\n }\n\n if (s3 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 39) {\n s4 = peg$c32;\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c33);\n }\n }\n\n if (s4 === peg$FAILED) {\n s4 = null;\n }\n\n if (s4 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c78(s2, s3);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parseunquotedString() {\n var s0, s1, s2, s3;\n s0 = peg$currPos;\n s1 = peg$currPos;\n\n if (input.length > peg$currPos) {\n s2 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c14);\n }\n }\n\n if (s2 !== peg$FAILED) {\n peg$savedPos = peg$currPos;\n s3 = peg$c79(s2);\n\n if (s3) {\n s3 = undefined;\n } else {\n s3 = peg$FAILED;\n }\n\n if (s3 !== peg$FAILED) {\n s2 = [s2, s3];\n s1 = s2;\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n\n if (s1 === peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 10) {\n s1 = peg$c80;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c81);\n }\n }\n }\n\n if (s1 !== peg$FAILED) {\n s0 = input.substring(s0, peg$currPos);\n } else {\n s0 = s1;\n }\n\n return s0;\n }\n\n function peg$parseescapedChar() {\n var s0, s1, s2, s3;\n s0 = peg$currPos;\n s1 = peg$currPos;\n\n if (input.length > peg$currPos) {\n s2 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c14);\n }\n }\n\n if (s2 !== peg$FAILED) {\n peg$savedPos = peg$currPos;\n s3 = peg$c82(s2);\n\n if (s3) {\n s3 = undefined;\n } else {\n s3 = peg$FAILED;\n }\n\n if (s3 !== peg$FAILED) {\n s2 = [s2, s3];\n s1 = s2;\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n\n if (s1 !== peg$FAILED) {\n s0 = input.substring(s0, peg$currPos);\n } else {\n s0 = s1;\n }\n\n return s0;\n }\n\n function peg$parseargNameOrNumber() {\n var s0, s1;\n peg$silentFails++;\n s0 = peg$currPos;\n s1 = peg$parseargNumber();\n\n if (s1 === peg$FAILED) {\n s1 = peg$parseargName();\n }\n\n if (s1 !== peg$FAILED) {\n s0 = input.substring(s0, peg$currPos);\n } else {\n s0 = s1;\n }\n\n peg$silentFails--;\n\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c83);\n }\n }\n\n return s0;\n }\n\n function peg$parseargNumber() {\n var s0, s1, s2, s3, s4;\n peg$silentFails++;\n s0 = peg$currPos;\n\n if (input.charCodeAt(peg$currPos) === 48) {\n s1 = peg$c85;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c86);\n }\n }\n\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c87();\n }\n\n s0 = s1;\n\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n s1 = peg$currPos;\n\n if (peg$c88.test(input.charAt(peg$currPos))) {\n s2 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c89);\n }\n }\n\n if (s2 !== peg$FAILED) {\n s3 = [];\n\n if (peg$c90.test(input.charAt(peg$currPos))) {\n s4 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c91);\n }\n }\n\n while (s4 !== peg$FAILED) {\n s3.push(s4);\n\n if (peg$c90.test(input.charAt(peg$currPos))) {\n s4 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c91);\n }\n }\n }\n\n if (s3 !== peg$FAILED) {\n s2 = [s2, s3];\n s1 = s2;\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c92(s1);\n }\n\n s0 = s1;\n }\n\n peg$silentFails--;\n\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c84);\n }\n }\n\n return s0;\n }\n\n function peg$parseargName() {\n var s0, s1, s2, s3, s4;\n peg$silentFails++;\n s0 = peg$currPos;\n s1 = [];\n s2 = peg$currPos;\n s3 = peg$currPos;\n peg$silentFails++;\n s4 = peg$parsewhiteSpace();\n\n if (s4 === peg$FAILED) {\n s4 = peg$parsepatternSyntax();\n }\n\n peg$silentFails--;\n\n if (s4 === peg$FAILED) {\n s3 = undefined;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n\n if (s3 !== peg$FAILED) {\n if (input.length > peg$currPos) {\n s4 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c14);\n }\n }\n\n if (s4 !== peg$FAILED) {\n s3 = [s3, s4];\n s2 = s3;\n } else {\n peg$currPos = s2;\n s2 = peg$FAILED;\n }\n } else {\n peg$currPos = s2;\n s2 = peg$FAILED;\n }\n\n if (s2 !== peg$FAILED) {\n while (s2 !== peg$FAILED) {\n s1.push(s2);\n s2 = peg$currPos;\n s3 = peg$currPos;\n peg$silentFails++;\n s4 = peg$parsewhiteSpace();\n\n if (s4 === peg$FAILED) {\n s4 = peg$parsepatternSyntax();\n }\n\n peg$silentFails--;\n\n if (s4 === peg$FAILED) {\n s3 = undefined;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n\n if (s3 !== peg$FAILED) {\n if (input.length > peg$currPos) {\n s4 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c14);\n }\n }\n\n if (s4 !== peg$FAILED) {\n s3 = [s3, s4];\n s2 = s3;\n } else {\n peg$currPos = s2;\n s2 = peg$FAILED;\n }\n } else {\n peg$currPos = s2;\n s2 = peg$FAILED;\n }\n }\n } else {\n s1 = peg$FAILED;\n }\n\n if (s1 !== peg$FAILED) {\n s0 = input.substring(s0, peg$currPos);\n } else {\n s0 = s1;\n }\n\n peg$silentFails--;\n\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c93);\n }\n }\n\n return s0;\n }\n\n var messageCtx = ['root'];\n\n function isNestedMessageText() {\n return messageCtx.length > 1;\n }\n\n function isInPluralOption() {\n return messageCtx[messageCtx.length - 1] === 'plural';\n }\n\n function insertLocation() {\n return options && options.captureLocation ? {\n location: location()\n } : {};\n }\n\n peg$result = peg$startRuleFunction();\n\n if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n return peg$result;\n } else {\n if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n peg$fail(peg$endExpectation());\n }\n\n throw peg$buildStructuredError(peg$maxFailExpected, peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null, peg$maxFailPos < input.length ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1) : peg$computeLocation(peg$maxFailPos, peg$maxFailPos));\n }\n}\n\nvar pegParse = peg$parse;\n;// CONCATENATED MODULE: ./node_modules/intl-messageformat-parser/lib/normalize.js\nvar __spreadArrays = undefined && undefined.__spreadArrays || function () {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) {\n s += arguments[i].length;\n }\n\n for (var r = Array(s), k = 0, i = 0; i < il; i++) {\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) {\n r[k] = a[j];\n }\n }\n\n return r;\n};\n\n\n\nvar PLURAL_HASHTAG_REGEX = /(^|[^\\\\])#/g;\n/**\n * Whether to convert `#` in plural rule options\n * to `{var, number}`\n * @param el AST Element\n * @param pluralStack current plural stack\n */\n\nfunction normalizeHashtagInPlural(els) {\n els.forEach(function (el) {\n // If we're encountering a plural el\n if (!isPluralElement(el) && !isSelectElement(el)) {\n return;\n } // Go down the options and search for # in any literal element\n\n\n Object.keys(el.options).forEach(function (id) {\n var _a;\n\n var opt = el.options[id]; // If we got a match, we have to split this\n // and inject a NumberElement in the middle\n\n var matchingLiteralElIndex = -1;\n var literalEl = undefined;\n\n for (var i = 0; i < opt.value.length; i++) {\n var el_1 = opt.value[i];\n\n if (isLiteralElement(el_1) && PLURAL_HASHTAG_REGEX.test(el_1.value)) {\n matchingLiteralElIndex = i;\n literalEl = el_1;\n break;\n }\n }\n\n if (literalEl) {\n var newValue = literalEl.value.replace(PLURAL_HASHTAG_REGEX, \"$1{\" + el.value + \", number}\");\n var newEls = pegParse(newValue);\n\n (_a = opt.value).splice.apply(_a, __spreadArrays([matchingLiteralElIndex, 1], newEls));\n }\n\n normalizeHashtagInPlural(opt.value);\n });\n });\n}\n;// CONCATENATED MODULE: ./node_modules/intl-messageformat-parser/lib/index.js\n\n\n\n\n\nfunction parse(input, opts) {\n var els = pegParse(input, opts);\n\n if (!opts || opts.normalizeHashtagInPlural !== false) {\n normalizeHashtagInPlural(els);\n }\n\n return els;\n}\n;// CONCATENATED MODULE: ./node_modules/intl-format-cache/lib/index.js\n/*\nCopyright (c) 2014, Yahoo! Inc. All rights reserved.\nCopyrights licensed under the New BSD License.\nSee the accompanying LICENSE file for terms.\n*/\nvar lib_spreadArrays = undefined && undefined.__spreadArrays || function () {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) {\n s += arguments[i].length;\n }\n\n for (var r = Array(s), k = 0, i = 0; i < il; i++) {\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) {\n r[k] = a[j];\n }\n }\n\n return r;\n}; // -- Utilities ----------------------------------------------------------------\n\n\nfunction getCacheId(inputs) {\n return JSON.stringify(inputs.map(function (input) {\n return input && typeof input === 'object' ? orderedProps(input) : input;\n }));\n}\n\nfunction orderedProps(obj) {\n return Object.keys(obj).sort().map(function (k) {\n var _a;\n\n return _a = {}, _a[k] = obj[k], _a;\n });\n}\n\nvar memoizeFormatConstructor = function memoizeFormatConstructor(FormatConstructor, cache) {\n if (cache === void 0) {\n cache = {};\n }\n\n return function () {\n var _a;\n\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n var cacheId = getCacheId(args);\n var format = cacheId && cache[cacheId];\n\n if (!format) {\n format = new ((_a = FormatConstructor).bind.apply(_a, lib_spreadArrays([void 0], args)))();\n\n if (cacheId) {\n cache[cacheId] = format;\n }\n }\n\n return format;\n };\n};\n\n/* harmony default export */ var lib = (memoizeFormatConstructor);\n;// CONCATENATED MODULE: ./node_modules/intl-messageformat-parser/lib/skeleton.js\nvar skeleton_assign = undefined && undefined.__assign || function () {\n skeleton_assign = Object.assign || function (t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n\n for (var p in s) {\n if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n }\n\n return t;\n };\n\n return skeleton_assign.apply(this, arguments);\n};\n/**\n * https://unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table\n * Credit: https://github.com/caridy/intl-datetimeformat-pattern/blob/master/index.js\n * with some tweaks\n */\n\n\nvar DATE_TIME_REGEX = /(?:[Eec]{1,6}|G{1,5}|[Qq]{1,5}|(?:[yYur]+|U{1,5})|[ML]{1,5}|d{1,2}|D{1,3}|F{1}|[abB]{1,5}|[hkHK]{1,2}|w{1,2}|W{1}|m{1,2}|s{1,2}|[zZOvVxX]{1,4})(?=([^']*'[^']*')*[^']*$)/g;\n/**\n * Parse Date time skeleton into Intl.DateTimeFormatOptions\n * Ref: https://unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table\n * @public\n * @param skeleton skeleton string\n */\n\nfunction parseDateTimeSkeleton(skeleton) {\n var result = {};\n skeleton.replace(DATE_TIME_REGEX, function (match) {\n var len = match.length;\n\n switch (match[0]) {\n // Era\n case 'G':\n result.era = len === 4 ? 'long' : len === 5 ? 'narrow' : 'short';\n break;\n // Year\n\n case 'y':\n result.year = len === 2 ? '2-digit' : 'numeric';\n break;\n\n case 'Y':\n case 'u':\n case 'U':\n case 'r':\n throw new RangeError('`Y/u/U/r` (year) patterns are not supported, use `y` instead');\n // Quarter\n\n case 'q':\n case 'Q':\n throw new RangeError('`q/Q` (quarter) patterns are not supported');\n // Month\n\n case 'M':\n case 'L':\n result.month = ['numeric', '2-digit', 'short', 'long', 'narrow'][len - 1];\n break;\n // Week\n\n case 'w':\n case 'W':\n throw new RangeError('`w/W` (week) patterns are not supported');\n\n case 'd':\n result.day = ['numeric', '2-digit'][len - 1];\n break;\n\n case 'D':\n case 'F':\n case 'g':\n throw new RangeError('`D/F/g` (day) patterns are not supported, use `d` instead');\n // Weekday\n\n case 'E':\n result.weekday = len === 4 ? 'short' : len === 5 ? 'narrow' : 'short';\n break;\n\n case 'e':\n if (len < 4) {\n throw new RangeError('`e..eee` (weekday) patterns are not supported');\n }\n\n result.weekday = ['short', 'long', 'narrow', 'short'][len - 4];\n break;\n\n case 'c':\n if (len < 4) {\n throw new RangeError('`c..ccc` (weekday) patterns are not supported');\n }\n\n result.weekday = ['short', 'long', 'narrow', 'short'][len - 4];\n break;\n // Period\n\n case 'a':\n // AM, PM\n result.hour12 = true;\n break;\n\n case 'b': // am, pm, noon, midnight\n\n case 'B':\n // flexible day periods\n throw new RangeError('`b/B` (period) patterns are not supported, use `a` instead');\n // Hour\n\n case 'h':\n result.hourCycle = 'h12';\n result.hour = ['numeric', '2-digit'][len - 1];\n break;\n\n case 'H':\n result.hourCycle = 'h23';\n result.hour = ['numeric', '2-digit'][len - 1];\n break;\n\n case 'K':\n result.hourCycle = 'h11';\n result.hour = ['numeric', '2-digit'][len - 1];\n break;\n\n case 'k':\n result.hourCycle = 'h24';\n result.hour = ['numeric', '2-digit'][len - 1];\n break;\n\n case 'j':\n case 'J':\n case 'C':\n throw new RangeError('`j/J/C` (hour) patterns are not supported, use `h/H/K/k` instead');\n // Minute\n\n case 'm':\n result.minute = ['numeric', '2-digit'][len - 1];\n break;\n // Second\n\n case 's':\n result.second = ['numeric', '2-digit'][len - 1];\n break;\n\n case 'S':\n case 'A':\n throw new RangeError('`S/A` (second) pattenrs are not supported, use `s` instead');\n // Zone\n\n case 'z':\n // 1..3, 4: specific non-location format\n result.timeZoneName = len < 4 ? 'short' : 'long';\n break;\n\n case 'Z': // 1..3, 4, 5: The ISO8601 varios formats\n\n case 'O': // 1, 4: miliseconds in day short, long\n\n case 'v': // 1, 4: generic non-location format\n\n case 'V': // 1, 2, 3, 4: time zone ID or city\n\n case 'X': // 1, 2, 3, 4: The ISO8601 varios formats\n\n case 'x':\n // 1, 2, 3, 4: The ISO8601 varios formats\n throw new RangeError('`Z/O/v/V/X/x` (timeZone) pattenrs are not supported, use `z` instead');\n }\n\n return '';\n });\n return result;\n}\n\nfunction icuUnitToEcma(unit) {\n return unit.replace(/^(.*?)-/, '');\n}\n\nvar FRACTION_PRECISION_REGEX = /^\\.(?:(0+)(\\+|#+)?)?$/g;\nvar SIGNIFICANT_PRECISION_REGEX = /^(@+)?(\\+|#+)?$/g;\n\nfunction parseSignificantPrecision(str) {\n var result = {};\n str.replace(SIGNIFICANT_PRECISION_REGEX, function (_, g1, g2) {\n // @@@ case\n if (typeof g2 !== 'string') {\n result.minimumSignificantDigits = g1.length;\n result.maximumSignificantDigits = g1.length;\n } // @@@+ case\n else if (g2 === '+') {\n result.minimumSignificantDigits = g1.length;\n } // .### case\n else if (g1[0] === '#') {\n result.maximumSignificantDigits = g1.length;\n } // .@@## or .@@@ case\n else {\n result.minimumSignificantDigits = g1.length;\n result.maximumSignificantDigits = g1.length + (typeof g2 === 'string' ? g2.length : 0);\n }\n\n return '';\n });\n return result;\n}\n\nfunction parseSign(str) {\n switch (str) {\n case 'sign-auto':\n return {\n signDisplay: 'auto'\n };\n\n case 'sign-accounting':\n return {\n currencySign: 'accounting'\n };\n\n case 'sign-always':\n return {\n signDisplay: 'always'\n };\n\n case 'sign-accounting-always':\n return {\n signDisplay: 'always',\n currencySign: 'accounting'\n };\n\n case 'sign-except-zero':\n return {\n signDisplay: 'exceptZero'\n };\n\n case 'sign-accounting-except-zero':\n return {\n signDisplay: 'exceptZero',\n currencySign: 'accounting'\n };\n\n case 'sign-never':\n return {\n signDisplay: 'never'\n };\n }\n}\n\nfunction parseNotationOptions(opt) {\n var result = {};\n var signOpts = parseSign(opt);\n\n if (signOpts) {\n return signOpts;\n }\n\n return result;\n}\n/**\n * https://github.com/unicode-org/icu/blob/master/docs/userguide/format_parse/numbers/skeletons.md#skeleton-stems-and-options\n */\n\n\nfunction convertNumberSkeletonToNumberFormatOptions(tokens) {\n var result = {};\n\n for (var _i = 0, tokens_1 = tokens; _i < tokens_1.length; _i++) {\n var token = tokens_1[_i];\n\n switch (token.stem) {\n case 'percent':\n result.style = 'percent';\n continue;\n\n case 'currency':\n result.style = 'currency';\n result.currency = token.options[0];\n continue;\n\n case 'group-off':\n result.useGrouping = false;\n continue;\n\n case 'precision-integer':\n result.maximumFractionDigits = 0;\n continue;\n\n case 'measure-unit':\n result.style = 'unit';\n result.unit = icuUnitToEcma(token.options[0]);\n continue;\n\n case 'compact-short':\n result.notation = 'compact';\n result.compactDisplay = 'short';\n continue;\n\n case 'compact-long':\n result.notation = 'compact';\n result.compactDisplay = 'long';\n continue;\n\n case 'scientific':\n result = skeleton_assign(skeleton_assign(skeleton_assign({}, result), {\n notation: 'scientific'\n }), token.options.reduce(function (all, opt) {\n return skeleton_assign(skeleton_assign({}, all), parseNotationOptions(opt));\n }, {}));\n continue;\n\n case 'engineering':\n result = skeleton_assign(skeleton_assign(skeleton_assign({}, result), {\n notation: 'engineering'\n }), token.options.reduce(function (all, opt) {\n return skeleton_assign(skeleton_assign({}, all), parseNotationOptions(opt));\n }, {}));\n continue;\n\n case 'notation-simple':\n result.notation = 'standard';\n continue;\n // https://github.com/unicode-org/icu/blob/master/icu4c/source/i18n/unicode/unumberformatter.h\n\n case 'unit-width-narrow':\n result.currencyDisplay = 'narrowSymbol';\n result.unitDisplay = 'narrow';\n continue;\n\n case 'unit-width-short':\n result.currencyDisplay = 'code';\n result.unitDisplay = 'short';\n continue;\n\n case 'unit-width-full-name':\n result.currencyDisplay = 'name';\n result.unitDisplay = 'long';\n continue;\n\n case 'unit-width-iso-code':\n result.currencyDisplay = 'symbol';\n continue;\n } // Precision\n // https://github.com/unicode-org/icu/blob/master/docs/userguide/format_parse/numbers/skeletons.md#fraction-precision\n\n\n if (FRACTION_PRECISION_REGEX.test(token.stem)) {\n if (token.options.length > 1) {\n throw new RangeError('Fraction-precision stems only accept a single optional option');\n }\n\n token.stem.replace(FRACTION_PRECISION_REGEX, function (match, g1, g2) {\n // precision-integer case\n if (match === '.') {\n result.maximumFractionDigits = 0;\n } // .000+ case\n else if (g2 === '+') {\n result.minimumFractionDigits = g2.length;\n } // .### case\n else if (g1[0] === '#') {\n result.maximumFractionDigits = g1.length;\n } // .00## or .000 case\n else {\n result.minimumFractionDigits = g1.length;\n result.maximumFractionDigits = g1.length + (typeof g2 === 'string' ? g2.length : 0);\n }\n\n return '';\n });\n\n if (token.options.length) {\n result = skeleton_assign(skeleton_assign({}, result), parseSignificantPrecision(token.options[0]));\n }\n\n continue;\n }\n\n if (SIGNIFICANT_PRECISION_REGEX.test(token.stem)) {\n result = skeleton_assign(skeleton_assign({}, result), parseSignificantPrecision(token.stem));\n continue;\n }\n\n var signOpts = parseSign(token.stem);\n\n if (signOpts) {\n result = skeleton_assign(skeleton_assign({}, result), signOpts);\n }\n }\n\n return result;\n}\n;// CONCATENATED MODULE: ./node_modules/intl-messageformat/lib/formatters.js\nvar formatters_extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (b.hasOwnProperty(p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n\nvar formatters_spreadArrays = undefined && undefined.__spreadArrays || function () {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) {\n s += arguments[i].length;\n }\n\n for (var r = Array(s), k = 0, i = 0; i < il; i++) {\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) {\n r[k] = a[j];\n }\n }\n\n return r;\n};\n\n\n\nvar FormatError =\n/** @class */\nfunction (_super) {\n formatters_extends(FormatError, _super);\n\n function FormatError(msg, variableId) {\n var _this = _super.call(this, msg) || this;\n\n _this.variableId = variableId;\n return _this;\n }\n\n return FormatError;\n}(Error);\n\nfunction mergeLiteral(parts) {\n if (parts.length < 2) {\n return parts;\n }\n\n return parts.reduce(function (all, part) {\n var lastPart = all[all.length - 1];\n\n if (!lastPart || lastPart.type !== 0\n /* literal */\n || part.type !== 0\n /* literal */\n ) {\n all.push(part);\n } else {\n lastPart.value += part.value;\n }\n\n return all;\n }, []);\n} // TODO(skeleton): add skeleton support\n\n\nfunction formatToParts(els, locales, formatters, formats, values, currentPluralValue, // For debugging\noriginalMessage) {\n // Hot path for straight simple msg translations\n if (els.length === 1 && isLiteralElement(els[0])) {\n return [{\n type: 0\n /* literal */\n ,\n value: els[0].value\n }];\n }\n\n var result = [];\n\n for (var _i = 0, els_1 = els; _i < els_1.length; _i++) {\n var el = els_1[_i]; // Exit early for string parts.\n\n if (isLiteralElement(el)) {\n result.push({\n type: 0\n /* literal */\n ,\n value: el.value\n });\n continue;\n } // TODO: should this part be literal type?\n // Replace `#` in plural rules with the actual numeric value.\n\n\n if (isPoundElement(el)) {\n if (typeof currentPluralValue === 'number') {\n result.push({\n type: 0\n /* literal */\n ,\n value: formatters.getNumberFormat(locales).format(currentPluralValue)\n });\n }\n\n continue;\n }\n\n var varName = el.value; // Enforce that all required values are provided by the caller.\n\n if (!(values && varName in values)) {\n throw new FormatError(\"The intl string context variable \\\"\" + varName + \"\\\" was not provided to the string \\\"\" + originalMessage + \"\\\"\");\n }\n\n var value = values[varName];\n\n if (isArgumentElement(el)) {\n if (!value || typeof value === 'string' || typeof value === 'number') {\n value = typeof value === 'string' || typeof value === 'number' ? String(value) : '';\n }\n\n result.push({\n type: 1\n /* argument */\n ,\n value: value\n });\n continue;\n } // Recursively format plural and select parts' option — which can be a\n // nested pattern structure. The choosing of the option to use is\n // abstracted-by and delegated-to the part helper object.\n\n\n if (isDateElement(el)) {\n var style = typeof el.style === 'string' ? formats.date[el.style] : undefined;\n result.push({\n type: 0\n /* literal */\n ,\n value: formatters.getDateTimeFormat(locales, style).format(value)\n });\n continue;\n }\n\n if (isTimeElement(el)) {\n var style = typeof el.style === 'string' ? formats.time[el.style] : isDateTimeSkeleton(el.style) ? parseDateTimeSkeleton(el.style.pattern) : undefined;\n result.push({\n type: 0\n /* literal */\n ,\n value: formatters.getDateTimeFormat(locales, style).format(value)\n });\n continue;\n }\n\n if (isNumberElement(el)) {\n var style = typeof el.style === 'string' ? formats.number[el.style] : isNumberSkeleton(el.style) ? convertNumberSkeletonToNumberFormatOptions(el.style.tokens) : undefined;\n result.push({\n type: 0\n /* literal */\n ,\n value: formatters.getNumberFormat(locales, style).format(value)\n });\n continue;\n }\n\n if (isSelectElement(el)) {\n var opt = el.options[value] || el.options.other;\n\n if (!opt) {\n throw new RangeError(\"Invalid values for \\\"\" + el.value + \"\\\": \\\"\" + value + \"\\\". Options are \\\"\" + Object.keys(el.options).join('\", \"') + \"\\\"\");\n }\n\n result.push.apply(result, formatToParts(opt.value, locales, formatters, formats, values));\n continue;\n }\n\n if (isPluralElement(el)) {\n var opt = el.options[\"=\" + value];\n\n if (!opt) {\n if (!Intl.PluralRules) {\n throw new FormatError(\"Intl.PluralRules is not available in this environment.\\nTry polyfilling it using \\\"@formatjs/intl-pluralrules\\\"\\n\");\n }\n\n var rule = formatters.getPluralRules(locales, {\n type: el.pluralType\n }).select(value - (el.offset || 0));\n opt = el.options[rule] || el.options.other;\n }\n\n if (!opt) {\n throw new RangeError(\"Invalid values for \\\"\" + el.value + \"\\\": \\\"\" + value + \"\\\". Options are \\\"\" + Object.keys(el.options).join('\", \"') + \"\\\"\");\n }\n\n result.push.apply(result, formatToParts(opt.value, locales, formatters, formats, values, value - (el.offset || 0)));\n continue;\n }\n }\n\n return mergeLiteral(result);\n}\nfunction formatToString(els, locales, formatters, formats, values, // For debugging\noriginalMessage) {\n var parts = formatToParts(els, locales, formatters, formats, values, undefined, originalMessage); // Hot path for straight simple msg translations\n\n if (parts.length === 1) {\n return parts[0].value;\n }\n\n return parts.reduce(function (all, part) {\n return all += part.value;\n }, '');\n} // Singleton\n\nvar domParser;\nvar TOKEN_DELIMITER = '@@';\nvar TOKEN_REGEX = /@@(\\d+_\\d+)@@/g;\nvar counter = 0;\n\nfunction generateId() {\n return Date.now() + \"_\" + ++counter;\n}\n\nfunction restoreRichPlaceholderMessage(text, objectParts) {\n return text.split(TOKEN_REGEX).filter(Boolean).map(function (c) {\n return objectParts[c] != null ? objectParts[c] : c;\n }).reduce(function (all, c) {\n if (!all.length) {\n all.push(c);\n } else if (typeof c === 'string' && typeof all[all.length - 1] === 'string') {\n all[all.length - 1] += c;\n } else {\n all.push(c);\n }\n\n return all;\n }, []);\n}\n/**\n * Not exhaustive, just for sanity check\n */\n\n\nvar SIMPLE_XML_REGEX = /(<([0-9a-zA-Z-_]*?)>(.*?)<\\/([0-9a-zA-Z-_]*?)>)|(<[0-9a-zA-Z-_]*?\\/>)/;\nvar TEMPLATE_ID = Date.now() + '@@';\nvar VOID_ELEMENTS = ['area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', 'track', 'wbr'];\n\nfunction formatHTMLElement(el, objectParts, values) {\n var tagName = el.tagName;\n var outerHTML = el.outerHTML,\n textContent = el.textContent,\n childNodes = el.childNodes; // Regular text\n\n if (!tagName) {\n return restoreRichPlaceholderMessage(textContent || '', objectParts);\n }\n\n tagName = tagName.toLowerCase();\n var isVoidElement = ~VOID_ELEMENTS.indexOf(tagName);\n var formatFnOrValue = values[tagName];\n\n if (formatFnOrValue && isVoidElement) {\n throw new FormatError(tagName + \" is a self-closing tag and can not be used, please use another tag name.\");\n }\n\n if (!childNodes.length) {\n return [outerHTML];\n }\n\n var chunks = Array.prototype.slice.call(childNodes).reduce(function (all, child) {\n return all.concat(formatHTMLElement(child, objectParts, values));\n }, []); // Legacy HTML\n\n if (!formatFnOrValue) {\n return formatters_spreadArrays([\"<\" + tagName + \">\"], chunks, [\"\"]);\n } // HTML Tag replacement\n\n\n if (typeof formatFnOrValue === 'function') {\n return [formatFnOrValue.apply(void 0, chunks)];\n }\n\n return [formatFnOrValue];\n}\n\nfunction formatHTMLMessage(els, locales, formatters, formats, values, // For debugging\noriginalMessage) {\n var parts = formatToParts(els, locales, formatters, formats, values, undefined, originalMessage);\n var objectParts = {};\n var formattedMessage = parts.reduce(function (all, part) {\n if (part.type === 0\n /* literal */\n ) {\n return all += part.value;\n }\n\n var id = generateId();\n objectParts[id] = part.value;\n return all += \"\" + TOKEN_DELIMITER + id + TOKEN_DELIMITER;\n }, ''); // Not designed to filter out aggressively\n\n if (!SIMPLE_XML_REGEX.test(formattedMessage)) {\n return restoreRichPlaceholderMessage(formattedMessage, objectParts);\n }\n\n if (!values) {\n throw new FormatError('Message has placeholders but no values was given');\n }\n\n if (typeof DOMParser === 'undefined') {\n throw new FormatError('Cannot format XML message without DOMParser');\n }\n\n if (!domParser) {\n domParser = new DOMParser();\n }\n\n var content = domParser.parseFromString(\"\" + formattedMessage + \"\", 'text/html').getElementById(TEMPLATE_ID);\n\n if (!content) {\n throw new FormatError(\"Malformed HTML message \" + formattedMessage);\n }\n\n var tagsToFormat = Object.keys(values).filter(function (varName) {\n return !!content.getElementsByTagName(varName).length;\n }); // No tags to format\n\n if (!tagsToFormat.length) {\n return restoreRichPlaceholderMessage(formattedMessage, objectParts);\n }\n\n var caseSensitiveTags = tagsToFormat.filter(function (tagName) {\n return tagName !== tagName.toLowerCase();\n });\n\n if (caseSensitiveTags.length) {\n throw new FormatError(\"HTML tag must be lowercased but the following tags are not: \" + caseSensitiveTags.join(', '));\n } // We're doing this since top node is `` which does not have a formatter\n\n\n return Array.prototype.slice.call(content.childNodes).reduce(function (all, child) {\n return all.concat(formatHTMLElement(child, objectParts, values));\n }, []);\n}\n;// CONCATENATED MODULE: ./node_modules/intl-messageformat/lib/core.js\n/*\nCopyright (c) 2014, Yahoo! Inc. All rights reserved.\nCopyrights licensed under the New BSD License.\nSee the accompanying LICENSE file for terms.\n*/\nvar core_assign = undefined && undefined.__assign || function () {\n core_assign = Object.assign || function (t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n\n for (var p in s) {\n if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n }\n\n return t;\n };\n\n return core_assign.apply(this, arguments);\n};\n\n\n\n // -- MessageFormat --------------------------------------------------------\n\nfunction mergeConfig(c1, c2) {\n if (!c2) {\n return c1;\n }\n\n return core_assign(core_assign(core_assign({}, c1 || {}), c2 || {}), Object.keys(c1).reduce(function (all, k) {\n all[k] = core_assign(core_assign({}, c1[k]), c2[k] || {});\n return all;\n }, {}));\n}\n\nfunction mergeConfigs(defaultConfig, configs) {\n if (!configs) {\n return defaultConfig;\n }\n\n return Object.keys(defaultConfig).reduce(function (all, k) {\n all[k] = mergeConfig(defaultConfig[k], configs[k]);\n return all;\n }, core_assign({}, defaultConfig));\n}\n\nfunction createDefaultFormatters(cache) {\n if (cache === void 0) {\n cache = {\n number: {},\n dateTime: {},\n pluralRules: {}\n };\n }\n\n return {\n getNumberFormat: lib(Intl.NumberFormat, cache.number),\n getDateTimeFormat: lib(Intl.DateTimeFormat, cache.dateTime),\n getPluralRules: lib(Intl.PluralRules, cache.pluralRules)\n };\n}\n\nvar IntlMessageFormat =\n/** @class */\nfunction () {\n function IntlMessageFormat(message, locales, overrideFormats, opts) {\n var _this = this;\n\n if (locales === void 0) {\n locales = IntlMessageFormat.defaultLocale;\n }\n\n this.formatterCache = {\n number: {},\n dateTime: {},\n pluralRules: {}\n };\n\n this.format = function (values) {\n return formatToString(_this.ast, _this.locales, _this.formatters, _this.formats, values, _this.message);\n };\n\n this.formatToParts = function (values) {\n return formatToParts(_this.ast, _this.locales, _this.formatters, _this.formats, values, undefined, _this.message);\n };\n\n this.formatHTMLMessage = function (values) {\n return formatHTMLMessage(_this.ast, _this.locales, _this.formatters, _this.formats, values, _this.message);\n };\n\n this.resolvedOptions = function () {\n return {\n locale: Intl.NumberFormat.supportedLocalesOf(_this.locales)[0]\n };\n };\n\n this.getAst = function () {\n return _this.ast;\n };\n\n if (typeof message === 'string') {\n this.message = message;\n\n if (!IntlMessageFormat.__parse) {\n throw new TypeError('IntlMessageFormat.__parse must be set to process `message` of type `string`');\n } // Parse string messages into an AST.\n\n\n this.ast = IntlMessageFormat.__parse(message, {\n normalizeHashtagInPlural: false\n });\n } else {\n this.ast = message;\n }\n\n if (!Array.isArray(this.ast)) {\n throw new TypeError('A message must be provided as a String or AST.');\n } // Creates a new object with the specified `formats` merged with the default\n // formats.\n\n\n this.formats = mergeConfigs(IntlMessageFormat.formats, overrideFormats); // Defined first because it's used to build the format pattern.\n\n this.locales = locales;\n this.formatters = opts && opts.formatters || createDefaultFormatters(this.formatterCache);\n }\n\n IntlMessageFormat.defaultLocale = new Intl.NumberFormat().resolvedOptions().locale;\n IntlMessageFormat.__parse = parse; // Default format options used as the prototype of the `formats` provided to the\n // constructor. These are used when constructing the internal Intl.NumberFormat\n // and Intl.DateTimeFormat instances.\n\n IntlMessageFormat.formats = {\n number: {\n currency: {\n style: 'currency'\n },\n percent: {\n style: 'percent'\n }\n },\n date: {\n short: {\n month: 'numeric',\n day: 'numeric',\n year: '2-digit'\n },\n medium: {\n month: 'short',\n day: 'numeric',\n year: 'numeric'\n },\n long: {\n month: 'long',\n day: 'numeric',\n year: 'numeric'\n },\n full: {\n weekday: 'long',\n month: 'long',\n day: 'numeric',\n year: 'numeric'\n }\n },\n time: {\n short: {\n hour: 'numeric',\n minute: 'numeric'\n },\n medium: {\n hour: 'numeric',\n minute: 'numeric',\n second: 'numeric'\n },\n long: {\n hour: 'numeric',\n minute: 'numeric',\n second: 'numeric',\n timeZoneName: 'short'\n },\n full: {\n hour: 'numeric',\n minute: 'numeric',\n second: 'numeric',\n timeZoneName: 'short'\n }\n }\n };\n return IntlMessageFormat;\n}();\n\n\n/* harmony default export */ var core = (IntlMessageFormat);\n;// CONCATENATED MODULE: ./node_modules/intl-messageformat/lib/index.js\n/*\nCopyright (c) 2014, Yahoo! Inc. All rights reserved.\nCopyrights licensed under the New BSD License.\nSee the accompanying LICENSE file for terms.\n*/\n\n\n\n/* harmony default export */ var intl_messageformat_lib = (core);\n// EXTERNAL MODULE: ./node_modules/@formatjs/intl-utils/lib/invariant.js\nvar invariant = __webpack_require__(5981);\n;// CONCATENATED MODULE: ./node_modules/react-intl/lib/utils.js\n/*\nHTML escaping is the same as React's\n(on purpose.) Therefore, it has the following Copyright and Licensing:\n\nCopyright 2013-2014, Facebook, Inc.\nAll rights reserved.\n\nThis source code is licensed under the BSD-style license found in the LICENSE\nfile in the root directory of React's source tree.\n*/\n\n\n\n\nvar ESCAPED_CHARS = {\n 38: '&',\n 62: '>',\n 60: '<',\n 34: '"',\n 39: '''\n};\nvar UNSAFE_CHARS_REGEX = /[&><\"']/g;\nfunction utils_escape(str) {\n return ('' + str).replace(UNSAFE_CHARS_REGEX, function (match) {\n return ESCAPED_CHARS[match.charCodeAt(0)];\n });\n}\nfunction filterProps(props, whitelist) {\n var defaults = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n return whitelist.reduce(function (filtered, name) {\n if (name in props) {\n filtered[name] = props[name];\n } else if (name in defaults) {\n filtered[name] = defaults[name];\n }\n\n return filtered;\n }, {});\n}\nfunction invariantIntlContext(intl) {\n (0,invariant/* invariant */.k)(intl, '[React Intl] Could not find required `intl` object. ' + ' needs to exist in the component ancestry.');\n}\nfunction createError(message, exception) {\n var eMsg = exception ? \"\\n\".concat(exception.stack) : '';\n return \"[React Intl] \".concat(message).concat(eMsg);\n}\nfunction defaultErrorHandler(error) {\n if (false) {}\n}\nvar DEFAULT_INTL_CONFIG = {\n formats: {},\n messages: {},\n timeZone: undefined,\n textComponent: react.Fragment,\n defaultLocale: 'en',\n defaultFormats: {},\n onError: defaultErrorHandler\n};\nfunction createIntlCache() {\n return {\n dateTime: {},\n number: {},\n message: {},\n relativeTime: {},\n pluralRules: {},\n list: {},\n displayNames: {}\n };\n}\n/**\n * Create intl formatters and populate cache\n * @param cache explicit cache to prevent leaking memory\n */\n\nfunction createFormatters() {\n var cache = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : createIntlCache();\n var RelativeTimeFormat = Intl.RelativeTimeFormat;\n var ListFormat = Intl.ListFormat;\n var DisplayNames = Intl.DisplayNames;\n return {\n getDateTimeFormat: lib(Intl.DateTimeFormat, cache.dateTime),\n getNumberFormat: lib(Intl.NumberFormat, cache.number),\n getMessageFormat: lib(intl_messageformat_lib, cache.message),\n getRelativeTimeFormat: lib(RelativeTimeFormat, cache.relativeTime),\n getPluralRules: lib(Intl.PluralRules, cache.pluralRules),\n getListFormat: lib(ListFormat, cache.list),\n getDisplayNames: lib(DisplayNames, cache.displayNames)\n };\n}\nfunction getNamedFormat(formats, type, name, onError) {\n var formatType = formats && formats[type];\n var format;\n\n if (formatType) {\n format = formatType[name];\n }\n\n if (format) {\n return format;\n }\n\n onError(createError(\"No \".concat(type, \" format named: \").concat(name)));\n}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/defineProperty.js\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n// EXTERNAL MODULE: ./node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js\nvar hoist_non_react_statics_cjs = __webpack_require__(5706);\nvar hoist_non_react_statics_cjs_default = /*#__PURE__*/__webpack_require__.n(hoist_non_react_statics_cjs);\n;// CONCATENATED MODULE: ./node_modules/react-intl/lib/components/injectIntl.js\n\n\n // Since rollup cannot deal with namespace being a function,\n// this is to interop with TypeScript since `invariant`\n// does not export a default\n// https://github.com/rollup/rollup/issues/1267\n\nvar hoistNonReactStatics = (hoist_non_react_statics_cjs_default()) || hoist_non_react_statics_cjs;\n\n\nfunction getDisplayName(Component) {\n return Component.displayName || Component.name || 'Component';\n} // TODO: We should provide initial value here\n\n\nvar IntlContext = react.createContext(null);\nvar IntlConsumer = IntlContext.Consumer,\n IntlProvider = IntlContext.Provider;\nvar Provider = IntlProvider;\nvar Context = IntlContext;\nfunction injectIntl(WrappedComponent, options) {\n var _ref = options || {},\n _ref$intlPropName = _ref.intlPropName,\n intlPropName = _ref$intlPropName === void 0 ? 'intl' : _ref$intlPropName,\n _ref$forwardRef = _ref.forwardRef,\n forwardRef = _ref$forwardRef === void 0 ? false : _ref$forwardRef,\n _ref$enforceContext = _ref.enforceContext,\n enforceContext = _ref$enforceContext === void 0 ? true : _ref$enforceContext;\n\n var WithIntl = function WithIntl(props) {\n return react.createElement(IntlConsumer, null, function (intl) {\n if (enforceContext) {\n invariantIntlContext(intl);\n }\n\n return react.createElement(WrappedComponent, Object.assign({}, props, _defineProperty({}, intlPropName, intl), {\n ref: forwardRef ? props.forwardedRef : null\n }));\n });\n };\n\n WithIntl.displayName = \"injectIntl(\".concat(getDisplayName(WrappedComponent), \")\");\n WithIntl.WrappedComponent = WrappedComponent;\n\n if (forwardRef) {\n return hoistNonReactStatics(react.forwardRef(function (props, ref) {\n return react.createElement(WithIntl, Object.assign({}, props, {\n forwardedRef: ref\n }));\n }), WrappedComponent);\n }\n\n return hoistNonReactStatics(WithIntl, WrappedComponent);\n}\n;// CONCATENATED MODULE: ./node_modules/react-intl/lib/components/createFormattedComponent.js\nvar __rest = undefined && undefined.__rest || function (s, e) {\n var t = {};\n\n for (var p in s) {\n if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];\n }\n\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];\n }\n return t;\n};\n\n\n\n\nvar DisplayName;\n\n(function (DisplayName) {\n DisplayName[\"formatDate\"] = \"FormattedDate\";\n DisplayName[\"formatTime\"] = \"FormattedTime\";\n DisplayName[\"formatNumber\"] = \"FormattedNumber\";\n DisplayName[\"formatList\"] = \"FormattedList\"; // Note that this DisplayName is the locale display name, not to be confused with\n // the name of the enum, which is for React component display name in dev tools.\n\n DisplayName[\"formatDisplayName\"] = \"FormattedDisplayName\";\n})(DisplayName || (DisplayName = {}));\n\nvar DisplayNameParts;\n\n(function (DisplayNameParts) {\n DisplayNameParts[\"formatDate\"] = \"FormattedDateParts\";\n DisplayNameParts[\"formatTime\"] = \"FormattedTimeParts\";\n DisplayNameParts[\"formatNumber\"] = \"FormattedNumberParts\";\n DisplayNameParts[\"formatList\"] = \"FormattedListParts\";\n})(DisplayNameParts || (DisplayNameParts = {}));\n\nvar FormattedNumberParts = function FormattedNumberParts(props) {\n return react.createElement(Context.Consumer, null, function (intl) {\n invariantIntlContext(intl);\n\n var value = props.value,\n children = props.children,\n formatProps = __rest(props, [\"value\", \"children\"]);\n\n return children(intl.formatNumberToParts(value, formatProps));\n });\n};\nFormattedNumberParts.displayName = 'FormattedNumberParts';\nfunction createFormattedDateTimePartsComponent(name) {\n var ComponentParts = function ComponentParts(props) {\n return react.createElement(Context.Consumer, null, function (intl) {\n invariantIntlContext(intl);\n\n var value = props.value,\n children = props.children,\n formatProps = __rest(props, [\"value\", \"children\"]);\n\n var date = typeof value === 'string' ? new Date(value || 0) : value;\n var formattedParts = name === 'formatDate' ? intl.formatDateToParts(date, formatProps) : intl.formatTimeToParts(date, formatProps);\n return children(formattedParts);\n });\n };\n\n ComponentParts.displayName = DisplayNameParts[name];\n return ComponentParts;\n}\nfunction createFormattedComponent(name) {\n var Component = function Component(props) {\n return react.createElement(Context.Consumer, null, function (intl) {\n invariantIntlContext(intl);\n\n var value = props.value,\n children = props.children,\n formatProps = __rest(props, [\"value\", \"children\"]); // TODO: fix TS type definition for localeMatcher upstream\n\n\n var formattedValue = intl[name](value, formatProps);\n\n if (typeof children === 'function') {\n return children(formattedValue);\n }\n\n var Text = intl.textComponent || react.Fragment;\n return react.createElement(Text, null, formattedValue);\n });\n };\n\n Component.displayName = DisplayName[name];\n return Component;\n}\n;// CONCATENATED MODULE: ./node_modules/react-intl/lib/components/useIntl.js\n\n\n\nfunction useIntl() {\n var intl = (0,react.useContext)(Context);\n invariantIntlContext(intl);\n return intl;\n}\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/classCallCheck.js\nvar classCallCheck = __webpack_require__(6610);\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/createClass.js\nvar createClass = __webpack_require__(5991);\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/inherits.js\nvar inherits = __webpack_require__(379);\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js + 1 modules\nvar possibleConstructorReturn = __webpack_require__(6616);\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js\nvar getPrototypeOf = __webpack_require__(7608);\n;// CONCATENATED MODULE: ./node_modules/react-intl/lib/formatters/number.js\n\nvar NUMBER_FORMAT_OPTIONS = ['localeMatcher', 'style', 'currency', 'currencyDisplay', 'unit', 'unitDisplay', 'useGrouping', 'minimumIntegerDigits', 'minimumFractionDigits', 'maximumFractionDigits', 'minimumSignificantDigits', 'maximumSignificantDigits', // Unified NumberFormat (Stage 3 as of 10/22/19)\n'compactDisplay', 'currencyDisplay', 'currencySign', 'notation', 'signDisplay', 'unit', 'unitDisplay'];\nfunction getFormatter(_ref, getNumberFormat) {\n var locale = _ref.locale,\n formats = _ref.formats,\n onError = _ref.onError;\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var format = options.format;\n var defaults = format && getNamedFormat(formats, 'number', format, onError) || {};\n var filteredOptions = filterProps(options, NUMBER_FORMAT_OPTIONS, defaults);\n return getNumberFormat(locale, filteredOptions);\n}\nfunction formatNumber(config, getNumberFormat, value) {\n var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n\n try {\n return getFormatter(config, getNumberFormat, options).format(value);\n } catch (e) {\n config.onError(createError('Error formatting number.', e));\n }\n\n return String(value);\n}\nfunction formatNumberToParts(config, getNumberFormat, value) {\n var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n\n try {\n return getFormatter(config, getNumberFormat, options).formatToParts(value);\n } catch (e) {\n config.onError(createError('Error formatting number.', e));\n }\n\n return [];\n}\n;// CONCATENATED MODULE: ./node_modules/react-intl/lib/formatters/relativeTime.js\n\nvar RELATIVE_TIME_FORMAT_OPTIONS = ['numeric', 'style'];\n\nfunction relativeTime_getFormatter(_ref, getRelativeTimeFormat) {\n var locale = _ref.locale,\n formats = _ref.formats,\n onError = _ref.onError;\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var format = options.format;\n var defaults = !!format && getNamedFormat(formats, 'relative', format, onError) || {};\n var filteredOptions = filterProps(options, RELATIVE_TIME_FORMAT_OPTIONS, defaults);\n return getRelativeTimeFormat(locale, filteredOptions);\n}\n\nfunction formatRelativeTime(config, getRelativeTimeFormat, value, unit) {\n var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};\n\n if (!unit) {\n unit = 'second';\n }\n\n var RelativeTimeFormat = Intl.RelativeTimeFormat;\n\n if (!RelativeTimeFormat) {\n config.onError(createError(\"Intl.RelativeTimeFormat is not available in this environment.\\nTry polyfilling it using \\\"@formatjs/intl-relativetimeformat\\\"\\n\"));\n }\n\n try {\n return relativeTime_getFormatter(config, getRelativeTimeFormat, options).format(value, unit);\n } catch (e) {\n config.onError(createError('Error formatting relative time.', e));\n }\n\n return String(value);\n}\n;// CONCATENATED MODULE: ./node_modules/react-intl/lib/formatters/dateTime.js\n/*\n * Copyright 2015, Yahoo Inc.\n * Copyrights licensed under the New BSD License.\n * See the accompanying LICENSE file for terms.\n */\n\nvar DATE_TIME_FORMAT_OPTIONS = ['localeMatcher', 'formatMatcher', 'timeZone', 'hour12', 'weekday', 'era', 'year', 'month', 'day', 'hour', 'minute', 'second', 'timeZoneName'];\nfunction dateTime_getFormatter(_ref, type, getDateTimeFormat) {\n var locale = _ref.locale,\n formats = _ref.formats,\n onError = _ref.onError,\n timeZone = _ref.timeZone;\n var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n var format = options.format;\n var defaults = Object.assign(Object.assign({}, timeZone && {\n timeZone: timeZone\n }), format && getNamedFormat(formats, type, format, onError));\n var filteredOptions = filterProps(options, DATE_TIME_FORMAT_OPTIONS, defaults);\n\n if (type === 'time' && !filteredOptions.hour && !filteredOptions.minute && !filteredOptions.second) {\n // Add default formatting options if hour, minute, or second isn't defined.\n filteredOptions = Object.assign(Object.assign({}, filteredOptions), {\n hour: 'numeric',\n minute: 'numeric'\n });\n }\n\n return getDateTimeFormat(locale, filteredOptions);\n}\nfunction formatDate(config, getDateTimeFormat, value) {\n var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n var date = typeof value === 'string' ? new Date(value || 0) : value;\n\n try {\n return dateTime_getFormatter(config, 'date', getDateTimeFormat, options).format(date);\n } catch (e) {\n config.onError(createError('Error formatting date.', e));\n }\n\n return String(date);\n}\nfunction formatTime(config, getDateTimeFormat, value) {\n var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n var date = typeof value === 'string' ? new Date(value || 0) : value;\n\n try {\n return dateTime_getFormatter(config, 'time', getDateTimeFormat, options).format(date);\n } catch (e) {\n config.onError(createError('Error formatting time.', e));\n }\n\n return String(date);\n}\nfunction formatDateToParts(config, getDateTimeFormat, value) {\n var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n var date = typeof value === 'string' ? new Date(value || 0) : value;\n\n try {\n return dateTime_getFormatter(config, 'date', getDateTimeFormat, options).formatToParts(date);\n } catch (e) {\n config.onError(createError('Error formatting date.', e));\n }\n\n return [];\n}\nfunction formatTimeToParts(config, getDateTimeFormat, value) {\n var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n var date = typeof value === 'string' ? new Date(value || 0) : value;\n\n try {\n return dateTime_getFormatter(config, 'time', getDateTimeFormat, options).formatToParts(date);\n } catch (e) {\n config.onError(createError('Error formatting time.', e));\n }\n\n return [];\n}\n;// CONCATENATED MODULE: ./node_modules/react-intl/lib/formatters/plural.js\n\nvar PLURAL_FORMAT_OPTIONS = ['localeMatcher', 'type'];\nfunction formatPlural(_ref, getPluralRules, value) {\n var locale = _ref.locale,\n onError = _ref.onError;\n var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n\n if (!Intl.PluralRules) {\n onError(createError(\"Intl.PluralRules is not available in this environment.\\nTry polyfilling it using \\\"@formatjs/intl-pluralrules\\\"\\n\"));\n }\n\n var filteredOptions = filterProps(options, PLURAL_FORMAT_OPTIONS);\n\n try {\n return getPluralRules(locale, filteredOptions).select(value);\n } catch (e) {\n onError(createError('Error formatting plural.', e));\n }\n\n return 'other';\n}\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js + 2 modules\nvar toConsumableArray = __webpack_require__(5061);\n;// CONCATENATED MODULE: ./node_modules/react-intl/lib/formatters/message.js\n\n\n/*\n * Copyright 2015, Yahoo Inc.\n * Copyrights licensed under the New BSD License.\n * See the accompanying LICENSE file for terms.\n */\n\n\n\n\n\nfunction setTimeZoneInOptions(opts, timeZone) {\n return Object.keys(opts).reduce(function (all, k) {\n all[k] = Object.assign({\n timeZone: timeZone\n }, opts[k]);\n return all;\n }, {});\n}\n\nfunction deepMergeOptions(opts1, opts2) {\n var keys = Object.keys(Object.assign(Object.assign({}, opts1), opts2));\n return keys.reduce(function (all, k) {\n all[k] = Object.assign(Object.assign({}, opts1[k] || {}), opts2[k] || {});\n return all;\n }, {});\n}\n\nfunction deepMergeFormatsAndSetTimeZone(f1, timeZone) {\n if (!timeZone) {\n return f1;\n }\n\n var mfFormats = intl_messageformat_lib.formats;\n return Object.assign(Object.assign(Object.assign({}, mfFormats), f1), {\n date: deepMergeOptions(setTimeZoneInOptions(mfFormats.date, timeZone), setTimeZoneInOptions(f1.date || {}, timeZone)),\n time: deepMergeOptions(setTimeZoneInOptions(mfFormats.time, timeZone), setTimeZoneInOptions(f1.time || {}, timeZone))\n });\n}\n\nvar prepareIntlMessageFormatHtmlOutput = function prepareIntlMessageFormatHtmlOutput(chunks) {\n return react.createElement.apply(react_namespaceObject, [react.Fragment, null].concat((0,toConsumableArray/* default */.Z)(chunks)));\n};\nfunction formatMessage(_ref, state) {\n var locale = _ref.locale,\n formats = _ref.formats,\n messages = _ref.messages,\n defaultLocale = _ref.defaultLocale,\n defaultFormats = _ref.defaultFormats,\n onError = _ref.onError,\n timeZone = _ref.timeZone;\n var messageDescriptor = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {\n id: ''\n };\n var values = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n var id = messageDescriptor.id,\n defaultMessage = messageDescriptor.defaultMessage; // `id` is a required field of a Message Descriptor.\n\n (0,invariant/* invariant */.k)(!!id, '[React Intl] An `id` must be provided to format a message.');\n var message = messages && messages[String(id)];\n formats = deepMergeFormatsAndSetTimeZone(formats, timeZone);\n defaultFormats = deepMergeFormatsAndSetTimeZone(defaultFormats, timeZone);\n var formattedMessageParts = [];\n\n if (message) {\n try {\n var formatter = state.getMessageFormat(message, locale, formats, {\n formatters: state\n });\n formattedMessageParts = formatter.formatHTMLMessage(values);\n } catch (e) {\n onError(createError(\"Error formatting message: \\\"\".concat(id, \"\\\" for locale: \\\"\").concat(locale, \"\\\"\") + (defaultMessage ? ', using default message as fallback.' : ''), e));\n }\n } else {\n // This prevents warnings from littering the console in development\n // when no `messages` are passed into the for the\n // default locale, and a default message is in the source.\n if (!defaultMessage || locale && locale.toLowerCase() !== defaultLocale.toLowerCase()) {\n onError(createError(\"Missing message: \\\"\".concat(id, \"\\\" for locale: \\\"\").concat(locale, \"\\\"\") + (defaultMessage ? ', using default message as fallback.' : '')));\n }\n }\n\n if (!formattedMessageParts.length && defaultMessage) {\n try {\n var _formatter = state.getMessageFormat(defaultMessage, defaultLocale, defaultFormats);\n\n formattedMessageParts = _formatter.formatHTMLMessage(values);\n } catch (e) {\n onError(createError(\"Error formatting the default message for: \\\"\".concat(id, \"\\\"\"), e));\n }\n }\n\n if (!formattedMessageParts.length) {\n onError(createError(\"Cannot format message: \\\"\".concat(id, \"\\\", \") + \"using message \".concat(message || defaultMessage ? 'source' : 'id', \" as fallback.\")));\n\n if (typeof message === 'string') {\n return message || defaultMessage || String(id);\n }\n\n return defaultMessage || String(id);\n }\n\n if (formattedMessageParts.length === 1 && typeof formattedMessageParts[0] === 'string') {\n return formattedMessageParts[0] || defaultMessage || String(id);\n }\n\n return prepareIntlMessageFormatHtmlOutput(formattedMessageParts);\n}\nfunction message_formatHTMLMessage(config, state) {\n var messageDescriptor = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {\n id: ''\n };\n var rawValues = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n // Process all the values before they are used when formatting the ICU\n // Message string. Since the formatted message might be injected via\n // `innerHTML`, all String-based values need to be HTML-escaped.\n var escapedValues = Object.keys(rawValues).reduce(function (escaped, name) {\n var value = rawValues[name];\n escaped[name] = typeof value === 'string' ? utils_escape(value) : value;\n return escaped;\n }, {});\n return formatMessage(config, state, messageDescriptor, escapedValues);\n}\n// EXTERNAL MODULE: ./node_modules/shallow-equal/objects/index.js\nvar objects = __webpack_require__(9108);\nvar objects_default = /*#__PURE__*/__webpack_require__.n(objects);\n;// CONCATENATED MODULE: ./node_modules/react-intl/lib/formatters/list.js\n\nvar LIST_FORMAT_OPTIONS = ['localeMatcher', 'type', 'style'];\nvar now = Date.now();\n\nfunction generateToken(i) {\n return \"\".concat(now, \"_\").concat(i, \"_\").concat(now);\n}\n\nfunction formatList(_ref, getListFormat, values) {\n var locale = _ref.locale,\n onError = _ref.onError;\n var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n var ListFormat = Intl.ListFormat;\n\n if (!ListFormat) {\n onError(createError(\"Intl.ListFormat is not available in this environment.\\nTry polyfilling it using \\\"@formatjs/intl-listformat\\\"\\n\"));\n }\n\n var filteredOptions = filterProps(options, LIST_FORMAT_OPTIONS);\n\n try {\n var richValues = {};\n var serializedValues = values.map(function (v, i) {\n if (typeof v === 'object') {\n var id = generateToken(i);\n richValues[id] = v;\n return id;\n }\n\n return String(v);\n });\n\n if (!Object.keys(richValues).length) {\n return getListFormat(locale, filteredOptions).format(serializedValues);\n }\n\n var parts = getListFormat(locale, filteredOptions).formatToParts(serializedValues);\n return parts.reduce(function (all, el) {\n var val = el.value;\n\n if (richValues[val]) {\n all.push(richValues[val]);\n } else if (typeof all[all.length - 1] === 'string') {\n all[all.length - 1] += val;\n } else {\n all.push(val);\n }\n\n return all;\n }, []);\n } catch (e) {\n onError(createError('Error formatting list.', e));\n }\n\n return values;\n}\n;// CONCATENATED MODULE: ./node_modules/react-intl/lib/formatters/displayName.js\n\nvar DISPLAY_NAMES_OPTONS = ['localeMatcher', 'style', 'type', 'fallback'];\nfunction formatDisplayName(_ref, getDisplayNames, value) {\n var locale = _ref.locale,\n onError = _ref.onError;\n var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n var DisplayNames = Intl.DisplayNames;\n\n if (!DisplayNames) {\n onError(createError(\"Intl.DisplayNames is not available in this environment.\\nTry polyfilling it using \\\"@formatjs/intl-displaynames\\\"\\n\"));\n }\n\n var filteredOptions = filterProps(options, DISPLAY_NAMES_OPTONS);\n\n try {\n return getDisplayNames(locale, filteredOptions).of(value);\n } catch (e) {\n onError(createError('Error formatting display name.', e));\n }\n}\n;// CONCATENATED MODULE: ./node_modules/react-intl/lib/components/provider.js\n\n\n\n\n\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0,getPrototypeOf/* default */.Z)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0,getPrototypeOf/* default */.Z)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,possibleConstructorReturn/* default */.Z)(this, result); }; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\n/*\n * Copyright 2015, Yahoo Inc.\n * Copyrights licensed under the New BSD License.\n * See the accompanying LICENSE file for terms.\n */\n\n\n\n\n\n\n\n\n\n\n\nvar shallowEquals = (objects_default()) || objects;\n\nfunction processIntlConfig(config) {\n return {\n locale: config.locale,\n timeZone: config.timeZone,\n formats: config.formats,\n textComponent: config.textComponent,\n messages: config.messages,\n defaultLocale: config.defaultLocale,\n defaultFormats: config.defaultFormats,\n onError: config.onError\n };\n}\n/**\n * Create intl object\n * @param config intl config\n * @param cache cache for formatter instances to prevent memory leak\n */\n\n\nfunction createIntl(config, cache) {\n var formatters = createFormatters(cache);\n var resolvedConfig = Object.assign(Object.assign({}, DEFAULT_INTL_CONFIG), config);\n var locale = resolvedConfig.locale,\n defaultLocale = resolvedConfig.defaultLocale,\n onError = resolvedConfig.onError;\n\n if (!locale) {\n if (onError) {\n onError(createError(\"\\\"locale\\\" was not configured, using \\\"\".concat(defaultLocale, \"\\\" as fallback. See https://github.com/formatjs/react-intl/blob/master/docs/API.md#intlshape for more details\")));\n } // Since there's no registered locale data for `locale`, this will\n // fallback to the `defaultLocale` to make sure things can render.\n // The `messages` are overridden to the `defaultProps` empty object\n // to maintain referential equality across re-renders. It's assumed\n // each contains a `defaultMessage` prop.\n\n\n resolvedConfig.locale = resolvedConfig.defaultLocale || 'en';\n } else if (!Intl.NumberFormat.supportedLocalesOf(locale).length && onError) {\n onError(createError(\"Missing locale data for locale: \\\"\".concat(locale, \"\\\" in Intl.NumberFormat. Using default locale: \\\"\").concat(defaultLocale, \"\\\" as fallback. See https://github.com/formatjs/react-intl/blob/master/docs/Getting-Started.md#runtime-requirements for more details\")));\n } else if (!Intl.DateTimeFormat.supportedLocalesOf(locale).length && onError) {\n onError(createError(\"Missing locale data for locale: \\\"\".concat(locale, \"\\\" in Intl.DateTimeFormat. Using default locale: \\\"\").concat(defaultLocale, \"\\\" as fallback. See https://github.com/formatjs/react-intl/blob/master/docs/Getting-Started.md#runtime-requirements for more details\")));\n }\n\n return Object.assign(Object.assign({}, resolvedConfig), {\n formatters: formatters,\n formatNumber: formatNumber.bind(null, resolvedConfig, formatters.getNumberFormat),\n formatNumberToParts: formatNumberToParts.bind(null, resolvedConfig, formatters.getNumberFormat),\n formatRelativeTime: formatRelativeTime.bind(null, resolvedConfig, formatters.getRelativeTimeFormat),\n formatDate: formatDate.bind(null, resolvedConfig, formatters.getDateTimeFormat),\n formatDateToParts: formatDateToParts.bind(null, resolvedConfig, formatters.getDateTimeFormat),\n formatTime: formatTime.bind(null, resolvedConfig, formatters.getDateTimeFormat),\n formatTimeToParts: formatTimeToParts.bind(null, resolvedConfig, formatters.getDateTimeFormat),\n formatPlural: formatPlural.bind(null, resolvedConfig, formatters.getPluralRules),\n formatMessage: formatMessage.bind(null, resolvedConfig, formatters),\n formatHTMLMessage: message_formatHTMLMessage.bind(null, resolvedConfig, formatters),\n formatList: formatList.bind(null, resolvedConfig, formatters.getListFormat),\n formatDisplayName: formatDisplayName.bind(null, resolvedConfig, formatters.getDisplayNames)\n });\n}\n\nvar provider_IntlProvider = /*#__PURE__*/function (_React$PureComponent) {\n (0,inherits/* default */.Z)(IntlProvider, _React$PureComponent);\n\n var _super = _createSuper(IntlProvider);\n\n function IntlProvider() {\n var _this;\n\n (0,classCallCheck/* default */.Z)(this, IntlProvider);\n\n _this = _super.apply(this, arguments);\n _this.cache = createIntlCache();\n _this.state = {\n cache: _this.cache,\n intl: createIntl(processIntlConfig(_this.props), _this.cache),\n prevConfig: processIntlConfig(_this.props)\n };\n return _this;\n }\n\n (0,createClass/* default */.Z)(IntlProvider, [{\n key: \"render\",\n value: function render() {\n invariantIntlContext(this.state.intl);\n return react.createElement(Provider, {\n value: this.state.intl\n }, this.props.children);\n }\n }], [{\n key: \"getDerivedStateFromProps\",\n value: function getDerivedStateFromProps(props, _ref) {\n var prevConfig = _ref.prevConfig,\n cache = _ref.cache;\n var config = processIntlConfig(props);\n\n if (!shallowEquals(prevConfig, config)) {\n return {\n intl: createIntl(config, cache),\n prevConfig: config\n };\n }\n\n return null;\n }\n }]);\n\n return IntlProvider;\n}(react.PureComponent);\n\n\nprovider_IntlProvider.displayName = 'IntlProvider';\nprovider_IntlProvider.defaultProps = DEFAULT_INTL_CONFIG;\n;// CONCATENATED MODULE: ./node_modules/react-intl/lib/components/relative.js\n\n\n\n\n\n\nfunction relative_createSuper(Derived) { var hasNativeReflectConstruct = relative_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0,getPrototypeOf/* default */.Z)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0,getPrototypeOf/* default */.Z)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,possibleConstructorReturn/* default */.Z)(this, result); }; }\n\nfunction relative_isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\n/*\n * Copyright 2015, Yahoo Inc.\n * Copyrights licensed under the New BSD License.\n * See the accompanying LICENSE file for terms.\n */\n\n\n\n\nvar MINUTE = 60;\nvar HOUR = 60 * 60;\nvar DAY = 60 * 60 * 24;\n\nfunction selectUnit(seconds) {\n var absValue = Math.abs(seconds);\n\n if (absValue < MINUTE) {\n return 'second';\n }\n\n if (absValue < HOUR) {\n return 'minute';\n }\n\n if (absValue < DAY) {\n return 'hour';\n }\n\n return 'day';\n}\n\nfunction getDurationInSeconds(unit) {\n switch (unit) {\n case 'second':\n return 1;\n\n case 'minute':\n return MINUTE;\n\n case 'hour':\n return HOUR;\n\n default:\n return DAY;\n }\n}\n\nfunction valueToSeconds(value, unit) {\n if (!value) {\n return 0;\n }\n\n switch (unit) {\n case 'second':\n return value;\n\n case 'minute':\n return value * MINUTE;\n\n default:\n return value * HOUR;\n }\n}\n\nvar INCREMENTABLE_UNITS = ['second', 'minute', 'hour'];\n\nfunction canIncrement() {\n var unit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'second';\n return INCREMENTABLE_UNITS.includes(unit);\n}\n\nvar FormattedRelativeTime = /*#__PURE__*/function (_React$PureComponent) {\n (0,inherits/* default */.Z)(FormattedRelativeTime, _React$PureComponent);\n\n var _super = relative_createSuper(FormattedRelativeTime);\n\n function FormattedRelativeTime(props) {\n var _this;\n\n (0,classCallCheck/* default */.Z)(this, FormattedRelativeTime);\n\n _this = _super.call(this, props); // Public for testing\n\n _this._updateTimer = null;\n _this.state = {\n prevUnit: _this.props.unit,\n prevValue: _this.props.value,\n currentValueInSeconds: canIncrement(_this.props.unit) ? valueToSeconds(_this.props.value, _this.props.unit) : 0\n };\n (0,invariant/* invariant */.k)(!props.updateIntervalInSeconds || !!(props.updateIntervalInSeconds && canIncrement(props.unit)), 'Cannot schedule update with unit longer than hour');\n return _this;\n }\n\n (0,createClass/* default */.Z)(FormattedRelativeTime, [{\n key: \"scheduleNextUpdate\",\n value: function scheduleNextUpdate(_ref, _ref2) {\n var _this2 = this;\n\n var updateIntervalInSeconds = _ref.updateIntervalInSeconds,\n unit = _ref.unit;\n var currentValueInSeconds = _ref2.currentValueInSeconds;\n clearTimeout(this._updateTimer);\n this._updateTimer = null; // If there's no interval and we cannot increment this unit, do nothing\n\n if (!updateIntervalInSeconds || !canIncrement(unit)) {\n return;\n } // Figure out the next interesting time\n\n\n var nextValueInSeconds = currentValueInSeconds - updateIntervalInSeconds;\n var nextUnit = selectUnit(nextValueInSeconds); // We've reached the max auto incrementable unit, don't schedule another update\n\n if (nextUnit === 'day') {\n return;\n }\n\n var unitDuration = getDurationInSeconds(nextUnit);\n var remainder = nextValueInSeconds % unitDuration;\n var prevInterestingValueInSeconds = nextValueInSeconds - remainder;\n var nextInterestingValueInSeconds = prevInterestingValueInSeconds >= currentValueInSeconds ? prevInterestingValueInSeconds - unitDuration : prevInterestingValueInSeconds;\n var delayInSeconds = Math.abs(nextInterestingValueInSeconds - currentValueInSeconds);\n this._updateTimer = setTimeout(function () {\n return _this2.setState({\n currentValueInSeconds: nextInterestingValueInSeconds\n });\n }, delayInSeconds * 1e3);\n }\n }, {\n key: \"componentDidMount\",\n value: function componentDidMount() {\n this.scheduleNextUpdate(this.props, this.state);\n }\n }, {\n key: \"componentDidUpdate\",\n value: function componentDidUpdate() {\n this.scheduleNextUpdate(this.props, this.state);\n }\n }, {\n key: \"componentWillUnmount\",\n value: function componentWillUnmount() {\n clearTimeout(this._updateTimer);\n this._updateTimer = null;\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this3 = this;\n\n return react.createElement(Context.Consumer, null, function (intl) {\n invariantIntlContext(intl);\n var formatRelativeTime = intl.formatRelativeTime,\n Text = intl.textComponent;\n var _this3$props = _this3.props,\n children = _this3$props.children,\n value = _this3$props.value,\n unit = _this3$props.unit,\n updateIntervalInSeconds = _this3$props.updateIntervalInSeconds;\n var currentValueInSeconds = _this3.state.currentValueInSeconds;\n var currentValue = value || 0;\n var currentUnit = unit;\n\n if (canIncrement(unit) && typeof currentValueInSeconds === 'number' && updateIntervalInSeconds) {\n currentUnit = selectUnit(currentValueInSeconds);\n var unitDuration = getDurationInSeconds(currentUnit);\n currentValue = Math.round(currentValueInSeconds / unitDuration);\n }\n\n var formattedRelativeTime = formatRelativeTime(currentValue, currentUnit, Object.assign({}, _this3.props));\n\n if (typeof children === 'function') {\n return children(formattedRelativeTime);\n }\n\n if (Text) {\n return react.createElement(Text, null, formattedRelativeTime);\n }\n\n return formattedRelativeTime;\n });\n }\n }], [{\n key: \"getDerivedStateFromProps\",\n value: function getDerivedStateFromProps(props, state) {\n if (props.unit !== state.prevUnit || props.value !== state.prevValue) {\n return {\n prevValue: props.value,\n prevUnit: props.unit,\n currentValueInSeconds: canIncrement(props.unit) ? valueToSeconds(props.value, props.unit) : 0\n };\n }\n\n return null;\n }\n }]);\n\n return FormattedRelativeTime;\n}(react.PureComponent);\nFormattedRelativeTime.displayName = 'FormattedRelativeTime';\nFormattedRelativeTime.defaultProps = {\n value: 0,\n unit: 'second'\n};\n/* harmony default export */ var relative = (FormattedRelativeTime);\n;// CONCATENATED MODULE: ./node_modules/react-intl/lib/components/plural.js\n/*\n * Copyright 2015, Yahoo Inc.\n * Copyrights licensed under the New BSD License.\n * See the accompanying LICENSE file for terms.\n */\n\n\n\nvar FormattedPlural = function FormattedPlural(props) {\n var value = props.value,\n other = props.other,\n children = props.children,\n _props$intl = props.intl,\n formatPlural = _props$intl.formatPlural,\n Text = _props$intl.textComponent;\n var pluralCategory = formatPlural(value, props);\n var formattedPlural = props[pluralCategory] || other;\n\n if (typeof children === 'function') {\n return children(formattedPlural);\n }\n\n if (Text) {\n return react.createElement(Text, null, formattedPlural);\n } // Work around @types/react where React.FC cannot return string\n\n\n return formattedPlural;\n};\n\nFormattedPlural.defaultProps = {\n type: 'cardinal'\n};\nFormattedPlural.displayName = 'FormattedPlural';\n/* harmony default export */ var plural = (injectIntl(FormattedPlural));\n;// CONCATENATED MODULE: ./node_modules/react-intl/lib/components/message.js\n\n\n\n\n\n\n\nfunction message_createSuper(Derived) { var hasNativeReflectConstruct = message_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0,getPrototypeOf/* default */.Z)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0,getPrototypeOf/* default */.Z)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,possibleConstructorReturn/* default */.Z)(this, result); }; }\n\nfunction message_isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\n/*\n * Copyright 2015, Yahoo Inc.\n * Copyrights licensed under the New BSD License.\n * See the accompanying LICENSE file for terms.\n */\nvar message_rest = undefined && undefined.__rest || function (s, e) {\n var t = {};\n\n for (var p in s) {\n if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];\n }\n\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];\n }\n return t;\n};\n\n\n\n\n\n\nvar message_shallowEquals = (objects_default()) || objects;\n\nvar defaultFormatMessage = function defaultFormatMessage(descriptor, values) {\n if (false) {}\n\n return formatMessage(Object.assign(Object.assign({}, DEFAULT_INTL_CONFIG), {\n locale: 'en'\n }), createFormatters(), descriptor, values);\n};\n\nvar FormattedMessage = /*#__PURE__*/function (_React$Component) {\n (0,inherits/* default */.Z)(FormattedMessage, _React$Component);\n\n var _super = message_createSuper(FormattedMessage);\n\n function FormattedMessage() {\n (0,classCallCheck/* default */.Z)(this, FormattedMessage);\n\n return _super.apply(this, arguments);\n }\n\n (0,createClass/* default */.Z)(FormattedMessage, [{\n key: \"shouldComponentUpdate\",\n value: function shouldComponentUpdate(nextProps) {\n var _a = this.props,\n values = _a.values,\n otherProps = message_rest(_a, [\"values\"]);\n\n var nextValues = nextProps.values,\n nextOtherProps = message_rest(nextProps, [\"values\"]);\n\n return !message_shallowEquals(nextValues, values) || !message_shallowEquals(otherProps, nextOtherProps);\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this = this;\n\n return react.createElement(Context.Consumer, null, function (intl) {\n if (!_this.props.defaultMessage) {\n invariantIntlContext(intl);\n }\n\n var _ref = intl || {},\n _ref$formatMessage = _ref.formatMessage,\n formatMessage = _ref$formatMessage === void 0 ? defaultFormatMessage : _ref$formatMessage,\n _ref$textComponent = _ref.textComponent,\n Text = _ref$textComponent === void 0 ? react.Fragment : _ref$textComponent;\n\n var _this$props = _this.props,\n id = _this$props.id,\n description = _this$props.description,\n defaultMessage = _this$props.defaultMessage,\n values = _this$props.values,\n children = _this$props.children,\n _this$props$tagName = _this$props.tagName,\n Component = _this$props$tagName === void 0 ? Text : _this$props$tagName;\n var descriptor = {\n id: id,\n description: description,\n defaultMessage: defaultMessage\n };\n var nodes = formatMessage(descriptor, values);\n\n if (!Array.isArray(nodes)) {\n nodes = [nodes];\n }\n\n if (typeof children === 'function') {\n return children.apply(void 0, (0,toConsumableArray/* default */.Z)(nodes));\n }\n\n if (Component) {\n // Needs to use `createElement()` instead of JSX, otherwise React will\n // warn about a missing `key` prop with rich-text message formatting.\n return react.createElement.apply(react_namespaceObject, [Component, null].concat((0,toConsumableArray/* default */.Z)(nodes)));\n }\n\n return nodes;\n });\n }\n }]);\n\n return FormattedMessage;\n}(react.Component);\n\nFormattedMessage.displayName = 'FormattedMessage';\nFormattedMessage.defaultProps = {\n values: {}\n};\n/* harmony default export */ var message = (FormattedMessage);\n;// CONCATENATED MODULE: ./node_modules/react-intl/lib/components/html-message.js\n\n\n\n\n\n\nfunction html_message_createSuper(Derived) { var hasNativeReflectConstruct = html_message_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0,getPrototypeOf/* default */.Z)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0,getPrototypeOf/* default */.Z)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,possibleConstructorReturn/* default */.Z)(this, result); }; }\n\nfunction html_message_isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\n/*\n * Copyright 2015, Yahoo Inc.\n * Copyrights licensed under the New BSD License.\n * See the accompanying LICENSE file for terms.\n */\n\n\n\n\n\nvar FormattedHTMLMessage = /*#__PURE__*/function (_FormattedMessage) {\n (0,inherits/* default */.Z)(FormattedHTMLMessage, _FormattedMessage);\n\n var _super = html_message_createSuper(FormattedHTMLMessage);\n\n function FormattedHTMLMessage() {\n (0,classCallCheck/* default */.Z)(this, FormattedHTMLMessage);\n\n return _super.apply(this, arguments);\n }\n\n (0,createClass/* default */.Z)(FormattedHTMLMessage, [{\n key: \"render\",\n value: function render() {\n var _this = this;\n\n return react.createElement(Context.Consumer, null, function (intl) {\n if (!_this.props.defaultMessage) {\n invariantIntlContext(intl);\n }\n\n var formatHTMLMessage = intl.formatHTMLMessage,\n textComponent = intl.textComponent;\n var _this$props = _this.props,\n id = _this$props.id,\n description = _this$props.description,\n defaultMessage = _this$props.defaultMessage,\n rawValues = _this$props.values,\n children = _this$props.children;\n var Component = _this.props.tagName; // This is bc of TS3.3 doesn't recognize `defaultProps`\n\n if (!Component) {\n Component = textComponent || 'span';\n }\n\n var descriptor = {\n id: id,\n description: description,\n defaultMessage: defaultMessage\n };\n var formattedHTMLMessage = formatHTMLMessage(descriptor, rawValues);\n\n if (typeof children === 'function') {\n return children(formattedHTMLMessage);\n } // Since the message presumably has HTML in it, we need to set\n // `innerHTML` in order for it to be rendered and not escaped by React.\n // To be safe, all string prop values were escaped when formatting the\n // message. It is assumed that the message is not UGC, and came from the\n // developer making it more like a template.\n //\n // Note: There's a perf impact of using this component since there's no\n // way for React to do its virtual DOM diffing.\n\n\n var html = {\n __html: formattedHTMLMessage\n };\n return react.createElement(Component, {\n dangerouslySetInnerHTML: html\n });\n });\n }\n }]);\n\n return FormattedHTMLMessage;\n}(message);\n\nFormattedHTMLMessage.displayName = 'FormattedHTMLMessage';\nFormattedHTMLMessage.defaultProps = Object.assign(Object.assign({}, message.defaultProps), {\n tagName: 'span'\n});\n/* harmony default export */ var html_message = (FormattedHTMLMessage);\n;// CONCATENATED MODULE: ./node_modules/react-intl/lib/index.js\nfunction defineMessages(msgs) {\n return msgs;\n}\n\n\n\n // IMPORTANT: Explicit here to prevent api-extractor from outputing `import('./types').CustomFormatConfig`\n\nvar FormattedDate = createFormattedComponent('formatDate');\nvar FormattedTime = createFormattedComponent('formatTime');\nvar FormattedNumber = createFormattedComponent('formatNumber');\nvar FormattedList = createFormattedComponent('formatList');\nvar FormattedDisplayName = createFormattedComponent('formatDisplayName');\nvar FormattedDateParts = createFormattedDateTimePartsComponent('formatDate');\nvar FormattedTimeParts = createFormattedDateTimePartsComponent('formatTime');\n\n\n\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9pbnRsLW1lc3NhZ2Vmb3JtYXQtcGFyc2VyL2xpYi90eXBlcy5qcz80ZGIxIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL2ludGwtbWVzc2FnZWZvcm1hdC1wYXJzZXIvbGliL3BhcnNlci5qcz9hMGFmIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL2ludGwtbWVzc2FnZWZvcm1hdC1wYXJzZXIvbGliL25vcm1hbGl6ZS5qcz9jZjlhIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL2ludGwtbWVzc2FnZWZvcm1hdC1wYXJzZXIvbGliL2luZGV4LmpzPzMxMzMiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvaW50bC1mb3JtYXQtY2FjaGUvbGliL2luZGV4LmpzP2E2NzciLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvaW50bC1tZXNzYWdlZm9ybWF0LXBhcnNlci9saWIvc2tlbGV0b24uanM/NGM4NCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9pbnRsLW1lc3NhZ2Vmb3JtYXQvbGliL2Zvcm1hdHRlcnMuanM/ODgwNCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9pbnRsLW1lc3NhZ2Vmb3JtYXQvbGliL2NvcmUuanM/MDg2MSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9pbnRsLW1lc3NhZ2Vmb3JtYXQvbGliL2luZGV4LmpzPzY0MGUiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtaW50bC9saWIvdXRpbHMuanM/MjBkMSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eS5qcz9hZGUzIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWludGwvbGliL2NvbXBvbmVudHMvaW5qZWN0SW50bC5qcz84MDgxIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWludGwvbGliL2NvbXBvbmVudHMvY3JlYXRlRm9ybWF0dGVkQ29tcG9uZW50LmpzPzdiZDkiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtaW50bC9saWIvY29tcG9uZW50cy91c2VJbnRsLmpzP2Y5MDUiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtaW50bC9saWIvZm9ybWF0dGVycy9udW1iZXIuanM/MDBiZiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1pbnRsL2xpYi9mb3JtYXR0ZXJzL3JlbGF0aXZlVGltZS5qcz8zZDY3Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWludGwvbGliL2Zvcm1hdHRlcnMvZGF0ZVRpbWUuanM/OTNiYyIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1pbnRsL2xpYi9mb3JtYXR0ZXJzL3BsdXJhbC5qcz9kOGY5Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWludGwvbGliL2Zvcm1hdHRlcnMvbWVzc2FnZS5qcz9hYTJjIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWludGwvbGliL2Zvcm1hdHRlcnMvbGlzdC5qcz81NmZmIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWludGwvbGliL2Zvcm1hdHRlcnMvZGlzcGxheU5hbWUuanM/NWY1MSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1pbnRsL2xpYi9jb21wb25lbnRzL3Byb3ZpZGVyLmpzPzlmMDUiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtaW50bC9saWIvY29tcG9uZW50cy9yZWxhdGl2ZS5qcz85NjQ2Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWludGwvbGliL2NvbXBvbmVudHMvcGx1cmFsLmpzPzAwNjkiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtaW50bC9saWIvY29tcG9uZW50cy9tZXNzYWdlLmpzPzNiM2UiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtaW50bC9saWIvY29tcG9uZW50cy9odG1sLW1lc3NhZ2UuanM/MWI3NiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1pbnRsL2xpYi9pbmRleC5qcz81M2ZjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQsSUFBSTtBQUMzRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQyxvQkFBb0I7QUFDckI7QUFDQTtBQUNBOzs7QUFHTztBQUNQO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFD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QTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxL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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFTyx5Qjs7QUMxNkZQLHFCQUFxQixTQUFJLElBQUksU0FBSTtBQUNqQywrQ0FBK0MsUUFBUTtBQUN2RDtBQUNBOztBQUVBLHNDQUFzQyxRQUFRO0FBQzlDLG9EQUFvRCxRQUFRO0FBQzVEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUU2RTtBQUN6QztBQUNwQztBQUNBO0FBQ0E7QUFDQSxRQUFRLFlBQVk7QUFDcEI7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBLFNBQVMsZUFBZSxTQUFTLGVBQWU7QUFDaEQ7QUFDQSxLQUFLOzs7QUFHTDtBQUNBOztBQUVBLCtCQUErQjtBQUMvQjs7QUFFQTtBQUNBOztBQUVBLHFCQUFxQixzQkFBc0I7QUFDM0M7O0FBRUEsWUFBWSxnQkFBZ0I7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHlFQUF5RSx5QkFBeUI7QUFDbEcscUJBQXFCLFFBQVE7O0FBRTdCO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNILEM7O0FDN0RvQztBQUNtQjtBQUMvQjtBQUNDO0FBQ0U7QUFDcEI7QUFDUCxZQUFZLFFBQVE7O0FBRXBCO0FBQ0EsSUFBSSx3QkFBd0I7QUFDNUI7O0FBRUE7QUFDQSxDOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLGdCQUFjLEdBQUcsU0FBSSxJQUFJLFNBQUk7QUFDakMsK0NBQStDLFFBQVE7QUFDdkQ7QUFDQTs7QUFFQSxzQ0FBc0MsUUFBUTtBQUM5QyxvREFBb0QsUUFBUTtBQUM1RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGtCQUFrQjtBQUNsQixHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQSxvQkFBb0IsdUJBQXVCO0FBQzNDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDREQUE0RCxnQkFBYzs7QUFFMUU7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHdDQUFlLHdCQUF3QixFOztBQy9EdkMsSUFBSSxlQUFRLEdBQUcsU0FBSSxJQUFJLFNBQUk7QUFDM0IsRUFBRSxlQUFRO0FBQ1YsNENBQTRDLE9BQU87QUFDbkQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxTQUFTLGVBQVE7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxnQ0FBZ0MsSUFBSSxHQUFHLElBQUksTUFBTSxJQUFJLGNBQWMsSUFBSSxPQUFPLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsT0FBTyxJQUFJLFFBQVEsSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksV0FBVyxJQUFJO0FBQ3JLO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdPO0FBQ1A7O0FBRUEscUNBQXFDLHNCQUFzQjtBQUMzRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtB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dkI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxRQUFRLGVBQWU7QUFDdkI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ087QUFDUDtBQUNBLG1HQUFtRzs7QUFFbkc7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDOztBQUVqQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUcsTUFBTTs7QUFFVDtBQUNBLFdBQVcsdUJBQWM7QUFDekIsR0FBRzs7O0FBR0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRyxNQUFNOztBQUVUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUcsRUFBRTs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQzs7QUN0V0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksV0FBUSxHQUFH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OztBQUV2VTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQytCO0FBQ1U7QUFDRjtBQUNTOztBQUVoRDtBQUNBLEVBQUUsMkJBQVM7O0FBRVgsZUFBZSx3QkFBWTs7QUFFM0I7QUFDQSxJQUFJLGlDQUFlOztBQUVuQjtBQUNBOztBQUVBLEVBQUUsOEJBQVk7QUFDZDtBQUNBO0FBQ0E7O0FBRUEsYUFBYSxtQkFBbUIsQ0FBQyxnQkFBZ0I7QUFDakQ7QUFDQSxVQUFVLG9CQUFvQjtBQUM5Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDOztBQUU1QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsbUJBQW1CO0FBQ2xDO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBLEdBQUc7O0FBRUg7QUFDQSxDQUFDLENBQUMsT0FBZ0I7O0FBRWxCO0FBQ0Esa0VBQWtFLEVBQUUsb0JBQTZCO0FBQ2pHO0FBQ0EsQ0FBQztBQUNELGlEQUFlLG9CQUFvQixFOztBQzNGNUI7QUFDUDtBQUNBO0FBQ3dIO0FBQ0g7QUFDM0Q7QUFDa0I7O0FBRXJFLG9CQUFvQix3QkFBd0I7QUFDNUMsb0JBQW9CLHdCQUF3QjtBQUM1QyxzQkFBc0Isd0JBQXdCO0FBQzlDLG9CQUFvQix3QkFBd0I7QUFDNUMsMkJBQTJCLHdCQUF3QjtBQUNuRCx5QkFBeUIscUNBQXFDO0FBQzlELHlCQUF5QixxQ0FBcUM7QUFDUTtBQUNKO0FBQ1I7QUFDRTtBQUNTIiwiZmlsZSI6IjMxNjAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdmFyIFRZUEU7XG5cbihmdW5jdGlvbiAoVFlQRSkge1xuICAvKipcbiAgICogUmF3IHRleHRcbiAgICovXG4gIFRZUEVbVFlQRVtcImxpdGVyYWxcIl0gPSAwXSA9IFwibGl0ZXJhbFwiO1xuICAvKipcbiAgICogVmFyaWFibGUgdy9vIGFueSBmb3JtYXQsIGUuZyBgdmFyYCBpbiBgdGhpcyBpcyBhIHt2YXJ9YFxuICAgKi9cblxuICBUWVBFW1RZUEVbXCJhcmd1bWVudFwiXSA9IDFdID0gXCJhcmd1bWVudFwiO1xuICAvKipcbiAgICogVmFyaWFibGUgdy8gbnVtYmVyIGZvcm1hdFxuICAgKi9cblxuICBUWVBFW1RZUEVbXCJudW1iZXJcIl0gPSAyXSA9IFwibnVtYmVyXCI7XG4gIC8qKlxuICAgKiBWYXJpYWJsZSB3LyBkYXRlIGZvcm1hdFxuICAgKi9cblxuICBUWVBFW1RZUEVbXCJkYXRlXCJdID0gM10gPSBcImRhdGVcIjtcbiAgLyoqXG4gICAqIFZhcmlhYmxlIHcvIHRpbWUgZm9ybWF0XG4gICAqL1xuXG4gIFRZUEVbVFlQRVtcInRpbWVcIl0gPSA0XSA9IFwidGltZVwiO1xuICAvKipcbiAgICogVmFyaWFibGUgdy8gc2VsZWN0IGZvcm1hdFxuICAgKi9cblxuICBUWVBFW1RZUEVbXCJzZWxlY3RcIl0gPSA1XSA9IFwic2VsZWN0XCI7XG4gIC8qKlxuICAgKiBWYXJpYWJsZSB3LyBwbHVyYWwgZm9ybWF0XG4gICAqL1xuXG4gIFRZUEVbVFlQRVtcInBsdXJhbFwiXSA9IDZdID0gXCJwbHVyYWxcIjtcbiAgLyoqXG4gICAqIE9ubHkgcG9zc2libGUgd2l0aGluIHBsdXJhbCBhcmd1bWVudC5cbiAgICogVGhpcyBpcyB0aGUgYCNgIHN5bWJvbCB0aGF0IHdpbGwgYmUgc3Vic3RpdHV0ZWQgd2l0aCB0aGUgY291bnQuXG4gICAqL1xuXG4gIFRZUEVbVFlQRVtcInBvdW5kXCJdID0gN10gPSBcInBvdW5kXCI7XG59KShUWVBFIHx8IChUWVBFID0ge30pKTtcbi8qKlxuICogVHlwZSBHdWFyZHNcbiAqL1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0xpdGVyYWxFbGVtZW50KGVsKSB7XG4gIHJldHVybiBlbC50eXBlID09PSBUWVBFLmxpdGVyYWw7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNBcmd1bWVudEVsZW1lbnQoZWwpIHtcbiAgcmV0dXJuIGVsLnR5cGUgPT09IFRZUEUuYXJndW1lbnQ7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXJFbGVtZW50KGVsKSB7XG4gIHJldHVybiBlbC50eXBlID09PSBUWVBFLm51bWJlcjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGVFbGVtZW50KGVsKSB7XG4gIHJldHVybiBlbC50eXBlID09PSBUWVBFLmRhdGU7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUaW1lRWxlbWVudChlbCkge1xuICByZXR1cm4gZWwudHlwZSA9PT0gVFlQRS50aW1lO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzU2VsZWN0RWxlbWVudChlbCkge1xuICByZXR1cm4gZWwudHlwZSA9PT0gVFlQRS5zZWxlY3Q7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNQbHVyYWxFbGVtZW50KGVsKSB7XG4gIHJldHVybiBlbC50eXBlID09PSBUWVBFLnBsdXJhbDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1BvdW5kRWxlbWVudChlbCkge1xuICByZXR1cm4gZWwudHlwZSA9PT0gVFlQRS5wb3VuZDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc051bWJlclNrZWxldG9uKGVsKSB7XG4gIHJldHVybiAhIShlbCAmJiB0eXBlb2YgZWwgPT09ICdvYmplY3QnICYmIGVsLnR5cGUgPT09IDBcbiAgLyogbnVtYmVyICovXG4gICk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNEYXRlVGltZVNrZWxldG9uKGVsKSB7XG4gIHJldHVybiAhIShlbCAmJiB0eXBlb2YgZWwgPT09ICdvYmplY3QnICYmIGVsLnR5cGUgPT09IDFcbiAgLyogZGF0ZVRpbWUgKi9cbiAgKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMaXRlcmFsRWxlbWVudCh2YWx1ZSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFRZUEUubGl0ZXJhbCxcbiAgICB2YWx1ZTogdmFsdWVcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVOdW1iZXJFbGVtZW50KHZhbHVlLCBzdHlsZSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFRZUEUubnVtYmVyLFxuICAgIHZhbHVlOiB2YWx1ZSxcbiAgICBzdHlsZTogc3R5bGVcbiAgfTtcbn0iLCIvLyB0c2xpbnQ6ZGlzYWJsZTpvbmx5LWFycm93LWZ1bmN0aW9uc1xuLy8gdHNsaW50OmRpc2FibGU6b2JqZWN0LWxpdGVyYWwtc2hvcnRoYW5kXG4vLyB0c2xpbnQ6ZGlzYWJsZTp0cmFpbGluZy1jb21tYVxuLy8gdHNsaW50OmRpc2FibGU6b2JqZWN0LWxpdGVyYWwtc29ydC1rZXlzXG4vLyB0c2xpbnQ6ZGlzYWJsZTpvbmUtdmFyaWFibGUtcGVyLWRlY2xhcmF0aW9uXG4vLyB0c2xpbnQ6ZGlzYWJsZTptYXgtbGluZS1sZW5ndGhcbi8vIHRzbGludDpkaXNhYmxlOm5vLWNvbnNlY3V0aXZlLWJsYW5rLWxpbmVzXG4vLyB0c2xpbnQ6ZGlzYWJsZTphbGlnblxudmFyIF9fZXh0ZW5kcyA9IHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMgfHwgZnVuY3Rpb24gKCkge1xuICB2YXIgX2V4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiBleHRlbmRTdGF0aWNzKGQsIGIpIHtcbiAgICBfZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7XG4gICAgICBfX3Byb3RvX186IFtdXG4gICAgfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICBkLl9fcHJvdG9fXyA9IGI7XG4gICAgfSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgZm9yICh2YXIgcCBpbiBiKSB7XG4gICAgICAgIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIF9leHRlbmRTdGF0aWNzKGQsIGIpO1xuICB9O1xuXG4gIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xuICAgIF9leHRlbmRTdGF0aWNzKGQsIGIpO1xuXG4gICAgZnVuY3Rpb24gX18oKSB7XG4gICAgICB0aGlzLmNvbnN0cnVjdG9yID0gZDtcbiAgICB9XG5cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gIH07XG59KCk7XG5cbnZhciBfX2Fzc2lnbiA9IHRoaXMgJiYgdGhpcy5fX2Fzc2lnbiB8fCBmdW5jdGlvbiAoKSB7XG4gIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodCkge1xuICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcblxuICAgICAgZm9yICh2YXIgcCBpbiBzKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0O1xuICB9O1xuXG4gIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTsgLy8gR2VuZXJhdGVkIGJ5IFBFRy5qcyB2LiAwLjEwLjAgKHRzLXBlZ2pzIHBsdWdpbiB2LiAwLjIuNiApXG4vL1xuLy8gaHR0cHM6Ly9wZWdqcy5vcmcvICAgaHR0cHM6Ly9naXRodWIuY29tL21ldGFkZXZwcm8vdHMtcGVnanNcblxuXG5pbXBvcnQgeyBUWVBFIH0gZnJvbSAnLi90eXBlcyc7XG5cbnZhciBTeW50YXhFcnJvciA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoX3N1cGVyKSB7XG4gIF9fZXh0ZW5kcyhTeW50YXhFcnJvciwgX3N1cGVyKTtcblxuICBmdW5jdGlvbiBTeW50YXhFcnJvcihtZXNzYWdlLCBleHBlY3RlZCwgZm91bmQsIGxvY2F0aW9uKSB7XG4gICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcblxuICAgIF90aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIF90aGlzLmV4cGVjdGVkID0gZXhwZWN0ZWQ7XG4gICAgX3RoaXMuZm91bmQgPSBmb3VuZDtcbiAgICBfdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uO1xuICAgIF90aGlzLm5hbWUgPSBcIlN5bnRheEVycm9yXCI7XG5cbiAgICBpZiAodHlwZW9mIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKF90aGlzLCBTeW50YXhFcnJvcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgU3ludGF4RXJyb3IuYnVpbGRNZXNzYWdlID0gZnVuY3Rpb24gKGV4cGVjdGVkLCBmb3VuZCkge1xuICAgIGZ1bmN0aW9uIGhleChjaCkge1xuICAgICAgcmV0dXJuIGNoLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGl0ZXJhbEVzY2FwZShzKSB7XG4gICAgICByZXR1cm4gcy5yZXBsYWNlKC9cXFxcL2csIFwiXFxcXFxcXFxcIikucmVwbGFjZSgvXCIvZywgXCJcXFxcXFxcIlwiKS5yZXBsYWNlKC9cXDAvZywgXCJcXFxcMFwiKS5yZXBsYWNlKC9cXHQvZywgXCJcXFxcdFwiKS5yZXBsYWNlKC9cXG4vZywgXCJcXFxcblwiKS5yZXBsYWNlKC9cXHIvZywgXCJcXFxcclwiKS5yZXBsYWNlKC9bXFx4MDAtXFx4MEZdL2csIGZ1bmN0aW9uIChjaCkge1xuICAgICAgICByZXR1cm4gXCJcXFxceDBcIiArIGhleChjaCk7XG4gICAgICB9KS5yZXBsYWNlKC9bXFx4MTAtXFx4MUZcXHg3Ri1cXHg5Rl0vZywgZnVuY3Rpb24gKGNoKSB7XG4gICAgICAgIHJldHVybiBcIlxcXFx4XCIgKyBoZXgoY2gpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xhc3NFc2NhcGUocykge1xuICAgICAgcmV0dXJuIHMucmVwbGFjZSgvXFxcXC9nLCBcIlxcXFxcXFxcXCIpLnJlcGxhY2UoL1xcXS9nLCBcIlxcXFxdXCIpLnJlcGxhY2UoL1xcXi9nLCBcIlxcXFxeXCIpLnJlcGxhY2UoLy0vZywgXCJcXFxcLVwiKS5yZXBsYWNlKC9cXDAvZywgXCJcXFxcMFwiKS5yZXBsYWNlKC9cXHQvZywgXCJcXFxcdFwiKS5yZXBsYWNlKC9cXG4vZywgXCJcXFxcblwiKS5yZXBsYWNlKC9cXHIvZywgXCJcXFxcclwiKS5yZXBsYWNlKC9bXFx4MDAtXFx4MEZdL2csIGZ1bmN0aW9uIChjaCkge1xuICAgICAgICByZXR1cm4gXCJcXFxceDBcIiArIGhleChjaCk7XG4gICAgICB9KS5yZXBsYWNlKC9bXFx4MTAtXFx4MUZcXHg3Ri1cXHg5Rl0vZywgZnVuY3Rpb24gKGNoKSB7XG4gICAgICAgIHJldHVybiBcIlxcXFx4XCIgKyBoZXgoY2gpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGVzY3JpYmVFeHBlY3RhdGlvbihleHBlY3RhdGlvbikge1xuICAgICAgc3dpdGNoIChleHBlY3RhdGlvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgXCJsaXRlcmFsXCI6XG4gICAgICAgICAgcmV0dXJuIFwiXFxcIlwiICsgbGl0ZXJhbEVzY2FwZShleHBlY3RhdGlvbi50ZXh0KSArIFwiXFxcIlwiO1xuXG4gICAgICAgIGNhc2UgXCJjbGFzc1wiOlxuICAgICAgICAgIHZhciBlc2NhcGVkUGFydHMgPSBleHBlY3RhdGlvbi5wYXJ0cy5tYXAoZnVuY3Rpb24gKHBhcnQpIHtcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHBhcnQpID8gY2xhc3NFc2NhcGUocGFydFswXSkgKyBcIi1cIiArIGNsYXNzRXNjYXBlKHBhcnRbMV0pIDogY2xhc3NFc2NhcGUocGFydCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIFwiW1wiICsgKGV4cGVjdGF0aW9uLmludmVydGVkID8gXCJeXCIgOiBcIlwiKSArIGVzY2FwZWRQYXJ0cyArIFwiXVwiO1xuXG4gICAgICAgIGNhc2UgXCJhbnlcIjpcbiAgICAgICAgICByZXR1cm4gXCJhbnkgY2hhcmFjdGVyXCI7XG5cbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBcImVuZCBvZiBpbnB1dFwiO1xuXG4gICAgICAgIGNhc2UgXCJvdGhlclwiOlxuICAgICAgICAgIHJldHVybiBleHBlY3RhdGlvbi5kZXNjcmlwdGlvbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZXNjcmliZUV4cGVjdGVkKGV4cGVjdGVkMSkge1xuICAgICAgdmFyIGRlc2NyaXB0aW9ucyA9IGV4cGVjdGVkMS5tYXAoZGVzY3JpYmVFeHBlY3RhdGlvbik7XG4gICAgICB2YXIgaTtcbiAgICAgIHZhciBqO1xuICAgICAgZGVzY3JpcHRpb25zLnNvcnQoKTtcblxuICAgICAgaWYgKGRlc2NyaXB0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAoaSA9IDEsIGogPSAxOyBpIDwgZGVzY3JpcHRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGRlc2NyaXB0aW9uc1tpIC0gMV0gIT09IGRlc2NyaXB0aW9uc1tpXSkge1xuICAgICAgICAgICAgZGVzY3JpcHRpb25zW2pdID0gZGVzY3JpcHRpb25zW2ldO1xuICAgICAgICAgICAgaisrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGRlc2NyaXB0aW9ucy5sZW5ndGggPSBqO1xuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKGRlc2NyaXB0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbnNbMF07XG5cbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbnNbMF0gKyBcIiBvciBcIiArIGRlc2NyaXB0aW9uc1sxXTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbnMuc2xpY2UoMCwgLTEpLmpvaW4oXCIsIFwiKSArIFwiLCBvciBcIiArIGRlc2NyaXB0aW9uc1tkZXNjcmlwdGlvbnMubGVuZ3RoIC0gMV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGVzY3JpYmVGb3VuZChmb3VuZDEpIHtcbiAgICAgIHJldHVybiBmb3VuZDEgPyBcIlxcXCJcIiArIGxpdGVyYWxFc2NhcGUoZm91bmQxKSArIFwiXFxcIlwiIDogXCJlbmQgb2YgaW5wdXRcIjtcbiAgICB9XG5cbiAgICByZXR1cm4gXCJFeHBlY3RlZCBcIiArIGRlc2NyaWJlRXhwZWN0ZWQoZXhwZWN0ZWQpICsgXCIgYnV0IFwiICsgZGVzY3JpYmVGb3VuZChmb3VuZCkgKyBcIiBmb3VuZC5cIjtcbiAgfTtcblxuICByZXR1cm4gU3ludGF4RXJyb3I7XG59KEVycm9yKTtcblxuZXhwb3J0IHsgU3ludGF4RXJyb3IgfTtcblxuZnVuY3Rpb24gcGVnJHBhcnNlKGlucHV0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zICE9PSB1bmRlZmluZWQgPyBvcHRpb25zIDoge307XG4gIHZhciBwZWckRkFJTEVEID0ge307XG4gIHZhciBwZWckc3RhcnRSdWxlRnVuY3Rpb25zID0ge1xuICAgIHN0YXJ0OiBwZWckcGFyc2VzdGFydFxuICB9O1xuICB2YXIgcGVnJHN0YXJ0UnVsZUZ1bmN0aW9uID0gcGVnJHBhcnNlc3RhcnQ7XG5cbiAgdmFyIHBlZyRjMCA9IGZ1bmN0aW9uIHBlZyRjMChwYXJ0cykge1xuICAgIHJldHVybiBwYXJ0cy5qb2luKCcnKTtcbiAgfTtcblxuICB2YXIgcGVnJGMxID0gZnVuY3Rpb24gcGVnJGMxKG1lc3NhZ2VUZXh0KSB7XG4gICAgcmV0dXJuIF9fYXNzaWduKHtcbiAgICAgIHR5cGU6IFRZUEUubGl0ZXJhbCxcbiAgICAgIHZhbHVlOiBtZXNzYWdlVGV4dFxuICAgIH0sIGluc2VydExvY2F0aW9uKCkpO1xuICB9O1xuXG4gIHZhciBwZWckYzIgPSBcIiNcIjtcbiAgdmFyIHBlZyRjMyA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCIjXCIsIGZhbHNlKTtcblxuICB2YXIgcGVnJGM0ID0gZnVuY3Rpb24gcGVnJGM0KCkge1xuICAgIHJldHVybiBfX2Fzc2lnbih7XG4gICAgICB0eXBlOiBUWVBFLnBvdW5kXG4gICAgfSwgaW5zZXJ0TG9jYXRpb24oKSk7XG4gIH07XG5cbiAgdmFyIHBlZyRjNSA9IHBlZyRvdGhlckV4cGVjdGF0aW9uKFwiYXJndW1lbnRFbGVtZW50XCIpO1xuICB2YXIgcGVnJGM2ID0gXCJ7XCI7XG4gIHZhciBwZWckYzcgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwie1wiLCBmYWxzZSk7XG4gIHZhciBwZWckYzggPSBcIn1cIjtcbiAgdmFyIHBlZyRjOSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJ9XCIsIGZhbHNlKTtcblxuICB2YXIgcGVnJGMxMCA9IGZ1bmN0aW9uIHBlZyRjMTAodmFsdWUpIHtcbiAgICByZXR1cm4gX19hc3NpZ24oe1xuICAgICAgdHlwZTogVFlQRS5hcmd1bWVudCxcbiAgICAgIHZhbHVlOiB2YWx1ZVxuICAgIH0sIGluc2VydExvY2F0aW9uKCkpO1xuICB9O1xuXG4gIHZhciBwZWckYzExID0gcGVnJG90aGVyRXhwZWN0YXRpb24oXCJudW1iZXJTa2VsZXRvbklkXCIpO1xuICB2YXIgcGVnJGMxMiA9IC9eWydcXC97fV0vO1xuICB2YXIgcGVnJGMxMyA9IHBlZyRjbGFzc0V4cGVjdGF0aW9uKFtcIidcIiwgXCIvXCIsIFwie1wiLCBcIn1cIl0sIGZhbHNlLCBmYWxzZSk7XG4gIHZhciBwZWckYzE0ID0gcGVnJGFueUV4cGVjdGF0aW9uKCk7XG4gIHZhciBwZWckYzE1ID0gcGVnJG90aGVyRXhwZWN0YXRpb24oXCJudW1iZXJTa2VsZXRvblRva2VuT3B0aW9uXCIpO1xuICB2YXIgcGVnJGMxNiA9IFwiL1wiO1xuICB2YXIgcGVnJGMxNyA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCIvXCIsIGZhbHNlKTtcblxuICB2YXIgcGVnJGMxOCA9IGZ1bmN0aW9uIHBlZyRjMTgob3B0aW9uKSB7XG4gICAgcmV0dXJuIG9wdGlvbjtcbiAgfTtcblxuICB2YXIgcGVnJGMxOSA9IHBlZyRvdGhlckV4cGVjdGF0aW9uKFwibnVtYmVyU2tlbGV0b25Ub2tlblwiKTtcblxuICB2YXIgcGVnJGMyMCA9IGZ1bmN0aW9uIHBlZyRjMjAoc3RlbSwgb3B0aW9ucykge1xuICAgIHJldHVybiB7XG4gICAgICBzdGVtOiBzdGVtLFxuICAgICAgb3B0aW9uczogb3B0aW9uc1xuICAgIH07XG4gIH07XG5cbiAgdmFyIHBlZyRjMjEgPSBmdW5jdGlvbiBwZWckYzIxKHRva2Vucykge1xuICAgIHJldHVybiBfX2Fzc2lnbih7XG4gICAgICB0eXBlOiAwXG4gICAgICAvKiBudW1iZXIgKi9cbiAgICAgICxcbiAgICAgIHRva2VuczogdG9rZW5zXG4gICAgfSwgaW5zZXJ0TG9jYXRpb24oKSk7XG4gIH07XG5cbiAgdmFyIHBlZyRjMjIgPSBcIjo6XCI7XG4gIHZhciBwZWckYzIzID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIjo6XCIsIGZhbHNlKTtcblxuICB2YXIgcGVnJGMyNCA9IGZ1bmN0aW9uIHBlZyRjMjQoc2tlbGV0b24pIHtcbiAgICByZXR1cm4gc2tlbGV0b247XG4gIH07XG5cbiAgdmFyIHBlZyRjMjUgPSBmdW5jdGlvbiBwZWckYzI1KCkge1xuICAgIG1lc3NhZ2VDdHgucHVzaCgnbnVtYmVyQXJnU3R5bGUnKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICB2YXIgcGVnJGMyNiA9IGZ1bmN0aW9uIHBlZyRjMjYoc3R5bGUpIHtcbiAgICBtZXNzYWdlQ3R4LnBvcCgpO1xuICAgIHJldHVybiBzdHlsZS5yZXBsYWNlKC9cXHMqJC8sICcnKTtcbiAgfTtcblxuICB2YXIgcGVnJGMyNyA9IFwiLFwiO1xuICB2YXIgcGVnJGMyOCA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCIsXCIsIGZhbHNlKTtcbiAgdmFyIHBlZyRjMjkgPSBcIm51bWJlclwiO1xuICB2YXIgcGVnJGMzMCA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJudW1iZXJcIiwgZmFsc2UpO1xuXG4gIHZhciBwZWckYzMxID0gZnVuY3Rpb24gcGVnJGMzMSh2YWx1ZSwgdHlwZSwgc3R5bGUpIHtcbiAgICByZXR1cm4gX19hc3NpZ24oe1xuICAgICAgdHlwZTogdHlwZSA9PT0gJ251bWJlcicgPyBUWVBFLm51bWJlciA6IHR5cGUgPT09ICdkYXRlJyA/IFRZUEUuZGF0ZSA6IFRZUEUudGltZSxcbiAgICAgIHN0eWxlOiBzdHlsZSAmJiBzdHlsZVsyXSxcbiAgICAgIHZhbHVlOiB2YWx1ZVxuICAgIH0sIGluc2VydExvY2F0aW9uKCkpO1xuICB9O1xuXG4gIHZhciBwZWckYzMyID0gXCInXCI7XG4gIHZhciBwZWckYzMzID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIidcIiwgZmFsc2UpO1xuICB2YXIgcGVnJGMzNCA9IC9eW14nXS87XG4gIHZhciBwZWckYzM1ID0gcGVnJGNsYXNzRXhwZWN0YXRpb24oW1wiJ1wiXSwgdHJ1ZSwgZmFsc2UpO1xuICB2YXIgcGVnJGMzNiA9IC9eW15hLXpBLVone31dLztcbiAgdmFyIHBlZyRjMzcgPSBwZWckY2xhc3NFeHBlY3RhdGlvbihbW1wiYVwiLCBcInpcIl0sIFtcIkFcIiwgXCJaXCJdLCBcIidcIiwgXCJ7XCIsIFwifVwiXSwgdHJ1ZSwgZmFsc2UpO1xuICB2YXIgcGVnJGMzOCA9IC9eW2EtekEtWl0vO1xuICB2YXIgcGVnJGMzOSA9IHBlZyRjbGFzc0V4cGVjdGF0aW9uKFtbXCJhXCIsIFwielwiXSwgW1wiQVwiLCBcIlpcIl1dLCBmYWxzZSwgZmFsc2UpO1xuXG4gIHZhciBwZWckYzQwID0gZnVuY3Rpb24gcGVnJGM0MChwYXR0ZXJuKSB7XG4gICAgcmV0dXJuIF9fYXNzaWduKHtcbiAgICAgIHR5cGU6IDFcbiAgICAgIC8qIGRhdGVUaW1lICovXG4gICAgICAsXG4gICAgICBwYXR0ZXJuOiBwYXR0ZXJuXG4gICAgfSwgaW5zZXJ0TG9jYXRpb24oKSk7XG4gIH07XG5cbiAgdmFyIHBlZyRjNDEgPSBmdW5jdGlvbiBwZWckYzQxKCkge1xuICAgIG1lc3NhZ2VDdHgucHVzaCgnZGF0ZU9yVGltZUFyZ1N0eWxlJyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgdmFyIHBlZyRjNDIgPSBcImRhdGVcIjtcbiAgdmFyIHBlZyRjNDMgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiZGF0ZVwiLCBmYWxzZSk7XG4gIHZhciBwZWckYzQ0ID0gXCJ0aW1lXCI7XG4gIHZhciBwZWckYzQ1ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcInRpbWVcIiwgZmFsc2UpO1xuICB2YXIgcGVnJGM0NiA9IFwicGx1cmFsXCI7XG4gIHZhciBwZWckYzQ3ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcInBsdXJhbFwiLCBmYWxzZSk7XG4gIHZhciBwZWckYzQ4ID0gXCJzZWxlY3RvcmRpbmFsXCI7XG4gIHZhciBwZWckYzQ5ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcInNlbGVjdG9yZGluYWxcIiwgZmFsc2UpO1xuICB2YXIgcGVnJGM1MCA9IFwib2Zmc2V0OlwiO1xuICB2YXIgcGVnJGM1MSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJvZmZzZXQ6XCIsIGZhbHNlKTtcblxuICB2YXIgcGVnJGM1MiA9IGZ1bmN0aW9uIHBlZyRjNTIodmFsdWUsIHBsdXJhbFR5cGUsIG9mZnNldCwgb3B0aW9ucykge1xuICAgIHJldHVybiBfX2Fzc2lnbih7XG4gICAgICB0eXBlOiBUWVBFLnBsdXJhbCxcbiAgICAgIHBsdXJhbFR5cGU6IHBsdXJhbFR5cGUgPT09ICdwbHVyYWwnID8gJ2NhcmRpbmFsJyA6ICdvcmRpbmFsJyxcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIG9mZnNldDogb2Zmc2V0ID8gb2Zmc2V0WzJdIDogMCxcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnMucmVkdWNlKGZ1bmN0aW9uIChhbGwsIF9hKSB7XG4gICAgICAgIHZhciBpZCA9IF9hLmlkLFxuICAgICAgICAgICAgdmFsdWUgPSBfYS52YWx1ZSxcbiAgICAgICAgICAgIG9wdGlvbkxvY2F0aW9uID0gX2EubG9jYXRpb247XG5cbiAgICAgICAgaWYgKGlkIGluIGFsbCkge1xuICAgICAgICAgIGVycm9yKFwiRHVwbGljYXRlIG9wdGlvbiBcXFwiXCIgKyBpZCArIFwiXFxcIiBpbiBwbHVyYWwgZWxlbWVudDogXFxcIlwiICsgdGV4dCgpICsgXCJcXFwiXCIsIGxvY2F0aW9uKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgYWxsW2lkXSA9IHtcbiAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgbG9jYXRpb246IG9wdGlvbkxvY2F0aW9uXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBhbGw7XG4gICAgICB9LCB7fSlcbiAgICB9LCBpbnNlcnRMb2NhdGlvbigpKTtcbiAgfTtcblxuICB2YXIgcGVnJGM1MyA9IFwic2VsZWN0XCI7XG4gIHZhciBwZWckYzU0ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcInNlbGVjdFwiLCBmYWxzZSk7XG5cbiAgdmFyIHBlZyRjNTUgPSBmdW5jdGlvbiBwZWckYzU1KHZhbHVlLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIF9fYXNzaWduKHtcbiAgICAgIHR5cGU6IFRZUEUuc2VsZWN0LFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgb3B0aW9uczogb3B0aW9ucy5yZWR1Y2UoZnVuY3Rpb24gKGFsbCwgX2EpIHtcbiAgICAgICAgdmFyIGlkID0gX2EuaWQsXG4gICAgICAgICAgICB2YWx1ZSA9IF9hLnZhbHVlLFxuICAgICAgICAgICAgb3B0aW9uTG9jYXRpb24gPSBfYS5sb2NhdGlvbjtcblxuICAgICAgICBpZiAoaWQgaW4gYWxsKSB7XG4gICAgICAgICAgZXJyb3IoXCJEdXBsaWNhdGUgb3B0aW9uIFxcXCJcIiArIGlkICsgXCJcXFwiIGluIHNlbGVjdCBlbGVtZW50OiBcXFwiXCIgKyB0ZXh0KCkgKyBcIlxcXCJcIiwgbG9jYXRpb24oKSk7XG4gICAgICAgIH1cblxuICAgICAgICBhbGxbaWRdID0ge1xuICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICBsb2NhdGlvbjogb3B0aW9uTG9jYXRpb25cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGFsbDtcbiAgICAgIH0sIHt9KVxuICAgIH0sIGluc2VydExvY2F0aW9uKCkpO1xuICB9O1xuXG4gIHZhciBwZWckYzU2ID0gXCI9XCI7XG4gIHZhciBwZWckYzU3ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIj1cIiwgZmFsc2UpO1xuXG4gIHZhciBwZWckYzU4ID0gZnVuY3Rpb24gcGVnJGM1OChpZCkge1xuICAgIG1lc3NhZ2VDdHgucHVzaCgnc2VsZWN0Jyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgdmFyIHBlZyRjNTkgPSBmdW5jdGlvbiBwZWckYzU5KGlkLCB2YWx1ZSkge1xuICAgIG1lc3NhZ2VDdHgucG9wKCk7XG4gICAgcmV0dXJuIF9fYXNzaWduKHtcbiAgICAgIGlkOiBpZCxcbiAgICAgIHZhbHVlOiB2YWx1ZVxuICAgIH0sIGluc2VydExvY2F0aW9uKCkpO1xuICB9O1xuXG4gIHZhciBwZWckYzYwID0gZnVuY3Rpb24gcGVnJGM2MChpZCkge1xuICAgIG1lc3NhZ2VDdHgucHVzaCgncGx1cmFsJyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgdmFyIHBlZyRjNjEgPSBmdW5jdGlvbiBwZWckYzYxKGlkLCB2YWx1ZSkge1xuICAgIG1lc3NhZ2VDdHgucG9wKCk7XG4gICAgcmV0dXJuIF9fYXNzaWduKHtcbiAgICAgIGlkOiBpZCxcbiAgICAgIHZhbHVlOiB2YWx1ZVxuICAgIH0sIGluc2VydExvY2F0aW9uKCkpO1xuICB9O1xuXG4gIHZhciBwZWckYzYyID0gcGVnJG90aGVyRXhwZWN0YXRpb24oXCJ3aGl0ZXNwYWNlXCIpO1xuICB2YXIgcGVnJGM2MyA9IC9eW1xcdC1cXHIgXFx4ODVcXHhBMFxcdTE2ODBcXHUyMDAwLVxcdTIwMEFcXHUyMDI4XFx1MjAyOVxcdTIwMkZcXHUyMDVGXFx1MzAwMF0vO1xuICB2YXIgcGVnJGM2NCA9IHBlZyRjbGFzc0V4cGVjdGF0aW9uKFtbXCJcXHRcIiwgXCJcXHJcIl0sIFwiIFwiLCBcIlxceDg1XCIsIFwiXFx4QTBcIiwgXCJcXHUxNjgwXCIsIFtcIlxcdTIwMDBcIiwgXCJcXHUyMDBBXCJdLCBcIlxcdTIwMjhcIiwgXCJcXHUyMDI5XCIsIFwiXFx1MjAyRlwiLCBcIlxcdTIwNUZcIiwgXCJcXHUzMDAwXCJdLCBmYWxzZSwgZmFsc2UpO1xuICB2YXIgcGVnJGM2NSA9IHBlZyRvdGhlckV4cGVjdGF0aW9uKFwic3ludGF4IHBhdHRlcm5cIik7XG4gIHZhciBwZWckYzY2ID0gL15bIS1cXC86LUBbLVxcXmB7LX5cXHhBMS1cXHhBN1xceEE5XFx4QUJcXHhBQ1xceEFFXFx4QjBcXHhCMVxceEI2XFx4QkJcXHhCRlxceEQ3XFx4RjdcXHUyMDEwLVxcdTIwMjdcXHUyMDMwLVxcdTIwM0VcXHUyMDQxLVxcdTIwNTNcXHUyMDU1LVxcdTIwNUVcXHUyMTkwLVxcdTI0NUZcXHUyNTAwLVxcdTI3NzVcXHUyNzk0LVxcdTJCRkZcXHUyRTAwLVxcdTJFN0ZcXHUzMDAxLVxcdTMwMDNcXHUzMDA4LVxcdTMwMjBcXHUzMDMwXFx1RkQzRVxcdUZEM0ZcXHVGRTQ1XFx1RkU0Nl0vO1xuICB2YXIgcGVnJGM2NyA9IHBlZyRjbGFzc0V4cGVjdGF0aW9uKFtbXCIhXCIsIFwiL1wiXSwgW1wiOlwiLCBcIkBcIl0sIFtcIltcIiwgXCJeXCJdLCBcImBcIiwgW1wie1wiLCBcIn5cIl0sIFtcIlxceEExXCIsIFwiXFx4QTdcIl0sIFwiXFx4QTlcIiwgXCJcXHhBQlwiLCBcIlxceEFDXCIsIFwiXFx4QUVcIiwgXCJcXHhCMFwiLCBcIlxceEIxXCIsIFwiXFx4QjZcIiwgXCJcXHhCQlwiLCBcIlxceEJGXCIsIFwiXFx4RDdcIiwgXCJcXHhGN1wiLCBbXCJcXHUyMDEwXCIsIFwiXFx1MjAyN1wiXSwgW1wiXFx1MjAzMFwiLCBcIlxcdTIwM0VcIl0sIFtcIlxcdTIwNDFcIiwgXCJcXHUyMDUzXCJdLCBbXCJcXHUyMDU1XCIsIFwiXFx1MjA1RVwiXSwgW1wiXFx1MjE5MFwiLCBcIlxcdTI0NUZcIl0sIFtcIlxcdTI1MDBcIiwgXCJcXHUyNzc1XCJdLCBbXCJcXHUyNzk0XCIsIFwiXFx1MkJGRlwiXSwgW1wiXFx1MkUwMFwiLCBcIlxcdTJFN0ZcIl0sIFtcIlxcdTMwMDFcIiwgXCJcXHUzMDAzXCJdLCBbXCJcXHUzMDA4XCIsIFwiXFx1MzAyMFwiXSwgXCJcXHUzMDMwXCIsIFwiXFx1RkQzRVwiLCBcIlxcdUZEM0ZcIiwgXCJcXHVGRTQ1XCIsIFwiXFx1RkU0NlwiXSwgZmFsc2UsIGZhbHNlKTtcbiAgdmFyIHBlZyRjNjggPSBwZWckb3RoZXJFeHBlY3RhdGlvbihcIm9wdGlvbmFsIHdoaXRlc3BhY2VcIik7XG4gIHZhciBwZWckYzY5ID0gcGVnJG90aGVyRXhwZWN0YXRpb24oXCJudW1iZXJcIik7XG4gIHZhciBwZWckYzcwID0gXCItXCI7XG4gIHZhciBwZWckYzcxID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIi1cIiwgZmFsc2UpO1xuXG4gIHZhciBwZWckYzcyID0gZnVuY3Rpb24gcGVnJGM3MihuZWdhdGl2ZSwgbnVtKSB7XG4gICAgcmV0dXJuIG51bSA/IG5lZ2F0aXZlID8gLW51bSA6IG51bSA6IDA7XG4gIH07XG5cbiAgdmFyIHBlZyRjNzMgPSBwZWckb3RoZXJFeHBlY3RhdGlvbihcImFwb3N0cm9waGVcIik7XG4gIHZhciBwZWckYzc0ID0gcGVnJG90aGVyRXhwZWN0YXRpb24oXCJkb3VibGUgYXBvc3Ryb3BoZXNcIik7XG4gIHZhciBwZWckYzc1ID0gXCInJ1wiO1xuICB2YXIgcGVnJGM3NiA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCInJ1wiLCBmYWxzZSk7XG5cbiAgdmFyIHBlZyRjNzcgPSBmdW5jdGlvbiBwZWckYzc3KCkge1xuICAgIHJldHVybiBcIidcIjtcbiAgfTtcblxuICB2YXIgcGVnJGM3OCA9IGZ1bmN0aW9uIHBlZyRjNzgoZXNjYXBlZENoYXIsIHF1b3RlZENoYXJzKSB7XG4gICAgcmV0dXJuIGVzY2FwZWRDaGFyICsgcXVvdGVkQ2hhcnMucmVwbGFjZShcIicnXCIsIFwiJ1wiKTtcbiAgfTtcblxuICB2YXIgcGVnJGM3OSA9IGZ1bmN0aW9uIHBlZyRjNzkoeCkge1xuICAgIHJldHVybiB4ICE9PSAneycgJiYgIShpc0luUGx1cmFsT3B0aW9uKCkgJiYgeCA9PT0gJyMnKSAmJiAhKGlzTmVzdGVkTWVzc2FnZVRleHQoKSAmJiB4ID09PSAnfScpO1xuICB9O1xuXG4gIHZhciBwZWckYzgwID0gXCJcXG5cIjtcbiAgdmFyIHBlZyRjODEgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiXFxuXCIsIGZhbHNlKTtcblxuICB2YXIgcGVnJGM4MiA9IGZ1bmN0aW9uIHBlZyRjODIoeCkge1xuICAgIHJldHVybiB4ID09PSAneycgfHwgeCA9PT0gJ30nIHx8IGlzSW5QbHVyYWxPcHRpb24oKSAmJiB4ID09PSAnIyc7XG4gIH07XG5cbiAgdmFyIHBlZyRjODMgPSBwZWckb3RoZXJFeHBlY3RhdGlvbihcImFyZ05hbWVPck51bWJlclwiKTtcbiAgdmFyIHBlZyRjODQgPSBwZWckb3RoZXJFeHBlY3RhdGlvbihcImFyZ051bWJlclwiKTtcbiAgdmFyIHBlZyRjODUgPSBcIjBcIjtcbiAgdmFyIHBlZyRjODYgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiMFwiLCBmYWxzZSk7XG5cbiAgdmFyIHBlZyRjODcgPSBmdW5jdGlvbiBwZWckYzg3KCkge1xuICAgIHJldHVybiAwO1xuICB9O1xuXG4gIHZhciBwZWckYzg4ID0gL15bMS05XS87XG4gIHZhciBwZWckYzg5ID0gcGVnJGNsYXNzRXhwZWN0YXRpb24oW1tcIjFcIiwgXCI5XCJdXSwgZmFsc2UsIGZhbHNlKTtcbiAgdmFyIHBlZyRjOTAgPSAvXlswLTldLztcbiAgdmFyIHBlZyRjOTEgPSBwZWckY2xhc3NFeHBlY3RhdGlvbihbW1wiMFwiLCBcIjlcIl1dLCBmYWxzZSwgZmFsc2UpO1xuXG4gIHZhciBwZWckYzkyID0gZnVuY3Rpb24gcGVnJGM5MihkaWdpdHMpIHtcbiAgICByZXR1cm4gcGFyc2VJbnQoZGlnaXRzLmpvaW4oJycpLCAxMCk7XG4gIH07XG5cbiAgdmFyIHBlZyRjOTMgPSBwZWckb3RoZXJFeHBlY3RhdGlvbihcImFyZ05hbWVcIik7XG4gIHZhciBwZWckY3VyclBvcyA9IDA7XG4gIHZhciBwZWckc2F2ZWRQb3MgPSAwO1xuICB2YXIgcGVnJHBvc0RldGFpbHNDYWNoZSA9IFt7XG4gICAgbGluZTogMSxcbiAgICBjb2x1bW46IDFcbiAgfV07XG4gIHZhciBwZWckbWF4RmFpbFBvcyA9IDA7XG4gIHZhciBwZWckbWF4RmFpbEV4cGVjdGVkID0gW107XG4gIHZhciBwZWckc2lsZW50RmFpbHMgPSAwO1xuICB2YXIgcGVnJHJlc3VsdDtcblxuICBpZiAob3B0aW9ucy5zdGFydFJ1bGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICghKG9wdGlvbnMuc3RhcnRSdWxlIGluIHBlZyRzdGFydFJ1bGVGdW5jdGlvbnMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBzdGFydCBwYXJzaW5nIGZyb20gcnVsZSBcXFwiXCIgKyBvcHRpb25zLnN0YXJ0UnVsZSArIFwiXFxcIi5cIik7XG4gICAgfVxuXG4gICAgcGVnJHN0YXJ0UnVsZUZ1bmN0aW9uID0gcGVnJHN0YXJ0UnVsZUZ1bmN0aW9uc1tvcHRpb25zLnN0YXJ0UnVsZV07XG4gIH1cblxuICBmdW5jdGlvbiB0ZXh0KCkge1xuICAgIHJldHVybiBpbnB1dC5zdWJzdHJpbmcocGVnJHNhdmVkUG9zLCBwZWckY3VyclBvcyk7XG4gIH1cblxuICBmdW5jdGlvbiBsb2NhdGlvbigpIHtcbiAgICByZXR1cm4gcGVnJGNvbXB1dGVMb2NhdGlvbihwZWckc2F2ZWRQb3MsIHBlZyRjdXJyUG9zKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGV4cGVjdGVkKGRlc2NyaXB0aW9uLCBsb2NhdGlvbjEpIHtcbiAgICBsb2NhdGlvbjEgPSBsb2NhdGlvbjEgIT09IHVuZGVmaW5lZCA/IGxvY2F0aW9uMSA6IHBlZyRjb21wdXRlTG9jYXRpb24ocGVnJHNhdmVkUG9zLCBwZWckY3VyclBvcyk7XG4gICAgdGhyb3cgcGVnJGJ1aWxkU3RydWN0dXJlZEVycm9yKFtwZWckb3RoZXJFeHBlY3RhdGlvbihkZXNjcmlwdGlvbildLCBpbnB1dC5zdWJzdHJpbmcocGVnJHNhdmVkUG9zLCBwZWckY3VyclBvcyksIGxvY2F0aW9uMSk7XG4gIH1cblxuICBmdW5jdGlvbiBlcnJvcihtZXNzYWdlLCBsb2NhdGlvbjEpIHtcbiAgICBsb2NhdGlvbjEgPSBsb2NhdGlvbjEgIT09IHVuZGVmaW5lZCA/IGxvY2F0aW9uMSA6IHBlZyRjb21wdXRlTG9jYXRpb24ocGVnJHNhdmVkUG9zLCBwZWckY3VyclBvcyk7XG4gICAgdGhyb3cgcGVnJGJ1aWxkU2ltcGxlRXJyb3IobWVzc2FnZSwgbG9jYXRpb24xKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRsaXRlcmFsRXhwZWN0YXRpb24odGV4dDEsIGlnbm9yZUNhc2UpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJsaXRlcmFsXCIsXG4gICAgICB0ZXh0OiB0ZXh0MSxcbiAgICAgIGlnbm9yZUNhc2U6IGlnbm9yZUNhc2VcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJGNsYXNzRXhwZWN0YXRpb24ocGFydHMsIGludmVydGVkLCBpZ25vcmVDYXNlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwiY2xhc3NcIixcbiAgICAgIHBhcnRzOiBwYXJ0cyxcbiAgICAgIGludmVydGVkOiBpbnZlcnRlZCxcbiAgICAgIGlnbm9yZUNhc2U6IGlnbm9yZUNhc2VcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJGFueUV4cGVjdGF0aW9uKCkge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcImFueVwiXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRlbmRFeHBlY3RhdGlvbigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJlbmRcIlxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBwZWckb3RoZXJFeHBlY3RhdGlvbihkZXNjcmlwdGlvbikge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcIm90aGVyXCIsXG4gICAgICBkZXNjcmlwdGlvbjogZGVzY3JpcHRpb25cbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJGNvbXB1dGVQb3NEZXRhaWxzKHBvcykge1xuICAgIHZhciBkZXRhaWxzID0gcGVnJHBvc0RldGFpbHNDYWNoZVtwb3NdO1xuICAgIHZhciBwO1xuXG4gICAgaWYgKGRldGFpbHMpIHtcbiAgICAgIHJldHVybiBkZXRhaWxzO1xuICAgIH0gZWxzZSB7XG4gICAgICBwID0gcG9zIC0gMTtcblxuICAgICAgd2hpbGUgKCFwZWckcG9zRGV0YWlsc0NhY2hlW3BdKSB7XG4gICAgICAgIHAtLTtcbiAgICAgIH1cblxuICAgICAgZGV0YWlscyA9IHBlZyRwb3NEZXRhaWxzQ2FjaGVbcF07XG4gICAgICBkZXRhaWxzID0ge1xuICAgICAgICBsaW5lOiBkZXRhaWxzLmxpbmUsXG4gICAgICAgIGNvbHVtbjogZGV0YWlscy5jb2x1bW5cbiAgICAgIH07XG5cbiAgICAgIHdoaWxlIChwIDwgcG9zKSB7XG4gICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHApID09PSAxMCkge1xuICAgICAgICAgIGRldGFpbHMubGluZSsrO1xuICAgICAgICAgIGRldGFpbHMuY29sdW1uID0gMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZXRhaWxzLmNvbHVtbisrO1xuICAgICAgICB9XG5cbiAgICAgICAgcCsrO1xuICAgICAgfVxuXG4gICAgICBwZWckcG9zRGV0YWlsc0NhY2hlW3Bvc10gPSBkZXRhaWxzO1xuICAgICAgcmV0dXJuIGRldGFpbHM7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcGVnJGNvbXB1dGVMb2NhdGlvbihzdGFydFBvcywgZW5kUG9zKSB7XG4gICAgdmFyIHN0YXJ0UG9zRGV0YWlscyA9IHBlZyRjb21wdXRlUG9zRGV0YWlscyhzdGFydFBvcyk7XG4gICAgdmFyIGVuZFBvc0RldGFpbHMgPSBwZWckY29tcHV0ZVBvc0RldGFpbHMoZW5kUG9zKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhcnQ6IHtcbiAgICAgICAgb2Zmc2V0OiBzdGFydFBvcyxcbiAgICAgICAgbGluZTogc3RhcnRQb3NEZXRhaWxzLmxpbmUsXG4gICAgICAgIGNvbHVtbjogc3RhcnRQb3NEZXRhaWxzLmNvbHVtblxuICAgICAgfSxcbiAgICAgIGVuZDoge1xuICAgICAgICBvZmZzZXQ6IGVuZFBvcyxcbiAgICAgICAgbGluZTogZW5kUG9zRGV0YWlscy5saW5lLFxuICAgICAgICBjb2x1bW46IGVuZFBvc0RldGFpbHMuY29sdW1uXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRmYWlsKGV4cGVjdGVkMSkge1xuICAgIGlmIChwZWckY3VyclBvcyA8IHBlZyRtYXhGYWlsUG9zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHBlZyRjdXJyUG9zID4gcGVnJG1heEZhaWxQb3MpIHtcbiAgICAgIHBlZyRtYXhGYWlsUG9zID0gcGVnJGN1cnJQb3M7XG4gICAgICBwZWckbWF4RmFpbEV4cGVjdGVkID0gW107XG4gICAgfVxuXG4gICAgcGVnJG1heEZhaWxFeHBlY3RlZC5wdXNoKGV4cGVjdGVkMSk7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckYnVpbGRTaW1wbGVFcnJvcihtZXNzYWdlLCBsb2NhdGlvbjEpIHtcbiAgICByZXR1cm4gbmV3IFN5bnRheEVycm9yKG1lc3NhZ2UsIFtdLCBcIlwiLCBsb2NhdGlvbjEpO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJGJ1aWxkU3RydWN0dXJlZEVycm9yKGV4cGVjdGVkMSwgZm91bmQsIGxvY2F0aW9uMSkge1xuICAgIHJldHVybiBuZXcgU3ludGF4RXJyb3IoU3ludGF4RXJyb3IuYnVpbGRNZXNzYWdlKGV4cGVjdGVkMSwgZm91bmQpLCBleHBlY3RlZDEsIGZvdW5kLCBsb2NhdGlvbjEpO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlc3RhcnQoKSB7XG4gICAgdmFyIHMwO1xuICAgIHMwID0gcGVnJHBhcnNlbWVzc2FnZSgpO1xuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZW1lc3NhZ2UoKSB7XG4gICAgdmFyIHMwLCBzMTtcbiAgICBzMCA9IFtdO1xuICAgIHMxID0gcGVnJHBhcnNlbWVzc2FnZUVsZW1lbnQoKTtcblxuICAgIHdoaWxlIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczAucHVzaChzMSk7XG4gICAgICBzMSA9IHBlZyRwYXJzZW1lc3NhZ2VFbGVtZW50KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlbWVzc2FnZUVsZW1lbnQoKSB7XG4gICAgdmFyIHMwO1xuICAgIHMwID0gcGVnJHBhcnNlbGl0ZXJhbEVsZW1lbnQoKTtcblxuICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgczAgPSBwZWckcGFyc2Vhcmd1bWVudEVsZW1lbnQoKTtcblxuICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMwID0gcGVnJHBhcnNlc2ltcGxlRm9ybWF0RWxlbWVudCgpO1xuXG4gICAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMwID0gcGVnJHBhcnNlcGx1cmFsRWxlbWVudCgpO1xuXG4gICAgICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzMCA9IHBlZyRwYXJzZXNlbGVjdEVsZW1lbnQoKTtcblxuICAgICAgICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHMwID0gcGVnJHBhcnNlcG91bmRFbGVtZW50KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlbWVzc2FnZVRleHQoKSB7XG4gICAgdmFyIHMwLCBzMSwgczI7XG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IFtdO1xuICAgIHMyID0gcGVnJHBhcnNlZG91YmxlQXBvc3Ryb3BoZXMoKTtcblxuICAgIGlmIChzMiA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBwZWckcGFyc2VxdW90ZWRTdHJpbmcoKTtcblxuICAgICAgaWYgKHMyID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMyID0gcGVnJHBhcnNldW5xdW90ZWRTdHJpbmcoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHdoaWxlIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMS5wdXNoKHMyKTtcbiAgICAgICAgczIgPSBwZWckcGFyc2Vkb3VibGVBcG9zdHJvcGhlcygpO1xuXG4gICAgICAgIGlmIChzMiA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMyID0gcGVnJHBhcnNlcXVvdGVkU3RyaW5nKCk7XG5cbiAgICAgICAgICBpZiAoczIgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHMyID0gcGVnJHBhcnNldW5xdW90ZWRTdHJpbmcoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICBzMSA9IHBlZyRjMChzMSk7XG4gICAgfVxuXG4gICAgczAgPSBzMTtcbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VsaXRlcmFsRWxlbWVudCgpIHtcbiAgICB2YXIgczAsIHMxO1xuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgczEgPSBwZWckcGFyc2VtZXNzYWdlVGV4dCgpO1xuXG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgIHMxID0gcGVnJGMxKHMxKTtcbiAgICB9XG5cbiAgICBzMCA9IHMxO1xuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZXBvdW5kRWxlbWVudCgpIHtcbiAgICB2YXIgczAsIHMxO1xuICAgIHMwID0gcGVnJGN1cnJQb3M7XG5cbiAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDM1KSB7XG4gICAgICBzMSA9IHBlZyRjMjtcbiAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcblxuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkge1xuICAgICAgICBwZWckZmFpbChwZWckYzMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICBzMSA9IHBlZyRjNCgpO1xuICAgIH1cblxuICAgIHMwID0gczE7XG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlYXJndW1lbnRFbGVtZW50KCkge1xuICAgIHZhciBzMCwgczEsIHMyLCBzMywgczQsIHM1O1xuICAgIHBlZyRzaWxlbnRGYWlscysrO1xuICAgIHMwID0gcGVnJGN1cnJQb3M7XG5cbiAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDEyMykge1xuICAgICAgczEgPSBwZWckYzY7XG4gICAgICBwZWckY3VyclBvcysrO1xuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG5cbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHtcbiAgICAgICAgcGVnJGZhaWwocGVnJGM3KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMyID0gcGVnJHBhcnNlXygpO1xuXG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczMgPSBwZWckcGFyc2VhcmdOYW1lT3JOdW1iZXIoKTtcblxuICAgICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNCA9IHBlZyRwYXJzZV8oKTtcblxuICAgICAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSAxMjUpIHtcbiAgICAgICAgICAgICAgczUgPSBwZWckYzg7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzNSA9IHBlZyRGQUlMRUQ7XG5cbiAgICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHBlZyRmYWlsKHBlZyRjOSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgICAgICBzMSA9IHBlZyRjMTAoczMpO1xuICAgICAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHBlZyRzaWxlbnRGYWlscy0tO1xuXG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG5cbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHtcbiAgICAgICAgcGVnJGZhaWwocGVnJGM1KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VudW1iZXJTa2VsZXRvbklkKCkge1xuICAgIHZhciBzMCwgczEsIHMyLCBzMywgczQ7XG4gICAgcGVnJHNpbGVudEZhaWxzKys7XG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IFtdO1xuICAgIHMyID0gcGVnJGN1cnJQb3M7XG4gICAgczMgPSBwZWckY3VyclBvcztcbiAgICBwZWckc2lsZW50RmFpbHMrKztcbiAgICBzNCA9IHBlZyRwYXJzZXdoaXRlU3BhY2UoKTtcblxuICAgIGlmIChzNCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgaWYgKHBlZyRjMTIudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgICBzNCA9IGlucHV0LmNoYXJBdChwZWckY3VyclBvcyk7XG4gICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzNCA9IHBlZyRGQUlMRUQ7XG5cbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkge1xuICAgICAgICAgIHBlZyRmYWlsKHBlZyRjMTMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGVnJHNpbGVudEZhaWxzLS07XG5cbiAgICBpZiAoczQgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMzID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgaWYgKGlucHV0Lmxlbmd0aCA+IHBlZyRjdXJyUG9zKSB7XG4gICAgICAgIHM0ID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHM0ID0gcGVnJEZBSUxFRDtcblxuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7XG4gICAgICAgICAgcGVnJGZhaWwocGVnJGMxNCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMzID0gW3MzLCBzNF07XG4gICAgICAgIHMyID0gczM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMyO1xuICAgICAgICBzMiA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczI7XG4gICAgICBzMiA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuXG4gICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICB3aGlsZSAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczEucHVzaChzMik7XG4gICAgICAgIHMyID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIHBlZyRzaWxlbnRGYWlscysrO1xuICAgICAgICBzNCA9IHBlZyRwYXJzZXdoaXRlU3BhY2UoKTtcblxuICAgICAgICBpZiAoczQgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBpZiAocGVnJGMxMi50ZXN0KGlucHV0LmNoYXJBdChwZWckY3VyclBvcykpKSB7XG4gICAgICAgICAgICBzNCA9IGlucHV0LmNoYXJBdChwZWckY3VyclBvcyk7XG4gICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzNCA9IHBlZyRGQUlMRUQ7XG5cbiAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHtcbiAgICAgICAgICAgICAgcGVnJGZhaWwocGVnJGMxMyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcGVnJHNpbGVudEZhaWxzLS07XG5cbiAgICAgICAgaWYgKHM0ID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczMgPSB1bmRlZmluZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBpZiAoaW5wdXQubGVuZ3RoID4gcGVnJGN1cnJQb3MpIHtcbiAgICAgICAgICAgIHM0ID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHM0ID0gcGVnJEZBSUxFRDtcblxuICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkge1xuICAgICAgICAgICAgICBwZWckZmFpbChwZWckYzE0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHMzID0gW3MzLCBzNF07XG4gICAgICAgICAgICBzMiA9IHMzO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMyO1xuICAgICAgICAgICAgczIgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMyO1xuICAgICAgICAgIHMyID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuXG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMCA9IGlucHV0LnN1YnN0cmluZyhzMCwgcGVnJGN1cnJQb3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzMCA9IHMxO1xuICAgIH1cblxuICAgIHBlZyRzaWxlbnRGYWlscy0tO1xuXG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG5cbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHtcbiAgICAgICAgcGVnJGZhaWwocGVnJGMxMSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlbnVtYmVyU2tlbGV0b25Ub2tlbk9wdGlvbigpIHtcbiAgICB2YXIgczAsIHMxLCBzMjtcbiAgICBwZWckc2lsZW50RmFpbHMrKztcbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuXG4gICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA0Nykge1xuICAgICAgczEgPSBwZWckYzE2O1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuXG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7XG4gICAgICAgIHBlZyRmYWlsKHBlZyRjMTcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBwZWckcGFyc2VudW1iZXJTa2VsZXRvbklkKCk7XG5cbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzE4KHMyKTtcbiAgICAgICAgczAgPSBzMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG5cbiAgICBwZWckc2lsZW50RmFpbHMtLTtcblxuICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuXG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7XG4gICAgICAgIHBlZyRmYWlsKHBlZyRjMTUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZW51bWJlclNrZWxldG9uVG9rZW4oKSB7XG4gICAgdmFyIHMwLCBzMSwgczIsIHMzLCBzNDtcbiAgICBwZWckc2lsZW50RmFpbHMrKztcbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIHMxID0gcGVnJHBhcnNlXygpO1xuXG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMiA9IHBlZyRwYXJzZW51bWJlclNrZWxldG9uSWQoKTtcblxuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMzID0gW107XG4gICAgICAgIHM0ID0gcGVnJHBhcnNlbnVtYmVyU2tlbGV0b25Ub2tlbk9wdGlvbigpO1xuXG4gICAgICAgIHdoaWxlIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMzLnB1c2goczQpO1xuICAgICAgICAgIHM0ID0gcGVnJHBhcnNlbnVtYmVyU2tlbGV0b25Ub2tlbk9wdGlvbigpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgczEgPSBwZWckYzIwKHMyLCBzMyk7XG4gICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHBlZyRzaWxlbnRGYWlscy0tO1xuXG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG5cbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHtcbiAgICAgICAgcGVnJGZhaWwocGVnJGMxOSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlbnVtYmVyU2tlbGV0b24oKSB7XG4gICAgdmFyIHMwLCBzMSwgczI7XG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IFtdO1xuICAgIHMyID0gcGVnJHBhcnNlbnVtYmVyU2tlbGV0b25Ub2tlbigpO1xuXG4gICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICB3aGlsZSAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczEucHVzaChzMik7XG4gICAgICAgIHMyID0gcGVnJHBhcnNlbnVtYmVyU2tlbGV0b25Ub2tlbigpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuXG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgIHMxID0gcGVnJGMyMShzMSk7XG4gICAgfVxuXG4gICAgczAgPSBzMTtcbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VudW1iZXJBcmdTdHlsZSgpIHtcbiAgICB2YXIgczAsIHMxLCBzMjtcbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuXG4gICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMikgPT09IHBlZyRjMjIpIHtcbiAgICAgIHMxID0gcGVnJGMyMjtcbiAgICAgIHBlZyRjdXJyUG9zICs9IDI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcblxuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkge1xuICAgICAgICBwZWckZmFpbChwZWckYzIzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMyID0gcGVnJHBhcnNlbnVtYmVyU2tlbGV0b24oKTtcblxuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICBzMSA9IHBlZyRjMjQoczIpO1xuICAgICAgICBzMCA9IHMxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgIHBlZyRzYXZlZFBvcyA9IHBlZyRjdXJyUG9zO1xuICAgICAgczEgPSBwZWckYzI1KCk7XG5cbiAgICAgIGlmIChzMSkge1xuICAgICAgICBzMSA9IHVuZGVmaW5lZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cblxuICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMyID0gcGVnJHBhcnNlbWVzc2FnZVRleHQoKTtcblxuICAgICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICBzMSA9IHBlZyRjMjYoczIpO1xuICAgICAgICAgIHMwID0gczE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VudW1iZXJGb3JtYXRFbGVtZW50KCkge1xuICAgIHZhciBzMCwgczEsIHMyLCBzMywgczQsIHM1LCBzNiwgczcsIHM4LCBzOSwgczEwLCBzMTEsIHMxMjtcbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuXG4gICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSAxMjMpIHtcbiAgICAgIHMxID0gcGVnJGM2O1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuXG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7XG4gICAgICAgIHBlZyRmYWlsKHBlZyRjNyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMiA9IHBlZyRwYXJzZV8oKTtcblxuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMzID0gcGVnJHBhcnNlYXJnTmFtZU9yTnVtYmVyKCk7XG5cbiAgICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczQgPSBwZWckcGFyc2VfKCk7XG5cbiAgICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gNDQpIHtcbiAgICAgICAgICAgICAgczUgPSBwZWckYzI3O1xuICAgICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgczUgPSBwZWckRkFJTEVEO1xuXG4gICAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHtcbiAgICAgICAgICAgICAgICBwZWckZmFpbChwZWckYzI4KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczYgPSBwZWckcGFyc2VfKCk7XG5cbiAgICAgICAgICAgICAgaWYgKHM2ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNikgPT09IHBlZyRjMjkpIHtcbiAgICAgICAgICAgICAgICAgIHM3ID0gcGVnJGMyOTtcbiAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zICs9IDY7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHM3ID0gcGVnJEZBSUxFRDtcblxuICAgICAgICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBwZWckZmFpbChwZWckYzMwKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoczcgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgIHM4ID0gcGVnJHBhcnNlXygpO1xuXG4gICAgICAgICAgICAgICAgICBpZiAoczggIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgczkgPSBwZWckY3VyclBvcztcblxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDQ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgczEwID0gcGVnJGMyNztcbiAgICAgICAgICAgICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHMxMCA9IHBlZyRGQUlMRUQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwZWckZmFpbChwZWckYzI4KTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoczEwICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgczExID0gcGVnJHBhcnNlXygpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHMxMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgczEyID0gcGVnJHBhcnNlbnVtYmVyQXJnU3R5bGUoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMxMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzMTAgPSBbczEwLCBzMTEsIHMxMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHM5ID0gczEwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzOTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgczkgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHM5O1xuICAgICAgICAgICAgICAgICAgICAgICAgczkgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHM5O1xuICAgICAgICAgICAgICAgICAgICAgIHM5ID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChzOSA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgICAgIHM5ID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChzOSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgICAgIHMxMCA9IHBlZyRwYXJzZV8oKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGlmIChzMTAgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gMTI1KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHMxMSA9IHBlZyRjODtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHMxMSA9IHBlZyRGQUlMRUQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlZyRmYWlsKHBlZyRjOSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMxMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgczEgPSBwZWckYzMxKHMzLCBzNywgczkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZWRhdGVUaW1lU2tlbGV0b25MaXRlcmFsKCkge1xuICAgIHZhciBzMCwgczEsIHMyLCBzMztcbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuXG4gICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSAzOSkge1xuICAgICAgczEgPSBwZWckYzMyO1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuXG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7XG4gICAgICAgIHBlZyRmYWlsKHBlZyRjMzMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBbXTtcbiAgICAgIHMzID0gcGVnJHBhcnNlZG91YmxlQXBvc3Ryb3BoZXMoKTtcblxuICAgICAgaWYgKHMzID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIGlmIChwZWckYzM0LnRlc3QoaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKSkpIHtcbiAgICAgICAgICBzMyA9IGlucHV0LmNoYXJBdChwZWckY3VyclBvcyk7XG4gICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG5cbiAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7XG4gICAgICAgICAgICBwZWckZmFpbChwZWckYzM1KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHdoaWxlIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMyLnB1c2goczMpO1xuICAgICAgICAgIHMzID0gcGVnJHBhcnNlZG91YmxlQXBvc3Ryb3BoZXMoKTtcblxuICAgICAgICAgIGlmIChzMyA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgaWYgKHBlZyRjMzQudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgICAgICAgICBzMyA9IGlucHV0LmNoYXJBdChwZWckY3VyclBvcyk7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG5cbiAgICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHBlZyRmYWlsKHBlZyRjMzUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMiA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDM5KSB7XG4gICAgICAgICAgczMgPSBwZWckYzMyO1xuICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuXG4gICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkge1xuICAgICAgICAgICAgcGVnJGZhaWwocGVnJGMzMyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczEgPSBbczEsIHMyLCBzM107XG4gICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgczAgPSBbXTtcbiAgICAgIHMxID0gcGVnJHBhcnNlZG91YmxlQXBvc3Ryb3BoZXMoKTtcblxuICAgICAgaWYgKHMxID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIGlmIChwZWckYzM2LnRlc3QoaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKSkpIHtcbiAgICAgICAgICBzMSA9IGlucHV0LmNoYXJBdChwZWckY3VyclBvcyk7XG4gICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG5cbiAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7XG4gICAgICAgICAgICBwZWckZmFpbChwZWckYzM3KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHdoaWxlIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMwLnB1c2goczEpO1xuICAgICAgICAgIHMxID0gcGVnJHBhcnNlZG91YmxlQXBvc3Ryb3BoZXMoKTtcblxuICAgICAgICAgIGlmIChzMSA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgaWYgKHBlZyRjMzYudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgICAgICAgICBzMSA9IGlucHV0LmNoYXJBdChwZWckY3VyclBvcyk7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG5cbiAgICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHBlZyRmYWlsKHBlZyRjMzcpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlZGF0ZVRpbWVTa2VsZXRvblBhdHRlcm4oKSB7XG4gICAgdmFyIHMwLCBzMTtcbiAgICBzMCA9IFtdO1xuXG4gICAgaWYgKHBlZyRjMzgudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgczEgPSBpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpO1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuXG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7XG4gICAgICAgIHBlZyRmYWlsKHBlZyRjMzkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgd2hpbGUgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMwLnB1c2goczEpO1xuXG4gICAgICAgIGlmIChwZWckYzM4LnRlc3QoaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKSkpIHtcbiAgICAgICAgICBzMSA9IGlucHV0LmNoYXJBdChwZWckY3VyclBvcyk7XG4gICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG5cbiAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7XG4gICAgICAgICAgICBwZWckZmFpbChwZWckYzM5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZWRhdGVUaW1lU2tlbGV0b24oKSB7XG4gICAgdmFyIHMwLCBzMSwgczIsIHMzO1xuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgczEgPSBwZWckY3VyclBvcztcbiAgICBzMiA9IFtdO1xuICAgIHMzID0gcGVnJHBhcnNlZGF0ZVRpbWVTa2VsZXRvbkxpdGVyYWwoKTtcblxuICAgIGlmIChzMyA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgczMgPSBwZWckcGFyc2VkYXRlVGltZVNrZWxldG9uUGF0dGVybigpO1xuICAgIH1cblxuICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgd2hpbGUgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMyLnB1c2goczMpO1xuICAgICAgICBzMyA9IHBlZyRwYXJzZWRhdGVUaW1lU2tlbGV0b25MaXRlcmFsKCk7XG5cbiAgICAgICAgaWYgKHMzID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczMgPSBwZWckcGFyc2VkYXRlVGltZVNrZWxldG9uUGF0dGVybigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHMyID0gcGVnJEZBSUxFRDtcbiAgICB9XG5cbiAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMxID0gaW5wdXQuc3Vic3RyaW5nKHMxLCBwZWckY3VyclBvcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gczI7XG4gICAgfVxuXG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgIHMxID0gcGVnJGM0MChzMSk7XG4gICAgfVxuXG4gICAgczAgPSBzMTtcbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VkYXRlT3JUaW1lQXJnU3R5bGUoKSB7XG4gICAgdmFyIHMwLCBzMSwgczI7XG4gICAgczAgPSBwZWckY3VyclBvcztcblxuICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDIpID09PSBwZWckYzIyKSB7XG4gICAgICBzMSA9IHBlZyRjMjI7XG4gICAgICBwZWckY3VyclBvcyArPSAyO1xuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG5cbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHtcbiAgICAgICAgcGVnJGZhaWwocGVnJGMyMyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMiA9IHBlZyRwYXJzZWRhdGVUaW1lU2tlbGV0b24oKTtcblxuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICBzMSA9IHBlZyRjMjQoczIpO1xuICAgICAgICBzMCA9IHMxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgIHBlZyRzYXZlZFBvcyA9IHBlZyRjdXJyUG9zO1xuICAgICAgczEgPSBwZWckYzQxKCk7XG5cbiAgICAgIGlmIChzMSkge1xuICAgICAgICBzMSA9IHVuZGVmaW5lZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cblxuICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMyID0gcGVnJHBhcnNlbWVzc2FnZVRleHQoKTtcblxuICAgICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICBzMSA9IHBlZyRjMjYoczIpO1xuICAgICAgICAgIHMwID0gczE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VkYXRlT3JUaW1lRm9ybWF0RWxlbWVudCgpIHtcbiAgICB2YXIgczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczYsIHM3LCBzOCwgczksIHMxMCwgczExLCBzMTI7XG4gICAgczAgPSBwZWckY3VyclBvcztcblxuICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gMTIzKSB7XG4gICAgICBzMSA9IHBlZyRjNjtcbiAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcblxuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkge1xuICAgICAgICBwZWckZmFpbChwZWckYzcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBwZWckcGFyc2VfKCk7XG5cbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMyA9IHBlZyRwYXJzZWFyZ05hbWVPck51bWJlcigpO1xuXG4gICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM0ID0gcGVnJHBhcnNlXygpO1xuXG4gICAgICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDQ0KSB7XG4gICAgICAgICAgICAgIHM1ID0gcGVnJGMyNztcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHM1ID0gcGVnJEZBSUxFRDtcblxuICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcGVnJGZhaWwocGVnJGMyOCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHM2ID0gcGVnJHBhcnNlXygpO1xuXG4gICAgICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDQpID09PSBwZWckYzQyKSB7XG4gICAgICAgICAgICAgICAgICBzNyA9IHBlZyRjNDI7XG4gICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyArPSA0O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBzNyA9IHBlZyRGQUlMRUQ7XG5cbiAgICAgICAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcGVnJGZhaWwocGVnJGM0Myk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHM3ID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA0KSA9PT0gcGVnJGM0NCkge1xuICAgICAgICAgICAgICAgICAgICBzNyA9IHBlZyRjNDQ7XG4gICAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zICs9IDQ7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzNyA9IHBlZyRGQUlMRUQ7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgIHBlZyRmYWlsKHBlZyRjNDUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHM3ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICBzOCA9IHBlZyRwYXJzZV8oKTtcblxuICAgICAgICAgICAgICAgICAgaWYgKHM4ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICAgIHM5ID0gcGVnJGN1cnJQb3M7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA0NCkge1xuICAgICAgICAgICAgICAgICAgICAgIHMxMCA9IHBlZyRjMjc7XG4gICAgICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBzMTAgPSBwZWckRkFJTEVEO1xuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGVnJGZhaWwocGVnJGMyOCk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHMxMCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgICAgIHMxMSA9IHBlZyRwYXJzZV8oKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGlmIChzMTEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHMxMiA9IHBlZyRwYXJzZWRhdGVPclRpbWVBcmdTdHlsZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoczEyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHMxMCA9IFtzMTAsIHMxMSwgczEyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgczkgPSBzMTA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHM5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzOSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzOSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczk7XG4gICAgICAgICAgICAgICAgICAgICAgczkgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHM5ID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgczkgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHM5ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgczEwID0gcGVnJHBhcnNlXygpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHMxMCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSAxMjUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgczExID0gcGVnJGM4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgczExID0gcGVnJEZBSUxFRDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVnJGZhaWwocGVnJGM5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoczExICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzMSA9IHBlZyRjMzEoczMsIHM3LCBzOSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlc2ltcGxlRm9ybWF0RWxlbWVudCgpIHtcbiAgICB2YXIgczA7XG4gICAgczAgPSBwZWckcGFyc2VudW1iZXJGb3JtYXRFbGVtZW50KCk7XG5cbiAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMwID0gcGVnJHBhcnNlZGF0ZU9yVGltZUZvcm1hdEVsZW1lbnQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VwbHVyYWxFbGVtZW50KCkge1xuICAgIHZhciBzMCwgczEsIHMyLCBzMywgczQsIHM1LCBzNiwgczcsIHM4LCBzOSwgczEwLCBzMTEsIHMxMiwgczEzLCBzMTQsIHMxNTtcbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuXG4gICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSAxMjMpIHtcbiAgICAgIHMxID0gcGVnJGM2O1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuXG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7XG4gICAgICAgIHBlZyRmYWlsKHBlZyRjNyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMiA9IHBlZyRwYXJzZV8oKTtcblxuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMzID0gcGVnJHBhcnNlYXJnTmFtZU9yTnVtYmVyKCk7XG5cbiAgICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczQgPSBwZWckcGFyc2VfKCk7XG5cbiAgICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gNDQpIHtcbiAgICAgICAgICAgICAgczUgPSBwZWckYzI3O1xuICAgICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgczUgPSBwZWckRkFJTEVEO1xuXG4gICAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHtcbiAgICAgICAgICAgICAgICBwZWckZmFpbChwZWckYzI4KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczYgPSBwZWckcGFyc2VfKCk7XG5cbiAgICAgICAgICAgICAgaWYgKHM2ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNikgPT09IHBlZyRjNDYpIHtcbiAgICAgICAgICAgICAgICAgIHM3ID0gcGVnJGM0NjtcbiAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zICs9IDY7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHM3ID0gcGVnJEZBSUxFRDtcblxuICAgICAgICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBwZWckZmFpbChwZWckYzQ3KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoczcgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDEzKSA9PT0gcGVnJGM0OCkge1xuICAgICAgICAgICAgICAgICAgICBzNyA9IHBlZyRjNDg7XG4gICAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zICs9IDEzO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgczcgPSBwZWckRkFJTEVEO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICBwZWckZmFpbChwZWckYzQ5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChzNyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgczggPSBwZWckcGFyc2VfKCk7XG5cbiAgICAgICAgICAgICAgICAgIGlmIChzOCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDQ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgczkgPSBwZWckYzI3O1xuICAgICAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgczkgPSBwZWckRkFJTEVEO1xuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGVnJGZhaWwocGVnJGMyOCk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHM5ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgczEwID0gcGVnJHBhcnNlXygpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHMxMCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgczExID0gcGVnJGN1cnJQb3M7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDcpID09PSBwZWckYzUwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHMxMiA9IHBlZyRjNTA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zICs9IDc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzMTIgPSBwZWckRkFJTEVEO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZWckZmFpbChwZWckYzUxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoczEyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHMxMyA9IHBlZyRwYXJzZV8oKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoczEzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgczE0ID0gcGVnJHBhcnNlbnVtYmVyKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoczE0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMTIgPSBbczEyLCBzMTMsIHMxNF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMTEgPSBzMTI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczExO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgczExID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMTE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgczExID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMTE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHMxMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzMTEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgczExID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMxMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzMTIgPSBwZWckcGFyc2VfKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMxMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMxMyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMxNCA9IHBlZyRwYXJzZXBsdXJhbE9wdGlvbigpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMxNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHMxNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMTMucHVzaChzMTQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMTQgPSBwZWckcGFyc2VwbHVyYWxPcHRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgczEzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoczEzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMTQgPSBwZWckcGFyc2VfKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzMTQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSAxMjUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMTUgPSBwZWckYzg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMTUgPSBwZWckRkFJTEVEO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVnJGZhaWwocGVnJGM5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoczE1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgczEgPSBwZWckYzUyKHMzLCBzNywgczExLCBzMTMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VzZWxlY3RFbGVtZW50KCkge1xuICAgIHZhciBzMCwgczEsIHMyLCBzMywgczQsIHM1LCBzNiwgczcsIHM4LCBzOSwgczEwLCBzMTEsIHMxMiwgczEzO1xuICAgIHMwID0gcGVnJGN1cnJQb3M7XG5cbiAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDEyMykge1xuICAgICAgczEgPSBwZWckYzY7XG4gICAgICBwZWckY3VyclBvcysrO1xuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG5cbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHtcbiAgICAgICAgcGVnJGZhaWwocGVnJGM3KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMyID0gcGVnJHBhcnNlXygpO1xuXG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczMgPSBwZWckcGFyc2VhcmdOYW1lT3JOdW1iZXIoKTtcblxuICAgICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNCA9IHBlZyRwYXJzZV8oKTtcblxuICAgICAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA0NCkge1xuICAgICAgICAgICAgICBzNSA9IHBlZyRjMjc7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzNSA9IHBlZyRGQUlMRUQ7XG5cbiAgICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHBlZyRmYWlsKHBlZyRjMjgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNiA9IHBlZyRwYXJzZV8oKTtcblxuICAgICAgICAgICAgICBpZiAoczYgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA2KSA9PT0gcGVnJGM1Mykge1xuICAgICAgICAgICAgICAgICAgczcgPSBwZWckYzUzO1xuICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgKz0gNjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgczcgPSBwZWckRkFJTEVEO1xuXG4gICAgICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHBlZyRmYWlsKHBlZyRjNTQpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChzNyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgczggPSBwZWckcGFyc2VfKCk7XG5cbiAgICAgICAgICAgICAgICAgIGlmIChzOCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDQ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgczkgPSBwZWckYzI3O1xuICAgICAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgczkgPSBwZWckRkFJTEVEO1xuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGVnJGZhaWwocGVnJGMyOCk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHM5ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgczEwID0gcGVnJHBhcnNlXygpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHMxMCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgczExID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBzMTIgPSBwZWckcGFyc2VzZWxlY3RPcHRpb24oKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMxMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoczEyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgczExLnB1c2goczEyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMTIgPSBwZWckcGFyc2VzZWxlY3RPcHRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgczExID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMxMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzMTIgPSBwZWckcGFyc2VfKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMxMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gMTI1KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMTMgPSBwZWckYzg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMTMgPSBwZWckRkFJTEVEO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlZyRmYWlsKHBlZyRjOSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMxMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMSA9IHBlZyRjNTUoczMsIHMxMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZXBsdXJhbFJ1bGVTZWxlY3RWYWx1ZSgpIHtcbiAgICB2YXIgczAsIHMxLCBzMiwgczM7XG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IHBlZyRjdXJyUG9zO1xuXG4gICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA2MSkge1xuICAgICAgczIgPSBwZWckYzU2O1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczIgPSBwZWckRkFJTEVEO1xuXG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7XG4gICAgICAgIHBlZyRmYWlsKHBlZyRjNTcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczMgPSBwZWckcGFyc2VudW1iZXIoKTtcblxuICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMyID0gW3MyLCBzM107XG4gICAgICAgIHMxID0gczI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMxO1xuICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczE7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuXG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMCA9IGlucHV0LnN1YnN0cmluZyhzMCwgcGVnJGN1cnJQb3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzMCA9IHMxO1xuICAgIH1cblxuICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgczAgPSBwZWckcGFyc2VhcmdOYW1lKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlc2VsZWN0T3B0aW9uKCkge1xuICAgIHZhciBzMCwgczEsIHMyLCBzMywgczQsIHM1LCBzNiwgczc7XG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IHBlZyRwYXJzZV8oKTtcblxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBwZWckcGFyc2VhcmdOYW1lKCk7XG5cbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMyA9IHBlZyRwYXJzZV8oKTtcblxuICAgICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDEyMykge1xuICAgICAgICAgICAgczQgPSBwZWckYzY7XG4gICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzNCA9IHBlZyRGQUlMRUQ7XG5cbiAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHtcbiAgICAgICAgICAgICAgcGVnJGZhaWwocGVnJGM3KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHBlZyRjdXJyUG9zO1xuICAgICAgICAgICAgczUgPSBwZWckYzU4KHMyKTtcblxuICAgICAgICAgICAgaWYgKHM1KSB7XG4gICAgICAgICAgICAgIHM1ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgczUgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczYgPSBwZWckcGFyc2VtZXNzYWdlKCk7XG5cbiAgICAgICAgICAgICAgaWYgKHM2ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSAxMjUpIHtcbiAgICAgICAgICAgICAgICAgIHM3ID0gcGVnJGM4O1xuICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgczcgPSBwZWckRkFJTEVEO1xuXG4gICAgICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHBlZyRmYWlsKHBlZyRjOSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHM3ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICAgIHMxID0gcGVnJGM1OShzMiwgczYpO1xuICAgICAgICAgICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VwbHVyYWxPcHRpb24oKSB7XG4gICAgdmFyIHMwLCBzMSwgczIsIHMzLCBzNCwgczUsIHM2LCBzNztcbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIHMxID0gcGVnJHBhcnNlXygpO1xuXG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMiA9IHBlZyRwYXJzZXBsdXJhbFJ1bGVTZWxlY3RWYWx1ZSgpO1xuXG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczMgPSBwZWckcGFyc2VfKCk7XG5cbiAgICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSAxMjMpIHtcbiAgICAgICAgICAgIHM0ID0gcGVnJGM2O1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgczQgPSBwZWckRkFJTEVEO1xuXG4gICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7XG4gICAgICAgICAgICAgIHBlZyRmYWlsKHBlZyRjNyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBwZWckY3VyclBvcztcbiAgICAgICAgICAgIHM1ID0gcGVnJGM2MChzMik7XG5cbiAgICAgICAgICAgIGlmIChzNSkge1xuICAgICAgICAgICAgICBzNSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHM1ID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHM2ID0gcGVnJHBhcnNlbWVzc2FnZSgpO1xuXG4gICAgICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gMTI1KSB7XG4gICAgICAgICAgICAgICAgICBzNyA9IHBlZyRjODtcbiAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHM3ID0gcGVnJEZBSUxFRDtcblxuICAgICAgICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBwZWckZmFpbChwZWckYzkpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChzNyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICAgICAgICBzMSA9IHBlZyRjNjEoczIsIHM2KTtcbiAgICAgICAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNld2hpdGVTcGFjZSgpIHtcbiAgICB2YXIgczAsIHMxO1xuICAgIHBlZyRzaWxlbnRGYWlscysrO1xuXG4gICAgaWYgKHBlZyRjNjMudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgczAgPSBpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpO1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuXG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7XG4gICAgICAgIHBlZyRmYWlsKHBlZyRjNjQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHBlZyRzaWxlbnRGYWlscy0tO1xuXG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG5cbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHtcbiAgICAgICAgcGVnJGZhaWwocGVnJGM2Mik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlcGF0dGVyblN5bnRheCgpIHtcbiAgICB2YXIgczAsIHMxO1xuICAgIHBlZyRzaWxlbnRGYWlscysrO1xuXG4gICAgaWYgKHBlZyRjNjYudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgczAgPSBpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpO1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuXG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7XG4gICAgICAgIHBlZyRmYWlsKHBlZyRjNjcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHBlZyRzaWxlbnRGYWlscy0tO1xuXG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG5cbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHtcbiAgICAgICAgcGVnJGZhaWwocGVnJGM2NSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlXygpIHtcbiAgICB2YXIgczAsIHMxLCBzMjtcbiAgICBwZWckc2lsZW50RmFpbHMrKztcbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIHMxID0gW107XG4gICAgczIgPSBwZWckcGFyc2V3aGl0ZVNwYWNlKCk7XG5cbiAgICB3aGlsZSAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMxLnB1c2goczIpO1xuICAgICAgczIgPSBwZWckcGFyc2V3aGl0ZVNwYWNlKCk7XG4gICAgfVxuXG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMCA9IGlucHV0LnN1YnN0cmluZyhzMCwgcGVnJGN1cnJQb3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzMCA9IHMxO1xuICAgIH1cblxuICAgIHBlZyRzaWxlbnRGYWlscy0tO1xuXG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG5cbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHtcbiAgICAgICAgcGVnJGZhaWwocGVnJGM2OCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlbnVtYmVyKCkge1xuICAgIHZhciBzMCwgczEsIHMyO1xuICAgIHBlZyRzaWxlbnRGYWlscysrO1xuICAgIHMwID0gcGVnJGN1cnJQb3M7XG5cbiAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDQ1KSB7XG4gICAgICBzMSA9IHBlZyRjNzA7XG4gICAgICBwZWckY3VyclBvcysrO1xuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG5cbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHtcbiAgICAgICAgcGVnJGZhaWwocGVnJGM3MSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHMxID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMSA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMiA9IHBlZyRwYXJzZWFyZ051bWJlcigpO1xuXG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgIHMxID0gcGVnJGM3MihzMSwgczIpO1xuICAgICAgICBzMCA9IHMxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHBlZyRzaWxlbnRGYWlscy0tO1xuXG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG5cbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHtcbiAgICAgICAgcGVnJGZhaWwocGVnJGM2OSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlYXBvc3Ryb3BoZSgpIHtcbiAgICB2YXIgczAsIHMxO1xuICAgIHBlZyRzaWxlbnRGYWlscysrO1xuXG4gICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSAzOSkge1xuICAgICAgczAgPSBwZWckYzMyO1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuXG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7XG4gICAgICAgIHBlZyRmYWlsKHBlZyRjMzMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHBlZyRzaWxlbnRGYWlscy0tO1xuXG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG5cbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHtcbiAgICAgICAgcGVnJGZhaWwocGVnJGM3Myk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlZG91YmxlQXBvc3Ryb3BoZXMoKSB7XG4gICAgdmFyIHMwLCBzMTtcbiAgICBwZWckc2lsZW50RmFpbHMrKztcbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuXG4gICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMikgPT09IHBlZyRjNzUpIHtcbiAgICAgIHMxID0gcGVnJGM3NTtcbiAgICAgIHBlZyRjdXJyUG9zICs9IDI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcblxuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkge1xuICAgICAgICBwZWckZmFpbChwZWckYzc2KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgczEgPSBwZWckYzc3KCk7XG4gICAgfVxuXG4gICAgczAgPSBzMTtcbiAgICBwZWckc2lsZW50RmFpbHMtLTtcblxuICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuXG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7XG4gICAgICAgIHBlZyRmYWlsKHBlZyRjNzQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZXF1b3RlZFN0cmluZygpIHtcbiAgICB2YXIgczAsIHMxLCBzMiwgczMsIHM0LCBzNTtcbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuXG4gICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSAzOSkge1xuICAgICAgczEgPSBwZWckYzMyO1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuXG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7XG4gICAgICAgIHBlZyRmYWlsKHBlZyRjMzMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBwZWckcGFyc2Vlc2NhcGVkQ2hhcigpO1xuXG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczMgPSBwZWckY3VyclBvcztcbiAgICAgICAgczQgPSBbXTtcblxuICAgICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAyKSA9PT0gcGVnJGM3NSkge1xuICAgICAgICAgIHM1ID0gcGVnJGM3NTtcbiAgICAgICAgICBwZWckY3VyclBvcyArPSAyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHM1ID0gcGVnJEZBSUxFRDtcblxuICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHtcbiAgICAgICAgICAgIHBlZyRmYWlsKHBlZyRjNzYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzNSA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIGlmIChwZWckYzM0LnRlc3QoaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKSkpIHtcbiAgICAgICAgICAgIHM1ID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHM1ID0gcGVnJEZBSUxFRDtcblxuICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkge1xuICAgICAgICAgICAgICBwZWckZmFpbChwZWckYzM1KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB3aGlsZSAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNC5wdXNoKHM1KTtcblxuICAgICAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDIpID09PSBwZWckYzc1KSB7XG4gICAgICAgICAgICBzNSA9IHBlZyRjNzU7XG4gICAgICAgICAgICBwZWckY3VyclBvcyArPSAyO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzNSA9IHBlZyRGQUlMRUQ7XG5cbiAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHtcbiAgICAgICAgICAgICAgcGVnJGZhaWwocGVnJGM3Nik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHM1ID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBpZiAocGVnJGMzNC50ZXN0KGlucHV0LmNoYXJBdChwZWckY3VyclBvcykpKSB7XG4gICAgICAgICAgICAgIHM1ID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHM1ID0gcGVnJEZBSUxFRDtcblxuICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcGVnJGZhaWwocGVnJGMzNSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzMyA9IGlucHV0LnN1YnN0cmluZyhzMywgcGVnJGN1cnJQb3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDM5KSB7XG4gICAgICAgICAgICBzNCA9IHBlZyRjMzI7XG4gICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzNCA9IHBlZyRGQUlMRUQ7XG5cbiAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHtcbiAgICAgICAgICAgICAgcGVnJGZhaWwocGVnJGMzMyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHM0ID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNCA9IG51bGw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICAgIHMxID0gcGVnJGM3OChzMiwgczMpO1xuICAgICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2V1bnF1b3RlZFN0cmluZygpIHtcbiAgICB2YXIgczAsIHMxLCBzMiwgczM7XG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IHBlZyRjdXJyUG9zO1xuXG4gICAgaWYgKGlucHV0Lmxlbmd0aCA+IHBlZyRjdXJyUG9zKSB7XG4gICAgICBzMiA9IGlucHV0LmNoYXJBdChwZWckY3VyclBvcyk7XG4gICAgICBwZWckY3VyclBvcysrO1xuICAgIH0gZWxzZSB7XG4gICAgICBzMiA9IHBlZyRGQUlMRUQ7XG5cbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHtcbiAgICAgICAgcGVnJGZhaWwocGVnJGMxNCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBwZWckc2F2ZWRQb3MgPSBwZWckY3VyclBvcztcbiAgICAgIHMzID0gcGVnJGM3OShzMik7XG5cbiAgICAgIGlmIChzMykge1xuICAgICAgICBzMyA9IHVuZGVmaW5lZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cblxuICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMyID0gW3MyLCBzM107XG4gICAgICAgIHMxID0gczI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMxO1xuICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczE7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuXG4gICAgaWYgKHMxID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDEwKSB7XG4gICAgICAgIHMxID0gcGVnJGM4MDtcbiAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcblxuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7XG4gICAgICAgICAgcGVnJGZhaWwocGVnJGM4MSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMwID0gaW5wdXQuc3Vic3RyaW5nKHMwLCBwZWckY3VyclBvcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMwID0gczE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlZXNjYXBlZENoYXIoKSB7XG4gICAgdmFyIHMwLCBzMSwgczIsIHMzO1xuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgczEgPSBwZWckY3VyclBvcztcblxuICAgIGlmIChpbnB1dC5sZW5ndGggPiBwZWckY3VyclBvcykge1xuICAgICAgczIgPSBpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpO1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczIgPSBwZWckRkFJTEVEO1xuXG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7XG4gICAgICAgIHBlZyRmYWlsKHBlZyRjMTQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgcGVnJHNhdmVkUG9zID0gcGVnJGN1cnJQb3M7XG4gICAgICBzMyA9IHBlZyRjODIoczIpO1xuXG4gICAgICBpZiAoczMpIHtcbiAgICAgICAgczMgPSB1bmRlZmluZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMiA9IFtzMiwgczNdO1xuICAgICAgICBzMSA9IHMyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMTtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMxO1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczAgPSBpbnB1dC5zdWJzdHJpbmcoczAsIHBlZyRjdXJyUG9zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgczAgPSBzMTtcbiAgICB9XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VhcmdOYW1lT3JOdW1iZXIoKSB7XG4gICAgdmFyIHMwLCBzMTtcbiAgICBwZWckc2lsZW50RmFpbHMrKztcbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIHMxID0gcGVnJHBhcnNlYXJnTnVtYmVyKCk7XG5cbiAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMxID0gcGVnJHBhcnNlYXJnTmFtZSgpO1xuICAgIH1cblxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczAgPSBpbnB1dC5zdWJzdHJpbmcoczAsIHBlZyRjdXJyUG9zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgczAgPSBzMTtcbiAgICB9XG5cbiAgICBwZWckc2lsZW50RmFpbHMtLTtcblxuICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuXG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7XG4gICAgICAgIHBlZyRmYWlsKHBlZyRjODMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZWFyZ051bWJlcigpIHtcbiAgICB2YXIgczAsIHMxLCBzMiwgczMsIHM0O1xuICAgIHBlZyRzaWxlbnRGYWlscysrO1xuICAgIHMwID0gcGVnJGN1cnJQb3M7XG5cbiAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDQ4KSB7XG4gICAgICBzMSA9IHBlZyRjODU7XG4gICAgICBwZWckY3VyclBvcysrO1xuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG5cbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHtcbiAgICAgICAgcGVnJGZhaWwocGVnJGM4Nik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgIHMxID0gcGVnJGM4NygpO1xuICAgIH1cblxuICAgIHMwID0gczE7XG5cbiAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICBzMSA9IHBlZyRjdXJyUG9zO1xuXG4gICAgICBpZiAocGVnJGM4OC50ZXN0KGlucHV0LmNoYXJBdChwZWckY3VyclBvcykpKSB7XG4gICAgICAgIHMyID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMyID0gcGVnJEZBSUxFRDtcblxuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7XG4gICAgICAgICAgcGVnJGZhaWwocGVnJGM4OSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMzID0gW107XG5cbiAgICAgICAgaWYgKHBlZyRjOTAudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgICAgIHM0ID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHM0ID0gcGVnJEZBSUxFRDtcblxuICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHtcbiAgICAgICAgICAgIHBlZyRmYWlsKHBlZyRjOTEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHdoaWxlIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMzLnB1c2goczQpO1xuXG4gICAgICAgICAgaWYgKHBlZyRjOTAudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgICAgICAgczQgPSBpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpO1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgczQgPSBwZWckRkFJTEVEO1xuXG4gICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7XG4gICAgICAgICAgICAgIHBlZyRmYWlsKHBlZyRjOTEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMyID0gW3MyLCBzM107XG4gICAgICAgICAgczEgPSBzMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMxO1xuICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMTtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuXG4gICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgIHMxID0gcGVnJGM5MihzMSk7XG4gICAgICB9XG5cbiAgICAgIHMwID0gczE7XG4gICAgfVxuXG4gICAgcGVnJHNpbGVudEZhaWxzLS07XG5cbiAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcblxuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkge1xuICAgICAgICBwZWckZmFpbChwZWckYzg0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VhcmdOYW1lKCkge1xuICAgIHZhciBzMCwgczEsIHMyLCBzMywgczQ7XG4gICAgcGVnJHNpbGVudEZhaWxzKys7XG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IFtdO1xuICAgIHMyID0gcGVnJGN1cnJQb3M7XG4gICAgczMgPSBwZWckY3VyclBvcztcbiAgICBwZWckc2lsZW50RmFpbHMrKztcbiAgICBzNCA9IHBlZyRwYXJzZXdoaXRlU3BhY2UoKTtcblxuICAgIGlmIChzNCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgczQgPSBwZWckcGFyc2VwYXR0ZXJuU3ludGF4KCk7XG4gICAgfVxuXG4gICAgcGVnJHNpbGVudEZhaWxzLS07XG5cbiAgICBpZiAoczQgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMzID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgaWYgKGlucHV0Lmxlbmd0aCA+IHBlZyRjdXJyUG9zKSB7XG4gICAgICAgIHM0ID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHM0ID0gcGVnJEZBSUxFRDtcblxuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7XG4gICAgICAgICAgcGVnJGZhaWwocGVnJGMxNCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMzID0gW3MzLCBzNF07XG4gICAgICAgIHMyID0gczM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMyO1xuICAgICAgICBzMiA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczI7XG4gICAgICBzMiA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuXG4gICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICB3aGlsZSAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczEucHVzaChzMik7XG4gICAgICAgIHMyID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIHBlZyRzaWxlbnRGYWlscysrO1xuICAgICAgICBzNCA9IHBlZyRwYXJzZXdoaXRlU3BhY2UoKTtcblxuICAgICAgICBpZiAoczQgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNCA9IHBlZyRwYXJzZXBhdHRlcm5TeW50YXgoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBlZyRzaWxlbnRGYWlscy0tO1xuXG4gICAgICAgIGlmIChzNCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMzID0gdW5kZWZpbmVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCA+IHBlZyRjdXJyUG9zKSB7XG4gICAgICAgICAgICBzNCA9IGlucHV0LmNoYXJBdChwZWckY3VyclBvcyk7XG4gICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzNCA9IHBlZyRGQUlMRUQ7XG5cbiAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHtcbiAgICAgICAgICAgICAgcGVnJGZhaWwocGVnJGMxNCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzMyA9IFtzMywgczRdO1xuICAgICAgICAgICAgczIgPSBzMztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMjtcbiAgICAgICAgICAgIHMyID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMjtcbiAgICAgICAgICBzMiA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczAgPSBpbnB1dC5zdWJzdHJpbmcoczAsIHBlZyRjdXJyUG9zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgczAgPSBzMTtcbiAgICB9XG5cbiAgICBwZWckc2lsZW50RmFpbHMtLTtcblxuICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuXG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7XG4gICAgICAgIHBlZyRmYWlsKHBlZyRjOTMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIHZhciBtZXNzYWdlQ3R4ID0gWydyb290J107XG5cbiAgZnVuY3Rpb24gaXNOZXN0ZWRNZXNzYWdlVGV4dCgpIHtcbiAgICByZXR1cm4gbWVzc2FnZUN0eC5sZW5ndGggPiAxO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNJblBsdXJhbE9wdGlvbigpIHtcbiAgICByZXR1cm4gbWVzc2FnZUN0eFttZXNzYWdlQ3R4Lmxlbmd0aCAtIDFdID09PSAncGx1cmFsJztcbiAgfVxuXG4gIGZ1bmN0aW9uIGluc2VydExvY2F0aW9uKCkge1xuICAgIHJldHVybiBvcHRpb25zICYmIG9wdGlvbnMuY2FwdHVyZUxvY2F0aW9uID8ge1xuICAgICAgbG9jYXRpb246IGxvY2F0aW9uKClcbiAgICB9IDoge307XG4gIH1cblxuICBwZWckcmVzdWx0ID0gcGVnJHN0YXJ0UnVsZUZ1bmN0aW9uKCk7XG5cbiAgaWYgKHBlZyRyZXN1bHQgIT09IHBlZyRGQUlMRUQgJiYgcGVnJGN1cnJQb3MgPT09IGlucHV0Lmxlbmd0aCkge1xuICAgIHJldHVybiBwZWckcmVzdWx0O1xuICB9IGVsc2Uge1xuICAgIGlmIChwZWckcmVzdWx0ICE9PSBwZWckRkFJTEVEICYmIHBlZyRjdXJyUG9zIDwgaW5wdXQubGVuZ3RoKSB7XG4gICAgICBwZWckZmFpbChwZWckZW5kRXhwZWN0YXRpb24oKSk7XG4gICAgfVxuXG4gICAgdGhyb3cgcGVnJGJ1aWxkU3RydWN0dXJlZEVycm9yKHBlZyRtYXhGYWlsRXhwZWN0ZWQsIHBlZyRtYXhGYWlsUG9zIDwgaW5wdXQubGVuZ3RoID8gaW5wdXQuY2hhckF0KHBlZyRtYXhGYWlsUG9zKSA6IG51bGwsIHBlZyRtYXhGYWlsUG9zIDwgaW5wdXQubGVuZ3RoID8gcGVnJGNvbXB1dGVMb2NhdGlvbihwZWckbWF4RmFpbFBvcywgcGVnJG1heEZhaWxQb3MgKyAxKSA6IHBlZyRjb21wdXRlTG9jYXRpb24ocGVnJG1heEZhaWxQb3MsIHBlZyRtYXhGYWlsUG9zKSk7XG4gIH1cbn1cblxuZXhwb3J0IHZhciBwZWdQYXJzZSA9IHBlZyRwYXJzZTsiLCJ2YXIgX19zcHJlYWRBcnJheXMgPSB0aGlzICYmIHRoaXMuX19zcHJlYWRBcnJheXMgfHwgZnVuY3Rpb24gKCkge1xuICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHtcbiAgICBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XG4gIH1cblxuICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspIHtcbiAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKykge1xuICAgICAgcltrXSA9IGFbal07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHI7XG59O1xuXG5pbXBvcnQgeyBpc1BsdXJhbEVsZW1lbnQsIGlzTGl0ZXJhbEVsZW1lbnQsIGlzU2VsZWN0RWxlbWVudCB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgcGVnUGFyc2UgfSBmcm9tICcuL3BhcnNlcic7XG52YXIgUExVUkFMX0hBU0hUQUdfUkVHRVggPSAvKF58W15cXFxcXSkjL2c7XG4vKipcbiAqIFdoZXRoZXIgdG8gY29udmVydCBgI2AgaW4gcGx1cmFsIHJ1bGUgb3B0aW9uc1xuICogdG8gYHt2YXIsIG51bWJlcn1gXG4gKiBAcGFyYW0gZWwgQVNUIEVsZW1lbnRcbiAqIEBwYXJhbSBwbHVyYWxTdGFjayBjdXJyZW50IHBsdXJhbCBzdGFja1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVIYXNodGFnSW5QbHVyYWwoZWxzKSB7XG4gIGVscy5mb3JFYWNoKGZ1bmN0aW9uIChlbCkge1xuICAgIC8vIElmIHdlJ3JlIGVuY291bnRlcmluZyBhIHBsdXJhbCBlbFxuICAgIGlmICghaXNQbHVyYWxFbGVtZW50KGVsKSAmJiAhaXNTZWxlY3RFbGVtZW50KGVsKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gR28gZG93biB0aGUgb3B0aW9ucyBhbmQgc2VhcmNoIGZvciAjIGluIGFueSBsaXRlcmFsIGVsZW1lbnRcblxuXG4gICAgT2JqZWN0LmtleXMoZWwub3B0aW9ucykuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHtcbiAgICAgIHZhciBfYTtcblxuICAgICAgdmFyIG9wdCA9IGVsLm9wdGlvbnNbaWRdOyAvLyBJZiB3ZSBnb3QgYSBtYXRjaCwgd2UgaGF2ZSB0byBzcGxpdCB0aGlzXG4gICAgICAvLyBhbmQgaW5qZWN0IGEgTnVtYmVyRWxlbWVudCBpbiB0aGUgbWlkZGxlXG5cbiAgICAgIHZhciBtYXRjaGluZ0xpdGVyYWxFbEluZGV4ID0gLTE7XG4gICAgICB2YXIgbGl0ZXJhbEVsID0gdW5kZWZpbmVkO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9wdC52YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxfMSA9IG9wdC52YWx1ZVtpXTtcblxuICAgICAgICBpZiAoaXNMaXRlcmFsRWxlbWVudChlbF8xKSAmJiBQTFVSQUxfSEFTSFRBR19SRUdFWC50ZXN0KGVsXzEudmFsdWUpKSB7XG4gICAgICAgICAgbWF0Y2hpbmdMaXRlcmFsRWxJbmRleCA9IGk7XG4gICAgICAgICAgbGl0ZXJhbEVsID0gZWxfMTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobGl0ZXJhbEVsKSB7XG4gICAgICAgIHZhciBuZXdWYWx1ZSA9IGxpdGVyYWxFbC52YWx1ZS5yZXBsYWNlKFBMVVJBTF9IQVNIVEFHX1JFR0VYLCBcIiQxe1wiICsgZWwudmFsdWUgKyBcIiwgbnVtYmVyfVwiKTtcbiAgICAgICAgdmFyIG5ld0VscyA9IHBlZ1BhcnNlKG5ld1ZhbHVlKTtcblxuICAgICAgICAoX2EgPSBvcHQudmFsdWUpLnNwbGljZS5hcHBseShfYSwgX19zcHJlYWRBcnJheXMoW21hdGNoaW5nTGl0ZXJhbEVsSW5kZXgsIDFdLCBuZXdFbHMpKTtcbiAgICAgIH1cblxuICAgICAgbm9ybWFsaXplSGFzaHRhZ0luUGx1cmFsKG9wdC52YWx1ZSk7XG4gICAgfSk7XG4gIH0pO1xufSIsImltcG9ydCB7IHBlZ1BhcnNlIH0gZnJvbSAnLi9wYXJzZXInO1xuaW1wb3J0IHsgbm9ybWFsaXplSGFzaHRhZ0luUGx1cmFsIH0gZnJvbSAnLi9ub3JtYWxpemUnO1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL3BhcnNlcic7XG5leHBvcnQgKiBmcm9tICcuL3NrZWxldG9uJztcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZShpbnB1dCwgb3B0cykge1xuICB2YXIgZWxzID0gcGVnUGFyc2UoaW5wdXQsIG9wdHMpO1xuXG4gIGlmICghb3B0cyB8fCBvcHRzLm5vcm1hbGl6ZUhhc2h0YWdJblBsdXJhbCAhPT0gZmFsc2UpIHtcbiAgICBub3JtYWxpemVIYXNodGFnSW5QbHVyYWwoZWxzKTtcbiAgfVxuXG4gIHJldHVybiBlbHM7XG59IiwiLypcbkNvcHlyaWdodCAoYykgMjAxNCwgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbkNvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgTGljZW5zZS5cblNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4qL1xudmFyIF9fc3ByZWFkQXJyYXlzID0gdGhpcyAmJiB0aGlzLl9fc3ByZWFkQXJyYXlzIHx8IGZ1bmN0aW9uICgpIHtcbiAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSB7XG4gICAgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xuICB9XG5cbiAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKSB7XG4gICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspIHtcbiAgICAgIHJba10gPSBhW2pdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByO1xufTsgLy8gLS0gVXRpbGl0aWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG5mdW5jdGlvbiBnZXRDYWNoZUlkKGlucHV0cykge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoaW5wdXRzLm1hcChmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICByZXR1cm4gaW5wdXQgJiYgdHlwZW9mIGlucHV0ID09PSAnb2JqZWN0JyA/IG9yZGVyZWRQcm9wcyhpbnB1dCkgOiBpbnB1dDtcbiAgfSkpO1xufVxuXG5mdW5jdGlvbiBvcmRlcmVkUHJvcHMob2JqKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvYmopLnNvcnQoKS5tYXAoZnVuY3Rpb24gKGspIHtcbiAgICB2YXIgX2E7XG5cbiAgICByZXR1cm4gX2EgPSB7fSwgX2Fba10gPSBvYmpba10sIF9hO1xuICB9KTtcbn1cblxudmFyIG1lbW9pemVGb3JtYXRDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIG1lbW9pemVGb3JtYXRDb25zdHJ1Y3RvcihGb3JtYXRDb25zdHJ1Y3RvciwgY2FjaGUpIHtcbiAgaWYgKGNhY2hlID09PSB2b2lkIDApIHtcbiAgICBjYWNoZSA9IHt9O1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX2E7XG5cbiAgICB2YXIgYXJncyA9IFtdO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICB9XG5cbiAgICB2YXIgY2FjaGVJZCA9IGdldENhY2hlSWQoYXJncyk7XG4gICAgdmFyIGZvcm1hdCA9IGNhY2hlSWQgJiYgY2FjaGVbY2FjaGVJZF07XG5cbiAgICBpZiAoIWZvcm1hdCkge1xuICAgICAgZm9ybWF0ID0gbmV3ICgoX2EgPSBGb3JtYXRDb25zdHJ1Y3RvcikuYmluZC5hcHBseShfYSwgX19zcHJlYWRBcnJheXMoW3ZvaWQgMF0sIGFyZ3MpKSkoKTtcblxuICAgICAgaWYgKGNhY2hlSWQpIHtcbiAgICAgICAgY2FjaGVbY2FjaGVJZF0gPSBmb3JtYXQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZvcm1hdDtcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG1lbW9pemVGb3JtYXRDb25zdHJ1Y3RvcjsiLCJ2YXIgX19hc3NpZ24gPSB0aGlzICYmIHRoaXMuX19hc3NpZ24gfHwgZnVuY3Rpb24gKCkge1xuICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHQpIHtcbiAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgIHMgPSBhcmd1bWVudHNbaV07XG5cbiAgICAgIGZvciAodmFyIHAgaW4gcykge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdDtcbiAgfTtcblxuICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG4vKipcbiAqIGh0dHBzOi8vdW5pY29kZS5vcmcvcmVwb3J0cy90cjM1L3RyMzUtZGF0ZXMuaHRtbCNEYXRlX0ZpZWxkX1N5bWJvbF9UYWJsZVxuICogQ3JlZGl0OiBodHRwczovL2dpdGh1Yi5jb20vY2FyaWR5L2ludGwtZGF0ZXRpbWVmb3JtYXQtcGF0dGVybi9ibG9iL21hc3Rlci9pbmRleC5qc1xuICogd2l0aCBzb21lIHR3ZWFrc1xuICovXG5cblxudmFyIERBVEVfVElNRV9SRUdFWCA9IC8oPzpbRWVjXXsxLDZ9fEd7MSw1fXxbUXFdezEsNX18KD86W3lZdXJdK3xVezEsNX0pfFtNTF17MSw1fXxkezEsMn18RHsxLDN9fEZ7MX18W2FiQl17MSw1fXxbaGtIS117MSwyfXx3ezEsMn18V3sxfXxtezEsMn18c3sxLDJ9fFt6Wk92VnhYXXsxLDR9KSg/PShbXiddKidbXiddKicpKlteJ10qJCkvZztcbi8qKlxuICogUGFyc2UgRGF0ZSB0aW1lIHNrZWxldG9uIGludG8gSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnNcbiAqIFJlZjogaHR0cHM6Ly91bmljb2RlLm9yZy9yZXBvcnRzL3RyMzUvdHIzNS1kYXRlcy5odG1sI0RhdGVfRmllbGRfU3ltYm9sX1RhYmxlXG4gKiBAcHVibGljXG4gKiBAcGFyYW0gc2tlbGV0b24gc2tlbGV0b24gc3RyaW5nXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRGF0ZVRpbWVTa2VsZXRvbihza2VsZXRvbikge1xuICB2YXIgcmVzdWx0ID0ge307XG4gIHNrZWxldG9uLnJlcGxhY2UoREFURV9USU1FX1JFR0VYLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICB2YXIgbGVuID0gbWF0Y2gubGVuZ3RoO1xuXG4gICAgc3dpdGNoIChtYXRjaFswXSkge1xuICAgICAgLy8gRXJhXG4gICAgICBjYXNlICdHJzpcbiAgICAgICAgcmVzdWx0LmVyYSA9IGxlbiA9PT0gNCA/ICdsb25nJyA6IGxlbiA9PT0gNSA/ICduYXJyb3cnIDogJ3Nob3J0JztcbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBZZWFyXG5cbiAgICAgIGNhc2UgJ3knOlxuICAgICAgICByZXN1bHQueWVhciA9IGxlbiA9PT0gMiA/ICcyLWRpZ2l0JyA6ICdudW1lcmljJztcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ1knOlxuICAgICAgY2FzZSAndSc6XG4gICAgICBjYXNlICdVJzpcbiAgICAgIGNhc2UgJ3InOlxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignYFkvdS9VL3JgICh5ZWFyKSBwYXR0ZXJucyBhcmUgbm90IHN1cHBvcnRlZCwgdXNlIGB5YCBpbnN0ZWFkJyk7XG4gICAgICAvLyBRdWFydGVyXG5cbiAgICAgIGNhc2UgJ3EnOlxuICAgICAgY2FzZSAnUSc6XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdgcS9RYCAocXVhcnRlcikgcGF0dGVybnMgYXJlIG5vdCBzdXBwb3J0ZWQnKTtcbiAgICAgIC8vIE1vbnRoXG5cbiAgICAgIGNhc2UgJ00nOlxuICAgICAgY2FzZSAnTCc6XG4gICAgICAgIHJlc3VsdC5tb250aCA9IFsnbnVtZXJpYycsICcyLWRpZ2l0JywgJ3Nob3J0JywgJ2xvbmcnLCAnbmFycm93J11bbGVuIC0gMV07XG4gICAgICAgIGJyZWFrO1xuICAgICAgLy8gV2Vla1xuXG4gICAgICBjYXNlICd3JzpcbiAgICAgIGNhc2UgJ1cnOlxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignYHcvV2AgKHdlZWspIHBhdHRlcm5zIGFyZSBub3Qgc3VwcG9ydGVkJyk7XG5cbiAgICAgIGNhc2UgJ2QnOlxuICAgICAgICByZXN1bHQuZGF5ID0gWydudW1lcmljJywgJzItZGlnaXQnXVtsZW4gLSAxXTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0QnOlxuICAgICAgY2FzZSAnRic6XG4gICAgICBjYXNlICdnJzpcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2BEL0YvZ2AgKGRheSkgcGF0dGVybnMgYXJlIG5vdCBzdXBwb3J0ZWQsIHVzZSBgZGAgaW5zdGVhZCcpO1xuICAgICAgLy8gV2Vla2RheVxuXG4gICAgICBjYXNlICdFJzpcbiAgICAgICAgcmVzdWx0LndlZWtkYXkgPSBsZW4gPT09IDQgPyAnc2hvcnQnIDogbGVuID09PSA1ID8gJ25hcnJvdycgOiAnc2hvcnQnO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnZSc6XG4gICAgICAgIGlmIChsZW4gPCA0KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2BlLi5lZWVgICh3ZWVrZGF5KSBwYXR0ZXJucyBhcmUgbm90IHN1cHBvcnRlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0LndlZWtkYXkgPSBbJ3Nob3J0JywgJ2xvbmcnLCAnbmFycm93JywgJ3Nob3J0J11bbGVuIC0gNF07XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdjJzpcbiAgICAgICAgaWYgKGxlbiA8IDQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignYGMuLmNjY2AgKHdlZWtkYXkpIHBhdHRlcm5zIGFyZSBub3Qgc3VwcG9ydGVkJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHQud2Vla2RheSA9IFsnc2hvcnQnLCAnbG9uZycsICduYXJyb3cnLCAnc2hvcnQnXVtsZW4gLSA0XTtcbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBQZXJpb2RcblxuICAgICAgY2FzZSAnYSc6XG4gICAgICAgIC8vIEFNLCBQTVxuICAgICAgICByZXN1bHQuaG91cjEyID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2InOiAvLyBhbSwgcG0sIG5vb24sIG1pZG5pZ2h0XG5cbiAgICAgIGNhc2UgJ0InOlxuICAgICAgICAvLyBmbGV4aWJsZSBkYXkgcGVyaW9kc1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignYGIvQmAgKHBlcmlvZCkgcGF0dGVybnMgYXJlIG5vdCBzdXBwb3J0ZWQsIHVzZSBgYWAgaW5zdGVhZCcpO1xuICAgICAgLy8gSG91clxuXG4gICAgICBjYXNlICdoJzpcbiAgICAgICAgcmVzdWx0LmhvdXJDeWNsZSA9ICdoMTInO1xuICAgICAgICByZXN1bHQuaG91ciA9IFsnbnVtZXJpYycsICcyLWRpZ2l0J11bbGVuIC0gMV07XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdIJzpcbiAgICAgICAgcmVzdWx0LmhvdXJDeWNsZSA9ICdoMjMnO1xuICAgICAgICByZXN1bHQuaG91ciA9IFsnbnVtZXJpYycsICcyLWRpZ2l0J11bbGVuIC0gMV07XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdLJzpcbiAgICAgICAgcmVzdWx0LmhvdXJDeWNsZSA9ICdoMTEnO1xuICAgICAgICByZXN1bHQuaG91ciA9IFsnbnVtZXJpYycsICcyLWRpZ2l0J11bbGVuIC0gMV07XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdrJzpcbiAgICAgICAgcmVzdWx0LmhvdXJDeWNsZSA9ICdoMjQnO1xuICAgICAgICByZXN1bHQuaG91ciA9IFsnbnVtZXJpYycsICcyLWRpZ2l0J11bbGVuIC0gMV07XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdqJzpcbiAgICAgIGNhc2UgJ0onOlxuICAgICAgY2FzZSAnQyc6XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdgai9KL0NgIChob3VyKSBwYXR0ZXJucyBhcmUgbm90IHN1cHBvcnRlZCwgdXNlIGBoL0gvSy9rYCBpbnN0ZWFkJyk7XG4gICAgICAvLyBNaW51dGVcblxuICAgICAgY2FzZSAnbSc6XG4gICAgICAgIHJlc3VsdC5taW51dGUgPSBbJ251bWVyaWMnLCAnMi1kaWdpdCddW2xlbiAtIDFdO1xuICAgICAgICBicmVhaztcbiAgICAgIC8vIFNlY29uZFxuXG4gICAgICBjYXNlICdzJzpcbiAgICAgICAgcmVzdWx0LnNlY29uZCA9IFsnbnVtZXJpYycsICcyLWRpZ2l0J11bbGVuIC0gMV07XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdTJzpcbiAgICAgIGNhc2UgJ0EnOlxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignYFMvQWAgKHNlY29uZCkgcGF0dGVucnMgYXJlIG5vdCBzdXBwb3J0ZWQsIHVzZSBgc2AgaW5zdGVhZCcpO1xuICAgICAgLy8gWm9uZVxuXG4gICAgICBjYXNlICd6JzpcbiAgICAgICAgLy8gMS4uMywgNDogc3BlY2lmaWMgbm9uLWxvY2F0aW9uIGZvcm1hdFxuICAgICAgICByZXN1bHQudGltZVpvbmVOYW1lID0gbGVuIDwgNCA/ICdzaG9ydCcgOiAnbG9uZyc7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdaJzogLy8gMS4uMywgNCwgNTogVGhlIElTTzg2MDEgdmFyaW9zIGZvcm1hdHNcblxuICAgICAgY2FzZSAnTyc6IC8vIDEsIDQ6IG1pbGlzZWNvbmRzIGluIGRheSBzaG9ydCwgbG9uZ1xuXG4gICAgICBjYXNlICd2JzogLy8gMSwgNDogZ2VuZXJpYyBub24tbG9jYXRpb24gZm9ybWF0XG5cbiAgICAgIGNhc2UgJ1YnOiAvLyAxLCAyLCAzLCA0OiB0aW1lIHpvbmUgSUQgb3IgY2l0eVxuXG4gICAgICBjYXNlICdYJzogLy8gMSwgMiwgMywgNDogVGhlIElTTzg2MDEgdmFyaW9zIGZvcm1hdHNcblxuICAgICAgY2FzZSAneCc6XG4gICAgICAgIC8vIDEsIDIsIDMsIDQ6IFRoZSBJU084NjAxIHZhcmlvcyBmb3JtYXRzXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdgWi9PL3YvVi9YL3hgICh0aW1lWm9uZSkgcGF0dGVucnMgYXJlIG5vdCBzdXBwb3J0ZWQsIHVzZSBgemAgaW5zdGVhZCcpO1xuICAgIH1cblxuICAgIHJldHVybiAnJztcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGljdVVuaXRUb0VjbWEodW5pdCkge1xuICByZXR1cm4gdW5pdC5yZXBsYWNlKC9eKC4qPyktLywgJycpO1xufVxuXG52YXIgRlJBQ1RJT05fUFJFQ0lTSU9OX1JFR0VYID0gL15cXC4oPzooMCspKFxcK3wjKyk/KT8kL2c7XG52YXIgU0lHTklGSUNBTlRfUFJFQ0lTSU9OX1JFR0VYID0gL14oQCspPyhcXCt8IyspPyQvZztcblxuZnVuY3Rpb24gcGFyc2VTaWduaWZpY2FudFByZWNpc2lvbihzdHIpIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBzdHIucmVwbGFjZShTSUdOSUZJQ0FOVF9QUkVDSVNJT05fUkVHRVgsIGZ1bmN0aW9uIChfLCBnMSwgZzIpIHtcbiAgICAvLyBAQEAgY2FzZVxuICAgIGlmICh0eXBlb2YgZzIgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXN1bHQubWluaW11bVNpZ25pZmljYW50RGlnaXRzID0gZzEubGVuZ3RoO1xuICAgICAgcmVzdWx0Lm1heGltdW1TaWduaWZpY2FudERpZ2l0cyA9IGcxLmxlbmd0aDtcbiAgICB9IC8vIEBAQCsgY2FzZVxuICAgIGVsc2UgaWYgKGcyID09PSAnKycpIHtcbiAgICAgICAgcmVzdWx0Lm1pbmltdW1TaWduaWZpY2FudERpZ2l0cyA9IGcxLmxlbmd0aDtcbiAgICAgIH0gLy8gLiMjIyBjYXNlXG4gICAgICBlbHNlIGlmIChnMVswXSA9PT0gJyMnKSB7XG4gICAgICAgICAgcmVzdWx0Lm1heGltdW1TaWduaWZpY2FudERpZ2l0cyA9IGcxLmxlbmd0aDtcbiAgICAgICAgfSAvLyAuQEAjIyBvciAuQEBAIGNhc2VcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQubWluaW11bVNpZ25pZmljYW50RGlnaXRzID0gZzEubGVuZ3RoO1xuICAgICAgICAgICAgcmVzdWx0Lm1heGltdW1TaWduaWZpY2FudERpZ2l0cyA9IGcxLmxlbmd0aCArICh0eXBlb2YgZzIgPT09ICdzdHJpbmcnID8gZzIubGVuZ3RoIDogMCk7XG4gICAgICAgICAgfVxuXG4gICAgcmV0dXJuICcnO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gcGFyc2VTaWduKHN0cikge1xuICBzd2l0Y2ggKHN0cikge1xuICAgIGNhc2UgJ3NpZ24tYXV0byc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzaWduRGlzcGxheTogJ2F1dG8nXG4gICAgICB9O1xuXG4gICAgY2FzZSAnc2lnbi1hY2NvdW50aW5nJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGN1cnJlbmN5U2lnbjogJ2FjY291bnRpbmcnXG4gICAgICB9O1xuXG4gICAgY2FzZSAnc2lnbi1hbHdheXMnOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2lnbkRpc3BsYXk6ICdhbHdheXMnXG4gICAgICB9O1xuXG4gICAgY2FzZSAnc2lnbi1hY2NvdW50aW5nLWFsd2F5cyc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzaWduRGlzcGxheTogJ2Fsd2F5cycsXG4gICAgICAgIGN1cnJlbmN5U2lnbjogJ2FjY291bnRpbmcnXG4gICAgICB9O1xuXG4gICAgY2FzZSAnc2lnbi1leGNlcHQtemVybyc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzaWduRGlzcGxheTogJ2V4Y2VwdFplcm8nXG4gICAgICB9O1xuXG4gICAgY2FzZSAnc2lnbi1hY2NvdW50aW5nLWV4Y2VwdC16ZXJvJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNpZ25EaXNwbGF5OiAnZXhjZXB0WmVybycsXG4gICAgICAgIGN1cnJlbmN5U2lnbjogJ2FjY291bnRpbmcnXG4gICAgICB9O1xuXG4gICAgY2FzZSAnc2lnbi1uZXZlcic6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzaWduRGlzcGxheTogJ25ldmVyJ1xuICAgICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZU5vdGF0aW9uT3B0aW9ucyhvcHQpIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICB2YXIgc2lnbk9wdHMgPSBwYXJzZVNpZ24ob3B0KTtcblxuICBpZiAoc2lnbk9wdHMpIHtcbiAgICByZXR1cm4gc2lnbk9wdHM7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vdW5pY29kZS1vcmcvaWN1L2Jsb2IvbWFzdGVyL2RvY3MvdXNlcmd1aWRlL2Zvcm1hdF9wYXJzZS9udW1iZXJzL3NrZWxldG9ucy5tZCNza2VsZXRvbi1zdGVtcy1hbmQtb3B0aW9uc1xuICovXG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnROdW1iZXJTa2VsZXRvblRvTnVtYmVyRm9ybWF0T3B0aW9ucyh0b2tlbnMpIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuXG4gIGZvciAodmFyIF9pID0gMCwgdG9rZW5zXzEgPSB0b2tlbnM7IF9pIDwgdG9rZW5zXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgdmFyIHRva2VuID0gdG9rZW5zXzFbX2ldO1xuXG4gICAgc3dpdGNoICh0b2tlbi5zdGVtKSB7XG4gICAgICBjYXNlICdwZXJjZW50JzpcbiAgICAgICAgcmVzdWx0LnN0eWxlID0gJ3BlcmNlbnQnO1xuICAgICAgICBjb250aW51ZTtcblxuICAgICAgY2FzZSAnY3VycmVuY3knOlxuICAgICAgICByZXN1bHQuc3R5bGUgPSAnY3VycmVuY3knO1xuICAgICAgICByZXN1bHQuY3VycmVuY3kgPSB0b2tlbi5vcHRpb25zWzBdO1xuICAgICAgICBjb250aW51ZTtcblxuICAgICAgY2FzZSAnZ3JvdXAtb2ZmJzpcbiAgICAgICAgcmVzdWx0LnVzZUdyb3VwaW5nID0gZmFsc2U7XG4gICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICBjYXNlICdwcmVjaXNpb24taW50ZWdlcic6XG4gICAgICAgIHJlc3VsdC5tYXhpbXVtRnJhY3Rpb25EaWdpdHMgPSAwO1xuICAgICAgICBjb250aW51ZTtcblxuICAgICAgY2FzZSAnbWVhc3VyZS11bml0JzpcbiAgICAgICAgcmVzdWx0LnN0eWxlID0gJ3VuaXQnO1xuICAgICAgICByZXN1bHQudW5pdCA9IGljdVVuaXRUb0VjbWEodG9rZW4ub3B0aW9uc1swXSk7XG4gICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICBjYXNlICdjb21wYWN0LXNob3J0JzpcbiAgICAgICAgcmVzdWx0Lm5vdGF0aW9uID0gJ2NvbXBhY3QnO1xuICAgICAgICByZXN1bHQuY29tcGFjdERpc3BsYXkgPSAnc2hvcnQnO1xuICAgICAgICBjb250aW51ZTtcblxuICAgICAgY2FzZSAnY29tcGFjdC1sb25nJzpcbiAgICAgICAgcmVzdWx0Lm5vdGF0aW9uID0gJ2NvbXBhY3QnO1xuICAgICAgICByZXN1bHQuY29tcGFjdERpc3BsYXkgPSAnbG9uZyc7XG4gICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICBjYXNlICdzY2llbnRpZmljJzpcbiAgICAgICAgcmVzdWx0ID0gX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oe30sIHJlc3VsdCksIHtcbiAgICAgICAgICBub3RhdGlvbjogJ3NjaWVudGlmaWMnXG4gICAgICAgIH0pLCB0b2tlbi5vcHRpb25zLnJlZHVjZShmdW5jdGlvbiAoYWxsLCBvcHQpIHtcbiAgICAgICAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIGFsbCksIHBhcnNlTm90YXRpb25PcHRpb25zKG9wdCkpO1xuICAgICAgICB9LCB7fSkpO1xuICAgICAgICBjb250aW51ZTtcblxuICAgICAgY2FzZSAnZW5naW5lZXJpbmcnOlxuICAgICAgICByZXN1bHQgPSBfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcmVzdWx0KSwge1xuICAgICAgICAgIG5vdGF0aW9uOiAnZW5naW5lZXJpbmcnXG4gICAgICAgIH0pLCB0b2tlbi5vcHRpb25zLnJlZHVjZShmdW5jdGlvbiAoYWxsLCBvcHQpIHtcbiAgICAgICAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIGFsbCksIHBhcnNlTm90YXRpb25PcHRpb25zKG9wdCkpO1xuICAgICAgICB9LCB7fSkpO1xuICAgICAgICBjb250aW51ZTtcblxuICAgICAgY2FzZSAnbm90YXRpb24tc2ltcGxlJzpcbiAgICAgICAgcmVzdWx0Lm5vdGF0aW9uID0gJ3N0YW5kYXJkJztcbiAgICAgICAgY29udGludWU7XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdW5pY29kZS1vcmcvaWN1L2Jsb2IvbWFzdGVyL2ljdTRjL3NvdXJjZS9pMThuL3VuaWNvZGUvdW51bWJlcmZvcm1hdHRlci5oXG5cbiAgICAgIGNhc2UgJ3VuaXQtd2lkdGgtbmFycm93JzpcbiAgICAgICAgcmVzdWx0LmN1cnJlbmN5RGlzcGxheSA9ICduYXJyb3dTeW1ib2wnO1xuICAgICAgICByZXN1bHQudW5pdERpc3BsYXkgPSAnbmFycm93JztcbiAgICAgICAgY29udGludWU7XG5cbiAgICAgIGNhc2UgJ3VuaXQtd2lkdGgtc2hvcnQnOlxuICAgICAgICByZXN1bHQuY3VycmVuY3lEaXNwbGF5ID0gJ2NvZGUnO1xuICAgICAgICByZXN1bHQudW5pdERpc3BsYXkgPSAnc2hvcnQnO1xuICAgICAgICBjb250aW51ZTtcblxuICAgICAgY2FzZSAndW5pdC13aWR0aC1mdWxsLW5hbWUnOlxuICAgICAgICByZXN1bHQuY3VycmVuY3lEaXNwbGF5ID0gJ25hbWUnO1xuICAgICAgICByZXN1bHQudW5pdERpc3BsYXkgPSAnbG9uZyc7XG4gICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICBjYXNlICd1bml0LXdpZHRoLWlzby1jb2RlJzpcbiAgICAgICAgcmVzdWx0LmN1cnJlbmN5RGlzcGxheSA9ICdzeW1ib2wnO1xuICAgICAgICBjb250aW51ZTtcbiAgICB9IC8vIFByZWNpc2lvblxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS91bmljb2RlLW9yZy9pY3UvYmxvYi9tYXN0ZXIvZG9jcy91c2VyZ3VpZGUvZm9ybWF0X3BhcnNlL251bWJlcnMvc2tlbGV0b25zLm1kI2ZyYWN0aW9uLXByZWNpc2lvblxuXG5cbiAgICBpZiAoRlJBQ1RJT05fUFJFQ0lTSU9OX1JFR0VYLnRlc3QodG9rZW4uc3RlbSkpIHtcbiAgICAgIGlmICh0b2tlbi5vcHRpb25zLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ZyYWN0aW9uLXByZWNpc2lvbiBzdGVtcyBvbmx5IGFjY2VwdCBhIHNpbmdsZSBvcHRpb25hbCBvcHRpb24nKTtcbiAgICAgIH1cblxuICAgICAgdG9rZW4uc3RlbS5yZXBsYWNlKEZSQUNUSU9OX1BSRUNJU0lPTl9SRUdFWCwgZnVuY3Rpb24gKG1hdGNoLCBnMSwgZzIpIHtcbiAgICAgICAgLy8gcHJlY2lzaW9uLWludGVnZXIgY2FzZVxuICAgICAgICBpZiAobWF0Y2ggPT09ICcuJykge1xuICAgICAgICAgIHJlc3VsdC5tYXhpbXVtRnJhY3Rpb25EaWdpdHMgPSAwO1xuICAgICAgICB9IC8vIC4wMDArIGNhc2VcbiAgICAgICAgZWxzZSBpZiAoZzIgPT09ICcrJykge1xuICAgICAgICAgICAgcmVzdWx0Lm1pbmltdW1GcmFjdGlvbkRpZ2l0cyA9IGcyLmxlbmd0aDtcbiAgICAgICAgICB9IC8vIC4jIyMgY2FzZVxuICAgICAgICAgIGVsc2UgaWYgKGcxWzBdID09PSAnIycpIHtcbiAgICAgICAgICAgICAgcmVzdWx0Lm1heGltdW1GcmFjdGlvbkRpZ2l0cyA9IGcxLmxlbmd0aDtcbiAgICAgICAgICAgIH0gLy8gLjAwIyMgb3IgLjAwMCBjYXNlXG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQubWluaW11bUZyYWN0aW9uRGlnaXRzID0gZzEubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5tYXhpbXVtRnJhY3Rpb25EaWdpdHMgPSBnMS5sZW5ndGggKyAodHlwZW9mIGcyID09PSAnc3RyaW5nJyA/IGcyLmxlbmd0aCA6IDApO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICh0b2tlbi5vcHRpb25zLmxlbmd0aCkge1xuICAgICAgICByZXN1bHQgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcmVzdWx0KSwgcGFyc2VTaWduaWZpY2FudFByZWNpc2lvbih0b2tlbi5vcHRpb25zWzBdKSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChTSUdOSUZJQ0FOVF9QUkVDSVNJT05fUkVHRVgudGVzdCh0b2tlbi5zdGVtKSkge1xuICAgICAgcmVzdWx0ID0gX19hc3NpZ24oX19hc3NpZ24oe30sIHJlc3VsdCksIHBhcnNlU2lnbmlmaWNhbnRQcmVjaXNpb24odG9rZW4uc3RlbSkpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIHNpZ25PcHRzID0gcGFyc2VTaWduKHRva2VuLnN0ZW0pO1xuXG4gICAgaWYgKHNpZ25PcHRzKSB7XG4gICAgICByZXN1bHQgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcmVzdWx0KSwgc2lnbk9wdHMpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59IiwidmFyIF9fZXh0ZW5kcyA9IHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMgfHwgZnVuY3Rpb24gKCkge1xuICB2YXIgX2V4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiBleHRlbmRTdGF0aWNzKGQsIGIpIHtcbiAgICBfZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7XG4gICAgICBfX3Byb3RvX186IFtdXG4gICAgfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICBkLl9fcHJvdG9fXyA9IGI7XG4gICAgfSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgZm9yICh2YXIgcCBpbiBiKSB7XG4gICAgICAgIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIF9leHRlbmRTdGF0aWNzKGQsIGIpO1xuICB9O1xuXG4gIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xuICAgIF9leHRlbmRTdGF0aWNzKGQsIGIpO1xuXG4gICAgZnVuY3Rpb24gX18oKSB7XG4gICAgICB0aGlzLmNvbnN0cnVjdG9yID0gZDtcbiAgICB9XG5cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gIH07XG59KCk7XG5cbnZhciBfX3NwcmVhZEFycmF5cyA9IHRoaXMgJiYgdGhpcy5fX3NwcmVhZEFycmF5cyB8fCBmdW5jdGlvbiAoKSB7XG4gIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykge1xuICAgIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcbiAgfVxuXG4gIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKykge1xuICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKSB7XG4gICAgICByW2tdID0gYVtqXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcjtcbn07XG5cbmltcG9ydCB7IGNvbnZlcnROdW1iZXJTa2VsZXRvblRvTnVtYmVyRm9ybWF0T3B0aW9ucywgaXNBcmd1bWVudEVsZW1lbnQsIGlzRGF0ZUVsZW1lbnQsIGlzRGF0ZVRpbWVTa2VsZXRvbiwgaXNMaXRlcmFsRWxlbWVudCwgaXNOdW1iZXJFbGVtZW50LCBpc051bWJlclNrZWxldG9uLCBpc1BsdXJhbEVsZW1lbnQsIGlzUG91bmRFbGVtZW50LCBpc1NlbGVjdEVsZW1lbnQsIGlzVGltZUVsZW1lbnQsIHBhcnNlRGF0ZVRpbWVTa2VsZXRvbiB9IGZyb20gJ2ludGwtbWVzc2FnZWZvcm1hdC1wYXJzZXInO1xuXG52YXIgRm9ybWF0RXJyb3IgPVxuLyoqIEBjbGFzcyAqL1xuZnVuY3Rpb24gKF9zdXBlcikge1xuICBfX2V4dGVuZHMoRm9ybWF0RXJyb3IsIF9zdXBlcik7XG5cbiAgZnVuY3Rpb24gRm9ybWF0RXJyb3IobXNnLCB2YXJpYWJsZUlkKSB7XG4gICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuXG4gICAgX3RoaXMudmFyaWFibGVJZCA9IHZhcmlhYmxlSWQ7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgcmV0dXJuIEZvcm1hdEVycm9yO1xufShFcnJvcik7XG5cbmZ1bmN0aW9uIG1lcmdlTGl0ZXJhbChwYXJ0cykge1xuICBpZiAocGFydHMubGVuZ3RoIDwgMikge1xuICAgIHJldHVybiBwYXJ0cztcbiAgfVxuXG4gIHJldHVybiBwYXJ0cy5yZWR1Y2UoZnVuY3Rpb24gKGFsbCwgcGFydCkge1xuICAgIHZhciBsYXN0UGFydCA9IGFsbFthbGwubGVuZ3RoIC0gMV07XG5cbiAgICBpZiAoIWxhc3RQYXJ0IHx8IGxhc3RQYXJ0LnR5cGUgIT09IDBcbiAgICAvKiBsaXRlcmFsICovXG4gICAgfHwgcGFydC50eXBlICE9PSAwXG4gICAgLyogbGl0ZXJhbCAqL1xuICAgICkge1xuICAgICAgICBhbGwucHVzaChwYXJ0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICBsYXN0UGFydC52YWx1ZSArPSBwYXJ0LnZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiBhbGw7XG4gIH0sIFtdKTtcbn0gLy8gVE9ETyhza2VsZXRvbik6IGFkZCBza2VsZXRvbiBzdXBwb3J0XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFRvUGFydHMoZWxzLCBsb2NhbGVzLCBmb3JtYXR0ZXJzLCBmb3JtYXRzLCB2YWx1ZXMsIGN1cnJlbnRQbHVyYWxWYWx1ZSwgLy8gRm9yIGRlYnVnZ2luZ1xub3JpZ2luYWxNZXNzYWdlKSB7XG4gIC8vIEhvdCBwYXRoIGZvciBzdHJhaWdodCBzaW1wbGUgbXNnIHRyYW5zbGF0aW9uc1xuICBpZiAoZWxzLmxlbmd0aCA9PT0gMSAmJiBpc0xpdGVyYWxFbGVtZW50KGVsc1swXSkpIHtcbiAgICByZXR1cm4gW3tcbiAgICAgIHR5cGU6IDBcbiAgICAgIC8qIGxpdGVyYWwgKi9cbiAgICAgICxcbiAgICAgIHZhbHVlOiBlbHNbMF0udmFsdWVcbiAgICB9XTtcbiAgfVxuXG4gIHZhciByZXN1bHQgPSBbXTtcblxuICBmb3IgKHZhciBfaSA9IDAsIGVsc18xID0gZWxzOyBfaSA8IGVsc18xLmxlbmd0aDsgX2krKykge1xuICAgIHZhciBlbCA9IGVsc18xW19pXTsgLy8gRXhpdCBlYXJseSBmb3Igc3RyaW5nIHBhcnRzLlxuXG4gICAgaWYgKGlzTGl0ZXJhbEVsZW1lbnQoZWwpKSB7XG4gICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgIHR5cGU6IDBcbiAgICAgICAgLyogbGl0ZXJhbCAqL1xuICAgICAgICAsXG4gICAgICAgIHZhbHVlOiBlbC52YWx1ZVxuICAgICAgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9IC8vIFRPRE86IHNob3VsZCB0aGlzIHBhcnQgYmUgbGl0ZXJhbCB0eXBlP1xuICAgIC8vIFJlcGxhY2UgYCNgIGluIHBsdXJhbCBydWxlcyB3aXRoIHRoZSBhY3R1YWwgbnVtZXJpYyB2YWx1ZS5cblxuXG4gICAgaWYgKGlzUG91bmRFbGVtZW50KGVsKSkge1xuICAgICAgaWYgKHR5cGVvZiBjdXJyZW50UGx1cmFsVmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICB0eXBlOiAwXG4gICAgICAgICAgLyogbGl0ZXJhbCAqL1xuICAgICAgICAgICxcbiAgICAgICAgICB2YWx1ZTogZm9ybWF0dGVycy5nZXROdW1iZXJGb3JtYXQobG9jYWxlcykuZm9ybWF0KGN1cnJlbnRQbHVyYWxWYWx1ZSlcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciB2YXJOYW1lID0gZWwudmFsdWU7IC8vIEVuZm9yY2UgdGhhdCBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBwcm92aWRlZCBieSB0aGUgY2FsbGVyLlxuXG4gICAgaWYgKCEodmFsdWVzICYmIHZhck5hbWUgaW4gdmFsdWVzKSkge1xuICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiVGhlIGludGwgc3RyaW5nIGNvbnRleHQgdmFyaWFibGUgXFxcIlwiICsgdmFyTmFtZSArIFwiXFxcIiB3YXMgbm90IHByb3ZpZGVkIHRvIHRoZSBzdHJpbmcgXFxcIlwiICsgb3JpZ2luYWxNZXNzYWdlICsgXCJcXFwiXCIpO1xuICAgIH1cblxuICAgIHZhciB2YWx1ZSA9IHZhbHVlc1t2YXJOYW1lXTtcblxuICAgIGlmIChpc0FyZ3VtZW50RWxlbWVudChlbCkpIHtcbiAgICAgIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHZhbHVlID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInID8gU3RyaW5nKHZhbHVlKSA6ICcnO1xuICAgICAgfVxuXG4gICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgIHR5cGU6IDFcbiAgICAgICAgLyogYXJndW1lbnQgKi9cbiAgICAgICAgLFxuICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfSAvLyBSZWN1cnNpdmVseSBmb3JtYXQgcGx1cmFsIGFuZCBzZWxlY3QgcGFydHMnIG9wdGlvbiDigJQgd2hpY2ggY2FuIGJlIGFcbiAgICAvLyBuZXN0ZWQgcGF0dGVybiBzdHJ1Y3R1cmUuIFRoZSBjaG9vc2luZyBvZiB0aGUgb3B0aW9uIHRvIHVzZSBpc1xuICAgIC8vIGFic3RyYWN0ZWQtYnkgYW5kIGRlbGVnYXRlZC10byB0aGUgcGFydCBoZWxwZXIgb2JqZWN0LlxuXG5cbiAgICBpZiAoaXNEYXRlRWxlbWVudChlbCkpIHtcbiAgICAgIHZhciBzdHlsZSA9IHR5cGVvZiBlbC5zdHlsZSA9PT0gJ3N0cmluZycgPyBmb3JtYXRzLmRhdGVbZWwuc3R5bGVdIDogdW5kZWZpbmVkO1xuICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICB0eXBlOiAwXG4gICAgICAgIC8qIGxpdGVyYWwgKi9cbiAgICAgICAgLFxuICAgICAgICB2YWx1ZTogZm9ybWF0dGVycy5nZXREYXRlVGltZUZvcm1hdChsb2NhbGVzLCBzdHlsZSkuZm9ybWF0KHZhbHVlKVxuICAgICAgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoaXNUaW1lRWxlbWVudChlbCkpIHtcbiAgICAgIHZhciBzdHlsZSA9IHR5cGVvZiBlbC5zdHlsZSA9PT0gJ3N0cmluZycgPyBmb3JtYXRzLnRpbWVbZWwuc3R5bGVdIDogaXNEYXRlVGltZVNrZWxldG9uKGVsLnN0eWxlKSA/IHBhcnNlRGF0ZVRpbWVTa2VsZXRvbihlbC5zdHlsZS5wYXR0ZXJuKSA6IHVuZGVmaW5lZDtcbiAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgdHlwZTogMFxuICAgICAgICAvKiBsaXRlcmFsICovXG4gICAgICAgICxcbiAgICAgICAgdmFsdWU6IGZvcm1hdHRlcnMuZ2V0RGF0ZVRpbWVGb3JtYXQobG9jYWxlcywgc3R5bGUpLmZvcm1hdCh2YWx1ZSlcbiAgICAgIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGlzTnVtYmVyRWxlbWVudChlbCkpIHtcbiAgICAgIHZhciBzdHlsZSA9IHR5cGVvZiBlbC5zdHlsZSA9PT0gJ3N0cmluZycgPyBmb3JtYXRzLm51bWJlcltlbC5zdHlsZV0gOiBpc051bWJlclNrZWxldG9uKGVsLnN0eWxlKSA/IGNvbnZlcnROdW1iZXJTa2VsZXRvblRvTnVtYmVyRm9ybWF0T3B0aW9ucyhlbC5zdHlsZS50b2tlbnMpIDogdW5kZWZpbmVkO1xuICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICB0eXBlOiAwXG4gICAgICAgIC8qIGxpdGVyYWwgKi9cbiAgICAgICAgLFxuICAgICAgICB2YWx1ZTogZm9ybWF0dGVycy5nZXROdW1iZXJGb3JtYXQobG9jYWxlcywgc3R5bGUpLmZvcm1hdCh2YWx1ZSlcbiAgICAgIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGlzU2VsZWN0RWxlbWVudChlbCkpIHtcbiAgICAgIHZhciBvcHQgPSBlbC5vcHRpb25zW3ZhbHVlXSB8fCBlbC5vcHRpb25zLm90aGVyO1xuXG4gICAgICBpZiAoIW9wdCkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgdmFsdWVzIGZvciBcXFwiXCIgKyBlbC52YWx1ZSArIFwiXFxcIjogXFxcIlwiICsgdmFsdWUgKyBcIlxcXCIuIE9wdGlvbnMgYXJlIFxcXCJcIiArIE9iamVjdC5rZXlzKGVsLm9wdGlvbnMpLmpvaW4oJ1wiLCBcIicpICsgXCJcXFwiXCIpO1xuICAgICAgfVxuXG4gICAgICByZXN1bHQucHVzaC5hcHBseShyZXN1bHQsIGZvcm1hdFRvUGFydHMob3B0LnZhbHVlLCBsb2NhbGVzLCBmb3JtYXR0ZXJzLCBmb3JtYXRzLCB2YWx1ZXMpKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChpc1BsdXJhbEVsZW1lbnQoZWwpKSB7XG4gICAgICB2YXIgb3B0ID0gZWwub3B0aW9uc1tcIj1cIiArIHZhbHVlXTtcblxuICAgICAgaWYgKCFvcHQpIHtcbiAgICAgICAgaWYgKCFJbnRsLlBsdXJhbFJ1bGVzKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKFwiSW50bC5QbHVyYWxSdWxlcyBpcyBub3QgYXZhaWxhYmxlIGluIHRoaXMgZW52aXJvbm1lbnQuXFxuVHJ5IHBvbHlmaWxsaW5nIGl0IHVzaW5nIFxcXCJAZm9ybWF0anMvaW50bC1wbHVyYWxydWxlc1xcXCJcXG5cIik7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcnVsZSA9IGZvcm1hdHRlcnMuZ2V0UGx1cmFsUnVsZXMobG9jYWxlcywge1xuICAgICAgICAgIHR5cGU6IGVsLnBsdXJhbFR5cGVcbiAgICAgICAgfSkuc2VsZWN0KHZhbHVlIC0gKGVsLm9mZnNldCB8fCAwKSk7XG4gICAgICAgIG9wdCA9IGVsLm9wdGlvbnNbcnVsZV0gfHwgZWwub3B0aW9ucy5vdGhlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFvcHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIHZhbHVlcyBmb3IgXFxcIlwiICsgZWwudmFsdWUgKyBcIlxcXCI6IFxcXCJcIiArIHZhbHVlICsgXCJcXFwiLiBPcHRpb25zIGFyZSBcXFwiXCIgKyBPYmplY3Qua2V5cyhlbC5vcHRpb25zKS5qb2luKCdcIiwgXCInKSArIFwiXFxcIlwiKTtcbiAgICAgIH1cblxuICAgICAgcmVzdWx0LnB1c2guYXBwbHkocmVzdWx0LCBmb3JtYXRUb1BhcnRzKG9wdC52YWx1ZSwgbG9jYWxlcywgZm9ybWF0dGVycywgZm9ybWF0cywgdmFsdWVzLCB2YWx1ZSAtIChlbC5vZmZzZXQgfHwgMCkpKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtZXJnZUxpdGVyYWwocmVzdWx0KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRUb1N0cmluZyhlbHMsIGxvY2FsZXMsIGZvcm1hdHRlcnMsIGZvcm1hdHMsIHZhbHVlcywgLy8gRm9yIGRlYnVnZ2luZ1xub3JpZ2luYWxNZXNzYWdlKSB7XG4gIHZhciBwYXJ0cyA9IGZvcm1hdFRvUGFydHMoZWxzLCBsb2NhbGVzLCBmb3JtYXR0ZXJzLCBmb3JtYXRzLCB2YWx1ZXMsIHVuZGVmaW5lZCwgb3JpZ2luYWxNZXNzYWdlKTsgLy8gSG90IHBhdGggZm9yIHN0cmFpZ2h0IHNpbXBsZSBtc2cgdHJhbnNsYXRpb25zXG5cbiAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBwYXJ0c1swXS52YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBwYXJ0cy5yZWR1Y2UoZnVuY3Rpb24gKGFsbCwgcGFydCkge1xuICAgIHJldHVybiBhbGwgKz0gcGFydC52YWx1ZTtcbiAgfSwgJycpO1xufSAvLyBTaW5nbGV0b25cblxudmFyIGRvbVBhcnNlcjtcbnZhciBUT0tFTl9ERUxJTUlURVIgPSAnQEAnO1xudmFyIFRPS0VOX1JFR0VYID0gL0BAKFxcZCtfXFxkKylAQC9nO1xudmFyIGNvdW50ZXIgPSAwO1xuXG5mdW5jdGlvbiBnZW5lcmF0ZUlkKCkge1xuICByZXR1cm4gRGF0ZS5ub3coKSArIFwiX1wiICsgKytjb3VudGVyO1xufVxuXG5mdW5jdGlvbiByZXN0b3JlUmljaFBsYWNlaG9sZGVyTWVzc2FnZSh0ZXh0LCBvYmplY3RQYXJ0cykge1xuICByZXR1cm4gdGV4dC5zcGxpdChUT0tFTl9SRUdFWCkuZmlsdGVyKEJvb2xlYW4pLm1hcChmdW5jdGlvbiAoYykge1xuICAgIHJldHVybiBvYmplY3RQYXJ0c1tjXSAhPSBudWxsID8gb2JqZWN0UGFydHNbY10gOiBjO1xuICB9KS5yZWR1Y2UoZnVuY3Rpb24gKGFsbCwgYykge1xuICAgIGlmICghYWxsLmxlbmd0aCkge1xuICAgICAgYWxsLnB1c2goYyk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYyA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIGFsbFthbGwubGVuZ3RoIC0gMV0gPT09ICdzdHJpbmcnKSB7XG4gICAgICBhbGxbYWxsLmxlbmd0aCAtIDFdICs9IGM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFsbC5wdXNoKGMpO1xuICAgIH1cblxuICAgIHJldHVybiBhbGw7XG4gIH0sIFtdKTtcbn1cbi8qKlxuICogTm90IGV4aGF1c3RpdmUsIGp1c3QgZm9yIHNhbml0eSBjaGVja1xuICovXG5cblxudmFyIFNJTVBMRV9YTUxfUkVHRVggPSAvKDwoWzAtOWEtekEtWi1fXSo/KT4oLio/KTxcXC8oWzAtOWEtekEtWi1fXSo/KT4pfCg8WzAtOWEtekEtWi1fXSo/XFwvPikvO1xudmFyIFRFTVBMQVRFX0lEID0gRGF0ZS5ub3coKSArICdAQCc7XG52YXIgVk9JRF9FTEVNRU5UUyA9IFsnYXJlYScsICdiYXNlJywgJ2JyJywgJ2NvbCcsICdlbWJlZCcsICdocicsICdpbWcnLCAnaW5wdXQnLCAnbGluaycsICdtZXRhJywgJ3BhcmFtJywgJ3NvdXJjZScsICd0cmFjaycsICd3YnInXTtcblxuZnVuY3Rpb24gZm9ybWF0SFRNTEVsZW1lbnQoZWwsIG9iamVjdFBhcnRzLCB2YWx1ZXMpIHtcbiAgdmFyIHRhZ05hbWUgPSBlbC50YWdOYW1lO1xuICB2YXIgb3V0ZXJIVE1MID0gZWwub3V0ZXJIVE1MLFxuICAgICAgdGV4dENvbnRlbnQgPSBlbC50ZXh0Q29udGVudCxcbiAgICAgIGNoaWxkTm9kZXMgPSBlbC5jaGlsZE5vZGVzOyAvLyBSZWd1bGFyIHRleHRcblxuICBpZiAoIXRhZ05hbWUpIHtcbiAgICByZXR1cm4gcmVzdG9yZVJpY2hQbGFjZWhvbGRlck1lc3NhZ2UodGV4dENvbnRlbnQgfHwgJycsIG9iamVjdFBhcnRzKTtcbiAgfVxuXG4gIHRhZ05hbWUgPSB0YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gIHZhciBpc1ZvaWRFbGVtZW50ID0gflZPSURfRUxFTUVOVFMuaW5kZXhPZih0YWdOYW1lKTtcbiAgdmFyIGZvcm1hdEZuT3JWYWx1ZSA9IHZhbHVlc1t0YWdOYW1lXTtcblxuICBpZiAoZm9ybWF0Rm5PclZhbHVlICYmIGlzVm9pZEVsZW1lbnQpIHtcbiAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IodGFnTmFtZSArIFwiIGlzIGEgc2VsZi1jbG9zaW5nIHRhZyBhbmQgY2FuIG5vdCBiZSB1c2VkLCBwbGVhc2UgdXNlIGFub3RoZXIgdGFnIG5hbWUuXCIpO1xuICB9XG5cbiAgaWYgKCFjaGlsZE5vZGVzLmxlbmd0aCkge1xuICAgIHJldHVybiBbb3V0ZXJIVE1MXTtcbiAgfVxuXG4gIHZhciBjaHVua3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChjaGlsZE5vZGVzKS5yZWR1Y2UoZnVuY3Rpb24gKGFsbCwgY2hpbGQpIHtcbiAgICByZXR1cm4gYWxsLmNvbmNhdChmb3JtYXRIVE1MRWxlbWVudChjaGlsZCwgb2JqZWN0UGFydHMsIHZhbHVlcykpO1xuICB9LCBbXSk7IC8vIExlZ2FjeSBIVE1MXG5cbiAgaWYgKCFmb3JtYXRGbk9yVmFsdWUpIHtcbiAgICByZXR1cm4gX19zcHJlYWRBcnJheXMoW1wiPFwiICsgdGFnTmFtZSArIFwiPlwiXSwgY2h1bmtzLCBbXCI8L1wiICsgdGFnTmFtZSArIFwiPlwiXSk7XG4gIH0gLy8gSFRNTCBUYWcgcmVwbGFjZW1lbnRcblxuXG4gIGlmICh0eXBlb2YgZm9ybWF0Rm5PclZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIFtmb3JtYXRGbk9yVmFsdWUuYXBwbHkodm9pZCAwLCBjaHVua3MpXTtcbiAgfVxuXG4gIHJldHVybiBbZm9ybWF0Rm5PclZhbHVlXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEhUTUxNZXNzYWdlKGVscywgbG9jYWxlcywgZm9ybWF0dGVycywgZm9ybWF0cywgdmFsdWVzLCAvLyBGb3IgZGVidWdnaW5nXG5vcmlnaW5hbE1lc3NhZ2UpIHtcbiAgdmFyIHBhcnRzID0gZm9ybWF0VG9QYXJ0cyhlbHMsIGxvY2FsZXMsIGZvcm1hdHRlcnMsIGZvcm1hdHMsIHZhbHVlcywgdW5kZWZpbmVkLCBvcmlnaW5hbE1lc3NhZ2UpO1xuICB2YXIgb2JqZWN0UGFydHMgPSB7fTtcbiAgdmFyIGZvcm1hdHRlZE1lc3NhZ2UgPSBwYXJ0cy5yZWR1Y2UoZnVuY3Rpb24gKGFsbCwgcGFydCkge1xuICAgIGlmIChwYXJ0LnR5cGUgPT09IDBcbiAgICAvKiBsaXRlcmFsICovXG4gICAgKSB7XG4gICAgICAgIHJldHVybiBhbGwgKz0gcGFydC52YWx1ZTtcbiAgICAgIH1cblxuICAgIHZhciBpZCA9IGdlbmVyYXRlSWQoKTtcbiAgICBvYmplY3RQYXJ0c1tpZF0gPSBwYXJ0LnZhbHVlO1xuICAgIHJldHVybiBhbGwgKz0gXCJcIiArIFRPS0VOX0RFTElNSVRFUiArIGlkICsgVE9LRU5fREVMSU1JVEVSO1xuICB9LCAnJyk7IC8vIE5vdCBkZXNpZ25lZCB0byBmaWx0ZXIgb3V0IGFnZ3Jlc3NpdmVseVxuXG4gIGlmICghU0lNUExFX1hNTF9SRUdFWC50ZXN0KGZvcm1hdHRlZE1lc3NhZ2UpKSB7XG4gICAgcmV0dXJuIHJlc3RvcmVSaWNoUGxhY2Vob2xkZXJNZXNzYWdlKGZvcm1hdHRlZE1lc3NhZ2UsIG9iamVjdFBhcnRzKTtcbiAgfVxuXG4gIGlmICghdmFsdWVzKSB7XG4gICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCdNZXNzYWdlIGhhcyBwbGFjZWhvbGRlcnMgYnV0IG5vIHZhbHVlcyB3YXMgZ2l2ZW4nKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgRE9NUGFyc2VyID09PSAndW5kZWZpbmVkJykge1xuICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcignQ2Fubm90IGZvcm1hdCBYTUwgbWVzc2FnZSB3aXRob3V0IERPTVBhcnNlcicpO1xuICB9XG5cbiAgaWYgKCFkb21QYXJzZXIpIHtcbiAgICBkb21QYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gIH1cblxuICB2YXIgY29udGVudCA9IGRvbVBhcnNlci5wYXJzZUZyb21TdHJpbmcoXCI8Zm9ybWF0dGVkLW1lc3NhZ2UgaWQ9XFxcIlwiICsgVEVNUExBVEVfSUQgKyBcIlxcXCI+XCIgKyBmb3JtYXR0ZWRNZXNzYWdlICsgXCI8L2Zvcm1hdHRlZC1tZXNzYWdlPlwiLCAndGV4dC9odG1sJykuZ2V0RWxlbWVudEJ5SWQoVEVNUExBVEVfSUQpO1xuXG4gIGlmICghY29udGVudCkge1xuICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihcIk1hbGZvcm1lZCBIVE1MIG1lc3NhZ2UgXCIgKyBmb3JtYXR0ZWRNZXNzYWdlKTtcbiAgfVxuXG4gIHZhciB0YWdzVG9Gb3JtYXQgPSBPYmplY3Qua2V5cyh2YWx1ZXMpLmZpbHRlcihmdW5jdGlvbiAodmFyTmFtZSkge1xuICAgIHJldHVybiAhIWNvbnRlbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUodmFyTmFtZSkubGVuZ3RoO1xuICB9KTsgLy8gTm8gdGFncyB0byBmb3JtYXRcblxuICBpZiAoIXRhZ3NUb0Zvcm1hdC5sZW5ndGgpIHtcbiAgICByZXR1cm4gcmVzdG9yZVJpY2hQbGFjZWhvbGRlck1lc3NhZ2UoZm9ybWF0dGVkTWVzc2FnZSwgb2JqZWN0UGFydHMpO1xuICB9XG5cbiAgdmFyIGNhc2VTZW5zaXRpdmVUYWdzID0gdGFnc1RvRm9ybWF0LmZpbHRlcihmdW5jdGlvbiAodGFnTmFtZSkge1xuICAgIHJldHVybiB0YWdOYW1lICE9PSB0YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gIH0pO1xuXG4gIGlmIChjYXNlU2Vuc2l0aXZlVGFncy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoXCJIVE1MIHRhZyBtdXN0IGJlIGxvd2VyY2FzZWQgYnV0IHRoZSBmb2xsb3dpbmcgdGFncyBhcmUgbm90OiBcIiArIGNhc2VTZW5zaXRpdmVUYWdzLmpvaW4oJywgJykpO1xuICB9IC8vIFdlJ3JlIGRvaW5nIHRoaXMgc2luY2UgdG9wIG5vZGUgaXMgYDxmb3JtYXR0ZWQtbWVzc2FnZS8+YCB3aGljaCBkb2VzIG5vdCBoYXZlIGEgZm9ybWF0dGVyXG5cblxuICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoY29udGVudC5jaGlsZE5vZGVzKS5yZWR1Y2UoZnVuY3Rpb24gKGFsbCwgY2hpbGQpIHtcbiAgICByZXR1cm4gYWxsLmNvbmNhdChmb3JtYXRIVE1MRWxlbWVudChjaGlsZCwgb2JqZWN0UGFydHMsIHZhbHVlcykpO1xuICB9LCBbXSk7XG59IiwiLypcbkNvcHlyaWdodCAoYykgMjAxNCwgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbkNvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgTGljZW5zZS5cblNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4qL1xudmFyIF9fYXNzaWduID0gdGhpcyAmJiB0aGlzLl9fYXNzaWduIHx8IGZ1bmN0aW9uICgpIHtcbiAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0KSB7XG4gICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICBzID0gYXJndW1lbnRzW2ldO1xuXG4gICAgICBmb3IgKHZhciBwIGluIHMpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHQ7XG4gIH07XG5cbiAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xuXG5pbXBvcnQgeyBwYXJzZSB9IGZyb20gJ2ludGwtbWVzc2FnZWZvcm1hdC1wYXJzZXInO1xuaW1wb3J0IG1lbW9pemVJbnRsQ29uc3RydWN0b3IgZnJvbSAnaW50bC1mb3JtYXQtY2FjaGUnO1xuaW1wb3J0IHsgZm9ybWF0VG9TdHJpbmcsIGZvcm1hdFRvUGFydHMsIGZvcm1hdEhUTUxNZXNzYWdlIH0gZnJvbSAnLi9mb3JtYXR0ZXJzJzsgLy8gLS0gTWVzc2FnZUZvcm1hdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBtZXJnZUNvbmZpZyhjMSwgYzIpIHtcbiAgaWYgKCFjMikge1xuICAgIHJldHVybiBjMTtcbiAgfVxuXG4gIHJldHVybiBfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgYzEgfHwge30pLCBjMiB8fCB7fSksIE9iamVjdC5rZXlzKGMxKS5yZWR1Y2UoZnVuY3Rpb24gKGFsbCwgaykge1xuICAgIGFsbFtrXSA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBjMVtrXSksIGMyW2tdIHx8IHt9KTtcbiAgICByZXR1cm4gYWxsO1xuICB9LCB7fSkpO1xufVxuXG5mdW5jdGlvbiBtZXJnZUNvbmZpZ3MoZGVmYXVsdENvbmZpZywgY29uZmlncykge1xuICBpZiAoIWNvbmZpZ3MpIHtcbiAgICByZXR1cm4gZGVmYXVsdENvbmZpZztcbiAgfVxuXG4gIHJldHVybiBPYmplY3Qua2V5cyhkZWZhdWx0Q29uZmlnKS5yZWR1Y2UoZnVuY3Rpb24gKGFsbCwgaykge1xuICAgIGFsbFtrXSA9IG1lcmdlQ29uZmlnKGRlZmF1bHRDb25maWdba10sIGNvbmZpZ3Nba10pO1xuICAgIHJldHVybiBhbGw7XG4gIH0sIF9fYXNzaWduKHt9LCBkZWZhdWx0Q29uZmlnKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEZWZhdWx0Rm9ybWF0dGVycyhjYWNoZSkge1xuICBpZiAoY2FjaGUgPT09IHZvaWQgMCkge1xuICAgIGNhY2hlID0ge1xuICAgICAgbnVtYmVyOiB7fSxcbiAgICAgIGRhdGVUaW1lOiB7fSxcbiAgICAgIHBsdXJhbFJ1bGVzOiB7fVxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGdldE51bWJlckZvcm1hdDogbWVtb2l6ZUludGxDb25zdHJ1Y3RvcihJbnRsLk51bWJlckZvcm1hdCwgY2FjaGUubnVtYmVyKSxcbiAgICBnZXREYXRlVGltZUZvcm1hdDogbWVtb2l6ZUludGxDb25zdHJ1Y3RvcihJbnRsLkRhdGVUaW1lRm9ybWF0LCBjYWNoZS5kYXRlVGltZSksXG4gICAgZ2V0UGx1cmFsUnVsZXM6IG1lbW9pemVJbnRsQ29uc3RydWN0b3IoSW50bC5QbHVyYWxSdWxlcywgY2FjaGUucGx1cmFsUnVsZXMpXG4gIH07XG59XG5cbnZhciBJbnRsTWVzc2FnZUZvcm1hdCA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEludGxNZXNzYWdlRm9ybWF0KG1lc3NhZ2UsIGxvY2FsZXMsIG92ZXJyaWRlRm9ybWF0cywgb3B0cykge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBpZiAobG9jYWxlcyA9PT0gdm9pZCAwKSB7XG4gICAgICBsb2NhbGVzID0gSW50bE1lc3NhZ2VGb3JtYXQuZGVmYXVsdExvY2FsZTtcbiAgICB9XG5cbiAgICB0aGlzLmZvcm1hdHRlckNhY2hlID0ge1xuICAgICAgbnVtYmVyOiB7fSxcbiAgICAgIGRhdGVUaW1lOiB7fSxcbiAgICAgIHBsdXJhbFJ1bGVzOiB7fVxuICAgIH07XG5cbiAgICB0aGlzLmZvcm1hdCA9IGZ1bmN0aW9uICh2YWx1ZXMpIHtcbiAgICAgIHJldHVybiBmb3JtYXRUb1N0cmluZyhfdGhpcy5hc3QsIF90aGlzLmxvY2FsZXMsIF90aGlzLmZvcm1hdHRlcnMsIF90aGlzLmZvcm1hdHMsIHZhbHVlcywgX3RoaXMubWVzc2FnZSk7XG4gICAgfTtcblxuICAgIHRoaXMuZm9ybWF0VG9QYXJ0cyA9IGZ1bmN0aW9uICh2YWx1ZXMpIHtcbiAgICAgIHJldHVybiBmb3JtYXRUb1BhcnRzKF90aGlzLmFzdCwgX3RoaXMubG9jYWxlcywgX3RoaXMuZm9ybWF0dGVycywgX3RoaXMuZm9ybWF0cywgdmFsdWVzLCB1bmRlZmluZWQsIF90aGlzLm1lc3NhZ2UpO1xuICAgIH07XG5cbiAgICB0aGlzLmZvcm1hdEhUTUxNZXNzYWdlID0gZnVuY3Rpb24gKHZhbHVlcykge1xuICAgICAgcmV0dXJuIGZvcm1hdEhUTUxNZXNzYWdlKF90aGlzLmFzdCwgX3RoaXMubG9jYWxlcywgX3RoaXMuZm9ybWF0dGVycywgX3RoaXMuZm9ybWF0cywgdmFsdWVzLCBfdGhpcy5tZXNzYWdlKTtcbiAgICB9O1xuXG4gICAgdGhpcy5yZXNvbHZlZE9wdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsb2NhbGU6IEludGwuTnVtYmVyRm9ybWF0LnN1cHBvcnRlZExvY2FsZXNPZihfdGhpcy5sb2NhbGVzKVswXVxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgdGhpcy5nZXRBc3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RoaXMuYXN0O1xuICAgIH07XG5cbiAgICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuXG4gICAgICBpZiAoIUludGxNZXNzYWdlRm9ybWF0Ll9fcGFyc2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW50bE1lc3NhZ2VGb3JtYXQuX19wYXJzZSBtdXN0IGJlIHNldCB0byBwcm9jZXNzIGBtZXNzYWdlYCBvZiB0eXBlIGBzdHJpbmdgJyk7XG4gICAgICB9IC8vIFBhcnNlIHN0cmluZyBtZXNzYWdlcyBpbnRvIGFuIEFTVC5cblxuXG4gICAgICB0aGlzLmFzdCA9IEludGxNZXNzYWdlRm9ybWF0Ll9fcGFyc2UobWVzc2FnZSwge1xuICAgICAgICBub3JtYWxpemVIYXNodGFnSW5QbHVyYWw6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hc3QgPSBtZXNzYWdlO1xuICAgIH1cblxuICAgIGlmICghQXJyYXkuaXNBcnJheSh0aGlzLmFzdCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0EgbWVzc2FnZSBtdXN0IGJlIHByb3ZpZGVkIGFzIGEgU3RyaW5nIG9yIEFTVC4nKTtcbiAgICB9IC8vIENyZWF0ZXMgYSBuZXcgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBgZm9ybWF0c2AgbWVyZ2VkIHdpdGggdGhlIGRlZmF1bHRcbiAgICAvLyBmb3JtYXRzLlxuXG5cbiAgICB0aGlzLmZvcm1hdHMgPSBtZXJnZUNvbmZpZ3MoSW50bE1lc3NhZ2VGb3JtYXQuZm9ybWF0cywgb3ZlcnJpZGVGb3JtYXRzKTsgLy8gRGVmaW5lZCBmaXJzdCBiZWNhdXNlIGl0J3MgdXNlZCB0byBidWlsZCB0aGUgZm9ybWF0IHBhdHRlcm4uXG5cbiAgICB0aGlzLmxvY2FsZXMgPSBsb2NhbGVzO1xuICAgIHRoaXMuZm9ybWF0dGVycyA9IG9wdHMgJiYgb3B0cy5mb3JtYXR0ZXJzIHx8IGNyZWF0ZURlZmF1bHRGb3JtYXR0ZXJzKHRoaXMuZm9ybWF0dGVyQ2FjaGUpO1xuICB9XG5cbiAgSW50bE1lc3NhZ2VGb3JtYXQuZGVmYXVsdExvY2FsZSA9IG5ldyBJbnRsLk51bWJlckZvcm1hdCgpLnJlc29sdmVkT3B0aW9ucygpLmxvY2FsZTtcbiAgSW50bE1lc3NhZ2VGb3JtYXQuX19wYXJzZSA9IHBhcnNlOyAvLyBEZWZhdWx0IGZvcm1hdCBvcHRpb25zIHVzZWQgYXMgdGhlIHByb3RvdHlwZSBvZiB0aGUgYGZvcm1hdHNgIHByb3ZpZGVkIHRvIHRoZVxuICAvLyBjb25zdHJ1Y3Rvci4gVGhlc2UgYXJlIHVzZWQgd2hlbiBjb25zdHJ1Y3RpbmcgdGhlIGludGVybmFsIEludGwuTnVtYmVyRm9ybWF0XG4gIC8vIGFuZCBJbnRsLkRhdGVUaW1lRm9ybWF0IGluc3RhbmNlcy5cblxuICBJbnRsTWVzc2FnZUZvcm1hdC5mb3JtYXRzID0ge1xuICAgIG51bWJlcjoge1xuICAgICAgY3VycmVuY3k6IHtcbiAgICAgICAgc3R5bGU6ICdjdXJyZW5jeSdcbiAgICAgIH0sXG4gICAgICBwZXJjZW50OiB7XG4gICAgICAgIHN0eWxlOiAncGVyY2VudCdcbiAgICAgIH1cbiAgICB9LFxuICAgIGRhdGU6IHtcbiAgICAgIHNob3J0OiB7XG4gICAgICAgIG1vbnRoOiAnbnVtZXJpYycsXG4gICAgICAgIGRheTogJ251bWVyaWMnLFxuICAgICAgICB5ZWFyOiAnMi1kaWdpdCdcbiAgICAgIH0sXG4gICAgICBtZWRpdW06IHtcbiAgICAgICAgbW9udGg6ICdzaG9ydCcsXG4gICAgICAgIGRheTogJ251bWVyaWMnLFxuICAgICAgICB5ZWFyOiAnbnVtZXJpYydcbiAgICAgIH0sXG4gICAgICBsb25nOiB7XG4gICAgICAgIG1vbnRoOiAnbG9uZycsXG4gICAgICAgIGRheTogJ251bWVyaWMnLFxuICAgICAgICB5ZWFyOiAnbnVtZXJpYydcbiAgICAgIH0sXG4gICAgICBmdWxsOiB7XG4gICAgICAgIHdlZWtkYXk6ICdsb25nJyxcbiAgICAgICAgbW9udGg6ICdsb25nJyxcbiAgICAgICAgZGF5OiAnbnVtZXJpYycsXG4gICAgICAgIHllYXI6ICdudW1lcmljJ1xuICAgICAgfVxuICAgIH0sXG4gICAgdGltZToge1xuICAgICAgc2hvcnQ6IHtcbiAgICAgICAgaG91cjogJ251bWVyaWMnLFxuICAgICAgICBtaW51dGU6ICdudW1lcmljJ1xuICAgICAgfSxcbiAgICAgIG1lZGl1bToge1xuICAgICAgICBob3VyOiAnbnVtZXJpYycsXG4gICAgICAgIG1pbnV0ZTogJ251bWVyaWMnLFxuICAgICAgICBzZWNvbmQ6ICdudW1lcmljJ1xuICAgICAgfSxcbiAgICAgIGxvbmc6IHtcbiAgICAgICAgaG91cjogJ251bWVyaWMnLFxuICAgICAgICBtaW51dGU6ICdudW1lcmljJyxcbiAgICAgICAgc2Vjb25kOiAnbnVtZXJpYycsXG4gICAgICAgIHRpbWVab25lTmFtZTogJ3Nob3J0J1xuICAgICAgfSxcbiAgICAgIGZ1bGw6IHtcbiAgICAgICAgaG91cjogJ251bWVyaWMnLFxuICAgICAgICBtaW51dGU6ICdudW1lcmljJyxcbiAgICAgICAgc2Vjb25kOiAnbnVtZXJpYycsXG4gICAgICAgIHRpbWVab25lTmFtZTogJ3Nob3J0J1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgcmV0dXJuIEludGxNZXNzYWdlRm9ybWF0O1xufSgpO1xuXG5leHBvcnQgeyBJbnRsTWVzc2FnZUZvcm1hdCB9O1xuZXhwb3J0IGRlZmF1bHQgSW50bE1lc3NhZ2VGb3JtYXQ7IiwiLypcbkNvcHlyaWdodCAoYykgMjAxNCwgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbkNvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgTGljZW5zZS5cblNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4qL1xuaW1wb3J0IEludGxNZXNzYWdlRm9ybWF0IGZyb20gJy4vY29yZSc7XG5leHBvcnQgKiBmcm9tICcuL2Zvcm1hdHRlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb3JlJztcbmV4cG9ydCBkZWZhdWx0IEludGxNZXNzYWdlRm9ybWF0OyIsIi8qXG5IVE1MIGVzY2FwaW5nIGlzIHRoZSBzYW1lIGFzIFJlYWN0J3NcbihvbiBwdXJwb3NlLikgVGhlcmVmb3JlLCBpdCBoYXMgdGhlIGZvbGxvd2luZyBDb3B5cmlnaHQgYW5kIExpY2Vuc2luZzpcblxuQ29weXJpZ2h0IDIwMTMtMjAxNCwgRmFjZWJvb2ssIEluYy5cbkFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cblRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZSBMSUNFTlNFXG5maWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiBSZWFjdCdzIHNvdXJjZSB0cmVlLlxuKi9cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBJbnRsTWVzc2FnZUZvcm1hdCBmcm9tICdpbnRsLW1lc3NhZ2Vmb3JtYXQnO1xuaW1wb3J0IG1lbW9pemVJbnRsQ29uc3RydWN0b3IgZnJvbSAnaW50bC1mb3JtYXQtY2FjaGUnO1xuaW1wb3J0IHsgaW52YXJpYW50IH0gZnJvbSAnQGZvcm1hdGpzL2ludGwtdXRpbHMnO1xudmFyIEVTQ0FQRURfQ0hBUlMgPSB7XG4gIDM4OiAnJmFtcDsnLFxuICA2MjogJyZndDsnLFxuICA2MDogJyZsdDsnLFxuICAzNDogJyZxdW90OycsXG4gIDM5OiAnJiN4Mjc7J1xufTtcbnZhciBVTlNBRkVfQ0hBUlNfUkVHRVggPSAvWyY+PFwiJ10vZztcbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGUoc3RyKSB7XG4gIHJldHVybiAoJycgKyBzdHIpLnJlcGxhY2UoVU5TQUZFX0NIQVJTX1JFR0VYLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICByZXR1cm4gRVNDQVBFRF9DSEFSU1ttYXRjaC5jaGFyQ29kZUF0KDApXTtcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyUHJvcHMocHJvcHMsIHdoaXRlbGlzdCkge1xuICB2YXIgZGVmYXVsdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuICByZXR1cm4gd2hpdGVsaXN0LnJlZHVjZShmdW5jdGlvbiAoZmlsdGVyZWQsIG5hbWUpIHtcbiAgICBpZiAobmFtZSBpbiBwcm9wcykge1xuICAgICAgZmlsdGVyZWRbbmFtZV0gPSBwcm9wc1tuYW1lXTtcbiAgICB9IGVsc2UgaWYgKG5hbWUgaW4gZGVmYXVsdHMpIHtcbiAgICAgIGZpbHRlcmVkW25hbWVdID0gZGVmYXVsdHNbbmFtZV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpbHRlcmVkO1xuICB9LCB7fSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaW52YXJpYW50SW50bENvbnRleHQoaW50bCkge1xuICBpbnZhcmlhbnQoaW50bCwgJ1tSZWFjdCBJbnRsXSBDb3VsZCBub3QgZmluZCByZXF1aXJlZCBgaW50bGAgb2JqZWN0LiAnICsgJzxJbnRsUHJvdmlkZXI+IG5lZWRzIHRvIGV4aXN0IGluIHRoZSBjb21wb25lbnQgYW5jZXN0cnkuJyk7XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXJyb3IobWVzc2FnZSwgZXhjZXB0aW9uKSB7XG4gIHZhciBlTXNnID0gZXhjZXB0aW9uID8gXCJcXG5cIi5jb25jYXQoZXhjZXB0aW9uLnN0YWNrKSA6ICcnO1xuICByZXR1cm4gXCJbUmVhY3QgSW50bF0gXCIuY29uY2F0KG1lc3NhZ2UpLmNvbmNhdChlTXNnKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0RXJyb3JIYW5kbGVyKGVycm9yKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gIH1cbn1cbmV4cG9ydCB2YXIgREVGQVVMVF9JTlRMX0NPTkZJRyA9IHtcbiAgZm9ybWF0czoge30sXG4gIG1lc3NhZ2VzOiB7fSxcbiAgdGltZVpvbmU6IHVuZGVmaW5lZCxcbiAgdGV4dENvbXBvbmVudDogUmVhY3QuRnJhZ21lbnQsXG4gIGRlZmF1bHRMb2NhbGU6ICdlbicsXG4gIGRlZmF1bHRGb3JtYXRzOiB7fSxcbiAgb25FcnJvcjogZGVmYXVsdEVycm9ySGFuZGxlclxufTtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJbnRsQ2FjaGUoKSB7XG4gIHJldHVybiB7XG4gICAgZGF0ZVRpbWU6IHt9LFxuICAgIG51bWJlcjoge30sXG4gICAgbWVzc2FnZToge30sXG4gICAgcmVsYXRpdmVUaW1lOiB7fSxcbiAgICBwbHVyYWxSdWxlczoge30sXG4gICAgbGlzdDoge30sXG4gICAgZGlzcGxheU5hbWVzOiB7fVxuICB9O1xufVxuLyoqXG4gKiBDcmVhdGUgaW50bCBmb3JtYXR0ZXJzIGFuZCBwb3B1bGF0ZSBjYWNoZVxuICogQHBhcmFtIGNhY2hlIGV4cGxpY2l0IGNhY2hlIHRvIHByZXZlbnQgbGVha2luZyBtZW1vcnlcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRm9ybWF0dGVycygpIHtcbiAgdmFyIGNhY2hlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBjcmVhdGVJbnRsQ2FjaGUoKTtcbiAgdmFyIFJlbGF0aXZlVGltZUZvcm1hdCA9IEludGwuUmVsYXRpdmVUaW1lRm9ybWF0O1xuICB2YXIgTGlzdEZvcm1hdCA9IEludGwuTGlzdEZvcm1hdDtcbiAgdmFyIERpc3BsYXlOYW1lcyA9IEludGwuRGlzcGxheU5hbWVzO1xuICByZXR1cm4ge1xuICAgIGdldERhdGVUaW1lRm9ybWF0OiBtZW1vaXplSW50bENvbnN0cnVjdG9yKEludGwuRGF0ZVRpbWVGb3JtYXQsIGNhY2hlLmRhdGVUaW1lKSxcbiAgICBnZXROdW1iZXJGb3JtYXQ6IG1lbW9pemVJbnRsQ29uc3RydWN0b3IoSW50bC5OdW1iZXJGb3JtYXQsIGNhY2hlLm51bWJlciksXG4gICAgZ2V0TWVzc2FnZUZvcm1hdDogbWVtb2l6ZUludGxDb25zdHJ1Y3RvcihJbnRsTWVzc2FnZUZvcm1hdCwgY2FjaGUubWVzc2FnZSksXG4gICAgZ2V0UmVsYXRpdmVUaW1lRm9ybWF0OiBtZW1vaXplSW50bENvbnN0cnVjdG9yKFJlbGF0aXZlVGltZUZvcm1hdCwgY2FjaGUucmVsYXRpdmVUaW1lKSxcbiAgICBnZXRQbHVyYWxSdWxlczogbWVtb2l6ZUludGxDb25zdHJ1Y3RvcihJbnRsLlBsdXJhbFJ1bGVzLCBjYWNoZS5wbHVyYWxSdWxlcyksXG4gICAgZ2V0TGlzdEZvcm1hdDogbWVtb2l6ZUludGxDb25zdHJ1Y3RvcihMaXN0Rm9ybWF0LCBjYWNoZS5saXN0KSxcbiAgICBnZXREaXNwbGF5TmFtZXM6IG1lbW9pemVJbnRsQ29uc3RydWN0b3IoRGlzcGxheU5hbWVzLCBjYWNoZS5kaXNwbGF5TmFtZXMpXG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZWRGb3JtYXQoZm9ybWF0cywgdHlwZSwgbmFtZSwgb25FcnJvcikge1xuICB2YXIgZm9ybWF0VHlwZSA9IGZvcm1hdHMgJiYgZm9ybWF0c1t0eXBlXTtcbiAgdmFyIGZvcm1hdDtcblxuICBpZiAoZm9ybWF0VHlwZSkge1xuICAgIGZvcm1hdCA9IGZvcm1hdFR5cGVbbmFtZV07XG4gIH1cblxuICBpZiAoZm9ybWF0KSB7XG4gICAgcmV0dXJuIGZvcm1hdDtcbiAgfVxuXG4gIG9uRXJyb3IoY3JlYXRlRXJyb3IoXCJObyBcIi5jb25jYXQodHlwZSwgXCIgZm9ybWF0IG5hbWVkOiBcIikuY29uY2F0KG5hbWUpKSk7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiL2hvbWUvcnVubmVyL3dvcmsvanVzdGljZTQwLXRvb2wvanVzdGljZTQwLXRvb2wvY2xpZW50L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0ICogYXMgaG9pc3ROb25SZWFjdFN0YXRpY3NfIGZyb20gJ2hvaXN0LW5vbi1yZWFjdC1zdGF0aWNzJzsgLy8gU2luY2Ugcm9sbHVwIGNhbm5vdCBkZWFsIHdpdGggbmFtZXNwYWNlIGJlaW5nIGEgZnVuY3Rpb24sXG4vLyB0aGlzIGlzIHRvIGludGVyb3Agd2l0aCBUeXBlU2NyaXB0IHNpbmNlIGBpbnZhcmlhbnRgXG4vLyBkb2VzIG5vdCBleHBvcnQgYSBkZWZhdWx0XG4vLyBodHRwczovL2dpdGh1Yi5jb20vcm9sbHVwL3JvbGx1cC9pc3N1ZXMvMTI2N1xuXG52YXIgaG9pc3ROb25SZWFjdFN0YXRpY3MgPSBob2lzdE5vblJlYWN0U3RhdGljc18uZGVmYXVsdCB8fCBob2lzdE5vblJlYWN0U3RhdGljc187XG5pbXBvcnQgeyBpbnZhcmlhbnRJbnRsQ29udGV4dCB9IGZyb20gJy4uL3V0aWxzJztcblxuZnVuY3Rpb24gZ2V0RGlzcGxheU5hbWUoQ29tcG9uZW50KSB7XG4gIHJldHVybiBDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgQ29tcG9uZW50Lm5hbWUgfHwgJ0NvbXBvbmVudCc7XG59IC8vIFRPRE86IFdlIHNob3VsZCBwcm92aWRlIGluaXRpYWwgdmFsdWUgaGVyZVxuXG5cbnZhciBJbnRsQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQobnVsbCk7XG52YXIgSW50bENvbnN1bWVyID0gSW50bENvbnRleHQuQ29uc3VtZXIsXG4gICAgSW50bFByb3ZpZGVyID0gSW50bENvbnRleHQuUHJvdmlkZXI7XG5leHBvcnQgdmFyIFByb3ZpZGVyID0gSW50bFByb3ZpZGVyO1xuZXhwb3J0IHZhciBDb250ZXh0ID0gSW50bENvbnRleHQ7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbmplY3RJbnRsKFdyYXBwZWRDb21wb25lbnQsIG9wdGlvbnMpIHtcbiAgdmFyIF9yZWYgPSBvcHRpb25zIHx8IHt9LFxuICAgICAgX3JlZiRpbnRsUHJvcE5hbWUgPSBfcmVmLmludGxQcm9wTmFtZSxcbiAgICAgIGludGxQcm9wTmFtZSA9IF9yZWYkaW50bFByb3BOYW1lID09PSB2b2lkIDAgPyAnaW50bCcgOiBfcmVmJGludGxQcm9wTmFtZSxcbiAgICAgIF9yZWYkZm9yd2FyZFJlZiA9IF9yZWYuZm9yd2FyZFJlZixcbiAgICAgIGZvcndhcmRSZWYgPSBfcmVmJGZvcndhcmRSZWYgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZiRmb3J3YXJkUmVmLFxuICAgICAgX3JlZiRlbmZvcmNlQ29udGV4dCA9IF9yZWYuZW5mb3JjZUNvbnRleHQsXG4gICAgICBlbmZvcmNlQ29udGV4dCA9IF9yZWYkZW5mb3JjZUNvbnRleHQgPT09IHZvaWQgMCA/IHRydWUgOiBfcmVmJGVuZm9yY2VDb250ZXh0O1xuXG4gIHZhciBXaXRoSW50bCA9IGZ1bmN0aW9uIFdpdGhJbnRsKHByb3BzKSB7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoSW50bENvbnN1bWVyLCBudWxsLCBmdW5jdGlvbiAoaW50bCkge1xuICAgICAgaWYgKGVuZm9yY2VDb250ZXh0KSB7XG4gICAgICAgIGludmFyaWFudEludGxDb250ZXh0KGludGwpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChXcmFwcGVkQ29tcG9uZW50LCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywgX2RlZmluZVByb3BlcnR5KHt9LCBpbnRsUHJvcE5hbWUsIGludGwpLCB7XG4gICAgICAgIHJlZjogZm9yd2FyZFJlZiA/IHByb3BzLmZvcndhcmRlZFJlZiA6IG51bGxcbiAgICAgIH0pKTtcbiAgICB9KTtcbiAgfTtcblxuICBXaXRoSW50bC5kaXNwbGF5TmFtZSA9IFwiaW5qZWN0SW50bChcIi5jb25jYXQoZ2V0RGlzcGxheU5hbWUoV3JhcHBlZENvbXBvbmVudCksIFwiKVwiKTtcbiAgV2l0aEludGwuV3JhcHBlZENvbXBvbmVudCA9IFdyYXBwZWRDb21wb25lbnQ7XG5cbiAgaWYgKGZvcndhcmRSZWYpIHtcbiAgICByZXR1cm4gaG9pc3ROb25SZWFjdFN0YXRpY3MoUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikge1xuICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoV2l0aEludGwsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgIGZvcndhcmRlZFJlZjogcmVmXG4gICAgICB9KSk7XG4gICAgfSksIFdyYXBwZWRDb21wb25lbnQpO1xuICB9XG5cbiAgcmV0dXJuIGhvaXN0Tm9uUmVhY3RTdGF0aWNzKFdpdGhJbnRsLCBXcmFwcGVkQ29tcG9uZW50KTtcbn0iLCJ2YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuXG4gIGZvciAodmFyIHAgaW4gcykge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIH1cblxuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgaW52YXJpYW50SW50bENvbnRleHQgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSAnLi9pbmplY3RJbnRsJztcbnZhciBEaXNwbGF5TmFtZTtcblxuKGZ1bmN0aW9uIChEaXNwbGF5TmFtZSkge1xuICBEaXNwbGF5TmFtZVtcImZvcm1hdERhdGVcIl0gPSBcIkZvcm1hdHRlZERhdGVcIjtcbiAgRGlzcGxheU5hbWVbXCJmb3JtYXRUaW1lXCJdID0gXCJGb3JtYXR0ZWRUaW1lXCI7XG4gIERpc3BsYXlOYW1lW1wiZm9ybWF0TnVtYmVyXCJdID0gXCJGb3JtYXR0ZWROdW1iZXJcIjtcbiAgRGlzcGxheU5hbWVbXCJmb3JtYXRMaXN0XCJdID0gXCJGb3JtYXR0ZWRMaXN0XCI7IC8vIE5vdGUgdGhhdCB0aGlzIERpc3BsYXlOYW1lIGlzIHRoZSBsb2NhbGUgZGlzcGxheSBuYW1lLCBub3QgdG8gYmUgY29uZnVzZWQgd2l0aFxuICAvLyB0aGUgbmFtZSBvZiB0aGUgZW51bSwgd2hpY2ggaXMgZm9yIFJlYWN0IGNvbXBvbmVudCBkaXNwbGF5IG5hbWUgaW4gZGV2IHRvb2xzLlxuXG4gIERpc3BsYXlOYW1lW1wiZm9ybWF0RGlzcGxheU5hbWVcIl0gPSBcIkZvcm1hdHRlZERpc3BsYXlOYW1lXCI7XG59KShEaXNwbGF5TmFtZSB8fCAoRGlzcGxheU5hbWUgPSB7fSkpO1xuXG52YXIgRGlzcGxheU5hbWVQYXJ0cztcblxuKGZ1bmN0aW9uIChEaXNwbGF5TmFtZVBhcnRzKSB7XG4gIERpc3BsYXlOYW1lUGFydHNbXCJmb3JtYXREYXRlXCJdID0gXCJGb3JtYXR0ZWREYXRlUGFydHNcIjtcbiAgRGlzcGxheU5hbWVQYXJ0c1tcImZvcm1hdFRpbWVcIl0gPSBcIkZvcm1hdHRlZFRpbWVQYXJ0c1wiO1xuICBEaXNwbGF5TmFtZVBhcnRzW1wiZm9ybWF0TnVtYmVyXCJdID0gXCJGb3JtYXR0ZWROdW1iZXJQYXJ0c1wiO1xuICBEaXNwbGF5TmFtZVBhcnRzW1wiZm9ybWF0TGlzdFwiXSA9IFwiRm9ybWF0dGVkTGlzdFBhcnRzXCI7XG59KShEaXNwbGF5TmFtZVBhcnRzIHx8IChEaXNwbGF5TmFtZVBhcnRzID0ge30pKTtcblxuZXhwb3J0IHZhciBGb3JtYXR0ZWROdW1iZXJQYXJ0cyA9IGZ1bmN0aW9uIEZvcm1hdHRlZE51bWJlclBhcnRzKHByb3BzKSB7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KENvbnRleHQuQ29uc3VtZXIsIG51bGwsIGZ1bmN0aW9uIChpbnRsKSB7XG4gICAgaW52YXJpYW50SW50bENvbnRleHQoaW50bCk7XG5cbiAgICB2YXIgdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgICAgZm9ybWF0UHJvcHMgPSBfX3Jlc3QocHJvcHMsIFtcInZhbHVlXCIsIFwiY2hpbGRyZW5cIl0pO1xuXG4gICAgcmV0dXJuIGNoaWxkcmVuKGludGwuZm9ybWF0TnVtYmVyVG9QYXJ0cyh2YWx1ZSwgZm9ybWF0UHJvcHMpKTtcbiAgfSk7XG59O1xuRm9ybWF0dGVkTnVtYmVyUGFydHMuZGlzcGxheU5hbWUgPSAnRm9ybWF0dGVkTnVtYmVyUGFydHMnO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZvcm1hdHRlZERhdGVUaW1lUGFydHNDb21wb25lbnQobmFtZSkge1xuICB2YXIgQ29tcG9uZW50UGFydHMgPSBmdW5jdGlvbiBDb21wb25lbnRQYXJ0cyhwcm9wcykge1xuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KENvbnRleHQuQ29uc3VtZXIsIG51bGwsIGZ1bmN0aW9uIChpbnRsKSB7XG4gICAgICBpbnZhcmlhbnRJbnRsQ29udGV4dChpbnRsKTtcblxuICAgICAgdmFyIHZhbHVlID0gcHJvcHMudmFsdWUsXG4gICAgICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgICAgICBmb3JtYXRQcm9wcyA9IF9fcmVzdChwcm9wcywgW1widmFsdWVcIiwgXCJjaGlsZHJlblwiXSk7XG5cbiAgICAgIHZhciBkYXRlID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IG5ldyBEYXRlKHZhbHVlIHx8IDApIDogdmFsdWU7XG4gICAgICB2YXIgZm9ybWF0dGVkUGFydHMgPSBuYW1lID09PSAnZm9ybWF0RGF0ZScgPyBpbnRsLmZvcm1hdERhdGVUb1BhcnRzKGRhdGUsIGZvcm1hdFByb3BzKSA6IGludGwuZm9ybWF0VGltZVRvUGFydHMoZGF0ZSwgZm9ybWF0UHJvcHMpO1xuICAgICAgcmV0dXJuIGNoaWxkcmVuKGZvcm1hdHRlZFBhcnRzKTtcbiAgICB9KTtcbiAgfTtcblxuICBDb21wb25lbnRQYXJ0cy5kaXNwbGF5TmFtZSA9IERpc3BsYXlOYW1lUGFydHNbbmFtZV07XG4gIHJldHVybiBDb21wb25lbnRQYXJ0cztcbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGb3JtYXR0ZWRDb21wb25lbnQobmFtZSkge1xuICB2YXIgQ29tcG9uZW50ID0gZnVuY3Rpb24gQ29tcG9uZW50KHByb3BzKSB7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ29udGV4dC5Db25zdW1lciwgbnVsbCwgZnVuY3Rpb24gKGludGwpIHtcbiAgICAgIGludmFyaWFudEludGxDb250ZXh0KGludGwpO1xuXG4gICAgICB2YXIgdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICAgICAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgICAgIGZvcm1hdFByb3BzID0gX19yZXN0KHByb3BzLCBbXCJ2YWx1ZVwiLCBcImNoaWxkcmVuXCJdKTsgLy8gVE9ETzogZml4IFRTIHR5cGUgZGVmaW5pdGlvbiBmb3IgbG9jYWxlTWF0Y2hlciB1cHN0cmVhbVxuXG5cbiAgICAgIHZhciBmb3JtYXR0ZWRWYWx1ZSA9IGludGxbbmFtZV0odmFsdWUsIGZvcm1hdFByb3BzKTtcblxuICAgICAgaWYgKHR5cGVvZiBjaGlsZHJlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gY2hpbGRyZW4oZm9ybWF0dGVkVmFsdWUpO1xuICAgICAgfVxuXG4gICAgICB2YXIgVGV4dCA9IGludGwudGV4dENvbXBvbmVudCB8fCBSZWFjdC5GcmFnbWVudDtcbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFRleHQsIG51bGwsIGZvcm1hdHRlZFZhbHVlKTtcbiAgICB9KTtcbiAgfTtcblxuICBDb21wb25lbnQuZGlzcGxheU5hbWUgPSBEaXNwbGF5TmFtZVtuYW1lXTtcbiAgcmV0dXJuIENvbXBvbmVudDtcbn0iLCJpbXBvcnQgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gJy4vaW5qZWN0SW50bCc7XG5pbXBvcnQgeyBpbnZhcmlhbnRJbnRsQ29udGV4dCB9IGZyb20gJy4uL3V0aWxzJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUludGwoKSB7XG4gIHZhciBpbnRsID0gdXNlQ29udGV4dChDb250ZXh0KTtcbiAgaW52YXJpYW50SW50bENvbnRleHQoaW50bCk7XG4gIHJldHVybiBpbnRsO1xufSIsImltcG9ydCB7IGdldE5hbWVkRm9ybWF0LCBmaWx0ZXJQcm9wcywgY3JlYXRlRXJyb3IgfSBmcm9tICcuLi91dGlscyc7XG52YXIgTlVNQkVSX0ZPUk1BVF9PUFRJT05TID0gWydsb2NhbGVNYXRjaGVyJywgJ3N0eWxlJywgJ2N1cnJlbmN5JywgJ2N1cnJlbmN5RGlzcGxheScsICd1bml0JywgJ3VuaXREaXNwbGF5JywgJ3VzZUdyb3VwaW5nJywgJ21pbmltdW1JbnRlZ2VyRGlnaXRzJywgJ21pbmltdW1GcmFjdGlvbkRpZ2l0cycsICdtYXhpbXVtRnJhY3Rpb25EaWdpdHMnLCAnbWluaW11bVNpZ25pZmljYW50RGlnaXRzJywgJ21heGltdW1TaWduaWZpY2FudERpZ2l0cycsIC8vIFVuaWZpZWQgTnVtYmVyRm9ybWF0IChTdGFnZSAzIGFzIG9mIDEwLzIyLzE5KVxuJ2NvbXBhY3REaXNwbGF5JywgJ2N1cnJlbmN5RGlzcGxheScsICdjdXJyZW5jeVNpZ24nLCAnbm90YXRpb24nLCAnc2lnbkRpc3BsYXknLCAndW5pdCcsICd1bml0RGlzcGxheSddO1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZvcm1hdHRlcihfcmVmLCBnZXROdW1iZXJGb3JtYXQpIHtcbiAgdmFyIGxvY2FsZSA9IF9yZWYubG9jYWxlLFxuICAgICAgZm9ybWF0cyA9IF9yZWYuZm9ybWF0cyxcbiAgICAgIG9uRXJyb3IgPSBfcmVmLm9uRXJyb3I7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgdmFyIGZvcm1hdCA9IG9wdGlvbnMuZm9ybWF0O1xuICB2YXIgZGVmYXVsdHMgPSBmb3JtYXQgJiYgZ2V0TmFtZWRGb3JtYXQoZm9ybWF0cywgJ251bWJlcicsIGZvcm1hdCwgb25FcnJvcikgfHwge307XG4gIHZhciBmaWx0ZXJlZE9wdGlvbnMgPSBmaWx0ZXJQcm9wcyhvcHRpb25zLCBOVU1CRVJfRk9STUFUX09QVElPTlMsIGRlZmF1bHRzKTtcbiAgcmV0dXJuIGdldE51bWJlckZvcm1hdChsb2NhbGUsIGZpbHRlcmVkT3B0aW9ucyk7XG59XG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0TnVtYmVyKGNvbmZpZywgZ2V0TnVtYmVyRm9ybWF0LCB2YWx1ZSkge1xuICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDoge307XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZ2V0Rm9ybWF0dGVyKGNvbmZpZywgZ2V0TnVtYmVyRm9ybWF0LCBvcHRpb25zKS5mb3JtYXQodmFsdWUpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uZmlnLm9uRXJyb3IoY3JlYXRlRXJyb3IoJ0Vycm9yIGZvcm1hdHRpbmcgbnVtYmVyLicsIGUpKTtcbiAgfVxuXG4gIHJldHVybiBTdHJpbmcodmFsdWUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdE51bWJlclRvUGFydHMoY29uZmlnLCBnZXROdW1iZXJGb3JtYXQsIHZhbHVlKSB7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiB7fTtcblxuICB0cnkge1xuICAgIHJldHVybiBnZXRGb3JtYXR0ZXIoY29uZmlnLCBnZXROdW1iZXJGb3JtYXQsIG9wdGlvbnMpLmZvcm1hdFRvUGFydHModmFsdWUpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uZmlnLm9uRXJyb3IoY3JlYXRlRXJyb3IoJ0Vycm9yIGZvcm1hdHRpbmcgbnVtYmVyLicsIGUpKTtcbiAgfVxuXG4gIHJldHVybiBbXTtcbn0iLCJpbXBvcnQgeyBnZXROYW1lZEZvcm1hdCwgZmlsdGVyUHJvcHMsIGNyZWF0ZUVycm9yIH0gZnJvbSAnLi4vdXRpbHMnO1xudmFyIFJFTEFUSVZFX1RJTUVfRk9STUFUX09QVElPTlMgPSBbJ251bWVyaWMnLCAnc3R5bGUnXTtcblxuZnVuY3Rpb24gZ2V0Rm9ybWF0dGVyKF9yZWYsIGdldFJlbGF0aXZlVGltZUZvcm1hdCkge1xuICB2YXIgbG9jYWxlID0gX3JlZi5sb2NhbGUsXG4gICAgICBmb3JtYXRzID0gX3JlZi5mb3JtYXRzLFxuICAgICAgb25FcnJvciA9IF9yZWYub25FcnJvcjtcbiAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuICB2YXIgZm9ybWF0ID0gb3B0aW9ucy5mb3JtYXQ7XG4gIHZhciBkZWZhdWx0cyA9ICEhZm9ybWF0ICYmIGdldE5hbWVkRm9ybWF0KGZvcm1hdHMsICdyZWxhdGl2ZScsIGZvcm1hdCwgb25FcnJvcikgfHwge307XG4gIHZhciBmaWx0ZXJlZE9wdGlvbnMgPSBmaWx0ZXJQcm9wcyhvcHRpb25zLCBSRUxBVElWRV9USU1FX0ZPUk1BVF9PUFRJT05TLCBkZWZhdWx0cyk7XG4gIHJldHVybiBnZXRSZWxhdGl2ZVRpbWVGb3JtYXQobG9jYWxlLCBmaWx0ZXJlZE9wdGlvbnMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0UmVsYXRpdmVUaW1lKGNvbmZpZywgZ2V0UmVsYXRpdmVUaW1lRm9ybWF0LCB2YWx1ZSwgdW5pdCkge1xuICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDoge307XG5cbiAgaWYgKCF1bml0KSB7XG4gICAgdW5pdCA9ICdzZWNvbmQnO1xuICB9XG5cbiAgdmFyIFJlbGF0aXZlVGltZUZvcm1hdCA9IEludGwuUmVsYXRpdmVUaW1lRm9ybWF0O1xuXG4gIGlmICghUmVsYXRpdmVUaW1lRm9ybWF0KSB7XG4gICAgY29uZmlnLm9uRXJyb3IoY3JlYXRlRXJyb3IoXCJJbnRsLlJlbGF0aXZlVGltZUZvcm1hdCBpcyBub3QgYXZhaWxhYmxlIGluIHRoaXMgZW52aXJvbm1lbnQuXFxuVHJ5IHBvbHlmaWxsaW5nIGl0IHVzaW5nIFxcXCJAZm9ybWF0anMvaW50bC1yZWxhdGl2ZXRpbWVmb3JtYXRcXFwiXFxuXCIpKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGdldEZvcm1hdHRlcihjb25maWcsIGdldFJlbGF0aXZlVGltZUZvcm1hdCwgb3B0aW9ucykuZm9ybWF0KHZhbHVlLCB1bml0KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbmZpZy5vbkVycm9yKGNyZWF0ZUVycm9yKCdFcnJvciBmb3JtYXR0aW5nIHJlbGF0aXZlIHRpbWUuJywgZSkpO1xuICB9XG5cbiAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG59IiwiLypcbiAqIENvcHlyaWdodCAyMDE1LCBZYWhvbyBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIExpY2Vuc2UuXG4gKiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQgeyBjcmVhdGVFcnJvciwgZmlsdGVyUHJvcHMsIGdldE5hbWVkRm9ybWF0IH0gZnJvbSAnLi4vdXRpbHMnO1xudmFyIERBVEVfVElNRV9GT1JNQVRfT1BUSU9OUyA9IFsnbG9jYWxlTWF0Y2hlcicsICdmb3JtYXRNYXRjaGVyJywgJ3RpbWVab25lJywgJ2hvdXIxMicsICd3ZWVrZGF5JywgJ2VyYScsICd5ZWFyJywgJ21vbnRoJywgJ2RheScsICdob3VyJywgJ21pbnV0ZScsICdzZWNvbmQnLCAndGltZVpvbmVOYW1lJ107XG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVyKF9yZWYsIHR5cGUsIGdldERhdGVUaW1lRm9ybWF0KSB7XG4gIHZhciBsb2NhbGUgPSBfcmVmLmxvY2FsZSxcbiAgICAgIGZvcm1hdHMgPSBfcmVmLmZvcm1hdHMsXG4gICAgICBvbkVycm9yID0gX3JlZi5vbkVycm9yLFxuICAgICAgdGltZVpvbmUgPSBfcmVmLnRpbWVab25lO1xuICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDoge307XG4gIHZhciBmb3JtYXQgPSBvcHRpb25zLmZvcm1hdDtcbiAgdmFyIGRlZmF1bHRzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0aW1lWm9uZSAmJiB7XG4gICAgdGltZVpvbmU6IHRpbWVab25lXG4gIH0pLCBmb3JtYXQgJiYgZ2V0TmFtZWRGb3JtYXQoZm9ybWF0cywgdHlwZSwgZm9ybWF0LCBvbkVycm9yKSk7XG4gIHZhciBmaWx0ZXJlZE9wdGlvbnMgPSBmaWx0ZXJQcm9wcyhvcHRpb25zLCBEQVRFX1RJTUVfRk9STUFUX09QVElPTlMsIGRlZmF1bHRzKTtcblxuICBpZiAodHlwZSA9PT0gJ3RpbWUnICYmICFmaWx0ZXJlZE9wdGlvbnMuaG91ciAmJiAhZmlsdGVyZWRPcHRpb25zLm1pbnV0ZSAmJiAhZmlsdGVyZWRPcHRpb25zLnNlY29uZCkge1xuICAgIC8vIEFkZCBkZWZhdWx0IGZvcm1hdHRpbmcgb3B0aW9ucyBpZiBob3VyLCBtaW51dGUsIG9yIHNlY29uZCBpc24ndCBkZWZpbmVkLlxuICAgIGZpbHRlcmVkT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZmlsdGVyZWRPcHRpb25zKSwge1xuICAgICAgaG91cjogJ251bWVyaWMnLFxuICAgICAgbWludXRlOiAnbnVtZXJpYydcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBnZXREYXRlVGltZUZvcm1hdChsb2NhbGUsIGZpbHRlcmVkT3B0aW9ucyk7XG59XG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RGF0ZShjb25maWcsIGdldERhdGVUaW1lRm9ybWF0LCB2YWx1ZSkge1xuICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDoge307XG4gIHZhciBkYXRlID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IG5ldyBEYXRlKHZhbHVlIHx8IDApIDogdmFsdWU7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZ2V0Rm9ybWF0dGVyKGNvbmZpZywgJ2RhdGUnLCBnZXREYXRlVGltZUZvcm1hdCwgb3B0aW9ucykuZm9ybWF0KGRhdGUpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uZmlnLm9uRXJyb3IoY3JlYXRlRXJyb3IoJ0Vycm9yIGZvcm1hdHRpbmcgZGF0ZS4nLCBlKSk7XG4gIH1cblxuICByZXR1cm4gU3RyaW5nKGRhdGUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFRpbWUoY29uZmlnLCBnZXREYXRlVGltZUZvcm1hdCwgdmFsdWUpIHtcbiAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IHt9O1xuICB2YXIgZGF0ZSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyBuZXcgRGF0ZSh2YWx1ZSB8fCAwKSA6IHZhbHVlO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGdldEZvcm1hdHRlcihjb25maWcsICd0aW1lJywgZ2V0RGF0ZVRpbWVGb3JtYXQsIG9wdGlvbnMpLmZvcm1hdChkYXRlKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbmZpZy5vbkVycm9yKGNyZWF0ZUVycm9yKCdFcnJvciBmb3JtYXR0aW5nIHRpbWUuJywgZSkpO1xuICB9XG5cbiAgcmV0dXJuIFN0cmluZyhkYXRlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXREYXRlVG9QYXJ0cyhjb25maWcsIGdldERhdGVUaW1lRm9ybWF0LCB2YWx1ZSkge1xuICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDoge307XG4gIHZhciBkYXRlID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IG5ldyBEYXRlKHZhbHVlIHx8IDApIDogdmFsdWU7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZ2V0Rm9ybWF0dGVyKGNvbmZpZywgJ2RhdGUnLCBnZXREYXRlVGltZUZvcm1hdCwgb3B0aW9ucykuZm9ybWF0VG9QYXJ0cyhkYXRlKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbmZpZy5vbkVycm9yKGNyZWF0ZUVycm9yKCdFcnJvciBmb3JtYXR0aW5nIGRhdGUuJywgZSkpO1xuICB9XG5cbiAgcmV0dXJuIFtdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFRpbWVUb1BhcnRzKGNvbmZpZywgZ2V0RGF0ZVRpbWVGb3JtYXQsIHZhbHVlKSB7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiB7fTtcbiAgdmFyIGRhdGUgPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gbmV3IERhdGUodmFsdWUgfHwgMCkgOiB2YWx1ZTtcblxuICB0cnkge1xuICAgIHJldHVybiBnZXRGb3JtYXR0ZXIoY29uZmlnLCAndGltZScsIGdldERhdGVUaW1lRm9ybWF0LCBvcHRpb25zKS5mb3JtYXRUb1BhcnRzKGRhdGUpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uZmlnLm9uRXJyb3IoY3JlYXRlRXJyb3IoJ0Vycm9yIGZvcm1hdHRpbmcgdGltZS4nLCBlKSk7XG4gIH1cblxuICByZXR1cm4gW107XG59IiwiaW1wb3J0IHsgZmlsdGVyUHJvcHMsIGNyZWF0ZUVycm9yIH0gZnJvbSAnLi4vdXRpbHMnO1xudmFyIFBMVVJBTF9GT1JNQVRfT1BUSU9OUyA9IFsnbG9jYWxlTWF0Y2hlcicsICd0eXBlJ107XG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0UGx1cmFsKF9yZWYsIGdldFBsdXJhbFJ1bGVzLCB2YWx1ZSkge1xuICB2YXIgbG9jYWxlID0gX3JlZi5sb2NhbGUsXG4gICAgICBvbkVycm9yID0gX3JlZi5vbkVycm9yO1xuICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDoge307XG5cbiAgaWYgKCFJbnRsLlBsdXJhbFJ1bGVzKSB7XG4gICAgb25FcnJvcihjcmVhdGVFcnJvcihcIkludGwuUGx1cmFsUnVsZXMgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGlzIGVudmlyb25tZW50LlxcblRyeSBwb2x5ZmlsbGluZyBpdCB1c2luZyBcXFwiQGZvcm1hdGpzL2ludGwtcGx1cmFscnVsZXNcXFwiXFxuXCIpKTtcbiAgfVxuXG4gIHZhciBmaWx0ZXJlZE9wdGlvbnMgPSBmaWx0ZXJQcm9wcyhvcHRpb25zLCBQTFVSQUxfRk9STUFUX09QVElPTlMpO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGdldFBsdXJhbFJ1bGVzKGxvY2FsZSwgZmlsdGVyZWRPcHRpb25zKS5zZWxlY3QodmFsdWUpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgb25FcnJvcihjcmVhdGVFcnJvcignRXJyb3IgZm9ybWF0dGluZyBwbHVyYWwuJywgZSkpO1xuICB9XG5cbiAgcmV0dXJuICdvdGhlcic7XG59IiwiaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiL2hvbWUvcnVubmVyL3dvcmsvanVzdGljZTQwLXRvb2wvanVzdGljZTQwLXRvb2wvY2xpZW50L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuXG4vKlxuICogQ29weXJpZ2h0IDIwMTUsIFlhaG9vIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgTGljZW5zZS5cbiAqIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGludmFyaWFudCB9IGZyb20gJ0Bmb3JtYXRqcy9pbnRsLXV0aWxzJztcbmltcG9ydCB7IGNyZWF0ZUVycm9yLCBlc2NhcGUgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgSW50bE1lc3NhZ2VGb3JtYXQgZnJvbSAnaW50bC1tZXNzYWdlZm9ybWF0JztcblxuZnVuY3Rpb24gc2V0VGltZVpvbmVJbk9wdGlvbnMob3B0cywgdGltZVpvbmUpIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG9wdHMpLnJlZHVjZShmdW5jdGlvbiAoYWxsLCBrKSB7XG4gICAgYWxsW2tdID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICB0aW1lWm9uZTogdGltZVpvbmVcbiAgICB9LCBvcHRzW2tdKTtcbiAgICByZXR1cm4gYWxsO1xuICB9LCB7fSk7XG59XG5cbmZ1bmN0aW9uIGRlZXBNZXJnZU9wdGlvbnMob3B0czEsIG9wdHMyKSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRzMSksIG9wdHMyKSk7XG4gIHJldHVybiBrZXlzLnJlZHVjZShmdW5jdGlvbiAoYWxsLCBrKSB7XG4gICAgYWxsW2tdID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRzMVtrXSB8fCB7fSksIG9wdHMyW2tdIHx8IHt9KTtcbiAgICByZXR1cm4gYWxsO1xuICB9LCB7fSk7XG59XG5cbmZ1bmN0aW9uIGRlZXBNZXJnZUZvcm1hdHNBbmRTZXRUaW1lWm9uZShmMSwgdGltZVpvbmUpIHtcbiAgaWYgKCF0aW1lWm9uZSkge1xuICAgIHJldHVybiBmMTtcbiAgfVxuXG4gIHZhciBtZkZvcm1hdHMgPSBJbnRsTWVzc2FnZUZvcm1hdC5mb3JtYXRzO1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG1mRm9ybWF0cyksIGYxKSwge1xuICAgIGRhdGU6IGRlZXBNZXJnZU9wdGlvbnMoc2V0VGltZVpvbmVJbk9wdGlvbnMobWZGb3JtYXRzLmRhdGUsIHRpbWVab25lKSwgc2V0VGltZVpvbmVJbk9wdGlvbnMoZjEuZGF0ZSB8fCB7fSwgdGltZVpvbmUpKSxcbiAgICB0aW1lOiBkZWVwTWVyZ2VPcHRpb25zKHNldFRpbWVab25lSW5PcHRpb25zKG1mRm9ybWF0cy50aW1lLCB0aW1lWm9uZSksIHNldFRpbWVab25lSW5PcHRpb25zKGYxLnRpbWUgfHwge30sIHRpbWVab25lKSlcbiAgfSk7XG59XG5cbmV4cG9ydCB2YXIgcHJlcGFyZUludGxNZXNzYWdlRm9ybWF0SHRtbE91dHB1dCA9IGZ1bmN0aW9uIHByZXBhcmVJbnRsTWVzc2FnZUZvcm1hdEh0bWxPdXRwdXQoY2h1bmtzKSB7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50LmFwcGx5KFJlYWN0LCBbUmVhY3QuRnJhZ21lbnQsIG51bGxdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoY2h1bmtzKSkpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRNZXNzYWdlKF9yZWYsIHN0YXRlKSB7XG4gIHZhciBsb2NhbGUgPSBfcmVmLmxvY2FsZSxcbiAgICAgIGZvcm1hdHMgPSBfcmVmLmZvcm1hdHMsXG4gICAgICBtZXNzYWdlcyA9IF9yZWYubWVzc2FnZXMsXG4gICAgICBkZWZhdWx0TG9jYWxlID0gX3JlZi5kZWZhdWx0TG9jYWxlLFxuICAgICAgZGVmYXVsdEZvcm1hdHMgPSBfcmVmLmRlZmF1bHRGb3JtYXRzLFxuICAgICAgb25FcnJvciA9IF9yZWYub25FcnJvcixcbiAgICAgIHRpbWVab25lID0gX3JlZi50aW1lWm9uZTtcbiAgdmFyIG1lc3NhZ2VEZXNjcmlwdG9yID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7XG4gICAgaWQ6ICcnXG4gIH07XG4gIHZhciB2YWx1ZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IHt9O1xuICB2YXIgaWQgPSBtZXNzYWdlRGVzY3JpcHRvci5pZCxcbiAgICAgIGRlZmF1bHRNZXNzYWdlID0gbWVzc2FnZURlc2NyaXB0b3IuZGVmYXVsdE1lc3NhZ2U7IC8vIGBpZGAgaXMgYSByZXF1aXJlZCBmaWVsZCBvZiBhIE1lc3NhZ2UgRGVzY3JpcHRvci5cblxuICBpbnZhcmlhbnQoISFpZCwgJ1tSZWFjdCBJbnRsXSBBbiBgaWRgIG11c3QgYmUgcHJvdmlkZWQgdG8gZm9ybWF0IGEgbWVzc2FnZS4nKTtcbiAgdmFyIG1lc3NhZ2UgPSBtZXNzYWdlcyAmJiBtZXNzYWdlc1tTdHJpbmcoaWQpXTtcbiAgZm9ybWF0cyA9IGRlZXBNZXJnZUZvcm1hdHNBbmRTZXRUaW1lWm9uZShmb3JtYXRzLCB0aW1lWm9uZSk7XG4gIGRlZmF1bHRGb3JtYXRzID0gZGVlcE1lcmdlRm9ybWF0c0FuZFNldFRpbWVab25lKGRlZmF1bHRGb3JtYXRzLCB0aW1lWm9uZSk7XG4gIHZhciBmb3JtYXR0ZWRNZXNzYWdlUGFydHMgPSBbXTtcblxuICBpZiAobWVzc2FnZSkge1xuICAgIHRyeSB7XG4gICAgICB2YXIgZm9ybWF0dGVyID0gc3RhdGUuZ2V0TWVzc2FnZUZvcm1hdChtZXNzYWdlLCBsb2NhbGUsIGZvcm1hdHMsIHtcbiAgICAgICAgZm9ybWF0dGVyczogc3RhdGVcbiAgICAgIH0pO1xuICAgICAgZm9ybWF0dGVkTWVzc2FnZVBhcnRzID0gZm9ybWF0dGVyLmZvcm1hdEhUTUxNZXNzYWdlKHZhbHVlcyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgb25FcnJvcihjcmVhdGVFcnJvcihcIkVycm9yIGZvcm1hdHRpbmcgbWVzc2FnZTogXFxcIlwiLmNvbmNhdChpZCwgXCJcXFwiIGZvciBsb2NhbGU6IFxcXCJcIikuY29uY2F0KGxvY2FsZSwgXCJcXFwiXCIpICsgKGRlZmF1bHRNZXNzYWdlID8gJywgdXNpbmcgZGVmYXVsdCBtZXNzYWdlIGFzIGZhbGxiYWNrLicgOiAnJyksIGUpKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBwcmV2ZW50cyB3YXJuaW5ncyBmcm9tIGxpdHRlcmluZyB0aGUgY29uc29sZSBpbiBkZXZlbG9wbWVudFxuICAgIC8vIHdoZW4gbm8gYG1lc3NhZ2VzYCBhcmUgcGFzc2VkIGludG8gdGhlIDxJbnRsUHJvdmlkZXI+IGZvciB0aGVcbiAgICAvLyBkZWZhdWx0IGxvY2FsZSwgYW5kIGEgZGVmYXVsdCBtZXNzYWdlIGlzIGluIHRoZSBzb3VyY2UuXG4gICAgaWYgKCFkZWZhdWx0TWVzc2FnZSB8fCBsb2NhbGUgJiYgbG9jYWxlLnRvTG93ZXJDYXNlKCkgIT09IGRlZmF1bHRMb2NhbGUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgb25FcnJvcihjcmVhdGVFcnJvcihcIk1pc3NpbmcgbWVzc2FnZTogXFxcIlwiLmNvbmNhdChpZCwgXCJcXFwiIGZvciBsb2NhbGU6IFxcXCJcIikuY29uY2F0KGxvY2FsZSwgXCJcXFwiXCIpICsgKGRlZmF1bHRNZXNzYWdlID8gJywgdXNpbmcgZGVmYXVsdCBtZXNzYWdlIGFzIGZhbGxiYWNrLicgOiAnJykpKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWZvcm1hdHRlZE1lc3NhZ2VQYXJ0cy5sZW5ndGggJiYgZGVmYXVsdE1lc3NhZ2UpIHtcbiAgICB0cnkge1xuICAgICAgdmFyIF9mb3JtYXR0ZXIgPSBzdGF0ZS5nZXRNZXNzYWdlRm9ybWF0KGRlZmF1bHRNZXNzYWdlLCBkZWZhdWx0TG9jYWxlLCBkZWZhdWx0Rm9ybWF0cyk7XG5cbiAgICAgIGZvcm1hdHRlZE1lc3NhZ2VQYXJ0cyA9IF9mb3JtYXR0ZXIuZm9ybWF0SFRNTE1lc3NhZ2UodmFsdWVzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBvbkVycm9yKGNyZWF0ZUVycm9yKFwiRXJyb3IgZm9ybWF0dGluZyB0aGUgZGVmYXVsdCBtZXNzYWdlIGZvcjogXFxcIlwiLmNvbmNhdChpZCwgXCJcXFwiXCIpLCBlKSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFmb3JtYXR0ZWRNZXNzYWdlUGFydHMubGVuZ3RoKSB7XG4gICAgb25FcnJvcihjcmVhdGVFcnJvcihcIkNhbm5vdCBmb3JtYXQgbWVzc2FnZTogXFxcIlwiLmNvbmNhdChpZCwgXCJcXFwiLCBcIikgKyBcInVzaW5nIG1lc3NhZ2UgXCIuY29uY2F0KG1lc3NhZ2UgfHwgZGVmYXVsdE1lc3NhZ2UgPyAnc291cmNlJyA6ICdpZCcsIFwiIGFzIGZhbGxiYWNrLlwiKSkpO1xuXG4gICAgaWYgKHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIG1lc3NhZ2UgfHwgZGVmYXVsdE1lc3NhZ2UgfHwgU3RyaW5nKGlkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmYXVsdE1lc3NhZ2UgfHwgU3RyaW5nKGlkKTtcbiAgfVxuXG4gIGlmIChmb3JtYXR0ZWRNZXNzYWdlUGFydHMubGVuZ3RoID09PSAxICYmIHR5cGVvZiBmb3JtYXR0ZWRNZXNzYWdlUGFydHNbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZvcm1hdHRlZE1lc3NhZ2VQYXJ0c1swXSB8fCBkZWZhdWx0TWVzc2FnZSB8fCBTdHJpbmcoaWQpO1xuICB9XG5cbiAgcmV0dXJuIHByZXBhcmVJbnRsTWVzc2FnZUZvcm1hdEh0bWxPdXRwdXQoZm9ybWF0dGVkTWVzc2FnZVBhcnRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRIVE1MTWVzc2FnZShjb25maWcsIHN0YXRlKSB7XG4gIHZhciBtZXNzYWdlRGVzY3JpcHRvciA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge1xuICAgIGlkOiAnJ1xuICB9O1xuICB2YXIgcmF3VmFsdWVzID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiB7fTtcbiAgLy8gUHJvY2VzcyBhbGwgdGhlIHZhbHVlcyBiZWZvcmUgdGhleSBhcmUgdXNlZCB3aGVuIGZvcm1hdHRpbmcgdGhlIElDVVxuICAvLyBNZXNzYWdlIHN0cmluZy4gU2luY2UgdGhlIGZvcm1hdHRlZCBtZXNzYWdlIG1pZ2h0IGJlIGluamVjdGVkIHZpYVxuICAvLyBgaW5uZXJIVE1MYCwgYWxsIFN0cmluZy1iYXNlZCB2YWx1ZXMgbmVlZCB0byBiZSBIVE1MLWVzY2FwZWQuXG4gIHZhciBlc2NhcGVkVmFsdWVzID0gT2JqZWN0LmtleXMocmF3VmFsdWVzKS5yZWR1Y2UoZnVuY3Rpb24gKGVzY2FwZWQsIG5hbWUpIHtcbiAgICB2YXIgdmFsdWUgPSByYXdWYWx1ZXNbbmFtZV07XG4gICAgZXNjYXBlZFtuYW1lXSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyBlc2NhcGUodmFsdWUpIDogdmFsdWU7XG4gICAgcmV0dXJuIGVzY2FwZWQ7XG4gIH0sIHt9KTtcbiAgcmV0dXJuIGZvcm1hdE1lc3NhZ2UoY29uZmlnLCBzdGF0ZSwgbWVzc2FnZURlc2NyaXB0b3IsIGVzY2FwZWRWYWx1ZXMpO1xufSIsImltcG9ydCB7IGZpbHRlclByb3BzLCBjcmVhdGVFcnJvciB9IGZyb20gJy4uL3V0aWxzJztcbnZhciBMSVNUX0ZPUk1BVF9PUFRJT05TID0gWydsb2NhbGVNYXRjaGVyJywgJ3R5cGUnLCAnc3R5bGUnXTtcbnZhciBub3cgPSBEYXRlLm5vdygpO1xuXG5mdW5jdGlvbiBnZW5lcmF0ZVRva2VuKGkpIHtcbiAgcmV0dXJuIFwiXCIuY29uY2F0KG5vdywgXCJfXCIpLmNvbmNhdChpLCBcIl9cIikuY29uY2F0KG5vdyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRMaXN0KF9yZWYsIGdldExpc3RGb3JtYXQsIHZhbHVlcykge1xuICB2YXIgbG9jYWxlID0gX3JlZi5sb2NhbGUsXG4gICAgICBvbkVycm9yID0gX3JlZi5vbkVycm9yO1xuICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDoge307XG4gIHZhciBMaXN0Rm9ybWF0ID0gSW50bC5MaXN0Rm9ybWF0O1xuXG4gIGlmICghTGlzdEZvcm1hdCkge1xuICAgIG9uRXJyb3IoY3JlYXRlRXJyb3IoXCJJbnRsLkxpc3RGb3JtYXQgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGlzIGVudmlyb25tZW50LlxcblRyeSBwb2x5ZmlsbGluZyBpdCB1c2luZyBcXFwiQGZvcm1hdGpzL2ludGwtbGlzdGZvcm1hdFxcXCJcXG5cIikpO1xuICB9XG5cbiAgdmFyIGZpbHRlcmVkT3B0aW9ucyA9IGZpbHRlclByb3BzKG9wdGlvbnMsIExJU1RfRk9STUFUX09QVElPTlMpO1xuXG4gIHRyeSB7XG4gICAgdmFyIHJpY2hWYWx1ZXMgPSB7fTtcbiAgICB2YXIgc2VyaWFsaXplZFZhbHVlcyA9IHZhbHVlcy5tYXAoZnVuY3Rpb24gKHYsIGkpIHtcbiAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgdmFyIGlkID0gZ2VuZXJhdGVUb2tlbihpKTtcbiAgICAgICAgcmljaFZhbHVlc1tpZF0gPSB2O1xuICAgICAgICByZXR1cm4gaWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBTdHJpbmcodik7XG4gICAgfSk7XG5cbiAgICBpZiAoIU9iamVjdC5rZXlzKHJpY2hWYWx1ZXMpLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGdldExpc3RGb3JtYXQobG9jYWxlLCBmaWx0ZXJlZE9wdGlvbnMpLmZvcm1hdChzZXJpYWxpemVkVmFsdWVzKTtcbiAgICB9XG5cbiAgICB2YXIgcGFydHMgPSBnZXRMaXN0Rm9ybWF0KGxvY2FsZSwgZmlsdGVyZWRPcHRpb25zKS5mb3JtYXRUb1BhcnRzKHNlcmlhbGl6ZWRWYWx1ZXMpO1xuICAgIHJldHVybiBwYXJ0cy5yZWR1Y2UoZnVuY3Rpb24gKGFsbCwgZWwpIHtcbiAgICAgIHZhciB2YWwgPSBlbC52YWx1ZTtcblxuICAgICAgaWYgKHJpY2hWYWx1ZXNbdmFsXSkge1xuICAgICAgICBhbGwucHVzaChyaWNoVmFsdWVzW3ZhbF0pO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgYWxsW2FsbC5sZW5ndGggLSAxXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgYWxsW2FsbC5sZW5ndGggLSAxXSArPSB2YWw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhbGwucHVzaCh2YWwpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWxsO1xuICAgIH0sIFtdKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIG9uRXJyb3IoY3JlYXRlRXJyb3IoJ0Vycm9yIGZvcm1hdHRpbmcgbGlzdC4nLCBlKSk7XG4gIH1cblxuICByZXR1cm4gdmFsdWVzO1xufSIsImltcG9ydCB7IGZpbHRlclByb3BzLCBjcmVhdGVFcnJvciB9IGZyb20gJy4uL3V0aWxzJztcbnZhciBESVNQTEFZX05BTUVTX09QVE9OUyA9IFsnbG9jYWxlTWF0Y2hlcicsICdzdHlsZScsICd0eXBlJywgJ2ZhbGxiYWNrJ107XG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RGlzcGxheU5hbWUoX3JlZiwgZ2V0RGlzcGxheU5hbWVzLCB2YWx1ZSkge1xuICB2YXIgbG9jYWxlID0gX3JlZi5sb2NhbGUsXG4gICAgICBvbkVycm9yID0gX3JlZi5vbkVycm9yO1xuICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDoge307XG4gIHZhciBEaXNwbGF5TmFtZXMgPSBJbnRsLkRpc3BsYXlOYW1lcztcblxuICBpZiAoIURpc3BsYXlOYW1lcykge1xuICAgIG9uRXJyb3IoY3JlYXRlRXJyb3IoXCJJbnRsLkRpc3BsYXlOYW1lcyBpcyBub3QgYXZhaWxhYmxlIGluIHRoaXMgZW52aXJvbm1lbnQuXFxuVHJ5IHBvbHlmaWxsaW5nIGl0IHVzaW5nIFxcXCJAZm9ybWF0anMvaW50bC1kaXNwbGF5bmFtZXNcXFwiXFxuXCIpKTtcbiAgfVxuXG4gIHZhciBmaWx0ZXJlZE9wdGlvbnMgPSBmaWx0ZXJQcm9wcyhvcHRpb25zLCBESVNQTEFZX05BTUVTX09QVE9OUyk7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZ2V0RGlzcGxheU5hbWVzKGxvY2FsZSwgZmlsdGVyZWRPcHRpb25zKS5vZih2YWx1ZSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBvbkVycm9yKGNyZWF0ZUVycm9yKCdFcnJvciBmb3JtYXR0aW5nIGRpc3BsYXkgbmFtZS4nLCBlKSk7XG4gIH1cbn0iLCJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCIvaG9tZS9ydW5uZXIvd29yay9qdXN0aWNlNDAtdG9vbC9qdXN0aWNlNDAtdG9vbC9jbGllbnQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCIvaG9tZS9ydW5uZXIvd29yay9qdXN0aWNlNDAtdG9vbC9qdXN0aWNlNDAtdG9vbC9jbGllbnQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gXCIvaG9tZS9ydW5uZXIvd29yay9qdXN0aWNlNDAtdG9vbC9qdXN0aWNlNDAtdG9vbC9jbGllbnQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzXCI7XG5pbXBvcnQgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4gZnJvbSBcIi9ob21lL3J1bm5lci93b3JrL2p1c3RpY2U0MC10b29sL2p1c3RpY2U0MC10b29sL2NsaWVudC9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vcG9zc2libGVDb25zdHJ1Y3RvclJldHVyblwiO1xuaW1wb3J0IF9nZXRQcm90b3R5cGVPZiBmcm9tIFwiL2hvbWUvcnVubmVyL3dvcmsvanVzdGljZTQwLXRvb2wvanVzdGljZTQwLXRvb2wvY2xpZW50L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9nZXRQcm90b3R5cGVPZlwiO1xuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuLypcbiAqIENvcHlyaWdodCAyMDE1LCBZYWhvbyBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIExpY2Vuc2UuXG4gKiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBQcm92aWRlciB9IGZyb20gJy4vaW5qZWN0SW50bCc7XG5pbXBvcnQgeyBjcmVhdGVFcnJvciwgREVGQVVMVF9JTlRMX0NPTkZJRywgY3JlYXRlRm9ybWF0dGVycywgaW52YXJpYW50SW50bENvbnRleHQsIGNyZWF0ZUludGxDYWNoZSB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IGZvcm1hdE51bWJlciwgZm9ybWF0TnVtYmVyVG9QYXJ0cyB9IGZyb20gJy4uL2Zvcm1hdHRlcnMvbnVtYmVyJztcbmltcG9ydCB7IGZvcm1hdFJlbGF0aXZlVGltZSB9IGZyb20gJy4uL2Zvcm1hdHRlcnMvcmVsYXRpdmVUaW1lJztcbmltcG9ydCB7IGZvcm1hdERhdGUsIGZvcm1hdFRpbWUsIGZvcm1hdERhdGVUb1BhcnRzLCBmb3JtYXRUaW1lVG9QYXJ0cyB9IGZyb20gJy4uL2Zvcm1hdHRlcnMvZGF0ZVRpbWUnO1xuaW1wb3J0IHsgZm9ybWF0UGx1cmFsIH0gZnJvbSAnLi4vZm9ybWF0dGVycy9wbHVyYWwnO1xuaW1wb3J0IHsgZm9ybWF0TWVzc2FnZSwgZm9ybWF0SFRNTE1lc3NhZ2UgfSBmcm9tICcuLi9mb3JtYXR0ZXJzL21lc3NhZ2UnO1xuaW1wb3J0ICogYXMgc2hhbGxvd0VxdWFsc18gZnJvbSAnc2hhbGxvdy1lcXVhbC9vYmplY3RzJztcbmltcG9ydCB7IGZvcm1hdExpc3QgfSBmcm9tICcuLi9mb3JtYXR0ZXJzL2xpc3QnO1xuaW1wb3J0IHsgZm9ybWF0RGlzcGxheU5hbWUgfSBmcm9tICcuLi9mb3JtYXR0ZXJzL2Rpc3BsYXlOYW1lJztcbnZhciBzaGFsbG93RXF1YWxzID0gc2hhbGxvd0VxdWFsc18uZGVmYXVsdCB8fCBzaGFsbG93RXF1YWxzXztcblxuZnVuY3Rpb24gcHJvY2Vzc0ludGxDb25maWcoY29uZmlnKSB7XG4gIHJldHVybiB7XG4gICAgbG9jYWxlOiBjb25maWcubG9jYWxlLFxuICAgIHRpbWVab25lOiBjb25maWcudGltZVpvbmUsXG4gICAgZm9ybWF0czogY29uZmlnLmZvcm1hdHMsXG4gICAgdGV4dENvbXBvbmVudDogY29uZmlnLnRleHRDb21wb25lbnQsXG4gICAgbWVzc2FnZXM6IGNvbmZpZy5tZXNzYWdlcyxcbiAgICBkZWZhdWx0TG9jYWxlOiBjb25maWcuZGVmYXVsdExvY2FsZSxcbiAgICBkZWZhdWx0Rm9ybWF0czogY29uZmlnLmRlZmF1bHRGb3JtYXRzLFxuICAgIG9uRXJyb3I6IGNvbmZpZy5vbkVycm9yXG4gIH07XG59XG4vKipcbiAqIENyZWF0ZSBpbnRsIG9iamVjdFxuICogQHBhcmFtIGNvbmZpZyBpbnRsIGNvbmZpZ1xuICogQHBhcmFtIGNhY2hlIGNhY2hlIGZvciBmb3JtYXR0ZXIgaW5zdGFuY2VzIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtcbiAqL1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJbnRsKGNvbmZpZywgY2FjaGUpIHtcbiAgdmFyIGZvcm1hdHRlcnMgPSBjcmVhdGVGb3JtYXR0ZXJzKGNhY2hlKTtcbiAgdmFyIHJlc29sdmVkQ29uZmlnID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX0lOVExfQ09ORklHKSwgY29uZmlnKTtcbiAgdmFyIGxvY2FsZSA9IHJlc29sdmVkQ29uZmlnLmxvY2FsZSxcbiAgICAgIGRlZmF1bHRMb2NhbGUgPSByZXNvbHZlZENvbmZpZy5kZWZhdWx0TG9jYWxlLFxuICAgICAgb25FcnJvciA9IHJlc29sdmVkQ29uZmlnLm9uRXJyb3I7XG5cbiAgaWYgKCFsb2NhbGUpIHtcbiAgICBpZiAob25FcnJvcikge1xuICAgICAgb25FcnJvcihjcmVhdGVFcnJvcihcIlxcXCJsb2NhbGVcXFwiIHdhcyBub3QgY29uZmlndXJlZCwgdXNpbmcgXFxcIlwiLmNvbmNhdChkZWZhdWx0TG9jYWxlLCBcIlxcXCIgYXMgZmFsbGJhY2suIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZm9ybWF0anMvcmVhY3QtaW50bC9ibG9iL21hc3Rlci9kb2NzL0FQSS5tZCNpbnRsc2hhcGUgZm9yIG1vcmUgZGV0YWlsc1wiKSkpO1xuICAgIH0gLy8gU2luY2UgdGhlcmUncyBubyByZWdpc3RlcmVkIGxvY2FsZSBkYXRhIGZvciBgbG9jYWxlYCwgdGhpcyB3aWxsXG4gICAgLy8gZmFsbGJhY2sgdG8gdGhlIGBkZWZhdWx0TG9jYWxlYCB0byBtYWtlIHN1cmUgdGhpbmdzIGNhbiByZW5kZXIuXG4gICAgLy8gVGhlIGBtZXNzYWdlc2AgYXJlIG92ZXJyaWRkZW4gdG8gdGhlIGBkZWZhdWx0UHJvcHNgIGVtcHR5IG9iamVjdFxuICAgIC8vIHRvIG1haW50YWluIHJlZmVyZW50aWFsIGVxdWFsaXR5IGFjcm9zcyByZS1yZW5kZXJzLiBJdCdzIGFzc3VtZWRcbiAgICAvLyBlYWNoIDxGb3JtYXR0ZWRNZXNzYWdlPiBjb250YWlucyBhIGBkZWZhdWx0TWVzc2FnZWAgcHJvcC5cblxuXG4gICAgcmVzb2x2ZWRDb25maWcubG9jYWxlID0gcmVzb2x2ZWRDb25maWcuZGVmYXVsdExvY2FsZSB8fCAnZW4nO1xuICB9IGVsc2UgaWYgKCFJbnRsLk51bWJlckZvcm1hdC5zdXBwb3J0ZWRMb2NhbGVzT2YobG9jYWxlKS5sZW5ndGggJiYgb25FcnJvcikge1xuICAgIG9uRXJyb3IoY3JlYXRlRXJyb3IoXCJNaXNzaW5nIGxvY2FsZSBkYXRhIGZvciBsb2NhbGU6IFxcXCJcIi5jb25jYXQobG9jYWxlLCBcIlxcXCIgaW4gSW50bC5OdW1iZXJGb3JtYXQuIFVzaW5nIGRlZmF1bHQgbG9jYWxlOiBcXFwiXCIpLmNvbmNhdChkZWZhdWx0TG9jYWxlLCBcIlxcXCIgYXMgZmFsbGJhY2suIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZm9ybWF0anMvcmVhY3QtaW50bC9ibG9iL21hc3Rlci9kb2NzL0dldHRpbmctU3RhcnRlZC5tZCNydW50aW1lLXJlcXVpcmVtZW50cyBmb3IgbW9yZSBkZXRhaWxzXCIpKSk7XG4gIH0gZWxzZSBpZiAoIUludGwuRGF0ZVRpbWVGb3JtYXQuc3VwcG9ydGVkTG9jYWxlc09mKGxvY2FsZSkubGVuZ3RoICYmIG9uRXJyb3IpIHtcbiAgICBvbkVycm9yKGNyZWF0ZUVycm9yKFwiTWlzc2luZyBsb2NhbGUgZGF0YSBmb3IgbG9jYWxlOiBcXFwiXCIuY29uY2F0KGxvY2FsZSwgXCJcXFwiIGluIEludGwuRGF0ZVRpbWVGb3JtYXQuIFVzaW5nIGRlZmF1bHQgbG9jYWxlOiBcXFwiXCIpLmNvbmNhdChkZWZhdWx0TG9jYWxlLCBcIlxcXCIgYXMgZmFsbGJhY2suIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZm9ybWF0anMvcmVhY3QtaW50bC9ibG9iL21hc3Rlci9kb2NzL0dldHRpbmctU3RhcnRlZC5tZCNydW50aW1lLXJlcXVpcmVtZW50cyBmb3IgbW9yZSBkZXRhaWxzXCIpKSk7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXNvbHZlZENvbmZpZyksIHtcbiAgICBmb3JtYXR0ZXJzOiBmb3JtYXR0ZXJzLFxuICAgIGZvcm1hdE51bWJlcjogZm9ybWF0TnVtYmVyLmJpbmQobnVsbCwgcmVzb2x2ZWRDb25maWcsIGZvcm1hdHRlcnMuZ2V0TnVtYmVyRm9ybWF0KSxcbiAgICBmb3JtYXROdW1iZXJUb1BhcnRzOiBmb3JtYXROdW1iZXJUb1BhcnRzLmJpbmQobnVsbCwgcmVzb2x2ZWRDb25maWcsIGZvcm1hdHRlcnMuZ2V0TnVtYmVyRm9ybWF0KSxcbiAgICBmb3JtYXRSZWxhdGl2ZVRpbWU6IGZvcm1hdFJlbGF0aXZlVGltZS5iaW5kKG51bGwsIHJlc29sdmVkQ29uZmlnLCBmb3JtYXR0ZXJzLmdldFJlbGF0aXZlVGltZUZvcm1hdCksXG4gICAgZm9ybWF0RGF0ZTogZm9ybWF0RGF0ZS5iaW5kKG51bGwsIHJlc29sdmVkQ29uZmlnLCBmb3JtYXR0ZXJzLmdldERhdGVUaW1lRm9ybWF0KSxcbiAgICBmb3JtYXREYXRlVG9QYXJ0czogZm9ybWF0RGF0ZVRvUGFydHMuYmluZChudWxsLCByZXNvbHZlZENvbmZpZywgZm9ybWF0dGVycy5nZXREYXRlVGltZUZvcm1hdCksXG4gICAgZm9ybWF0VGltZTogZm9ybWF0VGltZS5iaW5kKG51bGwsIHJlc29sdmVkQ29uZmlnLCBmb3JtYXR0ZXJzLmdldERhdGVUaW1lRm9ybWF0KSxcbiAgICBmb3JtYXRUaW1lVG9QYXJ0czogZm9ybWF0VGltZVRvUGFydHMuYmluZChudWxsLCByZXNvbHZlZENvbmZpZywgZm9ybWF0dGVycy5nZXREYXRlVGltZUZvcm1hdCksXG4gICAgZm9ybWF0UGx1cmFsOiBmb3JtYXRQbHVyYWwuYmluZChudWxsLCByZXNvbHZlZENvbmZpZywgZm9ybWF0dGVycy5nZXRQbHVyYWxSdWxlcyksXG4gICAgZm9ybWF0TWVzc2FnZTogZm9ybWF0TWVzc2FnZS5iaW5kKG51bGwsIHJlc29sdmVkQ29uZmlnLCBmb3JtYXR0ZXJzKSxcbiAgICBmb3JtYXRIVE1MTWVzc2FnZTogZm9ybWF0SFRNTE1lc3NhZ2UuYmluZChudWxsLCByZXNvbHZlZENvbmZpZywgZm9ybWF0dGVycyksXG4gICAgZm9ybWF0TGlzdDogZm9ybWF0TGlzdC5iaW5kKG51bGwsIHJlc29sdmVkQ29uZmlnLCBmb3JtYXR0ZXJzLmdldExpc3RGb3JtYXQpLFxuICAgIGZvcm1hdERpc3BsYXlOYW1lOiBmb3JtYXREaXNwbGF5TmFtZS5iaW5kKG51bGwsIHJlc29sdmVkQ29uZmlnLCBmb3JtYXR0ZXJzLmdldERpc3BsYXlOYW1lcylcbiAgfSk7XG59XG5cbnZhciBJbnRsUHJvdmlkZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRQdXJlQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhJbnRsUHJvdmlkZXIsIF9SZWFjdCRQdXJlQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKEludGxQcm92aWRlcik7XG5cbiAgZnVuY3Rpb24gSW50bFByb3ZpZGVyKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBJbnRsUHJvdmlkZXIpO1xuXG4gICAgX3RoaXMgPSBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBfdGhpcy5jYWNoZSA9IGNyZWF0ZUludGxDYWNoZSgpO1xuICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgY2FjaGU6IF90aGlzLmNhY2hlLFxuICAgICAgaW50bDogY3JlYXRlSW50bChwcm9jZXNzSW50bENvbmZpZyhfdGhpcy5wcm9wcyksIF90aGlzLmNhY2hlKSxcbiAgICAgIHByZXZDb25maWc6IHByb2Nlc3NJbnRsQ29uZmlnKF90aGlzLnByb3BzKVxuICAgIH07XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEludGxQcm92aWRlciwgW3tcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIGludmFyaWFudEludGxDb250ZXh0KHRoaXMuc3RhdGUuaW50bCk7XG4gICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChQcm92aWRlciwge1xuICAgICAgICB2YWx1ZTogdGhpcy5zdGF0ZS5pbnRsXG4gICAgICB9LCB0aGlzLnByb3BzLmNoaWxkcmVuKTtcbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogXCJnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKHByb3BzLCBfcmVmKSB7XG4gICAgICB2YXIgcHJldkNvbmZpZyA9IF9yZWYucHJldkNvbmZpZyxcbiAgICAgICAgICBjYWNoZSA9IF9yZWYuY2FjaGU7XG4gICAgICB2YXIgY29uZmlnID0gcHJvY2Vzc0ludGxDb25maWcocHJvcHMpO1xuXG4gICAgICBpZiAoIXNoYWxsb3dFcXVhbHMocHJldkNvbmZpZywgY29uZmlnKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGludGw6IGNyZWF0ZUludGwoY29uZmlnLCBjYWNoZSksXG4gICAgICAgICAgcHJldkNvbmZpZzogY29uZmlnXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBJbnRsUHJvdmlkZXI7XG59KFJlYWN0LlB1cmVDb21wb25lbnQpO1xuXG5leHBvcnQgeyBJbnRsUHJvdmlkZXIgYXMgZGVmYXVsdCB9O1xuSW50bFByb3ZpZGVyLmRpc3BsYXlOYW1lID0gJ0ludGxQcm92aWRlcic7XG5JbnRsUHJvdmlkZXIuZGVmYXVsdFByb3BzID0gREVGQVVMVF9JTlRMX0NPTkZJRzsiLCJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCIvaG9tZS9ydW5uZXIvd29yay9qdXN0aWNlNDAtdG9vbC9qdXN0aWNlNDAtdG9vbC9jbGllbnQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCIvaG9tZS9ydW5uZXIvd29yay9qdXN0aWNlNDAtdG9vbC9qdXN0aWNlNDAtdG9vbC9jbGllbnQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gXCIvaG9tZS9ydW5uZXIvd29yay9qdXN0aWNlNDAtdG9vbC9qdXN0aWNlNDAtdG9vbC9jbGllbnQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzXCI7XG5pbXBvcnQgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4gZnJvbSBcIi9ob21lL3J1bm5lci93b3JrL2p1c3RpY2U0MC10b29sL2p1c3RpY2U0MC10b29sL2NsaWVudC9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vcG9zc2libGVDb25zdHJ1Y3RvclJldHVyblwiO1xuaW1wb3J0IF9nZXRQcm90b3R5cGVPZiBmcm9tIFwiL2hvbWUvcnVubmVyL3dvcmsvanVzdGljZTQwLXRvb2wvanVzdGljZTQwLXRvb2wvY2xpZW50L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9nZXRQcm90b3R5cGVPZlwiO1xuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuLypcbiAqIENvcHlyaWdodCAyMDE1LCBZYWhvbyBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIExpY2Vuc2UuXG4gKiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSAnLi9pbmplY3RJbnRsJztcbmltcG9ydCB7IGludmFyaWFudEludGxDb250ZXh0IH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgaW52YXJpYW50IH0gZnJvbSAnQGZvcm1hdGpzL2ludGwtdXRpbHMnO1xudmFyIE1JTlVURSA9IDYwO1xudmFyIEhPVVIgPSA2MCAqIDYwO1xudmFyIERBWSA9IDYwICogNjAgKiAyNDtcblxuZnVuY3Rpb24gc2VsZWN0VW5pdChzZWNvbmRzKSB7XG4gIHZhciBhYnNWYWx1ZSA9IE1hdGguYWJzKHNlY29uZHMpO1xuXG4gIGlmIChhYnNWYWx1ZSA8IE1JTlVURSkge1xuICAgIHJldHVybiAnc2Vjb25kJztcbiAgfVxuXG4gIGlmIChhYnNWYWx1ZSA8IEhPVVIpIHtcbiAgICByZXR1cm4gJ21pbnV0ZSc7XG4gIH1cblxuICBpZiAoYWJzVmFsdWUgPCBEQVkpIHtcbiAgICByZXR1cm4gJ2hvdXInO1xuICB9XG5cbiAgcmV0dXJuICdkYXknO1xufVxuXG5mdW5jdGlvbiBnZXREdXJhdGlvbkluU2Vjb25kcyh1bml0KSB7XG4gIHN3aXRjaCAodW5pdCkge1xuICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICByZXR1cm4gMTtcblxuICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgICByZXR1cm4gTUlOVVRFO1xuXG4gICAgY2FzZSAnaG91cic6XG4gICAgICByZXR1cm4gSE9VUjtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gREFZO1xuICB9XG59XG5cbmZ1bmN0aW9uIHZhbHVlVG9TZWNvbmRzKHZhbHVlLCB1bml0KSB7XG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHN3aXRjaCAodW5pdCkge1xuICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICByZXR1cm4gdmFsdWU7XG5cbiAgICBjYXNlICdtaW51dGUnOlxuICAgICAgcmV0dXJuIHZhbHVlICogTUlOVVRFO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB2YWx1ZSAqIEhPVVI7XG4gIH1cbn1cblxudmFyIElOQ1JFTUVOVEFCTEVfVU5JVFMgPSBbJ3NlY29uZCcsICdtaW51dGUnLCAnaG91ciddO1xuXG5mdW5jdGlvbiBjYW5JbmNyZW1lbnQoKSB7XG4gIHZhciB1bml0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnc2Vjb25kJztcbiAgcmV0dXJuIElOQ1JFTUVOVEFCTEVfVU5JVFMuaW5jbHVkZXModW5pdCk7XG59XG5cbmV4cG9ydCB2YXIgRm9ybWF0dGVkUmVsYXRpdmVUaW1lID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkUHVyZUNvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoRm9ybWF0dGVkUmVsYXRpdmVUaW1lLCBfUmVhY3QkUHVyZUNvbXBvbmVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihGb3JtYXR0ZWRSZWxhdGl2ZVRpbWUpO1xuXG4gIGZ1bmN0aW9uIEZvcm1hdHRlZFJlbGF0aXZlVGltZShwcm9wcykge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBGb3JtYXR0ZWRSZWxhdGl2ZVRpbWUpO1xuXG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwcm9wcyk7IC8vIFB1YmxpYyBmb3IgdGVzdGluZ1xuXG4gICAgX3RoaXMuX3VwZGF0ZVRpbWVyID0gbnVsbDtcbiAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIHByZXZVbml0OiBfdGhpcy5wcm9wcy51bml0LFxuICAgICAgcHJldlZhbHVlOiBfdGhpcy5wcm9wcy52YWx1ZSxcbiAgICAgIGN1cnJlbnRWYWx1ZUluU2Vjb25kczogY2FuSW5jcmVtZW50KF90aGlzLnByb3BzLnVuaXQpID8gdmFsdWVUb1NlY29uZHMoX3RoaXMucHJvcHMudmFsdWUsIF90aGlzLnByb3BzLnVuaXQpIDogMFxuICAgIH07XG4gICAgaW52YXJpYW50KCFwcm9wcy51cGRhdGVJbnRlcnZhbEluU2Vjb25kcyB8fCAhIShwcm9wcy51cGRhdGVJbnRlcnZhbEluU2Vjb25kcyAmJiBjYW5JbmNyZW1lbnQocHJvcHMudW5pdCkpLCAnQ2Fubm90IHNjaGVkdWxlIHVwZGF0ZSB3aXRoIHVuaXQgbG9uZ2VyIHRoYW4gaG91cicpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhGb3JtYXR0ZWRSZWxhdGl2ZVRpbWUsIFt7XG4gICAga2V5OiBcInNjaGVkdWxlTmV4dFVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzY2hlZHVsZU5leHRVcGRhdGUoX3JlZiwgX3JlZjIpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgdXBkYXRlSW50ZXJ2YWxJblNlY29uZHMgPSBfcmVmLnVwZGF0ZUludGVydmFsSW5TZWNvbmRzLFxuICAgICAgICAgIHVuaXQgPSBfcmVmLnVuaXQ7XG4gICAgICB2YXIgY3VycmVudFZhbHVlSW5TZWNvbmRzID0gX3JlZjIuY3VycmVudFZhbHVlSW5TZWNvbmRzO1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3VwZGF0ZVRpbWVyKTtcbiAgICAgIHRoaXMuX3VwZGF0ZVRpbWVyID0gbnVsbDsgLy8gSWYgdGhlcmUncyBubyBpbnRlcnZhbCBhbmQgd2UgY2Fubm90IGluY3JlbWVudCB0aGlzIHVuaXQsIGRvIG5vdGhpbmdcblxuICAgICAgaWYgKCF1cGRhdGVJbnRlcnZhbEluU2Vjb25kcyB8fCAhY2FuSW5jcmVtZW50KHVuaXQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gRmlndXJlIG91dCB0aGUgbmV4dCBpbnRlcmVzdGluZyB0aW1lXG5cblxuICAgICAgdmFyIG5leHRWYWx1ZUluU2Vjb25kcyA9IGN1cnJlbnRWYWx1ZUluU2Vjb25kcyAtIHVwZGF0ZUludGVydmFsSW5TZWNvbmRzO1xuICAgICAgdmFyIG5leHRVbml0ID0gc2VsZWN0VW5pdChuZXh0VmFsdWVJblNlY29uZHMpOyAvLyBXZSd2ZSByZWFjaGVkIHRoZSBtYXggYXV0byBpbmNyZW1lbnRhYmxlIHVuaXQsIGRvbid0IHNjaGVkdWxlIGFub3RoZXIgdXBkYXRlXG5cbiAgICAgIGlmIChuZXh0VW5pdCA9PT0gJ2RheScpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgdW5pdER1cmF0aW9uID0gZ2V0RHVyYXRpb25JblNlY29uZHMobmV4dFVuaXQpO1xuICAgICAgdmFyIHJlbWFpbmRlciA9IG5leHRWYWx1ZUluU2Vjb25kcyAlIHVuaXREdXJhdGlvbjtcbiAgICAgIHZhciBwcmV2SW50ZXJlc3RpbmdWYWx1ZUluU2Vjb25kcyA9IG5leHRWYWx1ZUluU2Vjb25kcyAtIHJlbWFpbmRlcjtcbiAgICAgIHZhciBuZXh0SW50ZXJlc3RpbmdWYWx1ZUluU2Vjb25kcyA9IHByZXZJbnRlcmVzdGluZ1ZhbHVlSW5TZWNvbmRzID49IGN1cnJlbnRWYWx1ZUluU2Vjb25kcyA/IHByZXZJbnRlcmVzdGluZ1ZhbHVlSW5TZWNvbmRzIC0gdW5pdER1cmF0aW9uIDogcHJldkludGVyZXN0aW5nVmFsdWVJblNlY29uZHM7XG4gICAgICB2YXIgZGVsYXlJblNlY29uZHMgPSBNYXRoLmFicyhuZXh0SW50ZXJlc3RpbmdWYWx1ZUluU2Vjb25kcyAtIGN1cnJlbnRWYWx1ZUluU2Vjb25kcyk7XG4gICAgICB0aGlzLl91cGRhdGVUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX3RoaXMyLnNldFN0YXRlKHtcbiAgICAgICAgICBjdXJyZW50VmFsdWVJblNlY29uZHM6IG5leHRJbnRlcmVzdGluZ1ZhbHVlSW5TZWNvbmRzXG4gICAgICAgIH0pO1xuICAgICAgfSwgZGVsYXlJblNlY29uZHMgKiAxZTMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnREaWRNb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIHRoaXMuc2NoZWR1bGVOZXh0VXBkYXRlKHRoaXMucHJvcHMsIHRoaXMuc3RhdGUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnREaWRVcGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgICAgdGhpcy5zY2hlZHVsZU5leHRVcGRhdGUodGhpcy5wcm9wcywgdGhpcy5zdGF0ZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudFdpbGxVbm1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3VwZGF0ZVRpbWVyKTtcbiAgICAgIHRoaXMuX3VwZGF0ZVRpbWVyID0gbnVsbDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChDb250ZXh0LkNvbnN1bWVyLCBudWxsLCBmdW5jdGlvbiAoaW50bCkge1xuICAgICAgICBpbnZhcmlhbnRJbnRsQ29udGV4dChpbnRsKTtcbiAgICAgICAgdmFyIGZvcm1hdFJlbGF0aXZlVGltZSA9IGludGwuZm9ybWF0UmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgVGV4dCA9IGludGwudGV4dENvbXBvbmVudDtcbiAgICAgICAgdmFyIF90aGlzMyRwcm9wcyA9IF90aGlzMy5wcm9wcyxcbiAgICAgICAgICAgIGNoaWxkcmVuID0gX3RoaXMzJHByb3BzLmNoaWxkcmVuLFxuICAgICAgICAgICAgdmFsdWUgPSBfdGhpczMkcHJvcHMudmFsdWUsXG4gICAgICAgICAgICB1bml0ID0gX3RoaXMzJHByb3BzLnVuaXQsXG4gICAgICAgICAgICB1cGRhdGVJbnRlcnZhbEluU2Vjb25kcyA9IF90aGlzMyRwcm9wcy51cGRhdGVJbnRlcnZhbEluU2Vjb25kcztcbiAgICAgICAgdmFyIGN1cnJlbnRWYWx1ZUluU2Vjb25kcyA9IF90aGlzMy5zdGF0ZS5jdXJyZW50VmFsdWVJblNlY29uZHM7XG4gICAgICAgIHZhciBjdXJyZW50VmFsdWUgPSB2YWx1ZSB8fCAwO1xuICAgICAgICB2YXIgY3VycmVudFVuaXQgPSB1bml0O1xuXG4gICAgICAgIGlmIChjYW5JbmNyZW1lbnQodW5pdCkgJiYgdHlwZW9mIGN1cnJlbnRWYWx1ZUluU2Vjb25kcyA9PT0gJ251bWJlcicgJiYgdXBkYXRlSW50ZXJ2YWxJblNlY29uZHMpIHtcbiAgICAgICAgICBjdXJyZW50VW5pdCA9IHNlbGVjdFVuaXQoY3VycmVudFZhbHVlSW5TZWNvbmRzKTtcbiAgICAgICAgICB2YXIgdW5pdER1cmF0aW9uID0gZ2V0RHVyYXRpb25JblNlY29uZHMoY3VycmVudFVuaXQpO1xuICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IE1hdGgucm91bmQoY3VycmVudFZhbHVlSW5TZWNvbmRzIC8gdW5pdER1cmF0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBmb3JtYXR0ZWRSZWxhdGl2ZVRpbWUgPSBmb3JtYXRSZWxhdGl2ZVRpbWUoY3VycmVudFZhbHVlLCBjdXJyZW50VW5pdCwgT2JqZWN0LmFzc2lnbih7fSwgX3RoaXMzLnByb3BzKSk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjaGlsZHJlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBjaGlsZHJlbihmb3JtYXR0ZWRSZWxhdGl2ZVRpbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFRleHQpIHtcbiAgICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChUZXh0LCBudWxsLCBmb3JtYXR0ZWRSZWxhdGl2ZVRpbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZvcm1hdHRlZFJlbGF0aXZlVGltZTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiBcImdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMocHJvcHMsIHN0YXRlKSB7XG4gICAgICBpZiAocHJvcHMudW5pdCAhPT0gc3RhdGUucHJldlVuaXQgfHwgcHJvcHMudmFsdWUgIT09IHN0YXRlLnByZXZWYWx1ZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHByZXZWYWx1ZTogcHJvcHMudmFsdWUsXG4gICAgICAgICAgcHJldlVuaXQ6IHByb3BzLnVuaXQsXG4gICAgICAgICAgY3VycmVudFZhbHVlSW5TZWNvbmRzOiBjYW5JbmNyZW1lbnQocHJvcHMudW5pdCkgPyB2YWx1ZVRvU2Vjb25kcyhwcm9wcy52YWx1ZSwgcHJvcHMudW5pdCkgOiAwXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBGb3JtYXR0ZWRSZWxhdGl2ZVRpbWU7XG59KFJlYWN0LlB1cmVDb21wb25lbnQpO1xuRm9ybWF0dGVkUmVsYXRpdmVUaW1lLmRpc3BsYXlOYW1lID0gJ0Zvcm1hdHRlZFJlbGF0aXZlVGltZSc7XG5Gb3JtYXR0ZWRSZWxhdGl2ZVRpbWUuZGVmYXVsdFByb3BzID0ge1xuICB2YWx1ZTogMCxcbiAgdW5pdDogJ3NlY29uZCdcbn07XG5leHBvcnQgZGVmYXVsdCBGb3JtYXR0ZWRSZWxhdGl2ZVRpbWU7IiwiLypcbiAqIENvcHlyaWdodCAyMDE1LCBZYWhvbyBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIExpY2Vuc2UuXG4gKiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgd2l0aEludGwgZnJvbSAnLi9pbmplY3RJbnRsJztcblxudmFyIEZvcm1hdHRlZFBsdXJhbCA9IGZ1bmN0aW9uIEZvcm1hdHRlZFBsdXJhbChwcm9wcykge1xuICB2YXIgdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICAgIG90aGVyID0gcHJvcHMub3RoZXIsXG4gICAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgX3Byb3BzJGludGwgPSBwcm9wcy5pbnRsLFxuICAgICAgZm9ybWF0UGx1cmFsID0gX3Byb3BzJGludGwuZm9ybWF0UGx1cmFsLFxuICAgICAgVGV4dCA9IF9wcm9wcyRpbnRsLnRleHRDb21wb25lbnQ7XG4gIHZhciBwbHVyYWxDYXRlZ29yeSA9IGZvcm1hdFBsdXJhbCh2YWx1ZSwgcHJvcHMpO1xuICB2YXIgZm9ybWF0dGVkUGx1cmFsID0gcHJvcHNbcGx1cmFsQ2F0ZWdvcnldIHx8IG90aGVyO1xuXG4gIGlmICh0eXBlb2YgY2hpbGRyZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gY2hpbGRyZW4oZm9ybWF0dGVkUGx1cmFsKTtcbiAgfVxuXG4gIGlmIChUZXh0KSB7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoVGV4dCwgbnVsbCwgZm9ybWF0dGVkUGx1cmFsKTtcbiAgfSAvLyBXb3JrIGFyb3VuZCBAdHlwZXMvcmVhY3Qgd2hlcmUgUmVhY3QuRkMgY2Fubm90IHJldHVybiBzdHJpbmdcblxuXG4gIHJldHVybiBmb3JtYXR0ZWRQbHVyYWw7XG59O1xuXG5Gb3JtYXR0ZWRQbHVyYWwuZGVmYXVsdFByb3BzID0ge1xuICB0eXBlOiAnY2FyZGluYWwnXG59O1xuRm9ybWF0dGVkUGx1cmFsLmRpc3BsYXlOYW1lID0gJ0Zvcm1hdHRlZFBsdXJhbCc7XG5leHBvcnQgZGVmYXVsdCB3aXRoSW50bChGb3JtYXR0ZWRQbHVyYWwpOyIsImltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIi9ob21lL3J1bm5lci93b3JrL2p1c3RpY2U0MC10b29sL2p1c3RpY2U0MC10b29sL2NsaWVudC9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIi9ob21lL3J1bm5lci93b3JrL2p1c3RpY2U0MC10b29sL2p1c3RpY2U0MC10b29sL2NsaWVudC9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIi9ob21lL3J1bm5lci93b3JrL2p1c3RpY2U0MC10b29sL2p1c3RpY2U0MC10b29sL2NsaWVudC9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIi9ob21lL3J1bm5lci93b3JrL2p1c3RpY2U0MC10b29sL2p1c3RpY2U0MC10b29sL2NsaWVudC9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNcIjtcbmltcG9ydCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiBmcm9tIFwiL2hvbWUvcnVubmVyL3dvcmsvanVzdGljZTQwLXRvb2wvanVzdGljZTQwLXRvb2wvY2xpZW50L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuXCI7XG5pbXBvcnQgX2dldFByb3RvdHlwZU9mIGZyb20gXCIvaG9tZS9ydW5uZXIvd29yay9qdXN0aWNlNDAtdG9vbC9qdXN0aWNlNDAtdG9vbC9jbGllbnQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2dldFByb3RvdHlwZU9mXCI7XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG4vKlxuICogQ29weXJpZ2h0IDIwMTUsIFlhaG9vIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgTGljZW5zZS5cbiAqIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbnZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG5cbiAgZm9yICh2YXIgcCBpbiBzKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgfVxuXG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSAnLi9pbmplY3RJbnRsJztcbmltcG9ydCB7IGZvcm1hdE1lc3NhZ2UgfSBmcm9tICcuLi9mb3JtYXR0ZXJzL21lc3NhZ2UnO1xuaW1wb3J0IHsgaW52YXJpYW50SW50bENvbnRleHQsIERFRkFVTFRfSU5UTF9DT05GSUcsIGNyZWF0ZUZvcm1hdHRlcnMgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgKiBhcyBzaGFsbG93RXF1YWxzXyBmcm9tICdzaGFsbG93LWVxdWFsL29iamVjdHMnO1xudmFyIHNoYWxsb3dFcXVhbHMgPSBzaGFsbG93RXF1YWxzXy5kZWZhdWx0IHx8IHNoYWxsb3dFcXVhbHNfO1xuXG52YXIgZGVmYXVsdEZvcm1hdE1lc3NhZ2UgPSBmdW5jdGlvbiBkZWZhdWx0Rm9ybWF0TWVzc2FnZShkZXNjcmlwdG9yLCB2YWx1ZXMpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBjb25zb2xlLmVycm9yKCdbUmVhY3QgSW50bF0gQ291bGQgbm90IGZpbmQgcmVxdWlyZWQgYGludGxgIG9iamVjdC4gPEludGxQcm92aWRlcj4gbmVlZHMgdG8gZXhpc3QgaW4gdGhlIGNvbXBvbmVudCBhbmNlc3RyeS4gVXNpbmcgZGVmYXVsdCBtZXNzYWdlIGFzIGZhbGxiYWNrLicpO1xuICB9XG5cbiAgcmV0dXJuIGZvcm1hdE1lc3NhZ2UoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX0lOVExfQ09ORklHKSwge1xuICAgIGxvY2FsZTogJ2VuJ1xuICB9KSwgY3JlYXRlRm9ybWF0dGVycygpLCBkZXNjcmlwdG9yLCB2YWx1ZXMpO1xufTtcblxudmFyIEZvcm1hdHRlZE1lc3NhZ2UgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKEZvcm1hdHRlZE1lc3NhZ2UsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoRm9ybWF0dGVkTWVzc2FnZSk7XG5cbiAgZnVuY3Rpb24gRm9ybWF0dGVkTWVzc2FnZSgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRm9ybWF0dGVkTWVzc2FnZSk7XG5cbiAgICByZXR1cm4gX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoRm9ybWF0dGVkTWVzc2FnZSwgW3tcbiAgICBrZXk6IFwic2hvdWxkQ29tcG9uZW50VXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNob3VsZENvbXBvbmVudFVwZGF0ZShuZXh0UHJvcHMpIHtcbiAgICAgIHZhciBfYSA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgdmFsdWVzID0gX2EudmFsdWVzLFxuICAgICAgICAgIG90aGVyUHJvcHMgPSBfX3Jlc3QoX2EsIFtcInZhbHVlc1wiXSk7XG5cbiAgICAgIHZhciBuZXh0VmFsdWVzID0gbmV4dFByb3BzLnZhbHVlcyxcbiAgICAgICAgICBuZXh0T3RoZXJQcm9wcyA9IF9fcmVzdChuZXh0UHJvcHMsIFtcInZhbHVlc1wiXSk7XG5cbiAgICAgIHJldHVybiAhc2hhbGxvd0VxdWFscyhuZXh0VmFsdWVzLCB2YWx1ZXMpIHx8ICFzaGFsbG93RXF1YWxzKG90aGVyUHJvcHMsIG5leHRPdGhlclByb3BzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KENvbnRleHQuQ29uc3VtZXIsIG51bGwsIGZ1bmN0aW9uIChpbnRsKSB7XG4gICAgICAgIGlmICghX3RoaXMucHJvcHMuZGVmYXVsdE1lc3NhZ2UpIHtcbiAgICAgICAgICBpbnZhcmlhbnRJbnRsQ29udGV4dChpbnRsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBfcmVmID0gaW50bCB8fCB7fSxcbiAgICAgICAgICAgIF9yZWYkZm9ybWF0TWVzc2FnZSA9IF9yZWYuZm9ybWF0TWVzc2FnZSxcbiAgICAgICAgICAgIGZvcm1hdE1lc3NhZ2UgPSBfcmVmJGZvcm1hdE1lc3NhZ2UgPT09IHZvaWQgMCA/IGRlZmF1bHRGb3JtYXRNZXNzYWdlIDogX3JlZiRmb3JtYXRNZXNzYWdlLFxuICAgICAgICAgICAgX3JlZiR0ZXh0Q29tcG9uZW50ID0gX3JlZi50ZXh0Q29tcG9uZW50LFxuICAgICAgICAgICAgVGV4dCA9IF9yZWYkdGV4dENvbXBvbmVudCA9PT0gdm9pZCAwID8gUmVhY3QuRnJhZ21lbnQgOiBfcmVmJHRleHRDb21wb25lbnQ7XG5cbiAgICAgICAgdmFyIF90aGlzJHByb3BzID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgICBpZCA9IF90aGlzJHByb3BzLmlkLFxuICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBfdGhpcyRwcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlID0gX3RoaXMkcHJvcHMuZGVmYXVsdE1lc3NhZ2UsXG4gICAgICAgICAgICB2YWx1ZXMgPSBfdGhpcyRwcm9wcy52YWx1ZXMsXG4gICAgICAgICAgICBjaGlsZHJlbiA9IF90aGlzJHByb3BzLmNoaWxkcmVuLFxuICAgICAgICAgICAgX3RoaXMkcHJvcHMkdGFnTmFtZSA9IF90aGlzJHByb3BzLnRhZ05hbWUsXG4gICAgICAgICAgICBDb21wb25lbnQgPSBfdGhpcyRwcm9wcyR0YWdOYW1lID09PSB2b2lkIDAgPyBUZXh0IDogX3RoaXMkcHJvcHMkdGFnTmFtZTtcbiAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSB7XG4gICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbixcbiAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogZGVmYXVsdE1lc3NhZ2VcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIG5vZGVzID0gZm9ybWF0TWVzc2FnZShkZXNjcmlwdG9yLCB2YWx1ZXMpO1xuXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShub2RlcykpIHtcbiAgICAgICAgICBub2RlcyA9IFtub2Rlc107XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNoaWxkcmVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIGNoaWxkcmVuLmFwcGx5KHZvaWQgMCwgX3RvQ29uc3VtYWJsZUFycmF5KG5vZGVzKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoQ29tcG9uZW50KSB7XG4gICAgICAgICAgLy8gTmVlZHMgdG8gdXNlIGBjcmVhdGVFbGVtZW50KClgIGluc3RlYWQgb2YgSlNYLCBvdGhlcndpc2UgUmVhY3Qgd2lsbFxuICAgICAgICAgIC8vIHdhcm4gYWJvdXQgYSBtaXNzaW5nIGBrZXlgIHByb3Agd2l0aCByaWNoLXRleHQgbWVzc2FnZSBmb3JtYXR0aW5nLlxuICAgICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50LmFwcGx5KFJlYWN0LCBbQ29tcG9uZW50LCBudWxsXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KG5vZGVzKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5vZGVzO1xuICAgICAgfSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEZvcm1hdHRlZE1lc3NhZ2U7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbkZvcm1hdHRlZE1lc3NhZ2UuZGlzcGxheU5hbWUgPSAnRm9ybWF0dGVkTWVzc2FnZSc7XG5Gb3JtYXR0ZWRNZXNzYWdlLmRlZmF1bHRQcm9wcyA9IHtcbiAgdmFsdWVzOiB7fVxufTtcbmV4cG9ydCBkZWZhdWx0IEZvcm1hdHRlZE1lc3NhZ2U7IiwiaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiL2hvbWUvcnVubmVyL3dvcmsvanVzdGljZTQwLXRvb2wvanVzdGljZTQwLXRvb2wvY2xpZW50L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiL2hvbWUvcnVubmVyL3dvcmsvanVzdGljZTQwLXRvb2wvanVzdGljZTQwLXRvb2wvY2xpZW50L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9pbmhlcml0cyBmcm9tIFwiL2hvbWUvcnVubmVyL3dvcmsvanVzdGljZTQwLXRvb2wvanVzdGljZTQwLXRvb2wvY2xpZW50L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c1wiO1xuaW1wb3J0IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIGZyb20gXCIvaG9tZS9ydW5uZXIvd29yay9qdXN0aWNlNDAtdG9vbC9qdXN0aWNlNDAtdG9vbC9jbGllbnQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm5cIjtcbmltcG9ydCBfZ2V0UHJvdG90eXBlT2YgZnJvbSBcIi9ob21lL3J1bm5lci93b3JrL2p1c3RpY2U0MC10b29sL2p1c3RpY2U0MC10b29sL2NsaWVudC9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZ2V0UHJvdG90eXBlT2ZcIjtcblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbiwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9XG5cbi8qXG4gKiBDb3B5cmlnaHQgMjAxNSwgWWFob28gSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBMaWNlbnNlLlxuICogU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEZvcm1hdHRlZE1lc3NhZ2UgZnJvbSAnLi9tZXNzYWdlJztcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tICcuL2luamVjdEludGwnO1xuaW1wb3J0IHsgaW52YXJpYW50SW50bENvbnRleHQgfSBmcm9tICcuLi91dGlscyc7XG5cbnZhciBGb3JtYXR0ZWRIVE1MTWVzc2FnZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0Zvcm1hdHRlZE1lc3NhZ2UpIHtcbiAgX2luaGVyaXRzKEZvcm1hdHRlZEhUTUxNZXNzYWdlLCBfRm9ybWF0dGVkTWVzc2FnZSk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihGb3JtYXR0ZWRIVE1MTWVzc2FnZSk7XG5cbiAgZnVuY3Rpb24gRm9ybWF0dGVkSFRNTE1lc3NhZ2UoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEZvcm1hdHRlZEhUTUxNZXNzYWdlKTtcblxuICAgIHJldHVybiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhGb3JtYXR0ZWRIVE1MTWVzc2FnZSwgW3tcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KENvbnRleHQuQ29uc3VtZXIsIG51bGwsIGZ1bmN0aW9uIChpbnRsKSB7XG4gICAgICAgIGlmICghX3RoaXMucHJvcHMuZGVmYXVsdE1lc3NhZ2UpIHtcbiAgICAgICAgICBpbnZhcmlhbnRJbnRsQ29udGV4dChpbnRsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBmb3JtYXRIVE1MTWVzc2FnZSA9IGludGwuZm9ybWF0SFRNTE1lc3NhZ2UsXG4gICAgICAgICAgICB0ZXh0Q29tcG9uZW50ID0gaW50bC50ZXh0Q29tcG9uZW50O1xuICAgICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICAgIGlkID0gX3RoaXMkcHJvcHMuaWQsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbiA9IF90aGlzJHByb3BzLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2UgPSBfdGhpcyRwcm9wcy5kZWZhdWx0TWVzc2FnZSxcbiAgICAgICAgICAgIHJhd1ZhbHVlcyA9IF90aGlzJHByb3BzLnZhbHVlcyxcbiAgICAgICAgICAgIGNoaWxkcmVuID0gX3RoaXMkcHJvcHMuY2hpbGRyZW47XG4gICAgICAgIHZhciBDb21wb25lbnQgPSBfdGhpcy5wcm9wcy50YWdOYW1lOyAvLyBUaGlzIGlzIGJjIG9mIFRTMy4zIGRvZXNuJ3QgcmVjb2duaXplIGBkZWZhdWx0UHJvcHNgXG5cbiAgICAgICAgaWYgKCFDb21wb25lbnQpIHtcbiAgICAgICAgICBDb21wb25lbnQgPSB0ZXh0Q29tcG9uZW50IHx8ICdzcGFuJztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkZXNjcmlwdG9yID0ge1xuICAgICAgICAgIGlkOiBpZCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogZGVzY3JpcHRpb24sXG4gICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6IGRlZmF1bHRNZXNzYWdlXG4gICAgICAgIH07XG4gICAgICAgIHZhciBmb3JtYXR0ZWRIVE1MTWVzc2FnZSA9IGZvcm1hdEhUTUxNZXNzYWdlKGRlc2NyaXB0b3IsIHJhd1ZhbHVlcyk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjaGlsZHJlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBjaGlsZHJlbihmb3JtYXR0ZWRIVE1MTWVzc2FnZSk7XG4gICAgICAgIH0gLy8gU2luY2UgdGhlIG1lc3NhZ2UgcHJlc3VtYWJseSBoYXMgSFRNTCBpbiBpdCwgd2UgbmVlZCB0byBzZXRcbiAgICAgICAgLy8gYGlubmVySFRNTGAgaW4gb3JkZXIgZm9yIGl0IHRvIGJlIHJlbmRlcmVkIGFuZCBub3QgZXNjYXBlZCBieSBSZWFjdC5cbiAgICAgICAgLy8gVG8gYmUgc2FmZSwgYWxsIHN0cmluZyBwcm9wIHZhbHVlcyB3ZXJlIGVzY2FwZWQgd2hlbiBmb3JtYXR0aW5nIHRoZVxuICAgICAgICAvLyBtZXNzYWdlLiBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIG1lc3NhZ2UgaXMgbm90IFVHQywgYW5kIGNhbWUgZnJvbSB0aGVcbiAgICAgICAgLy8gZGV2ZWxvcGVyIG1ha2luZyBpdCBtb3JlIGxpa2UgYSB0ZW1wbGF0ZS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gTm90ZTogVGhlcmUncyBhIHBlcmYgaW1wYWN0IG9mIHVzaW5nIHRoaXMgY29tcG9uZW50IHNpbmNlIHRoZXJlJ3Mgbm9cbiAgICAgICAgLy8gd2F5IGZvciBSZWFjdCB0byBkbyBpdHMgdmlydHVhbCBET00gZGlmZmluZy5cblxuXG4gICAgICAgIHZhciBodG1sID0ge1xuICAgICAgICAgIF9faHRtbDogZm9ybWF0dGVkSFRNTE1lc3NhZ2VcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCB7XG4gICAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6IGh0bWxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRm9ybWF0dGVkSFRNTE1lc3NhZ2U7XG59KEZvcm1hdHRlZE1lc3NhZ2UpO1xuXG5Gb3JtYXR0ZWRIVE1MTWVzc2FnZS5kaXNwbGF5TmFtZSA9ICdGb3JtYXR0ZWRIVE1MTWVzc2FnZSc7XG5Gb3JtYXR0ZWRIVE1MTWVzc2FnZS5kZWZhdWx0UHJvcHMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIEZvcm1hdHRlZE1lc3NhZ2UuZGVmYXVsdFByb3BzKSwge1xuICB0YWdOYW1lOiAnc3Bhbidcbn0pO1xuZXhwb3J0IGRlZmF1bHQgRm9ybWF0dGVkSFRNTE1lc3NhZ2U7IiwiZXhwb3J0IGZ1bmN0aW9uIGRlZmluZU1lc3NhZ2VzKG1zZ3MpIHtcbiAgcmV0dXJuIG1zZ3M7XG59XG5pbXBvcnQgeyBjcmVhdGVGb3JtYXR0ZWRDb21wb25lbnQsIGNyZWF0ZUZvcm1hdHRlZERhdGVUaW1lUGFydHNDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvY3JlYXRlRm9ybWF0dGVkQ29tcG9uZW50JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaW5qZWN0SW50bCwgUHJvdmlkZXIgYXMgUmF3SW50bFByb3ZpZGVyLCBDb250ZXh0IGFzIEludGxDb250ZXh0IH0gZnJvbSAnLi9jb21wb25lbnRzL2luamVjdEludGwnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB1c2VJbnRsIH0gZnJvbSAnLi9jb21wb25lbnRzL3VzZUludGwnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBJbnRsUHJvdmlkZXIsIGNyZWF0ZUludGwgfSBmcm9tICcuL2NvbXBvbmVudHMvcHJvdmlkZXInOyAvLyBJTVBPUlRBTlQ6IEV4cGxpY2l0IGhlcmUgdG8gcHJldmVudCBhcGktZXh0cmFjdG9yIGZyb20gb3V0cHV0aW5nIGBpbXBvcnQoJy4vdHlwZXMnKS5DdXN0b21Gb3JtYXRDb25maWdgXG5cbmV4cG9ydCB2YXIgRm9ybWF0dGVkRGF0ZSA9IGNyZWF0ZUZvcm1hdHRlZENvbXBvbmVudCgnZm9ybWF0RGF0ZScpO1xuZXhwb3J0IHZhciBGb3JtYXR0ZWRUaW1lID0gY3JlYXRlRm9ybWF0dGVkQ29tcG9uZW50KCdmb3JtYXRUaW1lJyk7XG5leHBvcnQgdmFyIEZvcm1hdHRlZE51bWJlciA9IGNyZWF0ZUZvcm1hdHRlZENvbXBvbmVudCgnZm9ybWF0TnVtYmVyJyk7XG5leHBvcnQgdmFyIEZvcm1hdHRlZExpc3QgPSBjcmVhdGVGb3JtYXR0ZWRDb21wb25lbnQoJ2Zvcm1hdExpc3QnKTtcbmV4cG9ydCB2YXIgRm9ybWF0dGVkRGlzcGxheU5hbWUgPSBjcmVhdGVGb3JtYXR0ZWRDb21wb25lbnQoJ2Zvcm1hdERpc3BsYXlOYW1lJyk7XG5leHBvcnQgdmFyIEZvcm1hdHRlZERhdGVQYXJ0cyA9IGNyZWF0ZUZvcm1hdHRlZERhdGVUaW1lUGFydHNDb21wb25lbnQoJ2Zvcm1hdERhdGUnKTtcbmV4cG9ydCB2YXIgRm9ybWF0dGVkVGltZVBhcnRzID0gY3JlYXRlRm9ybWF0dGVkRGF0ZVRpbWVQYXJ0c0NvbXBvbmVudCgnZm9ybWF0VGltZScpO1xuZXhwb3J0IHsgRm9ybWF0dGVkTnVtYmVyUGFydHMgfSBmcm9tICcuL2NvbXBvbmVudHMvY3JlYXRlRm9ybWF0dGVkQ29tcG9uZW50JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgRm9ybWF0dGVkUmVsYXRpdmVUaW1lIH0gZnJvbSAnLi9jb21wb25lbnRzL3JlbGF0aXZlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgRm9ybWF0dGVkUGx1cmFsIH0gZnJvbSAnLi9jb21wb25lbnRzL3BsdXJhbCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEZvcm1hdHRlZE1lc3NhZ2UgfSBmcm9tICcuL2NvbXBvbmVudHMvbWVzc2FnZSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEZvcm1hdHRlZEhUTUxNZXNzYWdlIH0gZnJvbSAnLi9jb21wb25lbnRzL2h0bWwtbWVzc2FnZSc7XG5leHBvcnQgeyBjcmVhdGVJbnRsQ2FjaGUgfSBmcm9tICcuL3V0aWxzJzsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///3160\n")},165:function(__unused_webpack_module,exports){"use strict";eval('/** @license React v16.13.1\n * react-is.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\nvar b = "function" === typeof Symbol && Symbol.for,\n c = b ? Symbol.for("react.element") : 60103,\n d = b ? Symbol.for("react.portal") : 60106,\n e = b ? Symbol.for("react.fragment") : 60107,\n f = b ? Symbol.for("react.strict_mode") : 60108,\n g = b ? Symbol.for("react.profiler") : 60114,\n h = b ? Symbol.for("react.provider") : 60109,\n k = b ? Symbol.for("react.context") : 60110,\n l = b ? Symbol.for("react.async_mode") : 60111,\n m = b ? Symbol.for("react.concurrent_mode") : 60111,\n n = b ? Symbol.for("react.forward_ref") : 60112,\n p = b ? Symbol.for("react.suspense") : 60113,\n q = b ? Symbol.for("react.suspense_list") : 60120,\n r = b ? Symbol.for("react.memo") : 60115,\n t = b ? Symbol.for("react.lazy") : 60116,\n v = b ? Symbol.for("react.block") : 60121,\n w = b ? Symbol.for("react.fundamental") : 60117,\n x = b ? Symbol.for("react.responder") : 60118,\n y = b ? Symbol.for("react.scope") : 60119;\n\nfunction z(a) {\n if ("object" === typeof a && null !== a) {\n var u = a.$$typeof;\n\n switch (u) {\n case c:\n switch (a = a.type, a) {\n case l:\n case m:\n case e:\n case g:\n case f:\n case p:\n return a;\n\n default:\n switch (a = a && a.$$typeof, a) {\n case k:\n case n:\n case t:\n case r:\n case h:\n return a;\n\n default:\n return u;\n }\n\n }\n\n case d:\n return u;\n }\n }\n}\n\nfunction A(a) {\n return z(a) === m;\n}\n\nexports.AsyncMode = l;\nexports.ConcurrentMode = m;\nexports.ContextConsumer = k;\nexports.ContextProvider = h;\nexports.Element = c;\nexports.ForwardRef = n;\nexports.Fragment = e;\nexports.Lazy = t;\nexports.Memo = r;\nexports.Portal = d;\nexports.Profiler = g;\nexports.StrictMode = f;\nexports.Suspense = p;\n\nexports.isAsyncMode = function (a) {\n return A(a) || z(a) === l;\n};\n\nexports.isConcurrentMode = A;\n\nexports.isContextConsumer = function (a) {\n return z(a) === k;\n};\n\nexports.isContextProvider = function (a) {\n return z(a) === h;\n};\n\nexports.isElement = function (a) {\n return "object" === typeof a && null !== a && a.$$typeof === c;\n};\n\nexports.isForwardRef = function (a) {\n return z(a) === n;\n};\n\nexports.isFragment = function (a) {\n return z(a) === e;\n};\n\nexports.isLazy = function (a) {\n return z(a) === t;\n};\n\nexports.isMemo = function (a) {\n return z(a) === r;\n};\n\nexports.isPortal = function (a) {\n return z(a) === d;\n};\n\nexports.isProfiler = function (a) {\n return z(a) === g;\n};\n\nexports.isStrictMode = function (a) {\n return z(a) === f;\n};\n\nexports.isSuspense = function (a) {\n return z(a) === p;\n};\n\nexports.isValidElementType = function (a) {\n return "string" === typeof a || "function" === typeof a || a === e || a === m || a === g || a === f || a === p || a === q || "object" === typeof a && null !== a && (a.$$typeof === t || a.$$typeof === r || a.$$typeof === h || a.$$typeof === k || a.$$typeof === n || a.$$typeof === w || a.$$typeof === x || a.$$typeof === y || a.$$typeof === v);\n};\n\nexports.typeOf = z;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1pcy9janMvcmVhY3QtaXMucHJvZHVjdGlvbi5taW4uanM/YWQxMiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2E7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGlCQUFpQjtBQUNqQixzQkFBc0I7QUFDdEIsdUJBQXVCO0FBQ3ZCLHVCQUF1QjtBQUN2QixlQUFlO0FBQ2Ysa0JBQWtCO0FBQ2xCLGdCQUFnQjtBQUNoQixZQUFZO0FBQ1osWUFBWTtBQUNaLGNBQWM7QUFDZCxnQkFBZ0I7QUFDaEIsa0JBQWtCO0FBQ2xCLGdCQUFnQjs7QUFFaEIsbUJBQW1CO0FBQ25CO0FBQ0E7O0FBRUEsd0JBQXdCOztBQUV4Qix5QkFBeUI7QUFDekI7QUFDQTs7QUFFQSx5QkFBeUI7QUFDekI7QUFDQTs7QUFFQSxpQkFBaUI7QUFDakI7QUFDQTs7QUFFQSxvQkFBb0I7QUFDcEI7QUFDQTs7QUFFQSxrQkFBa0I7QUFDbEI7QUFDQTs7QUFFQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFQSxnQkFBZ0I7QUFDaEI7QUFDQTs7QUFFQSxrQkFBa0I7QUFDbEI7QUFDQTs7QUFFQSxvQkFBb0I7QUFDcEI7QUFDQTs7QUFFQSxrQkFBa0I7QUFDbEI7QUFDQTs7QUFFQSwwQkFBMEI7QUFDMUI7QUFDQTs7QUFFQSxjQUFjIiwiZmlsZSI6IjE2NS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbGljZW5zZSBSZWFjdCB2MTYuMTMuMVxuICogcmVhY3QtaXMucHJvZHVjdGlvbi5taW4uanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgYiA9IFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIFN5bWJvbCAmJiBTeW1ib2wuZm9yLFxuICAgIGMgPSBiID8gU3ltYm9sLmZvcihcInJlYWN0LmVsZW1lbnRcIikgOiA2MDEwMyxcbiAgICBkID0gYiA/IFN5bWJvbC5mb3IoXCJyZWFjdC5wb3J0YWxcIikgOiA2MDEwNixcbiAgICBlID0gYiA/IFN5bWJvbC5mb3IoXCJyZWFjdC5mcmFnbWVudFwiKSA6IDYwMTA3LFxuICAgIGYgPSBiID8gU3ltYm9sLmZvcihcInJlYWN0LnN0cmljdF9tb2RlXCIpIDogNjAxMDgsXG4gICAgZyA9IGIgPyBTeW1ib2wuZm9yKFwicmVhY3QucHJvZmlsZXJcIikgOiA2MDExNCxcbiAgICBoID0gYiA/IFN5bWJvbC5mb3IoXCJyZWFjdC5wcm92aWRlclwiKSA6IDYwMTA5LFxuICAgIGsgPSBiID8gU3ltYm9sLmZvcihcInJlYWN0LmNvbnRleHRcIikgOiA2MDExMCxcbiAgICBsID0gYiA/IFN5bWJvbC5mb3IoXCJyZWFjdC5hc3luY19tb2RlXCIpIDogNjAxMTEsXG4gICAgbSA9IGIgPyBTeW1ib2wuZm9yKFwicmVhY3QuY29uY3VycmVudF9tb2RlXCIpIDogNjAxMTEsXG4gICAgbiA9IGIgPyBTeW1ib2wuZm9yKFwicmVhY3QuZm9yd2FyZF9yZWZcIikgOiA2MDExMixcbiAgICBwID0gYiA/IFN5bWJvbC5mb3IoXCJyZWFjdC5zdXNwZW5zZVwiKSA6IDYwMTEzLFxuICAgIHEgPSBiID8gU3ltYm9sLmZvcihcInJlYWN0LnN1c3BlbnNlX2xpc3RcIikgOiA2MDEyMCxcbiAgICByID0gYiA/IFN5bWJvbC5mb3IoXCJyZWFjdC5tZW1vXCIpIDogNjAxMTUsXG4gICAgdCA9IGIgPyBTeW1ib2wuZm9yKFwicmVhY3QubGF6eVwiKSA6IDYwMTE2LFxuICAgIHYgPSBiID8gU3ltYm9sLmZvcihcInJlYWN0LmJsb2NrXCIpIDogNjAxMjEsXG4gICAgdyA9IGIgPyBTeW1ib2wuZm9yKFwicmVhY3QuZnVuZGFtZW50YWxcIikgOiA2MDExNyxcbiAgICB4ID0gYiA/IFN5bWJvbC5mb3IoXCJyZWFjdC5yZXNwb25kZXJcIikgOiA2MDExOCxcbiAgICB5ID0gYiA/IFN5bWJvbC5mb3IoXCJyZWFjdC5zY29wZVwiKSA6IDYwMTE5O1xuXG5mdW5jdGlvbiB6KGEpIHtcbiAgaWYgKFwib2JqZWN0XCIgPT09IHR5cGVvZiBhICYmIG51bGwgIT09IGEpIHtcbiAgICB2YXIgdSA9IGEuJCR0eXBlb2Y7XG5cbiAgICBzd2l0Y2ggKHUpIHtcbiAgICAgIGNhc2UgYzpcbiAgICAgICAgc3dpdGNoIChhID0gYS50eXBlLCBhKSB7XG4gICAgICAgICAgY2FzZSBsOlxuICAgICAgICAgIGNhc2UgbTpcbiAgICAgICAgICBjYXNlIGU6XG4gICAgICAgICAgY2FzZSBnOlxuICAgICAgICAgIGNhc2UgZjpcbiAgICAgICAgICBjYXNlIHA6XG4gICAgICAgICAgICByZXR1cm4gYTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBzd2l0Y2ggKGEgPSBhICYmIGEuJCR0eXBlb2YsIGEpIHtcbiAgICAgICAgICAgICAgY2FzZSBrOlxuICAgICAgICAgICAgICBjYXNlIG46XG4gICAgICAgICAgICAgIGNhc2UgdDpcbiAgICAgICAgICAgICAgY2FzZSByOlxuICAgICAgICAgICAgICBjYXNlIGg6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGE7XG5cbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgIGNhc2UgZDpcbiAgICAgICAgcmV0dXJuIHU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIEEoYSkge1xuICByZXR1cm4geihhKSA9PT0gbTtcbn1cblxuZXhwb3J0cy5Bc3luY01vZGUgPSBsO1xuZXhwb3J0cy5Db25jdXJyZW50TW9kZSA9IG07XG5leHBvcnRzLkNvbnRleHRDb25zdW1lciA9IGs7XG5leHBvcnRzLkNvbnRleHRQcm92aWRlciA9IGg7XG5leHBvcnRzLkVsZW1lbnQgPSBjO1xuZXhwb3J0cy5Gb3J3YXJkUmVmID0gbjtcbmV4cG9ydHMuRnJhZ21lbnQgPSBlO1xuZXhwb3J0cy5MYXp5ID0gdDtcbmV4cG9ydHMuTWVtbyA9IHI7XG5leHBvcnRzLlBvcnRhbCA9IGQ7XG5leHBvcnRzLlByb2ZpbGVyID0gZztcbmV4cG9ydHMuU3RyaWN0TW9kZSA9IGY7XG5leHBvcnRzLlN1c3BlbnNlID0gcDtcblxuZXhwb3J0cy5pc0FzeW5jTW9kZSA9IGZ1bmN0aW9uIChhKSB7XG4gIHJldHVybiBBKGEpIHx8IHooYSkgPT09IGw7XG59O1xuXG5leHBvcnRzLmlzQ29uY3VycmVudE1vZGUgPSBBO1xuXG5leHBvcnRzLmlzQ29udGV4dENvbnN1bWVyID0gZnVuY3Rpb24gKGEpIHtcbiAgcmV0dXJuIHooYSkgPT09IGs7XG59O1xuXG5leHBvcnRzLmlzQ29udGV4dFByb3ZpZGVyID0gZnVuY3Rpb24gKGEpIHtcbiAgcmV0dXJuIHooYSkgPT09IGg7XG59O1xuXG5leHBvcnRzLmlzRWxlbWVudCA9IGZ1bmN0aW9uIChhKSB7XG4gIHJldHVybiBcIm9iamVjdFwiID09PSB0eXBlb2YgYSAmJiBudWxsICE9PSBhICYmIGEuJCR0eXBlb2YgPT09IGM7XG59O1xuXG5leHBvcnRzLmlzRm9yd2FyZFJlZiA9IGZ1bmN0aW9uIChhKSB7XG4gIHJldHVybiB6KGEpID09PSBuO1xufTtcblxuZXhwb3J0cy5pc0ZyYWdtZW50ID0gZnVuY3Rpb24gKGEpIHtcbiAgcmV0dXJuIHooYSkgPT09IGU7XG59O1xuXG5leHBvcnRzLmlzTGF6eSA9IGZ1bmN0aW9uIChhKSB7XG4gIHJldHVybiB6KGEpID09PSB0O1xufTtcblxuZXhwb3J0cy5pc01lbW8gPSBmdW5jdGlvbiAoYSkge1xuICByZXR1cm4geihhKSA9PT0gcjtcbn07XG5cbmV4cG9ydHMuaXNQb3J0YWwgPSBmdW5jdGlvbiAoYSkge1xuICByZXR1cm4geihhKSA9PT0gZDtcbn07XG5cbmV4cG9ydHMuaXNQcm9maWxlciA9IGZ1bmN0aW9uIChhKSB7XG4gIHJldHVybiB6KGEpID09PSBnO1xufTtcblxuZXhwb3J0cy5pc1N0cmljdE1vZGUgPSBmdW5jdGlvbiAoYSkge1xuICByZXR1cm4geihhKSA9PT0gZjtcbn07XG5cbmV4cG9ydHMuaXNTdXNwZW5zZSA9IGZ1bmN0aW9uIChhKSB7XG4gIHJldHVybiB6KGEpID09PSBwO1xufTtcblxuZXhwb3J0cy5pc1ZhbGlkRWxlbWVudFR5cGUgPSBmdW5jdGlvbiAoYSkge1xuICByZXR1cm4gXCJzdHJpbmdcIiA9PT0gdHlwZW9mIGEgfHwgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgYSB8fCBhID09PSBlIHx8IGEgPT09IG0gfHwgYSA9PT0gZyB8fCBhID09PSBmIHx8IGEgPT09IHAgfHwgYSA9PT0gcSB8fCBcIm9iamVjdFwiID09PSB0eXBlb2YgYSAmJiBudWxsICE9PSBhICYmIChhLiQkdHlwZW9mID09PSB0IHx8IGEuJCR0eXBlb2YgPT09IHIgfHwgYS4kJHR5cGVvZiA9PT0gaCB8fCBhLiQkdHlwZW9mID09PSBrIHx8IGEuJCR0eXBlb2YgPT09IG4gfHwgYS4kJHR5cGVvZiA9PT0gdyB8fCBhLiQkdHlwZW9mID09PSB4IHx8IGEuJCR0eXBlb2YgPT09IHkgfHwgYS4kJHR5cGVvZiA9PT0gdik7XG59O1xuXG5leHBvcnRzLnR5cGVPZiA9IHo7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///165\n')},8812:function(module,__unused_webpack_exports,__webpack_require__){"use strict";eval("\n\nif (true) {\n module.exports = __webpack_require__(165);\n} else {}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1pcy9pbmRleC5qcz8zOTgxIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViLElBQUksSUFBcUM7QUFDekMsRUFBRSx5Q0FBNEQ7QUFDOUQsQ0FBQyxNQUFNIiwiZmlsZSI6Ijg4MTIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtaXMucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanMnKTtcbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///8812\n")},9108:function(module){"use strict";eval("\n\nfunction shallowEqualObjects(objA, objB) {\n if (objA === objB) {\n return true;\n }\n\n if (!objA || !objB) {\n return false;\n }\n\n var aKeys = Object.keys(objA);\n var bKeys = Object.keys(objB);\n var len = aKeys.length;\n\n if (bKeys.length !== len) {\n return false;\n }\n\n for (var i = 0; i < len; i++) {\n var key = aKeys[i];\n\n if (objA[key] !== objB[key] || !Object.prototype.hasOwnProperty.call(objB, key)) {\n return false;\n }\n }\n\n return true;\n}\n\nmodule.exports = shallowEqualObjects;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9zaGFsbG93LWVxdWFsL29iamVjdHMvaW5kZXguanM/MzYxMSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxpQkFBaUIsU0FBUztBQUMxQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBIiwiZmlsZSI6IjkxMDguanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIHNoYWxsb3dFcXVhbE9iamVjdHMob2JqQSwgb2JqQikge1xuICBpZiAob2JqQSA9PT0gb2JqQikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKCFvYmpBIHx8ICFvYmpCKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGFLZXlzID0gT2JqZWN0LmtleXMob2JqQSk7XG4gIHZhciBiS2V5cyA9IE9iamVjdC5rZXlzKG9iakIpO1xuICB2YXIgbGVuID0gYUtleXMubGVuZ3RoO1xuXG4gIGlmIChiS2V5cy5sZW5ndGggIT09IGxlbikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIga2V5ID0gYUtleXNbaV07XG5cbiAgICBpZiAob2JqQVtrZXldICE9PSBvYmpCW2tleV0gfHwgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmpCLCBrZXkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2hhbGxvd0VxdWFsT2JqZWN0czsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///9108\n")},8037:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('var __webpack_unused_export__;\n\n\nvar _interopRequireDefault = __webpack_require__(5318);\n\n__webpack_unused_export__ = true;\nexports.dq = withPrefix;\nexports.mc = withAssetPrefix;\nexports.c4 = exports.ZP = void 0;\n\nvar _objectWithoutPropertiesLoose2 = _interopRequireDefault(__webpack_require__(7316));\n\nvar _assertThisInitialized2 = _interopRequireDefault(__webpack_require__(1506));\n\nvar _inheritsLoose2 = _interopRequireDefault(__webpack_require__(5354));\n\nvar _extends2 = _interopRequireDefault(__webpack_require__(7154));\n\nvar _propTypes = _interopRequireDefault(__webpack_require__(5697));\n\nvar _react = _interopRequireDefault(__webpack_require__(7294));\n\nvar _reachRouter = __webpack_require__(9499);\n\nvar _utils = __webpack_require__(2098);\n\nvar _parsePath = __webpack_require__(1752);\n\nexports.cP = _parsePath.parsePath;\nvar _excluded = ["to", "getProps", "onClick", "onMouseEnter", "activeClassName", "activeStyle", "innerRef", "partiallyActive", "state", "replace", "_location"];\n\nvar isAbsolutePath = function isAbsolutePath(path) {\n return path === null || path === void 0 ? void 0 : path.startsWith("/");\n};\n\nfunction withPrefix(path, prefix) {\n var _ref, _prefix;\n\n if (prefix === void 0) {\n prefix = getGlobalBasePrefix();\n }\n\n if (!isLocalLink(path)) {\n return path;\n }\n\n if (path.startsWith("./") || path.startsWith("../")) {\n return path;\n }\n\n var base = (_ref = (_prefix = prefix) !== null && _prefix !== void 0 ? _prefix : getGlobalPathPrefix()) !== null && _ref !== void 0 ? _ref : "/";\n return "" + (base !== null && base !== void 0 && base.endsWith("/") ? base.slice(0, -1) : base) + (path.startsWith("/") ? path : "/" + path);\n} // These global values are wrapped in typeof clauses to ensure the values exist.\n// This is especially problematic in unit testing of this component.\n\n\nvar getGlobalPathPrefix = function getGlobalPathPrefix() {\n return false ? 0 : "/justice40-tool/63e863";\n};\n\nvar getGlobalBasePrefix = function getGlobalBasePrefix() {\n return false ? 0 : "/justice40-tool/63e863";\n};\n\nvar isLocalLink = function isLocalLink(path) {\n return path && !path.startsWith("http://") && !path.startsWith("https://") && !path.startsWith("//");\n};\n\nfunction withAssetPrefix(path) {\n return withPrefix(path, getGlobalPathPrefix());\n}\n\nfunction absolutify(path, current) {\n // If it\'s already absolute, return as-is\n if (isAbsolutePath(path)) {\n return path;\n }\n\n return (0, _utils.resolve)(path, current);\n}\n\nvar rewriteLinkPath = function rewriteLinkPath(path, relativeTo) {\n if (typeof path === "number") {\n return path;\n }\n\n if (!isLocalLink(path)) {\n return path;\n }\n\n return isAbsolutePath(path) ? withPrefix(path) : absolutify(path, relativeTo);\n};\n\nvar NavLinkPropTypes = {\n activeClassName: _propTypes.default.string,\n activeStyle: _propTypes.default.object,\n partiallyActive: _propTypes.default.bool\n}; // Set up IntersectionObserver\n\nvar createIntersectionObserver = function createIntersectionObserver(el, cb) {\n var io = new window.IntersectionObserver(function (entries) {\n entries.forEach(function (entry) {\n if (el === entry.target) {\n // Check if element is within viewport, remove listener, destroy observer, and run link callback.\n // MSEdge doesn\'t currently support isIntersecting, so also test for an intersectionRatio > 0\n if (entry.isIntersecting || entry.intersectionRatio > 0) {\n io.unobserve(el);\n io.disconnect();\n cb();\n }\n }\n });\n }); // Add element to the observer\n\n io.observe(el);\n return {\n instance: io,\n el: el\n };\n};\n\nfunction GatsbyLinkLocationWrapper(props) {\n return /*#__PURE__*/_react.default.createElement(_reachRouter.Location, null, function (_ref2) {\n var location = _ref2.location;\n return /*#__PURE__*/_react.default.createElement(GatsbyLink, (0, _extends2.default)({}, props, {\n _location: location\n }));\n });\n}\n\nvar GatsbyLink = /*#__PURE__*/function (_React$Component) {\n (0, _inheritsLoose2.default)(GatsbyLink, _React$Component);\n\n function GatsbyLink(props) {\n var _this;\n\n _this = _React$Component.call(this, props) || this; // Default to no support for IntersectionObserver\n\n _this.defaultGetProps = function (_ref3) {\n var isPartiallyCurrent = _ref3.isPartiallyCurrent,\n isCurrent = _ref3.isCurrent;\n\n if (_this.props.partiallyActive ? isPartiallyCurrent : isCurrent) {\n return {\n className: [_this.props.className, _this.props.activeClassName].filter(Boolean).join(" "),\n style: (0, _extends2.default)({}, _this.props.style, _this.props.activeStyle)\n };\n }\n\n return null;\n };\n\n var IOSupported = false;\n\n if (typeof window !== "undefined" && window.IntersectionObserver) {\n IOSupported = true;\n }\n\n _this.state = {\n IOSupported: IOSupported\n };\n _this.handleRef = _this.handleRef.bind((0, _assertThisInitialized2.default)(_this));\n return _this;\n }\n\n var _proto = GatsbyLink.prototype;\n\n _proto._prefetch = function _prefetch() {\n var currentPath = window.location.pathname; // reach router should have the correct state\n\n if (this.props._location && this.props._location.pathname) {\n currentPath = this.props._location.pathname;\n }\n\n var rewrittenPath = rewriteLinkPath(this.props.to, currentPath);\n var newPathName = (0, _parsePath.parsePath)(rewrittenPath).pathname; // Prefech is used to speed up next navigations. When you use it on the current navigation,\n // there could be a race-condition where Chrome uses the stale data instead of waiting for the network to complete\n\n if (currentPath !== newPathName) {\n ___loader.enqueue(newPathName);\n }\n };\n\n _proto.componentDidUpdate = function componentDidUpdate(prevProps, prevState) {\n // Preserve non IO functionality if no support\n if (this.props.to !== prevProps.to && !this.state.IOSupported) {\n this._prefetch();\n }\n };\n\n _proto.componentDidMount = function componentDidMount() {\n // Preserve non IO functionality if no support\n if (!this.state.IOSupported) {\n this._prefetch();\n }\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n if (!this.io) {\n return;\n }\n\n var _this$io = this.io,\n instance = _this$io.instance,\n el = _this$io.el;\n instance.unobserve(el);\n instance.disconnect();\n };\n\n _proto.handleRef = function handleRef(ref) {\n var _this2 = this;\n\n if (this.props.innerRef && this.props.innerRef.hasOwnProperty("current")) {\n this.props.innerRef.current = ref;\n } else if (this.props.innerRef) {\n this.props.innerRef(ref);\n }\n\n if (this.state.IOSupported && ref) {\n // If IO supported and element reference found, setup Observer functionality\n this.io = createIntersectionObserver(ref, function () {\n _this2._prefetch();\n });\n }\n };\n\n _proto.render = function render() {\n var _this3 = this;\n\n var _this$props = this.props,\n to = _this$props.to,\n _this$props$getProps = _this$props.getProps,\n getProps = _this$props$getProps === void 0 ? this.defaultGetProps : _this$props$getProps,\n _onClick = _this$props.onClick,\n _onMouseEnter = _this$props.onMouseEnter,\n $activeClassName = _this$props.activeClassName,\n $activeStyle = _this$props.activeStyle,\n $innerRef = _this$props.innerRef,\n partiallyActive = _this$props.partiallyActive,\n state = _this$props.state,\n replace = _this$props.replace,\n _location = _this$props._location,\n rest = (0, _objectWithoutPropertiesLoose2.default)(_this$props, _excluded);\n\n if (false) {}\n\n var prefixedTo = rewriteLinkPath(to, _location.pathname);\n\n if (!isLocalLink(prefixedTo)) {\n return /*#__PURE__*/_react.default.createElement("a", (0, _extends2.default)({\n href: prefixedTo\n }, rest));\n }\n\n return /*#__PURE__*/_react.default.createElement(_reachRouter.Link, (0, _extends2.default)({\n to: prefixedTo,\n state: state,\n getProps: getProps,\n innerRef: this.handleRef,\n onMouseEnter: function onMouseEnter(e) {\n if (_onMouseEnter) {\n _onMouseEnter(e);\n }\n\n ___loader.hovering((0, _parsePath.parsePath)(prefixedTo).pathname);\n },\n onClick: function onClick(e) {\n if (_onClick) {\n _onClick(e);\n }\n\n if (e.button === 0 && // ignore right clicks\n !_this3.props.target && // let browser handle "target=_blank"\n !e.defaultPrevented && // onClick prevented default\n !e.metaKey && // ignore clicks with modifier keys...\n !e.altKey && !e.ctrlKey && !e.shiftKey) {\n e.preventDefault();\n var shouldReplace = replace;\n\n var isCurrent = encodeURI(prefixedTo) === _location.pathname;\n\n if (typeof replace !== "boolean" && isCurrent) {\n shouldReplace = true;\n } // Make sure the necessary scripts and data are\n // loaded before continuing.\n\n\n window.___navigate(prefixedTo, {\n state: state,\n replace: shouldReplace\n });\n }\n\n return true;\n }\n }, rest));\n };\n\n return GatsbyLink;\n}(_react.default.Component);\n\nGatsbyLink.propTypes = (0, _extends2.default)({}, NavLinkPropTypes, {\n onClick: _propTypes.default.func,\n to: _propTypes.default.string.isRequired,\n replace: _propTypes.default.bool,\n state: _propTypes.default.object\n});\n\nvar _default = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {\n return /*#__PURE__*/_react.default.createElement(GatsbyLinkLocationWrapper, (0, _extends2.default)({\n innerRef: ref\n }, props));\n});\n\nexports.ZP = _default;\n\nvar navigate = function navigate(to, options) {\n window.___navigate(rewriteLinkPath(to, window.location.pathname), options);\n};\n\nexports.c4 = navigate;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9nYXRzYnktbGluay9pbmRleC5qcz9mOTkwIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBYTs7QUFFYiw2QkFBNkIsbUJBQU8sQ0FBQyxJQUE4Qzs7QUFFbkYseUJBQWtCO0FBQ2xCLFVBQWtCO0FBQ2xCLFVBQXVCO0FBQ3ZCLFVBQWdCLEdBQUcsVUFBZTs7QUFFbEMsNERBQTRELG1CQUFPLENBQUMsSUFBcUQ7O0FBRXpILHFEQUFxRCxtQkFBTyxDQUFDLElBQThDOztBQUUzRyw2Q0FBNkMsbUJBQU8sQ0FBQyxJQUFzQzs7QUFFM0YsdUNBQXVDLG1CQUFPLENBQUMsSUFBZ0M7O0FBRS9FLHdDQUF3QyxtQkFBTyxDQUFDLElBQVk7O0FBRTVELG9DQUFvQyxtQkFBTyxDQUFDLElBQU87O0FBRW5ELG1CQUFtQixtQkFBTyxDQUFDLElBQXdCOztBQUVuRCxhQUFhLG1CQUFPLENBQUMsSUFBa0M7O0FBRXZELGlCQUFpQixtQkFBTyxDQUFDLElBQWM7O0FBRXZDLFVBQWlCO0FBQ2pCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7OztBQUdBO0FBQ0EsU0FBUyxNQUFxQyxHQUFHLENBQW9FLEdBQUcsd0JBQWU7QUFDdkk7O0FBRUE7QUFDQSxTQUFTLE1BQXFDLEdBQUcsQ0FBZ0UsR0FBRyx3QkFBYTtBQUNqSTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUcsRUFBRTs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMEZBQTBGO0FBQzFGO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsdURBQXVEOztBQUV2RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsK0NBQStDOztBQUUvQztBQUNBO0FBQ0E7O0FBRUE7QUFDQSx3RUFBd0U7QUFDeEU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsUUFBUSxLQUF5RCxFQUFFLEVBRTlEOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLFdBQVc7QUFDWDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQSxDQUFDOztBQUVELGdEQUFnRDtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7O0FBRUQsVUFBZTs7QUFFZjtBQUNBO0FBQ0E7O0FBRUEsVUFBZ0IiLCJmaWxlIjoiODAzNy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMud2l0aFByZWZpeCA9IHdpdGhQcmVmaXg7XG5leHBvcnRzLndpdGhBc3NldFByZWZpeCA9IHdpdGhBc3NldFByZWZpeDtcbmV4cG9ydHMubmF2aWdhdGUgPSBleHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2VcIikpO1xuXG52YXIgX2Fzc2VydFRoaXNJbml0aWFsaXplZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2Fzc2VydFRoaXNJbml0aWFsaXplZFwiKSk7XG5cbnZhciBfaW5oZXJpdHNMb29zZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzTG9vc2VcIikpO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIF9wcm9wVHlwZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJwcm9wLXR5cGVzXCIpKTtcblxudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9yZWFjaFJvdXRlciA9IHJlcXVpcmUoXCJAZ2F0c2J5anMvcmVhY2gtcm91dGVyXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIkBnYXRzYnlqcy9yZWFjaC1yb3V0ZXIvbGliL3V0aWxzXCIpO1xuXG52YXIgX3BhcnNlUGF0aCA9IHJlcXVpcmUoXCIuL3BhcnNlLXBhdGhcIik7XG5cbmV4cG9ydHMucGFyc2VQYXRoID0gX3BhcnNlUGF0aC5wYXJzZVBhdGg7XG52YXIgX2V4Y2x1ZGVkID0gW1widG9cIiwgXCJnZXRQcm9wc1wiLCBcIm9uQ2xpY2tcIiwgXCJvbk1vdXNlRW50ZXJcIiwgXCJhY3RpdmVDbGFzc05hbWVcIiwgXCJhY3RpdmVTdHlsZVwiLCBcImlubmVyUmVmXCIsIFwicGFydGlhbGx5QWN0aXZlXCIsIFwic3RhdGVcIiwgXCJyZXBsYWNlXCIsIFwiX2xvY2F0aW9uXCJdO1xuXG52YXIgaXNBYnNvbHV0ZVBhdGggPSBmdW5jdGlvbiBpc0Fic29sdXRlUGF0aChwYXRoKSB7XG4gIHJldHVybiBwYXRoID09PSBudWxsIHx8IHBhdGggPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhdGguc3RhcnRzV2l0aChcIi9cIik7XG59O1xuXG5mdW5jdGlvbiB3aXRoUHJlZml4KHBhdGgsIHByZWZpeCkge1xuICB2YXIgX3JlZiwgX3ByZWZpeDtcblxuICBpZiAocHJlZml4ID09PSB2b2lkIDApIHtcbiAgICBwcmVmaXggPSBnZXRHbG9iYWxCYXNlUHJlZml4KCk7XG4gIH1cblxuICBpZiAoIWlzTG9jYWxMaW5rKHBhdGgpKSB7XG4gICAgcmV0dXJuIHBhdGg7XG4gIH1cblxuICBpZiAocGF0aC5zdGFydHNXaXRoKFwiLi9cIikgfHwgcGF0aC5zdGFydHNXaXRoKFwiLi4vXCIpKSB7XG4gICAgcmV0dXJuIHBhdGg7XG4gIH1cblxuICB2YXIgYmFzZSA9IChfcmVmID0gKF9wcmVmaXggPSBwcmVmaXgpICE9PSBudWxsICYmIF9wcmVmaXggIT09IHZvaWQgMCA/IF9wcmVmaXggOiBnZXRHbG9iYWxQYXRoUHJlZml4KCkpICE9PSBudWxsICYmIF9yZWYgIT09IHZvaWQgMCA/IF9yZWYgOiBcIi9cIjtcbiAgcmV0dXJuIFwiXCIgKyAoYmFzZSAhPT0gbnVsbCAmJiBiYXNlICE9PSB2b2lkIDAgJiYgYmFzZS5lbmRzV2l0aChcIi9cIikgPyBiYXNlLnNsaWNlKDAsIC0xKSA6IGJhc2UpICsgKHBhdGguc3RhcnRzV2l0aChcIi9cIikgPyBwYXRoIDogXCIvXCIgKyBwYXRoKTtcbn0gLy8gVGhlc2UgZ2xvYmFsIHZhbHVlcyBhcmUgd3JhcHBlZCBpbiB0eXBlb2YgY2xhdXNlcyB0byBlbnN1cmUgdGhlIHZhbHVlcyBleGlzdC5cbi8vIFRoaXMgaXMgZXNwZWNpYWxseSBwcm9ibGVtYXRpYyBpbiB1bml0IHRlc3Rpbmcgb2YgdGhpcyBjb21wb25lbnQuXG5cblxudmFyIGdldEdsb2JhbFBhdGhQcmVmaXggPSBmdW5jdGlvbiBnZXRHbG9iYWxQYXRoUHJlZml4KCkge1xuICByZXR1cm4gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gdHlwZW9mIF9fUEFUSF9QUkVGSVhfXyAhPT0gXCJ1bmRlZmluZWRcIiA/IF9fUEFUSF9QUkVGSVhfXyA6IHVuZGVmaW5lZCA6IF9fUEFUSF9QUkVGSVhfXztcbn07XG5cbnZhciBnZXRHbG9iYWxCYXNlUHJlZml4ID0gZnVuY3Rpb24gZ2V0R2xvYmFsQmFzZVByZWZpeCgpIHtcbiAgcmV0dXJuIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHR5cGVvZiBfX0JBU0VfUEFUSF9fICE9PSBcInVuZGVmaW5lZFwiID8gX19CQVNFX1BBVEhfXyA6IHVuZGVmaW5lZCA6IF9fQkFTRV9QQVRIX187XG59O1xuXG52YXIgaXNMb2NhbExpbmsgPSBmdW5jdGlvbiBpc0xvY2FsTGluayhwYXRoKSB7XG4gIHJldHVybiBwYXRoICYmICFwYXRoLnN0YXJ0c1dpdGgoXCJodHRwOi8vXCIpICYmICFwYXRoLnN0YXJ0c1dpdGgoXCJodHRwczovL1wiKSAmJiAhcGF0aC5zdGFydHNXaXRoKFwiLy9cIik7XG59O1xuXG5mdW5jdGlvbiB3aXRoQXNzZXRQcmVmaXgocGF0aCkge1xuICByZXR1cm4gd2l0aFByZWZpeChwYXRoLCBnZXRHbG9iYWxQYXRoUHJlZml4KCkpO1xufVxuXG5mdW5jdGlvbiBhYnNvbHV0aWZ5KHBhdGgsIGN1cnJlbnQpIHtcbiAgLy8gSWYgaXQncyBhbHJlYWR5IGFic29sdXRlLCByZXR1cm4gYXMtaXNcbiAgaWYgKGlzQWJzb2x1dGVQYXRoKHBhdGgpKSB7XG4gICAgcmV0dXJuIHBhdGg7XG4gIH1cblxuICByZXR1cm4gKDAsIF91dGlscy5yZXNvbHZlKShwYXRoLCBjdXJyZW50KTtcbn1cblxudmFyIHJld3JpdGVMaW5rUGF0aCA9IGZ1bmN0aW9uIHJld3JpdGVMaW5rUGF0aChwYXRoLCByZWxhdGl2ZVRvKSB7XG4gIGlmICh0eXBlb2YgcGF0aCA9PT0gXCJudW1iZXJcIikge1xuICAgIHJldHVybiBwYXRoO1xuICB9XG5cbiAgaWYgKCFpc0xvY2FsTGluayhwYXRoKSkge1xuICAgIHJldHVybiBwYXRoO1xuICB9XG5cbiAgcmV0dXJuIGlzQWJzb2x1dGVQYXRoKHBhdGgpID8gd2l0aFByZWZpeChwYXRoKSA6IGFic29sdXRpZnkocGF0aCwgcmVsYXRpdmVUbyk7XG59O1xuXG52YXIgTmF2TGlua1Byb3BUeXBlcyA9IHtcbiAgYWN0aXZlQ2xhc3NOYW1lOiBfcHJvcFR5cGVzLmRlZmF1bHQuc3RyaW5nLFxuICBhY3RpdmVTdHlsZTogX3Byb3BUeXBlcy5kZWZhdWx0Lm9iamVjdCxcbiAgcGFydGlhbGx5QWN0aXZlOiBfcHJvcFR5cGVzLmRlZmF1bHQuYm9vbFxufTsgLy8gU2V0IHVwIEludGVyc2VjdGlvbk9ic2VydmVyXG5cbnZhciBjcmVhdGVJbnRlcnNlY3Rpb25PYnNlcnZlciA9IGZ1bmN0aW9uIGNyZWF0ZUludGVyc2VjdGlvbk9ic2VydmVyKGVsLCBjYikge1xuICB2YXIgaW8gPSBuZXcgd2luZG93LkludGVyc2VjdGlvbk9ic2VydmVyKGZ1bmN0aW9uIChlbnRyaWVzKSB7XG4gICAgZW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgaWYgKGVsID09PSBlbnRyeS50YXJnZXQpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgZWxlbWVudCBpcyB3aXRoaW4gdmlld3BvcnQsIHJlbW92ZSBsaXN0ZW5lciwgZGVzdHJveSBvYnNlcnZlciwgYW5kIHJ1biBsaW5rIGNhbGxiYWNrLlxuICAgICAgICAvLyBNU0VkZ2UgZG9lc24ndCBjdXJyZW50bHkgc3VwcG9ydCBpc0ludGVyc2VjdGluZywgc28gYWxzbyB0ZXN0IGZvciAgYW4gaW50ZXJzZWN0aW9uUmF0aW8gPiAwXG4gICAgICAgIGlmIChlbnRyeS5pc0ludGVyc2VjdGluZyB8fCBlbnRyeS5pbnRlcnNlY3Rpb25SYXRpbyA+IDApIHtcbiAgICAgICAgICBpby51bm9ic2VydmUoZWwpO1xuICAgICAgICAgIGlvLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICBjYigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH0pOyAvLyBBZGQgZWxlbWVudCB0byB0aGUgb2JzZXJ2ZXJcblxuICBpby5vYnNlcnZlKGVsKTtcbiAgcmV0dXJuIHtcbiAgICBpbnN0YW5jZTogaW8sXG4gICAgZWw6IGVsXG4gIH07XG59O1xuXG5mdW5jdGlvbiBHYXRzYnlMaW5rTG9jYXRpb25XcmFwcGVyKHByb3BzKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChfcmVhY2hSb3V0ZXIuTG9jYXRpb24sIG51bGwsIGZ1bmN0aW9uIChfcmVmMikge1xuICAgIHZhciBsb2NhdGlvbiA9IF9yZWYyLmxvY2F0aW9uO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChHYXRzYnlMaW5rLCAoMCwgX2V4dGVuZHMyLmRlZmF1bHQpKHt9LCBwcm9wcywge1xuICAgICAgX2xvY2F0aW9uOiBsb2NhdGlvblxuICAgIH0pKTtcbiAgfSk7XG59XG5cbnZhciBHYXRzYnlMaW5rID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHNMb29zZTIuZGVmYXVsdCkoR2F0c2J5TGluaywgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gR2F0c2J5TGluayhwcm9wcykge1xuICAgIHZhciBfdGhpcztcblxuICAgIF90aGlzID0gX1JlYWN0JENvbXBvbmVudC5jYWxsKHRoaXMsIHByb3BzKSB8fCB0aGlzOyAvLyBEZWZhdWx0IHRvIG5vIHN1cHBvcnQgZm9yIEludGVyc2VjdGlvbk9ic2VydmVyXG5cbiAgICBfdGhpcy5kZWZhdWx0R2V0UHJvcHMgPSBmdW5jdGlvbiAoX3JlZjMpIHtcbiAgICAgIHZhciBpc1BhcnRpYWxseUN1cnJlbnQgPSBfcmVmMy5pc1BhcnRpYWxseUN1cnJlbnQsXG4gICAgICAgICAgaXNDdXJyZW50ID0gX3JlZjMuaXNDdXJyZW50O1xuXG4gICAgICBpZiAoX3RoaXMucHJvcHMucGFydGlhbGx5QWN0aXZlID8gaXNQYXJ0aWFsbHlDdXJyZW50IDogaXNDdXJyZW50KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBbX3RoaXMucHJvcHMuY2xhc3NOYW1lLCBfdGhpcy5wcm9wcy5hY3RpdmVDbGFzc05hbWVdLmZpbHRlcihCb29sZWFuKS5qb2luKFwiIFwiKSxcbiAgICAgICAgICBzdHlsZTogKDAsIF9leHRlbmRzMi5kZWZhdWx0KSh7fSwgX3RoaXMucHJvcHMuc3R5bGUsIF90aGlzLnByb3BzLmFjdGl2ZVN0eWxlKVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuXG4gICAgdmFyIElPU3VwcG9ydGVkID0gZmFsc2U7XG5cbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB3aW5kb3cuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIpIHtcbiAgICAgIElPU3VwcG9ydGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIElPU3VwcG9ydGVkOiBJT1N1cHBvcnRlZFxuICAgIH07XG4gICAgX3RoaXMuaGFuZGxlUmVmID0gX3RoaXMuaGFuZGxlUmVmLmJpbmQoKDAsIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQyLmRlZmF1bHQpKF90aGlzKSk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IEdhdHNieUxpbmsucHJvdG90eXBlO1xuXG4gIF9wcm90by5fcHJlZmV0Y2ggPSBmdW5jdGlvbiBfcHJlZmV0Y2goKSB7XG4gICAgdmFyIGN1cnJlbnRQYXRoID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lOyAvLyByZWFjaCByb3V0ZXIgc2hvdWxkIGhhdmUgdGhlIGNvcnJlY3Qgc3RhdGVcblxuICAgIGlmICh0aGlzLnByb3BzLl9sb2NhdGlvbiAmJiB0aGlzLnByb3BzLl9sb2NhdGlvbi5wYXRobmFtZSkge1xuICAgICAgY3VycmVudFBhdGggPSB0aGlzLnByb3BzLl9sb2NhdGlvbi5wYXRobmFtZTtcbiAgICB9XG5cbiAgICB2YXIgcmV3cml0dGVuUGF0aCA9IHJld3JpdGVMaW5rUGF0aCh0aGlzLnByb3BzLnRvLCBjdXJyZW50UGF0aCk7XG4gICAgdmFyIG5ld1BhdGhOYW1lID0gKDAsIF9wYXJzZVBhdGgucGFyc2VQYXRoKShyZXdyaXR0ZW5QYXRoKS5wYXRobmFtZTsgLy8gUHJlZmVjaCBpcyB1c2VkIHRvIHNwZWVkIHVwIG5leHQgbmF2aWdhdGlvbnMuIFdoZW4geW91IHVzZSBpdCBvbiB0aGUgY3VycmVudCBuYXZpZ2F0aW9uLFxuICAgIC8vIHRoZXJlIGNvdWxkIGJlIGEgcmFjZS1jb25kaXRpb24gd2hlcmUgQ2hyb21lIHVzZXMgdGhlIHN0YWxlIGRhdGEgaW5zdGVhZCBvZiB3YWl0aW5nIGZvciB0aGUgbmV0d29yayB0byBjb21wbGV0ZVxuXG4gICAgaWYgKGN1cnJlbnRQYXRoICE9PSBuZXdQYXRoTmFtZSkge1xuICAgICAgX19fbG9hZGVyLmVucXVldWUobmV3UGF0aE5hbWUpO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uY29tcG9uZW50RGlkVXBkYXRlID0gZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgcHJldlN0YXRlKSB7XG4gICAgLy8gUHJlc2VydmUgbm9uIElPIGZ1bmN0aW9uYWxpdHkgaWYgbm8gc3VwcG9ydFxuICAgIGlmICh0aGlzLnByb3BzLnRvICE9PSBwcmV2UHJvcHMudG8gJiYgIXRoaXMuc3RhdGUuSU9TdXBwb3J0ZWQpIHtcbiAgICAgIHRoaXMuX3ByZWZldGNoKCk7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIC8vIFByZXNlcnZlIG5vbiBJTyBmdW5jdGlvbmFsaXR5IGlmIG5vIHN1cHBvcnRcbiAgICBpZiAoIXRoaXMuc3RhdGUuSU9TdXBwb3J0ZWQpIHtcbiAgICAgIHRoaXMuX3ByZWZldGNoKCk7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIGlmICghdGhpcy5pbykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBfdGhpcyRpbyA9IHRoaXMuaW8sXG4gICAgICAgIGluc3RhbmNlID0gX3RoaXMkaW8uaW5zdGFuY2UsXG4gICAgICAgIGVsID0gX3RoaXMkaW8uZWw7XG4gICAgaW5zdGFuY2UudW5vYnNlcnZlKGVsKTtcbiAgICBpbnN0YW5jZS5kaXNjb25uZWN0KCk7XG4gIH07XG5cbiAgX3Byb3RvLmhhbmRsZVJlZiA9IGZ1bmN0aW9uIGhhbmRsZVJlZihyZWYpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIGlmICh0aGlzLnByb3BzLmlubmVyUmVmICYmIHRoaXMucHJvcHMuaW5uZXJSZWYuaGFzT3duUHJvcGVydHkoXCJjdXJyZW50XCIpKSB7XG4gICAgICB0aGlzLnByb3BzLmlubmVyUmVmLmN1cnJlbnQgPSByZWY7XG4gICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLmlubmVyUmVmKSB7XG4gICAgICB0aGlzLnByb3BzLmlubmVyUmVmKHJlZik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhdGUuSU9TdXBwb3J0ZWQgJiYgcmVmKSB7XG4gICAgICAvLyBJZiBJTyBzdXBwb3J0ZWQgYW5kIGVsZW1lbnQgcmVmZXJlbmNlIGZvdW5kLCBzZXR1cCBPYnNlcnZlciBmdW5jdGlvbmFsaXR5XG4gICAgICB0aGlzLmlvID0gY3JlYXRlSW50ZXJzZWN0aW9uT2JzZXJ2ZXIocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMi5fcHJlZmV0Y2goKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8ucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgdmFyIF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgdG8gPSBfdGhpcyRwcm9wcy50byxcbiAgICAgICAgX3RoaXMkcHJvcHMkZ2V0UHJvcHMgPSBfdGhpcyRwcm9wcy5nZXRQcm9wcyxcbiAgICAgICAgZ2V0UHJvcHMgPSBfdGhpcyRwcm9wcyRnZXRQcm9wcyA9PT0gdm9pZCAwID8gdGhpcy5kZWZhdWx0R2V0UHJvcHMgOiBfdGhpcyRwcm9wcyRnZXRQcm9wcyxcbiAgICAgICAgX29uQ2xpY2sgPSBfdGhpcyRwcm9wcy5vbkNsaWNrLFxuICAgICAgICBfb25Nb3VzZUVudGVyID0gX3RoaXMkcHJvcHMub25Nb3VzZUVudGVyLFxuICAgICAgICAkYWN0aXZlQ2xhc3NOYW1lID0gX3RoaXMkcHJvcHMuYWN0aXZlQ2xhc3NOYW1lLFxuICAgICAgICAkYWN0aXZlU3R5bGUgPSBfdGhpcyRwcm9wcy5hY3RpdmVTdHlsZSxcbiAgICAgICAgJGlubmVyUmVmID0gX3RoaXMkcHJvcHMuaW5uZXJSZWYsXG4gICAgICAgIHBhcnRpYWxseUFjdGl2ZSA9IF90aGlzJHByb3BzLnBhcnRpYWxseUFjdGl2ZSxcbiAgICAgICAgc3RhdGUgPSBfdGhpcyRwcm9wcy5zdGF0ZSxcbiAgICAgICAgcmVwbGFjZSA9IF90aGlzJHByb3BzLnJlcGxhY2UsXG4gICAgICAgIF9sb2NhdGlvbiA9IF90aGlzJHByb3BzLl9sb2NhdGlvbixcbiAgICAgICAgcmVzdCA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZTIuZGVmYXVsdCkoX3RoaXMkcHJvcHMsIF9leGNsdWRlZCk7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmICFpc0xvY2FsTGluayh0bykpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIkV4dGVybmFsIGxpbmsgXCIgKyB0byArIFwiIHdhcyBkZXRlY3RlZCBpbiBhIExpbmsgY29tcG9uZW50LiBVc2UgdGhlIExpbmsgY29tcG9uZW50IG9ubHkgZm9yIGludGVybmFsIGxpbmtzLiBTZWU6IGh0dHBzOi8vZ2F0c2J5LmRldi9pbnRlcm5hbC1saW5rc1wiKTtcbiAgICB9XG5cbiAgICB2YXIgcHJlZml4ZWRUbyA9IHJld3JpdGVMaW5rUGF0aCh0bywgX2xvY2F0aW9uLnBhdGhuYW1lKTtcblxuICAgIGlmICghaXNMb2NhbExpbmsocHJlZml4ZWRUbykpIHtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImFcIiwgKDAsIF9leHRlbmRzMi5kZWZhdWx0KSh7XG4gICAgICAgIGhyZWY6IHByZWZpeGVkVG9cbiAgICAgIH0sIHJlc3QpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gLyojX19QVVJFX18qL19yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoX3JlYWNoUm91dGVyLkxpbmssICgwLCBfZXh0ZW5kczIuZGVmYXVsdCkoe1xuICAgICAgdG86IHByZWZpeGVkVG8sXG4gICAgICBzdGF0ZTogc3RhdGUsXG4gICAgICBnZXRQcm9wczogZ2V0UHJvcHMsXG4gICAgICBpbm5lclJlZjogdGhpcy5oYW5kbGVSZWYsXG4gICAgICBvbk1vdXNlRW50ZXI6IGZ1bmN0aW9uIG9uTW91c2VFbnRlcihlKSB7XG4gICAgICAgIGlmIChfb25Nb3VzZUVudGVyKSB7XG4gICAgICAgICAgX29uTW91c2VFbnRlcihlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIF9fX2xvYWRlci5ob3ZlcmluZygoMCwgX3BhcnNlUGF0aC5wYXJzZVBhdGgpKHByZWZpeGVkVG8pLnBhdGhuYW1lKTtcbiAgICAgIH0sXG4gICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKGUpIHtcbiAgICAgICAgaWYgKF9vbkNsaWNrKSB7XG4gICAgICAgICAgX29uQ2xpY2soZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZS5idXR0b24gPT09IDAgJiYgLy8gaWdub3JlIHJpZ2h0IGNsaWNrc1xuICAgICAgICAhX3RoaXMzLnByb3BzLnRhcmdldCAmJiAvLyBsZXQgYnJvd3NlciBoYW5kbGUgXCJ0YXJnZXQ9X2JsYW5rXCJcbiAgICAgICAgIWUuZGVmYXVsdFByZXZlbnRlZCAmJiAvLyBvbkNsaWNrIHByZXZlbnRlZCBkZWZhdWx0XG4gICAgICAgICFlLm1ldGFLZXkgJiYgLy8gaWdub3JlIGNsaWNrcyB3aXRoIG1vZGlmaWVyIGtleXMuLi5cbiAgICAgICAgIWUuYWx0S2V5ICYmICFlLmN0cmxLZXkgJiYgIWUuc2hpZnRLZXkpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgdmFyIHNob3VsZFJlcGxhY2UgPSByZXBsYWNlO1xuXG4gICAgICAgICAgdmFyIGlzQ3VycmVudCA9IGVuY29kZVVSSShwcmVmaXhlZFRvKSA9PT0gX2xvY2F0aW9uLnBhdGhuYW1lO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiByZXBsYWNlICE9PSBcImJvb2xlYW5cIiAmJiBpc0N1cnJlbnQpIHtcbiAgICAgICAgICAgIHNob3VsZFJlcGxhY2UgPSB0cnVlO1xuICAgICAgICAgIH0gLy8gTWFrZSBzdXJlIHRoZSBuZWNlc3Nhcnkgc2NyaXB0cyBhbmQgZGF0YSBhcmVcbiAgICAgICAgICAvLyBsb2FkZWQgYmVmb3JlIGNvbnRpbnVpbmcuXG5cblxuICAgICAgICAgIHdpbmRvdy5fX19uYXZpZ2F0ZShwcmVmaXhlZFRvLCB7XG4gICAgICAgICAgICBzdGF0ZTogc3RhdGUsXG4gICAgICAgICAgICByZXBsYWNlOiBzaG91bGRSZXBsYWNlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9LCByZXN0KSk7XG4gIH07XG5cbiAgcmV0dXJuIEdhdHNieUxpbms7XG59KF9yZWFjdC5kZWZhdWx0LkNvbXBvbmVudCk7XG5cbkdhdHNieUxpbmsucHJvcFR5cGVzID0gKDAsIF9leHRlbmRzMi5kZWZhdWx0KSh7fSwgTmF2TGlua1Byb3BUeXBlcywge1xuICBvbkNsaWNrOiBfcHJvcFR5cGVzLmRlZmF1bHQuZnVuYyxcbiAgdG86IF9wcm9wVHlwZXMuZGVmYXVsdC5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgcmVwbGFjZTogX3Byb3BUeXBlcy5kZWZhdWx0LmJvb2wsXG4gIHN0YXRlOiBfcHJvcFR5cGVzLmRlZmF1bHQub2JqZWN0XG59KTtcblxudmFyIF9kZWZhdWx0ID0gLyojX19QVVJFX18qL19yZWFjdC5kZWZhdWx0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEdhdHNieUxpbmtMb2NhdGlvbldyYXBwZXIsICgwLCBfZXh0ZW5kczIuZGVmYXVsdCkoe1xuICAgIGlubmVyUmVmOiByZWZcbiAgfSwgcHJvcHMpKTtcbn0pO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDtcblxudmFyIG5hdmlnYXRlID0gZnVuY3Rpb24gbmF2aWdhdGUodG8sIG9wdGlvbnMpIHtcbiAgd2luZG93Ll9fX25hdmlnYXRlKHJld3JpdGVMaW5rUGF0aCh0bywgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lKSwgb3B0aW9ucyk7XG59O1xuXG5leHBvcnRzLm5hdmlnYXRlID0gbmF2aWdhdGU7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///8037\n')},1752:function(__unused_webpack_module,exports){"use strict";eval('\n\nexports.__esModule = true;\nexports.parsePath = parsePath;\n\nfunction parsePath(path) {\n var pathname = path || "/";\n var search = "";\n var hash = "";\n var hashIndex = pathname.indexOf("#");\n\n if (hashIndex !== -1) {\n hash = pathname.substr(hashIndex);\n pathname = pathname.substr(0, hashIndex);\n }\n\n var searchIndex = pathname.indexOf("?");\n\n if (searchIndex !== -1) {\n search = pathname.substr(searchIndex);\n pathname = pathname.substr(0, searchIndex);\n }\n\n return {\n pathname: pathname,\n search: search === "?" ? "" : search,\n hash: hash === "#" ? "" : hash\n };\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9nYXRzYnktbGluay9wYXJzZS1wYXRoLmpzPzcyZWUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsa0JBQWtCO0FBQ2xCLGlCQUFpQjs7QUFFakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiMTc1Mi5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5wYXJzZVBhdGggPSBwYXJzZVBhdGg7XG5cbmZ1bmN0aW9uIHBhcnNlUGF0aChwYXRoKSB7XG4gIHZhciBwYXRobmFtZSA9IHBhdGggfHwgXCIvXCI7XG4gIHZhciBzZWFyY2ggPSBcIlwiO1xuICB2YXIgaGFzaCA9IFwiXCI7XG4gIHZhciBoYXNoSW5kZXggPSBwYXRobmFtZS5pbmRleE9mKFwiI1wiKTtcblxuICBpZiAoaGFzaEluZGV4ICE9PSAtMSkge1xuICAgIGhhc2ggPSBwYXRobmFtZS5zdWJzdHIoaGFzaEluZGV4KTtcbiAgICBwYXRobmFtZSA9IHBhdGhuYW1lLnN1YnN0cigwLCBoYXNoSW5kZXgpO1xuICB9XG5cbiAgdmFyIHNlYXJjaEluZGV4ID0gcGF0aG5hbWUuaW5kZXhPZihcIj9cIik7XG5cbiAgaWYgKHNlYXJjaEluZGV4ICE9PSAtMSkge1xuICAgIHNlYXJjaCA9IHBhdGhuYW1lLnN1YnN0cihzZWFyY2hJbmRleCk7XG4gICAgcGF0aG5hbWUgPSBwYXRobmFtZS5zdWJzdHIoMCwgc2VhcmNoSW5kZXgpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwYXRobmFtZTogcGF0aG5hbWUsXG4gICAgc2VhcmNoOiBzZWFyY2ggPT09IFwiP1wiID8gXCJcIiA6IHNlYXJjaCxcbiAgICBoYXNoOiBoYXNoID09PSBcIiNcIiA/IFwiXCIgOiBoYXNoXG4gIH07XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1752\n')},9679:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("var __webpack_unused_export__;\n\n\n__webpack_unused_export__ = true;\nexports.p2 = exports.$C = void 0;\n\nvar _scrollHandler = __webpack_require__(1432);\n\nexports.$C = _scrollHandler.ScrollHandler;\n\nvar _useScrollRestoration = __webpack_require__(4855);\n\nexports.p2 = _useScrollRestoration.useScrollRestoration;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9nYXRzYnktcmVhY3Qtcm91dGVyLXNjcm9sbC9pbmRleC5qcz9lZTEyIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBYTs7QUFFYix5QkFBa0I7QUFDbEIsVUFBNEIsR0FBRyxVQUFxQjs7QUFFcEQscUJBQXFCLG1CQUFPLENBQUMsSUFBa0I7O0FBRS9DLFVBQXFCOztBQUVyQiw0QkFBNEIsbUJBQU8sQ0FBQyxJQUEwQjs7QUFFOUQsVUFBNEIiLCJmaWxlIjoiOTY3OS5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy51c2VTY3JvbGxSZXN0b3JhdGlvbiA9IGV4cG9ydHMuU2Nyb2xsQ29udGV4dCA9IHZvaWQgMDtcblxudmFyIF9zY3JvbGxIYW5kbGVyID0gcmVxdWlyZShcIi4vc2Nyb2xsLWhhbmRsZXJcIik7XG5cbmV4cG9ydHMuU2Nyb2xsQ29udGV4dCA9IF9zY3JvbGxIYW5kbGVyLlNjcm9sbEhhbmRsZXI7XG5cbnZhciBfdXNlU2Nyb2xsUmVzdG9yYXRpb24gPSByZXF1aXJlKFwiLi91c2Utc2Nyb2xsLXJlc3RvcmF0aW9uXCIpO1xuXG5leHBvcnRzLnVzZVNjcm9sbFJlc3RvcmF0aW9uID0gX3VzZVNjcm9sbFJlc3RvcmF0aW9uLnVzZVNjcm9sbFJlc3RvcmF0aW9uOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///9679\n")},1432:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('\n\nvar _interopRequireDefault = __webpack_require__(5318);\n\nexports.__esModule = true;\nexports.ScrollHandler = exports.ScrollContext = void 0;\n\nvar _assertThisInitialized2 = _interopRequireDefault(__webpack_require__(1506));\n\nvar _inheritsLoose2 = _interopRequireDefault(__webpack_require__(5354));\n\nvar React = _interopRequireWildcard(__webpack_require__(7294));\n\nvar _propTypes = _interopRequireDefault(__webpack_require__(5697));\n\nvar _sessionStorage = __webpack_require__(1142);\n\nfunction _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }\n\nfunction _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nvar ScrollContext = /*#__PURE__*/React.createContext(new _sessionStorage.SessionStorage());\nexports.ScrollContext = ScrollContext;\nScrollContext.displayName = "GatsbyScrollContext";\n\nvar ScrollHandler = /*#__PURE__*/function (_React$Component) {\n (0, _inheritsLoose2.default)(ScrollHandler, _React$Component);\n\n function ScrollHandler() {\n var _this;\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n _this._stateStorage = new _sessionStorage.SessionStorage();\n _this._isTicking = false;\n _this._latestKnownScrollY = 0;\n\n _this.scrollListener = function () {\n _this._latestKnownScrollY = window.scrollY;\n\n if (!_this._isTicking) {\n _this._isTicking = true;\n requestAnimationFrame(_this._saveScroll.bind((0, _assertThisInitialized2.default)(_this)));\n }\n };\n\n _this.windowScroll = function (position, prevProps) {\n if (_this.shouldUpdateScroll(prevProps, _this.props)) {\n window.scrollTo(0, position);\n }\n };\n\n _this.scrollToHash = function (hash, prevProps) {\n var node = document.getElementById(hash.substring(1));\n\n if (node && _this.shouldUpdateScroll(prevProps, _this.props)) {\n node.scrollIntoView();\n }\n };\n\n _this.shouldUpdateScroll = function (prevRouterProps, routerProps) {\n var shouldUpdateScroll = _this.props.shouldUpdateScroll;\n\n if (!shouldUpdateScroll) {\n return true;\n } // Hack to allow accessing this._stateStorage.\n\n\n return shouldUpdateScroll.call((0, _assertThisInitialized2.default)(_this), prevRouterProps, routerProps);\n };\n\n return _this;\n }\n\n var _proto = ScrollHandler.prototype;\n\n _proto._saveScroll = function _saveScroll() {\n var key = this.props.location.key || null;\n\n if (key) {\n this._stateStorage.save(this.props.location, key, this._latestKnownScrollY);\n }\n\n this._isTicking = false;\n };\n\n _proto.componentDidMount = function componentDidMount() {\n window.addEventListener("scroll", this.scrollListener);\n var scrollPosition;\n var _this$props$location = this.props.location,\n key = _this$props$location.key,\n hash = _this$props$location.hash;\n\n if (key) {\n scrollPosition = this._stateStorage.read(this.props.location, key);\n }\n\n if (scrollPosition) {\n this.windowScroll(scrollPosition, undefined);\n } else if (hash) {\n this.scrollToHash(decodeURI(hash), undefined);\n }\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n window.removeEventListener("scroll", this.scrollListener);\n };\n\n _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n var _this$props$location2 = this.props.location,\n hash = _this$props$location2.hash,\n key = _this$props$location2.key;\n var scrollPosition;\n\n if (key) {\n scrollPosition = this._stateStorage.read(this.props.location, key);\n }\n /** There are two pieces of state: the browser url and\n * history state which keeps track of scroll position\n * Native behaviour prescribes that we ought to restore scroll position\n * when a user navigates back in their browser (this is the `POP` action)\n * Currently, reach router has a bug that prevents this at https://github.com/reach/router/issues/228\n * So we _always_ stick to the url as a source of truth — if the url\n * contains a hash, we scroll to it\n */\n\n\n if (hash) {\n this.scrollToHash(decodeURI(hash), prevProps);\n } else {\n this.windowScroll(scrollPosition, prevProps);\n }\n };\n\n _proto.render = function render() {\n return /*#__PURE__*/React.createElement(ScrollContext.Provider, {\n value: this._stateStorage\n }, this.props.children);\n };\n\n return ScrollHandler;\n}(React.Component);\n\nexports.ScrollHandler = ScrollHandler;\nScrollHandler.propTypes = {\n shouldUpdateScroll: _propTypes.default.func,\n children: _propTypes.default.element.isRequired,\n location: _propTypes.default.object.isRequired\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9nYXRzYnktcmVhY3Qtcm91dGVyLXNjcm9sbC9zY3JvbGwtaGFuZGxlci5qcz8xMjdjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViLDZCQUE2QixtQkFBTyxDQUFDLElBQThDOztBQUVuRixrQkFBa0I7QUFDbEIscUJBQXFCLEdBQUcscUJBQXFCOztBQUU3QyxxREFBcUQsbUJBQU8sQ0FBQyxJQUE4Qzs7QUFFM0csNkNBQTZDLG1CQUFPLENBQUMsSUFBc0M7O0FBRTNGLG9DQUFvQyxtQkFBTyxDQUFDLElBQU87O0FBRW5ELHdDQUF3QyxtQkFBTyxDQUFDLElBQVk7O0FBRTVELHNCQUFzQixtQkFBTyxDQUFDLElBQW1COztBQUVqRCxnREFBZ0QsZ0RBQWdELHVDQUF1QyxzQ0FBc0Msb0ZBQW9GLDJEQUEyRCxFQUFFLGVBQWU7O0FBRTdVLG9EQUFvRCw2Q0FBNkMsWUFBWSxFQUFFLDRFQUE0RSxTQUFTLGdCQUFnQixFQUFFLG1EQUFtRCwrQkFBK0IsdUJBQXVCLEVBQUUsaUJBQWlCLHNGQUFzRix1QkFBdUIsMkVBQTJFLHFGQUFxRixzQ0FBc0MsMENBQTBDLEVBQUUsT0FBTyx3QkFBd0IsRUFBRSxFQUFFLEVBQUUsc0JBQXNCLGFBQWEsd0JBQXdCLEVBQUUsZUFBZTs7QUFFbHlCO0FBQ0EscUJBQXFCO0FBQ3JCOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSx1RUFBdUUsYUFBYTtBQUNwRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQSxDQUFDOztBQUVELHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjE0MzIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLlNjcm9sbEhhbmRsZXIgPSBleHBvcnRzLlNjcm9sbENvbnRleHQgPSB2b2lkIDA7XG5cbnZhciBfYXNzZXJ0VGhpc0luaXRpYWxpemVkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXNzZXJ0VGhpc0luaXRpYWxpemVkXCIpKTtcblxudmFyIF9pbmhlcml0c0xvb3NlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNMb29zZVwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfcHJvcFR5cGVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicHJvcC10eXBlc1wiKSk7XG5cbnZhciBfc2Vzc2lvblN0b3JhZ2UgPSByZXF1aXJlKFwiLi9zZXNzaW9uLXN0b3JhZ2VcIik7XG5cbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShub2RlSW50ZXJvcCkgeyBpZiAodHlwZW9mIFdlYWtNYXAgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG51bGw7IHZhciBjYWNoZUJhYmVsSW50ZXJvcCA9IG5ldyBXZWFrTWFwKCk7IHZhciBjYWNoZU5vZGVJbnRlcm9wID0gbmV3IFdlYWtNYXAoKTsgcmV0dXJuIChfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApIHsgcmV0dXJuIG5vZGVJbnRlcm9wID8gY2FjaGVOb2RlSW50ZXJvcCA6IGNhY2hlQmFiZWxJbnRlcm9wOyB9KShub2RlSW50ZXJvcCk7IH1cblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqLCBub2RlSW50ZXJvcCkgeyBpZiAoIW5vZGVJbnRlcm9wICYmIG9iaiAmJiBvYmouX19lc01vZHVsZSkgeyByZXR1cm4gb2JqOyB9IGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygb2JqICE9PSBcImZ1bmN0aW9uXCIpIHsgcmV0dXJuIHsgZGVmYXVsdDogb2JqIH07IH0gdmFyIGNhY2hlID0gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKG5vZGVJbnRlcm9wKTsgaWYgKGNhY2hlICYmIGNhY2hlLmhhcyhvYmopKSB7IHJldHVybiBjYWNoZS5nZXQob2JqKTsgfSB2YXIgbmV3T2JqID0ge307IHZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoa2V5ICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7IHZhciBkZXNjID0gaGFzUHJvcGVydHlEZXNjcmlwdG9yID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSkgOiBudWxsOyBpZiAoZGVzYyAmJiAoZGVzYy5nZXQgfHwgZGVzYy5zZXQpKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdPYmosIGtleSwgZGVzYyk7IH0gZWxzZSB7IG5ld09ialtrZXldID0gb2JqW2tleV07IH0gfSB9IG5ld09iai5kZWZhdWx0ID0gb2JqOyBpZiAoY2FjaGUpIHsgY2FjaGUuc2V0KG9iaiwgbmV3T2JqKTsgfSByZXR1cm4gbmV3T2JqOyB9XG5cbnZhciBTY3JvbGxDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQobmV3IF9zZXNzaW9uU3RvcmFnZS5TZXNzaW9uU3RvcmFnZSgpKTtcbmV4cG9ydHMuU2Nyb2xsQ29udGV4dCA9IFNjcm9sbENvbnRleHQ7XG5TY3JvbGxDb250ZXh0LmRpc3BsYXlOYW1lID0gXCJHYXRzYnlTY3JvbGxDb250ZXh0XCI7XG5cbnZhciBTY3JvbGxIYW5kbGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHNMb29zZTIuZGVmYXVsdCkoU2Nyb2xsSGFuZGxlciwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gU2Nyb2xsSGFuZGxlcigpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgX3RoaXMgPSBfUmVhY3QkQ29tcG9uZW50LmNhbGwuYXBwbHkoX1JlYWN0JENvbXBvbmVudCwgW3RoaXNdLmNvbmNhdChhcmdzKSkgfHwgdGhpcztcbiAgICBfdGhpcy5fc3RhdGVTdG9yYWdlID0gbmV3IF9zZXNzaW9uU3RvcmFnZS5TZXNzaW9uU3RvcmFnZSgpO1xuICAgIF90aGlzLl9pc1RpY2tpbmcgPSBmYWxzZTtcbiAgICBfdGhpcy5fbGF0ZXN0S25vd25TY3JvbGxZID0gMDtcblxuICAgIF90aGlzLnNjcm9sbExpc3RlbmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMuX2xhdGVzdEtub3duU2Nyb2xsWSA9IHdpbmRvdy5zY3JvbGxZO1xuXG4gICAgICBpZiAoIV90aGlzLl9pc1RpY2tpbmcpIHtcbiAgICAgICAgX3RoaXMuX2lzVGlja2luZyA9IHRydWU7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShfdGhpcy5fc2F2ZVNjcm9sbC5iaW5kKCgwLCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkMi5kZWZhdWx0KShfdGhpcykpKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMud2luZG93U2Nyb2xsID0gZnVuY3Rpb24gKHBvc2l0aW9uLCBwcmV2UHJvcHMpIHtcbiAgICAgIGlmIChfdGhpcy5zaG91bGRVcGRhdGVTY3JvbGwocHJldlByb3BzLCBfdGhpcy5wcm9wcykpIHtcbiAgICAgICAgd2luZG93LnNjcm9sbFRvKDAsIHBvc2l0aW9uKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuc2Nyb2xsVG9IYXNoID0gZnVuY3Rpb24gKGhhc2gsIHByZXZQcm9wcykge1xuICAgICAgdmFyIG5vZGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChoYXNoLnN1YnN0cmluZygxKSk7XG5cbiAgICAgIGlmIChub2RlICYmIF90aGlzLnNob3VsZFVwZGF0ZVNjcm9sbChwcmV2UHJvcHMsIF90aGlzLnByb3BzKSkge1xuICAgICAgICBub2RlLnNjcm9sbEludG9WaWV3KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLnNob3VsZFVwZGF0ZVNjcm9sbCA9IGZ1bmN0aW9uIChwcmV2Um91dGVyUHJvcHMsIHJvdXRlclByb3BzKSB7XG4gICAgICB2YXIgc2hvdWxkVXBkYXRlU2Nyb2xsID0gX3RoaXMucHJvcHMuc2hvdWxkVXBkYXRlU2Nyb2xsO1xuXG4gICAgICBpZiAoIXNob3VsZFVwZGF0ZVNjcm9sbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gLy8gSGFjayB0byBhbGxvdyBhY2Nlc3NpbmcgdGhpcy5fc3RhdGVTdG9yYWdlLlxuXG5cbiAgICAgIHJldHVybiBzaG91bGRVcGRhdGVTY3JvbGwuY2FsbCgoMCwgX2Fzc2VydFRoaXNJbml0aWFsaXplZDIuZGVmYXVsdCkoX3RoaXMpLCBwcmV2Um91dGVyUHJvcHMsIHJvdXRlclByb3BzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IFNjcm9sbEhhbmRsZXIucHJvdG90eXBlO1xuXG4gIF9wcm90by5fc2F2ZVNjcm9sbCA9IGZ1bmN0aW9uIF9zYXZlU2Nyb2xsKCkge1xuICAgIHZhciBrZXkgPSB0aGlzLnByb3BzLmxvY2F0aW9uLmtleSB8fCBudWxsO1xuXG4gICAgaWYgKGtleSkge1xuICAgICAgdGhpcy5fc3RhdGVTdG9yYWdlLnNhdmUodGhpcy5wcm9wcy5sb2NhdGlvbiwga2V5LCB0aGlzLl9sYXRlc3RLbm93blNjcm9sbFkpO1xuICAgIH1cblxuICAgIHRoaXMuX2lzVGlja2luZyA9IGZhbHNlO1xuICB9O1xuXG4gIF9wcm90by5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHRoaXMuc2Nyb2xsTGlzdGVuZXIpO1xuICAgIHZhciBzY3JvbGxQb3NpdGlvbjtcbiAgICB2YXIgX3RoaXMkcHJvcHMkbG9jYXRpb24gPSB0aGlzLnByb3BzLmxvY2F0aW9uLFxuICAgICAgICBrZXkgPSBfdGhpcyRwcm9wcyRsb2NhdGlvbi5rZXksXG4gICAgICAgIGhhc2ggPSBfdGhpcyRwcm9wcyRsb2NhdGlvbi5oYXNoO1xuXG4gICAgaWYgKGtleSkge1xuICAgICAgc2Nyb2xsUG9zaXRpb24gPSB0aGlzLl9zdGF0ZVN0b3JhZ2UucmVhZCh0aGlzLnByb3BzLmxvY2F0aW9uLCBrZXkpO1xuICAgIH1cblxuICAgIGlmIChzY3JvbGxQb3NpdGlvbikge1xuICAgICAgdGhpcy53aW5kb3dTY3JvbGwoc2Nyb2xsUG9zaXRpb24sIHVuZGVmaW5lZCk7XG4gICAgfSBlbHNlIGlmIChoYXNoKSB7XG4gICAgICB0aGlzLnNjcm9sbFRvSGFzaChkZWNvZGVVUkkoaGFzaCksIHVuZGVmaW5lZCk7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHRoaXMuc2Nyb2xsTGlzdGVuZXIpO1xuICB9O1xuXG4gIF9wcm90by5jb21wb25lbnREaWRVcGRhdGUgPSBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKSB7XG4gICAgdmFyIF90aGlzJHByb3BzJGxvY2F0aW9uMiA9IHRoaXMucHJvcHMubG9jYXRpb24sXG4gICAgICAgIGhhc2ggPSBfdGhpcyRwcm9wcyRsb2NhdGlvbjIuaGFzaCxcbiAgICAgICAga2V5ID0gX3RoaXMkcHJvcHMkbG9jYXRpb24yLmtleTtcbiAgICB2YXIgc2Nyb2xsUG9zaXRpb247XG5cbiAgICBpZiAoa2V5KSB7XG4gICAgICBzY3JvbGxQb3NpdGlvbiA9IHRoaXMuX3N0YXRlU3RvcmFnZS5yZWFkKHRoaXMucHJvcHMubG9jYXRpb24sIGtleSk7XG4gICAgfVxuICAgIC8qKiAgVGhlcmUgYXJlIHR3byBwaWVjZXMgb2Ygc3RhdGU6IHRoZSBicm93c2VyIHVybCBhbmRcbiAgICAgKiBoaXN0b3J5IHN0YXRlIHdoaWNoIGtlZXBzIHRyYWNrIG9mIHNjcm9sbCBwb3NpdGlvblxuICAgICAqIE5hdGl2ZSBiZWhhdmlvdXIgcHJlc2NyaWJlcyB0aGF0IHdlIG91Z2h0IHRvIHJlc3RvcmUgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICogd2hlbiBhIHVzZXIgbmF2aWdhdGVzIGJhY2sgaW4gdGhlaXIgYnJvd3NlciAodGhpcyBpcyB0aGUgYFBPUGAgYWN0aW9uKVxuICAgICAqIEN1cnJlbnRseSwgcmVhY2ggcm91dGVyIGhhcyBhIGJ1ZyB0aGF0IHByZXZlbnRzIHRoaXMgYXQgaHR0cHM6Ly9naXRodWIuY29tL3JlYWNoL3JvdXRlci9pc3N1ZXMvMjI4XG4gICAgICogU28gd2UgX2Fsd2F5c18gc3RpY2sgdG8gdGhlIHVybCBhcyBhIHNvdXJjZSBvZiB0cnV0aCDigJQgaWYgdGhlIHVybFxuICAgICAqIGNvbnRhaW5zIGEgaGFzaCwgd2Ugc2Nyb2xsIHRvIGl0XG4gICAgICovXG5cblxuICAgIGlmIChoYXNoKSB7XG4gICAgICB0aGlzLnNjcm9sbFRvSGFzaChkZWNvZGVVUkkoaGFzaCksIHByZXZQcm9wcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMud2luZG93U2Nyb2xsKHNjcm9sbFBvc2l0aW9uLCBwcmV2UHJvcHMpO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8ucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTY3JvbGxDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgICB2YWx1ZTogdGhpcy5fc3RhdGVTdG9yYWdlXG4gICAgfSwgdGhpcy5wcm9wcy5jaGlsZHJlbik7XG4gIH07XG5cbiAgcmV0dXJuIFNjcm9sbEhhbmRsZXI7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbmV4cG9ydHMuU2Nyb2xsSGFuZGxlciA9IFNjcm9sbEhhbmRsZXI7XG5TY3JvbGxIYW5kbGVyLnByb3BUeXBlcyA9IHtcbiAgc2hvdWxkVXBkYXRlU2Nyb2xsOiBfcHJvcFR5cGVzLmRlZmF1bHQuZnVuYyxcbiAgY2hpbGRyZW46IF9wcm9wVHlwZXMuZGVmYXVsdC5lbGVtZW50LmlzUmVxdWlyZWQsXG4gIGxvY2F0aW9uOiBfcHJvcFR5cGVzLmRlZmF1bHQub2JqZWN0LmlzUmVxdWlyZWRcbn07Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1432\n')},1142:function(__unused_webpack_module,exports){"use strict";eval('\n\nexports.__esModule = true;\nexports.SessionStorage = void 0;\nvar STATE_KEY_PREFIX = "@@scroll|";\nvar GATSBY_ROUTER_SCROLL_STATE = "___GATSBY_REACT_ROUTER_SCROLL";\n\nvar SessionStorage = /*#__PURE__*/function () {\n function SessionStorage() {}\n\n var _proto = SessionStorage.prototype;\n\n _proto.read = function read(location, key) {\n var stateKey = this.getStateKey(location, key);\n\n try {\n var value = window.sessionStorage.getItem(stateKey);\n return value ? JSON.parse(value) : 0;\n } catch (e) {\n if (false) {}\n\n if (window && window[GATSBY_ROUTER_SCROLL_STATE] && window[GATSBY_ROUTER_SCROLL_STATE][stateKey]) {\n return window[GATSBY_ROUTER_SCROLL_STATE][stateKey];\n }\n\n return 0;\n }\n };\n\n _proto.save = function save(location, key, value) {\n var stateKey = this.getStateKey(location, key);\n var storedValue = JSON.stringify(value);\n\n try {\n window.sessionStorage.setItem(stateKey, storedValue);\n } catch (e) {\n if (window && window[GATSBY_ROUTER_SCROLL_STATE]) {\n window[GATSBY_ROUTER_SCROLL_STATE][stateKey] = JSON.parse(storedValue);\n } else {\n window[GATSBY_ROUTER_SCROLL_STATE] = {};\n window[GATSBY_ROUTER_SCROLL_STATE][stateKey] = JSON.parse(storedValue);\n }\n\n if (false) {}\n }\n };\n\n _proto.getStateKey = function getStateKey(location, key) {\n var stateKeyBase = "" + STATE_KEY_PREFIX + location.pathname;\n return key === null || typeof key === "undefined" ? stateKeyBase : stateKeyBase + "|" + key;\n };\n\n return SessionStorage;\n}();\n\nexports.SessionStorage = SessionStorage;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9nYXRzYnktcmVhY3Qtcm91dGVyLXNjcm9sbC9zZXNzaW9uLXN0b3JhZ2UuanM/ZmUxNCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixrQkFBa0I7QUFDbEIsc0JBQXNCO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxVQUFVLEtBQXFDLEVBQUUsRUFFMUM7O0FBRVA7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQSxVQUFVLEtBQXFDLEVBQUUsRUFFMUM7QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRCxzQkFBc0IiLCJmaWxlIjoiMTE0Mi5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5TZXNzaW9uU3RvcmFnZSA9IHZvaWQgMDtcbnZhciBTVEFURV9LRVlfUFJFRklYID0gXCJAQHNjcm9sbHxcIjtcbnZhciBHQVRTQllfUk9VVEVSX1NDUk9MTF9TVEFURSA9IFwiX19fR0FUU0JZX1JFQUNUX1JPVVRFUl9TQ1JPTExcIjtcblxudmFyIFNlc3Npb25TdG9yYWdlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU2Vzc2lvblN0b3JhZ2UoKSB7fVxuXG4gIHZhciBfcHJvdG8gPSBTZXNzaW9uU3RvcmFnZS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnJlYWQgPSBmdW5jdGlvbiByZWFkKGxvY2F0aW9uLCBrZXkpIHtcbiAgICB2YXIgc3RhdGVLZXkgPSB0aGlzLmdldFN0YXRlS2V5KGxvY2F0aW9uLCBrZXkpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhciB2YWx1ZSA9IHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHN0YXRlS2V5KTtcbiAgICAgIHJldHVybiB2YWx1ZSA/IEpTT04ucGFyc2UodmFsdWUpIDogMDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIltnYXRzYnktcmVhY3Qtcm91dGVyLXNjcm9sbF0gVW5hYmxlIHRvIGFjY2VzcyBzZXNzaW9uU3RvcmFnZTsgc2Vzc2lvblN0b3JhZ2UgaXMgbm90IGF2YWlsYWJsZS5cIik7XG4gICAgICB9XG5cbiAgICAgIGlmICh3aW5kb3cgJiYgd2luZG93W0dBVFNCWV9ST1VURVJfU0NST0xMX1NUQVRFXSAmJiB3aW5kb3dbR0FUU0JZX1JPVVRFUl9TQ1JPTExfU1RBVEVdW3N0YXRlS2V5XSkge1xuICAgICAgICByZXR1cm4gd2luZG93W0dBVFNCWV9ST1VURVJfU0NST0xMX1NUQVRFXVtzdGF0ZUtleV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uc2F2ZSA9IGZ1bmN0aW9uIHNhdmUobG9jYXRpb24sIGtleSwgdmFsdWUpIHtcbiAgICB2YXIgc3RhdGVLZXkgPSB0aGlzLmdldFN0YXRlS2V5KGxvY2F0aW9uLCBrZXkpO1xuICAgIHZhciBzdG9yZWRWYWx1ZSA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcblxuICAgIHRyeSB7XG4gICAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShzdGF0ZUtleSwgc3RvcmVkVmFsdWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmICh3aW5kb3cgJiYgd2luZG93W0dBVFNCWV9ST1VURVJfU0NST0xMX1NUQVRFXSkge1xuICAgICAgICB3aW5kb3dbR0FUU0JZX1JPVVRFUl9TQ1JPTExfU1RBVEVdW3N0YXRlS2V5XSA9IEpTT04ucGFyc2Uoc3RvcmVkVmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2luZG93W0dBVFNCWV9ST1VURVJfU0NST0xMX1NUQVRFXSA9IHt9O1xuICAgICAgICB3aW5kb3dbR0FUU0JZX1JPVVRFUl9TQ1JPTExfU1RBVEVdW3N0YXRlS2V5XSA9IEpTT04ucGFyc2Uoc3RvcmVkVmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIltnYXRzYnktcmVhY3Qtcm91dGVyLXNjcm9sbF0gVW5hYmxlIHRvIHNhdmUgc3RhdGUgaW4gc2Vzc2lvblN0b3JhZ2U7IHNlc3Npb25TdG9yYWdlIGlzIG5vdCBhdmFpbGFibGUuXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uZ2V0U3RhdGVLZXkgPSBmdW5jdGlvbiBnZXRTdGF0ZUtleShsb2NhdGlvbiwga2V5KSB7XG4gICAgdmFyIHN0YXRlS2V5QmFzZSA9IFwiXCIgKyBTVEFURV9LRVlfUFJFRklYICsgbG9jYXRpb24ucGF0aG5hbWU7XG4gICAgcmV0dXJuIGtleSA9PT0gbnVsbCB8fCB0eXBlb2Yga2V5ID09PSBcInVuZGVmaW5lZFwiID8gc3RhdGVLZXlCYXNlIDogc3RhdGVLZXlCYXNlICsgXCJ8XCIgKyBrZXk7XG4gIH07XG5cbiAgcmV0dXJuIFNlc3Npb25TdG9yYWdlO1xufSgpO1xuXG5leHBvcnRzLlNlc3Npb25TdG9yYWdlID0gU2Vzc2lvblN0b3JhZ2U7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1142\n')},4855:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("\n\nexports.__esModule = true;\nexports.useScrollRestoration = useScrollRestoration;\n\nvar _scrollHandler = __webpack_require__(1432);\n\nvar _react = __webpack_require__(7294);\n\nvar _reachRouter = __webpack_require__(9499);\n\nfunction useScrollRestoration(identifier) {\n var location = (0, _reachRouter.useLocation)();\n var state = (0, _react.useContext)(_scrollHandler.ScrollContext);\n var ref = (0, _react.useRef)(null);\n (0, _react.useLayoutEffect)(function () {\n if (ref.current) {\n var position = state.read(location, identifier);\n ref.current.scrollTo(0, position || 0);\n }\n }, [location.key]);\n return {\n ref: ref,\n onScroll: function onScroll() {\n if (ref.current) {\n state.save(location, identifier, ref.current.scrollTop);\n }\n }\n };\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9nYXRzYnktcmVhY3Qtcm91dGVyLXNjcm9sbC91c2Utc2Nyb2xsLXJlc3RvcmF0aW9uLmpzP2RlZWMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsa0JBQWtCO0FBQ2xCLDRCQUE0Qjs7QUFFNUIscUJBQXFCLG1CQUFPLENBQUMsSUFBa0I7O0FBRS9DLGFBQWEsbUJBQU8sQ0FBQyxJQUFPOztBQUU1QixtQkFBbUIsbUJBQU8sQ0FBQyxJQUF3Qjs7QUFFbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiI0ODU1LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLnVzZVNjcm9sbFJlc3RvcmF0aW9uID0gdXNlU2Nyb2xsUmVzdG9yYXRpb247XG5cbnZhciBfc2Nyb2xsSGFuZGxlciA9IHJlcXVpcmUoXCIuL3Njcm9sbC1oYW5kbGVyXCIpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG52YXIgX3JlYWNoUm91dGVyID0gcmVxdWlyZShcIkBnYXRzYnlqcy9yZWFjaC1yb3V0ZXJcIik7XG5cbmZ1bmN0aW9uIHVzZVNjcm9sbFJlc3RvcmF0aW9uKGlkZW50aWZpZXIpIHtcbiAgdmFyIGxvY2F0aW9uID0gKDAsIF9yZWFjaFJvdXRlci51c2VMb2NhdGlvbikoKTtcbiAgdmFyIHN0YXRlID0gKDAsIF9yZWFjdC51c2VDb250ZXh0KShfc2Nyb2xsSGFuZGxlci5TY3JvbGxDb250ZXh0KTtcbiAgdmFyIHJlZiA9ICgwLCBfcmVhY3QudXNlUmVmKShudWxsKTtcbiAgKDAsIF9yZWFjdC51c2VMYXlvdXRFZmZlY3QpKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAocmVmLmN1cnJlbnQpIHtcbiAgICAgIHZhciBwb3NpdGlvbiA9IHN0YXRlLnJlYWQobG9jYXRpb24sIGlkZW50aWZpZXIpO1xuICAgICAgcmVmLmN1cnJlbnQuc2Nyb2xsVG8oMCwgcG9zaXRpb24gfHwgMCk7XG4gICAgfVxuICB9LCBbbG9jYXRpb24ua2V5XSk7XG4gIHJldHVybiB7XG4gICAgcmVmOiByZWYsXG4gICAgb25TY3JvbGw6IGZ1bmN0aW9uIG9uU2Nyb2xsKCkge1xuICAgICAgaWYgKHJlZi5jdXJyZW50KSB7XG4gICAgICAgIHN0YXRlLnNhdmUobG9jYXRpb24sIGlkZW50aWZpZXIsIHJlZi5jdXJyZW50LnNjcm9sbFRvcCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///4855\n")},4999:function(__unused_webpack_module,exports,__webpack_require__){eval('// prefer default export if available\nvar preferDefault=function preferDefault(m){return m&&m.default||m;};exports.components={"component---src-pages-404-tsx":function componentSrcPages404Tsx(){return __webpack_require__.e(/* import() | component---src-pages-404-tsx */ 218).then(__webpack_require__.bind(__webpack_require__, 9786));},"component---src-pages-cejst-tsx":function componentSrcPagesCejstTsx(){return Promise.all(/* import() | component---src-pages-cejst-tsx */[__webpack_require__.e(532), __webpack_require__.e(30), __webpack_require__.e(634), __webpack_require__.e(98), __webpack_require__.e(569), __webpack_require__.e(90), __webpack_require__.e(281)]).then(__webpack_require__.bind(__webpack_require__, 1529));},"component---src-pages-index-tsx":function componentSrcPagesIndexTsx(){return Promise.all(/* import() | component---src-pages-index-tsx */[__webpack_require__.e(30), __webpack_require__.e(569), __webpack_require__.e(691)]).then(__webpack_require__.bind(__webpack_require__, 251));},"component---src-pages-timeline-tsx":function componentSrcPagesTimelineTsx(){return Promise.all(/* import() | component---src-pages-timeline-tsx */[__webpack_require__.e(30), __webpack_require__.e(569), __webpack_require__.e(914)]).then(__webpack_require__.bind(__webpack_require__, 7348));}};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uLy5jYWNoZS9fdGhpc19pc192aXJ0dWFsX2ZzX3BhdGhfLyR2aXJ0dWFsL2FzeW5jLXJlcXVpcmVzLmpzPzM2YzEiXSwibmFtZXMiOlsicHJlZmVyRGVmYXVsdCIsIm0iLCJkZWZhdWx0IiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQSxHQUFNQSxjQUFhLENBQUcsUUFBaEJBLGNBQWdCLENBQUFDLENBQUMsUUFBS0EsRUFBQyxFQUFJQSxDQUFDLENBQUNDLE9BQVIsRUFBb0JELENBQXhCLEVBQXZCLENBRUFFLGtCQUFBLENBQXFCLENBQ25CLGdDQUFpQyx5Q0FBTSxvSUFBTixFQURkLENBRW5CLGtDQUFtQywyQ0FBTSx5VEFBTixFQUZoQixDQUduQixrQ0FBbUMsMkNBQU0sME1BQU4sRUFIaEIsQ0FJbkIscUNBQXNDLDhDQUFNLDhNQUFOLEVBSm5CLENBQXJCIiwiZmlsZSI6IjQ5OTkuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBwcmVmZXIgZGVmYXVsdCBleHBvcnQgaWYgYXZhaWxhYmxlXG5jb25zdCBwcmVmZXJEZWZhdWx0ID0gbSA9PiAobSAmJiBtLmRlZmF1bHQpIHx8IG1cblxuZXhwb3J0cy5jb21wb25lbnRzID0ge1xuICBcImNvbXBvbmVudC0tLXNyYy1wYWdlcy00MDQtdHN4XCI6ICgpID0+IGltcG9ydChcIi4vLi4vLi4vLi4vc3JjL3BhZ2VzLzQwNC50c3hcIiAvKiB3ZWJwYWNrQ2h1bmtOYW1lOiBcImNvbXBvbmVudC0tLXNyYy1wYWdlcy00MDQtdHN4XCIgKi8pLFxuICBcImNvbXBvbmVudC0tLXNyYy1wYWdlcy1jZWpzdC10c3hcIjogKCkgPT4gaW1wb3J0KFwiLi8uLi8uLi8uLi9zcmMvcGFnZXMvY2Vqc3QudHN4XCIgLyogd2VicGFja0NodW5rTmFtZTogXCJjb21wb25lbnQtLS1zcmMtcGFnZXMtY2Vqc3QtdHN4XCIgKi8pLFxuICBcImNvbXBvbmVudC0tLXNyYy1wYWdlcy1pbmRleC10c3hcIjogKCkgPT4gaW1wb3J0KFwiLi8uLi8uLi8uLi9zcmMvcGFnZXMvaW5kZXgudHN4XCIgLyogd2VicGFja0NodW5rTmFtZTogXCJjb21wb25lbnQtLS1zcmMtcGFnZXMtaW5kZXgtdHN4XCIgKi8pLFxuICBcImNvbXBvbmVudC0tLXNyYy1wYWdlcy10aW1lbGluZS10c3hcIjogKCkgPT4gaW1wb3J0KFwiLi8uLi8uLi8uLi9zcmMvcGFnZXMvdGltZWxpbmUudHN4XCIgLyogd2VicGFja0NodW5rTmFtZTogXCJjb21wb25lbnQtLS1zcmMtcGFnZXMtdGltZWxpbmUtdHN4XCIgKi8pXG59XG5cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///4999\n')},5182:function(module,__unused_webpack_exports,__webpack_require__){eval('module.exports=[{plugin:__webpack_require__(5526),options:{"plugins":[],"path":"/home/runner/work/justice40-tool/justice40-tool/client/src/intl","languages":["en","es"],"defaultLanguage":"en","redirect":true}},{plugin:__webpack_require__(9037),options:{"plugins":[]}}];//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uLy5jYWNoZS9hcGktcnVubmVyLWJyb3dzZXItcGx1Z2lucy5qcz8yZGUyIl0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJwbHVnaW4iLCJyZXF1aXJlIiwib3B0aW9ucyJdLCJtYXBwaW5ncyI6IkFBQUFBLE1BQU0sQ0FBQ0MsT0FBUCxDQUFpQixDQUFDLENBQ1pDLE1BQU0sQ0FBRUMsbUJBQU8sQ0FBQyxJQUFELENBREgsQ0FFWkMsT0FBTyxDQUFFLENBQUMsVUFBVSxFQUFYLENBQWMsT0FBTyxpRUFBckIsQ0FBdUYsWUFBWSxDQUFDLElBQUQsQ0FBTSxJQUFOLENBQW5HLENBQStHLGtCQUFrQixJQUFqSSxDQUFzSSxXQUFXLElBQWpKLENBRkcsQ0FBRCxDQUdYLENBQ0FGLE1BQU0sQ0FBRUMsbUJBQU8sQ0FBQyxJQUFELENBRGYsQ0FFQUMsT0FBTyxDQUFFLENBQUMsVUFBVSxFQUFYLENBRlQsQ0FIVyxDQUFqQiIsImZpbGUiOiI1MTgyLmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBbe1xuICAgICAgcGx1Z2luOiByZXF1aXJlKCcuLi9ub2RlX21vZHVsZXMvZ2F0c2J5LXBsdWdpbi1pbnRsL2dhdHNieS1icm93c2VyLmpzJyksXG4gICAgICBvcHRpb25zOiB7XCJwbHVnaW5zXCI6W10sXCJwYXRoXCI6XCIvaG9tZS9ydW5uZXIvd29yay9qdXN0aWNlNDAtdG9vbC9qdXN0aWNlNDAtdG9vbC9jbGllbnQvc3JjL2ludGxcIixcImxhbmd1YWdlc1wiOltcImVuXCIsXCJlc1wiXSxcImRlZmF1bHRMYW5ndWFnZVwiOlwiZW5cIixcInJlZGlyZWN0XCI6dHJ1ZX0sXG4gICAgfSx7XG4gICAgICBwbHVnaW46IHJlcXVpcmUoJy4uL2dhdHNieS1icm93c2VyLmpzJyksXG4gICAgICBvcHRpb25zOiB7XCJwbHVnaW5zXCI6W119LFxuICAgIH1dXG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5182\n')},7343:function(__unused_webpack_module,exports,__webpack_require__){eval('var plugins=__webpack_require__(5182);var _require$publicLoader=__webpack_require__(8741)/* .publicLoader */ .jN,getResourceURLsForPathname=_require$publicLoader.getResourceURLsForPathname,loadPage=_require$publicLoader.loadPage,loadPageSync=_require$publicLoader.loadPageSync;exports.h=function(api,args,defaultReturn,argTransform){if(args===void 0){args={};}// Hooks for gatsby-cypress\'s API handler\nif(undefined){if(window.___apiHandler){window.___apiHandler(api);}else if(window.___resolvedAPIs){window.___resolvedAPIs.push(api);}else{window.___resolvedAPIs=[api];}}var results=plugins.map(function(plugin){if(!plugin.plugin[api]){return undefined;}args.getResourceURLsForPathname=getResourceURLsForPathname;args.loadPage=loadPage;args.loadPageSync=loadPageSync;var result=plugin.plugin[api](args,plugin.options);if(result&&argTransform){args=argTransform({args:args,result:result,plugin:plugin});}return result;});// Filter out undefined results.\nresults=results.filter(function(result){return typeof result!=="undefined";});if(results.length>0){return results;}else if(defaultReturn){return[defaultReturn];}else{return[];}};exports.I=function(api,args,defaultReturn){return plugins.reduce(function(previous,next){return next.plugin[api]?previous.then(function(){return next.plugin[api](args,next.options);}):previous;},Promise.resolve());};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uLy5jYWNoZS9hcGktcnVubmVyLWJyb3dzZXIuanM/YzZkYiJdLCJuYW1lcyI6WyJwbHVnaW5zIiwicmVxdWlyZSIsImdldFJlc291cmNlVVJMc0ZvclBhdGhuYW1lIiwibG9hZFBhZ2UiLCJsb2FkUGFnZVN5bmMiLCJleHBvcnRzIiwiYXBpIiwiYXJncyIsImRlZmF1bHRSZXR1cm4iLCJhcmdUcmFuc2Zvcm0iLCJwcm9jZXNzIiwid2luZG93IiwiX19fYXBpSGFuZGxlciIsIl9fX3Jlc29sdmVkQVBJcyIsInB1c2giLCJyZXN1bHRzIiwibWFwIiwicGx1Z2luIiwidW5kZWZpbmVkIiwicmVzdWx0Iiwib3B0aW9ucyIsImZpbHRlciIsImxlbmd0aCIsInJlZHVjZSIsInByZXZpb3VzIiwibmV4dCIsInRoZW4iLCJQcm9taXNlIiwicmVzb2x2ZSJdLCJtYXBwaW5ncyI6IkFBQUEsR0FBTUEsUUFBTyxDQUFHQyxtQkFBTyxDQUFDLEtBQXhCLENBQ0EsMEJBSUlBLGdEQUpKLENBQ0VDLDBCQURGLHVCQUNFQSwwQkFERixDQUVFQyxRQUZGLHVCQUVFQSxRQUZGLENBR0VDLFlBSEYsdUJBR0VBLFlBSEYsQ0FNQUMsU0FBQSxDQUFvQixTQUFDQyxHQUFELENBQU1DLElBQU4sQ0FBaUJDLGFBQWpCLENBQWdDQyxZQUFoQyxDQUFpRCxJQUEzQ0YsSUFBMkMsV0FBM0NBLElBQTJDLENBQXBDLEVBQW9DLEVBQ25FO0FBQ0EsR0FBSUcsU0FBSixDQUFpQyxDQUMvQixHQUFJQyxNQUFNLENBQUNDLGFBQVgsQ0FBMEIsQ0FDeEJELE1BQU0sQ0FBQ0MsYUFBUCxDQUFxQk4sR0FBckIsRUFDRCxDQUZELElBRU8sSUFBSUssTUFBTSxDQUFDRSxlQUFYLENBQTRCLENBQ2pDRixNQUFNLENBQUNFLGVBQVAsQ0FBdUJDLElBQXZCLENBQTRCUixHQUE1QixFQUNELENBRk0sSUFFQSxDQUNMSyxNQUFNLENBQUNFLGVBQVAsQ0FBeUIsQ0FBQ1AsR0FBRCxDQUF6QixDQUNELENBQ0YsQ0FFRCxHQUFJUyxRQUFPLENBQUdmLE9BQU8sQ0FBQ2dCLEdBQVIsQ0FBWSxTQUFBQyxNQUFNLENBQUksQ0FDbEMsR0FBSSxDQUFDQSxNQUFNLENBQUNBLE1BQVAsQ0FBY1gsR0FBZCxDQUFMLENBQXlCLENBQ3ZCLE1BQU9ZLFVBQVAsQ0FDRCxDQUVEWCxJQUFJLENBQUNMLDBCQUFMLENBQWtDQSwwQkFBbEMsQ0FDQUssSUFBSSxDQUFDSixRQUFMLENBQWdCQSxRQUFoQixDQUNBSSxJQUFJLENBQUNILFlBQUwsQ0FBb0JBLFlBQXBCLENBRUEsR0FBTWUsT0FBTSxDQUFHRixNQUFNLENBQUNBLE1BQVAsQ0FBY1gsR0FBZCxFQUFtQkMsSUFBbkIsQ0FBeUJVLE1BQU0sQ0FBQ0csT0FBaEMsQ0FBZixDQUNBLEdBQUlELE1BQU0sRUFBSVYsWUFBZCxDQUE0QixDQUMxQkYsSUFBSSxDQUFHRSxZQUFZLENBQUMsQ0FBRUYsSUFBSSxDQUFKQSxJQUFGLENBQVFZLE1BQU0sQ0FBTkEsTUFBUixDQUFnQkYsTUFBTSxDQUFOQSxNQUFoQixDQUFELENBQW5CLENBQ0QsQ0FDRCxNQUFPRSxPQUFQLENBQ0QsQ0FkYSxDQUFkLENBZ0JBO0FBQ0FKLE9BQU8sQ0FBR0EsT0FBTyxDQUFDTSxNQUFSLENBQWUsU0FBQUYsTUFBTSxRQUFJLE9BQU9BLE9BQVAsY0FBSixFQUFyQixDQUFWLENBRUEsR0FBSUosT0FBTyxDQUFDTyxNQUFSLENBQWlCLENBQXJCLENBQXdCLENBQ3RCLE1BQU9QLFFBQVAsQ0FDRCxDQUZELElBRU8sSUFBSVAsYUFBSixDQUFtQixDQUN4QixNQUFPLENBQUNBLGFBQUQsQ0FBUCxDQUNELENBRk0sSUFFQSxDQUNMLE1BQU8sRUFBUCxDQUNELENBQ0YsQ0F0Q0QsQ0F3Q0FILFNBQUEsQ0FBeUIsU0FBQ0MsR0FBRCxDQUFNQyxJQUFOLENBQVlDLGFBQVosUUFDdkJSLFFBQU8sQ0FBQ3VCLE1BQVIsQ0FDRSxTQUFDQyxRQUFELENBQVdDLElBQVgsUUFDRUEsS0FBSSxDQUFDUixNQUFMLENBQVlYLEdBQVosRUFDSWtCLFFBQVEsQ0FBQ0UsSUFBVCxDQUFjLGlCQUFNRCxLQUFJLENBQUNSLE1BQUwsQ0FBWVgsR0FBWixFQUFpQkMsSUFBakIsQ0FBdUJrQixJQUFJLENBQUNMLE9BQTVCLENBQU4sRUFBZCxDQURKLENBRUlJLFFBSE4sRUFERixDQUtFRyxPQUFPLENBQUNDLE9BQVIsRUFMRixDQUR1QixFQUF6QiIsImZpbGUiOiI3MzQzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgcGx1Z2lucyA9IHJlcXVpcmUoYC4vYXBpLXJ1bm5lci1icm93c2VyLXBsdWdpbnNgKVxuY29uc3Qge1xuICBnZXRSZXNvdXJjZVVSTHNGb3JQYXRobmFtZSxcbiAgbG9hZFBhZ2UsXG4gIGxvYWRQYWdlU3luYyxcbn0gPSByZXF1aXJlKGAuL2xvYWRlcmApLnB1YmxpY0xvYWRlclxuXG5leHBvcnRzLmFwaVJ1bm5lciA9IChhcGksIGFyZ3MgPSB7fSwgZGVmYXVsdFJldHVybiwgYXJnVHJhbnNmb3JtKSA9PiB7XG4gIC8vIEhvb2tzIGZvciBnYXRzYnktY3lwcmVzcydzIEFQSSBoYW5kbGVyXG4gIGlmIChwcm9jZXNzLmVudi5DWVBSRVNTX1NVUFBPUlQpIHtcbiAgICBpZiAod2luZG93Ll9fX2FwaUhhbmRsZXIpIHtcbiAgICAgIHdpbmRvdy5fX19hcGlIYW5kbGVyKGFwaSlcbiAgICB9IGVsc2UgaWYgKHdpbmRvdy5fX19yZXNvbHZlZEFQSXMpIHtcbiAgICAgIHdpbmRvdy5fX19yZXNvbHZlZEFQSXMucHVzaChhcGkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvdy5fX19yZXNvbHZlZEFQSXMgPSBbYXBpXVxuICAgIH1cbiAgfVxuXG4gIGxldCByZXN1bHRzID0gcGx1Z2lucy5tYXAocGx1Z2luID0+IHtcbiAgICBpZiAoIXBsdWdpbi5wbHVnaW5bYXBpXSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGFyZ3MuZ2V0UmVzb3VyY2VVUkxzRm9yUGF0aG5hbWUgPSBnZXRSZXNvdXJjZVVSTHNGb3JQYXRobmFtZVxuICAgIGFyZ3MubG9hZFBhZ2UgPSBsb2FkUGFnZVxuICAgIGFyZ3MubG9hZFBhZ2VTeW5jID0gbG9hZFBhZ2VTeW5jXG5cbiAgICBjb25zdCByZXN1bHQgPSBwbHVnaW4ucGx1Z2luW2FwaV0oYXJncywgcGx1Z2luLm9wdGlvbnMpXG4gICAgaWYgKHJlc3VsdCAmJiBhcmdUcmFuc2Zvcm0pIHtcbiAgICAgIGFyZ3MgPSBhcmdUcmFuc2Zvcm0oeyBhcmdzLCByZXN1bHQsIHBsdWdpbiB9KVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH0pXG5cbiAgLy8gRmlsdGVyIG91dCB1bmRlZmluZWQgcmVzdWx0cy5cbiAgcmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKHJlc3VsdCA9PiB0eXBlb2YgcmVzdWx0ICE9PSBgdW5kZWZpbmVkYClcblxuICBpZiAocmVzdWx0cy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHJlc3VsdHNcbiAgfSBlbHNlIGlmIChkZWZhdWx0UmV0dXJuKSB7XG4gICAgcmV0dXJuIFtkZWZhdWx0UmV0dXJuXVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBbXVxuICB9XG59XG5cbmV4cG9ydHMuYXBpUnVubmVyQXN5bmMgPSAoYXBpLCBhcmdzLCBkZWZhdWx0UmV0dXJuKSA9PlxuICBwbHVnaW5zLnJlZHVjZShcbiAgICAocHJldmlvdXMsIG5leHQpID0+XG4gICAgICBuZXh0LnBsdWdpblthcGldXG4gICAgICAgID8gcHJldmlvdXMudGhlbigoKSA9PiBuZXh0LnBsdWdpblthcGldKGFyZ3MsIG5leHQub3B0aW9ucykpXG4gICAgICAgIDogcHJldmlvdXMsXG4gICAgUHJvbWlzZS5yZXNvbHZlKClcbiAgKVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///7343\n')},8110:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "Z": function() { return /* binding */ _cache_emitter; }\n});\n\n;// CONCATENATED MODULE: ./node_modules/mitt/dist/mitt.es.js\n// \n// An event handler can take an optional event argument\n// and should not return a value\n \n \n\n// An array of all currently registered event handlers for a type\n \n \n// A map of event types and their corresponding event handlers.\n \n \n \n \n\n/** Mitt: Tiny (~200b) functional event emitter / pubsub.\n * @name mitt\n * @returns {Mitt}\n */\nfunction mitt(all ) {\n\tall = all || Object.create(null);\n\n\treturn {\n\t\t/**\n\t\t * Register an event handler for the given type.\n\t\t *\n\t\t * @param {String} type\tType of event to listen for, or `"*"` for all events\n\t\t * @param {Function} handler Function to call in response to given event\n\t\t * @memberOf mitt\n\t\t */\n\t\ton: function on(type , handler ) {\n\t\t\t(all[type] || (all[type] = [])).push(handler);\n\t\t},\n\n\t\t/**\n\t\t * Remove an event handler for the given type.\n\t\t *\n\t\t * @param {String} type\tType of event to unregister `handler` from, or `"*"`\n\t\t * @param {Function} handler Handler function to remove\n\t\t * @memberOf mitt\n\t\t */\n\t\toff: function off(type , handler ) {\n\t\t\tif (all[type]) {\n\t\t\t\tall[type].splice(all[type].indexOf(handler) >>> 0, 1);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Invoke all handlers for the given type.\n\t\t * If present, `"*"` handlers are invoked after type-matched handlers.\n\t\t *\n\t\t * @param {String} type The event type to invoke\n\t\t * @param {Any} [evt] Any value (object is recommended and powerful), passed to each handler\n\t\t * @memberOf mitt\n\t\t */\n\t\temit: function emit(type , evt ) {\n\t\t\t(all[type] || []).slice().map(function (handler) { handler(evt); });\n\t\t\t(all[\'*\'] || []).slice().map(function (handler) { handler(type, evt); });\n\t\t}\n\t};\n}\n\n/* harmony default export */ var mitt_es = (mitt);\n//# sourceMappingURL=mitt.es.js.map\n\n;// CONCATENATED MODULE: ./.cache/emitter.js\nvar emitter=mitt_es();/* harmony default export */ var _cache_emitter = (emitter);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9taXR0L2Rpc3QvbWl0dC5lcy5qcz8xNGI3Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vLmNhY2hlL2VtaXR0ZXIuanM/ZTcyYSJdLCJuYW1lcyI6WyJlbWl0dGVyIiwibWl0dCJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBQ0E7QUFDQTs7OztBQUlBOzs7QUFHQTs7Ozs7O0FBTUE7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLE9BQU87QUFDckIsY0FBYyxTQUFTO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxjQUFjLE9BQU87QUFDckIsY0FBYyxTQUFTO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsYUFBYSxJQUFJO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCxjQUFjLEVBQUU7QUFDckUsb0RBQW9ELG9CQUFvQixFQUFFO0FBQzFFO0FBQ0E7QUFDQTs7QUFFQSw0Q0FBZSxJQUFJLEVBQUM7QUFDcEI7OztBQzdEQSxHQUFNQSxRQUFPLENBQUdDLE9BQUksRUFBcEIsQ0FDQSxtREFBZUQsT0FBZiIsImZpbGUiOiI4MTEwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gICAgICBcbi8vIEFuIGV2ZW50IGhhbmRsZXIgY2FuIHRha2UgYW4gb3B0aW9uYWwgZXZlbnQgYXJndW1lbnRcbi8vIGFuZCBzaG91bGQgbm90IHJldHVybiBhIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4vLyBBbiBhcnJheSBvZiBhbGwgY3VycmVudGx5IHJlZ2lzdGVyZWQgZXZlbnQgaGFuZGxlcnMgZm9yIGEgdHlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuLy8gQSBtYXAgb2YgZXZlbnQgdHlwZXMgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgZXZlbnQgaGFuZGxlcnMuXG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgXG5cbi8qKiBNaXR0OiBUaW55ICh+MjAwYikgZnVuY3Rpb25hbCBldmVudCBlbWl0dGVyIC8gcHVic3ViLlxuICogIEBuYW1lIG1pdHRcbiAqICBAcmV0dXJucyB7TWl0dH1cbiAqL1xuZnVuY3Rpb24gbWl0dChhbGwgICAgICAgICAgICAgICAgICkge1xuXHRhbGwgPSBhbGwgfHwgT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuXHRyZXR1cm4ge1xuXHRcdC8qKlxuXHRcdCAqIFJlZ2lzdGVyIGFuIGV2ZW50IGhhbmRsZXIgZm9yIHRoZSBnaXZlbiB0eXBlLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtICB7U3RyaW5nfSB0eXBlXHRUeXBlIG9mIGV2ZW50IHRvIGxpc3RlbiBmb3IsIG9yIGBcIipcImAgZm9yIGFsbCBldmVudHNcblx0XHQgKiBAcGFyYW0gIHtGdW5jdGlvbn0gaGFuZGxlciBGdW5jdGlvbiB0byBjYWxsIGluIHJlc3BvbnNlIHRvIGdpdmVuIGV2ZW50XG5cdFx0ICogQG1lbWJlck9mIG1pdHRcblx0XHQgKi9cblx0XHRvbjogZnVuY3Rpb24gb24odHlwZSAgICAgICAgLCBoYW5kbGVyICAgICAgICAgICAgICApIHtcblx0XHRcdChhbGxbdHlwZV0gfHwgKGFsbFt0eXBlXSA9IFtdKSkucHVzaChoYW5kbGVyKTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogUmVtb3ZlIGFuIGV2ZW50IGhhbmRsZXIgZm9yIHRoZSBnaXZlbiB0eXBlLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtICB7U3RyaW5nfSB0eXBlXHRUeXBlIG9mIGV2ZW50IHRvIHVucmVnaXN0ZXIgYGhhbmRsZXJgIGZyb20sIG9yIGBcIipcImBcblx0XHQgKiBAcGFyYW0gIHtGdW5jdGlvbn0gaGFuZGxlciBIYW5kbGVyIGZ1bmN0aW9uIHRvIHJlbW92ZVxuXHRcdCAqIEBtZW1iZXJPZiBtaXR0XG5cdFx0ICovXG5cdFx0b2ZmOiBmdW5jdGlvbiBvZmYodHlwZSAgICAgICAgLCBoYW5kbGVyICAgICAgICAgICAgICApIHtcblx0XHRcdGlmIChhbGxbdHlwZV0pIHtcblx0XHRcdFx0YWxsW3R5cGVdLnNwbGljZShhbGxbdHlwZV0uaW5kZXhPZihoYW5kbGVyKSA+Pj4gMCwgMSk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIEludm9rZSBhbGwgaGFuZGxlcnMgZm9yIHRoZSBnaXZlbiB0eXBlLlxuXHRcdCAqIElmIHByZXNlbnQsIGBcIipcImAgaGFuZGxlcnMgYXJlIGludm9rZWQgYWZ0ZXIgdHlwZS1tYXRjaGVkIGhhbmRsZXJzLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgIFRoZSBldmVudCB0eXBlIHRvIGludm9rZVxuXHRcdCAqIEBwYXJhbSB7QW55fSBbZXZ0XSAgQW55IHZhbHVlIChvYmplY3QgaXMgcmVjb21tZW5kZWQgYW5kIHBvd2VyZnVsKSwgcGFzc2VkIHRvIGVhY2ggaGFuZGxlclxuXHRcdCAqIEBtZW1iZXJPZiBtaXR0XG5cdFx0ICovXG5cdFx0ZW1pdDogZnVuY3Rpb24gZW1pdCh0eXBlICAgICAgICAsIGV2dCAgICAgKSB7XG5cdFx0XHQoYWxsW3R5cGVdIHx8IFtdKS5zbGljZSgpLm1hcChmdW5jdGlvbiAoaGFuZGxlcikgeyBoYW5kbGVyKGV2dCk7IH0pO1xuXHRcdFx0KGFsbFsnKiddIHx8IFtdKS5zbGljZSgpLm1hcChmdW5jdGlvbiAoaGFuZGxlcikgeyBoYW5kbGVyKHR5cGUsIGV2dCk7IH0pO1xuXHRcdH1cblx0fTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbWl0dDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1pdHQuZXMuanMubWFwXG4iLCJpbXBvcnQgbWl0dCBmcm9tIFwibWl0dFwiXG5cbmNvbnN0IGVtaXR0ZXIgPSBtaXR0KClcbmV4cG9ydCBkZWZhdWx0IGVtaXR0ZXJcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///8110\n')},2257:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "UD": function() { return /* binding */ findMatchPath; },\n "Cj": function() { return /* binding */ findPath; },\n "GA": function() { return /* binding */ grabMatchParams; },\n "DS": function() { return /* binding */ setMatchPaths; }\n});\n\n// UNUSED EXPORTS: cleanPath\n\n// EXTERNAL MODULE: ./node_modules/@gatsbyjs/reach-router/lib/utils.js\nvar utils = __webpack_require__(2098);\n// EXTERNAL MODULE: ./.cache/strip-prefix.js\nvar strip_prefix = __webpack_require__(1578);\n;// CONCATENATED MODULE: ./.cache/normalize-page-path.js\n/* harmony default export */ var normalize_page_path = (function(path){if(path===undefined){return path;}if(path==="/"){return"/";}if(path.charAt(path.length-1)==="/"){return path.slice(0,-1);}return path;});\n// EXTERNAL MODULE: ./.cache/redirect-utils.js + 1 modules\nvar redirect_utils = __webpack_require__(5166);\n;// CONCATENATED MODULE: ./.cache/find-path.js\nvar pathCache=new Map();var matchPaths=[];var trimPathname=function trimPathname(rawPathname){var pathname=decodeURIComponent(rawPathname);// Remove the pathPrefix from the pathname.\nvar trimmedPathname=(0,strip_prefix/* default */.Z)(pathname,decodeURIComponent("/justice40-tool/63e863"))// Remove any hashfragment\n.split("#")[0]// Remove search query\n.split("?")[0];return trimmedPathname;};function absolutify(path){// If it\'s already absolute, return as-is\nif(path.startsWith("/")||path.startsWith("https://")||path.startsWith("http://")){return path;}// Calculate path relative to current location, adding a trailing slash to\n// match behavior of @reach/router\nreturn new URL(path,window.location.href+(window.location.href.endsWith("/")?"":"/")).pathname;}/**\n * Set list of matchPaths\n *\n * @param {Array<{path: string, matchPath: string}>} value collection of matchPaths\n */var setMatchPaths=function setMatchPaths(value){matchPaths=value;};/**\n * Return a matchpath url\n * if `match-paths.json` contains `{ "/foo*": "/page1", ...}`, then\n * `/foo?bar=far` => `/page1`\n *\n * @param {string} rawPathname A raw pathname\n * @return {string|null}\n */var findMatchPath=function findMatchPath(rawPathname){var trimmedPathname=cleanPath(rawPathname);var pickPaths=matchPaths.map(function(_ref){var path=_ref.path,matchPath=_ref.matchPath;return{path:matchPath,originalPath:path};});var path=(0,utils.pick)(pickPaths,trimmedPathname);if(path){return normalize_page_path(path.route.originalPath);}return null;};/**\n * Return a matchpath params from reach/router rules\n * if `match-paths.json` contains `{ ":bar/*foo" }`, and the path is /baz/zaz/zoo\n * then it returns\n * { bar: baz, foo: zaz/zoo }\n *\n * @param {string} rawPathname A raw pathname\n * @return {object}\n */var grabMatchParams=function grabMatchParams(rawPathname){var trimmedPathname=cleanPath(rawPathname);var pickPaths=matchPaths.map(function(_ref2){var path=_ref2.path,matchPath=_ref2.matchPath;return{path:matchPath,originalPath:path};});var path=(0,utils.pick)(pickPaths,trimmedPathname);if(path){return path.params;}return{};};// Given a raw URL path, returns the cleaned version of it (trim off\n// `#` and query params), or if it matches an entry in\n// `match-paths.json`, its matched path is returned\n//\n// E.g. `/foo?bar=far` => `/foo`\n//\n// Or if `match-paths.json` contains `{ "/foo*": "/page1", ...}`, then\n// `/foo?bar=far` => `/page1`\nvar findPath=function findPath(rawPathname){var trimmedPathname=trimPathname(absolutify(rawPathname));if(pathCache.has(trimmedPathname)){return pathCache.get(trimmedPathname);}var redirect=(0,redirect_utils/* maybeGetBrowserRedirect */.J)(rawPathname);if(redirect){return findPath(redirect.toPath);}var foundPath=findMatchPath(trimmedPathname);if(!foundPath){foundPath=cleanPath(rawPathname);}pathCache.set(trimmedPathname,foundPath);return foundPath;};/**\n * Clean a url and converts /index.html => /\n * E.g. `/foo?bar=far` => `/foo`\n *\n * @param {string} rawPathname A raw pathname\n * @return {string}\n */var cleanPath=function cleanPath(rawPathname){var trimmedPathname=trimPathname(absolutify(rawPathname));var foundPath=trimmedPathname;if(foundPath==="/index.html"){foundPath="/";}foundPath=normalize_page_path(foundPath);return foundPath;};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uLy5jYWNoZS9ub3JtYWxpemUtcGFnZS1wYXRoLmpzPzY3YjUiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi8uY2FjaGUvZmluZC1wYXRoLmpzP2RmNDQiXSwibmFtZXMiOlsicGF0aCIsInVuZGVmaW5lZCIsImNoYXJBdCIsImxlbmd0aCIsInNsaWNlIiwicGF0aENhY2hlIiwiTWFwIiwibWF0Y2hQYXRocyIsInRyaW1QYXRobmFtZSIsInJhd1BhdGhuYW1lIiwicGF0aG5hbWUiLCJkZWNvZGVVUklDb21wb25lbnQiLCJ0cmltbWVkUGF0aG5hbWUiLCJzdHJpcFByZWZpeCIsIl9fQkFTRV9QQVRIX18iLCJzcGxpdCIsImFic29sdXRpZnkiLCJzdGFydHNXaXRoIiwiVVJMIiwid2luZG93IiwibG9jYXRpb24iLCJocmVmIiwiZW5kc1dpdGgiLCJzZXRNYXRjaFBhdGhzIiwidmFsdWUiLCJmaW5kTWF0Y2hQYXRoIiwiY2xlYW5QYXRoIiwicGlja1BhdGhzIiwibWFwIiwibWF0Y2hQYXRoIiwib3JpZ2luYWxQYXRoIiwicGljayIsIm5vcm1hbGl6ZVBhZ2VQYXRoIiwicm91dGUiLCJncmFiTWF0Y2hQYXJhbXMiLCJwYXJhbXMiLCJmaW5kUGF0aCIsImhhcyIsImdldCIsInJlZGlyZWN0IiwibWF5YmVHZXRCcm93c2VyUmVkaXJlY3QiLCJ0b1BhdGgiLCJmb3VuZFBhdGgiLCJzZXQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx3REFBZSxTQUFBQSxJQUFJLENBQUksQ0FDckIsR0FBSUEsSUFBSSxHQUFLQyxTQUFiLENBQXdCLENBQ3RCLE1BQU9ELEtBQVAsQ0FDRCxDQUNELEdBQUlBLElBQUksTUFBUixDQUFrQixDQUNoQixVQUNELENBQ0QsR0FBSUEsSUFBSSxDQUFDRSxNQUFMLENBQVlGLElBQUksQ0FBQ0csTUFBTCxDQUFjLENBQTFCLE9BQUosQ0FBMEMsQ0FDeEMsTUFBT0gsS0FBSSxD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cG9ydCBkZWZhdWx0IHBhdGggPT4ge1xuICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHBhdGhcbiAgfVxuICBpZiAocGF0aCA9PT0gYC9gKSB7XG4gICAgcmV0dXJuIGAvYFxuICB9XG4gIGlmIChwYXRoLmNoYXJBdChwYXRoLmxlbmd0aCAtIDEpID09PSBgL2ApIHtcbiAgICByZXR1cm4gcGF0aC5zbGljZSgwLCAtMSlcbiAgfVxuICByZXR1cm4gcGF0aFxufVxuIiwiaW1wb3J0IHsgcGljayB9IGZyb20gXCJAZ2F0c2J5anMvcmVhY2gtcm91dGVyL2xpYi91dGlsc1wiXG5pbXBvcnQgc3RyaXBQcmVmaXggZnJvbSBcIi4vc3RyaXAtcHJlZml4XCJcbmltcG9ydCBub3JtYWxpemVQYWdlUGF0aCBmcm9tIFwiLi9ub3JtYWxpemUtcGFnZS1wYXRoXCJcbmltcG9ydCB7IG1heWJlR2V0QnJvd3NlclJlZGlyZWN0IH0gZnJvbSBcIi4vcmVkaXJlY3QtdXRpbHMuanNcIlxuXG5jb25zdCBwYXRoQ2FjaGUgPSBuZXcgTWFwKClcbmxldCBtYXRjaFBhdGhzID0gW11cblxuY29uc3QgdHJpbVBhdGhuYW1lID0gcmF3UGF0aG5hbWUgPT4ge1xuICBjb25zdCBwYXRobmFtZSA9IGRlY29kZVVSSUNvbXBvbmVudChyYXdQYXRobmFtZSlcbiAgLy8gUmVtb3ZlIHRoZSBwYXRoUHJlZml4IGZyb20gdGhlIHBhdGhuYW1lLlxuICBjb25zdCB0cmltbWVkUGF0aG5hbWUgPSBzdHJpcFByZWZpeChcbiAgICBwYXRobmFtZSxcbiAgICBkZWNvZGVVUklDb21wb25lbnQoX19CQVNFX1BBVEhfXylcbiAgKVxuICAgIC8vIFJlbW92ZSBhbnkgaGFzaGZyYWdtZW50XG4gICAgLnNwbGl0KGAjYClbMF1cbiAgICAvLyBSZW1vdmUgc2VhcmNoIHF1ZXJ5XG4gICAgLnNwbGl0KGA/YClbMF1cblxuICByZXR1cm4gdHJpbW1lZFBhdGhuYW1lXG59XG5cbmZ1bmN0aW9uIGFic29sdXRpZnkocGF0aCkge1xuICAvLyBJZiBpdCdzIGFscmVhZHkgYWJzb2x1dGUsIHJldHVybiBhcy1pc1xuICBpZiAoXG4gICAgcGF0aC5zdGFydHNXaXRoKGAvYCkgfHxcbiAgICBwYXRoLnN0YXJ0c1dpdGgoYGh0dHBzOi8vYCkgfHxcbiAgICBwYXRoLnN0YXJ0c1dpdGgoYGh0dHA6Ly9gKVxuICApIHtcbiAgICByZXR1cm4gcGF0aFxuICB9XG4gIC8vIENhbGN1bGF0ZSBwYXRoIHJlbGF0aXZlIHRvIGN1cnJlbnQgbG9jYXRpb24sIGFkZGluZyBhIHRyYWlsaW5nIHNsYXNoIHRvXG4gIC8vIG1hdGNoIGJlaGF2aW9yIG9mIEByZWFjaC9yb3V0ZXJcbiAgcmV0dXJuIG5ldyBVUkwoXG4gICAgcGF0aCxcbiAgICB3aW5kb3cubG9jYXRpb24uaHJlZiArICh3aW5kb3cubG9jYXRpb24uaHJlZi5lbmRzV2l0aChgL2ApID8gYGAgOiBgL2ApXG4gICkucGF0aG5hbWVcbn1cblxuLyoqXG4gKiBTZXQgbGlzdCBvZiBtYXRjaFBhdGhzXG4gKlxuICogQHBhcmFtIHtBcnJheTx7cGF0aDogc3RyaW5nLCBtYXRjaFBhdGg6IHN0cmluZ30+fSB2YWx1ZSBjb2xsZWN0aW9uIG9mIG1hdGNoUGF0aHNcbiAqL1xuZXhwb3J0IGNvbnN0IHNldE1hdGNoUGF0aHMgPSB2YWx1ZSA9PiB7XG4gIG1hdGNoUGF0aHMgPSB2YWx1ZVxufVxuXG4vKipcbiAqIFJldHVybiBhIG1hdGNocGF0aCB1cmxcbiAqIGlmIGBtYXRjaC1wYXRocy5qc29uYCBjb250YWlucyBgeyBcIi9mb28qXCI6IFwiL3BhZ2UxXCIsIC4uLn1gLCB0aGVuXG4gKiBgL2Zvbz9iYXI9ZmFyYCA9PiBgL3BhZ2UxYFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByYXdQYXRobmFtZSBBIHJhdyBwYXRobmFtZVxuICogQHJldHVybiB7c3RyaW5nfG51bGx9XG4gKi9cbmV4cG9ydCBjb25zdCBmaW5kTWF0Y2hQYXRoID0gcmF3UGF0aG5hbWUgPT4ge1xuICBjb25zdCB0cmltbWVkUGF0aG5hbWUgPSBjbGVhblBhdGgocmF3UGF0aG5hbWUpXG5cbiAgY29uc3QgcGlja1BhdGhzID0gbWF0Y2hQYXRocy5tYXAoKHsgcGF0aCwgbWF0Y2hQYXRoIH0pID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgcGF0aDogbWF0Y2hQYXRoLFxuICAgICAgb3JpZ2luYWxQYXRoOiBwYXRoLFxuICAgIH1cbiAgfSlcblxuICBjb25zdCBwYXRoID0gcGljayhwaWNrUGF0aHMsIHRyaW1tZWRQYXRobmFtZSlcblxuICBpZiAocGF0aCkge1xuICAgIHJldHVybiBub3JtYWxpemVQYWdlUGF0aChwYXRoLnJvdXRlLm9yaWdpbmFsUGF0aClcbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbi8qKlxuICogUmV0dXJuIGEgbWF0Y2hwYXRoIHBhcmFtcyBmcm9tIHJlYWNoL3JvdXRlciBydWxlc1xuICogaWYgYG1hdGNoLXBhdGhzLmpzb25gIGNvbnRhaW5zIGB7IFwiOmJhci8qZm9vXCIgfWAsIGFuZCB0aGUgcGF0aCBpcyAvYmF6L3phei96b29cbiAqIHRoZW4gaXQgcmV0dXJuc1xuICogIHsgYmFyOiBiYXosIGZvbzogemF6L3pvbyB9XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJhd1BhdGhuYW1lIEEgcmF3IHBhdGhuYW1lXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKi9cbmV4cG9ydCBjb25zdCBncmFiTWF0Y2hQYXJhbXMgPSByYXdQYXRobmFtZSA9PiB7XG4gIGNvbnN0IHRyaW1tZWRQYXRobmFtZSA9IGNsZWFuUGF0aChyYXdQYXRobmFtZSlcblxuICBjb25zdCBwaWNrUGF0aHMgPSBtYXRjaFBhdGhzLm1hcCgoeyBwYXRoLCBtYXRjaFBhdGggfSkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBwYXRoOiBtYXRjaFBhdGgsXG4gICAgICBvcmlnaW5hbFBhdGg6IHBhdGgsXG4gICAgfVxuICB9KVxuXG4gIGNvbnN0IHBhdGggPSBwaWNrKHBpY2tQYXRocywgdHJpbW1lZFBhdGhuYW1lKVxuXG4gIGlmIChwYXRoKSB7XG4gICAgcmV0dXJuIHBhdGgucGFyYW1zXG4gIH1cblxuICByZXR1cm4ge31cbn1cblxuLy8gR2l2ZW4gYSByYXcgVVJMIHBhdGgsIHJldHVybnMgdGhlIGNsZWFuZWQgdmVyc2lvbiBvZiBpdCAodHJpbSBvZmZcbi8vIGAjYCBhbmQgcXVlcnkgcGFyYW1zKSwgb3IgaWYgaXQgbWF0Y2hlcyBhbiBlbnRyeSBpblxuLy8gYG1hdGNoLXBhdGhzLmpzb25gLCBpdHMgbWF0Y2hlZCBwYXRoIGlzIHJldHVybmVkXG4vL1xuLy8gRS5nLiBgL2Zvbz9iYXI9ZmFyYCA9PiBgL2Zvb2Bcbi8vXG4vLyBPciBpZiBgbWF0Y2gtcGF0aHMuanNvbmAgY29udGFpbnMgYHsgXCIvZm9vKlwiOiBcIi9wYWdlMVwiLCAuLi59YCwgdGhlblxuLy8gYC9mb28/YmFyPWZhcmAgPT4gYC9wYWdlMWBcbmV4cG9ydCBjb25zdCBmaW5kUGF0aCA9IHJhd1BhdGhuYW1lID0+IHtcbiAgY29uc3QgdHJpbW1lZFBhdGhuYW1lID0gdHJpbVBhdGhuYW1lKGFic29sdXRpZnkocmF3UGF0aG5hbWUpKVxuICBpZiAocGF0aENhY2hlLmhhcyh0cmltbWVkUGF0aG5hbWUpKSB7XG4gICAgcmV0dXJuIHBhdGhDYWNoZS5nZXQodHJpbW1lZFBhdGhuYW1lKVxuICB9XG5cbiAgY29uc3QgcmVkaXJlY3QgPSBtYXliZUdldEJyb3dzZXJSZWRpcmVjdChyYXdQYXRobmFtZSlcbiAgaWYgKHJlZGlyZWN0KSB7XG4gICAgcmV0dXJuIGZpbmRQYXRoKHJlZGlyZWN0LnRvUGF0aClcbiAgfVxuXG4gIGxldCBmb3VuZFBhdGggPSBmaW5kTWF0Y2hQYXRoKHRyaW1tZWRQYXRobmFtZSlcblxuICBpZiAoIWZvdW5kUGF0aCkge1xuICAgIGZvdW5kUGF0aCA9IGNsZWFuUGF0aChyYXdQYXRobmFtZSlcbiAgfVxuXG4gIHBhdGhDYWNoZS5zZXQodHJpbW1lZFBhdGhuYW1lLCBmb3VuZFBhdGgpXG5cbiAgcmV0dXJuIGZvdW5kUGF0aFxufVxuXG4vKipcbiAqIENsZWFuIGEgdXJsIGFuZCBjb252ZXJ0cyAvaW5kZXguaHRtbCA9PiAvXG4gKiBFLmcuIGAvZm9vP2Jhcj1mYXJgID0+IGAvZm9vYFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByYXdQYXRobmFtZSBBIHJhdyBwYXRobmFtZVxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5leHBvcnQgY29uc3QgY2xlYW5QYXRoID0gcmF3UGF0aG5hbWUgPT4ge1xuICBjb25zdCB0cmltbWVkUGF0aG5hbWUgPSB0cmltUGF0aG5hbWUoYWJzb2x1dGlmeShyYXdQYXRobmFtZSkpXG5cbiAgbGV0IGZvdW5kUGF0aCA9IHRyaW1tZWRQYXRobmFtZVxuICBpZiAoZm91bmRQYXRoID09PSBgL2luZGV4Lmh0bWxgKSB7XG4gICAgZm91bmRQYXRoID0gYC9gXG4gIH1cblxuICBmb3VuZFBhdGggPSBub3JtYWxpemVQYWdlUGF0aChmb3VuZFBhdGgpXG5cbiAgcmV0dXJuIGZvdW5kUGF0aFxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///2257\n')},5444:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "Link": function() { return /* reexport safe */ gatsby_link__WEBPACK_IMPORTED_MODULE_1__.ZP; },\n/* harmony export */ "withAssetPrefix": function() { return /* reexport safe */ gatsby_link__WEBPACK_IMPORTED_MODULE_1__.mc; },\n/* harmony export */ "withPrefix": function() { return /* reexport safe */ gatsby_link__WEBPACK_IMPORTED_MODULE_1__.dq; },\n/* harmony export */ "graphql": function() { return /* binding */ graphql; },\n/* harmony export */ "parsePath": function() { return /* reexport safe */ gatsby_link__WEBPACK_IMPORTED_MODULE_1__.cP; },\n/* harmony export */ "navigate": function() { return /* reexport safe */ gatsby_link__WEBPACK_IMPORTED_MODULE_1__.c4; },\n/* harmony export */ "useScrollRestoration": function() { return /* reexport safe */ gatsby_react_router_scroll__WEBPACK_IMPORTED_MODULE_2__.p2; },\n/* harmony export */ "StaticQueryContext": function() { return /* binding */ StaticQueryContext; },\n/* harmony export */ "StaticQuery": function() { return /* binding */ StaticQuery; },\n/* harmony export */ "PageRenderer": function() { return /* reexport default from dynamic */ _public_page_renderer__WEBPACK_IMPORTED_MODULE_3___default.a; },\n/* harmony export */ "useStaticQuery": function() { return /* binding */ useStaticQuery; },\n/* harmony export */ "prefetchPathname": function() { return /* binding */ prefetchPathname; }\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7294);\n/* harmony import */ var gatsby_link__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(8037);\n/* harmony import */ var gatsby_react_router_scroll__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(9679);\n/* harmony import */ var _public_page_renderer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(861);\n/* harmony import */ var _public_page_renderer__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_public_page_renderer__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _loader__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(8741);\nvar prefetchPathname=_loader__WEBPACK_IMPORTED_MODULE_4__/* .default.enqueue */ .ZP.enqueue;var StaticQueryContext=/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createContext({});function StaticQueryDataRenderer(_ref){var staticQueryData=_ref.staticQueryData,data=_ref.data,query=_ref.query,render=_ref.render;var finalData=data?data.data:staticQueryData[query]&&staticQueryData[query].data;return/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react__WEBPACK_IMPORTED_MODULE_0__.Fragment,null,finalData&&render(finalData),!finalData&&/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("div",null,"Loading (StaticQuery)"));}var StaticQuery=function StaticQuery(props){var data=props.data,query=props.query,render=props.render,children=props.children;return/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(StaticQueryContext.Consumer,null,function(staticQueryData){return/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(StaticQueryDataRenderer,{data:data,query:query,render:render||children,staticQueryData:staticQueryData});});};var useStaticQuery=function useStaticQuery(query){var _context$query;if(typeof react__WEBPACK_IMPORTED_MODULE_0__.useContext!=="function"&&"production"==="development"){throw new Error("You\'re likely using a version of React that doesn\'t support Hooks\\n"+"Please update React and ReactDOM to 16.8.0 or later to use the useStaticQuery hook.");}var context=react__WEBPACK_IMPORTED_MODULE_0__.useContext(StaticQueryContext);// query is a stringified number like `3303882` when wrapped with graphql, If a user forgets\n// to wrap the query in a grqphql, then casting it to a Number results in `NaN` allowing us to\n// catch the misuse of the API and give proper direction\nif(isNaN(Number(query))){throw new Error("useStaticQuery was called with a string but expects to be called using `graphql`. Try this:\\n\\nimport { useStaticQuery, graphql } from \'gatsby\';\\n\\nuseStaticQuery(graphql`"+query+"`);\\n");}if((_context$query=context[query])!==null&&_context$query!==void 0&&_context$query.data){return context[query].data;}else{throw new Error("The result of this StaticQuery could not be fetched.\\n\\n"+"This is likely a bug in Gatsby and if refreshing the page does not fix it, "+"please open an issue in https://github.com/gatsbyjs/gatsby/issues");}};function graphql(){throw new Error("It appears like Gatsby is misconfigured. Gatsby related `graphql` calls "+"are supposed to only be evaluated at compile time, and then compiled away. "+"Unfortunately, something went wrong and the query was left in the compiled code.\\n\\n"+"Unless your site has a complex or custom babel/Gatsby configuration this is likely a bug in Gatsby.");}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uLy5jYWNoZS9nYXRzYnktYnJvd3Nlci1lbnRyeS5qcz81OWJjIl0sIm5hbWVzIjpbInByZWZldGNoUGF0aG5hbWUiLCJsb2FkZXIiLCJTdGF0aWNRdWVyeUNvbnRleHQiLCJSZWFjdCIsIlN0YXRpY1F1ZXJ5RGF0YVJlbmRlcmVyIiwic3RhdGljUXVlcnlEYXRhIiwiZGF0YSIsInF1ZXJ5IiwicmVuZGVyIiwiZmluYWxEYXRhIiwiU3RhdGljUXVlcnkiLCJwcm9wcyIsImNoaWxkcmVuIiwidXNlU3RhdGljUXVlcnkiLCJwcm9jZXNzIiwiRXJyb3IiLCJjb250ZXh0IiwiaXNOYU4iLCJOdW1iZXIiLCJncmFwaHFsIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFlQSxHQUFNQSxpQkFBZ0IsQ0FBR0Msc0VBQXpCLENBRUEsR0FBTUMsbUJBQWtCLGNBQUdDLGdEQUFBLENBQW9CLEVBQXBCLENBQTNCLENBRUEsUUFBU0Msd0JBQVQsTUFBMkUsSUFBeENDLGdCQUF3QyxNQUF4Q0EsZUFBd0MsQ0FBdkJDLElBQXVCLE1BQXZCQSxJQUF1QixDQUFqQkMsS0FBaUIsTUFBakJBLEtBQWlCLENBQVZDLE1BQVUsTUFBVkEsTUFBVSxDQUN6RSxHQUFNQyxVQUFTLENBQUdILElBQUksQ0FDbEJBLElBQUksQ0FBQ0EsSUFEYSxDQUVsQkQsZUFBZSxDQUFDRSxLQUFELENBQWYsRUFBMEJGLGVBQWUsQ0FBQ0UsS0FBRCxDQUFmLENBQXVCRCxJQUZyRCxDQUlBLG1CQUNFLGlEQUFDLDJDQUFELE1BQ0dHLFNBQVMsRUFBSUQsTUFBTSxDQUFDQyxTQUFELENBRHRCLENBRUcsQ0FBQ0EsU0FBRCxlQUFjLG9GQUZqQixDQURGLENBTUQsQ0FFRCxHQUFNQyxZQUFXLENBQUcsUUFBZEEsWUFBYyxDQUFBQyxLQUFLLENBQUksQ0FDM0IsR0FBUUwsS0FBUixDQUEwQ0ssS0FBMUMsQ0FBUUwsSUFBUixDQUFjQyxLQUFkLENBQTBDSSxLQUExQyxDQUFjSixLQUFkLENBQXFCQyxNQUFyQixDQUEwQ0csS0FBMUMsQ0FBcUJILE1BQXJCLENBQTZCSSxRQUE3QixDQUEwQ0QsS0FBMUMsQ0FBNkJDLFFBQTdCLENBRUEsbUJBQ0UsaURBQUMsa0JBQUQsQ0FBb0IsUUFBcEIsTUFDRyxTQUFBUCxlQUFlLHFCQUNkLGlEQUFDLHVCQUFELEVBQ0UsSUFBSSxDQUFFQyxJQURSLENBRUUsS0FBSyxDQUFFQyxLQUZULENBR0UsTUFBTSxDQUFFQyxNQUFNLEVBQUlJLFFBSHBCLENBSUUsZUFBZSxDQUFFUCxlQUpuQixFQURjLEVBRGxCLENBREYsQ0FZRCxDQWZELENBaUJBLEdBQU1RLGVBQWMsQ0FBRyxRQUFqQkEsZUFBaUIsQ0FBQU4sS0FBSyxDQUFJLG9CQUM5QixHQUNFLE1BQU9KLDhDQUFQLGVBQ0FXLFlBQUEsZ0JBRkYsQ0FHRSxDQUNBLEtBQU0sSUFBSUMsTUFBSixDQUNKLDJKQURJLENBQU4sQ0FJRCxDQUNELEdBQU1DLFFBQU8sQ0FBR2IsNkNBQUEsQ0FBaUJELGtCQUFqQixDQUFoQixDQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUllLEtBQUssQ0FBQ0MsTUFBTSxDQUFDWCxLQUFELENBQVAsQ0FBVCxDQUEwQixDQUN4QixLQUFNLElBQUlRLE1BQUosK0tBSWdCUixLQUpoQixTQUFOLENBTUQsQ0FFRCxtQkFBSVMsT0FBTyxDQUFDVCxLQUFELENBQVgsbUNBQUksZUFBZ0JELElBQXBCLENBQTBCLENBQ3hCLE1BQU9VLFFBQU8sQ0FBQ1QsS0FBRCxDQUFQLENBQWVELElBQXRCLENBQ0QsQ0FGRCxJQUVPLENBQ0wsS0FBTSxJQUFJUyxNQUFKLENBQ0osNE1BREksQ0FBTixDQUtELENBQ0YsQ0FqQ0QsQ0EwQ0EsUUFBU0ksUUFBVCxFQUFtQixDQUNqQixLQUFNLElBQUlKLE1BQUosQ0FDSixxVkFESSxDQUFOLENBTUQiLCJmaWxlIjoiNTQ0NC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiXG5pbXBvcnQgTGluaywge1xuICB3aXRoUHJlZml4LFxuICB3aXRoQXNzZXRQcmVmaXgsXG4gIG5hdmlnYXRlLFxuICBwdXNoLFxuICByZXBsYWNlLFxuICBuYXZpZ2F0ZVRvLFxuICBwYXJzZVBhdGgsXG59IGZyb20gXCJnYXRzYnktbGlua1wiXG5pbXBvcnQgeyB1c2VTY3JvbGxSZXN0b3JhdGlvbiB9IGZyb20gXCJnYXRzYnktcmVhY3Qtcm91dGVyLXNjcm9sbFwiXG5pbXBvcnQgUGFnZVJlbmRlcmVyIGZyb20gXCIuL3B1YmxpYy1wYWdlLXJlbmRlcmVyXCJcbmltcG9ydCBsb2FkZXIgZnJvbSBcIi4vbG9hZGVyXCJcblxuY29uc3QgcHJlZmV0Y2hQYXRobmFtZSA9IGxvYWRlci5lbnF1ZXVlXG5cbmNvbnN0IFN0YXRpY1F1ZXJ5Q29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQoe30pXG5cbmZ1bmN0aW9uIFN0YXRpY1F1ZXJ5RGF0YVJlbmRlcmVyKHsgc3RhdGljUXVlcnlEYXRhLCBkYXRhLCBxdWVyeSwgcmVuZGVyIH0pIHtcbiAgY29uc3QgZmluYWxEYXRhID0gZGF0YVxuICAgID8gZGF0YS5kYXRhXG4gICAgOiBzdGF0aWNRdWVyeURhdGFbcXVlcnldICYmIHN0YXRpY1F1ZXJ5RGF0YVtxdWVyeV0uZGF0YVxuXG4gIHJldHVybiAoXG4gICAgPFJlYWN0LkZyYWdtZW50PlxuICAgICAge2ZpbmFsRGF0YSAmJiByZW5kZXIoZmluYWxEYXRhKX1cbiAgICAgIHshZmluYWxEYXRhICYmIDxkaXY+TG9hZGluZyAoU3RhdGljUXVlcnkpPC9kaXY+fVxuICAgIDwvUmVhY3QuRnJhZ21lbnQ+XG4gIClcbn1cblxuY29uc3QgU3RhdGljUXVlcnkgPSBwcm9wcyA9PiB7XG4gIGNvbnN0IHsgZGF0YSwgcXVlcnksIHJlbmRlciwgY2hpbGRyZW4gfSA9IHByb3BzXG5cbiAgcmV0dXJuIChcbiAgICA8U3RhdGljUXVlcnlDb250ZXh0LkNvbnN1bWVyPlxuICAgICAge3N0YXRpY1F1ZXJ5RGF0YSA9PiAoXG4gICAgICAgIDxTdGF0aWNRdWVyeURhdGFSZW5kZXJlclxuICAgICAgICAgIGRhdGE9e2RhdGF9XG4gICAgICAgICAgcXVlcnk9e3F1ZXJ5fVxuICAgICAgICAgIHJlbmRlcj17cmVuZGVyIHx8IGNoaWxkcmVufVxuICAgICAgICAgIHN0YXRpY1F1ZXJ5RGF0YT17c3RhdGljUXVlcnlEYXRhfVxuICAgICAgICAvPlxuICAgICAgKX1cbiAgICA8L1N0YXRpY1F1ZXJ5Q29udGV4dC5Db25zdW1lcj5cbiAgKVxufVxuXG5jb25zdCB1c2VTdGF0aWNRdWVyeSA9IHF1ZXJ5ID0+IHtcbiAgaWYgKFxuICAgIHR5cGVvZiBSZWFjdC51c2VDb250ZXh0ICE9PSBgZnVuY3Rpb25gICYmXG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IGBkZXZlbG9wbWVudGBcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFlvdSdyZSBsaWtlbHkgdXNpbmcgYSB2ZXJzaW9uIG9mIFJlYWN0IHRoYXQgZG9lc24ndCBzdXBwb3J0IEhvb2tzXFxuYCArXG4gICAgICAgIGBQbGVhc2UgdXBkYXRlIFJlYWN0IGFuZCBSZWFjdERPTSB0byAxNi44LjAgb3IgbGF0ZXIgdG8gdXNlIHRoZSB1c2VTdGF0aWNRdWVyeSBob29rLmBcbiAgICApXG4gIH1cbiAgY29uc3QgY29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoU3RhdGljUXVlcnlDb250ZXh0KVxuXG4gIC8vIHF1ZXJ5IGlzIGEgc3RyaW5naWZpZWQgbnVtYmVyIGxpa2UgYDMzMDM4ODJgIHdoZW4gd3JhcHBlZCB3aXRoIGdyYXBocWwsIElmIGEgdXNlciBmb3JnZXRzXG4gIC8vIHRvIHdyYXAgdGhlIHF1ZXJ5IGluIGEgZ3JxcGhxbCwgdGhlbiBjYXN0aW5nIGl0IHRvIGEgTnVtYmVyIHJlc3VsdHMgaW4gYE5hTmAgYWxsb3dpbmcgdXMgdG9cbiAgLy8gY2F0Y2ggdGhlIG1pc3VzZSBvZiB0aGUgQVBJIGFuZCBnaXZlIHByb3BlciBkaXJlY3Rpb25cbiAgaWYgKGlzTmFOKE51bWJlcihxdWVyeSkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB1c2VTdGF0aWNRdWVyeSB3YXMgY2FsbGVkIHdpdGggYSBzdHJpbmcgYnV0IGV4cGVjdHMgdG8gYmUgY2FsbGVkIHVzaW5nIFxcYGdyYXBocWxcXGAuIFRyeSB0aGlzOlxuXG5pbXBvcnQgeyB1c2VTdGF0aWNRdWVyeSwgZ3JhcGhxbCB9IGZyb20gJ2dhdHNieSc7XG5cbnVzZVN0YXRpY1F1ZXJ5KGdyYXBocWxcXGAke3F1ZXJ5fVxcYCk7XG5gKVxuICB9XG5cbiAgaWYgKGNvbnRleHRbcXVlcnldPy5kYXRhKSB7XG4gICAgcmV0dXJuIGNvbnRleHRbcXVlcnldLmRhdGFcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGhlIHJlc3VsdCBvZiB0aGlzIFN0YXRpY1F1ZXJ5IGNvdWxkIG5vdCBiZSBmZXRjaGVkLlxcblxcbmAgK1xuICAgICAgICBgVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gR2F0c2J5IGFuZCBpZiByZWZyZXNoaW5nIHRoZSBwYWdlIGRvZXMgbm90IGZpeCBpdCwgYCArXG4gICAgICAgIGBwbGVhc2Ugb3BlbiBhbiBpc3N1ZSBpbiBodHRwczovL2dpdGh1Yi5jb20vZ2F0c2J5anMvZ2F0c2J5L2lzc3Vlc2BcbiAgICApXG4gIH1cbn1cblxuU3RhdGljUXVlcnkucHJvcFR5cGVzID0ge1xuICBkYXRhOiBQcm9wVHlwZXMub2JqZWN0LFxuICBxdWVyeTogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICByZW5kZXI6IFByb3BUeXBlcy5mdW5jLFxuICBjaGlsZHJlbjogUHJvcFR5cGVzLmZ1bmMsXG59XG5cbmZ1bmN0aW9uIGdyYXBocWwoKSB7XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgSXQgYXBwZWFycyBsaWtlIEdhdHNieSBpcyBtaXNjb25maWd1cmVkLiBHYXRzYnkgcmVsYXRlZCBcXGBncmFwaHFsXFxgIGNhbGxzIGAgK1xuICAgICAgYGFyZSBzdXBwb3NlZCB0byBvbmx5IGJlIGV2YWx1YXRlZCBhdCBjb21waWxlIHRpbWUsIGFuZCB0aGVuIGNvbXBpbGVkIGF3YXkuIGAgK1xuICAgICAgYFVuZm9ydHVuYXRlbHksIHNvbWV0aGluZyB3ZW50IHdyb25nIGFuZCB0aGUgcXVlcnkgd2FzIGxlZnQgaW4gdGhlIGNvbXBpbGVkIGNvZGUuXFxuXFxuYCArXG4gICAgICBgVW5sZXNzIHlvdXIgc2l0ZSBoYXMgYSBjb21wbGV4IG9yIGN1c3RvbSBiYWJlbC9HYXRzYnkgY29uZmlndXJhdGlvbiB0aGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBHYXRzYnkuYFxuICApXG59XG5cbmV4cG9ydCB7XG4gIExpbmssXG4gIHdpdGhBc3NldFByZWZpeCxcbiAgd2l0aFByZWZpeCxcbiAgZ3JhcGhxbCxcbiAgcGFyc2VQYXRoLFxuICBuYXZpZ2F0ZSxcbiAgdXNlU2Nyb2xsUmVzdG9yYXRpb24sXG4gIFN0YXRpY1F1ZXJ5Q29udGV4dCxcbiAgU3RhdGljUXVlcnksXG4gIFBhZ2VSZW5kZXJlcixcbiAgdXNlU3RhdGljUXVlcnksXG4gIHByZWZldGNoUGF0aG5hbWUsXG59XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5444\n')},8741:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "uQ": function() { return /* binding */ PageResourceStatus; },\n "kL": function() { return /* binding */ ProdLoader; },\n "ZP": function() { return /* binding */ loader; },\n "hs": function() { return /* binding */ getStaticQueryResults; },\n "jN": function() { return /* binding */ publicLoader; },\n "N1": function() { return /* binding */ setLoader; }\n});\n\n// UNUSED EXPORTS: BaseLoader\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js\nvar inheritsLoose = __webpack_require__(1788);\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js + 2 modules\nvar toConsumableArray = __webpack_require__(5061);\n;// CONCATENATED MODULE: ./.cache/prefetch.js\nvar support=function support(feature){if(typeof document==="undefined"){return false;}var fakeLink=document.createElement("link");try{if(fakeLink.relList&&typeof fakeLink.relList.supports==="function"){return fakeLink.relList.supports(feature);}}catch(err){return false;}return false;};var linkPrefetchStrategy=function linkPrefetchStrategy(url,options){return new Promise(function(resolve,reject){if(typeof document==="undefined"){reject();return;}var link=document.createElement("link");link.setAttribute("rel","prefetch");link.setAttribute("href",url);Object.keys(options).forEach(function(key){link.setAttribute(key,options[key]);});link.onload=resolve;link.onerror=reject;var parentElement=document.getElementsByTagName("head")[0]||document.getElementsByName("script")[0].parentNode;parentElement.appendChild(link);});};var xhrPrefetchStrategy=function xhrPrefetchStrategy(url){return new Promise(function(resolve,reject){var req=new XMLHttpRequest();req.open("GET",url,true);req.onload=function(){if(req.status===200){resolve();}else{reject();}};req.send(null);});};var supportedPrefetchStrategy=support("prefetch")?linkPrefetchStrategy:xhrPrefetchStrategy;var preFetched={};var prefetch=function prefetch(url,options){return new Promise(function(resolve){if(preFetched[url]){resolve();return;}supportedPrefetchStrategy(url,options).then(function(){resolve();preFetched[url]=true;}).catch(function(){});// 404s are logged to the console anyway\n});};/* harmony default export */ var _cache_prefetch = (prefetch);\n// EXTERNAL MODULE: ./.cache/emitter.js + 1 modules\nvar emitter = __webpack_require__(8110);\n// EXTERNAL MODULE: ./.cache/find-path.js + 1 modules\nvar find_path = __webpack_require__(2257);\n;// CONCATENATED MODULE: ./.cache/loader.js\n/**\n * Available resource loading statuses\n */var PageResourceStatus={/**\n * At least one of critical resources failed to load\n */Error:"error",/**\n * Resources loaded successfully\n */Success:"success"};var preferDefault=function preferDefault(m){return m&&m.default||m;};var stripSurroundingSlashes=function stripSurroundingSlashes(s){s=s[0]==="/"?s.slice(1):s;s=s.endsWith("/")?s.slice(0,-1):s;return s;};var createPageDataUrl=function createPageDataUrl(path){var fixedPath=path==="/"?"index":stripSurroundingSlashes(path);return "/justice40-tool/63e863"+"/page-data/"+fixedPath+"/page-data.json";};function doFetch(url,method){if(method===void 0){method="GET";}return new Promise(function(resolve,reject){var req=new XMLHttpRequest();req.open(method,url,true);req.onreadystatechange=function(){if(req.readyState==4){resolve(req);}};req.send(null);});}var doesConnectionSupportPrefetch=function doesConnectionSupportPrefetch(){if("connection"in navigator&&typeof navigator.connection!=="undefined"){if((navigator.connection.effectiveType||"").includes("2g")){return false;}if(navigator.connection.saveData){return false;}}return true;};var toPageResources=function toPageResources(pageData,component){if(component===void 0){component=null;}var page={componentChunkName:pageData.componentChunkName,path:pageData.path,webpackCompilationHash:pageData.webpackCompilationHash,matchPath:pageData.matchPath,staticQueryHashes:pageData.staticQueryHashes};return{component:component,json:pageData.result,page:page};};var BaseLoader=/*#__PURE__*/function(){function BaseLoader(loadComponent,matchPaths){this.inFlightNetworkRequests=new Map();// Map of pagePath -> Page. Where Page is an object with: {\n// status: PageResourceStatus.Success || PageResourceStatus.Error,\n// payload: PageResources, // undefined if PageResourceStatus.Error\n// }\n// PageResources is {\n// component,\n// json: pageData.result,\n// page: {\n// componentChunkName,\n// path,\n// webpackCompilationHash,\n// staticQueryHashes\n// },\n// staticQueryResults\n// }\nthis.pageDb=new Map();this.inFlightDb=new Map();this.staticQueryDb={};this.pageDataDb=new Map();this.prefetchTriggered=new Set();this.prefetchCompleted=new Set();this.loadComponent=loadComponent;(0,find_path/* setMatchPaths */.DS)(matchPaths);}var _proto=BaseLoader.prototype;_proto.memoizedGet=function memoizedGet(url){var _this=this;var inFlightPromise=this.inFlightNetworkRequests.get(url);if(!inFlightPromise){inFlightPromise=doFetch(url,"GET");this.inFlightNetworkRequests.set(url,inFlightPromise);}// Prefer duplication with then + catch over .finally to prevent problems in ie11 + firefox\nreturn inFlightPromise.then(function(response){_this.inFlightNetworkRequests.delete(url);return response;}).catch(function(err){_this.inFlightNetworkRequests.delete(url);throw err;});};_proto.setApiRunner=function setApiRunner(apiRunner){this.apiRunner=apiRunner;this.prefetchDisabled=apiRunner("disableCorePrefetching").some(function(a){return a;});};_proto.fetchPageDataJson=function fetchPageDataJson(loadObj){var _this2=this;var pagePath=loadObj.pagePath,_loadObj$retries=loadObj.retries,retries=_loadObj$retries===void 0?0:_loadObj$retries;var url=createPageDataUrl(pagePath);return this.memoizedGet(url).then(function(req){var status=req.status,responseText=req.responseText;// Handle 200\nif(status===200){try{var jsonPayload=JSON.parse(responseText);if(jsonPayload.path===undefined){throw new Error("not a valid pageData response");}return Object.assign(loadObj,{status:PageResourceStatus.Success,payload:jsonPayload});}catch(err){// continue regardless of error\n}}// Handle 404\nif(status===404||status===200){// If the request was for a 404 page and it doesn\'t exist, we\'re done\nif(pagePath==="/404.html"){return Object.assign(loadObj,{status:PageResourceStatus.Error});}// Need some code here to cache the 404 request. In case\n// multiple loadPageDataJsons result in 404s\nreturn _this2.fetchPageDataJson(Object.assign(loadObj,{pagePath:"/404.html",notFound:true}));}// handle 500 response (Unrecoverable)\nif(status===500){return Object.assign(loadObj,{status:PageResourceStatus.Error});}// Handle everything else, including status === 0, and 503s. Should retry\nif(retries<3){return _this2.fetchPageDataJson(Object.assign(loadObj,{retries:retries+1}));}// Retried 3 times already, result is an error.\nreturn Object.assign(loadObj,{status:PageResourceStatus.Error});});};_proto.loadPageDataJson=function loadPageDataJson(rawPath){var _this3=this;var pagePath=(0,find_path/* findPath */.Cj)(rawPath);if(this.pageDataDb.has(pagePath)){var pageData=this.pageDataDb.get(pagePath);if(true){return Promise.resolve(pageData);}}return this.fetchPageDataJson({pagePath:pagePath}).then(function(pageData){_this3.pageDataDb.set(pagePath,pageData);return pageData;});};_proto.findMatchPath=function findMatchPath(rawPath){return (0,find_path/* findMatchPath */.UD)(rawPath);}// TODO check all uses of this and whether they use undefined for page resources not exist\n;_proto.loadPage=function loadPage(rawPath){var _this4=this;var pagePath=(0,find_path/* findPath */.Cj)(rawPath);if(this.pageDb.has(pagePath)){var page=this.pageDb.get(pagePath);if(true){if(page.error){return{error:page.error,status:page.status};}return Promise.resolve(page.payload);}}if(this.inFlightDb.has(pagePath)){return this.inFlightDb.get(pagePath);}var inFlightPromise=Promise.all([this.loadAppData(),this.loadPageDataJson(pagePath)]).then(function(allData){var result=allData[1];if(result.status===PageResourceStatus.Error){return{status:PageResourceStatus.Error};}var pageData=result.payload;var _pageData=pageData,componentChunkName=_pageData.componentChunkName,_pageData$staticQuery=_pageData.staticQueryHashes,staticQueryHashes=_pageData$staticQuery===void 0?[]:_pageData$staticQuery;var finalResult={};var componentChunkPromise=_this4.loadComponent(componentChunkName).then(function(component){finalResult.createdAt=new Date();var pageResources;if(!component||component instanceof Error){finalResult.status=PageResourceStatus.Error;finalResult.error=component;}else{finalResult.status=PageResourceStatus.Success;if(result.notFound===true){finalResult.notFound=true;}pageData=Object.assign(pageData,{webpackCompilationHash:allData[0]?allData[0].webpackCompilationHash:""});pageResources=toPageResources(pageData,component);}// undefined if final result is an error\nreturn pageResources;});var staticQueryBatchPromise=Promise.all(staticQueryHashes.map(function(staticQueryHash){// Check for cache in case this static query result has already been loaded\nif(_this4.staticQueryDb[staticQueryHash]){var jsonPayload=_this4.staticQueryDb[staticQueryHash];return{staticQueryHash:staticQueryHash,jsonPayload:jsonPayload};}return _this4.memoizedGet("/justice40-tool/63e863"+"/page-data/sq/d/"+staticQueryHash+".json").then(function(req){var jsonPayload=JSON.parse(req.responseText);return{staticQueryHash:staticQueryHash,jsonPayload:jsonPayload};}).catch(function(){throw new Error("We couldn\'t load \\""+"/justice40-tool/63e863"+"/page-data/sq/d/"+staticQueryHash+".json\\"");});})).then(function(staticQueryResults){var staticQueryResultsMap={};staticQueryResults.forEach(function(_ref){var staticQueryHash=_ref.staticQueryHash,jsonPayload=_ref.jsonPayload;staticQueryResultsMap[staticQueryHash]=jsonPayload;_this4.staticQueryDb[staticQueryHash]=jsonPayload;});return staticQueryResultsMap;});return Promise.all([componentChunkPromise,staticQueryBatchPromise]).then(function(_ref2){var pageResources=_ref2[0],staticQueryResults=_ref2[1];var payload;if(pageResources){payload=Object.assign({},pageResources,{staticQueryResults:staticQueryResults});finalResult.payload=payload;emitter/* default.emit */.Z.emit("onPostLoadPageResources",{page:payload,pageResources:payload});}_this4.pageDb.set(pagePath,finalResult);if(finalResult.error){return{error:finalResult.error,status:finalResult.status};}return payload;})// when static-query fail to load we throw a better error\n.catch(function(err){return{error:err,status:PageResourceStatus.Error};});});inFlightPromise.then(function(){_this4.inFlightDb.delete(pagePath);}).catch(function(error){_this4.inFlightDb.delete(pagePath);throw error;});this.inFlightDb.set(pagePath,inFlightPromise);return inFlightPromise;}// returns undefined if the page does not exists in cache\n;_proto.loadPageSync=function loadPageSync(rawPath,options){if(options===void 0){options={};}var pagePath=(0,find_path/* findPath */.Cj)(rawPath);if(this.pageDb.has(pagePath)){var _options;var pageData=this.pageDb.get(pagePath);if(pageData.payload){return pageData.payload;}if((_options=options)!==null&&_options!==void 0&&_options.withErrorDetails){return{error:pageData.error,status:pageData.status};}}return undefined;};_proto.shouldPrefetch=function shouldPrefetch(pagePath){// Skip prefetching if we know user is on slow or constrained connection\nif(!doesConnectionSupportPrefetch()){return false;}// Check if the page exists.\nif(this.pageDb.has(pagePath)){return false;}return true;};_proto.prefetch=function prefetch(pagePath){var _this5=this;if(!this.shouldPrefetch(pagePath)){return false;}// Tell plugins with custom prefetching logic that they should start\n// prefetching this path.\nif(!this.prefetchTriggered.has(pagePath)){this.apiRunner("onPrefetchPathname",{pathname:pagePath});this.prefetchTriggered.add(pagePath);}// If a plugin has disabled core prefetching, stop now.\nif(this.prefetchDisabled){return false;}var realPath=(0,find_path/* findPath */.Cj)(pagePath);// Todo make doPrefetch logic cacheable\n// eslint-disable-next-line consistent-return\nthis.doPrefetch(realPath).then(function(){if(!_this5.prefetchCompleted.has(pagePath)){_this5.apiRunner("onPostPrefetchPathname",{pathname:pagePath});_this5.prefetchCompleted.add(pagePath);}});return true;};_proto.doPrefetch=function doPrefetch(pagePath){var _this6=this;var pageDataUrl=createPageDataUrl(pagePath);return _cache_prefetch(pageDataUrl,{crossOrigin:"anonymous",as:"fetch"}).then(function(){return(// This was just prefetched, so will return a response from\n// the cache instead of making another request to the server\n_this6.loadPageDataJson(pagePath));});};_proto.hovering=function hovering(rawPath){this.loadPage(rawPath);};_proto.getResourceURLsForPathname=function getResourceURLsForPathname(rawPath){var pagePath=(0,find_path/* findPath */.Cj)(rawPath);var page=this.pageDataDb.get(pagePath);if(page){var pageResources=toPageResources(page.payload);return[].concat((0,toConsumableArray/* default */.Z)(createComponentUrls(pageResources.page.componentChunkName)),[createPageDataUrl(pagePath)]);}else{return null;}};_proto.isPageNotFound=function isPageNotFound(rawPath){var pagePath=(0,find_path/* findPath */.Cj)(rawPath);var page=this.pageDb.get(pagePath);return!page||page.notFound;};_proto.loadAppData=function loadAppData(retries){var _this7=this;if(retries===void 0){retries=0;}return this.memoizedGet("/justice40-tool/63e863"+"/page-data/app-data.json").then(function(req){var status=req.status,responseText=req.responseText;var appData;if(status!==200&&retries<3){// Retry 3 times incase of non-200 responses\nreturn _this7.loadAppData(retries+1);}// Handle 200\nif(status===200){try{var jsonPayload=JSON.parse(responseText);if(jsonPayload.webpackCompilationHash===undefined){throw new Error("not a valid app-data response");}appData=jsonPayload;}catch(err){// continue regardless of error\n}}return appData;});};return BaseLoader;}();var createComponentUrls=function createComponentUrls(componentChunkName){return(window.___chunkMapping[componentChunkName]||[]).map(function(chunk){return "/justice40-tool/63e863"+chunk;});};var ProdLoader=/*#__PURE__*/function(_BaseLoader){(0,inheritsLoose/* default */.Z)(ProdLoader,_BaseLoader);function ProdLoader(asyncRequires,matchPaths){var loadComponent=function loadComponent(chunkName){if(!asyncRequires.components[chunkName]){throw new Error("We couldn\'t find the correct component chunk with the name "+chunkName);}return asyncRequires.components[chunkName]().then(preferDefault)// loader will handle the case when component is error\n.catch(function(err){return err;});};return _BaseLoader.call(this,loadComponent,matchPaths)||this;}var _proto2=ProdLoader.prototype;_proto2.doPrefetch=function doPrefetch(pagePath){return _BaseLoader.prototype.doPrefetch.call(this,pagePath).then(function(result){if(result.status!==PageResourceStatus.Success){return Promise.resolve();}var pageData=result.payload;var chunkName=pageData.componentChunkName;var componentUrls=createComponentUrls(chunkName);return Promise.all(componentUrls.map(_cache_prefetch)).then(function(){return pageData;});});};_proto2.loadPageDataJson=function loadPageDataJson(rawPath){return _BaseLoader.prototype.loadPageDataJson.call(this,rawPath).then(function(data){if(data.notFound){// check if html file exist using HEAD request:\n// if it does we should navigate to it instead of showing 404\nreturn doFetch(rawPath,"HEAD").then(function(req){if(req.status===200){// page (.html file) actually exist (or we asked for 404 )\n// returning page resources status as errored to trigger\n// regular browser navigation to given page\nreturn{status:PageResourceStatus.Error};}// if HEAD request wasn\'t 200, return notFound result\n// and show 404 page\nreturn data;});}return data;});};return ProdLoader;}(BaseLoader);var instance;var setLoader=function setLoader(_loader){instance=_loader;};var publicLoader={enqueue:function enqueue(rawPath){return instance.prefetch(rawPath);},// Real methods\ngetResourceURLsForPathname:function getResourceURLsForPathname(rawPath){return instance.getResourceURLsForPathname(rawPath);},loadPage:function loadPage(rawPath){return instance.loadPage(rawPath);},// TODO add deprecation to v4 so people use withErrorDetails and then we can remove in v5 and change default behaviour\nloadPageSync:function loadPageSync(rawPath,options){if(options===void 0){options={};}return instance.loadPageSync(rawPath,options);},prefetch:function prefetch(rawPath){return instance.prefetch(rawPath);},isPageNotFound:function isPageNotFound(rawPath){return instance.isPageNotFound(rawPath);},hovering:function hovering(rawPath){return instance.hovering(rawPath);},loadAppData:function loadAppData(){return instance.loadAppData();}};/* harmony default export */ var loader = (publicLoader);function getStaticQueryResults(){if(instance){return instance.staticQueryDb;}else{return{};}}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uLy5jYWNoZS9wcmVmZXRjaC5qcz9hOTNiIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vLmNhY2hlL2xvYWRlci5qcz83YTYxIl0sIm5hbWVzIjpbInN1cHBvcnQiLCJmZWF0dXJlIiwiZG9jdW1lbnQiLCJmYWtlTGluayIsImNyZWF0ZUVsZW1lbnQiLCJyZWxMaXN0Iiwic3VwcG9ydHMiLCJlcnIiLCJsaW5rUHJlZmV0Y2hTdHJhdGVneSIsInVybCIsIm9wdGlvbnMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImxpbmsiLCJzZXRBdHRyaWJ1dGUiLCJPYmplY3QiLCJrZXlzIiwiZm9yRWFjaCIsImtleSIsIm9ubG9hZCIsIm9uZXJyb3IiLCJwYXJlbnRFbGVtZW50IiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJnZXRFbGVtZW50c0J5TmFtZSIsInBhcmVudE5vZGUiLCJhcHBlbmRDaGlsZCIsInhoclByZWZldGNoU3RyYXRlZ3kiLCJyZXEiLCJYTUxIdHRwUmVxdWVzdCIsIm9wZW4iLCJzdGF0dXMiLCJzZW5kIiwic3VwcG9ydGVkUHJlZmV0Y2hTdHJhdGVneSIsInByZUZldGNoZWQiLCJwcmVmZXRjaCIsInRoZW4iLCJjYXRjaCIsIlBhZ2VSZXNvdXJjZVN0YXR1cyIsIkVycm9yIiwiU3VjY2VzcyIsInByZWZlckRlZmF1bHQiLCJtIiwiZGVmYXVsdCIsInN0cmlwU3Vycm91bmRpbmdTbGFzaGVzIiwicyIsInNsaWNlIiwiZW5kc1dpdGgiLCJjcmVhdGVQYWdlRGF0YVVybCIsInBhdGgiLCJmaXhlZFBhdGgiLCJfX1BBVEhfUFJFRklYX18iLCJkb0ZldGNoIiwibWV0aG9kIiwib25yZWFkeXN0YXRlY2hhbmdlIiwicmVhZHlTdGF0ZSIsImRvZXNDb25uZWN0aW9uU3VwcG9ydFByZWZldGNoIiwibmF2aWdhdG9yIiwiY29ubmVjdGlvbiIsImVmZmVjdGl2ZVR5cGUiLCJpbmNsdWRlcyIsInNhdmVEYXRhIiwidG9QYWdlUmVzb3VyY2VzIiwicGFnZURhdGEiLCJjb21wb25lbnQiLCJwYWdlIiwiY29tcG9uZW50Q2h1bmtOYW1lIiwid2VicGFja0NvbXBpbGF0aW9uSGFzaCIsIm1hdGNoUGF0aCIsInN0YXRpY1F1ZXJ5SGFzaGVzIiwianNvbiIsInJlc3VsdCIsIkJhc2VMb2FkZXIiLCJsb2FkQ29tcG9uZW50IiwibWF0Y2hQYXRocyIsImluRmxpZ2h0TmV0d29ya1JlcXVlc3RzIiwiTWFwIiwicGFnZURiIiwiaW5GbGlnaHREYiIsInN0YXRpY1F1ZXJ5RGIiLCJwYWdlRGF0YURiIiwicHJlZmV0Y2hUcmlnZ2VyZWQiLCJTZXQiLCJwcmVmZXRjaENvbXBsZXRlZCIsInNldE1hdGNoUGF0aHMiLCJtZW1vaXplZEdldCIsImluRmxpZ2h0UHJvbWlzZSIsImdldCIsInNldCIsInJlc3BvbnNlIiwiZGVsZXRlIiwic2V0QXBpUnVubmVyIiwiYXBpUnVubmVyIiwicHJlZmV0Y2hEaXNhYmxlZCIsInNvbWUiLCJhIiwiZmV0Y2hQYWdlRGF0YUpzb24iLCJsb2FkT2JqIiwicGFnZVBhdGgiLCJyZXRyaWVzIiwicmVzcG9uc2VUZXh0IiwianNvblBheWxvYWQiLCJKU09OIiwicGFyc2UiLCJ1bmRlZmluZWQiLCJhc3NpZ24iLCJwYXlsb2FkIiwibm90Rm91bmQiLCJsb2FkUGFnZURhdGFKc29uIiwicmF3UGF0aCIsImZpbmRQYXRoIiwiaGFzIiwicHJvY2VzcyIsImZpbmRNYXRjaFBhdGgiLCJsb2FkUGFnZSIsImVycm9yIiwiYWxsIiwibG9hZEFwcERhdGEiLCJhbGxEYXRhIiwiZmluYWxSZXN1bHQiLCJjb21wb25lbnRDaHVua1Byb21pc2UiLCJjcmVhdGVkQXQiLCJEYXRlIiwicGFnZVJlc291cmNlcyIsInN0YXRpY1F1ZXJ5QmF0Y2hQcm9taXNlIiwibWFwIiwic3RhdGljUXVlcnlIYXNoIiwic3RhdGljUXVlcnlSZXN1bHRzIiwic3RhdGljUXVlcnlSZXN1bHRzTWFwIiwiZW1pdHRlciIsImxvYWRQYWdlU3luYyIsIndpdGhFcnJvckRldGFpbHMiLCJzaG91bGRQcmVmZXRjaCIsInBhdGhuYW1lIiwiYWRkIiwicmVhbFBhdGgiLCJkb1ByZWZldGNoIiwicGFnZURhdGFVcmwiLCJwcmVmZXRjaEhlbHBlciIsImNyb3NzT3JpZ2luIiwiYXMiLCJob3ZlcmluZyIsImdldFJlc291cmNlVVJMc0ZvclBhdGhuYW1lIiwiY3JlYXRlQ29tcG9uZW50VXJscyIsImlzUGFnZU5vdEZvdW5kIiwiYXBwRGF0YSIsIndpbmRvdyIsIl9fX2NodW5rTWFwcGluZyIsImNodW5rIiwiUHJvZExvYWRlciIsImFzeW5jUmVxdWlyZXMiLCJjaHVua05hbWUiLCJjb21wb25lbnRzIiwiY29tcG9uZW50VXJscyIsImRhdGEiLCJpbnN0YW5jZSIsInNldExvYWRlciIsIl9sb2FkZXIiLCJwdWJsaWNMb2FkZXIiLCJlbnF1ZXVlIiwiZ2V0U3RhdGljUXVlcnlSZXN1bHRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxHQUFNQSxRQUFPLENBQUcsUUFBVkEsUUFBVSxDQUFVQyxPQUFWLENBQW1CLENBQ2pDLEdBQUksTUFBT0MsU0FBUCxjQUFKLENBQXFDLENBQ25DLE1BQU8sTUFBUCxDQUNELENBQ0QsR0FBTUMsU0FBUSxDQUFHRCxRQUFRLENBQUNFLGFBQVQsUUFBakIsQ0FDQSxHQUFJLENBQ0YsR0FBSUQsUUFBUSxDQUFDRSxPQUFULEVBQW9CLE1BQU9GLFNBQVEsQ0FBQ0UsT0FBVCxDQUFpQkMsUUFBeEIsYUFBeEIsQ0FBeUUsQ0FDdkUsTUFBT0gsU0FBUSxDQUFDRSxPQUFULENBQWlCQyxRQUFqQixDQUEwQkwsT0FBMUIsQ0FBUCxDQUNELENBQ0YsQ0FBQyxNQUFPTSxHQUFQLENBQVksQ0FDWixNQUFPLE1BQVAsQ0FDRCxDQUNELE1BQU8sTUFBUCxDQUNELENBYkQsQ0FlQSxHQUFNQyxxQkFBb0IsQ0FBRyxRQUF2QkEscUJBQXVCLENBQVVDLEdBQVYsQ0FBZUMsT0FBZixDQUF3QixDQUNuRCxNQUFPLElB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LENBQ3RDLEdBQUlMLFFBQUosQ0FBYyxDQUNaLE1BQU9BLFNBQVEsQ0FBQzVFLGFBQWhCLENBQ0QsQ0FGRCxJQUVPLENBQ0wsTUFBTyxFQUFQLENBQ0QsQ0FDRiIsImZpbGUiOiI4NzQxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3Qgc3VwcG9ydCA9IGZ1bmN0aW9uIChmZWF0dXJlKSB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09IGB1bmRlZmluZWRgKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgY29uc3QgZmFrZUxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGBsaW5rYClcbiAgdHJ5IHtcbiAgICBpZiAoZmFrZUxpbmsucmVsTGlzdCAmJiB0eXBlb2YgZmFrZUxpbmsucmVsTGlzdC5zdXBwb3J0cyA9PT0gYGZ1bmN0aW9uYCkge1xuICAgICAgcmV0dXJuIGZha2VMaW5rLnJlbExpc3Quc3VwcG9ydHMoZmVhdHVyZSlcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG5jb25zdCBsaW5rUHJlZmV0Y2hTdHJhdGVneSA9IGZ1bmN0aW9uICh1cmwsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSBgdW5kZWZpbmVkYCkge1xuICAgICAgcmVqZWN0KClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGBsaW5rYClcbiAgICBsaW5rLnNldEF0dHJpYnV0ZShgcmVsYCwgYHByZWZldGNoYClcbiAgICBsaW5rLnNldEF0dHJpYnV0ZShgaHJlZmAsIHVybClcblxuICAgIE9iamVjdC5rZXlzKG9wdGlvbnMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGxpbmsuc2V0QXR0cmlidXRlKGtleSwgb3B0aW9uc1trZXldKVxuICAgIH0pXG5cbiAgICBsaW5rLm9ubG9hZCA9IHJlc29sdmVcbiAgICBsaW5rLm9uZXJyb3IgPSByZWplY3RcblxuICAgIGNvbnN0IHBhcmVudEVsZW1lbnQgPVxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYGhlYWRgKVswXSB8fFxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoYHNjcmlwdGApWzBdLnBhcmVudE5vZGVcbiAgICBwYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKGxpbmspXG4gIH0pXG59XG5cbmNvbnN0IHhoclByZWZldGNoU3RyYXRlZ3kgPSBmdW5jdGlvbiAodXJsKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcbiAgICByZXEub3BlbihgR0VUYCwgdXJsLCB0cnVlKVxuXG4gICAgcmVxLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgIGlmIChyZXEuc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgcmVzb2x2ZSgpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWplY3QoKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJlcS5zZW5kKG51bGwpXG4gIH0pXG59XG5cbmNvbnN0IHN1cHBvcnRlZFByZWZldGNoU3RyYXRlZ3kgPSBzdXBwb3J0KGBwcmVmZXRjaGApXG4gID8gbGlua1ByZWZldGNoU3RyYXRlZ3lcbiAgOiB4aHJQcmVmZXRjaFN0cmF0ZWd5XG5cbmNvbnN0IHByZUZldGNoZWQgPSB7fVxuXG5jb25zdCBwcmVmZXRjaCA9IGZ1bmN0aW9uICh1cmwsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgIGlmIChwcmVGZXRjaGVkW3VybF0pIHtcbiAgICAgIHJlc29sdmUoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgc3VwcG9ydGVkUHJlZmV0Y2hTdHJhdGVneSh1cmwsIG9wdGlvbnMpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgICBwcmVGZXRjaGVkW3VybF0gPSB0cnVlXG4gICAgICB9KVxuICAgICAgLmNhdGNoKCgpID0+IHt9KSAvLyA0MDRzIGFyZSBsb2dnZWQgdG8gdGhlIGNvbnNvbGUgYW55d2F5XG4gIH0pXG59XG5cbmV4cG9ydCBkZWZhdWx0IHByZWZldGNoXG4iLCJpbXBvcnQgcHJlZmV0Y2hIZWxwZXIgZnJvbSBcIi4vcHJlZmV0Y2hcIlxuaW1wb3J0IGVtaXR0ZXIgZnJvbSBcIi4vZW1pdHRlclwiXG5pbXBvcnQgeyBzZXRNYXRjaFBhdGhzLCBmaW5kUGF0aCwgZmluZE1hdGNoUGF0aCB9IGZyb20gXCIuL2ZpbmQtcGF0aFwiXG5cbi8qKlxuICogQXZhaWxhYmxlIHJlc291cmNlIGxvYWRpbmcgc3RhdHVzZXNcbiAqL1xuZXhwb3J0IGNvbnN0IFBhZ2VSZXNvdXJjZVN0YXR1cyA9IHtcbiAgLyoqXG4gICAqIEF0IGxlYXN0IG9uZSBvZiBjcml0aWNhbCByZXNvdXJjZXMgZmFpbGVkIHRvIGxvYWRcbiAgICovXG4gIEVycm9yOiBgZXJyb3JgLFxuICAvKipcbiAgICogUmVzb3VyY2VzIGxvYWRlZCBzdWNjZXNzZnVsbHlcbiAgICovXG4gIFN1Y2Nlc3M6IGBzdWNjZXNzYCxcbn1cblxuY29uc3QgcHJlZmVyRGVmYXVsdCA9IG0gPT4gKG0gJiYgbS5kZWZhdWx0KSB8fCBtXG5cbmNvbnN0IHN0cmlwU3Vycm91bmRpbmdTbGFzaGVzID0gcyA9PiB7XG4gIHMgPSBzWzBdID09PSBgL2AgPyBzLnNsaWNlKDEpIDogc1xuICBzID0gcy5lbmRzV2l0aChgL2ApID8gcy5zbGljZSgwLCAtMSkgOiBzXG4gIHJldHVybiBzXG59XG5cbmNvbnN0IGNyZWF0ZVBhZ2VEYXRhVXJsID0gcGF0aCA9PiB7XG4gIGNvbnN0IGZpeGVkUGF0aCA9IHBhdGggPT09IGAvYCA/IGBpbmRleGAgOiBzdHJpcFN1cnJvdW5kaW5nU2xhc2hlcyhwYXRoKVxuICByZXR1cm4gYCR7X19QQVRIX1BSRUZJWF9ffS9wYWdlLWRhdGEvJHtmaXhlZFBhdGh9L3BhZ2UtZGF0YS5qc29uYFxufVxuXG5mdW5jdGlvbiBkb0ZldGNoKHVybCwgbWV0aG9kID0gYEdFVGApIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCByZXEgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuICAgIHJlcS5vcGVuKG1ldGhvZCwgdXJsLCB0cnVlKVxuICAgIHJlcS5vbnJlYWR5c3RhdGVjaGFuZ2UgPSAoKSA9PiB7XG4gICAgICBpZiAocmVxLnJlYWR5U3RhdGUgPT0gNCkge1xuICAgICAgICByZXNvbHZlKHJlcSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmVxLnNlbmQobnVsbClcbiAgfSlcbn1cblxuY29uc3QgZG9lc0Nvbm5lY3Rpb25TdXBwb3J0UHJlZmV0Y2ggPSAoKSA9PiB7XG4gIGlmIChcbiAgICBgY29ubmVjdGlvbmAgaW4gbmF2aWdhdG9yICYmXG4gICAgdHlwZW9mIG5hdmlnYXRvci5jb25uZWN0aW9uICE9PSBgdW5kZWZpbmVkYFxuICApIHtcbiAgICBpZiAoKG5hdmlnYXRvci5jb25uZWN0aW9uLmVmZmVjdGl2ZVR5cGUgfHwgYGApLmluY2x1ZGVzKGAyZ2ApKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaWYgKG5hdmlnYXRvci5jb25uZWN0aW9uLnNhdmVEYXRhKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWVcbn1cblxuY29uc3QgdG9QYWdlUmVzb3VyY2VzID0gKHBhZ2VEYXRhLCBjb21wb25lbnQgPSBudWxsKSA9PiB7XG4gIGNvbnN0IHBhZ2UgPSB7XG4gICAgY29tcG9uZW50Q2h1bmtOYW1lOiBwYWdlRGF0YS5jb21wb25lbnRDaHVua05hbWUsXG4gICAgcGF0aDogcGFnZURhdGEucGF0aCxcbiAgICB3ZWJwYWNrQ29tcGlsYXRpb25IYXNoOiBwYWdlRGF0YS53ZWJwYWNrQ29tcGlsYXRpb25IYXNoLFxuICAgIG1hdGNoUGF0aDogcGFnZURhdGEubWF0Y2hQYXRoLFxuICAgIHN0YXRpY1F1ZXJ5SGFzaGVzOiBwYWdlRGF0YS5zdGF0aWNRdWVyeUhhc2hlcyxcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY29tcG9uZW50LFxuICAgIGpzb246IHBhZ2VEYXRhLnJlc3VsdCxcbiAgICBwYWdlLFxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCYXNlTG9hZGVyIHtcbiAgY29uc3RydWN0b3IobG9hZENvbXBvbmVudCwgbWF0Y2hQYXRocykge1xuICAgIC8vIE1hcCBvZiBwYWdlUGF0aCAtPiBQYWdlLiBXaGVyZSBQYWdlIGlzIGFuIG9iamVjdCB3aXRoOiB7XG4gICAgLy8gICBzdGF0dXM6IFBhZ2VSZXNvdXJjZVN0YXR1cy5TdWNjZXNzIHx8IFBhZ2VSZXNvdXJjZVN0YXR1cy5FcnJvcixcbiAgICAvLyAgIHBheWxvYWQ6IFBhZ2VSZXNvdXJjZXMsIC8vIHVuZGVmaW5lZCBpZiBQYWdlUmVzb3VyY2VTdGF0dXMuRXJyb3JcbiAgICAvLyB9XG4gICAgLy8gUGFnZVJlc291cmNlcyBpcyB7XG4gICAgLy8gICBjb21wb25lbnQsXG4gICAgLy8gICBqc29uOiBwYWdlRGF0YS5yZXN1bHQsXG4gICAgLy8gICBwYWdlOiB7XG4gICAgLy8gICAgIGNvbXBvbmVudENodW5rTmFtZSxcbiAgICAvLyAgICAgcGF0aCxcbiAgICAvLyAgICAgd2VicGFja0NvbXBpbGF0aW9uSGFzaCxcbiAgICAvLyAgICAgc3RhdGljUXVlcnlIYXNoZXNcbiAgICAvLyAgIH0sXG4gICAgLy8gICBzdGF0aWNRdWVyeVJlc3VsdHNcbiAgICAvLyB9XG4gICAgdGhpcy5wYWdlRGIgPSBuZXcgTWFwKClcbiAgICB0aGlzLmluRmxpZ2h0RGIgPSBuZXcgTWFwKClcbiAgICB0aGlzLnN0YXRpY1F1ZXJ5RGIgPSB7fVxuICAgIHRoaXMucGFnZURhdGFEYiA9IG5ldyBNYXAoKVxuICAgIHRoaXMucHJlZmV0Y2hUcmlnZ2VyZWQgPSBuZXcgU2V0KClcbiAgICB0aGlzLnByZWZldGNoQ29tcGxldGVkID0gbmV3IFNldCgpXG4gICAgdGhpcy5sb2FkQ29tcG9uZW50ID0gbG9hZENvbXBvbmVudFxuICAgIHNldE1hdGNoUGF0aHMobWF0Y2hQYXRocylcbiAgfVxuXG4gIGluRmxpZ2h0TmV0d29ya1JlcXVlc3RzID0gbmV3IE1hcCgpXG5cbiAgbWVtb2l6ZWRHZXQodXJsKSB7XG4gICAgbGV0IGluRmxpZ2h0UHJvbWlzZSA9IHRoaXMuaW5GbGlnaHROZXR3b3JrUmVxdWVzdHMuZ2V0KHVybClcblxuICAgIGlmICghaW5GbGlnaHRQcm9taXNlKSB7XG4gICAgICBpbkZsaWdodFByb21pc2UgPSBkb0ZldGNoKHVybCwgYEdFVGApXG4gICAgICB0aGlzLmluRmxpZ2h0TmV0d29ya1JlcXVlc3RzLnNldCh1cmwsIGluRmxpZ2h0UHJvbWlzZSlcbiAgICB9XG5cbiAgICAvLyBQcmVmZXIgZHVwbGljYXRpb24gd2l0aCB0aGVuICsgY2F0Y2ggb3ZlciAuZmluYWxseSB0byBwcmV2ZW50IHByb2JsZW1zIGluIGllMTEgKyBmaXJlZm94XG4gICAgcmV0dXJuIGluRmxpZ2h0UHJvbWlzZVxuICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICB0aGlzLmluRmxpZ2h0TmV0d29ya1JlcXVlc3RzLmRlbGV0ZSh1cmwpXG4gICAgICAgIHJldHVybiByZXNwb25zZVxuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICB0aGlzLmluRmxpZ2h0TmV0d29ya1JlcXVlc3RzLmRlbGV0ZSh1cmwpXG4gICAgICAgIHRocm93IGVyclxuICAgICAgfSlcbiAgfVxuXG4gIHNldEFwaVJ1bm5lcihhcGlSdW5uZXIpIHtcbiAgICB0aGlzLmFwaVJ1bm5lciA9IGFwaVJ1bm5lclxuICAgIHRoaXMucHJlZmV0Y2hEaXNhYmxlZCA9IGFwaVJ1bm5lcihgZGlzYWJsZUNvcmVQcmVmZXRjaGluZ2ApLnNvbWUoYSA9PiBhKVxuICB9XG5cbiAgZmV0Y2hQYWdlRGF0YUpzb24obG9hZE9iaikge1xuICAgIGNvbnN0IHsgcGFnZVBhdGgsIHJldHJpZXMgPSAwIH0gPSBsb2FkT2JqXG4gICAgY29uc3QgdXJsID0gY3JlYXRlUGFnZURhdGFVcmwocGFnZVBhdGgpXG4gICAgcmV0dXJuIHRoaXMubWVtb2l6ZWRHZXQodXJsKS50aGVuKHJlcSA9PiB7XG4gICAgICBjb25zdCB7IHN0YXR1cywgcmVzcG9uc2VUZXh0IH0gPSByZXFcblxuICAgICAgLy8gSGFuZGxlIDIwMFxuICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QganNvblBheWxvYWQgPSBKU09OLnBhcnNlKHJlc3BvbnNlVGV4dClcbiAgICAgICAgICBpZiAoanNvblBheWxvYWQucGF0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vdCBhIHZhbGlkIHBhZ2VEYXRhIHJlc3BvbnNlYClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihsb2FkT2JqLCB7XG4gICAgICAgICAgICBzdGF0dXM6IFBhZ2VSZXNvdXJjZVN0YXR1cy5TdWNjZXNzLFxuICAgICAgICAgICAgcGF5bG9hZDoganNvblBheWxvYWQsXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgLy8gY29udGludWUgcmVnYXJkbGVzcyBvZiBlcnJvclxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSA0MDRcbiAgICAgIGlmIChzdGF0dXMgPT09IDQwNCB8fCBzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAvLyBJZiB0aGUgcmVxdWVzdCB3YXMgZm9yIGEgNDA0IHBhZ2UgYW5kIGl0IGRvZXNuJ3QgZXhpc3QsIHdlJ3JlIGRvbmVcbiAgICAgICAgaWYgKHBhZ2VQYXRoID09PSBgLzQwNC5odG1sYCkge1xuICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGxvYWRPYmosIHtcbiAgICAgICAgICAgIHN0YXR1czogUGFnZVJlc291cmNlU3RhdHVzLkVycm9yLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICAvLyBOZWVkIHNvbWUgY29kZSBoZXJlIHRvIGNhY2hlIHRoZSA0MDQgcmVxdWVzdC4gSW4gY2FzZVxuICAgICAgICAvLyBtdWx0aXBsZSBsb2FkUGFnZURhdGFKc29ucyByZXN1bHQgaW4gNDA0c1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaFBhZ2VEYXRhSnNvbihcbiAgICAgICAgICBPYmplY3QuYXNzaWduKGxvYWRPYmosIHsgcGFnZVBhdGg6IGAvNDA0Lmh0bWxgLCBub3RGb3VuZDogdHJ1ZSB9KVxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIC8vIGhhbmRsZSA1MDAgcmVzcG9uc2UgKFVucmVjb3ZlcmFibGUpXG4gICAgICBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obG9hZE9iaiwge1xuICAgICAgICAgIHN0YXR1czogUGFnZVJlc291cmNlU3RhdHVzLkVycm9yLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgZXZlcnl0aGluZyBlbHNlLCBpbmNsdWRpbmcgc3RhdHVzID09PSAwLCBhbmQgNTAzcy4gU2hvdWxkIHJldHJ5XG4gICAgICBpZiAocmV0cmllcyA8IDMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hQYWdlRGF0YUpzb24oXG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihsb2FkT2JqLCB7IHJldHJpZXM6IHJldHJpZXMgKyAxIH0pXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgLy8gUmV0cmllZCAzIHRpbWVzIGFscmVhZHksIHJlc3VsdCBpcyBhbiBlcnJvci5cbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGxvYWRPYmosIHtcbiAgICAgICAgc3RhdHVzOiBQYWdlUmVzb3VyY2VTdGF0dXMuRXJyb3IsXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBsb2FkUGFnZURhdGFKc29uKHJhd1BhdGgpIHtcbiAgICBjb25zdCBwYWdlUGF0aCA9IGZpbmRQYXRoKHJhd1BhdGgpXG4gICAgaWYgKHRoaXMucGFnZURhdGFEYi5oYXMocGFnZVBhdGgpKSB7XG4gICAgICBjb25zdCBwYWdlRGF0YSA9IHRoaXMucGFnZURhdGFEYi5nZXQocGFnZVBhdGgpXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuQlVJTERfU1RBR0UgIT09IGBkZXZlbG9wYCB8fCAhcGFnZURhdGEuc3RhbGUpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwYWdlRGF0YSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5mZXRjaFBhZ2VEYXRhSnNvbih7IHBhZ2VQYXRoIH0pLnRoZW4ocGFnZURhdGEgPT4ge1xuICAgICAgdGhpcy5wYWdlRGF0YURiLnNldChwYWdlUGF0aCwgcGFnZURhdGEpXG5cbiAgICAgIHJldHVybiBwYWdlRGF0YVxuICAgIH0pXG4gIH1cblxuICBmaW5kTWF0Y2hQYXRoKHJhd1BhdGgpIHtcbiAgICByZXR1cm4gZmluZE1hdGNoUGF0aChyYXdQYXRoKVxuICB9XG5cbiAgLy8gVE9ETyBjaGVjayBhbGwgdXNlcyBvZiB0aGlzIGFuZCB3aGV0aGVyIHRoZXkgdXNlIHVuZGVmaW5lZCBmb3IgcGFnZSByZXNvdXJjZXMgbm90IGV4aXN0XG4gIGxvYWRQYWdlKHJhd1BhdGgpIHtcbiAgICBjb25zdCBwYWdlUGF0aCA9IGZpbmRQYXRoKHJhd1BhdGgpXG4gICAgaWYgKHRoaXMucGFnZURiLmhhcyhwYWdlUGF0aCkpIHtcbiAgICAgIGNvbnN0IHBhZ2UgPSB0aGlzLnBhZ2VEYi5nZXQocGFnZVBhdGgpXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuQlVJTERfU1RBR0UgIT09IGBkZXZlbG9wYCB8fCAhcGFnZS5wYXlsb2FkLnN0YWxlKSB7XG4gICAgICAgIGlmIChwYWdlLmVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGVycm9yOiBwYWdlLmVycm9yLFxuICAgICAgICAgICAgc3RhdHVzOiBwYWdlLnN0YXR1cyxcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHBhZ2UucGF5bG9hZClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5pbkZsaWdodERiLmhhcyhwYWdlUGF0aCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmluRmxpZ2h0RGIuZ2V0KHBhZ2VQYXRoKVxuICAgIH1cblxuICAgIGNvbnN0IGluRmxpZ2h0UHJvbWlzZSA9IFByb21pc2UuYWxsKFtcbiAgICAgIHRoaXMubG9hZEFwcERhdGEoKSxcbiAgICAgIHRoaXMubG9hZFBhZ2VEYXRhSnNvbihwYWdlUGF0aCksXG4gICAgXSkudGhlbihhbGxEYXRhID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGFsbERhdGFbMV1cbiAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSBQYWdlUmVzb3VyY2VTdGF0dXMuRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdGF0dXM6IFBhZ2VSZXNvdXJjZVN0YXR1cy5FcnJvcixcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsZXQgcGFnZURhdGEgPSByZXN1bHQucGF5bG9hZFxuICAgICAgY29uc3QgeyBjb21wb25lbnRDaHVua05hbWUsIHN0YXRpY1F1ZXJ5SGFzaGVzID0gW10gfSA9IHBhZ2VEYXRhXG5cbiAgICAgIGNvbnN0IGZpbmFsUmVzdWx0ID0ge31cblxuICAgICAgY29uc3QgY29tcG9uZW50Q2h1bmtQcm9taXNlID0gdGhpcy5sb2FkQ29tcG9uZW50KGNvbXBvbmVudENodW5rTmFtZSkudGhlbihcbiAgICAgICAgY29tcG9uZW50ID0+IHtcbiAgICAgICAgICBmaW5hbFJlc3VsdC5jcmVhdGVkQXQgPSBuZXcgRGF0ZSgpXG4gICAgICAgICAgbGV0IHBhZ2VSZXNvdXJjZXNcbiAgICAgICAgICBpZiAoIWNvbXBvbmVudCB8fCBjb21wb25lbnQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgZmluYWxSZXN1bHQuc3RhdHVzID0gUGFnZVJlc291cmNlU3RhdHVzLkVycm9yXG4gICAgICAgICAgICBmaW5hbFJlc3VsdC5lcnJvciA9IGNvbXBvbmVudFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmaW5hbFJlc3VsdC5zdGF0dXMgPSBQYWdlUmVzb3VyY2VTdGF0dXMuU3VjY2Vzc1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5ub3RGb3VuZCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICBmaW5hbFJlc3VsdC5ub3RGb3VuZCA9IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhZ2VEYXRhID0gT2JqZWN0LmFzc2lnbihwYWdlRGF0YSwge1xuICAgICAgICAgICAgICB3ZWJwYWNrQ29tcGlsYXRpb25IYXNoOiBhbGxEYXRhWzBdXG4gICAgICAgICAgICAgICAgPyBhbGxEYXRhWzBdLndlYnBhY2tDb21waWxhdGlvbkhhc2hcbiAgICAgICAgICAgICAgICA6IGBgLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHBhZ2VSZXNvdXJjZXMgPSB0b1BhZ2VSZXNvdXJjZXMocGFnZURhdGEsIGNvbXBvbmVudClcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gdW5kZWZpbmVkIGlmIGZpbmFsIHJlc3VsdCBpcyBhbiBlcnJvclxuICAgICAgICAgIHJldHVybiBwYWdlUmVzb3VyY2VzXG4gICAgICAgIH1cbiAgICAgIClcblxuICAgICAgY29uc3Qgc3RhdGljUXVlcnlCYXRjaFByb21pc2UgPSBQcm9taXNlLmFsbChcbiAgICAgICAgc3RhdGljUXVlcnlIYXNoZXMubWFwKHN0YXRpY1F1ZXJ5SGFzaCA9PiB7XG4gICAgICAgICAgLy8gQ2hlY2sgZm9yIGNhY2hlIGluIGNhc2UgdGhpcyBzdGF0aWMgcXVlcnkgcmVzdWx0IGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkXG4gICAgICAgICAgaWYgKHRoaXMuc3RhdGljUXVlcnlEYltzdGF0aWNRdWVyeUhhc2hdKSB7XG4gICAgICAgICAgICBjb25zdCBqc29uUGF5bG9hZCA9IHRoaXMuc3RhdGljUXVlcnlEYltzdGF0aWNRdWVyeUhhc2hdXG4gICAgICAgICAgICByZXR1cm4geyBzdGF0aWNRdWVyeUhhc2gsIGpzb25QYXlsb2FkIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdGhpcy5tZW1vaXplZEdldChcbiAgICAgICAgICAgIGAke19fUEFUSF9QUkVGSVhfX30vcGFnZS1kYXRhL3NxL2QvJHtzdGF0aWNRdWVyeUhhc2h9Lmpzb25gXG4gICAgICAgICAgKVxuICAgICAgICAgICAgLnRoZW4ocmVxID0+IHtcbiAgICAgICAgICAgICAgY29uc3QganNvblBheWxvYWQgPSBKU09OLnBhcnNlKHJlcS5yZXNwb25zZVRleHQpXG4gICAgICAgICAgICAgIHJldHVybiB7IHN0YXRpY1F1ZXJ5SGFzaCwganNvblBheWxvYWQgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgV2UgY291bGRuJ3QgbG9hZCBcIiR7X19QQVRIX1BSRUZJWF9ffS9wYWdlLWRhdGEvc3EvZC8ke3N0YXRpY1F1ZXJ5SGFzaH0uanNvblwiYFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgKS50aGVuKHN0YXRpY1F1ZXJ5UmVzdWx0cyA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXRpY1F1ZXJ5UmVzdWx0c01hcCA9IHt9XG5cbiAgICAgICAgc3RhdGljUXVlcnlSZXN1bHRzLmZvckVhY2goKHsgc3RhdGljUXVlcnlIYXNoLCBqc29uUGF5bG9hZCB9KSA9PiB7XG4gICAgICAgICAgc3RhdGljUXVlcnlSZXN1bHRzTWFwW3N0YXRpY1F1ZXJ5SGFzaF0gPSBqc29uUGF5bG9hZFxuICAgICAgICAgIHRoaXMuc3RhdGljUXVlcnlEYltzdGF0aWNRdWVyeUhhc2hdID0ganNvblBheWxvYWRcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gc3RhdGljUXVlcnlSZXN1bHRzTWFwXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4gKFxuICAgICAgICBQcm9taXNlLmFsbChbY29tcG9uZW50Q2h1bmtQcm9taXNlLCBzdGF0aWNRdWVyeUJhdGNoUHJvbWlzZV0pXG4gICAgICAgICAgLnRoZW4oKFtwYWdlUmVzb3VyY2VzLCBzdGF0aWNRdWVyeVJlc3VsdHNdKSA9PiB7XG4gICAgICAgICAgICBsZXQgcGF5bG9hZFxuICAgICAgICAgICAgaWYgKHBhZ2VSZXNvdXJjZXMpIHtcbiAgICAgICAgICAgICAgcGF5bG9hZCA9IHsgLi4ucGFnZVJlc291cmNlcywgc3RhdGljUXVlcnlSZXN1bHRzIH1cbiAgICAgICAgICAgICAgZmluYWxSZXN1bHQucGF5bG9hZCA9IHBheWxvYWRcbiAgICAgICAgICAgICAgZW1pdHRlci5lbWl0KGBvblBvc3RMb2FkUGFnZVJlc291cmNlc2AsIHtcbiAgICAgICAgICAgICAgICBwYWdlOiBwYXlsb2FkLFxuICAgICAgICAgICAgICAgIHBhZ2VSZXNvdXJjZXM6IHBheWxvYWQsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMucGFnZURiLnNldChwYWdlUGF0aCwgZmluYWxSZXN1bHQpXG5cbiAgICAgICAgICAgIGlmIChmaW5hbFJlc3VsdC5lcnJvcikge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGVycm9yOiBmaW5hbFJlc3VsdC5lcnJvcixcbiAgICAgICAgICAgICAgICBzdGF0dXM6IGZpbmFsUmVzdWx0LnN0YXR1cyxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLy8gd2hlbiBzdGF0aWMtcXVlcnkgZmFpbCB0byBsb2FkIHdlIHRocm93IGEgYmV0dGVyIGVycm9yXG4gICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBlcnJvcjogZXJyLFxuICAgICAgICAgICAgICBzdGF0dXM6IFBhZ2VSZXNvdXJjZVN0YXR1cy5FcnJvcixcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgKVxuICAgIH0pXG5cbiAgICBpbkZsaWdodFByb21pc2VcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5pbkZsaWdodERiLmRlbGV0ZShwYWdlUGF0aClcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICB0aGlzLmluRmxpZ2h0RGIuZGVsZXRlKHBhZ2VQYXRoKVxuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfSlcblxuICAgIHRoaXMuaW5GbGlnaHREYi5zZXQocGFnZVBhdGgsIGluRmxpZ2h0UHJvbWlzZSlcblxuICAgIHJldHVybiBpbkZsaWdodFByb21pc2VcbiAgfVxuXG4gIC8vIHJldHVybnMgdW5kZWZpbmVkIGlmIHRoZSBwYWdlIGRvZXMgbm90IGV4aXN0cyBpbiBjYWNoZVxuICBsb2FkUGFnZVN5bmMocmF3UGF0aCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgcGFnZVBhdGggPSBmaW5kUGF0aChyYXdQYXRoKVxuICAgIGlmICh0aGlzLnBhZ2VEYi5oYXMocGFnZVBhdGgpKSB7XG4gICAgICBjb25zdCBwYWdlRGF0YSA9IHRoaXMucGFnZURiLmdldChwYWdlUGF0aClcblxuICAgICAgaWYgKHBhZ2VEYXRhLnBheWxvYWQpIHtcbiAgICAgICAgcmV0dXJuIHBhZ2VEYXRhLnBheWxvYWRcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnM/LndpdGhFcnJvckRldGFpbHMpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlcnJvcjogcGFnZURhdGEuZXJyb3IsXG4gICAgICAgICAgc3RhdHVzOiBwYWdlRGF0YS5zdGF0dXMsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgc2hvdWxkUHJlZmV0Y2gocGFnZVBhdGgpIHtcbiAgICAvLyBTa2lwIHByZWZldGNoaW5nIGlmIHdlIGtub3cgdXNlciBpcyBvbiBzbG93IG9yIGNvbnN0cmFpbmVkIGNvbm5lY3Rpb25cbiAgICBpZiAoIWRvZXNDb25uZWN0aW9uU3VwcG9ydFByZWZldGNoKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRoZSBwYWdlIGV4aXN0cy5cbiAgICBpZiAodGhpcy5wYWdlRGIuaGFzKHBhZ2VQYXRoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHByZWZldGNoKHBhZ2VQYXRoKSB7XG4gICAgaWYgKCF0aGlzLnNob3VsZFByZWZldGNoKHBhZ2VQYXRoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLy8gVGVsbCBwbHVnaW5zIHdpdGggY3VzdG9tIHByZWZldGNoaW5nIGxvZ2ljIHRoYXQgdGhleSBzaG91bGQgc3RhcnRcbiAgICAvLyBwcmVmZXRjaGluZyB0aGlzIHBhdGguXG4gICAgaWYgKCF0aGlzLnByZWZldGNoVHJpZ2dlcmVkLmhhcyhwYWdlUGF0aCkpIHtcbiAgICAgIHRoaXMuYXBpUnVubmVyKGBvblByZWZldGNoUGF0aG5hbWVgLCB7IHBhdGhuYW1lOiBwYWdlUGF0aCB9KVxuICAgICAgdGhpcy5wcmVmZXRjaFRyaWdnZXJlZC5hZGQocGFnZVBhdGgpXG4gICAgfVxuXG4gICAgLy8gSWYgYSBwbHVnaW4gaGFzIGRpc2FibGVkIGNvcmUgcHJlZmV0Y2hpbmcsIHN0b3Agbm93LlxuICAgIGlmICh0aGlzLnByZWZldGNoRGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGNvbnN0IHJlYWxQYXRoID0gZmluZFBhdGgocGFnZVBhdGgpXG4gICAgLy8gVG9kbyBtYWtlIGRvUHJlZmV0Y2ggbG9naWMgY2FjaGVhYmxlXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG4gICAgdGhpcy5kb1ByZWZldGNoKHJlYWxQYXRoKS50aGVuKCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5wcmVmZXRjaENvbXBsZXRlZC5oYXMocGFnZVBhdGgpKSB7XG4gICAgICAgIHRoaXMuYXBpUnVubmVyKGBvblBvc3RQcmVmZXRjaFBhdGhuYW1lYCwgeyBwYXRobmFtZTogcGFnZVBhdGggfSlcbiAgICAgICAgdGhpcy5wcmVmZXRjaENvbXBsZXRlZC5hZGQocGFnZVBhdGgpXG4gICAgICB9XG4gICAgfSlcblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBkb1ByZWZldGNoKHBhZ2VQYXRoKSB7XG4gICAgY29uc3QgcGFnZURhdGFVcmwgPSBjcmVhdGVQYWdlRGF0YVVybChwYWdlUGF0aClcbiAgICByZXR1cm4gcHJlZmV0Y2hIZWxwZXIocGFnZURhdGFVcmwsIHtcbiAgICAgIGNyb3NzT3JpZ2luOiBgYW5vbnltb3VzYCxcbiAgICAgIGFzOiBgZmV0Y2hgLFxuICAgIH0pLnRoZW4oKCkgPT5cbiAgICAgIC8vIFRoaXMgd2FzIGp1c3QgcHJlZmV0Y2hlZCwgc28gd2lsbCByZXR1cm4gYSByZXNwb25zZSBmcm9tXG4gICAgICAvLyB0aGUgY2FjaGUgaW5zdGVhZCBvZiBtYWtpbmcgYW5vdGhlciByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXJcbiAgICAgIHRoaXMubG9hZFBhZ2VEYXRhSnNvbihwYWdlUGF0aClcbiAgICApXG4gIH1cblxuICBob3ZlcmluZyhyYXdQYXRoKSB7XG4gICAgdGhpcy5sb2FkUGFnZShyYXdQYXRoKVxuICB9XG5cbiAgZ2V0UmVzb3VyY2VVUkxzRm9yUGF0aG5hbWUocmF3UGF0aCkge1xuICAgIGNvbnN0IHBhZ2VQYXRoID0gZmluZFBhdGgocmF3UGF0aClcbiAgICBjb25zdCBwYWdlID0gdGhpcy5wYWdlRGF0YURiLmdldChwYWdlUGF0aClcbiAgICBpZiAocGFnZSkge1xuICAgICAgY29uc3QgcGFnZVJlc291cmNlcyA9IHRvUGFnZVJlc291cmNlcyhwYWdlLnBheWxvYWQpXG5cbiAgICAgIHJldHVybiBbXG4gICAgICAgIC4uLmNyZWF0ZUNvbXBvbmVudFVybHMocGFnZVJlc291cmNlcy5wYWdlLmNvbXBvbmVudENodW5rTmFtZSksXG4gICAgICAgIGNyZWF0ZVBhZ2VEYXRhVXJsKHBhZ2VQYXRoKSxcbiAgICAgIF1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICBpc1BhZ2VOb3RGb3VuZChyYXdQYXRoKSB7XG4gICAgY29uc3QgcGFnZVBhdGggPSBmaW5kUGF0aChyYXdQYXRoKVxuICAgIGNvbnN0IHBhZ2UgPSB0aGlzLnBhZ2VEYi5nZXQocGFnZVBhdGgpXG4gICAgcmV0dXJuICFwYWdlIHx8IHBhZ2Uubm90Rm91bmRcbiAgfVxuXG4gIGxvYWRBcHBEYXRhKHJldHJpZXMgPSAwKSB7XG4gICAgcmV0dXJuIHRoaXMubWVtb2l6ZWRHZXQoYCR7X19QQVRIX1BSRUZJWF9ffS9wYWdlLWRhdGEvYXBwLWRhdGEuanNvbmApLnRoZW4oXG4gICAgICByZXEgPT4ge1xuICAgICAgICBjb25zdCB7IHN0YXR1cywgcmVzcG9uc2VUZXh0IH0gPSByZXFcblxuICAgICAgICBsZXQgYXBwRGF0YVxuXG4gICAgICAgIGlmIChzdGF0dXMgIT09IDIwMCAmJiByZXRyaWVzIDwgMykge1xuICAgICAgICAgIC8vIFJldHJ5IDMgdGltZXMgaW5jYXNlIG9mIG5vbi0yMDAgcmVzcG9uc2VzXG4gICAgICAgICAgcmV0dXJuIHRoaXMubG9hZEFwcERhdGEocmV0cmllcyArIDEpXG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgMjAwXG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBqc29uUGF5bG9hZCA9IEpTT04ucGFyc2UocmVzcG9uc2VUZXh0KVxuICAgICAgICAgICAgaWYgKGpzb25QYXlsb2FkLndlYnBhY2tDb21waWxhdGlvbkhhc2ggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vdCBhIHZhbGlkIGFwcC1kYXRhIHJlc3BvbnNlYClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYXBwRGF0YSA9IGpzb25QYXlsb2FkXG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAvLyBjb250aW51ZSByZWdhcmRsZXNzIG9mIGVycm9yXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFwcERhdGFcbiAgICAgIH1cbiAgICApXG4gIH1cbn1cblxuY29uc3QgY3JlYXRlQ29tcG9uZW50VXJscyA9IGNvbXBvbmVudENodW5rTmFtZSA9PlxuICAod2luZG93Ll9fX2NodW5rTWFwcGluZ1tjb21wb25lbnRDaHVua05hbWVdIHx8IFtdKS5tYXAoXG4gICAgY2h1bmsgPT4gX19QQVRIX1BSRUZJWF9fICsgY2h1bmtcbiAgKVxuXG5leHBvcnQgY2xhc3MgUHJvZExvYWRlciBleHRlbmRzIEJhc2VMb2FkZXIge1xuICBjb25zdHJ1Y3Rvcihhc3luY1JlcXVpcmVzLCBtYXRjaFBhdGhzKSB7XG4gICAgY29uc3QgbG9hZENvbXBvbmVudCA9IGNodW5rTmFtZSA9PiB7XG4gICAgICBpZiAoIWFzeW5jUmVxdWlyZXMuY29tcG9uZW50c1tjaHVua05hbWVdKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgV2UgY291bGRuJ3QgZmluZCB0aGUgY29ycmVjdCBjb21wb25lbnQgY2h1bmsgd2l0aCB0aGUgbmFtZSAke2NodW5rTmFtZX1gXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgYXN5bmNSZXF1aXJlcy5jb21wb25lbnRzW2NodW5rTmFtZV0oKVxuICAgICAgICAgIC50aGVuKHByZWZlckRlZmF1bHQpXG4gICAgICAgICAgLy8gbG9hZGVyIHdpbGwgaGFuZGxlIHRoZSBjYXNlIHdoZW4gY29tcG9uZW50IGlzIGVycm9yXG4gICAgICAgICAgLmNhdGNoKGVyciA9PiBlcnIpXG4gICAgICApXG4gICAgfVxuXG4gICAgc3VwZXIobG9hZENvbXBvbmVudCwgbWF0Y2hQYXRocylcbiAgfVxuXG4gIGRvUHJlZmV0Y2gocGFnZVBhdGgpIHtcbiAgICByZXR1cm4gc3VwZXIuZG9QcmVmZXRjaChwYWdlUGF0aCkudGhlbihyZXN1bHQgPT4ge1xuICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgIT09IFBhZ2VSZXNvdXJjZVN0YXR1cy5TdWNjZXNzKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgfVxuICAgICAgY29uc3QgcGFnZURhdGEgPSByZXN1bHQucGF5bG9hZFxuICAgICAgY29uc3QgY2h1bmtOYW1lID0gcGFnZURhdGEuY29tcG9uZW50Q2h1bmtOYW1lXG4gICAgICBjb25zdCBjb21wb25lbnRVcmxzID0gY3JlYXRlQ29tcG9uZW50VXJscyhjaHVua05hbWUpXG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwoY29tcG9uZW50VXJscy5tYXAocHJlZmV0Y2hIZWxwZXIpKS50aGVuKCgpID0+IHBhZ2VEYXRhKVxuICAgIH0pXG4gIH1cblxuICBsb2FkUGFnZURhdGFKc29uKHJhd1BhdGgpIHtcbiAgICByZXR1cm4gc3VwZXIubG9hZFBhZ2VEYXRhSnNvbihyYXdQYXRoKS50aGVuKGRhdGEgPT4ge1xuICAgICAgaWYgKGRhdGEubm90Rm91bmQpIHtcbiAgICAgICAgLy8gY2hlY2sgaWYgaHRtbCBmaWxlIGV4aXN0IHVzaW5nIEhFQUQgcmVxdWVzdDpcbiAgICAgICAgLy8gaWYgaXQgZG9lcyB3ZSBzaG91bGQgbmF2aWdhdGUgdG8gaXQgaW5zdGVhZCBvZiBzaG93aW5nIDQwNFxuICAgICAgICByZXR1cm4gZG9GZXRjaChyYXdQYXRoLCBgSEVBRGApLnRoZW4ocmVxID0+IHtcbiAgICAgICAgICBpZiAocmVxLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICAvLyBwYWdlICguaHRtbCBmaWxlKSBhY3R1YWxseSBleGlzdCAob3Igd2UgYXNrZWQgZm9yIDQwNCApXG4gICAgICAgICAgICAvLyByZXR1cm5pbmcgcGFnZSByZXNvdXJjZXMgc3RhdHVzIGFzIGVycm9yZWQgdG8gdHJpZ2dlclxuICAgICAgICAgICAgLy8gcmVndWxhciBicm93c2VyIG5hdmlnYXRpb24gdG8gZ2l2ZW4gcGFnZVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgc3RhdHVzOiBQYWdlUmVzb3VyY2VTdGF0dXMuRXJyb3IsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gaWYgSEVBRCByZXF1ZXN0IHdhc24ndCAyMDAsIHJldHVybiBub3RGb3VuZCByZXN1bHRcbiAgICAgICAgICAvLyBhbmQgc2hvdyA0MDQgcGFnZVxuICAgICAgICAgIHJldHVybiBkYXRhXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0YVxuICAgIH0pXG4gIH1cbn1cblxubGV0IGluc3RhbmNlXG5cbmV4cG9ydCBjb25zdCBzZXRMb2FkZXIgPSBfbG9hZGVyID0+IHtcbiAgaW5zdGFuY2UgPSBfbG9hZGVyXG59XG5cbmV4cG9ydCBjb25zdCBwdWJsaWNMb2FkZXIgPSB7XG4gIGVucXVldWU6IHJhd1BhdGggPT4gaW5zdGFuY2UucHJlZmV0Y2gocmF3UGF0aCksXG5cbiAgLy8gUmVhbCBtZXRob2RzXG4gIGdldFJlc291cmNlVVJMc0ZvclBhdGhuYW1lOiByYXdQYXRoID0+XG4gICAgaW5zdGFuY2UuZ2V0UmVzb3VyY2VVUkxzRm9yUGF0aG5hbWUocmF3UGF0aCksXG4gIGxvYWRQYWdlOiByYXdQYXRoID0+IGluc3RhbmNlLmxvYWRQYWdlKHJhd1BhdGgpLFxuICAvLyBUT0RPIGFkZCBkZXByZWNhdGlvbiB0byB2NCBzbyBwZW9wbGUgdXNlIHdpdGhFcnJvckRldGFpbHMgYW5kIHRoZW4gd2UgY2FuIHJlbW92ZSBpbiB2NSBhbmQgY2hhbmdlIGRlZmF1bHQgYmVoYXZpb3VyXG4gIGxvYWRQYWdlU3luYzogKHJhd1BhdGgsIG9wdGlvbnMgPSB7fSkgPT5cbiAgICBpbnN0YW5jZS5sb2FkUGFnZVN5bmMocmF3UGF0aCwgb3B0aW9ucyksXG4gIHByZWZldGNoOiByYXdQYXRoID0+IGluc3RhbmNlLnByZWZldGNoKHJhd1BhdGgpLFxuICBpc1BhZ2VOb3RGb3VuZDogcmF3UGF0aCA9PiBpbnN0YW5jZS5pc1BhZ2VOb3RGb3VuZChyYXdQYXRoKSxcbiAgaG92ZXJpbmc6IHJhd1BhdGggPT4gaW5zdGFuY2UuaG92ZXJpbmcocmF3UGF0aCksXG4gIGxvYWRBcHBEYXRhOiAoKSA9PiBpbnN0YW5jZS5sb2FkQXBwRGF0YSgpLFxufVxuXG5leHBvcnQgZGVmYXVsdCBwdWJsaWNMb2FkZXJcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YXRpY1F1ZXJ5UmVzdWx0cygpIHtcbiAgaWYgKGluc3RhbmNlKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlLnN0YXRpY1F1ZXJ5RGJcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge31cbiAgfVxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///8741\n')},804:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(1788);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7294);\n/* harmony import */ var _api_runner_browser__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7343);\n/* harmony import */ var _find_path__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(2257);\n// Renders page\nvar PageRenderer=/*#__PURE__*/function(_React$Component){(0,_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_3__/* .default */ .Z)(PageRenderer,_React$Component);function PageRenderer(){return _React$Component.apply(this,arguments)||this;}var _proto=PageRenderer.prototype;_proto.render=function render(){var props=Object.assign({},this.props,{params:Object.assign({},(0,_find_path__WEBPACK_IMPORTED_MODULE_2__/* .grabMatchParams */ .GA)(this.props.location.pathname),this.props.pageResources.json.pageContext.__params)});var pageElement=/*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(this.props.pageResources.component,Object.assign({},props,{key:this.props.path||this.props.pageResources.page.path}));var wrappedPage=(0,_api_runner_browser__WEBPACK_IMPORTED_MODULE_1__/* .apiRunner */ .h)("wrapPageElement",{element:pageElement,props:props},pageElement,function(_ref){var result=_ref.result;return{element:result,props:props};}).pop();return wrappedPage;};return PageRenderer;}(react__WEBPACK_IMPORTED_MODULE_0__.Component);/* harmony default export */ __webpack_exports__["Z"] = (PageRenderer);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uLy5jYWNoZS9wYWdlLXJlbmRlcmVyLmpzPzIwZTUiXSwibmFtZXMiOlsiUGFnZVJlbmRlcmVyIiwicmVuZGVyIiwicHJvcHMiLCJwYXJhbXMiLCJncmFiTWF0Y2hQYXJhbXMiLCJsb2NhdGlvbiIsInBhdGhuYW1lIiwicGFnZVJlc291cmNlcyIsImpzb24iLCJwYWdlQ29udGV4dCIsIl9fcGFyYW1zIiwicGFnZUVsZW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiY29tcG9uZW50Iiwia2V5IiwicGF0aCIsInBhZ2UiLCJ3cmFwcGVkUGFnZSIsImFwaVJ1bm5lciIsImVsZW1lbnQiLCJyZXN1bHQiLCJwb3AiLCJSZWFjdCJdLCJtYXBwaW5ncyI6Ijs7OztBQUtBO0dBQ01BLGEseVJBQ0pDLE0sQ0FBQSxpQkFBUyxDQUNQLEdBQU1DLE1BQUssa0JBQ04sS0FBS0EsS0FEQyxFQUVUQyxNQUFNLGtCQUNEQyxxRUFBZSxDQUFDLEtBQUtGLEtBQUwsQ0FBV0csUUFBWCxDQUFvQkMsUUFBckIsQ0FEZCxDQUVELEtBQUtKLEtBQUwsQ0FBV0ssYUFBWCxDQUF5QkMsSUFBekIsQ0FBOEJDLFdBQTlCLENBQTBDQyxRQUZ6QyxDQUZHLEVBQVgsQ0FRQSxHQUFNQyxZQUFXLGNBQUdDLG9EQUFhLENBQUMsS0FBS1YsS0FBTCxDQUFXSyxhQUFYLENBQXlCTSxTQUExQixrQkFDNUJYLEtBRDRCLEVBRS9CWSxHQUFHLENBQUUsS0FBS1osS0FBTCxDQUFXYSxJQUFYLEVBQW1CLEtBQUtiLEtBQUwsQ0FBV0ssYUFBWCxDQUF5QlMsSUFBekIsQ0FBOEJELElBRnZCLEdBQWpDLENBS0EsR0FBTUUsWUFBVyxDQUFHQyx1RUFBUyxtQkFFM0IsQ0FBRUMsT0FBTyxDQUFFUixXQUFYLENBQXdCVCxLQUFLLENBQUxBLEtBQXhCLENBRjJCLENBRzNCUyxXQUgyQixDQUkzQixjQUFnQixJQUFiUyxPQUFhLE1BQWJBLE1BQWEsQ0FDZCxNQUFPLENBQUVELE9BQU8sQ0FBRUMsTUFBWCxDQUFtQmxCLEtBQUssQ0FBTEEsS0FBbkIsQ0FBUCxDQUNELENBTjBCLENBQVQsQ0FPbEJtQixHQVBrQixFQUFwQixDQVNBLE1BQU9KLFlBQVAsQ0FDRCxDLHVCQXpCd0JLLDRDLEVBbUMzQix5REFBZXRCLFlBQWYiLCJmaWxlIjoiODA0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IGNyZWF0ZUVsZW1lbnQgfSBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiXG5pbXBvcnQgeyBhcGlSdW5uZXIgfSBmcm9tIFwiLi9hcGktcnVubmVyLWJyb3dzZXJcIlxuaW1wb3J0IHsgZ3JhYk1hdGNoUGFyYW1zIH0gZnJvbSBcIi4vZmluZC1wYXRoXCJcblxuLy8gUmVuZGVycyBwYWdlXG5jbGFzcyBQYWdlUmVuZGVyZXIgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIoKSB7XG4gICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAuLi50aGlzLnByb3BzLFxuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIC4uLmdyYWJNYXRjaFBhcmFtcyh0aGlzLnByb3BzLmxvY2F0aW9uLnBhdGhuYW1lKSxcbiAgICAgICAgLi4udGhpcy5wcm9wcy5wYWdlUmVzb3VyY2VzLmpzb24ucGFnZUNvbnRleHQuX19wYXJhbXMsXG4gICAgICB9LFxuICAgIH1cblxuICAgIGNvbnN0IHBhZ2VFbGVtZW50ID0gY3JlYXRlRWxlbWVudCh0aGlzLnByb3BzLnBhZ2VSZXNvdXJjZXMuY29tcG9uZW50LCB7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIGtleTogdGhpcy5wcm9wcy5wYXRoIHx8IHRoaXMucHJvcHMucGFnZVJlc291cmNlcy5wYWdlLnBhdGgsXG4gICAgfSlcblxuICAgIGNvbnN0IHdyYXBwZWRQYWdlID0gYXBpUnVubmVyKFxuICAgICAgYHdyYXBQYWdlRWxlbWVudGAsXG4gICAgICB7IGVsZW1lbnQ6IHBhZ2VFbGVtZW50LCBwcm9wcyB9LFxuICAgICAgcGFnZUVsZW1lbnQsXG4gICAgICAoeyByZXN1bHQgfSkgPT4ge1xuICAgICAgICByZXR1cm4geyBlbGVtZW50OiByZXN1bHQsIHByb3BzIH1cbiAgICAgIH1cbiAgICApLnBvcCgpXG5cbiAgICByZXR1cm4gd3JhcHBlZFBhZ2VcbiAgfVxufVxuXG5QYWdlUmVuZGVyZXIucHJvcFR5cGVzID0ge1xuICBsb2NhdGlvbjogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICBwYWdlUmVzb3VyY2VzOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gIGRhdGE6IFByb3BUeXBlcy5vYmplY3QsXG4gIHBhZ2VDb250ZXh0OiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG59XG5cbmV4cG9ydCBkZWZhdWx0IFBhZ2VSZW5kZXJlclxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///804\n')},2871:function(__unused_webpack_module,__unused_webpack___webpack_exports__,__webpack_require__){"use strict";eval('\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js\nvar inheritsLoose = __webpack_require__(1788);\n// EXTERNAL MODULE: ./.cache/api-runner-browser.js\nvar api_runner_browser = __webpack_require__(7343);\n// EXTERNAL MODULE: ./node_modules/react/index.js\nvar react = __webpack_require__(7294);\n// EXTERNAL MODULE: ./node_modules/react-dom/index.js\nvar react_dom = __webpack_require__(3935);\n// EXTERNAL MODULE: ./node_modules/@gatsbyjs/reach-router/es/index.js + 2 modules\nvar es = __webpack_require__(9499);\n// EXTERNAL MODULE: ./node_modules/gatsby-react-router-scroll/index.js\nvar gatsby_react_router_scroll = __webpack_require__(9679);\n// EXTERNAL MODULE: ./.cache/gatsby-browser-entry.js\nvar gatsby_browser_entry = __webpack_require__(5444);\n// EXTERNAL MODULE: ./.cache/loader.js + 1 modules\nvar loader = __webpack_require__(8741);\n// EXTERNAL MODULE: ./.cache/redirect-utils.js + 1 modules\nvar redirect_utils = __webpack_require__(5166);\n// EXTERNAL MODULE: ./.cache/emitter.js + 1 modules\nvar emitter = __webpack_require__(8110);\n;// CONCATENATED MODULE: ./.cache/route-announcer-props.js\n// This is extracted to separate module because it\'s shared\n// between browser and SSR code\nvar RouteAnnouncerProps={id:"gatsby-announcer",style:{position:"absolute",top:0,width:1,height:1,padding:0,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",border:0},"aria-live":"assertive","aria-atomic":"true"};\n// EXTERNAL MODULE: ./node_modules/@gatsbyjs/reach-router/lib/history.js\nvar lib_history = __webpack_require__(2393);\n// EXTERNAL MODULE: ./node_modules/gatsby-link/index.js\nvar gatsby_link = __webpack_require__(8037);\n;// CONCATENATED MODULE: ./.cache/navigation.js\nfunction maybeRedirect(pathname){var redirect=(0,redirect_utils/* maybeGetBrowserRedirect */.J)(pathname);if(redirect!=null){window.___replace(redirect.toPath);return true;}else{return false;}}var onPreRouteUpdate=function onPreRouteUpdate(location,prevLocation){if(!maybeRedirect(location.pathname)){(0,api_runner_browser/* apiRunner */.h)("onPreRouteUpdate",{location:location,prevLocation:prevLocation});}};var onRouteUpdate=function onRouteUpdate(location,prevLocation){if(!maybeRedirect(location.pathname)){(0,api_runner_browser/* apiRunner */.h)("onRouteUpdate",{location:location,prevLocation:prevLocation});if(false){}}};var navigation_navigate=function navigate(to,options){if(options===void 0){options={};}// Support forward/backward navigation with numbers\n// navigate(-2) (jumps back 2 history steps)\n// navigate(2) (jumps forward 2 history steps)\nif(typeof to==="number"){lib_history/* globalHistory.navigate */.V5.navigate(to);return;}var _parsePath=(0,gatsby_link/* parsePath */.cP)(to),pathname=_parsePath.pathname;var redirect=(0,redirect_utils/* maybeGetBrowserRedirect */.J)(pathname);// If we\'re redirecting, just replace the passed in pathname\n// to the one we want to redirect to.\nif(redirect){to=redirect.toPath;pathname=(0,gatsby_link/* parsePath */.cP)(to).pathname;}// If we had a service worker update, no matter the path, reload window and\n// reset the pathname whitelist\nif(window.___swUpdated){window.location=pathname;return;}// Start a timer to wait for a second before transitioning and showing a\n// loader in case resources aren\'t around yet.\nvar timeoutId=setTimeout(function(){emitter/* default.emit */.Z.emit("onDelayedLoadPageResources",{pathname:pathname});(0,api_runner_browser/* apiRunner */.h)("onRouteUpdateDelayed",{location:window.location});},1000);loader/* default.loadPage */.ZP.loadPage(pathname).then(function(pageResources){// If no page resources, then refresh the page\n// Do this, rather than simply `window.location.reload()`, so that\n// pressing the back/forward buttons work - otherwise when pressing\n// back, the browser will just change the URL and expect JS to handle\n// the change, which won\'t always work since it might not be a Gatsby\n// page.\nif(!pageResources||pageResources.status===loader/* PageResourceStatus.Error */.uQ.Error){window.history.replaceState({},"",location.href);window.location=pathname;clearTimeout(timeoutId);return;}// If the loaded page has a different compilation hash to the\n// window, then a rebuild has occurred on the server. Reload.\nif( true&&pageResources){if(pageResources.page.webpackCompilationHash!==window.___webpackCompilationHash){// Purge plugin-offline cache\nif("serviceWorker"in navigator&&navigator.serviceWorker.controller!==null&&navigator.serviceWorker.controller.state==="activated"){navigator.serviceWorker.controller.postMessage({gatsbyApi:"clearPathResources"});}window.location=pathname;}}(0,es.navigate)(to,options);clearTimeout(timeoutId);});};function shouldUpdateScroll(prevRouterProps,_ref){var _this=this;var location=_ref.location;var pathname=location.pathname,hash=location.hash;var results=(0,api_runner_browser/* apiRunner */.h)("shouldUpdateScroll",{prevRouterProps:prevRouterProps,// `pathname` for backwards compatibility\npathname:pathname,routerProps:{location:location},getSavedScrollPosition:function getSavedScrollPosition(args){return[0,// FIXME this is actually a big code smell, we should fix this\n// eslint-disable-next-line @babel/no-invalid-this\n_this._stateStorage.read(args,args.key)];}});if(results.length>0){// Use the latest registered shouldUpdateScroll result, this allows users to override plugin\'s configuration\n// @see https://github.com/gatsbyjs/gatsby/issues/12038\nreturn results[results.length-1];}if(prevRouterProps){var oldPathname=prevRouterProps.location.pathname;if(oldPathname===pathname){// Scroll to element if it exists, if it doesn\'t, or no hash is provided,\n// scroll to top.\nreturn hash?decodeURI(hash.slice(1)):[0,0];}}return true;}function init(){// The "scroll-behavior" package expects the "action" to be on the location\n// object so let\'s copy it over.\nlib_history/* globalHistory.listen */.V5.listen(function(args){args.location.action=args.action;});window.___push=function(to){return navigation_navigate(to,{replace:false});};window.___replace=function(to){return navigation_navigate(to,{replace:true});};window.___navigate=function(to,options){return navigation_navigate(to,options);};// Check for initial page-load redirect\nmaybeRedirect(window.location.pathname);}var RouteAnnouncer=/*#__PURE__*/function(_React$Component){(0,inheritsLoose/* default */.Z)(RouteAnnouncer,_React$Component);function RouteAnnouncer(props){var _this2;_this2=_React$Component.call(this,props)||this;_this2.announcementRef=/*#__PURE__*/react.createRef();return _this2;}var _proto=RouteAnnouncer.prototype;_proto.componentDidUpdate=function componentDidUpdate(prevProps,nextProps){var _this3=this;requestAnimationFrame(function(){var pageName="new page at "+_this3.props.location.pathname;if(document.title){pageName=document.title;}var pageHeadings=document.querySelectorAll("#gatsby-focus-wrapper h1");if(pageHeadings&&pageHeadings.length){pageName=pageHeadings[0].textContent;}var newAnnouncement="Navigated to "+pageName;if(_this3.announcementRef.current){var oldAnnouncement=_this3.announcementRef.current.innerText;if(oldAnnouncement!==newAnnouncement){_this3.announcementRef.current.innerText=newAnnouncement;}}});};_proto.render=function render(){return/*#__PURE__*/react.createElement("div",Object.assign({},RouteAnnouncerProps,{ref:this.announcementRef}));};return RouteAnnouncer;}(react.Component);var compareLocationProps=function compareLocationProps(prevLocation,nextLocation){var _prevLocation$state,_nextLocation$state;if(prevLocation.href!==nextLocation.href){return true;}if((prevLocation===null||prevLocation===void 0?void 0:(_prevLocation$state=prevLocation.state)===null||_prevLocation$state===void 0?void 0:_prevLocation$state.key)!==(nextLocation===null||nextLocation===void 0?void 0:(_nextLocation$state=nextLocation.state)===null||_nextLocation$state===void 0?void 0:_nextLocation$state.key)){return true;}return false;};// Fire on(Pre)RouteUpdate APIs\nvar RouteUpdates=/*#__PURE__*/function(_React$Component2){(0,inheritsLoose/* default */.Z)(RouteUpdates,_React$Component2);function RouteUpdates(props){var _this4;_this4=_React$Component2.call(this,props)||this;onPreRouteUpdate(props.location,null);return _this4;}var _proto2=RouteUpdates.prototype;_proto2.componentDidMount=function componentDidMount(){onRouteUpdate(this.props.location,null);};_proto2.shouldComponentUpdate=function shouldComponentUpdate(prevProps){if(compareLocationProps(prevProps.location,this.props.location)){onPreRouteUpdate(this.props.location,prevProps.location);return true;}return false;};_proto2.componentDidUpdate=function componentDidUpdate(prevProps){if(compareLocationProps(prevProps.location,this.props.location)){onRouteUpdate(this.props.location,prevProps.location);}};_proto2.render=function render(){return/*#__PURE__*/react.createElement(react.Fragment,null,this.props.children,/*#__PURE__*/react.createElement(RouteAnnouncer,{location:location}));};return RouteUpdates;}(react.Component);\n// EXTERNAL MODULE: ./.cache/page-renderer.js\nvar page_renderer = __webpack_require__(804);\n// EXTERNAL MODULE: ./.cache/_this_is_virtual_fs_path_/$virtual/async-requires.js\nvar async_requires = __webpack_require__(4999);\n;// CONCATENATED MODULE: ./node_modules/shallow-compare/es/index.js\n// Pulled from react-compat\n// https://github.com/developit/preact-compat/blob/7c5de00e7c85e2ffd011bf3af02899b63f699d3a/src/index.js#L349\nfunction shallowDiffers(a, b) {\n for (var i in a) {\n if (!(i in b)) return true;\n }for (var _i in b) {\n if (a[_i] !== b[_i]) return true;\n }return false;\n}\n\n/* harmony default export */ var shallow_compare_es = (function (instance, nextProps, nextState) {\n return shallowDiffers(instance.props, nextProps) || shallowDiffers(instance.state, nextState);\n});\n;// CONCATENATED MODULE: ./.cache/ensure-resources.js\nvar EnsureResources=/*#__PURE__*/function(_React$Component){(0,inheritsLoose/* default */.Z)(EnsureResources,_React$Component);function EnsureResources(props){var _this;_this=_React$Component.call(this)||this;var location=props.location,pageResources=props.pageResources;_this.state={location:Object.assign({},location),pageResources:pageResources||loader/* default.loadPageSync */.ZP.loadPageSync(location.pathname,{withErrorDetails:true})};return _this;}EnsureResources.getDerivedStateFromProps=function getDerivedStateFromProps(_ref,prevState){var location=_ref.location;if(prevState.location.href!==location.href){var pageResources=loader/* default.loadPageSync */.ZP.loadPageSync(location.pathname,{withErrorDetails:true});return{pageResources:pageResources,location:Object.assign({},location)};}return{location:Object.assign({},location)};};var _proto=EnsureResources.prototype;_proto.loadResources=function loadResources(rawPath){var _this2=this;loader/* default.loadPage */.ZP.loadPage(rawPath).then(function(pageResources){if(pageResources&&pageResources.status!==loader/* PageResourceStatus.Error */.uQ.Error){_this2.setState({location:Object.assign({},window.location),pageResources:pageResources});}else{window.history.replaceState({},"",location.href);window.location=rawPath;}});};_proto.shouldComponentUpdate=function shouldComponentUpdate(nextProps,nextState){// Always return false if we\'re missing resources.\nif(!nextState.pageResources){this.loadResources(nextProps.location.pathname);return false;}if(false){}// Check if the component or json have changed.\nif(this.state.pageResources!==nextState.pageResources){return true;}if(this.state.pageResources.component!==nextState.pageResources.component){return true;}if(this.state.pageResources.json!==nextState.pageResources.json){return true;}// Check if location has changed on a page using internal routing\n// via matchPath configuration.\nif(this.state.location.key!==nextState.location.key&&nextState.pageResources.page&&(nextState.pageResources.page.matchPath||nextState.pageResources.page.path)){return true;}return shallow_compare_es(this,nextProps,nextState);};_proto.render=function render(){if(false){ var message, _this$state$pageResou; }return this.props.children(this.state);};return EnsureResources;}(react.Component);/* harmony default export */ var ensure_resources = (EnsureResources);\n// EXTERNAL MODULE: ./.cache/strip-prefix.js\nvar strip_prefix = __webpack_require__(1578);\n;// CONCATENATED MODULE: ./.cache/_this_is_virtual_fs_path_/$virtual/match-paths.json\nvar match_paths_namespaceObject = JSON.parse(\'[{"path":"/en/404.html","matchPath":"/en/404.html"},{"path":"/en/cejst/","matchPath":"/en/cejst/"},{"path":"/en/timeline/","matchPath":"/en/timeline/"},{"path":"/es/404.html","matchPath":"/es/404.html"},{"path":"/es/cejst/","matchPath":"/es/cejst/"},{"path":"/es/timeline/","matchPath":"/es/timeline/"},{"path":"/en/","matchPath":"/en/"},{"path":"/es/","matchPath":"/es/"},{"path":"/en/404/","matchPath":"/en/*"},{"path":"/es/404/","matchPath":"/es/*"}]\');\n;// CONCATENATED MODULE: ./.cache/production-app.js\n// Generated during bootstrap\nvar production_app_loader=new loader/* ProdLoader */.kL(async_requires,match_paths_namespaceObject);(0,loader/* setLoader */.N1)(production_app_loader);production_app_loader.setApiRunner(api_runner_browser/* apiRunner */.h);window.asyncRequires=async_requires;window.___emitter=emitter/* default */.Z;window.___loader=loader/* publicLoader */.jN;init();(0,api_runner_browser/* apiRunnerAsync */.I)("onClientEntry").then(function(){// Let plugins register a service worker. The plugin just needs\n// to return true.\nif((0,api_runner_browser/* apiRunner */.h)("registerServiceWorker").filter(Boolean).length>0){__webpack_require__(154);}// In gatsby v2 if Router is used in page using matchPaths\n// paths need to contain full path.\n// For example:\n// - page have `/app/*` matchPath\n// - inside template user needs to use `/app/xyz` as path\n// Resetting `basepath`/`baseuri` keeps current behaviour\n// to not introduce breaking change.\n// Remove this in v3\nvar RouteHandler=function RouteHandler(props){return/*#__PURE__*/react.createElement(es.BaseContext.Provider,{value:{baseuri:"/",basepath:"/"}},/*#__PURE__*/react.createElement(page_renderer/* default */.Z,props));};var DataContext=/*#__PURE__*/react.createContext({});var GatsbyRoot=/*#__PURE__*/function(_React$Component){(0,inheritsLoose/* default */.Z)(GatsbyRoot,_React$Component);function GatsbyRoot(){return _React$Component.apply(this,arguments)||this;}var _proto=GatsbyRoot.prototype;_proto.render=function render(){var children=this.props.children;return/*#__PURE__*/react.createElement(es.Location,null,function(_ref){var location=_ref.location;return/*#__PURE__*/react.createElement(ensure_resources,{location:location},function(_ref2){var pageResources=_ref2.pageResources,location=_ref2.location;var staticQueryResults=(0,loader/* getStaticQueryResults */.hs)();return/*#__PURE__*/react.createElement(gatsby_browser_entry.StaticQueryContext.Provider,{value:staticQueryResults},/*#__PURE__*/react.createElement(DataContext.Provider,{value:{pageResources:pageResources,location:location}},children));});});};return GatsbyRoot;}(react.Component);var LocationHandler=/*#__PURE__*/function(_React$Component2){(0,inheritsLoose/* default */.Z)(LocationHandler,_React$Component2);function LocationHandler(){return _React$Component2.apply(this,arguments)||this;}var _proto2=LocationHandler.prototype;_proto2.render=function render(){var _this=this;return/*#__PURE__*/react.createElement(DataContext.Consumer,null,function(_ref3){var pageResources=_ref3.pageResources,location=_ref3.location;return/*#__PURE__*/react.createElement(RouteUpdates,{location:location},/*#__PURE__*/react.createElement(gatsby_react_router_scroll/* ScrollContext */.$C,{location:location,shouldUpdateScroll:shouldUpdateScroll},/*#__PURE__*/react.createElement(es.Router,{basepath:"/justice40-tool/63e863",location:location,id:"gatsby-focus-wrapper"},/*#__PURE__*/react.createElement(RouteHandler,Object.assign({path:pageResources.page.path==="/404.html"?(0,strip_prefix/* default */.Z)(location.pathname,"/justice40-tool/63e863"):encodeURI(pageResources.page.matchPath||pageResources.page.path)},_this.props,{location:location,pageResources:pageResources},pageResources.json)))));});};return LocationHandler;}(react.Component);var _window=window,pagePath=_window.pagePath,browserLoc=_window.location;// Explicitly call navigate if the canonical path (window.pagePath)\n// is different to the browser path (window.location.pathname). But\n// only if NONE of the following conditions hold:\n//\n// - The url matches a client side route (page.matchPath)\n// - it\'s a 404 page\n// - it\'s the offline plugin shell (/offline-plugin-app-shell-fallback/)\nif(pagePath&&"/justice40-tool/63e863"+pagePath!==browserLoc.pathname&&!(production_app_loader.findMatchPath((0,strip_prefix/* default */.Z)(browserLoc.pathname,"/justice40-tool/63e863"))||pagePath==="/404.html"||pagePath.match(/^\\/404\\/?$/)||pagePath.match(/^\\/offline-plugin-app-shell-fallback\\/?$/))){(0,es.navigate)("/justice40-tool/63e863"+pagePath+browserLoc.search+browserLoc.hash,{replace:true});}loader/* publicLoader.loadPage */.jN.loadPage(browserLoc.pathname).then(function(page){if(!page||page.status===loader/* PageResourceStatus.Error */.uQ.Error){var message="page resources for "+browserLoc.pathname+" not found. Not rendering React";// if the chunk throws an error we want to capture the real error\n// This should help with https://github.com/gatsbyjs/gatsby/issues/19618\nif(page&&page.error){console.error(message);throw page.error;}throw new Error(message);}window.___webpackCompilationHash=page.page.webpackCompilationHash;var SiteRoot=(0,api_runner_browser/* apiRunner */.h)("wrapRootElement",{element:/*#__PURE__*/react.createElement(LocationHandler,null)},/*#__PURE__*/react.createElement(LocationHandler,null),function(_ref4){var result=_ref4.result;return{element:result};}).pop();var App=function App(){var onClientEntryRanRef=react.useRef(false);react.useEffect(function(){if(!onClientEntryRanRef.current){onClientEntryRanRef.current=true;performance.mark("onInitialClientRender");(0,api_runner_browser/* apiRunner */.h)("onInitialClientRender");}},[]);return/*#__PURE__*/react.createElement(GatsbyRoot,null,SiteRoot);};var renderer=(0,api_runner_browser/* apiRunner */.h)("replaceHydrateFunction",undefined,react_dom.createRoot?react_dom.createRoot:react_dom.hydrate)[0];function runRender(){var rootElement=typeof window!=="undefined"?document.getElementById("___gatsby"):null;if(renderer===react_dom.createRoot){renderer(rootElement,{hydrate:true}).render(/*#__PURE__*/react.createElement(App,null));}else{renderer(/*#__PURE__*/react.createElement(App,null),rootElement);}}// https://github.com/madrobby/zepto/blob/b5ed8d607f67724788ec9ff492be297f64d47dfc/src/zepto.js#L439-L450\n// TODO remove IE 10 support\nvar doc=document;if(doc.readyState==="complete"||doc.readyState!=="loading"&&!doc.documentElement.doScroll){setTimeout(function(){runRender();},0);}else{var handler=function handler(){doc.removeEventListener("DOMContentLoaded",handler,false);window.removeEventListener("load",handler,false);runRender();};doc.addEventListener("DOMContentLoaded",handler,false);window.addEventListener("load",handler,false);}});});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uLy5jYWNoZS9yb3V0ZS1hbm5vdW5jZXItcHJvcHMuanM/ZWIwZiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uLy5jYWNoZS9uYXZpZ2F0aW9uLmpzP2M5ZWUiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvc2hhbGxvdy1jb21wYXJlL2VzL2luZGV4LmpzPzExY2EiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi8uY2FjaGUvZW5zdXJlLXJlc291cmNlcy5qcz9mZjRlIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vLmNhY2hlL3Byb2R1Y3Rpb24tYXBwLmpzPzUzMTUiXSwibmFtZXMiOlsiUm91dGVBbm5vdW5jZXJQcm9wcyIsImlkIiwic3R5bGUiLCJwb3NpdGlvbiIsInRvcCIsIndpZHRoIiwiaGVpZ2h0IiwicGFkZGluZyIsIm92ZXJmbG93IiwiY2xpcCIsIndoaXRlU3BhY2UiLCJib3JkZXIiLCJtYXliZVJlZGlyZWN0IiwicGF0aG5hbWUiLCJyZWRpcmVjdCIsIm1heWJlR2V0QnJvd3NlclJlZGlyZWN0Iiwid2luZG93IiwiX19fcmVwbGFjZSIsInRvUGF0aCIsIm9uUHJlUm91dGVVcGRhdGUiLCJsb2NhdGlvbiIsInByZXZMb2NhdGlvbiIsImFwaVJ1bm5lciIsIm9uUm91dGVVcGRhdGUiLCJwcm9jZXNzIiwibmF2aWdhdGUiLCJ0byIsIm9wdGlvbnMiLCJnbG9iYWxIaXN0b3J5IiwicGFyc2VQYXRoIiwiX19fc3dVcGRhdGVkIiwidGltZW91dElkIiwic2V0VGltZW91dCIsImVtaXR0ZXIiLCJsb2FkZXIiLCJ0aGVuIiwicGFnZVJlc291cmNlcyIsInN0YXR1cyIsIlBhZ2VSZXNvdXJjZVN0YXR1cyIsImhpc3RvcnkiLCJyZXBsYWNlU3RhdGUiLCJocmVmIiwiY2xlYXJUaW1lb3V0IiwicGFnZSIsIndlYnBhY2tDb21waWxhdGlvbkhhc2giLCJfX193ZWJwYWNrQ29tcGlsYXRpb25IYXNoIiwibmF2aWdhdG9yIiwic2VydmljZVdvcmtlciIsImNvbnRyb2xsZXIiLCJzdGF0ZSIsInBvc3RNZXNzYWdlIiwiZ2F0c2J5QXBpIiwicmVhY2hOYXZpZ2F0ZSIsInNob3VsZFVwZGF0ZVNjcm9sbCIsInByZXZSb3V0ZXJQcm9wcyIsImhhc2giLCJyZXN1bHRzIiwicm91dGVyUHJvcHMiLCJnZXRTYXZlZFNjcm9sbFBvc2l0aW9uIiwiYXJncyIsIl9zdGF0ZVN0b3JhZ2UiLCJyZWFkIiwia2V5IiwibGVuZ3RoIiwib2xkUGF0aG5hbWUiLCJkZWNvZGVVUkkiLCJzbGljZSIsImluaXQiLCJhY3Rpb24iLCJfX19wdXNoIiwicmVwbGFjZSIsIl9fX25hdmlnYXRlIiwiUm91dGVBbm5vdW5jZXIiLCJwcm9wcyIsImFubm91bmNlbWVudFJlZiIsIlJlYWN0IiwiY29tcG9uZW50RGlkVXBkYXRlIiwicHJldlByb3BzIiwibmV4dFByb3BzIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwicGFnZU5hbWUiLCJkb2N1bWVudCIsInRpdGxlIiwicGFnZUhlYWRpbmdzIiwicXVlcnlTZWxlY3RvckFsbCIsInRleHRDb250ZW50IiwibmV3QW5ub3VuY2VtZW50IiwiY3VycmVudCIsIm9sZEFubm91bmNlbWVudCIsImlubmVyVGV4dCIsInJlbmRlciIsImNvbXBhcmVMb2NhdGlvblByb3BzIiwibmV4dExvY2F0aW9uIiwiUm91dGVVcGRhdGVzIiwiY29tcG9uZW50RGlkTW91bnQiLCJzaG91bGRDb21wb25lbnRVcGRhdGUiLCJjaGlsZHJlbiIsIkVuc3VyZVJlc291cmNlcyIsIndpdGhFcnJvckRldGFpbHMiLCJnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMiLCJwcmV2U3RhdGUiLCJsb2FkUmVzb3VyY2VzIiwicmF3UGF0aCIsInNldFN0YXRlIiwibmV4dFN0YXRlIiwiY29tcG9uZW50IiwianNvbiIsIm1hdGNoUGF0aCIsInBhdGgiLCJzaGFsbG93Q29tcGFyZSIsIlByb2RMb2FkZXIiLCJhc3luY1JlcXVpcmVzIiwibWF0Y2hQYXRocyIsInNldExvYWRlciIsInNldEFwaVJ1bm5lciIsIl9fX2VtaXR0ZXIiLCJfX19sb2FkZXIiLCJwdWJsaWNMb2FkZXIiLCJuYXZpZ2F0aW9uSW5pdCIsImFwaVJ1bm5lckFzeW5jIiwiZmlsdGVyIiwiQm9vbGVhbiIsInJlcXVpcmUiLCJSb3V0ZUhhbmRsZXIiLCJiYXNldXJpIiwiYmFzZXBhdGgiLCJEYXRhQ29udGV4dCIsIkdhdHNieVJvb3QiLCJzdGF0aWNRdWVyeVJlc3VsdHMiLCJnZXRTdGF0aWNRdWVyeVJlc3VsdHMiLCJMb2NhdGlvbkhhbmRsZXIiLCJfX0JBU0VfUEFUSF9fIiwic3RyaXBQcmVmaXgiLCJlbmNvZGVVUkkiLCJwYWdlUGF0aCIsImJyb3dzZXJMb2MiLCJmaW5kTWF0Y2hQYXRoIiwibWF0Y2giLCJzZWFyY2giLCJtZXNzYWdlIiwiZXJyb3IiLCJjb25zb2xlIiwiRXJyb3IiLCJTaXRlUm9vdCIsImVsZW1lbnQiLCJyZXN1bHQiLCJwb3AiLCJBcHAiLCJvbkNsaWVudEVudHJ5UmFuUmVmIiwicGVyZm9ybWFuY2UiLCJtYXJrIiwicmVuZGVyZXIiLCJ1bmRlZmluZWQiLCJSZWFjdERPTSIsInJ1blJlbmRlciIsInJvb3RFbGVtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJoeWRyYXRlIiwiZG9jIiwicmVhZHlTdGF0ZSIsImRvY3VtZW50RWxlbWVudCIsImRvU2Nyb2xsIiwiaGFuZGxlciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJhZGRFdmVudExpc3RlbmVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNPLEdBQU1BLG9CQUFtQixDQUFHLENBQ2pDQyxFQUFFLG1CQUQrQixDQUVqQ0MsS0FBSyxDQUFFLENBQ0xDLFFBQVEsV0FESCxDQUVMQyxHQUFHLENBQUUsQ0FGQSxDQUdMQyxLQUFLLENBQUUsQ0FIRixDQUlMQyxNQUFNLENBQUUsQ0FKSCxDQUtMQyxPQUFPLENBQUUsQ0FMSixDQU1M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QUFuQyxDQUE0QyxLQUE1QyxFQUVBUixTQUFTLEdBQ1YsQ0FMRCxDQU9BSSxHQUFHLENBQUNNLGdCQUFKLG9CQUF5Q0YsT0FBekMsQ0FBa0QsS0FBbEQsRUFDQWxKLE1BQU0sQ0FBQ29KLGdCQUFQLFFBQWdDRixPQUFoQyxDQUF5QyxLQUF6QyxFQUNELENBQ0YsQ0FsRkQsRUFtRkQsQ0FyTUQiLCJmaWxlIjoiMjg3MS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIFRoaXMgaXMgZXh0cmFjdGVkIHRvIHNlcGFyYXRlIG1vZHVsZSBiZWNhdXNlIGl0J3Mgc2hhcmVkXG4vLyBiZXR3ZWVuIGJyb3dzZXIgYW5kIFNTUiBjb2RlXG5leHBvcnQgY29uc3QgUm91dGVBbm5vdW5jZXJQcm9wcyA9IHtcbiAgaWQ6IGBnYXRzYnktYW5ub3VuY2VyYCxcbiAgc3R5bGU6IHtcbiAgICBwb3NpdGlvbjogYGFic29sdXRlYCxcbiAgICB0b3A6IDAsXG4gICAgd2lkdGg6IDEsXG4gICAgaGVpZ2h0OiAxLFxuICAgIHBhZGRpbmc6IDAsXG4gICAgb3ZlcmZsb3c6IGBoaWRkZW5gLFxuICAgIGNsaXA6IGByZWN0KDAsIDAsIDAsIDApYCxcbiAgICB3aGl0ZVNwYWNlOiBgbm93cmFwYCxcbiAgICBib3JkZXI6IDAsXG4gIH0sXG4gIFwiYXJpYS1saXZlXCI6IGBhc3NlcnRpdmVgLFxuICBcImFyaWEtYXRvbWljXCI6IGB0cnVlYCxcbn1cbiIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiXG5pbXBvcnQgbG9hZGVyLCB7IFBhZ2VSZXNvdXJjZVN0YXR1cyB9IGZyb20gXCIuL2xvYWRlclwiXG5pbXBvcnQgeyBtYXliZUdldEJyb3dzZXJSZWRpcmVjdCB9IGZyb20gXCIuL3JlZGlyZWN0LXV0aWxzLmpzXCJcbmltcG9ydCB7IGFwaVJ1bm5lciB9IGZyb20gXCIuL2FwaS1ydW5uZXItYnJvd3NlclwiXG5pbXBvcnQgZW1pdHRlciBmcm9tIFwiLi9lbWl0dGVyXCJcbmltcG9ydCB7IFJvdXRlQW5ub3VuY2VyUHJvcHMgfSBmcm9tIFwiLi9yb3V0ZS1hbm5vdW5jZXItcHJvcHNcIlxuaW1wb3J0IHsgbmF2aWdhdGUgYXMgcmVhY2hOYXZpZ2F0ZSB9IGZyb20gXCJAZ2F0c2J5anMvcmVhY2gtcm91dGVyXCJcbmltcG9ydCB7IGdsb2JhbEhpc3RvcnkgfSBmcm9tIFwiQGdhdHNieWpzL3JlYWNoLXJvdXRlci9saWIvaGlzdG9yeVwiXG5pbXBvcnQgeyBwYXJzZVBhdGggfSBmcm9tIFwiZ2F0c2J5LWxpbmtcIlxuXG5mdW5jdGlvbiBtYXliZVJlZGlyZWN0KHBhdGhuYW1lKSB7XG4gIGNvbnN0IHJlZGlyZWN0ID0gbWF5YmVHZXRCcm93c2VyUmVkaXJlY3QocGF0aG5hbWUpXG5cbiAgaWYgKHJlZGlyZWN0ICE9IG51bGwpIHtcbiAgICB3aW5kb3cuX19fcmVwbGFjZShyZWRpcmVjdC50b1BhdGgpXG4gICAgcmV0dXJuIHRydWVcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5jb25zdCBvblByZVJvdXRlVXBkYXRlID0gKGxvY2F0aW9uLCBwcmV2TG9jYXRpb24pID0+IHtcbiAgaWYgKCFtYXliZVJlZGlyZWN0KGxvY2F0aW9uLnBhdGhuYW1lKSkge1xuICAgIGFwaVJ1bm5lcihgb25QcmVSb3V0ZVVwZGF0ZWAsIHsgbG9jYXRpb24sIHByZXZMb2NhdGlvbiB9KVxuICB9XG59XG5cbmNvbnN0IG9uUm91dGVVcGRhdGUgPSAobG9jYXRpb24sIHByZXZMb2NhdGlvbikgPT4ge1xuICBpZiAoIW1heWJlUmVkaXJlY3QobG9jYXRpb24ucGF0aG5hbWUpKSB7XG4gICAgYXBpUnVubmVyKGBvblJvdXRlVXBkYXRlYCwgeyBsb2NhdGlvbiwgcHJldkxvY2F0aW9uIH0pXG4gICAgaWYgKFxuICAgICAgcHJvY2Vzcy5lbnYuR0FUU0JZX0VYUEVSSU1FTlRBTF9RVUVSWV9PTl9ERU1BTkQgJiZcbiAgICAgIHByb2Nlc3MuZW52LkdBVFNCWV9RVUVSWV9PTl9ERU1BTkRfTE9BRElOR19JTkRJQ0FUT1IgPT09IGB0cnVlYFxuICAgICkge1xuICAgICAgZW1pdHRlci5lbWl0KGBvblJvdXRlVXBkYXRlYCwgeyBsb2NhdGlvbiwgcHJldkxvY2F0aW9uIH0pXG4gICAgfVxuICB9XG59XG5cbmNvbnN0IG5hdmlnYXRlID0gKHRvLCBvcHRpb25zID0ge30pID0+IHtcbiAgLy8gU3VwcG9ydCBmb3J3YXJkL2JhY2t3YXJkIG5hdmlnYXRpb24gd2l0aCBudW1iZXJzXG4gIC8vIG5hdmlnYXRlKC0yKSAoanVtcHMgYmFjayAyIGhpc3Rvcnkgc3RlcHMpXG4gIC8vIG5hdmlnYXRlKDIpICAoanVtcHMgZm9yd2FyZCAyIGhpc3Rvcnkgc3RlcHMpXG4gIGlmICh0eXBlb2YgdG8gPT09IGBudW1iZXJgKSB7XG4gICAgZ2xvYmFsSGlzdG9yeS5uYXZpZ2F0ZSh0bylcbiAgICByZXR1cm5cbiAgfVxuXG4gIGxldCB7IHBhdGhuYW1lIH0gPSBwYXJzZVBhdGgodG8pXG4gIGNvbnN0IHJlZGlyZWN0ID0gbWF5YmVHZXRCcm93c2VyUmVkaXJlY3QocGF0aG5hbWUpXG5cbiAgLy8gSWYgd2UncmUgcmVkaXJlY3RpbmcsIGp1c3QgcmVwbGFjZSB0aGUgcGFzc2VkIGluIHBhdGhuYW1lXG4gIC8vIHRvIHRoZSBvbmUgd2Ugd2FudCB0byByZWRpcmVjdCB0by5cbiAgaWYgKHJlZGlyZWN0KSB7XG4gICAgdG8gPSByZWRpcmVjdC50b1BhdGhcbiAgICBwYXRobmFtZSA9IHBhcnNlUGF0aCh0bykucGF0aG5hbWVcbiAgfVxuXG4gIC8vIElmIHdlIGhhZCBhIHNlcnZpY2Ugd29ya2VyIHVwZGF0ZSwgbm8gbWF0dGVyIHRoZSBwYXRoLCByZWxvYWQgd2luZG93IGFuZFxuICAvLyByZXNldCB0aGUgcGF0aG5hbWUgd2hpdGVsaXN0XG4gIGlmICh3aW5kb3cuX19fc3dVcGRhdGVkKSB7XG4gICAgd2luZG93LmxvY2F0aW9uID0gcGF0aG5hbWVcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIFN0YXJ0IGEgdGltZXIgdG8gd2FpdCBmb3IgYSBzZWNvbmQgYmVmb3JlIHRyYW5zaXRpb25pbmcgYW5kIHNob3dpbmcgYVxuICAvLyBsb2FkZXIgaW4gY2FzZSByZXNvdXJjZXMgYXJlbid0IGFyb3VuZCB5ZXQuXG4gIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIGVtaXR0ZXIuZW1pdChgb25EZWxheWVkTG9hZFBhZ2VSZXNvdXJjZXNgLCB7IHBhdGhuYW1lIH0pXG4gICAgYXBpUnVubmVyKGBvblJvdXRlVXBkYXRlRGVsYXllZGAsIHtcbiAgICAgIGxvY2F0aW9uOiB3aW5kb3cubG9jYXRpb24sXG4gICAgfSlcbiAgfSwgMTAwMClcblxuICBsb2FkZXIubG9hZFBhZ2UocGF0aG5hbWUpLnRoZW4ocGFnZVJlc291cmNlcyA9PiB7XG4gICAgLy8gSWYgbm8gcGFnZSByZXNvdXJjZXMsIHRoZW4gcmVmcmVzaCB0aGUgcGFnZVxuICAgIC8vIERvIHRoaXMsIHJhdGhlciB0aGFuIHNpbXBseSBgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpYCwgc28gdGhhdFxuICAgIC8vIHByZXNzaW5nIHRoZSBiYWNrL2ZvcndhcmQgYnV0dG9ucyB3b3JrIC0gb3RoZXJ3aXNlIHdoZW4gcHJlc3NpbmdcbiAgICAvLyBiYWNrLCB0aGUgYnJvd3NlciB3aWxsIGp1c3QgY2hhbmdlIHRoZSBVUkwgYW5kIGV4cGVjdCBKUyB0byBoYW5kbGVcbiAgICAvLyB0aGUgY2hhbmdlLCB3aGljaCB3b24ndCBhbHdheXMgd29yayBzaW5jZSBpdCBtaWdodCBub3QgYmUgYSBHYXRzYnlcbiAgICAvLyBwYWdlLlxuICAgIGlmICghcGFnZVJlc291cmNlcyB8fCBwYWdlUmVzb3VyY2VzLnN0YXR1cyA9PT0gUGFnZVJlc291cmNlU3RhdHVzLkVycm9yKSB7XG4gICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoe30sIGBgLCBsb2NhdGlvbi5ocmVmKVxuICAgICAgd2luZG93LmxvY2F0aW9uID0gcGF0aG5hbWVcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgbG9hZGVkIHBhZ2UgaGFzIGEgZGlmZmVyZW50IGNvbXBpbGF0aW9uIGhhc2ggdG8gdGhlXG4gICAgLy8gd2luZG93LCB0aGVuIGEgcmVidWlsZCBoYXMgb2NjdXJyZWQgb24gdGhlIHNlcnZlci4gUmVsb2FkLlxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gYHByb2R1Y3Rpb25gICYmIHBhZ2VSZXNvdXJjZXMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgcGFnZVJlc291cmNlcy5wYWdlLndlYnBhY2tDb21waWxhdGlvbkhhc2ggIT09XG4gICAgICAgIHdpbmRvdy5fX193ZWJwYWNrQ29tcGlsYXRpb25IYXNoXG4gICAgICApIHtcbiAgICAgICAgLy8gUHVyZ2UgcGx1Z2luLW9mZmxpbmUgY2FjaGVcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGBzZXJ2aWNlV29ya2VyYCBpbiBuYXZpZ2F0b3IgJiZcbiAgICAgICAgICBuYXZpZ2F0b3Iuc2VydmljZVdvcmtlci5jb250cm9sbGVyICE9PSBudWxsICYmXG4gICAgICAgICAgbmF2aWdhdG9yLnNlcnZpY2VXb3JrZXIuY29udHJvbGxlci5zdGF0ZSA9PT0gYGFjdGl2YXRlZGBcbiAgICAgICAgKSB7XG4gICAgICAgICAgbmF2aWdhdG9yLnNlcnZpY2VXb3JrZXIuY29udHJvbGxlci5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBnYXRzYnlBcGk6IGBjbGVhclBhdGhSZXNvdXJjZXNgLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICB3aW5kb3cubG9jYXRpb24gPSBwYXRobmFtZVxuICAgICAgfVxuICAgIH1cbiAgICByZWFjaE5hdmlnYXRlKHRvLCBvcHRpb25zKVxuICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpXG4gIH0pXG59XG5cbmZ1bmN0aW9uIHNob3VsZFVwZGF0ZVNjcm9sbChwcmV2Um91dGVyUHJvcHMsIHsgbG9jYXRpb24gfSkge1xuICBjb25zdCB7IHBhdGhuYW1lLCBoYXNoIH0gPSBsb2NhdGlvblxuICBjb25zdCByZXN1bHRzID0gYXBpUnVubmVyKGBzaG91bGRVcGRhdGVTY3JvbGxgLCB7XG4gICAgcHJldlJvdXRlclByb3BzLFxuICAgIC8vIGBwYXRobmFtZWAgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgcGF0aG5hbWUsXG4gICAgcm91dGVyUHJvcHM6IHsgbG9jYXRpb24gfSxcbiAgICBnZXRTYXZlZFNjcm9sbFBvc2l0aW9uOiBhcmdzID0+IFtcbiAgICAgIDAsXG4gICAgICAvLyBGSVhNRSB0aGlzIGlzIGFjdHVhbGx5IGEgYmlnIGNvZGUgc21lbGwsIHdlIHNob3VsZCBmaXggdGhpc1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBiYWJlbC9uby1pbnZhbGlkLXRoaXNcbiAgICAgIHRoaXMuX3N0YXRlU3RvcmFnZS5yZWFkKGFyZ3MsIGFyZ3Mua2V5KSxcbiAgICBdLFxuICB9KVxuICBpZiAocmVzdWx0cy5sZW5ndGggPiAwKSB7XG4gICAgLy8gVXNlIHRoZSBsYXRlc3QgcmVnaXN0ZXJlZCBzaG91bGRVcGRhdGVTY3JvbGwgcmVzdWx0LCB0aGlzIGFsbG93cyB1c2VycyB0byBvdmVycmlkZSBwbHVnaW4ncyBjb25maWd1cmF0aW9uXG4gICAgLy8gQHNlZSBodHRwczovL2dpdGh1Yi5jb20vZ2F0c2J5anMvZ2F0c2J5L2lzc3Vlcy8xMjAzOFxuICAgIHJldHVybiByZXN1bHRzW3Jlc3VsdHMubGVuZ3RoIC0gMV1cbiAgfVxuXG4gIGlmIChwcmV2Um91dGVyUHJvcHMpIHtcbiAgICBjb25zdCB7XG4gICAgICBsb2NhdGlvbjogeyBwYXRobmFtZTogb2xkUGF0aG5hbWUgfSxcbiAgICB9ID0gcHJldlJvdXRlclByb3BzXG4gICAgaWYgKG9sZFBhdGhuYW1lID09PSBwYXRobmFtZSkge1xuICAgICAgLy8gU2Nyb2xsIHRvIGVsZW1lbnQgaWYgaXQgZXhpc3RzLCBpZiBpdCBkb2Vzbid0LCBvciBubyBoYXNoIGlzIHByb3ZpZGVkLFxuICAgICAgLy8gc2Nyb2xsIHRvIHRvcC5cbiAgICAgIHJldHVybiBoYXNoID8gZGVjb2RlVVJJKGhhc2guc2xpY2UoMSkpIDogWzAsIDBdXG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5cbmZ1bmN0aW9uIGluaXQoKSB7XG4gIC8vIFRoZSBcInNjcm9sbC1iZWhhdmlvclwiIHBhY2thZ2UgZXhwZWN0cyB0aGUgXCJhY3Rpb25cIiB0byBiZSBvbiB0aGUgbG9jYXRpb25cbiAgLy8gb2JqZWN0IHNvIGxldCdzIGNvcHkgaXQgb3Zlci5cbiAgZ2xvYmFsSGlzdG9yeS5saXN0ZW4oYXJncyA9PiB7XG4gICAgYXJncy5sb2NhdGlvbi5hY3Rpb24gPSBhcmdzLmFjdGlvblxuICB9KVxuXG4gIHdpbmRvdy5fX19wdXNoID0gdG8gPT4gbmF2aWdhdGUodG8sIHsgcmVwbGFjZTogZmFsc2UgfSlcbiAgd2luZG93Ll9fX3JlcGxhY2UgPSB0byA9PiBuYXZpZ2F0ZSh0bywgeyByZXBsYWNlOiB0cnVlIH0pXG4gIHdpbmRvdy5fX19uYXZpZ2F0ZSA9ICh0bywgb3B0aW9ucykgPT4gbmF2aWdhdGUodG8sIG9wdGlvbnMpXG5cbiAgLy8gQ2hlY2sgZm9yIGluaXRpYWwgcGFnZS1sb2FkIHJlZGlyZWN0XG4gIG1heWJlUmVkaXJlY3Qod2luZG93LmxvY2F0aW9uLnBhdGhuYW1lKVxufVxuXG5jbGFzcyBSb3V0ZUFubm91bmNlciBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpXG4gICAgdGhpcy5hbm5vdW5jZW1lbnRSZWYgPSBSZWFjdC5jcmVhdGVSZWYoKVxuICB9XG5cbiAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgbmV4dFByb3BzKSB7XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIGxldCBwYWdlTmFtZSA9IGBuZXcgcGFnZSBhdCAke3RoaXMucHJvcHMubG9jYXRpb24ucGF0aG5hbWV9YFxuICAgICAgaWYgKGRvY3VtZW50LnRpdGxlKSB7XG4gICAgICAgIHBhZ2VOYW1lID0gZG9jdW1lbnQudGl0bGVcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhZ2VIZWFkaW5ncyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYCNnYXRzYnktZm9jdXMtd3JhcHBlciBoMWApXG4gICAgICBpZiAocGFnZUhlYWRpbmdzICYmIHBhZ2VIZWFkaW5ncy5sZW5ndGgpIHtcbiAgICAgICAgcGFnZU5hbWUgPSBwYWdlSGVhZGluZ3NbMF0udGV4dENvbnRlbnRcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5ld0Fubm91bmNlbWVudCA9IGBOYXZpZ2F0ZWQgdG8gJHtwYWdlTmFtZX1gXG4gICAgICBpZiAodGhpcy5hbm5vdW5jZW1lbnRSZWYuY3VycmVudCkge1xuICAgICAgICBjb25zdCBvbGRBbm5vdW5jZW1lbnQgPSB0aGlzLmFubm91bmNlbWVudFJlZi5jdXJyZW50LmlubmVyVGV4dFxuICAgICAgICBpZiAob2xkQW5ub3VuY2VtZW50ICE9PSBuZXdBbm5vdW5jZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLmFubm91bmNlbWVudFJlZi5jdXJyZW50LmlubmVyVGV4dCA9IG5ld0Fubm91bmNlbWVudFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICByZXR1cm4gPGRpdiB7Li4uUm91dGVBbm5vdW5jZXJQcm9wc30gcmVmPXt0aGlzLmFubm91bmNlbWVudFJlZn0+PC9kaXY+XG4gIH1cbn1cblxuY29uc3QgY29tcGFyZUxvY2F0aW9uUHJvcHMgPSAocHJldkxvY2F0aW9uLCBuZXh0TG9jYXRpb24pID0+IHtcbiAgaWYgKHByZXZMb2NhdGlvbi5ocmVmICE9PSBuZXh0TG9jYXRpb24uaHJlZikge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBpZiAocHJldkxvY2F0aW9uPy5zdGF0ZT8ua2V5ICE9PSBuZXh0TG9jYXRpb24/LnN0YXRlPy5rZXkpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8vIEZpcmUgb24oUHJlKVJvdXRlVXBkYXRlIEFQSXNcbmNsYXNzIFJvdXRlVXBkYXRlcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpXG4gICAgb25QcmVSb3V0ZVVwZGF0ZShwcm9wcy5sb2NhdGlvbiwgbnVsbClcbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIG9uUm91dGVVcGRhdGUodGhpcy5wcm9wcy5sb2NhdGlvbiwgbnVsbClcbiAgfVxuXG4gIHNob3VsZENvbXBvbmVudFVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgICBpZiAoY29tcGFyZUxvY2F0aW9uUHJvcHMocHJldlByb3BzLmxvY2F0aW9uLCB0aGlzLnByb3BzLmxvY2F0aW9uKSkge1xuICAgICAgb25QcmVSb3V0ZVVwZGF0ZSh0aGlzLnByb3BzLmxvY2F0aW9uLCBwcmV2UHJvcHMubG9jYXRpb24pXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgICBpZiAoY29tcGFyZUxvY2F0aW9uUHJvcHMocHJldlByb3BzLmxvY2F0aW9uLCB0aGlzLnByb3BzLmxvY2F0aW9uKSkge1xuICAgICAgb25Sb3V0ZVVwZGF0ZSh0aGlzLnByb3BzLmxvY2F0aW9uLCBwcmV2UHJvcHMubG9jYXRpb24pXG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiAoXG4gICAgICA8UmVhY3QuRnJhZ21lbnQ+XG4gICAgICAgIHt0aGlzLnByb3BzLmNoaWxkcmVufVxuICAgICAgICA8Um91dGVBbm5vdW5jZXIgbG9jYXRpb249e2xvY2F0aW9ufSAvPlxuICAgICAgPC9SZWFjdC5GcmFnbWVudD5cbiAgICApXG4gIH1cbn1cblxuUm91dGVVcGRhdGVzLnByb3BUeXBlcyA9IHtcbiAgbG9jYXRpb246IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbn1cblxuZXhwb3J0IHsgaW5pdCwgc2hvdWxkVXBkYXRlU2Nyb2xsLCBSb3V0ZVVwZGF0ZXMsIG1heWJlR2V0QnJvd3NlclJlZGlyZWN0IH1cbiIsIi8vIFB1bGxlZCBmcm9tIHJlYWN0LWNvbXBhdFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2RldmVsb3BpdC9wcmVhY3QtY29tcGF0L2Jsb2IvN2M1ZGUwMGU3Yzg1ZTJmZmQwMTFiZjNhZjAyODk5YjYzZjY5OWQzYS9zcmMvaW5kZXguanMjTDM0OVxuZnVuY3Rpb24gc2hhbGxvd0RpZmZlcnMoYSwgYikge1xuICBmb3IgKHZhciBpIGluIGEpIHtcbiAgICBpZiAoIShpIGluIGIpKSByZXR1cm4gdHJ1ZTtcbiAgfWZvciAodmFyIF9pIGluIGIpIHtcbiAgICBpZiAoYVtfaV0gIT09IGJbX2ldKSByZXR1cm4gdHJ1ZTtcbiAgfXJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIChpbnN0YW5jZSwgbmV4dFByb3BzLCBuZXh0U3RhdGUpIHtcbiAgcmV0dXJuIHNoYWxsb3dEaWZmZXJzKGluc3RhbmNlLnByb3BzLCBuZXh0UHJvcHMpIHx8IHNoYWxsb3dEaWZmZXJzKGluc3RhbmNlLnN0YXRlLCBuZXh0U3RhdGUpO1xufSk7IiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgbG9hZGVyLCB7IFBhZ2VSZXNvdXJjZVN0YXR1cyB9IGZyb20gXCIuL2xvYWRlclwiXG5pbXBvcnQgc2hhbGxvd0NvbXBhcmUgZnJvbSBcInNoYWxsb3ctY29tcGFyZVwiXG5cbmNsYXNzIEVuc3VyZVJlc291cmNlcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIoKVxuICAgIGNvbnN0IHsgbG9jYXRpb24sIHBhZ2VSZXNvdXJjZXMgfSA9IHByb3BzXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGxvY2F0aW9uOiB7IC4uLmxvY2F0aW9uIH0sXG4gICAgICBwYWdlUmVzb3VyY2VzOlxuICAgICAgICBwYWdlUmVzb3VyY2VzIHx8XG4gICAgICAgIGxvYWRlci5sb2FkUGFnZVN5bmMobG9jYXRpb24ucGF0aG5hbWUsIHsgd2l0aEVycm9yRGV0YWlsczogdHJ1ZSB9KSxcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKHsgbG9jYXRpb24gfSwgcHJldlN0YXRlKSB7XG4gICAgaWYgKHByZXZTdGF0ZS5sb2NhdGlvbi5ocmVmICE9PSBsb2NhdGlvbi5ocmVmKSB7XG4gICAgICBjb25zdCBwYWdlUmVzb3VyY2VzID0gbG9hZGVyLmxvYWRQYWdlU3luYyhsb2NhdGlvbi5wYXRobmFtZSwge1xuICAgICAgICB3aXRoRXJyb3JEZXRhaWxzOiB0cnVlLFxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGFnZVJlc291cmNlcyxcbiAgICAgICAgbG9jYXRpb246IHsgLi4ubG9jYXRpb24gfSxcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbG9jYXRpb246IHsgLi4ubG9jYXRpb24gfSxcbiAgICB9XG4gIH1cblxuICBsb2FkUmVzb3VyY2VzKHJhd1BhdGgpIHtcbiAgICBsb2FkZXIubG9hZFBhZ2UocmF3UGF0aCkudGhlbihwYWdlUmVzb3VyY2VzID0+IHtcbiAgICAgIGlmIChwYWdlUmVzb3VyY2VzICYmIHBhZ2VSZXNvdXJjZXMuc3RhdHVzICE9PSBQYWdlUmVzb3VyY2VTdGF0dXMuRXJyb3IpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgbG9jYXRpb246IHsgLi4ud2luZG93LmxvY2F0aW9uIH0sXG4gICAgICAgICAgcGFnZVJlc291cmNlcyxcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSh7fSwgYGAsIGxvY2F0aW9uLmhyZWYpXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IHJhd1BhdGhcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcywgbmV4dFN0YXRlKSB7XG4gICAgLy8gQWx3YXlzIHJldHVybiBmYWxzZSBpZiB3ZSdyZSBtaXNzaW5nIHJlc291cmNlcy5cbiAgICBpZiAoIW5leHRTdGF0ZS5wYWdlUmVzb3VyY2VzKSB7XG4gICAgICB0aGlzLmxvYWRSZXNvdXJjZXMobmV4dFByb3BzLmxvY2F0aW9uLnBhdGhuYW1lKVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgcHJvY2Vzcy5lbnYuQlVJTERfU1RBR0UgPT09IGBkZXZlbG9wYCAmJlxuICAgICAgbmV4dFN0YXRlLnBhZ2VSZXNvdXJjZXMuc3RhbGVcbiAgICApIHtcbiAgICAgIHRoaXMubG9hZFJlc291cmNlcyhuZXh0UHJvcHMubG9jYXRpb24ucGF0aG5hbWUpXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgY29tcG9uZW50IG9yIGpzb24gaGF2ZSBjaGFuZ2VkLlxuICAgIGlmICh0aGlzLnN0YXRlLnBhZ2VSZXNvdXJjZXMgIT09IG5leHRTdGF0ZS5wYWdlUmVzb3VyY2VzKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICBpZiAoXG4gICAgICB0aGlzLnN0YXRlLnBhZ2VSZXNvdXJjZXMuY29tcG9uZW50ICE9PSBuZXh0U3RhdGUucGFnZVJlc291cmNlcy5jb21wb25lbnRcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhdGUucGFnZVJlc291cmNlcy5qc29uICE9PSBuZXh0U3RhdGUucGFnZVJlc291cmNlcy5qc29uKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICAvLyBDaGVjayBpZiBsb2NhdGlvbiBoYXMgY2hhbmdlZCBvbiBhIHBhZ2UgdXNpbmcgaW50ZXJuYWwgcm91dGluZ1xuICAgIC8vIHZpYSBtYXRjaFBhdGggY29uZmlndXJhdGlvbi5cbiAgICBpZiAoXG4gICAgICB0aGlzLnN0YXRlLmxvY2F0aW9uLmtleSAhPT0gbmV4dFN0YXRlLmxvY2F0aW9uLmtleSAmJlxuICAgICAgbmV4dFN0YXRlLnBhZ2VSZXNvdXJjZXMucGFnZSAmJlxuICAgICAgKG5leHRTdGF0ZS5wYWdlUmVzb3VyY2VzLnBhZ2UubWF0Y2hQYXRoIHx8XG4gICAgICAgIG5leHRTdGF0ZS5wYWdlUmVzb3VyY2VzLnBhZ2UucGF0aClcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBzaGFsbG93Q29tcGFyZSh0aGlzLCBuZXh0UHJvcHMsIG5leHRTdGF0ZSlcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBpZiAoXG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gYHByb2R1Y3Rpb25gICYmXG4gICAgICAoIXRoaXMuc3RhdGUucGFnZVJlc291cmNlcyB8fFxuICAgICAgICB0aGlzLnN0YXRlLnBhZ2VSZXNvdXJjZXMuc3RhdHVzID09PSBQYWdlUmVzb3VyY2VTdGF0dXMuRXJyb3IpXG4gICAgKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gYEVuc3VyZVJlc291cmNlcyB3YXMgbm90IGFibGUgdG8gZmluZCByZXNvdXJjZXMgZm9yIHBhdGg6IFwiJHt0aGlzLnByb3BzLmxvY2F0aW9uLnBhdGhuYW1lfVwiXG5UaGlzIHR5cGljYWxseSBtZWFucyB0aGF0IGFuIGlzc3VlIG9jY3VycmVkIGJ1aWxkaW5nIGNvbXBvbmVudHMgZm9yIHRoYXQgcGF0aC5cblJ1biBcXGBnYXRzYnkgY2xlYW5cXGAgdG8gcmVtb3ZlIGFueSBjYWNoZWQgZWxlbWVudHMuYFxuICAgICAgaWYgKHRoaXMuc3RhdGUucGFnZVJlc291cmNlcz8uZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKVxuICAgICAgICB0aHJvdyB0aGlzLnN0YXRlLnBhZ2VSZXNvdXJjZXMuZXJyb3JcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW4odGhpcy5zdGF0ZSlcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBFbnN1cmVSZXNvdXJjZXNcbiIsImltcG9ydCB7IGFwaVJ1bm5lciwgYXBpUnVubmVyQXN5bmMgfSBmcm9tIFwiLi9hcGktcnVubmVyLWJyb3dzZXJcIlxuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgUmVhY3RET00gZnJvbSBcInJlYWN0LWRvbVwiXG5pbXBvcnQgeyBSb3V0ZXIsIG5hdmlnYXRlLCBMb2NhdGlvbiwgQmFzZUNvbnRleHQgfSBmcm9tIFwiQGdhdHNieWpzL3JlYWNoLXJvdXRlclwiXG5pbXBvcnQgeyBTY3JvbGxDb250ZXh0IH0gZnJvbSBcImdhdHNieS1yZWFjdC1yb3V0ZXItc2Nyb2xsXCJcbmltcG9ydCB7IFN0YXRpY1F1ZXJ5Q29udGV4dCB9IGZyb20gXCJnYXRzYnlcIlxuaW1wb3J0IHtcbiAgc2hvdWxkVXBkYXRlU2Nyb2xsLFxuICBpbml0IGFzIG5hdmlnYXRpb25Jbml0LFxuICBSb3V0ZVVwZGF0ZXMsXG59IGZyb20gXCIuL25hdmlnYXRpb25cIlxuaW1wb3J0IGVtaXR0ZXIgZnJvbSBcIi4vZW1pdHRlclwiXG5pbXBvcnQgUGFnZVJlbmRlcmVyIGZyb20gXCIuL3BhZ2UtcmVuZGVyZXJcIlxuaW1wb3J0IGFzeW5jUmVxdWlyZXMgZnJvbSBcIiR2aXJ0dWFsL2FzeW5jLXJlcXVpcmVzXCJcbmltcG9ydCB7XG4gIHNldExvYWRlcixcbiAgUHJvZExvYWRlcixcbiAgcHVibGljTG9hZGVyLFxuICBQYWdlUmVzb3VyY2VTdGF0dXMsXG4gIGdldFN0YXRpY1F1ZXJ5UmVzdWx0cyxcbn0gZnJvbSBcIi4vbG9hZGVyXCJcbmltcG9ydCBFbnN1cmVSZXNvdXJjZXMgZnJvbSBcIi4vZW5zdXJlLXJlc291cmNlc1wiXG5pbXBvcnQgc3RyaXBQcmVmaXggZnJvbSBcIi4vc3RyaXAtcHJlZml4XCJcblxuLy8gR2VuZXJhdGVkIGR1cmluZyBib290c3RyYXBcbmltcG9ydCBtYXRjaFBhdGhzIGZyb20gXCIkdmlydHVhbC9tYXRjaC1wYXRocy5qc29uXCJcblxuY29uc3QgbG9hZGVyID0gbmV3IFByb2RMb2FkZXIoYXN5bmNSZXF1aXJlcywgbWF0Y2hQYXRocylcbnNldExvYWRlcihsb2FkZXIpXG5sb2FkZXIuc2V0QXBpUnVubmVyKGFwaVJ1bm5lcilcblxud2luZG93LmFzeW5jUmVxdWlyZXMgPSBhc3luY1JlcXVpcmVzXG53aW5kb3cuX19fZW1pdHRlciA9IGVtaXR0ZXJcbndpbmRvdy5fX19sb2FkZXIgPSBwdWJsaWNMb2FkZXJcblxubmF2aWdhdGlvbkluaXQoKVxuXG5hcGlSdW5uZXJBc3luYyhgb25DbGllbnRFbnRyeWApLnRoZW4oKCkgPT4ge1xuICAvLyBMZXQgcGx1Z2lucyByZWdpc3RlciBhIHNlcnZpY2Ugd29ya2VyLiBUaGUgcGx1Z2luIGp1c3QgbmVlZHNcbiAgLy8gdG8gcmV0dXJuIHRydWUuXG4gIGlmIChhcGlSdW5uZXIoYHJlZ2lzdGVyU2VydmljZVdvcmtlcmApLmZpbHRlcihCb29sZWFuKS5sZW5ndGggPiAwKSB7XG4gICAgcmVxdWlyZShgLi9yZWdpc3Rlci1zZXJ2aWNlLXdvcmtlcmApXG4gIH1cblxuICAvLyBJbiBnYXRzYnkgdjIgaWYgUm91dGVyIGlzIHVzZWQgaW4gcGFnZSB1c2luZyBtYXRjaFBhdGhzXG4gIC8vIHBhdGhzIG5lZWQgdG8gY29udGFpbiBmdWxsIHBhdGguXG4gIC8vIEZvciBleGFtcGxlOlxuICAvLyAgIC0gcGFnZSBoYXZlIGAvYXBwLypgIG1hdGNoUGF0aFxuICAvLyAgIC0gaW5zaWRlIHRlbXBsYXRlIHVzZXIgbmVlZHMgdG8gdXNlIGAvYXBwL3h5emAgYXMgcGF0aFxuICAvLyBSZXNldHRpbmcgYGJhc2VwYXRoYC9gYmFzZXVyaWAga2VlcHMgY3VycmVudCBiZWhhdmlvdXJcbiAgLy8gdG8gbm90IGludHJvZHVjZSBicmVha2luZyBjaGFuZ2UuXG4gIC8vIFJlbW92ZSB0aGlzIGluIHYzXG4gIGNvbnN0IFJvdXRlSGFuZGxlciA9IHByb3BzID0+IChcbiAgICA8QmFzZUNvbnRleHQuUHJvdmlkZXJcbiAgICAgIHZhbHVlPXt7XG4gICAgICAgIGJhc2V1cmk6IGAvYCxcbiAgICAgICAgYmFzZXBhdGg6IGAvYCxcbiAgICAgIH19XG4gICAgPlxuICAgICAgPFBhZ2VSZW5kZXJlciB7Li4ucHJvcHN9IC8+XG4gICAgPC9CYXNlQ29udGV4dC5Qcm92aWRlcj5cbiAgKVxuXG4gIGNvbnN0IERhdGFDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dCh7fSlcblxuICBjbGFzcyBHYXRzYnlSb290IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICByZW5kZXIoKSB7XG4gICAgICBjb25zdCB7IGNoaWxkcmVuIH0gPSB0aGlzLnByb3BzXG4gICAgICByZXR1cm4gKFxuICAgICAgICA8TG9jYXRpb24+XG4gICAgICAgICAgeyh7IGxvY2F0aW9uIH0pID0+IChcbiAgICAgICAgICAgIDxFbnN1cmVSZXNvdXJjZXMgbG9jYXRpb249e2xvY2F0aW9ufT5cbiAgICAgICAgICAgICAgeyh7IHBhZ2VSZXNvdXJjZXMsIGxvY2F0aW9uIH0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGF0aWNRdWVyeVJlc3VsdHMgPSBnZXRTdGF0aWNRdWVyeVJlc3VsdHMoKVxuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICA8U3RhdGljUXVlcnlDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtzdGF0aWNRdWVyeVJlc3VsdHN9PlxuICAgICAgICAgICAgICAgICAgICA8RGF0YUNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3sgcGFnZVJlc291cmNlcywgbG9jYXRpb24gfX0+XG4gICAgICAgICAgICAgICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICAgICAgICAgICAgICA8L0RhdGFDb250ZXh0LlByb3ZpZGVyPlxuICAgICAgICAgICAgICAgICAgPC9TdGF0aWNRdWVyeUNvbnRleHQuUHJvdmlkZXI+XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgPC9FbnN1cmVSZXNvdXJjZXM+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9Mb2NhdGlvbj5cbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBjbGFzcyBMb2NhdGlvbkhhbmRsZXIgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgIHJlbmRlcigpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxEYXRhQ29udGV4dC5Db25zdW1lcj5cbiAgICAgICAgICB7KHsgcGFnZVJlc291cmNlcywgbG9jYXRpb24gfSkgPT4gKFxuICAgICAgICAgICAgPFJvdXRlVXBkYXRlcyBsb2NhdGlvbj17bG9jYXRpb259PlxuICAgICAgICAgICAgICA8U2Nyb2xsQ29udGV4dFxuICAgICAgICAgICAgICAgIGxvY2F0aW9uPXtsb2NhdGlvbn1cbiAgICAgICAgICAgICAgICBzaG91bGRVcGRhdGVTY3JvbGw9e3Nob3VsZFVwZGF0ZVNjcm9sbH1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxSb3V0ZXJcbiAgICAgICAgICAgICAgICAgIGJhc2VwYXRoPXtfX0JBU0VfUEFUSF9ffVxuICAgICAgICAgICAgICAgICAgbG9jYXRpb249e2xvY2F0aW9ufVxuICAgICAgICAgICAgICAgICAgaWQ9XCJnYXRzYnktZm9jdXMtd3JhcHBlclwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPFJvdXRlSGFuZGxlclxuICAgICAgICAgICAgICAgICAgICBwYXRoPXtcbiAgICAgICAgICAgICAgICAgICAgICBwYWdlUmVzb3VyY2VzLnBhZ2UucGF0aCA9PT0gYC80MDQuaHRtbGBcbiAgICAgICAgICAgICAgICAgICAgICAgID8gc3RyaXBQcmVmaXgobG9jYXRpb24ucGF0aG5hbWUsIF9fQkFTRV9QQVRIX18pXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGVuY29kZVVSSShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlUmVzb3VyY2VzLnBhZ2UubWF0Y2hQYXRoIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlUmVzb3VyY2VzLnBhZ2UucGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgey4uLnRoaXMucHJvcHN9XG4gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uPXtsb2NhdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgcGFnZVJlc291cmNlcz17cGFnZVJlc291cmNlc31cbiAgICAgICAgICAgICAgICAgICAgey4uLnBhZ2VSZXNvdXJjZXMuanNvbn1cbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9Sb3V0ZXI+XG4gICAgICAgICAgICAgIDwvU2Nyb2xsQ29udGV4dD5cbiAgICAgICAgICAgIDwvUm91dGVVcGRhdGVzPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvRGF0YUNvbnRleHQuQ29uc3VtZXI+XG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgY29uc3QgeyBwYWdlUGF0aCwgbG9jYXRpb246IGJyb3dzZXJMb2MgfSA9IHdpbmRvd1xuXG4gIC8vIEV4cGxpY2l0bHkgY2FsbCBuYXZpZ2F0ZSBpZiB0aGUgY2Fub25pY2FsIHBhdGggKHdpbmRvdy5wYWdlUGF0aClcbiAgLy8gaXMgZGlmZmVyZW50IHRvIHRoZSBicm93c2VyIHBhdGggKHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSkuIEJ1dFxuICAvLyBvbmx5IGlmIE5PTkUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGhvbGQ6XG4gIC8vXG4gIC8vIC0gVGhlIHVybCBtYXRjaGVzIGEgY2xpZW50IHNpZGUgcm91dGUgKHBhZ2UubWF0Y2hQYXRoKVxuICAvLyAtIGl0J3MgYSA0MDQgcGFnZVxuICAvLyAtIGl0J3MgdGhlIG9mZmxpbmUgcGx1Z2luIHNoZWxsICgvb2ZmbGluZS1wbHVnaW4tYXBwLXNoZWxsLWZhbGxiYWNrLylcbiAgaWYgKFxuICAgIHBhZ2VQYXRoICYmXG4gICAgX19CQVNFX1BBVEhfXyArIHBhZ2VQYXRoICE9PSBicm93c2VyTG9jLnBhdGhuYW1lICYmXG4gICAgIShcbiAgICAgIGxvYWRlci5maW5kTWF0Y2hQYXRoKHN0cmlwUHJlZml4KGJyb3dzZXJMb2MucGF0aG5hbWUsIF9fQkFTRV9QQVRIX18pKSB8fFxuICAgICAgcGFnZVBhdGggPT09IGAvNDA0Lmh0bWxgIHx8XG4gICAgICBwYWdlUGF0aC5tYXRjaCgvXlxcLzQwNFxcLz8kLykgfHxcbiAgICAgIHBhZ2VQYXRoLm1hdGNoKC9eXFwvb2ZmbGluZS1wbHVnaW4tYXBwLXNoZWxsLWZhbGxiYWNrXFwvPyQvKVxuICAgIClcbiAgKSB7XG4gICAgbmF2aWdhdGUoX19CQVNFX1BBVEhfXyArIHBhZ2VQYXRoICsgYnJvd3NlckxvYy5zZWFyY2ggKyBicm93c2VyTG9jLmhhc2gsIHtcbiAgICAgIHJlcGxhY2U6IHRydWUsXG4gICAgfSlcbiAgfVxuXG4gIHB1YmxpY0xvYWRlci5sb2FkUGFnZShicm93c2VyTG9jLnBhdGhuYW1lKS50aGVuKHBhZ2UgPT4ge1xuICAgIGlmICghcGFnZSB8fCBwYWdlLnN0YXR1cyA9PT0gUGFnZVJlc291cmNlU3RhdHVzLkVycm9yKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gYHBhZ2UgcmVzb3VyY2VzIGZvciAke2Jyb3dzZXJMb2MucGF0aG5hbWV9IG5vdCBmb3VuZC4gTm90IHJlbmRlcmluZyBSZWFjdGBcblxuICAgICAgLy8gaWYgdGhlIGNodW5rIHRocm93cyBhbiBlcnJvciB3ZSB3YW50IHRvIGNhcHR1cmUgdGhlIHJlYWwgZXJyb3JcbiAgICAgIC8vIFRoaXMgc2hvdWxkIGhlbHAgd2l0aCBodHRwczovL2dpdGh1Yi5jb20vZ2F0c2J5anMvZ2F0c2J5L2lzc3Vlcy8xOTYxOFxuICAgICAgaWYgKHBhZ2UgJiYgcGFnZS5lcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpXG4gICAgICAgIHRocm93IHBhZ2UuZXJyb3JcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgd2luZG93Ll9fX3dlYnBhY2tDb21waWxhdGlvbkhhc2ggPSBwYWdlLnBhZ2Uud2VicGFja0NvbXBpbGF0aW9uSGFzaFxuXG4gICAgY29uc3QgU2l0ZVJvb3QgPSBhcGlSdW5uZXIoXG4gICAgICBgd3JhcFJvb3RFbGVtZW50YCxcbiAgICAgIHsgZWxlbWVudDogPExvY2F0aW9uSGFuZGxlciAvPiB9LFxuICAgICAgPExvY2F0aW9uSGFuZGxlciAvPixcbiAgICAgICh7IHJlc3VsdCB9KSA9PiB7XG4gICAgICAgIHJldHVybiB7IGVsZW1lbnQ6IHJlc3VsdCB9XG4gICAgICB9XG4gICAgKS5wb3AoKVxuXG4gICAgY29uc3QgQXBwID0gZnVuY3Rpb24gQXBwKCkge1xuICAgICAgY29uc3Qgb25DbGllbnRFbnRyeVJhblJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSlcblxuICAgICAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKCFvbkNsaWVudEVudHJ5UmFuUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBvbkNsaWVudEVudHJ5UmFuUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgICAgICAgcGVyZm9ybWFuY2UubWFyayhgb25Jbml0aWFsQ2xpZW50UmVuZGVyYClcblxuICAgICAgICAgIGFwaVJ1bm5lcihgb25Jbml0aWFsQ2xpZW50UmVuZGVyYClcbiAgICAgICAgfVxuICAgICAgfSwgW10pXG5cbiAgICAgIHJldHVybiA8R2F0c2J5Um9vdD57U2l0ZVJvb3R9PC9HYXRzYnlSb290PlxuICAgIH1cblxuICAgIGNvbnN0IHJlbmRlcmVyID0gYXBpUnVubmVyKFxuICAgICAgYHJlcGxhY2VIeWRyYXRlRnVuY3Rpb25gLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgUmVhY3RET00uY3JlYXRlUm9vdCA/IFJlYWN0RE9NLmNyZWF0ZVJvb3QgOiBSZWFjdERPTS5oeWRyYXRlXG4gICAgKVswXVxuXG4gICAgZnVuY3Rpb24gcnVuUmVuZGVyKCkge1xuICAgICAgY29uc3Qgcm9vdEVsZW1lbnQgPVxuICAgICAgICB0eXBlb2Ygd2luZG93ICE9PSBgdW5kZWZpbmVkYFxuICAgICAgICAgID8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYF9fX2dhdHNieWApXG4gICAgICAgICAgOiBudWxsXG5cbiAgICAgIGlmIChyZW5kZXJlciA9PT0gUmVhY3RET00uY3JlYXRlUm9vdCkge1xuICAgICAgICByZW5kZXJlcihyb290RWxlbWVudCwge1xuICAgICAgICAgIGh5ZHJhdGU6IHRydWUsXG4gICAgICAgIH0pLnJlbmRlcig8QXBwIC8+KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVuZGVyZXIoPEFwcCAvPiwgcm9vdEVsZW1lbnQpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21hZHJvYmJ5L3plcHRvL2Jsb2IvYjVlZDhkNjA3ZjY3NzI0Nzg4ZWM5ZmY0OTJiZTI5N2Y2NGQ0N2RmYy9zcmMvemVwdG8uanMjTDQzOS1MNDUwXG4gICAgLy8gVE9ETyByZW1vdmUgSUUgMTAgc3VwcG9ydFxuICAgIGNvbnN0IGRvYyA9IGRvY3VtZW50XG4gICAgaWYgKFxuICAgICAgZG9jLnJlYWR5U3RhdGUgPT09IGBjb21wbGV0ZWAgfHxcbiAgICAgIChkb2MucmVhZHlTdGF0ZSAhPT0gYGxvYWRpbmdgICYmICFkb2MuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsKVxuICAgICkge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJ1blJlbmRlcigpXG4gICAgICB9LCAwKVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBoYW5kbGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcihgRE9NQ29udGVudExvYWRlZGAsIGhhbmRsZXIsIGZhbHNlKVxuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihgbG9hZGAsIGhhbmRsZXIsIGZhbHNlKVxuXG4gICAgICAgIHJ1blJlbmRlcigpXG4gICAgICB9XG5cbiAgICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKGBET01Db250ZW50TG9hZGVkYCwgaGFuZGxlciwgZmFsc2UpXG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihgbG9hZGAsIGhhbmRsZXIsIGZhbHNlKVxuICAgIH1cbiAgfSlcbn0pXG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///2871\n')},6947:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7294);\n/* harmony import */ var _loader__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(8741);\n/* harmony import */ var _page_renderer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(804);\nvar ProdPageRenderer=function ProdPageRenderer(_ref){var location=_ref.location;var pageResources=_loader__WEBPACK_IMPORTED_MODULE_1__/* .default.loadPageSync */ .ZP.loadPageSync(location.pathname);if(!pageResources){return null;}return/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_page_renderer__WEBPACK_IMPORTED_MODULE_2__/* .default */ .Z,Object.assign({location:location,pageResources:pageResources},pageResources.json));};/* harmony default export */ __webpack_exports__["default"] = (ProdPageRenderer);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uLy5jYWNoZS9wdWJsaWMtcGFnZS1yZW5kZXJlci1wcm9kLmpzP2FmMzkiXSwibmFtZXMiOlsiUHJvZFBhZ2VSZW5kZXJlciIsImxvY2F0aW9uIiwicGFnZVJlc291cmNlcyIsImxvYWRlciIsInBhdGhuYW1lIiwiUmVhY3QiLCJJbnRlcm5hbFBhZ2VSZW5kZXJlciIsImpzb24iXSwibWFwcGluZ3MiOiI7Ozs7QUFNQSxHQUFNQSxpQkFBZ0IsQ0FBRyxRQUFuQkEsaUJBQW1CLE1BQWtCLElBQWZDLFNBQWUsTUFBZkEsUUFBZSxDQUN6QyxHQUFNQyxjQUFhLENBQUdDLGdGQUFBLENBQW9CRixRQUFRLENBQUNHLFFBQTdCLENBQXRCLENBQ0EsR0FBSSxDQUFDRixhQUFMLENBQW9CLENBQ2xCLE1BQU8sS0FBUCxDQUNELENBQ0QsbUJBQU9HLGdEQUFBLENBQW9CQyw0REFBcEIsZ0JBQ0xMLFFBQVEsQ0FBUkEsUUFESyxDQUVMQyxhQUFhLENBQWJBLGFBRkssRUFHRkEsYUFBYSxDQUFDSyxJQUhaLEVBQVAsQ0FLRCxDQVZELENBa0JBLCtEQUFlUCxnQkFBZiIsImZpbGUiOiI2OTQ3LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCJcblxuaW1wb3J0IGxvYWRlciBmcm9tIFwiLi9sb2FkZXJcIlxuaW1wb3J0IEludGVybmFsUGFnZVJlbmRlcmVyIGZyb20gXCIuL3BhZ2UtcmVuZGVyZXJcIlxuXG5jb25zdCBQcm9kUGFnZVJlbmRlcmVyID0gKHsgbG9jYXRpb24gfSkgPT4ge1xuICBjb25zdCBwYWdlUmVzb3VyY2VzID0gbG9hZGVyLmxvYWRQYWdlU3luYyhsb2NhdGlvbi5wYXRobmFtZSlcbiAgaWYgKCFwYWdlUmVzb3VyY2VzKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChJbnRlcm5hbFBhZ2VSZW5kZXJlciwge1xuICAgIGxvY2F0aW9uLFxuICAgIHBhZ2VSZXNvdXJjZXMsXG4gICAgLi4ucGFnZVJlc291cmNlcy5qc29uLFxuICB9KVxufVxuXG5Qcm9kUGFnZVJlbmRlcmVyLnByb3BUeXBlcyA9IHtcbiAgbG9jYXRpb246IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgcGF0aG5hbWU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgfSkuaXNSZXF1aXJlZCxcbn1cblxuZXhwb3J0IGRlZmF1bHQgUHJvZFBhZ2VSZW5kZXJlclxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///6947\n')},861:function(module,__unused_webpack_exports,__webpack_require__){eval("var preferDefault=function preferDefault(m){return m&&m.default||m;};if(false){}else if(true){module.exports=preferDefault(__webpack_require__(6947));}else{}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uLy5jYWNoZS9wdWJsaWMtcGFnZS1yZW5kZXJlci5qcz85NzBkIl0sIm5hbWVzIjpbInByZWZlckRlZmF1bHQiLCJtIiwiZGVmYXVsdCIsInByb2Nlc3MiLCJtb2R1bGUiLCJleHBvcnRzIiwicmVxdWlyZSJdLCJtYXBwaW5ncyI6IkFBQUEsR0FBTUEsY0FBYSxDQUFHLFFBQWhCQSxjQUFnQixDQUFBQyxDQUFDLFFBQUtBLEVBQUMsRUFBSUEsQ0FBQyxDQUFDQyxPQUFSLEVBQW9CRCxDQUF4QixFQUF2QixDQUVBLEdBQUlFLEtBQUosQ0FBMkMsRUFBM0MsSUFFTyxJQUFJQSxJQUFKLENBQW9ELENBQ3pEQyxNQUFNLENBQUNDLE9BQVAsQ0FBaUJMLGFBQWEsQ0FBQ00sbUJBQU8sQ0FBQyxLQUFULENBQTlCLENBQ0QsQ0FGTSxJQUVBIiwiZmlsZSI6Ijg2MS5qcyIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IHByZWZlckRlZmF1bHQgPSBtID0+IChtICYmIG0uZGVmYXVsdCkgfHwgbVxuXG5pZiAocHJvY2Vzcy5lbnYuQlVJTERfU1RBR0UgPT09IGBkZXZlbG9wYCkge1xuICBtb2R1bGUuZXhwb3J0cyA9IHByZWZlckRlZmF1bHQocmVxdWlyZShgLi9wdWJsaWMtcGFnZS1yZW5kZXJlci1kZXZgKSlcbn0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuQlVJTERfU1RBR0UgPT09IGBidWlsZC1qYXZhc2NyaXB0YCkge1xuICBtb2R1bGUuZXhwb3J0cyA9IHByZWZlckRlZmF1bHQocmVxdWlyZShgLi9wdWJsaWMtcGFnZS1yZW5kZXJlci1wcm9kYCkpXG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9ICgpID0+IG51bGxcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///861\n")},3639:function(__unused_webpack_module,exports){eval("exports.O=function(Component){return Component;};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uLy5jYWNoZS9yZWFjdC1saWZlY3ljbGVzLWNvbXBhdC5qcz9mNzg1Il0sIm5hbWVzIjpbImV4cG9ydHMiLCJDb21wb25lbnQiXSwibWFwcGluZ3MiOiJBQUFBQSxTQUFBLENBQW1CLFNBQUFDLFNBQVMsUUFBSUEsVUFBSixFQUE1QiIsImZpbGUiOiIzNjM5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cy5wb2x5ZmlsbCA9IENvbXBvbmVudCA9PiBDb21wb25lbnRcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///3639\n")},5166:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "J": function() { return /* binding */ maybeGetBrowserRedirect; }\n});\n\n;// CONCATENATED MODULE: ./.cache/redirects.json\nvar redirects_namespaceObject = [];\n;// CONCATENATED MODULE: ./.cache/redirect-utils.js\n// Convert to a map for faster lookup in maybeRedirect()\nvar redirectMap=new Map();var redirectIgnoreCaseMap=new Map();redirects_namespaceObject.forEach(function(redirect){if(redirect.ignoreCase){redirectIgnoreCaseMap.set(redirect.fromPath,redirect);}else{redirectMap.set(redirect.fromPath,redirect);}});function maybeGetBrowserRedirect(pathname){var redirect=redirectMap.get(pathname);if(!redirect){redirect=redirectIgnoreCaseMap.get(pathname.toLowerCase());}return redirect;}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uLy5jYWNoZS9yZWRpcmVjdC11dGlscy5qcz84OWI4Il0sIm5hbWVzIjpbInJlZGlyZWN0TWFwIiwiTWFwIiwicmVkaXJlY3RJZ25vcmVDYXNlTWFwIiwicmVkaXJlY3RzIiwicmVkaXJlY3QiLCJpZ25vcmVDYXNlIiwic2V0IiwiZnJvbVBhdGgiLCJtYXliZUdldEJyb3dzZXJSZWRpcmVjdCIsInBhdGhuYW1lIiwiZ2V0IiwidG9Mb3dlckNhc2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUVBO0FBRUEsR0FBTUEsWUFBVyxDQUFHLEdBQUlDLElBQUosRUFBcEIsQ0FDQSxHQUFNQyxzQkFBcUIsQ0FBRyxHQUFJRCxJQUFKLEVBQTlCLENBRUFFLGlDQUFBLENBQWtCLFNBQUFDLFFBQVEsQ0FBSSxDQUM1QixHQUFJQSxRQUFRLENBQUNDLFVBQWIsQ0FBeUIsQ0FDdkJILHFCQUFxQixDQUFDSSxHQUF0QixDQUEwQkYsUUFBUSxDQUFDRyxRQUFuQyxDQUE2Q0gsUUFBN0MsRUFDRCxDQUZELElBRU8sQ0FDTEosV0FBVyxDQUFDTSxHQUFaLENBQWdCRixRQUFRLENBQUNHLFFBQXpCLENBQW1DSCxRQUFuQyxFQUNELENBQ0YsQ0FORCxFQVFPLFFBQVNJLHdCQUFULENBQWlDQyxRQUFqQyxDQUEyQyxDQUNoRCxHQUFJTCxTQUFRLENBQUdKLFdBQVcsQ0FBQ1UsR0FBWixDQUFnQkQsUUFBaEIsQ0FBZixDQUNBLEdBQUksQ0FBQ0wsUUFBTCxDQUFlLENBQ2JBLFFBQVEsQ0FBR0YscUJBQXFCLENBQUNRLEdBQXRCLENBQTBCRCxRQUFRLENBQUNFLFdBQVQsRUFBMUIsQ0FBWCxDQUNELENBQ0QsTUFBT1AsU0FBUCxDQUNEIiwiZmlsZSI6IjUxNjYuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcmVkaXJlY3RzIGZyb20gXCIuL3JlZGlyZWN0cy5qc29uXCJcblxuLy8gQ29udmVydCB0byBhIG1hcCBmb3IgZmFzdGVyIGxvb2t1cCBpbiBtYXliZVJlZGlyZWN0KClcblxuY29uc3QgcmVkaXJlY3RNYXAgPSBuZXcgTWFwKClcbmNvbnN0IHJlZGlyZWN0SWdub3JlQ2FzZU1hcCA9IG5ldyBNYXAoKVxuXG5yZWRpcmVjdHMuZm9yRWFjaChyZWRpcmVjdCA9PiB7XG4gIGlmIChyZWRpcmVjdC5pZ25vcmVDYXNlKSB7XG4gICAgcmVkaXJlY3RJZ25vcmVDYXNlTWFwLnNldChyZWRpcmVjdC5mcm9tUGF0aCwgcmVkaXJlY3QpXG4gIH0gZWxzZSB7XG4gICAgcmVkaXJlY3RNYXAuc2V0KHJlZGlyZWN0LmZyb21QYXRoLCByZWRpcmVjdClcbiAgfVxufSlcblxuZXhwb3J0IGZ1bmN0aW9uIG1heWJlR2V0QnJvd3NlclJlZGlyZWN0KHBhdGhuYW1lKSB7XG4gIGxldCByZWRpcmVjdCA9IHJlZGlyZWN0TWFwLmdldChwYXRobmFtZSlcbiAgaWYgKCFyZWRpcmVjdCkge1xuICAgIHJlZGlyZWN0ID0gcmVkaXJlY3RJZ25vcmVDYXNlTWFwLmdldChwYXRobmFtZS50b0xvd2VyQ2FzZSgpKVxuICB9XG4gIHJldHVybiByZWRpcmVjdFxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///5166\n')},154:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _api_runner_browser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7343);\nif(window.location.protocol!=="https:"&&window.location.hostname!=="localhost"){console.error("Service workers can only be used over HTTPS, or on localhost for development");}else if("serviceWorker"in navigator){navigator.serviceWorker.register("/justice40-tool/63e863"+"/sw.js").then(function(reg){reg.addEventListener("updatefound",function(){(0,_api_runner_browser__WEBPACK_IMPORTED_MODULE_0__/* .apiRunner */ .h)("onServiceWorkerUpdateFound",{serviceWorker:reg});// The updatefound event implies that reg.installing is set; see\n// https://w3c.github.io/ServiceWorker/#service-worker-registration-updatefound-event\nvar installingWorker=reg.installing;console.log("installingWorker",installingWorker);installingWorker.addEventListener("statechange",function(){switch(installingWorker.state){case"installed":if(navigator.serviceWorker.controller){// At this point, the old content will have been purged and the fresh content will\n// have been added to the cache.\n// We set a flag so Gatsby Link knows to refresh the page on next navigation attempt\nwindow.___swUpdated=true;// We call the onServiceWorkerUpdateReady API so users can show update prompts.\n(0,_api_runner_browser__WEBPACK_IMPORTED_MODULE_0__/* .apiRunner */ .h)("onServiceWorkerUpdateReady",{serviceWorker:reg});// If resources failed for the current page, reload.\nif(window.___failedResources){console.log("resources failed, SW updated - reloading");window.location.reload();}}else{// At this point, everything has been precached.\n// It\'s the perfect time to display a "Content is cached for offline use." message.\nconsole.log("Content is now available offline!");// Post to service worker that install is complete.\n// Delay to allow time for the event listener to be added --\n// otherwise fetch is called too soon and resources aren\'t cached.\n(0,_api_runner_browser__WEBPACK_IMPORTED_MODULE_0__/* .apiRunner */ .h)("onServiceWorkerInstalled",{serviceWorker:reg});}break;case"redundant":console.error("The installing service worker became redundant.");(0,_api_runner_browser__WEBPACK_IMPORTED_MODULE_0__/* .apiRunner */ .h)("onServiceWorkerRedundant",{serviceWorker:reg});break;case"activated":(0,_api_runner_browser__WEBPACK_IMPORTED_MODULE_0__/* .apiRunner */ .h)("onServiceWorkerActive",{serviceWorker:reg});break;}});});}).catch(function(e){console.error("Error during service worker registration:",e);});}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uLy5jYWNoZS9yZWdpc3Rlci1zZXJ2aWNlLXdvcmtlci5qcz8zNTI1Il0sIm5hbWVzIjpbIndpbmRvdyIsImxvY2F0aW9uIiwicHJvdG9jb2wiLCJob3N0bmFtZSIsImNvbnNvbGUiLCJlcnJvciIsIm5hdmlnYXRvciIsInNlcnZpY2VXb3JrZXIiLCJyZWdpc3RlciIsIl9fQkFTRV9QQVRIX18iLCJ0aGVuIiwicmVnIiwiYWRkRXZlbnRMaXN0ZW5lciIsImFwaVJ1bm5lciIsImluc3RhbGxpbmdXb3JrZXIiLCJpbnN0YWxsaW5nIiwibG9nIiwic3RhdGUiLCJjb250cm9sbGVyIiwiX19fc3dVcGRhdGVkIiwiX19fZmFpbGVkUmVzb3VyY2VzIiwicmVsb2FkIiwiY2F0Y2giLCJlIl0sIm1hcHBpbmdzIjoiOztBQUVBLEdBQ0VBLE1BQU0sQ0FBQ0MsUUFBUCxDQUFnQkMsUUFBaEIsYUFDQUYsTUFBTSxDQUFDQyxRQUFQLENBQWdCRSxRQUFoQixjQUZGLENBR0UsQ0FDQUMsT0FBTyxDQUFDQyxLQUFSLGlGQUdELENBUEQsSUFPTyxJQUFJLGlCQUFtQkMsVUFBdkIsQ0FBa0MsQ0FDdkNBLFNBQVMsQ0FBQ0MsYUFBVixDQUNHQyxRQURILENBQ2VDLHdCQURmLFdBRUdDLElBRkgsQ0FFUSxTQUFVQyxHQUFWLENBQWUsQ0FDbkJBLEdBQUcsQ0FBQ0MsZ0JBQUosZUFBb0MsVUFBTSxDQUN4Q0MsdUVBQVMsOEJBQStCLENBQUVOLGFBQWEsQ0FBRUksR0FBakIsQ0FBL0IsQ0FBVCxDQUNBO0FBQ0E7QUFDQSxHQUFNRyxpQkFBZ0IsQ0FBR0gsR0FBRyxDQUFDSSxVQUE3QixDQUNBWCxPQUFPLENBQUNZLEdBQVIsb0JBQWdDRixnQkFBaEMsRUFDQUEsZ0JBQWdCLENBQUNGLGdCQUFqQixlQUFpRCxVQUFNLENBQ3JELE9BQVFFLGdCQUFnQixDQUFDRyxLQUF6QixFQUNFLGdCQUNFLEdBQUlYLFNBQVMsQ0FBQ0MsYUFBVixDQUF3QlcsVUFBNUIsQ0FBd0MsQ0FDdEM7QUFDQTtBQUVBO0FBQ0FsQixNQUFNLENBQUNtQixZQUFQLENBQXNCLElBQXRCLENBQ0E7QUFDQU4sdUVBQVMsOEJBQStCLENBQUVOLGFBQWEsQ0FBRUksR0FBakIsQ0FBL0IsQ0FBVCxDQUVBO0FBQ0EsR0FBSVgsTUFBTSxDQUFDb0Isa0JBQVgsQ0FBK0IsQ0FDN0JoQixPQUFPLENBQUNZLEdBQVIsNkNBQ0FoQixNQUFNLENBQUNDLFFBQVAsQ0FBZ0JvQixNQUFoQixHQUNELENBQ0YsQ0FkRCxJQWNPLENBQ0w7QUFDQTtBQUNBakIsT0FBTyxDQUFDWSxHQUFSLHNDQUVBO0FBQ0E7QUFDQTtBQUNBSCx1RUFBUyw0QkFBNkIsQ0FBRU4sYUFBYSxDQUFFSSxHQUFqQixDQUE3QixDQUFULENBQ0QsQ0FDRCxNQUVGLGdCQUNFUCxPQUFPLENBQUNDLEtBQVIsb0RBQ0FRLHVFQUFTLDRCQUE2QixDQUFFTixhQUFhLENBQUVJLEdBQWpCLENBQTdCLENBQVQsQ0FDQSxNQUVGLGdCQUNFRSx1RUFBUyx5QkFBMEIsQ0FBRU4sYUFBYSxDQUFFSSxHQUFqQixDQUExQixDQUFULENBQ0EsTUFuQ0osQ0FxQ0QsQ0F0Q0QsRUF1Q0QsQ0E3Q0QsRUE4Q0QsQ0FqREgsRUFrREdXLEtBbERILENBa0RTLFNBQVVDLENBQVYsQ0FBYSxDQUNsQm5CLE9BQU8sQ0FBQ0MsS0FBUiw2Q0FBMkRrQixDQUEzRCxFQUNELENBcERILEVBcUREIiwiZmlsZSI6IjE1NC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFwaVJ1bm5lciB9IGZyb20gXCIuL2FwaS1ydW5uZXItYnJvd3NlclwiXG5cbmlmIChcbiAgd2luZG93LmxvY2F0aW9uLnByb3RvY29sICE9PSBgaHR0cHM6YCAmJlxuICB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUgIT09IGBsb2NhbGhvc3RgXG4pIHtcbiAgY29uc29sZS5lcnJvcihcbiAgICBgU2VydmljZSB3b3JrZXJzIGNhbiBvbmx5IGJlIHVzZWQgb3ZlciBIVFRQUywgb3Igb24gbG9jYWxob3N0IGZvciBkZXZlbG9wbWVudGBcbiAgKVxufSBlbHNlIGlmIChgc2VydmljZVdvcmtlcmAgaW4gbmF2aWdhdG9yKSB7XG4gIG5hdmlnYXRvci5zZXJ2aWNlV29ya2VyXG4gICAgLnJlZ2lzdGVyKGAke19fQkFTRV9QQVRIX199L3N3LmpzYClcbiAgICAudGhlbihmdW5jdGlvbiAocmVnKSB7XG4gICAgICByZWcuYWRkRXZlbnRMaXN0ZW5lcihgdXBkYXRlZm91bmRgLCAoKSA9PiB7XG4gICAgICAgIGFwaVJ1bm5lcihgb25TZXJ2aWNlV29ya2VyVXBkYXRlRm91bmRgLCB7IHNlcnZpY2VXb3JrZXI6IHJlZyB9KVxuICAgICAgICAvLyBUaGUgdXBkYXRlZm91bmQgZXZlbnQgaW1wbGllcyB0aGF0IHJlZy5pbnN0YWxsaW5nIGlzIHNldDsgc2VlXG4gICAgICAgIC8vIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9TZXJ2aWNlV29ya2VyLyNzZXJ2aWNlLXdvcmtlci1yZWdpc3RyYXRpb24tdXBkYXRlZm91bmQtZXZlbnRcbiAgICAgICAgY29uc3QgaW5zdGFsbGluZ1dvcmtlciA9IHJlZy5pbnN0YWxsaW5nXG4gICAgICAgIGNvbnNvbGUubG9nKGBpbnN0YWxsaW5nV29ya2VyYCwgaW5zdGFsbGluZ1dvcmtlcilcbiAgICAgICAgaW5zdGFsbGluZ1dvcmtlci5hZGRFdmVudExpc3RlbmVyKGBzdGF0ZWNoYW5nZWAsICgpID0+IHtcbiAgICAgICAgICBzd2l0Y2ggKGluc3RhbGxpbmdXb3JrZXIuc3RhdGUpIHtcbiAgICAgICAgICAgIGNhc2UgYGluc3RhbGxlZGA6XG4gICAgICAgICAgICAgIGlmIChuYXZpZ2F0b3Iuc2VydmljZVdvcmtlci5jb250cm9sbGVyKSB7XG4gICAgICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgdGhlIG9sZCBjb250ZW50IHdpbGwgaGF2ZSBiZWVuIHB1cmdlZCBhbmQgdGhlIGZyZXNoIGNvbnRlbnQgd2lsbFxuICAgICAgICAgICAgICAgIC8vIGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgY2FjaGUuXG5cbiAgICAgICAgICAgICAgICAvLyBXZSBzZXQgYSBmbGFnIHNvIEdhdHNieSBMaW5rIGtub3dzIHRvIHJlZnJlc2ggdGhlIHBhZ2Ugb24gbmV4dCBuYXZpZ2F0aW9uIGF0dGVtcHRcbiAgICAgICAgICAgICAgICB3aW5kb3cuX19fc3dVcGRhdGVkID0gdHJ1ZVxuICAgICAgICAgICAgICAgIC8vIFdlIGNhbGwgdGhlIG9uU2VydmljZVdvcmtlclVwZGF0ZVJlYWR5IEFQSSBzbyB1c2VycyBjYW4gc2hvdyB1cGRhdGUgcHJvbXB0cy5cbiAgICAgICAgICAgICAgICBhcGlSdW5uZXIoYG9uU2VydmljZVdvcmtlclVwZGF0ZVJlYWR5YCwgeyBzZXJ2aWNlV29ya2VyOiByZWcgfSlcblxuICAgICAgICAgICAgICAgIC8vIElmIHJlc291cmNlcyBmYWlsZWQgZm9yIHRoZSBjdXJyZW50IHBhZ2UsIHJlbG9hZC5cbiAgICAgICAgICAgICAgICBpZiAod2luZG93Ll9fX2ZhaWxlZFJlc291cmNlcykge1xuICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYHJlc291cmNlcyBmYWlsZWQsIFNXIHVwZGF0ZWQgLSByZWxvYWRpbmdgKVxuICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIGV2ZXJ5dGhpbmcgaGFzIGJlZW4gcHJlY2FjaGVkLlxuICAgICAgICAgICAgICAgIC8vIEl0J3MgdGhlIHBlcmZlY3QgdGltZSB0byBkaXNwbGF5IGEgXCJDb250ZW50IGlzIGNhY2hlZCBmb3Igb2ZmbGluZSB1c2UuXCIgbWVzc2FnZS5cbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgQ29udGVudCBpcyBub3cgYXZhaWxhYmxlIG9mZmxpbmUhYClcblxuICAgICAgICAgICAgICAgIC8vIFBvc3QgdG8gc2VydmljZSB3b3JrZXIgdGhhdCBpbnN0YWxsIGlzIGNvbXBsZXRlLlxuICAgICAgICAgICAgICAgIC8vIERlbGF5IHRvIGFsbG93IHRpbWUgZm9yIHRoZSBldmVudCBsaXN0ZW5lciB0byBiZSBhZGRlZCAtLVxuICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSBmZXRjaCBpcyBjYWxsZWQgdG9vIHNvb24gYW5kIHJlc291cmNlcyBhcmVuJ3QgY2FjaGVkLlxuICAgICAgICAgICAgICAgIGFwaVJ1bm5lcihgb25TZXJ2aWNlV29ya2VySW5zdGFsbGVkYCwgeyBzZXJ2aWNlV29ya2VyOiByZWcgfSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgICBjYXNlIGByZWR1bmRhbnRgOlxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBUaGUgaW5zdGFsbGluZyBzZXJ2aWNlIHdvcmtlciBiZWNhbWUgcmVkdW5kYW50LmApXG4gICAgICAgICAgICAgIGFwaVJ1bm5lcihgb25TZXJ2aWNlV29ya2VyUmVkdW5kYW50YCwgeyBzZXJ2aWNlV29ya2VyOiByZWcgfSlcbiAgICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgICAgY2FzZSBgYWN0aXZhdGVkYDpcbiAgICAgICAgICAgICAgYXBpUnVubmVyKGBvblNlcnZpY2VXb3JrZXJBY3RpdmVgLCB7IHNlcnZpY2VXb3JrZXI6IHJlZyB9KVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcbiAgICAuY2F0Y2goZnVuY3Rpb24gKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGR1cmluZyBzZXJ2aWNlIHdvcmtlciByZWdpc3RyYXRpb246YCwgZSlcbiAgICB9KVxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///154\n')},1578:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "Z": function() { return /* binding */ stripPrefix; }\n/* harmony export */ });\n/**\n * Remove a prefix from a string. Return the input string if the given prefix\n * isn\'t found.\n */function stripPrefix(str,prefix){if(prefix===void 0){prefix="";}if(!prefix){return str;}if(str===prefix){return"/";}if(str.startsWith(prefix+"/")){return str.slice(prefix.length);}return str;}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uLy5jYWNoZS9zdHJpcC1wcmVmaXguanM/NzEyMiJdLCJuYW1lcyI6WyJzdHJpcFByZWZpeCIsInN0ciIsInByZWZpeCIsInN0YXJ0c1dpdGgiLCJzbGljZSIsImxlbmd0aCJdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7QUFDQTtBQUNBO0FBQ0EsR0FFZSxRQUFTQSxZQUFULENBQXFCQyxHQUFyQixDQUEwQkMsTUFBMUIsQ0FBdUMsSUFBYkEsTUFBYSxXQUFiQSxNQUFhLEtBQ3BELEdBQUksQ0FBQ0EsTUFBTCxDQUFhLENBQ1gsTUFBT0QsSUFBUCxDQUNELENBRUQsR0FBSUEsR0FBRyxHQUFLQyxNQUFaLENBQW9CLENBQ2xCLFVBQ0QsQ0FFRCxHQUFJRCxHQUFHLENBQUNFLFVBQUosQ0FBa0JELE1BQWxCLEtBQUosQ0FBa0MsQ0FDaEMsTUFBT0QsSUFBRyxDQUFDRyxLQUFKLENBQVVGLE1BQU0sQ0FBQ0csTUFBakIsQ0FBUCxDQUNELENBRUQsTUFBT0osSUFBUCxDQUNEIiwiZmlsZSI6IjE1NzguanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJlbW92ZSBhIHByZWZpeCBmcm9tIGEgc3RyaW5nLiBSZXR1cm4gdGhlIGlucHV0IHN0cmluZyBpZiB0aGUgZ2l2ZW4gcHJlZml4XG4gKiBpc24ndCBmb3VuZC5cbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzdHJpcFByZWZpeChzdHIsIHByZWZpeCA9IGBgKSB7XG4gIGlmICghcHJlZml4KSB7XG4gICAgcmV0dXJuIHN0clxuICB9XG5cbiAgaWYgKHN0ciA9PT0gcHJlZml4KSB7XG4gICAgcmV0dXJuIGAvYFxuICB9XG5cbiAgaWYgKHN0ci5zdGFydHNXaXRoKGAke3ByZWZpeH0vYCkpIHtcbiAgICByZXR1cm4gc3RyLnNsaWNlKHByZWZpeC5sZW5ndGgpXG4gIH1cblxuICByZXR1cm4gc3RyXG59XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///1578\n')},9037:function(I,g,n){"use strict";n.r(g)},5526:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("var _interopRequireDefault=__webpack_require__(5318);exports.__esModule=true;exports.wrapPageElement=void 0;var _wrapPage=_interopRequireDefault(__webpack_require__(6604));var wrapPageElement=_wrapPage.default;exports.wrapPageElement=wrapPageElement;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9nYXRzYnktcGx1Z2luLWludGwvZ2F0c2J5LWJyb3dzZXIuanM/ZjRiYSJdLCJuYW1lcyI6WyJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsImV4cG9ydHMiLCJfd3JhcFBhZ2UiLCJ3cmFwUGFnZUVsZW1lbnQiLCJkZWZhdWx0Il0sIm1hcHBpbmdzIjoiQUFFQSxHQUFJQSx1QkFBc0IsQ0FBR0MsbUJBQU8sQ0FBQyxJQUFELENBQXBDLENBRUFDLGtCQUFBLENBQXFCLElBQXJCLENBQ0FBLHVCQUFBLENBQTBCLElBQUssRUFBL0IsQ0FFQSxHQUFJQyxVQUFTLENBQUdILHNCQUFzQixDQUFDQyxtQkFBTyxDQUFDLElBQUQsQ0FBUixDQUF0QyxDQUVBLEdBQUlHLGdCQUFlLENBQUdELFNBQVMsQ0FBQ0UsT0FBaEMsQ0FDQUgsdUJBQUEsQ0FBMEJFLGVBQTFCIiwiZmlsZSI6IjU1MjYuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLndyYXBQYWdlRWxlbWVudCA9IHZvaWQgMDtcblxudmFyIF93cmFwUGFnZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vd3JhcC1wYWdlXCIpKTtcblxudmFyIHdyYXBQYWdlRWxlbWVudCA9IF93cmFwUGFnZS5kZWZhdWx0O1xuZXhwb3J0cy53cmFwUGFnZUVsZW1lbnQgPSB3cmFwUGFnZUVsZW1lbnQ7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///5526\n")},8368:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("var _interopRequireDefault=__webpack_require__(5318);exports.__esModule=true;exports.IntlContextConsumer=exports.IntlContextProvider=void 0;var _react=_interopRequireDefault(__webpack_require__(7294));var IntlContext=_react.default.createContext();var IntlContextProvider=IntlContext.Provider;exports.IntlContextProvider=IntlContextProvider;var IntlContextConsumer=IntlContext.Consumer;exports.IntlContextConsumer=IntlContextConsumer;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9nYXRzYnktcGx1Z2luLWludGwvaW50bC1jb250ZXh0LmpzPzlmY2QiXSwibmFtZXMiOlsiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJleHBvcnRzIiwiX3JlYWN0IiwiSW50bENvbnRleHQiLCJkZWZhdWx0IiwiY3JlYXRlQ29udGV4dCIsIkludGxDb250ZXh0UHJvdmlkZXIiLCJQcm92aWRlciIsIkludGxDb250ZXh0Q29uc3VtZXIiLCJDb25zdW1lciJdLCJtYXBwaW5ncyI6IkFBRUEsR0FBSUEsdUJBQXNCLENBQUdDLG1CQUFPLENBQUMsSUFBRCxDQUFwQyxDQUVBQyxrQkFBQSxDQUFxQixJQUFyQixDQUNBQSwyQkFBQSxDQUE4QkEsMkJBQUEsQ0FBOEIsSUFBSyxFQUFqRSxDQUVBLEdBQUlDLE9BQU0sQ0FBR0gsc0JBQXNCLENBQUNDLG1CQUFPLENBQUMsSUFBRCxDQUFSLENBQW5DLENBRUEsR0FBSUcsWUFBVyxDQUFHRCxNQUFNLENBQUNFLE9BQVAsQ0FBZUMsYUFBZixFQUFsQixDQUVBLEdBQUlDLG9CQUFtQixDQUFHSCxXQUFXLENBQUNJLFFBQXRDLENBQ0FOLDJCQUFBLENBQThCSyxtQkFBOUIsQ0FDQSxHQUFJRSxvQkFBbUIsQ0FBR0wsV0FBVyxDQUFDTSxRQUF0QyxDQUNBUiwyQkFBQSxDQUE4Qk8sbUJBQTlCIiwiZmlsZSI6IjgzNjguanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLkludGxDb250ZXh0Q29uc3VtZXIgPSBleHBvcnRzLkludGxDb250ZXh0UHJvdmlkZXIgPSB2b2lkIDA7XG5cbnZhciBfcmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBJbnRsQ29udGV4dCA9IF9yZWFjdC5kZWZhdWx0LmNyZWF0ZUNvbnRleHQoKTtcblxudmFyIEludGxDb250ZXh0UHJvdmlkZXIgPSBJbnRsQ29udGV4dC5Qcm92aWRlcjtcbmV4cG9ydHMuSW50bENvbnRleHRQcm92aWRlciA9IEludGxDb250ZXh0UHJvdmlkZXI7XG52YXIgSW50bENvbnRleHRDb25zdW1lciA9IEludGxDb250ZXh0LkNvbnN1bWVyO1xuZXhwb3J0cy5JbnRsQ29udGV4dENvbnN1bWVyID0gSW50bENvbnRleHRDb25zdW1lcjsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///8368\n")},6604:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('var _interopRequireDefault=__webpack_require__(5318);exports.__esModule=true;exports.default=void 0;var _react=_interopRequireDefault(__webpack_require__(7294));var _browserLang=_interopRequireDefault(__webpack_require__(9771));var _gatsby=__webpack_require__(5444);var _reactIntl=__webpack_require__(3160);var _intlContext=__webpack_require__(8368);var preferDefault=function preferDefault(m){return m&&m.default||m;};var polyfillIntl=function polyfillIntl(language){var locale=language.split("-")[0];try{if(!Intl.PluralRules){__webpack_require__(3228);__webpack_require__(7625)("./"+locale);}if(!Intl.RelativeTimeFormat){__webpack_require__(5316);__webpack_require__(1666)("./"+locale);}}catch(e){throw new Error("Cannot find react-intl/locale-data/"+language);}};var withIntlProvider=function withIntlProvider(intl){return function(children){polyfillIntl(intl.language);return _react.default.createElement(_reactIntl.IntlProvider,{locale:intl.language,defaultLocale:intl.defaultLanguage,messages:intl.messages},_react.default.createElement(_intlContext.IntlContextProvider,{value:intl},children));};};var _default=function _default(_ref,pluginOptions){var element=_ref.element,props=_ref.props;if(!props){return;}var pageContext=props.pageContext,location=props.location;var defaultLanguage=pluginOptions.defaultLanguage;var intl=pageContext.intl;var language=intl.language,languages=intl.languages,redirect=intl.redirect,routed=intl.routed,originalPath=intl.originalPath;if(typeof window!=="undefined"){window.___gatsbyIntl=intl;}/* eslint-disable no-undef */var isRedirect=redirect&&!routed;if(isRedirect){var search=location.search;// Skip build, Browsers only\nif(typeof window!=="undefined"){var detected=window.localStorage.getItem("gatsby-intl-language")||(0,_browserLang.default)({languages:languages,fallback:language});if(!languages.includes(detected)){detected=language;}var queryParams=search||"";var newUrl=(0,_gatsby.withPrefix)("/"+detected+originalPath+queryParams);window.localStorage.setItem("gatsby-intl-language",detected);window.location.replace(newUrl);}}var renderElement=isRedirect?null&&0:element;return withIntlProvider(intl)(renderElement);};exports.default=_default;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9nYXRzYnktcGx1Z2luLWludGwvd3JhcC1wYWdlLmpzPzhhMGQiXSwibmFtZXMiOlsiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJleHBvcnRzIiwiX3JlYWN0IiwiX2Jyb3dzZXJMYW5nIiwiX2dhdHNieSIsIl9yZWFjdEludGwiLCJfaW50bENvbnRleHQiLCJwcmVmZXJEZWZhdWx0IiwibSIsImRlZmF1bHQiLCJwb2x5ZmlsbEludGwiLCJsYW5ndWFnZSIsImxvY2FsZSIsInNwbGl0IiwiSW50bCIsIlBsdXJhbFJ1bGVzIiwiUmVsYXRpdmVUaW1lRm9ybWF0IiwiZSIsIkVycm9yIiwid2l0aEludGxQcm92aWRlciIsImludGwiLCJjaGlsZHJlbiIsImNyZWF0ZUVsZW1lbnQiLCJJbnRsUHJvdmlkZXIiLCJkZWZhdWx0TG9jYWxlIiwiZGVmYXVsdExhbmd1YWdlIiwibWVzc2FnZXMiLCJJbnRsQ29udGV4dFByb3ZpZGVyIiwidmFsdWUiLCJfZGVmYXVsdCIsIl9yZWYiLCJwbHVnaW5PcHRpb25zIiwiZWxlbWVudCIsInByb3BzIiwicGFnZUNvbnRleHQiLCJsb2NhdGlvbiIsImxhbmd1YWdlcyIsInJlZGlyZWN0Iiwicm91dGVkIiwib3JpZ2luYWxQYXRoIiwid2luZG93IiwiX19fZ2F0c2J5SW50bCIsImlzUmVkaXJlY3QiLCJzZWFyY2giLCJkZXRlY3RlZCIsImxvY2FsU3RvcmFnZSIsImdldEl0ZW0iLCJmYWxsYmFjayIsImluY2x1ZGVzIiwicXVlcnlQYXJhbXMiLCJuZXdVcmwiLCJ3aXRoUHJlZml4Iiwic2V0SXRlbSIsInJlcGxhY2UiLCJyZW5kZXJFbGVtZW50IiwiR0FUU0JZX0lOVExfUkVESVJFQ1RfQ09NUE9ORU5UX1BBVEgiXSwibWFwcGluZ3MiOiJBQUVBLEdBQUlBLHVCQUFzQixDQUFHQyxtQkFBTyxDQUFDLElBQUQsQ0FBcEMsQ0FFQUMsa0JBQUEs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bGUiOiI2NjA0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX3JlYWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX2Jyb3dzZXJMYW5nID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiYnJvd3Nlci1sYW5nXCIpKTtcblxudmFyIF9nYXRzYnkgPSByZXF1aXJlKFwiZ2F0c2J5XCIpO1xuXG52YXIgX3JlYWN0SW50bCA9IHJlcXVpcmUoXCJyZWFjdC1pbnRsXCIpO1xuXG52YXIgX2ludGxDb250ZXh0ID0gcmVxdWlyZShcIi4vaW50bC1jb250ZXh0XCIpO1xuXG52YXIgcHJlZmVyRGVmYXVsdCA9IGZ1bmN0aW9uIHByZWZlckRlZmF1bHQobSkge1xuICByZXR1cm4gbSAmJiBtLmRlZmF1bHQgfHwgbTtcbn07XG5cbnZhciBwb2x5ZmlsbEludGwgPSBmdW5jdGlvbiBwb2x5ZmlsbEludGwobGFuZ3VhZ2UpIHtcbiAgdmFyIGxvY2FsZSA9IGxhbmd1YWdlLnNwbGl0KFwiLVwiKVswXTtcblxuICB0cnkge1xuICAgIGlmICghSW50bC5QbHVyYWxSdWxlcykge1xuICAgICAgcmVxdWlyZShcIkBmb3JtYXRqcy9pbnRsLXBsdXJhbHJ1bGVzL3BvbHlmaWxsXCIpO1xuXG4gICAgICByZXF1aXJlKFwiQGZvcm1hdGpzL2ludGwtcGx1cmFscnVsZXMvZGlzdC9sb2NhbGUtZGF0YS9cIiArIGxvY2FsZSk7XG4gICAgfVxuXG4gICAgaWYgKCFJbnRsLlJlbGF0aXZlVGltZUZvcm1hdCkge1xuICAgICAgcmVxdWlyZShcIkBmb3JtYXRqcy9pbnRsLXJlbGF0aXZldGltZWZvcm1hdC9wb2x5ZmlsbFwiKTtcblxuICAgICAgcmVxdWlyZShcIkBmb3JtYXRqcy9pbnRsLXJlbGF0aXZldGltZWZvcm1hdC9kaXN0L2xvY2FsZS1kYXRhL1wiICsgbG9jYWxlKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCByZWFjdC1pbnRsL2xvY2FsZS1kYXRhL1wiICsgbGFuZ3VhZ2UpO1xuICB9XG59O1xuXG52YXIgd2l0aEludGxQcm92aWRlciA9IGZ1bmN0aW9uIHdpdGhJbnRsUHJvdmlkZXIoaW50bCkge1xuICByZXR1cm4gZnVuY3Rpb24gKGNoaWxkcmVuKSB7XG4gICAgcG9seWZpbGxJbnRsKGludGwubGFuZ3VhZ2UpO1xuICAgIHJldHVybiBfcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KF9yZWFjdEludGwuSW50bFByb3ZpZGVyLCB7XG4gICAgICBsb2NhbGU6IGludGwubGFuZ3VhZ2UsXG4gICAgICBkZWZhdWx0TG9jYWxlOiBpbnRsLmRlZmF1bHRMYW5ndWFnZSxcbiAgICAgIG1lc3NhZ2VzOiBpbnRsLm1lc3NhZ2VzXG4gICAgfSwgX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChfaW50bENvbnRleHQuSW50bENvbnRleHRQcm92aWRlciwge1xuICAgICAgdmFsdWU6IGludGxcbiAgICB9LCBjaGlsZHJlbikpO1xuICB9O1xufTtcblxudmFyIF9kZWZhdWx0ID0gZnVuY3Rpb24gX2RlZmF1bHQoX3JlZiwgcGx1Z2luT3B0aW9ucykge1xuICB2YXIgZWxlbWVudCA9IF9yZWYuZWxlbWVudCxcbiAgICAgIHByb3BzID0gX3JlZi5wcm9wcztcblxuICBpZiAoIXByb3BzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHBhZ2VDb250ZXh0ID0gcHJvcHMucGFnZUNvbnRleHQsXG4gICAgICBsb2NhdGlvbiA9IHByb3BzLmxvY2F0aW9uO1xuICB2YXIgZGVmYXVsdExhbmd1YWdlID0gcGx1Z2luT3B0aW9ucy5kZWZhdWx0TGFuZ3VhZ2U7XG4gIHZhciBpbnRsID0gcGFnZUNvbnRleHQuaW50bDtcbiAgdmFyIGxhbmd1YWdlID0gaW50bC5sYW5ndWFnZSxcbiAgICAgIGxhbmd1YWdlcyA9IGludGwubGFuZ3VhZ2VzLFxuICAgICAgcmVkaXJlY3QgPSBpbnRsLnJlZGlyZWN0LFxuICAgICAgcm91dGVkID0gaW50bC5yb3V0ZWQsXG4gICAgICBvcmlnaW5hbFBhdGggPSBpbnRsLm9yaWdpbmFsUGF0aDtcblxuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHdpbmRvdy5fX19nYXRzYnlJbnRsID0gaW50bDtcbiAgfVxuICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlZiAqL1xuXG5cbiAgdmFyIGlzUmVkaXJlY3QgPSByZWRpcmVjdCAmJiAhcm91dGVkO1xuXG4gIGlmIChpc1JlZGlyZWN0KSB7XG4gICAgdmFyIHNlYXJjaCA9IGxvY2F0aW9uLnNlYXJjaDsgLy8gU2tpcCBidWlsZCwgQnJvd3NlcnMgb25seVxuXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHZhciBkZXRlY3RlZCA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImdhdHNieS1pbnRsLWxhbmd1YWdlXCIpIHx8ICgwLCBfYnJvd3NlckxhbmcuZGVmYXVsdCkoe1xuICAgICAgICBsYW5ndWFnZXM6IGxhbmd1YWdlcyxcbiAgICAgICAgZmFsbGJhY2s6IGxhbmd1YWdlXG4gICAgICB9KTtcblxuICAgICAgaWYgKCFsYW5ndWFnZXMuaW5jbHVkZXMoZGV0ZWN0ZWQpKSB7XG4gICAgICAgIGRldGVjdGVkID0gbGFuZ3VhZ2U7XG4gICAgICB9XG5cbiAgICAgIHZhciBxdWVyeVBhcmFtcyA9IHNlYXJjaCB8fCBcIlwiO1xuICAgICAgdmFyIG5ld1VybCA9ICgwLCBfZ2F0c2J5LndpdGhQcmVmaXgpKFwiL1wiICsgZGV0ZWN0ZWQgKyBvcmlnaW5hbFBhdGggKyBxdWVyeVBhcmFtcyk7XG4gICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJnYXRzYnktaW50bC1sYW5ndWFnZVwiLCBkZXRlY3RlZCk7XG4gICAgICB3aW5kb3cubG9jYXRpb24ucmVwbGFjZShuZXdVcmwpO1xuICAgIH1cbiAgfVxuXG4gIHZhciByZW5kZXJFbGVtZW50ID0gaXNSZWRpcmVjdCA/IEdBVFNCWV9JTlRMX1JFRElSRUNUX0NPTVBPTkVOVF9QQVRIICYmIF9yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQocHJlZmVyRGVmYXVsdChyZXF1aXJlKEdBVFNCWV9JTlRMX1JFRElSRUNUX0NPTVBPTkVOVF9QQVRIKSkpIDogZWxlbWVudDtcbiAgcmV0dXJuIHdpdGhJbnRsUHJvdmlkZXIoaW50bCkocmVuZGVyRWxlbWVudCk7XG59O1xuXG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///6604\n')},9499:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "BaseContext": function() { return /* binding */ BaseContext; },\n "Link": function() { return /* binding */ Link; },\n "Location": function() { return /* binding */ Location; },\n "LocationProvider": function() { return /* binding */ LocationProvider; },\n "Match": function() { return /* binding */ Match; },\n "Redirect": function() { return /* binding */ Redirect; },\n "Router": function() { return /* binding */ Router; },\n "ServerLocation": function() { return /* binding */ ServerLocation; },\n "createHistory": function() { return /* reexport */ createHistory; },\n "createMemorySource": function() { return /* reexport */ createMemorySource; },\n "globalHistory": function() { return /* reexport */ globalHistory; },\n "isRedirect": function() { return /* binding */ isRedirect; },\n "matchPath": function() { return /* reexport */ match; },\n "navigate": function() { return /* reexport */ history_navigate; },\n "redirectTo": function() { return /* binding */ redirectTo; },\n "useLocation": function() { return /* binding */ useLocation; },\n "useMatch": function() { return /* binding */ useMatch; },\n "useNavigate": function() { return /* binding */ useNavigate; },\n "useParams": function() { return /* binding */ useParams; }\n});\n\n// EXTERNAL MODULE: ./node_modules/react/index.js\nvar react = __webpack_require__(7294);\n// EXTERNAL MODULE: ./node_modules/invariant/browser.js\nvar browser = __webpack_require__(1143);\nvar browser_default = /*#__PURE__*/__webpack_require__.n(browser);\n// EXTERNAL MODULE: ./.cache/react-lifecycles-compat.js\nvar react_lifecycles_compat = __webpack_require__(3639);\n;// CONCATENATED MODULE: ./node_modules/@gatsbyjs/reach-router/es/lib/utils.js\n ////////////////////////////////////////////////////////////////////////////////\n// startsWith(string, search) - Check if `string` starts with `search`\n\nvar startsWith = function startsWith(string, search) {\n return string.substr(0, search.length) === search;\n}; ////////////////////////////////////////////////////////////////////////////////\n// pick(routes, uri)\n//\n// Ranks and picks the best route to match. Each segment gets the highest\n// amount of points, then the type of segment gets an additional amount of\n// points where\n//\n// static > dynamic > splat > root\n//\n// This way we don\'t have to worry about the order of our routes, let the\n// computers do it.\n//\n// A route looks like this\n//\n// { path, default, value }\n//\n// And a returned match looks like:\n//\n// { route, params, uri }\n//\n// I know, I should use TypeScript not comments for these types.\n\n\nvar pick = function pick(routes, uri) {\n var match = void 0;\n var default_ = void 0;\n\n var _uri$split = uri.split("?"),\n uriPathname = _uri$split[0];\n\n var uriSegments = segmentize(uriPathname);\n var isRootUri = uriSegments[0] === "";\n var ranked = rankRoutes(routes);\n\n for (var i = 0, l = ranked.length; i < l; i++) {\n var missed = false;\n var route = ranked[i].route;\n\n if (route.default) {\n default_ = {\n route: route,\n params: {},\n uri: uri\n };\n continue;\n }\n\n var routeSegments = segmentize(route.path);\n var params = {};\n var max = Math.max(uriSegments.length, routeSegments.length);\n var index = 0;\n\n for (; index < max; index++) {\n var routeSegment = routeSegments[index];\n var uriSegment = uriSegments[index];\n\n if (isSplat(routeSegment)) {\n // Hit a splat, just grab the rest, and return a match\n // uri: /files/documents/work\n // route: /files/*\n var param = routeSegment.slice(1) || "*";\n params[param] = uriSegments.slice(index).map(decodeURIComponent).join("/");\n break;\n }\n\n if (uriSegment === undefined) {\n // URI is shorter than the route, no match\n // uri: /users\n // route: /users/:userId\n missed = true;\n break;\n }\n\n var dynamicMatch = paramRe.exec(routeSegment);\n\n if (dynamicMatch && !isRootUri) {\n var matchIsNotReserved = reservedNames.indexOf(dynamicMatch[1]) === -1;\n !matchIsNotReserved ? false ? 0 : browser_default()(false) : void 0;\n var value = decodeURIComponent(uriSegment);\n params[dynamicMatch[1]] = value;\n } else if (routeSegment !== uriSegment) {\n // Current segments don\'t match, not dynamic, not splat, so no match\n // uri: /users/123/settings\n // route: /users/:id/profile\n missed = true;\n break;\n }\n }\n\n if (!missed) {\n match = {\n route: route,\n params: params,\n uri: "/" + uriSegments.slice(0, index).join("/")\n };\n break;\n }\n }\n\n return match || default_ || null;\n}; ////////////////////////////////////////////////////////////////////////////////\n// match(path, uri) - Matches just one path to a uri, also lol\n\n\nvar match = function match(path, uri) {\n return pick([{\n path: path\n }], uri);\n}; ////////////////////////////////////////////////////////////////////////////////\n// resolve(to, basepath)\n//\n// Resolves URIs as though every path is a directory, no files. Relative URIs\n// in the browser can feel awkward because not only can you be "in a directory"\n// you can be "at a file", too. For example\n//\n// browserSpecResolve(\'foo\', \'/bar/\') => /bar/foo\n// browserSpecResolve(\'foo\', \'/bar\') => /foo\n//\n// But on the command line of a file system, it\'s not as complicated, you can\'t\n// `cd` from a file, only directories. This way, links have to know less about\n// their current path. To go deeper you can do this:\n//\n// \n// // instead of\n// \n//\n// Just like `cd`, if you want to go deeper from the command line, you do this:\n//\n// cd deeper\n// # not\n// cd $(pwd)/deeper\n//\n// By treating every path as a directory, linking to relative paths should\n// require less contextual information and (fingers crossed) be more intuitive.\n\n\nvar resolve = function resolve(to, base) {\n // /foo/bar, /baz/qux => /foo/bar\n if (startsWith(to, "/")) {\n return to;\n }\n\n var _to$split = to.split("?"),\n toPathname = _to$split[0],\n toQuery = _to$split[1];\n\n var _base$split = base.split("?"),\n basePathname = _base$split[0];\n\n var toSegments = segmentize(toPathname);\n var baseSegments = segmentize(basePathname); // ?a=b, /users?b=c => /users?a=b\n\n if (toSegments[0] === "") {\n return addQuery(basePathname, toQuery);\n } // profile, /users/789 => /users/789/profile\n\n\n if (!startsWith(toSegments[0], ".")) {\n var pathname = baseSegments.concat(toSegments).join("/");\n return addQuery((basePathname === "/" ? "" : "/") + pathname, toQuery);\n } // ./ /users/123 => /users/123\n // ../ /users/123 => /users\n // ../.. /users/123 => /\n // ../../one /a/b/c/d => /a/b/one\n // .././one /a/b/c/d => /a/b/c/one\n\n\n var allSegments = baseSegments.concat(toSegments);\n var segments = [];\n\n for (var i = 0, l = allSegments.length; i < l; i++) {\n var segment = allSegments[i];\n if (segment === "..") segments.pop();else if (segment !== ".") segments.push(segment);\n }\n\n return addQuery("/" + segments.join("/"), toQuery);\n}; ////////////////////////////////////////////////////////////////////////////////\n// insertParams(path, params)\n\n\nvar insertParams = function insertParams(path, params) {\n var _path$split = path.split("?"),\n pathBase = _path$split[0],\n _path$split$ = _path$split[1],\n query = _path$split$ === undefined ? "" : _path$split$;\n\n var segments = segmentize(pathBase);\n var constructedPath = "/" + segments.map(function (segment) {\n var match = paramRe.exec(segment);\n return match ? params[match[1]] : segment;\n }).join("/");\n var _params$location = params.location;\n _params$location = _params$location === undefined ? {} : _params$location;\n var _params$location$sear = _params$location.search,\n search = _params$location$sear === undefined ? "" : _params$location$sear;\n var searchSplit = search.split("?")[1] || "";\n constructedPath = addQuery(constructedPath, query, searchSplit);\n return constructedPath;\n};\n\nvar validateRedirect = function validateRedirect(from, to) {\n var filter = function filter(segment) {\n return isDynamic(segment);\n };\n\n var fromString = segmentize(from).filter(filter).sort().join("/");\n var toString = segmentize(to).filter(filter).sort().join("/");\n return fromString === toString;\n}; ////////////////////////////////////////////////////////////////////////////////\n// Junk\n\n\nvar paramRe = /^:(.+)/;\nvar SEGMENT_POINTS = 4;\nvar STATIC_POINTS = 3;\nvar DYNAMIC_POINTS = 2;\nvar SPLAT_PENALTY = 1;\nvar ROOT_POINTS = 1;\n\nvar isRootSegment = function isRootSegment(segment) {\n return segment === "";\n};\n\nvar isDynamic = function isDynamic(segment) {\n return paramRe.test(segment);\n};\n\nvar isSplat = function isSplat(segment) {\n return segment && segment[0] === "*";\n};\n\nvar rankRoute = function rankRoute(route, index) {\n var score = route.default ? 0 : segmentize(route.path).reduce(function (score, segment) {\n score += SEGMENT_POINTS;\n if (isRootSegment(segment)) score += ROOT_POINTS;else if (isDynamic(segment)) score += DYNAMIC_POINTS;else if (isSplat(segment)) score -= SEGMENT_POINTS + SPLAT_PENALTY;else score += STATIC_POINTS;\n return score;\n }, 0);\n return {\n route: route,\n score: score,\n index: index\n };\n};\n\nvar rankRoutes = function rankRoutes(routes) {\n return routes.map(rankRoute).sort(function (a, b) {\n return a.score < b.score ? 1 : a.score > b.score ? -1 : a.index - b.index;\n });\n};\n\nvar segmentize = function segmentize(uri) {\n return uri // strip starting/ending slashes\n .replace(/(^\\/+|\\/+$)/g, "").split("/");\n};\n\nvar addQuery = function addQuery(pathname) {\n for (var _len = arguments.length, query = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n query[_key - 1] = arguments[_key];\n }\n\n query = query.filter(function (q) {\n return q && q.length > 0;\n });\n return pathname + (query && query.length > 0 ? "?" + query.join("&") : "");\n};\n\nvar reservedNames = ["uri", "path"];\n/**\n * Shallow compares two objects.\n * @param {Object} obj1 The first object to compare.\n * @param {Object} obj2 The second object to compare.\n */\n\nvar shallowCompare = function shallowCompare(obj1, obj2) {\n var obj1Keys = Object.keys(obj1);\n return obj1Keys.length === Object.keys(obj2).length && obj1Keys.every(function (key) {\n return obj2.hasOwnProperty(key) && obj1[key] === obj2[key];\n });\n}; ////////////////////////////////////////////////////////////////////////////////\n\n\n\n;// CONCATENATED MODULE: ./node_modules/@gatsbyjs/reach-router/es/lib/history.js\nvar _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\nvar getLocation = function getLocation(source) {\n var _source$location = source.location,\n search = _source$location.search,\n hash = _source$location.hash,\n href = _source$location.href,\n origin = _source$location.origin,\n protocol = _source$location.protocol,\n host = _source$location.host,\n hostname = _source$location.hostname,\n port = _source$location.port;\n var pathname = source.location.pathname;\n\n if (!pathname && href && canUseDOM) {\n var url = new URL(href);\n pathname = url.pathname;\n }\n\n return {\n pathname: encodeURI(decodeURI(pathname)),\n search: search,\n hash: hash,\n href: href,\n origin: origin,\n protocol: protocol,\n host: host,\n hostname: hostname,\n port: port,\n state: source.history.state,\n key: source.history.state && source.history.state.key || "initial"\n };\n};\n\nvar createHistory = function createHistory(source, options) {\n var listeners = [];\n var location = getLocation(source);\n var transitioning = false;\n\n var resolveTransition = function resolveTransition() {};\n\n return {\n get location() {\n return location;\n },\n\n get transitioning() {\n return transitioning;\n },\n\n _onTransitionComplete: function _onTransitionComplete() {\n transitioning = false;\n resolveTransition();\n },\n listen: function listen(listener) {\n listeners.push(listener);\n\n var popstateListener = function popstateListener() {\n location = getLocation(source);\n listener({\n location: location,\n action: "POP"\n });\n };\n\n source.addEventListener("popstate", popstateListener);\n return function () {\n source.removeEventListener("popstate", popstateListener);\n listeners = listeners.filter(function (fn) {\n return fn !== listener;\n });\n };\n },\n navigate: function navigate(to) {\n var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n state = _ref.state,\n _ref$replace = _ref.replace,\n replace = _ref$replace === undefined ? false : _ref$replace;\n\n if (typeof to === "number") {\n source.history.go(to);\n } else {\n state = _extends({}, state, {\n key: Date.now() + ""\n }); // try...catch iOS Safari limits to 100 pushState calls\n\n try {\n if (transitioning || replace) {\n source.history.replaceState(state, null, to);\n } else {\n source.history.pushState(state, null, to);\n }\n } catch (e) {\n source.location[replace ? "replace" : "assign"](to);\n }\n }\n\n location = getLocation(source);\n transitioning = true;\n var transition = new Promise(function (res) {\n return resolveTransition = res;\n });\n listeners.forEach(function (listener) {\n return listener({\n location: location,\n action: "PUSH"\n });\n });\n return transition;\n }\n };\n}; ////////////////////////////////////////////////////////////////////////////////\n// Stores history entries in memory for testing or other platforms like Native\n\n\nvar createMemorySource = function createMemorySource() {\n var initialPath = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "/";\n var searchIndex = initialPath.indexOf("?");\n var initialLocation = {\n pathname: searchIndex > -1 ? initialPath.substr(0, searchIndex) : initialPath,\n search: searchIndex > -1 ? initialPath.substr(searchIndex) : ""\n };\n var index = 0;\n var stack = [initialLocation];\n var states = [null];\n return {\n get location() {\n return stack[index];\n },\n\n addEventListener: function addEventListener(name, fn) {},\n removeEventListener: function removeEventListener(name, fn) {},\n history: {\n get entries() {\n return stack;\n },\n\n get index() {\n return index;\n },\n\n get state() {\n return states[index];\n },\n\n pushState: function pushState(state, _, uri) {\n var _uri$split = uri.split("?"),\n pathname = _uri$split[0],\n _uri$split$ = _uri$split[1],\n search = _uri$split$ === undefined ? "" : _uri$split$;\n\n index++;\n stack.push({\n pathname: pathname,\n search: search.length ? "?" + search : search\n });\n states.push(state);\n },\n replaceState: function replaceState(state, _, uri) {\n var _uri$split2 = uri.split("?"),\n pathname = _uri$split2[0],\n _uri$split2$ = _uri$split2[1],\n search = _uri$split2$ === undefined ? "" : _uri$split2$;\n\n stack[index] = {\n pathname: pathname,\n search: search\n };\n states[index] = state;\n },\n go: function go(to) {\n var newIndex = index + to;\n\n if (newIndex < 0 || newIndex > states.length - 1) {\n return;\n }\n\n index = newIndex;\n }\n }\n };\n}; ////////////////////////////////////////////////////////////////////////////////\n// global history - uses window.history as the source if available, otherwise a\n// memory history\n\n\nvar canUseDOM = !!(typeof window !== "undefined" && window.document && window.document.createElement);\n\nvar getSource = function getSource() {\n return canUseDOM ? window : createMemorySource();\n};\n\nvar globalHistory = createHistory(getSource());\nvar history_navigate = globalHistory.navigate; ////////////////////////////////////////////////////////////////////////////////\n\n\n;// CONCATENATED MODULE: ./node_modules/@gatsbyjs/reach-router/es/index.js\nvar es_extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\nfunction _objectWithoutProperties(obj, keys) {\n var target = {};\n\n for (var i in obj) {\n if (keys.indexOf(i) >= 0) continue;\n if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;\n target[i] = obj[i];\n }\n\n return target;\n}\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError("Cannot call a class as a function");\n }\n}\n\nfunction _possibleConstructorReturn(self, call) {\n if (!self) {\n throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called");\n }\n\n return call && (typeof call === "object" || typeof call === "function") ? call : self;\n}\n\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== "function" && superClass !== null) {\n throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n}\n/* eslint-disable jsx-a11y/anchor-has-content */\n\n\n\n\n\n\n ////////////////////////////////////////////////////////////////////////////////\n\nvar createNamedContext = function createNamedContext(name, defaultValue) {\n var Ctx = (0,react.createContext)(defaultValue);\n Ctx.displayName = name;\n return Ctx;\n}; ////////////////////////////////////////////////////////////////////////////////\n// Location Context/Provider\n\n\nvar LocationContext = createNamedContext("Location"); // sets up a listener if there isn\'t one already so apps don\'t need to be\n// wrapped in some top level provider\n\nvar Location = function Location(_ref) {\n var children = _ref.children;\n return react.createElement(LocationContext.Consumer, null, function (context) {\n return context ? children(context) : react.createElement(LocationProvider, null, children);\n });\n};\n\nvar LocationProvider = function (_React$Component) {\n _inherits(LocationProvider, _React$Component);\n\n function LocationProvider() {\n var _temp, _this, _ret;\n\n _classCallCheck(this, LocationProvider);\n\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return _ret = (_temp = (_this = _possibleConstructorReturn(this, _React$Component.call.apply(_React$Component, [this].concat(args))), _this), _this.state = {\n context: _this.getContext(),\n refs: {\n unlisten: null\n }\n }, _temp), _possibleConstructorReturn(_this, _ret);\n }\n\n LocationProvider.prototype.getContext = function getContext() {\n var _props$history = this.props.history,\n navigate = _props$history.navigate,\n location = _props$history.location;\n return {\n navigate: navigate,\n location: location\n };\n };\n\n LocationProvider.prototype.componentDidCatch = function componentDidCatch(error, info) {\n if (isRedirect(error)) {\n var _navigate = this.props.history.navigate;\n\n _navigate(error.uri, {\n replace: true\n });\n } else {\n throw error;\n }\n };\n\n LocationProvider.prototype.componentDidUpdate = function componentDidUpdate(prevProps, prevState) {\n if (prevState.context.location !== this.state.context.location) {\n this.props.history._onTransitionComplete();\n }\n };\n\n LocationProvider.prototype.componentDidMount = function componentDidMount() {\n var _this2 = this;\n\n var refs = this.state.refs,\n history = this.props.history;\n\n history._onTransitionComplete();\n\n refs.unlisten = history.listen(function () {\n Promise.resolve().then(function () {\n // TODO: replace rAF with react deferred update API when it\'s ready https://github.com/facebook/react/issues/13306\n requestAnimationFrame(function () {\n if (!_this2.unmounted) {\n _this2.setState(function () {\n return {\n context: _this2.getContext()\n };\n });\n }\n });\n });\n });\n };\n\n LocationProvider.prototype.componentWillUnmount = function componentWillUnmount() {\n var refs = this.state.refs;\n this.unmounted = true;\n refs.unlisten();\n };\n\n LocationProvider.prototype.render = function render() {\n var context = this.state.context,\n children = this.props.children;\n return react.createElement(LocationContext.Provider, {\n value: context\n }, typeof children === "function" ? children(context) : children || null);\n };\n\n return LocationProvider;\n}(react.Component); ////////////////////////////////////////////////////////////////////////////////\n\n\nLocationProvider.defaultProps = {\n history: globalHistory\n};\n false ? 0 : void 0;\n\nvar ServerLocation = function ServerLocation(_ref2) {\n var url = _ref2.url,\n children = _ref2.children;\n var searchIndex = url.indexOf("?");\n var searchExists = searchIndex > -1;\n var pathname = void 0;\n var search = "";\n var hash = "";\n\n if (searchExists) {\n pathname = url.substring(0, searchIndex);\n search = url.substring(searchIndex);\n } else {\n pathname = url;\n }\n\n return react.createElement(LocationContext.Provider, {\n value: {\n location: {\n pathname: pathname,\n search: search,\n hash: hash\n },\n navigate: function navigate() {\n throw new Error("You can\'t call navigate on the server.");\n }\n }\n }, children);\n}; ////////////////////////////////////////////////////////////////////////////////\n// Sets baseuri and basepath for nested routers and links\n\n\nvar BaseContext = createNamedContext("Base", {\n baseuri: "/",\n basepath: "/",\n navigate: globalHistory.navigate\n}); ////////////////////////////////////////////////////////////////////////////////\n// The main event, welcome to the show everybody.\n\nvar Router = function Router(props) {\n return react.createElement(BaseContext.Consumer, null, function (baseContext) {\n return react.createElement(Location, null, function (locationContext) {\n return react.createElement(RouterImpl, es_extends({}, baseContext, locationContext, props));\n });\n });\n};\n\nvar RouterImpl = function (_React$PureComponent) {\n _inherits(RouterImpl, _React$PureComponent);\n\n function RouterImpl() {\n _classCallCheck(this, RouterImpl);\n\n return _possibleConstructorReturn(this, _React$PureComponent.apply(this, arguments));\n }\n\n RouterImpl.prototype.render = function render() {\n var _props = this.props,\n location = _props.location,\n _navigate2 = _props.navigate,\n basepath = _props.basepath,\n primary = _props.primary,\n children = _props.children,\n baseuri = _props.baseuri,\n _props$component = _props.component,\n component = _props$component === undefined ? "div" : _props$component,\n domProps = _objectWithoutProperties(_props, ["location", "navigate", "basepath", "primary", "children", "baseuri", "component"]);\n\n var routes = react.Children.toArray(children).reduce(function (array, child) {\n var routes = createRoute(basepath)(child);\n return array.concat(routes);\n }, []);\n var pathname = location.pathname;\n var match = pick(routes, pathname);\n\n if (match) {\n var params = match.params,\n uri = match.uri,\n route = match.route,\n element = match.route.value; // remove the /* from the end for child routes relative paths\n\n basepath = route.default ? basepath : route.path.replace(/\\*$/, "");\n\n var props = es_extends({}, params, {\n uri: uri,\n location: location,\n navigate: function navigate(to, options) {\n return _navigate2(resolve(to, uri), options);\n }\n });\n\n var clone = react.cloneElement(element, props, element.props.children ? react.createElement(Router, {\n location: location,\n primary: primary\n }, element.props.children) : undefined); // using \'div\' for < 16.3 support\n\n var FocusWrapper = primary ? FocusHandler : component; // don\'t pass any props to \'div\'\n\n var wrapperProps = primary ? es_extends({\n uri: uri,\n location: location,\n component: component\n }, domProps) : domProps;\n return react.createElement(BaseContext.Provider, {\n value: {\n baseuri: uri,\n basepath: basepath,\n navigate: props.navigate\n }\n }, react.createElement(FocusWrapper, wrapperProps, clone));\n } else {\n // Not sure if we want this, would require index routes at every level\n // warning(\n // false,\n // `\\n\\nNothing matched:\\n\\t${\n // location.pathname\n // }\\n\\nPaths checked: \\n\\t${routes\n // .map(route => route.path)\n // .join(\n // "\\n\\t"\n // )}\\n\\nTo get rid of this warning, add a default NotFound component as child of Router:\n // \\n\\tlet NotFound = () =>
Not Found!
\n // \\n\\t\\n\\t \\n\\t {/* ... */}\\n\\t`\n // );\n return null;\n }\n };\n\n return RouterImpl;\n}(react.PureComponent);\n\nRouterImpl.defaultProps = {\n primary: true\n};\nvar FocusContext = createNamedContext("Focus");\n\nvar FocusHandler = function FocusHandler(_ref3) {\n var uri = _ref3.uri,\n location = _ref3.location,\n component = _ref3.component,\n domProps = _objectWithoutProperties(_ref3, ["uri", "location", "component"]);\n\n return react.createElement(FocusContext.Consumer, null, function (requestFocus) {\n return react.createElement(FocusHandlerImpl, es_extends({}, domProps, {\n component: component,\n requestFocus: requestFocus,\n uri: uri,\n location: location\n }));\n });\n}; // don\'t focus on initial render\n\n\nvar initialRender = true;\nvar focusHandlerCount = 0;\n\nvar FocusHandlerImpl = function (_React$Component2) {\n _inherits(FocusHandlerImpl, _React$Component2);\n\n function FocusHandlerImpl() {\n var _temp2, _this4, _ret2;\n\n _classCallCheck(this, FocusHandlerImpl);\n\n for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n return _ret2 = (_temp2 = (_this4 = _possibleConstructorReturn(this, _React$Component2.call.apply(_React$Component2, [this].concat(args))), _this4), _this4.state = {}, _this4.requestFocus = function (node) {\n if (!_this4.state.shouldFocus && node) {\n node.focus();\n }\n }, _temp2), _possibleConstructorReturn(_this4, _ret2);\n }\n\n FocusHandlerImpl.getDerivedStateFromProps = function getDerivedStateFromProps(nextProps, prevState) {\n var initial = prevState.uri == null;\n\n if (initial) {\n return es_extends({\n shouldFocus: true\n }, nextProps);\n } else {\n var myURIChanged = nextProps.uri !== prevState.uri;\n var navigatedUpToMe = prevState.location.pathname !== nextProps.location.pathname && nextProps.location.pathname === nextProps.uri;\n return es_extends({\n shouldFocus: myURIChanged || navigatedUpToMe\n }, nextProps);\n }\n };\n\n FocusHandlerImpl.prototype.componentDidMount = function componentDidMount() {\n focusHandlerCount++;\n this.focus();\n };\n\n FocusHandlerImpl.prototype.componentWillUnmount = function componentWillUnmount() {\n focusHandlerCount--;\n\n if (focusHandlerCount === 0) {\n initialRender = true;\n }\n };\n\n FocusHandlerImpl.prototype.componentDidUpdate = function componentDidUpdate(prevProps, prevState) {\n if (prevProps.location !== this.props.location && this.state.shouldFocus) {\n this.focus();\n }\n };\n\n FocusHandlerImpl.prototype.focus = function focus() {\n if (false) {}\n\n var requestFocus = this.props.requestFocus;\n\n if (requestFocus) {\n requestFocus(this.node);\n } else {\n if (initialRender) {\n initialRender = false;\n } else if (this.node) {\n // React polyfills [autofocus] and it fires earlier than cDM,\n // so we were stealing focus away, this line prevents that.\n if (!this.node.contains(document.activeElement)) {\n this.node.focus();\n }\n }\n }\n };\n\n FocusHandlerImpl.prototype.render = function render() {\n var _this5 = this;\n\n var _props2 = this.props,\n children = _props2.children,\n style = _props2.style,\n requestFocus = _props2.requestFocus,\n _props2$component = _props2.component,\n Comp = _props2$component === undefined ? "div" : _props2$component,\n uri = _props2.uri,\n location = _props2.location,\n domProps = _objectWithoutProperties(_props2, ["children", "style", "requestFocus", "component", "uri", "location"]);\n\n return react.createElement(Comp, es_extends({\n style: es_extends({\n outline: "none"\n }, style),\n tabIndex: "-1",\n ref: function ref(n) {\n return _this5.node = n;\n }\n }, domProps), react.createElement(FocusContext.Provider, {\n value: this.requestFocus\n }, this.props.children));\n };\n\n return FocusHandlerImpl;\n}(react.Component);\n\n(0,react_lifecycles_compat/* polyfill */.O)(FocusHandlerImpl);\n\nvar k = function k() {}; ////////////////////////////////////////////////////////////////////////////////\n\n\nvar forwardRef = react.forwardRef;\n\nif (typeof forwardRef === "undefined") {\n forwardRef = function forwardRef(C) {\n return C;\n };\n}\n\nvar Link = forwardRef(function (_ref4, ref) {\n var innerRef = _ref4.innerRef,\n props = _objectWithoutProperties(_ref4, ["innerRef"]);\n\n return react.createElement(BaseContext.Consumer, null, function (_ref5) {\n var basepath = _ref5.basepath,\n baseuri = _ref5.baseuri;\n return react.createElement(Location, null, function (_ref6) {\n var location = _ref6.location,\n navigate = _ref6.navigate;\n\n var to = props.to,\n state = props.state,\n replace = props.replace,\n _props$getProps = props.getProps,\n getProps = _props$getProps === undefined ? k : _props$getProps,\n anchorProps = _objectWithoutProperties(props, ["to", "state", "replace", "getProps"]);\n\n var href = resolve(to, baseuri);\n var encodedHref = encodeURI(href);\n var isCurrent = location.pathname === encodedHref;\n var isPartiallyCurrent = startsWith(location.pathname, encodedHref);\n return react.createElement("a", es_extends({\n ref: ref || innerRef,\n "aria-current": isCurrent ? "page" : undefined\n }, anchorProps, getProps({\n isCurrent: isCurrent,\n isPartiallyCurrent: isPartiallyCurrent,\n href: href,\n location: location\n }), {\n href: href,\n onClick: function onClick(event) {\n if (anchorProps.onClick) anchorProps.onClick(event);\n\n if (shouldNavigate(event)) {\n event.preventDefault();\n var shouldReplace = replace;\n\n if (typeof replace !== "boolean" && isCurrent) {\n var _location$state = es_extends({}, location.state),\n key = _location$state.key,\n restState = _objectWithoutProperties(_location$state, ["key"]);\n\n shouldReplace = shallowCompare(es_extends({}, state), restState);\n }\n\n navigate(href, {\n state: state,\n replace: shouldReplace\n });\n }\n }\n }));\n });\n });\n});\nLink.displayName = "Link";\n false ? 0 : void 0; ////////////////////////////////////////////////////////////////////////////////\n\nfunction RedirectRequest(uri) {\n this.uri = uri;\n}\n\nvar isRedirect = function isRedirect(o) {\n return o instanceof RedirectRequest;\n};\n\nvar redirectTo = function redirectTo(to) {\n throw new RedirectRequest(to);\n};\n\nvar RedirectImpl = function (_React$Component3) {\n _inherits(RedirectImpl, _React$Component3);\n\n function RedirectImpl() {\n _classCallCheck(this, RedirectImpl);\n\n return _possibleConstructorReturn(this, _React$Component3.apply(this, arguments));\n } // Support React < 16 with this hook\n\n\n RedirectImpl.prototype.componentDidMount = function componentDidMount() {\n var _props3 = this.props,\n navigate = _props3.navigate,\n to = _props3.to,\n from = _props3.from,\n _props3$replace = _props3.replace,\n replace = _props3$replace === undefined ? true : _props3$replace,\n state = _props3.state,\n noThrow = _props3.noThrow,\n baseuri = _props3.baseuri,\n props = _objectWithoutProperties(_props3, ["navigate", "to", "from", "replace", "state", "noThrow", "baseuri"]);\n\n Promise.resolve().then(function () {\n var resolvedTo = resolve(to, baseuri);\n navigate(insertParams(resolvedTo, props), {\n replace: replace,\n state: state\n });\n });\n };\n\n RedirectImpl.prototype.render = function render() {\n var _props4 = this.props,\n navigate = _props4.navigate,\n to = _props4.to,\n from = _props4.from,\n replace = _props4.replace,\n state = _props4.state,\n noThrow = _props4.noThrow,\n baseuri = _props4.baseuri,\n props = _objectWithoutProperties(_props4, ["navigate", "to", "from", "replace", "state", "noThrow", "baseuri"]);\n\n var resolvedTo = resolve(to, baseuri);\n if (!noThrow) redirectTo(insertParams(resolvedTo, props));\n return null;\n };\n\n return RedirectImpl;\n}(react.Component);\n\nvar Redirect = function Redirect(props) {\n return react.createElement(BaseContext.Consumer, null, function (_ref7) {\n var baseuri = _ref7.baseuri;\n return react.createElement(Location, null, function (locationContext) {\n return react.createElement(RedirectImpl, es_extends({}, locationContext, {\n baseuri: baseuri\n }, props));\n });\n });\n};\n\n false ? 0 : void 0; ////////////////////////////////////////////////////////////////////////////////\n\nvar Match = function Match(_ref8) {\n var path = _ref8.path,\n children = _ref8.children;\n return react.createElement(BaseContext.Consumer, null, function (_ref9) {\n var baseuri = _ref9.baseuri;\n return react.createElement(Location, null, function (_ref10) {\n var navigate = _ref10.navigate,\n location = _ref10.location;\n var resolvedPath = resolve(path, baseuri);\n var result = match(resolvedPath, location.pathname);\n return children({\n navigate: navigate,\n location: location,\n match: result ? es_extends({}, result.params, {\n uri: result.uri,\n path: path\n }) : null\n });\n });\n });\n}; ////////////////////////////////////////////////////////////////////////////////\n// Hooks\n\n\nvar useLocation = function useLocation() {\n var context = (0,react.useContext)(LocationContext);\n\n if (!context) {\n throw new Error("useLocation hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router");\n }\n\n return context.location;\n};\n\nvar useNavigate = function useNavigate() {\n var context = (0,react.useContext)(BaseContext);\n\n if (!context) {\n throw new Error("useNavigate hook was used but a BaseContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router");\n }\n\n return context.navigate;\n};\n\nvar useParams = function useParams() {\n var context = (0,react.useContext)(BaseContext);\n\n if (!context) {\n throw new Error("useParams hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router");\n }\n\n var location = useLocation();\n var results = match(context.basepath, location.pathname);\n return results ? results.params : null;\n};\n\nvar useMatch = function useMatch(path) {\n if (!path) {\n throw new Error("useMatch(path: string) requires an argument of a string to match against");\n }\n\n var context = (0,react.useContext)(BaseContext);\n\n if (!context) {\n throw new Error("useMatch hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router");\n }\n\n var location = useLocation();\n var resolvedPath = resolve(path, context.baseuri);\n var result = match(resolvedPath, location.pathname);\n return result ? es_extends({}, result.params, {\n uri: result.uri,\n path: path\n }) : null;\n}; ////////////////////////////////////////////////////////////////////////////////\n// Junk\n\n\nvar stripSlashes = function stripSlashes(str) {\n return str.replace(/(^\\/+|\\/+$)/g, "");\n};\n\nvar createRoute = function createRoute(basepath) {\n return function (element) {\n if (!element) {\n return null;\n }\n\n if (element.type === react.Fragment && element.props.children) {\n return react.Children.map(element.props.children, createRoute(basepath));\n }\n\n !(element.props.path || element.props.default || element.type === Redirect) ? false ? 0 : browser_default()(false) : void 0;\n !!(element.type === Redirect && (!element.props.from || !element.props.to)) ? false ? 0 : browser_default()(false) : void 0;\n !!(element.type === Redirect && !validateRedirect(element.props.from, element.props.to)) ? false ? 0 : browser_default()(false) : void 0;\n\n if (element.props.default) {\n return {\n value: element,\n default: true\n };\n }\n\n var elementPath = element.type === Redirect ? element.props.from : element.props.path;\n var path = elementPath === "/" ? basepath : stripSlashes(basepath) + "/" + stripSlashes(elementPath);\n return {\n value: element,\n default: element.props.default,\n path: element.props.children ? stripSlashes(path) + "/*" : path\n };\n };\n};\n\nvar shouldNavigate = function shouldNavigate(event) {\n return !event.defaultPrevented && event.button === 0 && !(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);\n}; ////////////////////////////////////////////////////////////////////////\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZ2F0c2J5anMvcmVhY2gtcm91dGVyL2VzL2xpYi91dGlscy5qcz8zNDNiIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BnYXRzYnlqcy9yZWFjaC1yb3V0ZXIvZXMvbGliL2hpc3RvcnkuanM/YmEyNCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZ2F0c2J5anMvcmVhY2gtcm91dGVyL2VzL2luZGV4LmpzPzc0MWUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFrQztBQUNsQzs7QUFFQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsb0NBQW9DLE9BQU87QUFDM0M7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsVUFBVSxhQUFhO0FBQ3ZCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsOEJBQThCLE1BQXFDLEdBQUcsQ0FBd0osR0FBRyxpQkFBUztBQUMxTztBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVB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RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx5QkFBeUIsY0FBYztBQUN2QyxhQUFhLGtCQUFrQjtBQUMvQjs7QUFFQSxrRkFBa0YsTUFBcUMsR0FBRyxDQUFnSyxHQUFHLGlCQUFTO0FBQ3RTLGtGQUFrRixNQUFxQyxHQUFHLENBQW1LLEdBQUcsaUJBQVM7QUFDelMscUNBQXFDLGdCQUFnQiwwQ0FBMEMsTUFBcUMsR0FBRyxDQUEwTCxHQUFHLGlCQUFTOztBQUU3VTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFIiwiZmlsZSI6Ijk0OTkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgaW52YXJpYW50IGZyb20gXCJpbnZhcmlhbnRcIjsgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIHN0YXJ0c1dpdGgoc3RyaW5nLCBzZWFyY2gpIC0gQ2hlY2sgaWYgYHN0cmluZ2Agc3RhcnRzIHdpdGggYHNlYXJjaGBcblxudmFyIHN0YXJ0c1dpdGggPSBmdW5jdGlvbiBzdGFydHNXaXRoKHN0cmluZywgc2VhcmNoKSB7XG4gIHJldHVybiBzdHJpbmcuc3Vic3RyKDAsIHNlYXJjaC5sZW5ndGgpID09PSBzZWFyY2g7XG59OyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gcGljayhyb3V0ZXMsIHVyaSlcbi8vXG4vLyBSYW5rcyBhbmQgcGlja3MgdGhlIGJlc3Qgcm91dGUgdG8gbWF0Y2guIEVhY2ggc2VnbWVudCBnZXRzIHRoZSBoaWdoZXN0XG4vLyBhbW91bnQgb2YgcG9pbnRzLCB0aGVuIHRoZSB0eXBlIG9mIHNlZ21lbnQgZ2V0cyBhbiBhZGRpdGlvbmFsIGFtb3VudCBvZlxuLy8gcG9pbnRzIHdoZXJlXG4vL1xuLy8gICAgIHN0YXRpYyA+IGR5bmFtaWMgPiBzcGxhdCA+IHJvb3Rcbi8vXG4vLyBUaGlzIHdheSB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHRoZSBvcmRlciBvZiBvdXIgcm91dGVzLCBsZXQgdGhlXG4vLyBjb21wdXRlcnMgZG8gaXQuXG4vL1xuLy8gQSByb3V0ZSBsb29rcyBsaWtlIHRoaXNcbi8vXG4vLyAgICAgeyBwYXRoLCBkZWZhdWx0LCB2YWx1ZSB9XG4vL1xuLy8gQW5kIGEgcmV0dXJuZWQgbWF0Y2ggbG9va3MgbGlrZTpcbi8vXG4vLyAgICAgeyByb3V0ZSwgcGFyYW1zLCB1cmkgfVxuLy9cbi8vIEkga25vdywgSSBzaG91bGQgdXNlIFR5cGVTY3JpcHQgbm90IGNvbW1lbnRzIGZvciB0aGVzZSB0eXBlcy5cblxuXG52YXIgcGljayA9IGZ1bmN0aW9uIHBpY2socm91dGVzLCB1cmkpIHtcbiAgdmFyIG1hdGNoID0gdm9pZCAwO1xuICB2YXIgZGVmYXVsdF8gPSB2b2lkIDA7XG5cbiAgdmFyIF91cmkkc3BsaXQgPSB1cmkuc3BsaXQoXCI/XCIpLFxuICAgICAgdXJpUGF0aG5hbWUgPSBfdXJpJHNwbGl0WzBdO1xuXG4gIHZhciB1cmlTZWdtZW50cyA9IHNlZ21lbnRpemUodXJpUGF0aG5hbWUpO1xuICB2YXIgaXNSb290VXJpID0gdXJpU2VnbWVudHNbMF0gPT09IFwiXCI7XG4gIHZhciByYW5rZWQgPSByYW5rUm91dGVzKHJvdXRlcyk7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGwgPSByYW5rZWQubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgdmFyIG1pc3NlZCA9IGZhbHNlO1xuICAgIHZhciByb3V0ZSA9IHJhbmtlZFtpXS5yb3V0ZTtcblxuICAgIGlmIChyb3V0ZS5kZWZhdWx0KSB7XG4gICAgICBkZWZhdWx0XyA9IHtcbiAgICAgICAgcm91dGU6IHJvdXRlLFxuICAgICAgICBwYXJhbXM6IHt9LFxuICAgICAgICB1cmk6IHVyaVxuICAgICAgfTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciByb3V0ZVNlZ21lbnRzID0gc2VnbWVudGl6ZShyb3V0ZS5wYXRoKTtcbiAgICB2YXIgcGFyYW1zID0ge307XG4gICAgdmFyIG1heCA9IE1hdGgubWF4KHVyaVNlZ21lbnRzLmxlbmd0aCwgcm91dGVTZWdtZW50cy5sZW5ndGgpO1xuICAgIHZhciBpbmRleCA9IDA7XG5cbiAgICBmb3IgKDsgaW5kZXggPCBtYXg7IGluZGV4KyspIHtcbiAgICAgIHZhciByb3V0ZVNlZ21lbnQgPSByb3V0ZVNlZ21lbnRzW2luZGV4XTtcbiAgICAgIHZhciB1cmlTZWdtZW50ID0gdXJpU2VnbWVudHNbaW5kZXhdO1xuXG4gICAgICBpZiAoaXNTcGxhdChyb3V0ZVNlZ21lbnQpKSB7XG4gICAgICAgIC8vIEhpdCBhIHNwbGF0LCBqdXN0IGdyYWIgdGhlIHJlc3QsIGFuZCByZXR1cm4gYSBtYXRjaFxuICAgICAgICAvLyB1cmk6ICAgL2ZpbGVzL2RvY3VtZW50cy93b3JrXG4gICAgICAgIC8vIHJvdXRlOiAvZmlsZXMvKlxuICAgICAgICB2YXIgcGFyYW0gPSByb3V0ZVNlZ21lbnQuc2xpY2UoMSkgfHwgXCIqXCI7XG4gICAgICAgIHBhcmFtc1twYXJhbV0gPSB1cmlTZWdtZW50cy5zbGljZShpbmRleCkubWFwKGRlY29kZVVSSUNvbXBvbmVudCkuam9pbihcIi9cIik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAodXJpU2VnbWVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIFVSSSBpcyBzaG9ydGVyIHRoYW4gdGhlIHJvdXRlLCBubyBtYXRjaFxuICAgICAgICAvLyB1cmk6ICAgL3VzZXJzXG4gICAgICAgIC8vIHJvdXRlOiAvdXNlcnMvOnVzZXJJZFxuICAgICAgICBtaXNzZWQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgdmFyIGR5bmFtaWNNYXRjaCA9IHBhcmFtUmUuZXhlYyhyb3V0ZVNlZ21lbnQpO1xuXG4gICAgICBpZiAoZHluYW1pY01hdGNoICYmICFpc1Jvb3RVcmkpIHtcbiAgICAgICAgdmFyIG1hdGNoSXNOb3RSZXNlcnZlZCA9IHJlc2VydmVkTmFtZXMuaW5kZXhPZihkeW5hbWljTWF0Y2hbMV0pID09PSAtMTtcbiAgICAgICAgIW1hdGNoSXNOb3RSZXNlcnZlZCA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgXCI8Um91dGVyPiBkeW5hbWljIHNlZ21lbnQgXFxcIlwiICsgZHluYW1pY01hdGNoWzFdICsgXCJcXFwiIGlzIGEgcmVzZXJ2ZWQgbmFtZS4gUGxlYXNlIHVzZSBhIGRpZmZlcmVudCBuYW1lIGluIHBhdGggXFxcIlwiICsgcm91dGUucGF0aCArIFwiXFxcIi5cIikgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICAgICAgICB2YXIgdmFsdWUgPSBkZWNvZGVVUklDb21wb25lbnQodXJpU2VnbWVudCk7XG4gICAgICAgIHBhcmFtc1tkeW5hbWljTWF0Y2hbMV1dID0gdmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKHJvdXRlU2VnbWVudCAhPT0gdXJpU2VnbWVudCkge1xuICAgICAgICAvLyBDdXJyZW50IHNlZ21lbnRzIGRvbid0IG1hdGNoLCBub3QgZHluYW1pYywgbm90IHNwbGF0LCBzbyBubyBtYXRjaFxuICAgICAgICAvLyB1cmk6ICAgL3VzZXJzLzEyMy9zZXR0aW5nc1xuICAgICAgICAvLyByb3V0ZTogL3VzZXJzLzppZC9wcm9maWxlXG4gICAgICAgIG1pc3NlZCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghbWlzc2VkKSB7XG4gICAgICBtYXRjaCA9IHtcbiAgICAgICAgcm91dGU6IHJvdXRlLFxuICAgICAgICBwYXJhbXM6IHBhcmFtcyxcbiAgICAgICAgdXJpOiBcIi9cIiArIHVyaVNlZ21lbnRzLnNsaWNlKDAsIGluZGV4KS5qb2luKFwiL1wiKVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtYXRjaCB8fCBkZWZhdWx0XyB8fCBudWxsO1xufTsgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIG1hdGNoKHBhdGgsIHVyaSkgLSBNYXRjaGVzIGp1c3Qgb25lIHBhdGggdG8gYSB1cmksIGFsc28gbG9sXG5cblxudmFyIG1hdGNoID0gZnVuY3Rpb24gbWF0Y2gocGF0aCwgdXJpKSB7XG4gIHJldHVybiBwaWNrKFt7XG4gICAgcGF0aDogcGF0aFxuICB9XSwgdXJpKTtcbn07IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyByZXNvbHZlKHRvLCBiYXNlcGF0aClcbi8vXG4vLyBSZXNvbHZlcyBVUklzIGFzIHRob3VnaCBldmVyeSBwYXRoIGlzIGEgZGlyZWN0b3J5LCBubyBmaWxlcy4gIFJlbGF0aXZlIFVSSXNcbi8vIGluIHRoZSBicm93c2VyIGNhbiBmZWVsIGF3a3dhcmQgYmVjYXVzZSBub3Qgb25seSBjYW4geW91IGJlIFwiaW4gYSBkaXJlY3RvcnlcIlxuLy8geW91IGNhbiBiZSBcImF0IGEgZmlsZVwiLCB0b28uIEZvciBleGFtcGxlXG4vL1xuLy8gICAgIGJyb3dzZXJTcGVjUmVzb2x2ZSgnZm9vJywgJy9iYXIvJykgPT4gL2Jhci9mb29cbi8vICAgICBicm93c2VyU3BlY1Jlc29sdmUoJ2ZvbycsICcvYmFyJykgPT4gL2Zvb1xuLy9cbi8vIEJ1dCBvbiB0aGUgY29tbWFuZCBsaW5lIG9mIGEgZmlsZSBzeXN0ZW0sIGl0J3Mgbm90IGFzIGNvbXBsaWNhdGVkLCB5b3UgY2FuJ3Rcbi8vIGBjZGAgZnJvbSBhIGZpbGUsIG9ubHkgZGlyZWN0b3JpZXMuICBUaGlzIHdheSwgbGlua3MgaGF2ZSB0byBrbm93IGxlc3MgYWJvdXRcbi8vIHRoZWlyIGN1cnJlbnQgcGF0aC4gVG8gZ28gZGVlcGVyIHlvdSBjYW4gZG8gdGhpczpcbi8vXG4vLyAgICAgPExpbmsgdG89XCJkZWVwZXJcIi8+XG4vLyAgICAgLy8gaW5zdGVhZCBvZlxuLy8gICAgIDxMaW5rIHRvPWB7JHtwcm9wcy51cml9L2RlZXBlcn1gLz5cbi8vXG4vLyBKdXN0IGxpa2UgYGNkYCwgaWYgeW91IHdhbnQgdG8gZ28gZGVlcGVyIGZyb20gdGhlIGNvbW1hbmQgbGluZSwgeW91IGRvIHRoaXM6XG4vL1xuLy8gICAgIGNkIGRlZXBlclxuLy8gICAgICMgbm90XG4vLyAgICAgY2QgJChwd2QpL2RlZXBlclxuLy9cbi8vIEJ5IHRyZWF0aW5nIGV2ZXJ5IHBhdGggYXMgYSBkaXJlY3RvcnksIGxpbmtpbmcgdG8gcmVsYXRpdmUgcGF0aHMgc2hvdWxkXG4vLyByZXF1aXJlIGxlc3MgY29udGV4dHVhbCBpbmZvcm1hdGlvbiBhbmQgKGZpbmdlcnMgY3Jvc3NlZCkgYmUgbW9yZSBpbnR1aXRpdmUuXG5cblxudmFyIHJlc29sdmUgPSBmdW5jdGlvbiByZXNvbHZlKHRvLCBiYXNlKSB7XG4gIC8vIC9mb28vYmFyLCAvYmF6L3F1eCA9PiAvZm9vL2JhclxuICBpZiAoc3RhcnRzV2l0aCh0bywgXCIvXCIpKSB7XG4gICAgcmV0dXJuIHRvO1xuICB9XG5cbiAgdmFyIF90byRzcGxpdCA9IHRvLnNwbGl0KFwiP1wiKSxcbiAgICAgIHRvUGF0aG5hbWUgPSBfdG8kc3BsaXRbMF0sXG4gICAgICB0b1F1ZXJ5ID0gX3RvJHNwbGl0WzFdO1xuXG4gIHZhciBfYmFzZSRzcGxpdCA9IGJhc2Uuc3BsaXQoXCI/XCIpLFxuICAgICAgYmFzZVBhdGhuYW1lID0gX2Jhc2Ukc3BsaXRbMF07XG5cbiAgdmFyIHRvU2VnbWVudHMgPSBzZWdtZW50aXplKHRvUGF0aG5hbWUpO1xuICB2YXIgYmFzZVNlZ21lbnRzID0gc2VnbWVudGl6ZShiYXNlUGF0aG5hbWUpOyAvLyA/YT1iLCAvdXNlcnM/Yj1jID0+IC91c2Vycz9hPWJcblxuICBpZiAodG9TZWdtZW50c1swXSA9PT0gXCJcIikge1xuICAgIHJldHVybiBhZGRRdWVyeShiYXNlUGF0aG5hbWUsIHRvUXVlcnkpO1xuICB9IC8vIHByb2ZpbGUsIC91c2Vycy83ODkgPT4gL3VzZXJzLzc4OS9wcm9maWxlXG5cblxuICBpZiAoIXN0YXJ0c1dpdGgodG9TZWdtZW50c1swXSwgXCIuXCIpKSB7XG4gICAgdmFyIHBhdGhuYW1lID0gYmFzZVNlZ21lbnRzLmNvbmNhdCh0b1NlZ21lbnRzKS5qb2luKFwiL1wiKTtcbiAgICByZXR1cm4gYWRkUXVlcnkoKGJhc2VQYXRobmFtZSA9PT0gXCIvXCIgPyBcIlwiIDogXCIvXCIpICsgcGF0aG5hbWUsIHRvUXVlcnkpO1xuICB9IC8vIC4vICAgICAgICAgL3VzZXJzLzEyMyAgPT4gIC91c2Vycy8xMjNcbiAgLy8gLi4vICAgICAgICAvdXNlcnMvMTIzICA9PiAgL3VzZXJzXG4gIC8vIC4uLy4uICAgICAgL3VzZXJzLzEyMyAgPT4gIC9cbiAgLy8gLi4vLi4vb25lICAvYS9iL2MvZCAgICA9PiAgL2EvYi9vbmVcbiAgLy8gLi4vLi9vbmUgICAvYS9iL2MvZCAgICA9PiAgL2EvYi9jL29uZVxuXG5cbiAgdmFyIGFsbFNlZ21lbnRzID0gYmFzZVNlZ21lbnRzLmNvbmNhdCh0b1NlZ21lbnRzKTtcbiAgdmFyIHNlZ21lbnRzID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBhbGxTZWdtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICB2YXIgc2VnbWVudCA9IGFsbFNlZ21lbnRzW2ldO1xuICAgIGlmIChzZWdtZW50ID09PSBcIi4uXCIpIHNlZ21lbnRzLnBvcCgpO2Vsc2UgaWYgKHNlZ21lbnQgIT09IFwiLlwiKSBzZWdtZW50cy5wdXNoKHNlZ21lbnQpO1xuICB9XG5cbiAgcmV0dXJuIGFkZFF1ZXJ5KFwiL1wiICsgc2VnbWVudHMuam9pbihcIi9cIiksIHRvUXVlcnkpO1xufTsgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIGluc2VydFBhcmFtcyhwYXRoLCBwYXJhbXMpXG5cblxudmFyIGluc2VydFBhcmFtcyA9IGZ1bmN0aW9uIGluc2VydFBhcmFtcyhwYXRoLCBwYXJhbXMpIHtcbiAgdmFyIF9wYXRoJHNwbGl0ID0gcGF0aC5zcGxpdChcIj9cIiksXG4gICAgICBwYXRoQmFzZSA9IF9wYXRoJHNwbGl0WzBdLFxuICAgICAgX3BhdGgkc3BsaXQkID0gX3BhdGgkc3BsaXRbMV0sXG4gICAgICBxdWVyeSA9IF9wYXRoJHNwbGl0JCA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IF9wYXRoJHNwbGl0JDtcblxuICB2YXIgc2VnbWVudHMgPSBzZWdtZW50aXplKHBhdGhCYXNlKTtcbiAgdmFyIGNvbnN0cnVjdGVkUGF0aCA9IFwiL1wiICsgc2VnbWVudHMubWFwKGZ1bmN0aW9uIChzZWdtZW50KSB7XG4gICAgdmFyIG1hdGNoID0gcGFyYW1SZS5leGVjKHNlZ21lbnQpO1xuICAgIHJldHVybiBtYXRjaCA/IHBhcmFtc1ttYXRjaFsxXV0gOiBzZWdtZW50O1xuICB9KS5qb2luKFwiL1wiKTtcbiAgdmFyIF9wYXJhbXMkbG9jYXRpb24gPSBwYXJhbXMubG9jYXRpb247XG4gIF9wYXJhbXMkbG9jYXRpb24gPSBfcGFyYW1zJGxvY2F0aW9uID09PSB1bmRlZmluZWQgPyB7fSA6IF9wYXJhbXMkbG9jYXRpb247XG4gIHZhciBfcGFyYW1zJGxvY2F0aW9uJHNlYXIgPSBfcGFyYW1zJGxvY2F0aW9uLnNlYXJjaCxcbiAgICAgIHNlYXJjaCA9IF9wYXJhbXMkbG9jYXRpb24kc2VhciA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IF9wYXJhbXMkbG9jYXRpb24kc2VhcjtcbiAgdmFyIHNlYXJjaFNwbGl0ID0gc2VhcmNoLnNwbGl0KFwiP1wiKVsxXSB8fCBcIlwiO1xuICBjb25zdHJ1Y3RlZFBhdGggPSBhZGRRdWVyeShjb25zdHJ1Y3RlZFBhdGgsIHF1ZXJ5LCBzZWFyY2hTcGxpdCk7XG4gIHJldHVybiBjb25zdHJ1Y3RlZFBhdGg7XG59O1xuXG52YXIgdmFsaWRhdGVSZWRpcmVjdCA9IGZ1bmN0aW9uIHZhbGlkYXRlUmVkaXJlY3QoZnJvbSwgdG8pIHtcbiAgdmFyIGZpbHRlciA9IGZ1bmN0aW9uIGZpbHRlcihzZWdtZW50KSB7XG4gICAgcmV0dXJuIGlzRHluYW1pYyhzZWdtZW50KTtcbiAgfTtcblxuICB2YXIgZnJvbVN0cmluZyA9IHNlZ21lbnRpemUoZnJvbSkuZmlsdGVyKGZpbHRlcikuc29ydCgpLmpvaW4oXCIvXCIpO1xuICB2YXIgdG9TdHJpbmcgPSBzZWdtZW50aXplKHRvKS5maWx0ZXIoZmlsdGVyKS5zb3J0KCkuam9pbihcIi9cIik7XG4gIHJldHVybiBmcm9tU3RyaW5nID09PSB0b1N0cmluZztcbn07IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBKdW5rXG5cblxudmFyIHBhcmFtUmUgPSAvXjooLispLztcbnZhciBTRUdNRU5UX1BPSU5UUyA9IDQ7XG52YXIgU1RBVElDX1BPSU5UUyA9IDM7XG52YXIgRFlOQU1JQ19QT0lOVFMgPSAyO1xudmFyIFNQTEFUX1BFTkFMVFkgPSAxO1xudmFyIFJPT1RfUE9JTlRTID0gMTtcblxudmFyIGlzUm9vdFNlZ21lbnQgPSBmdW5jdGlvbiBpc1Jvb3RTZWdtZW50KHNlZ21lbnQpIHtcbiAgcmV0dXJuIHNlZ21lbnQgPT09IFwiXCI7XG59O1xuXG52YXIgaXNEeW5hbWljID0gZnVuY3Rpb24gaXNEeW5hbWljKHNlZ21lbnQpIHtcbiAgcmV0dXJuIHBhcmFtUmUudGVzdChzZWdtZW50KTtcbn07XG5cbnZhciBpc1NwbGF0ID0gZnVuY3Rpb24gaXNTcGxhdChzZWdtZW50KSB7XG4gIHJldHVybiBzZWdtZW50ICYmIHNlZ21lbnRbMF0gPT09IFwiKlwiO1xufTtcblxudmFyIHJhbmtSb3V0ZSA9IGZ1bmN0aW9uIHJhbmtSb3V0ZShyb3V0ZSwgaW5kZXgpIHtcbiAgdmFyIHNjb3JlID0gcm91dGUuZGVmYXVsdCA/IDAgOiBzZWdtZW50aXplKHJvdXRlLnBhdGgpLnJlZHVjZShmdW5jdGlvbiAoc2NvcmUsIHNlZ21lbnQpIHtcbiAgICBzY29yZSArPSBTRUdNRU5UX1BPSU5UUztcbiAgICBpZiAoaXNSb290U2VnbWVudChzZWdtZW50KSkgc2NvcmUgKz0gUk9PVF9QT0lOVFM7ZWxzZSBpZiAoaXNEeW5hbWljKHNlZ21lbnQpKSBzY29yZSArPSBEWU5BTUlDX1BPSU5UUztlbHNlIGlmIChpc1NwbGF0KHNlZ21lbnQpKSBzY29yZSAtPSBTRUdNRU5UX1BPSU5UUyArIFNQTEFUX1BFTkFMVFk7ZWxzZSBzY29yZSArPSBTVEFUSUNfUE9JTlRTO1xuICAgIHJldHVybiBzY29yZTtcbiAgfSwgMCk7XG4gIHJldHVybiB7XG4gICAgcm91dGU6IHJvdXRlLFxuICAgIHNjb3JlOiBzY29yZSxcbiAgICBpbmRleDogaW5kZXhcbiAgfTtcbn07XG5cbnZhciByYW5rUm91dGVzID0gZnVuY3Rpb24gcmFua1JvdXRlcyhyb3V0ZXMpIHtcbiAgcmV0dXJuIHJvdXRlcy5tYXAocmFua1JvdXRlKS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGEuc2NvcmUgPCBiLnNjb3JlID8gMSA6IGEuc2NvcmUgPiBiLnNjb3JlID8gLTEgOiBhLmluZGV4IC0gYi5pbmRleDtcbiAgfSk7XG59O1xuXG52YXIgc2VnbWVudGl6ZSA9IGZ1bmN0aW9uIHNlZ21lbnRpemUodXJpKSB7XG4gIHJldHVybiB1cmkgLy8gc3RyaXAgc3RhcnRpbmcvZW5kaW5nIHNsYXNoZXNcbiAgLnJlcGxhY2UoLyheXFwvK3xcXC8rJCkvZywgXCJcIikuc3BsaXQoXCIvXCIpO1xufTtcblxudmFyIGFkZFF1ZXJ5ID0gZnVuY3Rpb24gYWRkUXVlcnkocGF0aG5hbWUpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHF1ZXJ5ID0gQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIHF1ZXJ5W19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHF1ZXJ5ID0gcXVlcnkuZmlsdGVyKGZ1bmN0aW9uIChxKSB7XG4gICAgcmV0dXJuIHEgJiYgcS5sZW5ndGggPiAwO1xuICB9KTtcbiAgcmV0dXJuIHBhdGhuYW1lICsgKHF1ZXJ5ICYmIHF1ZXJ5Lmxlbmd0aCA+IDAgPyBcIj9cIiArIHF1ZXJ5LmpvaW4oXCImXCIpIDogXCJcIik7XG59O1xuXG52YXIgcmVzZXJ2ZWROYW1lcyA9IFtcInVyaVwiLCBcInBhdGhcIl07XG4vKipcbiAqIFNoYWxsb3cgY29tcGFyZXMgdHdvIG9iamVjdHMuXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqMSBUaGUgZmlyc3Qgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqMiBUaGUgc2Vjb25kIG9iamVjdCB0byBjb21wYXJlLlxuICovXG5cbnZhciBzaGFsbG93Q29tcGFyZSA9IGZ1bmN0aW9uIHNoYWxsb3dDb21wYXJlKG9iajEsIG9iajIpIHtcbiAgdmFyIG9iajFLZXlzID0gT2JqZWN0LmtleXMob2JqMSk7XG4gIHJldHVybiBvYmoxS2V5cy5sZW5ndGggPT09IE9iamVjdC5rZXlzKG9iajIpLmxlbmd0aCAmJiBvYmoxS2V5cy5ldmVyeShmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIG9iajIuaGFzT3duUHJvcGVydHkoa2V5KSAmJiBvYmoxW2tleV0gPT09IG9iajJba2V5XTtcbiAgfSk7XG59OyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cbmV4cG9ydCB7IHN0YXJ0c1dpdGgsIHBpY2ssIG1hdGNoLCByZXNvbHZlLCBpbnNlcnRQYXJhbXMsIHZhbGlkYXRlUmVkaXJlY3QsIHNoYWxsb3dDb21wYXJlIH07IiwidmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcblxuICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn07XG5cbnZhciBnZXRMb2NhdGlvbiA9IGZ1bmN0aW9uIGdldExvY2F0aW9uKHNvdXJjZSkge1xuICB2YXIgX3NvdXJjZSRsb2NhdGlvbiA9IHNvdXJjZS5sb2NhdGlvbixcbiAgICAgIHNlYXJjaCA9IF9zb3VyY2UkbG9jYXRpb24uc2VhcmNoLFxuICAgICAgaGFzaCA9IF9zb3VyY2UkbG9jYXRpb24uaGFzaCxcbiAgICAgIGhyZWYgPSBfc291cmNlJGxvY2F0aW9uLmhyZWYsXG4gICAgICBvcmlnaW4gPSBfc291cmNlJGxvY2F0aW9uLm9yaWdpbixcbiAgICAgIHByb3RvY29sID0gX3NvdXJjZSRsb2NhdGlvbi5wcm90b2NvbCxcbiAgICAgIGhvc3QgPSBfc291cmNlJGxvY2F0aW9uLmhvc3QsXG4gICAgICBob3N0bmFtZSA9IF9zb3VyY2UkbG9jYXRpb24uaG9zdG5hbWUsXG4gICAgICBwb3J0ID0gX3NvdXJjZSRsb2NhdGlvbi5wb3J0O1xuICB2YXIgcGF0aG5hbWUgPSBzb3VyY2UubG9jYXRpb24ucGF0aG5hbWU7XG5cbiAgaWYgKCFwYXRobmFtZSAmJiBocmVmICYmIGNhblVzZURPTSkge1xuICAgIHZhciB1cmwgPSBuZXcgVVJMKGhyZWYpO1xuICAgIHBhdGhuYW1lID0gdXJsLnBhdGhuYW1lO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwYXRobmFtZTogZW5jb2RlVVJJKGRlY29kZVVSSShwYXRobmFtZSkpLFxuICAgIHNlYXJjaDogc2VhcmNoLFxuICAgIGhhc2g6IGhhc2gsXG4gICAgaHJlZjogaHJlZixcbiAgICBvcmlnaW46IG9yaWdpbixcbiAgICBwcm90b2NvbDogcHJvdG9jb2wsXG4gICAgaG9zdDogaG9zdCxcbiAgICBob3N0bmFtZTogaG9zdG5hbWUsXG4gICAgcG9ydDogcG9ydCxcbiAgICBzdGF0ZTogc291cmNlLmhpc3Rvcnkuc3RhdGUsXG4gICAga2V5OiBzb3VyY2UuaGlzdG9yeS5zdGF0ZSAmJiBzb3VyY2UuaGlzdG9yeS5zdGF0ZS5rZXkgfHwgXCJpbml0aWFsXCJcbiAgfTtcbn07XG5cbnZhciBjcmVhdGVIaXN0b3J5ID0gZnVuY3Rpb24gY3JlYXRlSGlzdG9yeShzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGxpc3RlbmVycyA9IFtdO1xuICB2YXIgbG9jYXRpb24gPSBnZXRMb2NhdGlvbihzb3VyY2UpO1xuICB2YXIgdHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuXG4gIHZhciByZXNvbHZlVHJhbnNpdGlvbiA9IGZ1bmN0aW9uIHJlc29sdmVUcmFuc2l0aW9uKCkge307XG5cbiAgcmV0dXJuIHtcbiAgICBnZXQgbG9jYXRpb24oKSB7XG4gICAgICByZXR1cm4gbG9jYXRpb247XG4gICAgfSxcblxuICAgIGdldCB0cmFuc2l0aW9uaW5nKCkge1xuICAgICAgcmV0dXJuIHRyYW5zaXRpb25pbmc7XG4gICAgfSxcblxuICAgIF9vblRyYW5zaXRpb25Db21wbGV0ZTogZnVuY3Rpb24gX29uVHJhbnNpdGlvbkNvbXBsZXRlKCkge1xuICAgICAgdHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICAgICAgcmVzb2x2ZVRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIGxpc3RlbjogZnVuY3Rpb24gbGlzdGVuKGxpc3RlbmVyKSB7XG4gICAgICBsaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG5cbiAgICAgIHZhciBwb3BzdGF0ZUxpc3RlbmVyID0gZnVuY3Rpb24gcG9wc3RhdGVMaXN0ZW5lcigpIHtcbiAgICAgICAgbG9jYXRpb24gPSBnZXRMb2NhdGlvbihzb3VyY2UpO1xuICAgICAgICBsaXN0ZW5lcih7XG4gICAgICAgICAgbG9jYXRpb246IGxvY2F0aW9uLFxuICAgICAgICAgIGFjdGlvbjogXCJQT1BcIlxuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIHNvdXJjZS5hZGRFdmVudExpc3RlbmVyKFwicG9wc3RhdGVcIiwgcG9wc3RhdGVMaXN0ZW5lcik7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICBzb3VyY2UucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvcHN0YXRlXCIsIHBvcHN0YXRlTGlzdGVuZXIpO1xuICAgICAgICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuZmlsdGVyKGZ1bmN0aW9uIChmbikge1xuICAgICAgICAgIHJldHVybiBmbiAhPT0gbGlzdGVuZXI7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9LFxuICAgIG5hdmlnYXRlOiBmdW5jdGlvbiBuYXZpZ2F0ZSh0bykge1xuICAgICAgdmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9LFxuICAgICAgICAgIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgICAgICBfcmVmJHJlcGxhY2UgPSBfcmVmLnJlcGxhY2UsXG4gICAgICAgICAgcmVwbGFjZSA9IF9yZWYkcmVwbGFjZSA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBfcmVmJHJlcGxhY2U7XG5cbiAgICAgIGlmICh0eXBlb2YgdG8gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgc291cmNlLmhpc3RvcnkuZ28odG8pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUgPSBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgICBrZXk6IERhdGUubm93KCkgKyBcIlwiXG4gICAgICAgIH0pOyAvLyB0cnkuLi5jYXRjaCBpT1MgU2FmYXJpIGxpbWl0cyB0byAxMDAgcHVzaFN0YXRlIGNhbGxzXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAodHJhbnNpdGlvbmluZyB8fCByZXBsYWNlKSB7XG4gICAgICAgICAgICBzb3VyY2UuaGlzdG9yeS5yZXBsYWNlU3RhdGUoc3RhdGUsIG51bGwsIHRvKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc291cmNlLmhpc3RvcnkucHVzaFN0YXRlKHN0YXRlLCBudWxsLCB0byk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgc291cmNlLmxvY2F0aW9uW3JlcGxhY2UgPyBcInJlcGxhY2VcIiA6IFwiYXNzaWduXCJdKHRvKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsb2NhdGlvbiA9IGdldExvY2F0aW9uKHNvdXJjZSk7XG4gICAgICB0cmFuc2l0aW9uaW5nID0gdHJ1ZTtcbiAgICAgIHZhciB0cmFuc2l0aW9uID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlcykge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZVRyYW5zaXRpb24gPSByZXM7XG4gICAgICB9KTtcbiAgICAgIGxpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICByZXR1cm4gbGlzdGVuZXIoe1xuICAgICAgICAgIGxvY2F0aW9uOiBsb2NhdGlvbixcbiAgICAgICAgICBhY3Rpb246IFwiUFVTSFwiXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gdHJhbnNpdGlvbjtcbiAgICB9XG4gIH07XG59OyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gU3RvcmVzIGhpc3RvcnkgZW50cmllcyBpbiBtZW1vcnkgZm9yIHRlc3Rpbmcgb3Igb3RoZXIgcGxhdGZvcm1zIGxpa2UgTmF0aXZlXG5cblxudmFyIGNyZWF0ZU1lbW9yeVNvdXJjZSA9IGZ1bmN0aW9uIGNyZWF0ZU1lbW9yeVNvdXJjZSgpIHtcbiAgdmFyIGluaXRpYWxQYXRoID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBcIi9cIjtcbiAgdmFyIHNlYXJjaEluZGV4ID0gaW5pdGlhbFBhdGguaW5kZXhPZihcIj9cIik7XG4gIHZhciBpbml0aWFsTG9jYXRpb24gPSB7XG4gICAgcGF0aG5hbWU6IHNlYXJjaEluZGV4ID4gLTEgPyBpbml0aWFsUGF0aC5zdWJzdHIoMCwgc2VhcmNoSW5kZXgpIDogaW5pdGlhbFBhdGgsXG4gICAgc2VhcmNoOiBzZWFyY2hJbmRleCA+IC0xID8gaW5pdGlhbFBhdGguc3Vic3RyKHNlYXJjaEluZGV4KSA6IFwiXCJcbiAgfTtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIHN0YWNrID0gW2luaXRpYWxMb2NhdGlvbl07XG4gIHZhciBzdGF0ZXMgPSBbbnVsbF07XG4gIHJldHVybiB7XG4gICAgZ2V0IGxvY2F0aW9uKCkge1xuICAgICAgcmV0dXJuIHN0YWNrW2luZGV4XTtcbiAgICB9LFxuXG4gICAgYWRkRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcihuYW1lLCBmbikge30sXG4gICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCBmbikge30sXG4gICAgaGlzdG9yeToge1xuICAgICAgZ2V0IGVudHJpZXMoKSB7XG4gICAgICAgIHJldHVybiBzdGFjaztcbiAgICAgIH0sXG5cbiAgICAgIGdldCBpbmRleCgpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgfSxcblxuICAgICAgZ2V0IHN0YXRlKCkge1xuICAgICAgICByZXR1cm4gc3RhdGVzW2luZGV4XTtcbiAgICAgIH0sXG5cbiAgICAgIHB1c2hTdGF0ZTogZnVuY3Rpb24gcHVzaFN0YXRlKHN0YXRlLCBfLCB1cmkpIHtcbiAgICAgICAgdmFyIF91cmkkc3BsaXQgPSB1cmkuc3BsaXQoXCI/XCIpLFxuICAgICAgICAgICAgcGF0aG5hbWUgPSBfdXJpJHNwbGl0WzBdLFxuICAgICAgICAgICAgX3VyaSRzcGxpdCQgPSBfdXJpJHNwbGl0WzFdLFxuICAgICAgICAgICAgc2VhcmNoID0gX3VyaSRzcGxpdCQgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBfdXJpJHNwbGl0JDtcblxuICAgICAgICBpbmRleCsrO1xuICAgICAgICBzdGFjay5wdXNoKHtcbiAgICAgICAgICBwYXRobmFtZTogcGF0aG5hbWUsXG4gICAgICAgICAgc2VhcmNoOiBzZWFyY2gubGVuZ3RoID8gXCI/XCIgKyBzZWFyY2ggOiBzZWFyY2hcbiAgICAgICAgfSk7XG4gICAgICAgIHN0YXRlcy5wdXNoKHN0YXRlKTtcbiAgICAgIH0sXG4gICAgICByZXBsYWNlU3RhdGU6IGZ1bmN0aW9uIHJlcGxhY2VTdGF0ZShzdGF0ZSwgXywgdXJpKSB7XG4gICAgICAgIHZhciBfdXJpJHNwbGl0MiA9IHVyaS5zcGxpdChcIj9cIiksXG4gICAgICAgICAgICBwYXRobmFtZSA9IF91cmkkc3BsaXQyWzBdLFxuICAgICAgICAgICAgX3VyaSRzcGxpdDIkID0gX3VyaSRzcGxpdDJbMV0sXG4gICAgICAgICAgICBzZWFyY2ggPSBfdXJpJHNwbGl0MiQgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBfdXJpJHNwbGl0MiQ7XG5cbiAgICAgICAgc3RhY2tbaW5kZXhdID0ge1xuICAgICAgICAgIHBhdGhuYW1lOiBwYXRobmFtZSxcbiAgICAgICAgICBzZWFyY2g6IHNlYXJjaFxuICAgICAgICB9O1xuICAgICAgICBzdGF0ZXNbaW5kZXhdID0gc3RhdGU7XG4gICAgICB9LFxuICAgICAgZ286IGZ1bmN0aW9uIGdvKHRvKSB7XG4gICAgICAgIHZhciBuZXdJbmRleCA9IGluZGV4ICsgdG87XG5cbiAgICAgICAgaWYgKG5ld0luZGV4IDwgMCB8fCBuZXdJbmRleCA+IHN0YXRlcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5kZXggPSBuZXdJbmRleDtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59OyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gZ2xvYmFsIGhpc3RvcnkgLSB1c2VzIHdpbmRvdy5oaXN0b3J5IGFzIHRoZSBzb3VyY2UgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgYVxuLy8gbWVtb3J5IGhpc3RvcnlcblxuXG52YXIgY2FuVXNlRE9NID0gISEodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB3aW5kb3cuZG9jdW1lbnQgJiYgd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xuXG52YXIgZ2V0U291cmNlID0gZnVuY3Rpb24gZ2V0U291cmNlKCkge1xuICByZXR1cm4gY2FuVXNlRE9NID8gd2luZG93IDogY3JlYXRlTWVtb3J5U291cmNlKCk7XG59O1xuXG52YXIgZ2xvYmFsSGlzdG9yeSA9IGNyZWF0ZUhpc3RvcnkoZ2V0U291cmNlKCkpO1xudmFyIG5hdmlnYXRlID0gZ2xvYmFsSGlzdG9yeS5uYXZpZ2F0ZTsgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuZXhwb3J0IHsgZ2xvYmFsSGlzdG9yeSwgbmF2aWdhdGUsIGNyZWF0ZUhpc3RvcnksIGNyZWF0ZU1lbW9yeVNvdXJjZSB9OyIsInZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59O1xuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMob2JqLCBrZXlzKSB7XG4gIHZhciB0YXJnZXQgPSB7fTtcblxuICBmb3IgKHZhciBpIGluIG9iaikge1xuICAgIGlmIChrZXlzLmluZGV4T2YoaSkgPj0gMCkgY29udGludWU7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBpKSkgY29udGludWU7XG4gICAgdGFyZ2V0W2ldID0gb2JqW2ldO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkge1xuICBpZiAoIXNlbGYpIHtcbiAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7XG4gIH1cblxuICByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjtcbn1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTtcbiAgfVxuXG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogc3ViQ2xhc3MsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfVxuICB9KTtcbiAgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzO1xufVxuLyogZXNsaW50LWRpc2FibGUganN4LWExMXkvYW5jaG9yLWhhcy1jb250ZW50ICovXG5cblxuaW1wb3J0IFJlYWN0LCB7IHVzZUNvbnRleHQsIGNyZWF0ZUNvbnRleHQgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBpbnZhcmlhbnQgZnJvbSBcImludmFyaWFudFwiO1xuaW1wb3J0IHsgcG9seWZpbGwgfSBmcm9tIFwicmVhY3QtbGlmZWN5Y2xlcy1jb21wYXRcIjtcbmltcG9ydCB7IHN0YXJ0c1dpdGgsIHBpY2ssIHJlc29sdmUsIG1hdGNoLCBpbnNlcnRQYXJhbXMsIHZhbGlkYXRlUmVkaXJlY3QsIHNoYWxsb3dDb21wYXJlIH0gZnJvbSBcIi4vbGliL3V0aWxzXCI7XG5pbXBvcnQgeyBnbG9iYWxIaXN0b3J5LCBuYXZpZ2F0ZSwgY3JlYXRlSGlzdG9yeSwgY3JlYXRlTWVtb3J5U291cmNlIH0gZnJvbSBcIi4vbGliL2hpc3RvcnlcIjsgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxudmFyIGNyZWF0ZU5hbWVkQ29udGV4dCA9IGZ1bmN0aW9uIGNyZWF0ZU5hbWVkQ29udGV4dChuYW1lLCBkZWZhdWx0VmFsdWUpIHtcbiAgdmFyIEN0eCA9IGNyZWF0ZUNvbnRleHQoZGVmYXVsdFZhbHVlKTtcbiAgQ3R4LmRpc3BsYXlOYW1lID0gbmFtZTtcbiAgcmV0dXJuIEN0eDtcbn07IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBMb2NhdGlvbiBDb250ZXh0L1Byb3ZpZGVyXG5cblxudmFyIExvY2F0aW9uQ29udGV4dCA9IGNyZWF0ZU5hbWVkQ29udGV4dChcIkxvY2F0aW9uXCIpOyAvLyBzZXRzIHVwIGEgbGlzdGVuZXIgaWYgdGhlcmUgaXNuJ3Qgb25lIGFscmVhZHkgc28gYXBwcyBkb24ndCBuZWVkIHRvIGJlXG4vLyB3cmFwcGVkIGluIHNvbWUgdG9wIGxldmVsIHByb3ZpZGVyXG5cbnZhciBMb2NhdGlvbiA9IGZ1bmN0aW9uIExvY2F0aW9uKF9yZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbjtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoTG9jYXRpb25Db250ZXh0LkNvbnN1bWVyLCBudWxsLCBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgIHJldHVybiBjb250ZXh0ID8gY2hpbGRyZW4oY29udGV4dCkgOiBSZWFjdC5jcmVhdGVFbGVtZW50KExvY2F0aW9uUHJvdmlkZXIsIG51bGwsIGNoaWxkcmVuKTtcbiAgfSk7XG59O1xuXG52YXIgTG9jYXRpb25Qcm92aWRlciA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhMb2NhdGlvblByb3ZpZGVyLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBMb2NhdGlvblByb3ZpZGVyKCkge1xuICAgIHZhciBfdGVtcCwgX3RoaXMsIF9yZXQ7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTG9jYXRpb25Qcm92aWRlcik7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3JldCA9IChfdGVtcCA9IChfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuY2FsbC5hcHBseShfUmVhY3QkQ29tcG9uZW50LCBbdGhpc10uY29uY2F0KGFyZ3MpKSksIF90aGlzKSwgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBjb250ZXh0OiBfdGhpcy5nZXRDb250ZXh0KCksXG4gICAgICByZWZzOiB7XG4gICAgICAgIHVubGlzdGVuOiBudWxsXG4gICAgICB9XG4gICAgfSwgX3RlbXApLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihfdGhpcywgX3JldCk7XG4gIH1cblxuICBMb2NhdGlvblByb3ZpZGVyLnByb3RvdHlwZS5nZXRDb250ZXh0ID0gZnVuY3Rpb24gZ2V0Q29udGV4dCgpIHtcbiAgICB2YXIgX3Byb3BzJGhpc3RvcnkgPSB0aGlzLnByb3BzLmhpc3RvcnksXG4gICAgICAgIG5hdmlnYXRlID0gX3Byb3BzJGhpc3RvcnkubmF2aWdhdGUsXG4gICAgICAgIGxvY2F0aW9uID0gX3Byb3BzJGhpc3RvcnkubG9jYXRpb247XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hdmlnYXRlOiBuYXZpZ2F0ZSxcbiAgICAgIGxvY2F0aW9uOiBsb2NhdGlvblxuICAgIH07XG4gIH07XG5cbiAgTG9jYXRpb25Qcm92aWRlci5wcm90b3R5cGUuY29tcG9uZW50RGlkQ2F0Y2ggPSBmdW5jdGlvbiBjb21wb25lbnREaWRDYXRjaChlcnJvciwgaW5mbykge1xuICAgIGlmIChpc1JlZGlyZWN0KGVycm9yKSkge1xuICAgICAgdmFyIF9uYXZpZ2F0ZSA9IHRoaXMucHJvcHMuaGlzdG9yeS5uYXZpZ2F0ZTtcblxuICAgICAgX25hdmlnYXRlKGVycm9yLnVyaSwge1xuICAgICAgICByZXBsYWNlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9O1xuXG4gIExvY2F0aW9uUHJvdmlkZXIucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSkge1xuICAgIGlmIChwcmV2U3RhdGUuY29udGV4dC5sb2NhdGlvbiAhPT0gdGhpcy5zdGF0ZS5jb250ZXh0LmxvY2F0aW9uKSB7XG4gICAgICB0aGlzLnByb3BzLmhpc3RvcnkuX29uVHJhbnNpdGlvbkNvbXBsZXRlKCk7XG4gICAgfVxuICB9O1xuXG4gIExvY2F0aW9uUHJvdmlkZXIucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICB2YXIgcmVmcyA9IHRoaXMuc3RhdGUucmVmcyxcbiAgICAgICAgaGlzdG9yeSA9IHRoaXMucHJvcHMuaGlzdG9yeTtcblxuICAgIGhpc3RvcnkuX29uVHJhbnNpdGlvbkNvbXBsZXRlKCk7XG5cbiAgICByZWZzLnVubGlzdGVuID0gaGlzdG9yeS5saXN0ZW4oZnVuY3Rpb24gKCkge1xuICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIFRPRE86IHJlcGxhY2UgckFGIHdpdGggcmVhY3QgZGVmZXJyZWQgdXBkYXRlIEFQSSB3aGVuIGl0J3MgcmVhZHkgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMzMwNlxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICghX3RoaXMyLnVubW91bnRlZCkge1xuICAgICAgICAgICAgX3RoaXMyLnNldFN0YXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBfdGhpczIuZ2V0Q29udGV4dCgpXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgTG9jYXRpb25Qcm92aWRlci5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICB2YXIgcmVmcyA9IHRoaXMuc3RhdGUucmVmcztcbiAgICB0aGlzLnVubW91bnRlZCA9IHRydWU7XG4gICAgcmVmcy51bmxpc3RlbigpO1xuICB9O1xuXG4gIExvY2F0aW9uUHJvdmlkZXIucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgY29udGV4dCA9IHRoaXMuc3RhdGUuY29udGV4dCxcbiAgICAgICAgY2hpbGRyZW4gPSB0aGlzLnByb3BzLmNoaWxkcmVuO1xuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KExvY2F0aW9uQ29udGV4dC5Qcm92aWRlciwge1xuICAgICAgdmFsdWU6IGNvbnRleHRcbiAgICB9LCB0eXBlb2YgY2hpbGRyZW4gPT09IFwiZnVuY3Rpb25cIiA/IGNoaWxkcmVuKGNvbnRleHQpIDogY2hpbGRyZW4gfHwgbnVsbCk7XG4gIH07XG5cbiAgcmV0dXJuIExvY2F0aW9uUHJvdmlkZXI7XG59KFJlYWN0LkNvbXBvbmVudCk7IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblxuTG9jYXRpb25Qcm92aWRlci5kZWZhdWx0UHJvcHMgPSB7XG4gIGhpc3Rvcnk6IGdsb2JhbEhpc3Rvcnlcbn07XG5wcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB2b2lkIDAgOiB2b2lkIDA7XG5cbnZhciBTZXJ2ZXJMb2NhdGlvbiA9IGZ1bmN0aW9uIFNlcnZlckxvY2F0aW9uKF9yZWYyKSB7XG4gIHZhciB1cmwgPSBfcmVmMi51cmwsXG4gICAgICBjaGlsZHJlbiA9IF9yZWYyLmNoaWxkcmVuO1xuICB2YXIgc2VhcmNoSW5kZXggPSB1cmwuaW5kZXhPZihcIj9cIik7XG4gIHZhciBzZWFyY2hFeGlzdHMgPSBzZWFyY2hJbmRleCA+IC0xO1xuICB2YXIgcGF0aG5hbWUgPSB2b2lkIDA7XG4gIHZhciBzZWFyY2ggPSBcIlwiO1xuICB2YXIgaGFzaCA9IFwiXCI7XG5cbiAgaWYgKHNlYXJjaEV4aXN0cykge1xuICAgIHBhdGhuYW1lID0gdXJsLnN1YnN0cmluZygwLCBzZWFyY2hJbmRleCk7XG4gICAgc2VhcmNoID0gdXJsLnN1YnN0cmluZyhzZWFyY2hJbmRleCk7XG4gIH0gZWxzZSB7XG4gICAgcGF0aG5hbWUgPSB1cmw7XG4gIH1cblxuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChMb2NhdGlvbkNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZToge1xuICAgICAgbG9jYXRpb246IHtcbiAgICAgICAgcGF0aG5hbWU6IHBhdGhuYW1lLFxuICAgICAgICBzZWFyY2g6IHNlYXJjaCxcbiAgICAgICAgaGFzaDogaGFzaFxuICAgICAgfSxcbiAgICAgIG5hdmlnYXRlOiBmdW5jdGlvbiBuYXZpZ2F0ZSgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiWW91IGNhbid0IGNhbGwgbmF2aWdhdGUgb24gdGhlIHNlcnZlci5cIik7XG4gICAgICB9XG4gICAgfVxuICB9LCBjaGlsZHJlbik7XG59OyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gU2V0cyBiYXNldXJpIGFuZCBiYXNlcGF0aCBmb3IgbmVzdGVkIHJvdXRlcnMgYW5kIGxpbmtzXG5cblxudmFyIEJhc2VDb250ZXh0ID0gY3JlYXRlTmFtZWRDb250ZXh0KFwiQmFzZVwiLCB7XG4gIGJhc2V1cmk6IFwiL1wiLFxuICBiYXNlcGF0aDogXCIvXCIsXG4gIG5hdmlnYXRlOiBnbG9iYWxIaXN0b3J5Lm5hdmlnYXRlXG59KTsgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFRoZSBtYWluIGV2ZW50LCB3ZWxjb21lIHRvIHRoZSBzaG93IGV2ZXJ5Ym9keS5cblxudmFyIFJvdXRlciA9IGZ1bmN0aW9uIFJvdXRlcihwcm9wcykge1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChCYXNlQ29udGV4dC5Db25zdW1lciwgbnVsbCwgZnVuY3Rpb24gKGJhc2VDb250ZXh0KSB7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoTG9jYXRpb24sIG51bGwsIGZ1bmN0aW9uIChsb2NhdGlvbkNvbnRleHQpIHtcbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFJvdXRlckltcGwsIF9leHRlbmRzKHt9LCBiYXNlQ29udGV4dCwgbG9jYXRpb25Db250ZXh0LCBwcm9wcykpO1xuICAgIH0pO1xuICB9KTtcbn07XG5cbnZhciBSb3V0ZXJJbXBsID0gZnVuY3Rpb24gKF9SZWFjdCRQdXJlQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhSb3V0ZXJJbXBsLCBfUmVhY3QkUHVyZUNvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gUm91dGVySW1wbCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUm91dGVySW1wbCk7XG5cbiAgICByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1JlYWN0JFB1cmVDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBSb3V0ZXJJbXBsLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGxvY2F0aW9uID0gX3Byb3BzLmxvY2F0aW9uLFxuICAgICAgICBfbmF2aWdhdGUyID0gX3Byb3BzLm5hdmlnYXRlLFxuICAgICAgICBiYXNlcGF0aCA9IF9wcm9wcy5iYXNlcGF0aCxcbiAgICAgICAgcHJpbWFyeSA9IF9wcm9wcy5wcmltYXJ5LFxuICAgICAgICBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbixcbiAgICAgICAgYmFzZXVyaSA9IF9wcm9wcy5iYXNldXJpLFxuICAgICAgICBfcHJvcHMkY29tcG9uZW50ID0gX3Byb3BzLmNvbXBvbmVudCxcbiAgICAgICAgY29tcG9uZW50ID0gX3Byb3BzJGNvbXBvbmVudCA9PT0gdW5kZWZpbmVkID8gXCJkaXZcIiA6IF9wcm9wcyRjb21wb25lbnQsXG4gICAgICAgIGRvbVByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9wcm9wcywgW1wibG9jYXRpb25cIiwgXCJuYXZpZ2F0ZVwiLCBcImJhc2VwYXRoXCIsIFwicHJpbWFyeVwiLCBcImNoaWxkcmVuXCIsIFwiYmFzZXVyaVwiLCBcImNvbXBvbmVudFwiXSk7XG5cbiAgICB2YXIgcm91dGVzID0gUmVhY3QuQ2hpbGRyZW4udG9BcnJheShjaGlsZHJlbikucmVkdWNlKGZ1bmN0aW9uIChhcnJheSwgY2hpbGQpIHtcbiAgICAgIHZhciByb3V0ZXMgPSBjcmVhdGVSb3V0ZShiYXNlcGF0aCkoY2hpbGQpO1xuICAgICAgcmV0dXJuIGFycmF5LmNvbmNhdChyb3V0ZXMpO1xuICAgIH0sIFtdKTtcbiAgICB2YXIgcGF0aG5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZTtcbiAgICB2YXIgbWF0Y2ggPSBwaWNrKHJvdXRlcywgcGF0aG5hbWUpO1xuXG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gbWF0Y2gucGFyYW1zLFxuICAgICAgICAgIHVyaSA9IG1hdGNoLnVyaSxcbiAgICAgICAgICByb3V0ZSA9IG1hdGNoLnJvdXRlLFxuICAgICAgICAgIGVsZW1lbnQgPSBtYXRjaC5yb3V0ZS52YWx1ZTsgLy8gcmVtb3ZlIHRoZSAvKiBmcm9tIHRoZSBlbmQgZm9yIGNoaWxkIHJvdXRlcyByZWxhdGl2ZSBwYXRoc1xuXG4gICAgICBiYXNlcGF0aCA9IHJvdXRlLmRlZmF1bHQgPyBiYXNlcGF0aCA6IHJvdXRlLnBhdGgucmVwbGFjZSgvXFwqJC8sIFwiXCIpO1xuXG4gICAgICB2YXIgcHJvcHMgPSBfZXh0ZW5kcyh7fSwgcGFyYW1zLCB7XG4gICAgICAgIHVyaTogdXJpLFxuICAgICAgICBsb2NhdGlvbjogbG9jYXRpb24sXG4gICAgICAgIG5hdmlnYXRlOiBmdW5jdGlvbiBuYXZpZ2F0ZSh0bywgb3B0aW9ucykge1xuICAgICAgICAgIHJldHVybiBfbmF2aWdhdGUyKHJlc29sdmUodG8sIHVyaSksIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdmFyIGNsb25lID0gUmVhY3QuY2xvbmVFbGVtZW50KGVsZW1lbnQsIHByb3BzLCBlbGVtZW50LnByb3BzLmNoaWxkcmVuID8gUmVhY3QuY3JlYXRlRWxlbWVudChSb3V0ZXIsIHtcbiAgICAgICAgbG9jYXRpb246IGxvY2F0aW9uLFxuICAgICAgICBwcmltYXJ5OiBwcmltYXJ5XG4gICAgICB9LCBlbGVtZW50LnByb3BzLmNoaWxkcmVuKSA6IHVuZGVmaW5lZCk7IC8vIHVzaW5nICdkaXYnIGZvciA8IDE2LjMgc3VwcG9ydFxuXG4gICAgICB2YXIgRm9jdXNXcmFwcGVyID0gcHJpbWFyeSA/IEZvY3VzSGFuZGxlciA6IGNvbXBvbmVudDsgLy8gZG9uJ3QgcGFzcyBhbnkgcHJvcHMgdG8gJ2RpdidcblxuICAgICAgdmFyIHdyYXBwZXJQcm9wcyA9IHByaW1hcnkgPyBfZXh0ZW5kcyh7XG4gICAgICAgIHVyaTogdXJpLFxuICAgICAgICBsb2NhdGlvbjogbG9jYXRpb24sXG4gICAgICAgIGNvbXBvbmVudDogY29tcG9uZW50XG4gICAgICB9LCBkb21Qcm9wcykgOiBkb21Qcm9wcztcbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KEJhc2VDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgYmFzZXVyaTogdXJpLFxuICAgICAgICAgIGJhc2VwYXRoOiBiYXNlcGF0aCxcbiAgICAgICAgICBuYXZpZ2F0ZTogcHJvcHMubmF2aWdhdGVcbiAgICAgICAgfVxuICAgICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChGb2N1c1dyYXBwZXIsIHdyYXBwZXJQcm9wcywgY2xvbmUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm90IHN1cmUgaWYgd2Ugd2FudCB0aGlzLCB3b3VsZCByZXF1aXJlIGluZGV4IHJvdXRlcyBhdCBldmVyeSBsZXZlbFxuICAgICAgLy8gd2FybmluZyhcbiAgICAgIC8vICAgZmFsc2UsXG4gICAgICAvLyAgIGA8Um91dGVyIGJhc2VwYXRoPVwiJHtiYXNlcGF0aH1cIj5cXG5cXG5Ob3RoaW5nIG1hdGNoZWQ6XFxuXFx0JHtcbiAgICAgIC8vICAgICBsb2NhdGlvbi5wYXRobmFtZVxuICAgICAgLy8gICB9XFxuXFxuUGF0aHMgY2hlY2tlZDogXFxuXFx0JHtyb3V0ZXNcbiAgICAgIC8vICAgICAubWFwKHJvdXRlID0+IHJvdXRlLnBhdGgpXG4gICAgICAvLyAgICAgLmpvaW4oXG4gICAgICAvLyAgICAgICBcIlxcblxcdFwiXG4gICAgICAvLyAgICAgKX1cXG5cXG5UbyBnZXQgcmlkIG9mIHRoaXMgd2FybmluZywgYWRkIGEgZGVmYXVsdCBOb3RGb3VuZCBjb21wb25lbnQgYXMgY2hpbGQgb2YgUm91dGVyOlxuICAgICAgLy8gICBcXG5cXHRsZXQgTm90Rm91bmQgPSAoKSA9PiA8ZGl2Pk5vdCBGb3VuZCE8L2Rpdj5cbiAgICAgIC8vICAgXFxuXFx0PFJvdXRlcj5cXG5cXHQgIDxOb3RGb3VuZCBkZWZhdWx0Lz5cXG5cXHQgIHsvKiAuLi4gKi99XFxuXFx0PC9Sb3V0ZXI+YFxuICAgICAgLy8gKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gUm91dGVySW1wbDtcbn0oUmVhY3QuUHVyZUNvbXBvbmVudCk7XG5cblJvdXRlckltcGwuZGVmYXVsdFByb3BzID0ge1xuICBwcmltYXJ5OiB0cnVlXG59O1xudmFyIEZvY3VzQ29udGV4dCA9IGNyZWF0ZU5hbWVkQ29udGV4dChcIkZvY3VzXCIpO1xuXG52YXIgRm9jdXNIYW5kbGVyID0gZnVuY3Rpb24gRm9jdXNIYW5kbGVyKF9yZWYzKSB7XG4gIHZhciB1cmkgPSBfcmVmMy51cmksXG4gICAgICBsb2NhdGlvbiA9IF9yZWYzLmxvY2F0aW9uLFxuICAgICAgY29tcG9uZW50ID0gX3JlZjMuY29tcG9uZW50LFxuICAgICAgZG9tUHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZjMsIFtcInVyaVwiLCBcImxvY2F0aW9uXCIsIFwiY29tcG9uZW50XCJdKTtcblxuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChGb2N1c0NvbnRleHQuQ29uc3VtZXIsIG51bGwsIGZ1bmN0aW9uIChyZXF1ZXN0Rm9jdXMpIHtcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChGb2N1c0hhbmRsZXJJbXBsLCBfZXh0ZW5kcyh7fSwgZG9tUHJvcHMsIHtcbiAgICAgIGNvbXBvbmVudDogY29tcG9uZW50LFxuICAgICAgcmVxdWVzdEZvY3VzOiByZXF1ZXN0Rm9jdXMsXG4gICAgICB1cmk6IHVyaSxcbiAgICAgIGxvY2F0aW9uOiBsb2NhdGlvblxuICAgIH0pKTtcbiAgfSk7XG59OyAvLyBkb24ndCBmb2N1cyBvbiBpbml0aWFsIHJlbmRlclxuXG5cbnZhciBpbml0aWFsUmVuZGVyID0gdHJ1ZTtcbnZhciBmb2N1c0hhbmRsZXJDb3VudCA9IDA7XG5cbnZhciBGb2N1c0hhbmRsZXJJbXBsID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQyKSB7XG4gIF9pbmhlcml0cyhGb2N1c0hhbmRsZXJJbXBsLCBfUmVhY3QkQ29tcG9uZW50Mik7XG5cbiAgZnVuY3Rpb24gRm9jdXNIYW5kbGVySW1wbCgpIHtcbiAgICB2YXIgX3RlbXAyLCBfdGhpczQsIF9yZXQyO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEZvY3VzSGFuZGxlckltcGwpO1xuXG4gICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgIGFyZ3NbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3JldDIgPSAoX3RlbXAyID0gKF90aGlzNCA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9SZWFjdCRDb21wb25lbnQyLmNhbGwuYXBwbHkoX1JlYWN0JENvbXBvbmVudDIsIFt0aGlzXS5jb25jYXQoYXJncykpKSwgX3RoaXM0KSwgX3RoaXM0LnN0YXRlID0ge30sIF90aGlzNC5yZXF1ZXN0Rm9jdXMgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgaWYgKCFfdGhpczQuc3RhdGUuc2hvdWxkRm9jdXMgJiYgbm9kZSkge1xuICAgICAgICBub2RlLmZvY3VzKCk7XG4gICAgICB9XG4gICAgfSwgX3RlbXAyKSwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oX3RoaXM0LCBfcmV0Mik7XG4gIH1cblxuICBGb2N1c0hhbmRsZXJJbXBsLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9IGZ1bmN0aW9uIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhuZXh0UHJvcHMsIHByZXZTdGF0ZSkge1xuICAgIHZhciBpbml0aWFsID0gcHJldlN0YXRlLnVyaSA9PSBudWxsO1xuXG4gICAgaWYgKGluaXRpYWwpIHtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7XG4gICAgICAgIHNob3VsZEZvY3VzOiB0cnVlXG4gICAgICB9LCBuZXh0UHJvcHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbXlVUklDaGFuZ2VkID0gbmV4dFByb3BzLnVyaSAhPT0gcHJldlN0YXRlLnVyaTtcbiAgICAgIHZhciBuYXZpZ2F0ZWRVcFRvTWUgPSBwcmV2U3RhdGUubG9jYXRpb24ucGF0aG5hbWUgIT09IG5leHRQcm9wcy5sb2NhdGlvbi5wYXRobmFtZSAmJiBuZXh0UHJvcHMubG9jYXRpb24ucGF0aG5hbWUgPT09IG5leHRQcm9wcy51cmk7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe1xuICAgICAgICBzaG91bGRGb2N1czogbXlVUklDaGFuZ2VkIHx8IG5hdmlnYXRlZFVwVG9NZVxuICAgICAgfSwgbmV4dFByb3BzKTtcbiAgICB9XG4gIH07XG5cbiAgRm9jdXNIYW5kbGVySW1wbC5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICBmb2N1c0hhbmRsZXJDb3VudCsrO1xuICAgIHRoaXMuZm9jdXMoKTtcbiAgfTtcblxuICBGb2N1c0hhbmRsZXJJbXBsLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIGZvY3VzSGFuZGxlckNvdW50LS07XG5cbiAgICBpZiAoZm9jdXNIYW5kbGVyQ291bnQgPT09IDApIHtcbiAgICAgIGluaXRpYWxSZW5kZXIgPSB0cnVlO1xuICAgIH1cbiAgfTtcblxuICBGb2N1c0hhbmRsZXJJbXBsLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGUgPSBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUpIHtcbiAgICBpZiAocHJldlByb3BzLmxvY2F0aW9uICE9PSB0aGlzLnByb3BzLmxvY2F0aW9uICYmIHRoaXMuc3RhdGUuc2hvdWxkRm9jdXMpIHtcbiAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICB9XG4gIH07XG5cbiAgRm9jdXNIYW5kbGVySW1wbC5wcm90b3R5cGUuZm9jdXMgPSBmdW5jdGlvbiBmb2N1cygpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwidGVzdFwiKSB7XG4gICAgICAvLyBnZXR0aW5nIGNhbm5vdCByZWFkIHByb3BlcnR5IGZvY3VzIG9mIG51bGwgaW4gdGhlIHRlc3RzXG4gICAgICAvLyBhbmQgdGhhdCBiaXQgb2YgZ2xvYmFsIGBpbml0aWFsUmVuZGVyYCBzdGF0ZSBjYXVzZXMgcHJvYmxlbXNcbiAgICAgIC8vIHNob3VsZCBwcm9iYWJseSBmaWd1cmUgaXQgb3V0IVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciByZXF1ZXN0Rm9jdXMgPSB0aGlzLnByb3BzLnJlcXVlc3RGb2N1cztcblxuICAgIGlmIChyZXF1ZXN0Rm9jdXMpIHtcbiAgICAgIHJlcXVlc3RGb2N1cyh0aGlzLm5vZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaW5pdGlhbFJlbmRlcikge1xuICAgICAgICBpbml0aWFsUmVuZGVyID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZSkge1xuICAgICAgICAvLyBSZWFjdCBwb2x5ZmlsbHMgW2F1dG9mb2N1c10gYW5kIGl0IGZpcmVzIGVhcmxpZXIgdGhhbiBjRE0sXG4gICAgICAgIC8vIHNvIHdlIHdlcmUgc3RlYWxpbmcgZm9jdXMgYXdheSwgdGhpcyBsaW5lIHByZXZlbnRzIHRoYXQuXG4gICAgICAgIGlmICghdGhpcy5ub2RlLmNvbnRhaW5zKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgICAgdGhpcy5ub2RlLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgRm9jdXNIYW5kbGVySW1wbC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfdGhpczUgPSB0aGlzO1xuXG4gICAgdmFyIF9wcm9wczIgPSB0aGlzLnByb3BzLFxuICAgICAgICBjaGlsZHJlbiA9IF9wcm9wczIuY2hpbGRyZW4sXG4gICAgICAgIHN0eWxlID0gX3Byb3BzMi5zdHlsZSxcbiAgICAgICAgcmVxdWVzdEZvY3VzID0gX3Byb3BzMi5yZXF1ZXN0Rm9jdXMsXG4gICAgICAgIF9wcm9wczIkY29tcG9uZW50ID0gX3Byb3BzMi5jb21wb25lbnQsXG4gICAgICAgIENvbXAgPSBfcHJvcHMyJGNvbXBvbmVudCA9PT0gdW5kZWZpbmVkID8gXCJkaXZcIiA6IF9wcm9wczIkY29tcG9uZW50LFxuICAgICAgICB1cmkgPSBfcHJvcHMyLnVyaSxcbiAgICAgICAgbG9jYXRpb24gPSBfcHJvcHMyLmxvY2F0aW9uLFxuICAgICAgICBkb21Qcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcHJvcHMyLCBbXCJjaGlsZHJlblwiLCBcInN0eWxlXCIsIFwicmVxdWVzdEZvY3VzXCIsIFwiY29tcG9uZW50XCIsIFwidXJpXCIsIFwibG9jYXRpb25cIl0pO1xuXG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcCwgX2V4dGVuZHMoe1xuICAgICAgc3R5bGU6IF9leHRlbmRzKHtcbiAgICAgICAgb3V0bGluZTogXCJub25lXCJcbiAgICAgIH0sIHN0eWxlKSxcbiAgICAgIHRhYkluZGV4OiBcIi0xXCIsXG4gICAgICByZWY6IGZ1bmN0aW9uIHJlZihuKSB7XG4gICAgICAgIHJldHVybiBfdGhpczUubm9kZSA9IG47XG4gICAgICB9XG4gICAgfSwgZG9tUHJvcHMpLCBSZWFjdC5jcmVhdGVFbGVtZW50KEZvY3VzQ29udGV4dC5Qcm92aWRlciwge1xuICAgICAgdmFsdWU6IHRoaXMucmVxdWVzdEZvY3VzXG4gICAgfSwgdGhpcy5wcm9wcy5jaGlsZHJlbikpO1xuICB9O1xuXG4gIHJldHVybiBGb2N1c0hhbmRsZXJJbXBsO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5wb2x5ZmlsbChGb2N1c0hhbmRsZXJJbXBsKTtcblxudmFyIGsgPSBmdW5jdGlvbiBrKCkge307IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblxudmFyIGZvcndhcmRSZWYgPSBSZWFjdC5mb3J3YXJkUmVmO1xuXG5pZiAodHlwZW9mIGZvcndhcmRSZWYgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgZm9yd2FyZFJlZiA9IGZ1bmN0aW9uIGZvcndhcmRSZWYoQykge1xuICAgIHJldHVybiBDO1xuICB9O1xufVxuXG52YXIgTGluayA9IGZvcndhcmRSZWYoZnVuY3Rpb24gKF9yZWY0LCByZWYpIHtcbiAgdmFyIGlubmVyUmVmID0gX3JlZjQuaW5uZXJSZWYsXG4gICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmNCwgW1wiaW5uZXJSZWZcIl0pO1xuXG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KEJhc2VDb250ZXh0LkNvbnN1bWVyLCBudWxsLCBmdW5jdGlvbiAoX3JlZjUpIHtcbiAgICB2YXIgYmFzZXBhdGggPSBfcmVmNS5iYXNlcGF0aCxcbiAgICAgICAgYmFzZXVyaSA9IF9yZWY1LmJhc2V1cmk7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoTG9jYXRpb24sIG51bGwsIGZ1bmN0aW9uIChfcmVmNikge1xuICAgICAgdmFyIGxvY2F0aW9uID0gX3JlZjYubG9jYXRpb24sXG4gICAgICAgICAgbmF2aWdhdGUgPSBfcmVmNi5uYXZpZ2F0ZTtcblxuICAgICAgdmFyIHRvID0gcHJvcHMudG8sXG4gICAgICAgICAgc3RhdGUgPSBwcm9wcy5zdGF0ZSxcbiAgICAgICAgICByZXBsYWNlID0gcHJvcHMucmVwbGFjZSxcbiAgICAgICAgICBfcHJvcHMkZ2V0UHJvcHMgPSBwcm9wcy5nZXRQcm9wcyxcbiAgICAgICAgICBnZXRQcm9wcyA9IF9wcm9wcyRnZXRQcm9wcyA9PT0gdW5kZWZpbmVkID8gayA6IF9wcm9wcyRnZXRQcm9wcyxcbiAgICAgICAgICBhbmNob3JQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgW1widG9cIiwgXCJzdGF0ZVwiLCBcInJlcGxhY2VcIiwgXCJnZXRQcm9wc1wiXSk7XG5cbiAgICAgIHZhciBocmVmID0gcmVzb2x2ZSh0bywgYmFzZXVyaSk7XG4gICAgICB2YXIgZW5jb2RlZEhyZWYgPSBlbmNvZGVVUkkoaHJlZik7XG4gICAgICB2YXIgaXNDdXJyZW50ID0gbG9jYXRpb24ucGF0aG5hbWUgPT09IGVuY29kZWRIcmVmO1xuICAgICAgdmFyIGlzUGFydGlhbGx5Q3VycmVudCA9IHN0YXJ0c1dpdGgobG9jYXRpb24ucGF0aG5hbWUsIGVuY29kZWRIcmVmKTtcbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiYVwiLCBfZXh0ZW5kcyh7XG4gICAgICAgIHJlZjogcmVmIHx8IGlubmVyUmVmLFxuICAgICAgICBcImFyaWEtY3VycmVudFwiOiBpc0N1cnJlbnQgPyBcInBhZ2VcIiA6IHVuZGVmaW5lZFxuICAgICAgfSwgYW5jaG9yUHJvcHMsIGdldFByb3BzKHtcbiAgICAgICAgaXNDdXJyZW50OiBpc0N1cnJlbnQsXG4gICAgICAgIGlzUGFydGlhbGx5Q3VycmVudDogaXNQYXJ0aWFsbHlDdXJyZW50LFxuICAgICAgICBocmVmOiBocmVmLFxuICAgICAgICBsb2NhdGlvbjogbG9jYXRpb25cbiAgICAgIH0pLCB7XG4gICAgICAgIGhyZWY6IGhyZWYsXG4gICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soZXZlbnQpIHtcbiAgICAgICAgICBpZiAoYW5jaG9yUHJvcHMub25DbGljaykgYW5jaG9yUHJvcHMub25DbGljayhldmVudCk7XG5cbiAgICAgICAgICBpZiAoc2hvdWxkTmF2aWdhdGUoZXZlbnQpKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdmFyIHNob3VsZFJlcGxhY2UgPSByZXBsYWNlO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlcGxhY2UgIT09IFwiYm9vbGVhblwiICYmIGlzQ3VycmVudCkge1xuICAgICAgICAgICAgICB2YXIgX2xvY2F0aW9uJHN0YXRlID0gX2V4dGVuZHMoe30sIGxvY2F0aW9uLnN0YXRlKSxcbiAgICAgICAgICAgICAgICAgIGtleSA9IF9sb2NhdGlvbiRzdGF0ZS5rZXksXG4gICAgICAgICAgICAgICAgICByZXN0U3RhdGUgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX2xvY2F0aW9uJHN0YXRlLCBbXCJrZXlcIl0pO1xuXG4gICAgICAgICAgICAgIHNob3VsZFJlcGxhY2UgPSBzaGFsbG93Q29tcGFyZShfZXh0ZW5kcyh7fSwgc3RhdGUpLCByZXN0U3RhdGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBuYXZpZ2F0ZShocmVmLCB7XG4gICAgICAgICAgICAgIHN0YXRlOiBzdGF0ZSxcbiAgICAgICAgICAgICAgcmVwbGFjZTogc2hvdWxkUmVwbGFjZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG5MaW5rLmRpc3BsYXlOYW1lID0gXCJMaW5rXCI7XG5wcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB2b2lkIDAgOiB2b2lkIDA7IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbmZ1bmN0aW9uIFJlZGlyZWN0UmVxdWVzdCh1cmkpIHtcbiAgdGhpcy51cmkgPSB1cmk7XG59XG5cbnZhciBpc1JlZGlyZWN0ID0gZnVuY3Rpb24gaXNSZWRpcmVjdChvKSB7XG4gIHJldHVybiBvIGluc3RhbmNlb2YgUmVkaXJlY3RSZXF1ZXN0O1xufTtcblxudmFyIHJlZGlyZWN0VG8gPSBmdW5jdGlvbiByZWRpcmVjdFRvKHRvKSB7XG4gIHRocm93IG5ldyBSZWRpcmVjdFJlcXVlc3QodG8pO1xufTtcblxudmFyIFJlZGlyZWN0SW1wbCA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50Mykge1xuICBfaW5oZXJpdHMoUmVkaXJlY3RJbXBsLCBfUmVhY3QkQ29tcG9uZW50Myk7XG5cbiAgZnVuY3Rpb24gUmVkaXJlY3RJbXBsKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBSZWRpcmVjdEltcGwpO1xuXG4gICAgcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9SZWFjdCRDb21wb25lbnQzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9IC8vIFN1cHBvcnQgUmVhY3QgPCAxNiB3aXRoIHRoaXMgaG9va1xuXG5cbiAgUmVkaXJlY3RJbXBsLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHZhciBfcHJvcHMzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgbmF2aWdhdGUgPSBfcHJvcHMzLm5hdmlnYXRlLFxuICAgICAgICB0byA9IF9wcm9wczMudG8sXG4gICAgICAgIGZyb20gPSBfcHJvcHMzLmZyb20sXG4gICAgICAgIF9wcm9wczMkcmVwbGFjZSA9IF9wcm9wczMucmVwbGFjZSxcbiAgICAgICAgcmVwbGFjZSA9IF9wcm9wczMkcmVwbGFjZSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IF9wcm9wczMkcmVwbGFjZSxcbiAgICAgICAgc3RhdGUgPSBfcHJvcHMzLnN0YXRlLFxuICAgICAgICBub1Rocm93ID0gX3Byb3BzMy5ub1Rocm93LFxuICAgICAgICBiYXNldXJpID0gX3Byb3BzMy5iYXNldXJpLFxuICAgICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcHJvcHMzLCBbXCJuYXZpZ2F0ZVwiLCBcInRvXCIsIFwiZnJvbVwiLCBcInJlcGxhY2VcIiwgXCJzdGF0ZVwiLCBcIm5vVGhyb3dcIiwgXCJiYXNldXJpXCJdKTtcblxuICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHJlc29sdmVkVG8gPSByZXNvbHZlKHRvLCBiYXNldXJpKTtcbiAgICAgIG5hdmlnYXRlKGluc2VydFBhcmFtcyhyZXNvbHZlZFRvLCBwcm9wcyksIHtcbiAgICAgICAgcmVwbGFjZTogcmVwbGFjZSxcbiAgICAgICAgc3RhdGU6IHN0YXRlXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBSZWRpcmVjdEltcGwucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzNCA9IHRoaXMucHJvcHMsXG4gICAgICAgIG5hdmlnYXRlID0gX3Byb3BzNC5uYXZpZ2F0ZSxcbiAgICAgICAgdG8gPSBfcHJvcHM0LnRvLFxuICAgICAgICBmcm9tID0gX3Byb3BzNC5mcm9tLFxuICAgICAgICByZXBsYWNlID0gX3Byb3BzNC5yZXBsYWNlLFxuICAgICAgICBzdGF0ZSA9IF9wcm9wczQuc3RhdGUsXG4gICAgICAgIG5vVGhyb3cgPSBfcHJvcHM0Lm5vVGhyb3csXG4gICAgICAgIGJhc2V1cmkgPSBfcHJvcHM0LmJhc2V1cmksXG4gICAgICAgIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9wcm9wczQsIFtcIm5hdmlnYXRlXCIsIFwidG9cIiwgXCJmcm9tXCIsIFwicmVwbGFjZVwiLCBcInN0YXRlXCIsIFwibm9UaHJvd1wiLCBcImJhc2V1cmlcIl0pO1xuXG4gICAgdmFyIHJlc29sdmVkVG8gPSByZXNvbHZlKHRvLCBiYXNldXJpKTtcbiAgICBpZiAoIW5vVGhyb3cpIHJlZGlyZWN0VG8oaW5zZXJ0UGFyYW1zKHJlc29sdmVkVG8sIHByb3BzKSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgcmV0dXJuIFJlZGlyZWN0SW1wbDtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxudmFyIFJlZGlyZWN0ID0gZnVuY3Rpb24gUmVkaXJlY3QocHJvcHMpIHtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQmFzZUNvbnRleHQuQ29uc3VtZXIsIG51bGwsIGZ1bmN0aW9uIChfcmVmNykge1xuICAgIHZhciBiYXNldXJpID0gX3JlZjcuYmFzZXVyaTtcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChMb2NhdGlvbiwgbnVsbCwgZnVuY3Rpb24gKGxvY2F0aW9uQ29udGV4dCkge1xuICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVkaXJlY3RJbXBsLCBfZXh0ZW5kcyh7fSwgbG9jYXRpb25Db250ZXh0LCB7XG4gICAgICAgIGJhc2V1cmk6IGJhc2V1cmlcbiAgICAgIH0sIHByb3BzKSk7XG4gICAgfSk7XG4gIH0pO1xufTtcblxucHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gdm9pZCAwIDogdm9pZCAwOyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG52YXIgTWF0Y2ggPSBmdW5jdGlvbiBNYXRjaChfcmVmOCkge1xuICB2YXIgcGF0aCA9IF9yZWY4LnBhdGgsXG4gICAgICBjaGlsZHJlbiA9IF9yZWY4LmNoaWxkcmVuO1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChCYXNlQ29udGV4dC5Db25zdW1lciwgbnVsbCwgZnVuY3Rpb24gKF9yZWY5KSB7XG4gICAgdmFyIGJhc2V1cmkgPSBfcmVmOS5iYXNldXJpO1xuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KExvY2F0aW9uLCBudWxsLCBmdW5jdGlvbiAoX3JlZjEwKSB7XG4gICAgICB2YXIgbmF2aWdhdGUgPSBfcmVmMTAubmF2aWdhdGUsXG4gICAgICAgICAgbG9jYXRpb24gPSBfcmVmMTAubG9jYXRpb247XG4gICAgICB2YXIgcmVzb2x2ZWRQYXRoID0gcmVzb2x2ZShwYXRoLCBiYXNldXJpKTtcbiAgICAgIHZhciByZXN1bHQgPSBtYXRjaChyZXNvbHZlZFBhdGgsIGxvY2F0aW9uLnBhdGhuYW1lKTtcbiAgICAgIHJldHVybiBjaGlsZHJlbih7XG4gICAgICAgIG5hdmlnYXRlOiBuYXZpZ2F0ZSxcbiAgICAgICAgbG9jYXRpb246IGxvY2F0aW9uLFxuICAgICAgICBtYXRjaDogcmVzdWx0ID8gX2V4dGVuZHMoe30sIHJlc3VsdC5wYXJhbXMsIHtcbiAgICAgICAgICB1cmk6IHJlc3VsdC51cmksXG4gICAgICAgICAgcGF0aDogcGF0aFxuICAgICAgICB9KSA6IG51bGxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn07IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBIb29rc1xuXG5cbnZhciB1c2VMb2NhdGlvbiA9IGZ1bmN0aW9uIHVzZUxvY2F0aW9uKCkge1xuICB2YXIgY29udGV4dCA9IHVzZUNvbnRleHQoTG9jYXRpb25Db250ZXh0KTtcblxuICBpZiAoIWNvbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1c2VMb2NhdGlvbiBob29rIHdhcyB1c2VkIGJ1dCBhIExvY2F0aW9uQ29udGV4dC5Qcm92aWRlciB3YXMgbm90IGZvdW5kIGluIHRoZSBwYXJlbnQgdHJlZS4gTWFrZSBzdXJlIHRoaXMgaXMgdXNlZCBpbiBhIGNvbXBvbmVudCB0aGF0IGlzIGEgY2hpbGQgb2YgUm91dGVyXCIpO1xuICB9XG5cbiAgcmV0dXJuIGNvbnRleHQubG9jYXRpb247XG59O1xuXG52YXIgdXNlTmF2aWdhdGUgPSBmdW5jdGlvbiB1c2VOYXZpZ2F0ZSgpIHtcbiAgdmFyIGNvbnRleHQgPSB1c2VDb250ZXh0KEJhc2VDb250ZXh0KTtcblxuICBpZiAoIWNvbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1c2VOYXZpZ2F0ZSBob29rIHdhcyB1c2VkIGJ1dCBhIEJhc2VDb250ZXh0LlByb3ZpZGVyIHdhcyBub3QgZm91bmQgaW4gdGhlIHBhcmVudCB0cmVlLiBNYWtlIHN1cmUgdGhpcyBpcyB1c2VkIGluIGEgY29tcG9uZW50IHRoYXQgaXMgYSBjaGlsZCBvZiBSb3V0ZXJcIik7XG4gIH1cblxuICByZXR1cm4gY29udGV4dC5uYXZpZ2F0ZTtcbn07XG5cbnZhciB1c2VQYXJhbXMgPSBmdW5jdGlvbiB1c2VQYXJhbXMoKSB7XG4gIHZhciBjb250ZXh0ID0gdXNlQ29udGV4dChCYXNlQ29udGV4dCk7XG5cbiAgaWYgKCFjb250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwidXNlUGFyYW1zIGhvb2sgd2FzIHVzZWQgYnV0IGEgTG9jYXRpb25Db250ZXh0LlByb3ZpZGVyIHdhcyBub3QgZm91bmQgaW4gdGhlIHBhcmVudCB0cmVlLiBNYWtlIHN1cmUgdGhpcyBpcyB1c2VkIGluIGEgY29tcG9uZW50IHRoYXQgaXMgYSBjaGlsZCBvZiBSb3V0ZXJcIik7XG4gIH1cblxuICB2YXIgbG9jYXRpb24gPSB1c2VMb2NhdGlvbigpO1xuICB2YXIgcmVzdWx0cyA9IG1hdGNoKGNvbnRleHQuYmFzZXBhdGgsIGxvY2F0aW9uLnBhdGhuYW1lKTtcbiAgcmV0dXJuIHJlc3VsdHMgPyByZXN1bHRzLnBhcmFtcyA6IG51bGw7XG59O1xuXG52YXIgdXNlTWF0Y2ggPSBmdW5jdGlvbiB1c2VNYXRjaChwYXRoKSB7XG4gIGlmICghcGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcInVzZU1hdGNoKHBhdGg6IHN0cmluZykgcmVxdWlyZXMgYW4gYXJndW1lbnQgb2YgYSBzdHJpbmcgdG8gbWF0Y2ggYWdhaW5zdFwiKTtcbiAgfVxuXG4gIHZhciBjb250ZXh0ID0gdXNlQ29udGV4dChCYXNlQ29udGV4dCk7XG5cbiAgaWYgKCFjb250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwidXNlTWF0Y2ggaG9vayB3YXMgdXNlZCBidXQgYSBMb2NhdGlvbkNvbnRleHQuUHJvdmlkZXIgd2FzIG5vdCBmb3VuZCBpbiB0aGUgcGFyZW50IHRyZWUuIE1ha2Ugc3VyZSB0aGlzIGlzIHVzZWQgaW4gYSBjb21wb25lbnQgdGhhdCBpcyBhIGNoaWxkIG9mIFJvdXRlclwiKTtcbiAgfVxuXG4gIHZhciBsb2NhdGlvbiA9IHVzZUxvY2F0aW9uKCk7XG4gIHZhciByZXNvbHZlZFBhdGggPSByZXNvbHZlKHBhdGgsIGNvbnRleHQuYmFzZXVyaSk7XG4gIHZhciByZXN1bHQgPSBtYXRjaChyZXNvbHZlZFBhdGgsIGxvY2F0aW9uLnBhdGhuYW1lKTtcbiAgcmV0dXJuIHJlc3VsdCA/IF9leHRlbmRzKHt9LCByZXN1bHQucGFyYW1zLCB7XG4gICAgdXJpOiByZXN1bHQudXJpLFxuICAgIHBhdGg6IHBhdGhcbiAgfSkgOiBudWxsO1xufTsgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIEp1bmtcblxuXG52YXIgc3RyaXBTbGFzaGVzID0gZnVuY3Rpb24gc3RyaXBTbGFzaGVzKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoLyheXFwvK3xcXC8rJCkvZywgXCJcIik7XG59O1xuXG52YXIgY3JlYXRlUm91dGUgPSBmdW5jdGlvbiBjcmVhdGVSb3V0ZShiYXNlcGF0aCkge1xuICByZXR1cm4gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChlbGVtZW50LnR5cGUgPT09IFJlYWN0LkZyYWdtZW50ICYmIGVsZW1lbnQucHJvcHMuY2hpbGRyZW4pIHtcbiAgICAgIHJldHVybiBSZWFjdC5DaGlsZHJlbi5tYXAoZWxlbWVudC5wcm9wcy5jaGlsZHJlbiwgY3JlYXRlUm91dGUoYmFzZXBhdGgpKTtcbiAgICB9XG5cbiAgICAhKGVsZW1lbnQucHJvcHMucGF0aCB8fCBlbGVtZW50LnByb3BzLmRlZmF1bHQgfHwgZWxlbWVudC50eXBlID09PSBSZWRpcmVjdCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsIFwiPFJvdXRlcj46IENoaWxkcmVuIG9mIDxSb3V0ZXI+IG11c3QgaGF2ZSBhIGBwYXRoYCBvciBgZGVmYXVsdGAgcHJvcCwgb3IgYmUgYSBgPFJlZGlyZWN0PmAuIE5vbmUgZm91bmQgb24gZWxlbWVudCB0eXBlIGBcIiArIGVsZW1lbnQudHlwZSArIFwiYFwiKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gICAgISEoZWxlbWVudC50eXBlID09PSBSZWRpcmVjdCAmJiAoIWVsZW1lbnQucHJvcHMuZnJvbSB8fCAhZWxlbWVudC5wcm9wcy50bykpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCBcIjxSZWRpcmVjdCBmcm9tPVxcXCJcIiArIGVsZW1lbnQucHJvcHMuZnJvbSArIFwiXFxcIiB0bz1cXFwiXCIgKyBlbGVtZW50LnByb3BzLnRvICsgXCJcXFwiLz4gcmVxdWlyZXMgYm90aCBcXFwiZnJvbVxcXCIgYW5kIFxcXCJ0b1xcXCIgcHJvcHMgd2hlbiBpbnNpZGUgYSA8Um91dGVyPi5cIikgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICAgICEhKGVsZW1lbnQudHlwZSA9PT0gUmVkaXJlY3QgJiYgIXZhbGlkYXRlUmVkaXJlY3QoZWxlbWVudC5wcm9wcy5mcm9tLCBlbGVtZW50LnByb3BzLnRvKSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsIFwiPFJlZGlyZWN0IGZyb209XFxcIlwiICsgZWxlbWVudC5wcm9wcy5mcm9tICsgXCIgdG89XFxcIlwiICsgZWxlbWVudC5wcm9wcy50byArIFwiXFxcIi8+IGhhcyBtaXNtYXRjaGVkIGR5bmFtaWMgc2VnbWVudHMsIGVuc3VyZSBib3RoIHBhdGhzIGhhdmUgdGhlIGV4YWN0IHNhbWUgZHluYW1pYyBzZWdtZW50cy5cIikgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuXG4gICAgaWYgKGVsZW1lbnQucHJvcHMuZGVmYXVsdCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IGVsZW1lbnQsXG4gICAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIGVsZW1lbnRQYXRoID0gZWxlbWVudC50eXBlID09PSBSZWRpcmVjdCA/IGVsZW1lbnQucHJvcHMuZnJvbSA6IGVsZW1lbnQucHJvcHMucGF0aDtcbiAgICB2YXIgcGF0aCA9IGVsZW1lbnRQYXRoID09PSBcIi9cIiA/IGJhc2VwYXRoIDogc3RyaXBTbGFzaGVzKGJhc2VwYXRoKSArIFwiL1wiICsgc3RyaXBTbGFzaGVzKGVsZW1lbnRQYXRoKTtcbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IGVsZW1lbnQsXG4gICAgICBkZWZhdWx0OiBlbGVtZW50LnByb3BzLmRlZmF1bHQsXG4gICAgICBwYXRoOiBlbGVtZW50LnByb3BzLmNoaWxkcmVuID8gc3RyaXBTbGFzaGVzKHBhdGgpICsgXCIvKlwiIDogcGF0aFxuICAgIH07XG4gIH07XG59O1xuXG52YXIgc2hvdWxkTmF2aWdhdGUgPSBmdW5jdGlvbiBzaG91bGROYXZpZ2F0ZShldmVudCkge1xuICByZXR1cm4gIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgJiYgZXZlbnQuYnV0dG9uID09PSAwICYmICEoZXZlbnQubWV0YUtleSB8fCBldmVudC5hbHRLZXkgfHwgZXZlbnQuY3RybEtleSB8fCBldmVudC5zaGlmdEtleSk7XG59OyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXG5leHBvcnQgeyAgTGluaywgTG9jYXRpb24sIExvY2F0aW9uUHJvdmlkZXIsIE1hdGNoLCBSZWRpcmVjdCwgUm91dGVyLCBTZXJ2ZXJMb2NhdGlvbiwgY3JlYXRlSGlzdG9yeSwgY3JlYXRlTWVtb3J5U291cmNlLCBpc1JlZGlyZWN0LCBuYXZpZ2F0ZSwgcmVkaXJlY3RUbywgZ2xvYmFsSGlzdG9yeSwgbWF0Y2ggYXMgbWF0Y2hQYXRoLCB1c2VMb2NhdGlvbiwgdXNlTmF2aWdhdGUsIHVzZVBhcmFtcywgdXNlTWF0Y2ggLCBCYXNlQ29udGV4dCB9OyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///9499\n')},1143:function(module){"use strict";eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\n/**\n * Use invariant() to assert state which your program assumes to be true.\n *\n * Provide sprintf-style format (only %s is supported) and arguments\n * to provide information about what broke and what you were\n * expecting.\n *\n * The invariant message will be stripped in production, but the invariant\n * will remain to ensure logic does not differ in production.\n */\n\nvar invariant = function(condition, format, a, b, c, d, e, f) {\n if (false) {}\n\n if (!condition) {\n var error;\n if (format === undefined) {\n error = new Error(\n 'Minified exception occurred; use the non-minified dev environment ' +\n 'for the full error message and additional helpful warnings.'\n );\n } else {\n var args = [a, b, c, d, e, f];\n var argIndex = 0;\n error = new Error(\n format.replace(/%s/g, function() { return args[argIndex++]; })\n );\n error.name = 'Invariant Violation';\n }\n\n error.framesToPop = 1; // we don't care about invariant's own frame\n throw error;\n }\n};\n\nmodule.exports = invariant;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9pbnZhcmlhbnQvYnJvd3Nlci5qcz80MGI2Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU0sS0FBcUMsRUFBRSxFQUkxQzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyx5QkFBeUIsRUFBRTtBQUNyRTtBQUNBO0FBQ0E7O0FBRUEsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIxMTQzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogVXNlIGludmFyaWFudCgpIHRvIGFzc2VydCBzdGF0ZSB3aGljaCB5b3VyIHByb2dyYW0gYXNzdW1lcyB0byBiZSB0cnVlLlxuICpcbiAqIFByb3ZpZGUgc3ByaW50Zi1zdHlsZSBmb3JtYXQgKG9ubHkgJXMgaXMgc3VwcG9ydGVkKSBhbmQgYXJndW1lbnRzXG4gKiB0byBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgYnJva2UgYW5kIHdoYXQgeW91IHdlcmVcbiAqIGV4cGVjdGluZy5cbiAqXG4gKiBUaGUgaW52YXJpYW50IG1lc3NhZ2Ugd2lsbCBiZSBzdHJpcHBlZCBpbiBwcm9kdWN0aW9uLCBidXQgdGhlIGludmFyaWFudFxuICogd2lsbCByZW1haW4gdG8gZW5zdXJlIGxvZ2ljIGRvZXMgbm90IGRpZmZlciBpbiBwcm9kdWN0aW9uLlxuICovXG5cbnZhciBpbnZhcmlhbnQgPSBmdW5jdGlvbihjb25kaXRpb24sIGZvcm1hdCwgYSwgYiwgYywgZCwgZSwgZikge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhcmlhbnQgcmVxdWlyZXMgYW4gZXJyb3IgbWVzc2FnZSBhcmd1bWVudCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghY29uZGl0aW9uKSB7XG4gICAgdmFyIGVycm9yO1xuICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoXG4gICAgICAgICdNaW5pZmllZCBleGNlcHRpb24gb2NjdXJyZWQ7IHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCAnICtcbiAgICAgICAgJ2ZvciB0aGUgZnVsbCBlcnJvciBtZXNzYWdlIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuJ1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGFyZ3MgPSBbYSwgYiwgYywgZCwgZSwgZl07XG4gICAgICB2YXIgYXJnSW5kZXggPSAwO1xuICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoXG4gICAgICAgIGZvcm1hdC5yZXBsYWNlKC8lcy9nLCBmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3NbYXJnSW5kZXgrK107IH0pXG4gICAgICApO1xuICAgICAgZXJyb3IubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICB9XG5cbiAgICBlcnJvci5mcmFtZXNUb1BvcCA9IDE7IC8vIHdlIGRvbid0IGNhcmUgYWJvdXQgaW52YXJpYW50J3Mgb3duIGZyYW1lXG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gaW52YXJpYW50O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1143\n")}},function(I){"use strict";I.O(0,[532,774],(function(){return g=2871,I(I.s=g);var g}));I.O()}]); \ No newline at end of file diff --git a/63e863/cejst/index.html b/63e863/cejst/index.html new file mode 100644 index 00000000..574926ac --- /dev/null +++ b/63e863/cejst/index.html @@ -0,0 +1,3 @@ +
\ No newline at end of file diff --git a/63e863/chunk-map.json b/63e863/chunk-map.json new file mode 100644 index 00000000..8e71c667 --- /dev/null +++ b/63e863/chunk-map.json @@ -0,0 +1 @@ +{"polyfill":["/polyfill-3f6ebd8c0b28679e3805.js"],"app":["/app-a65ccd9aebded53964b1.js"],"component---src-pages-404-tsx":["/component---src-pages-404-tsx-dae38bf011a4f81e428c.js"],"component---src-pages-cejst-tsx":["/component---src-pages-cejst-tsx-c4bb2c7dccab522ec388.js"],"component---src-pages-index-tsx":["/component---src-pages-index-tsx-08e0dff373a8a7fecd12.js"],"component---src-pages-timeline-tsx":["/component---src-pages-timeline-tsx-c4b25d3fa997a646ffb9.js"]} \ No newline at end of file diff --git a/63e863/component---src-pages-404-tsx-dae38bf011a4f81e428c.js b/63e863/component---src-pages-404-tsx-dae38bf011a4f81e428c.js new file mode 100644 index 00000000..df8146b0 --- /dev/null +++ b/63e863/component---src-pages-404-tsx-dae38bf011a4f81e428c.js @@ -0,0 +1 @@ +(self.webpackChunkjustice40_tool=self.webpackChunkjustice40_tool||[]).push([[218],{862:function(module,__unused_webpack_exports,__webpack_require__){eval('var _typeof = __webpack_require__(8).default;\n\nfunction _getRequireWildcardCache(nodeInterop) {\n if (typeof WeakMap !== "function") return null;\n var cacheBabelInterop = new WeakMap();\n var cacheNodeInterop = new WeakMap();\n return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {\n return nodeInterop ? cacheNodeInterop : cacheBabelInterop;\n })(nodeInterop);\n}\n\nfunction _interopRequireWildcard(obj, nodeInterop) {\n if (!nodeInterop && obj && obj.__esModule) {\n return obj;\n }\n\n if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") {\n return {\n "default": obj\n };\n }\n\n var cache = _getRequireWildcardCache(nodeInterop);\n\n if (cache && cache.has(obj)) {\n return cache.get(obj);\n }\n\n var newObj = {};\n var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n for (var key in obj) {\n if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {\n var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;\n\n if (desc && (desc.get || desc.set)) {\n Object.defineProperty(newObj, key, desc);\n } else {\n newObj[key] = obj[key];\n }\n }\n }\n\n newObj["default"] = obj;\n\n if (cache) {\n cache.set(obj, newObj);\n }\n\n return newObj;\n}\n\nmodule.exports = _interopRequireWildcard;\nmodule.exports.default = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmQuanM/ZGJjZSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDhCQUFtRDs7QUFFakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxzQkFBeUIsbUJBQW1CLHlCQUF5QiIsImZpbGUiOiI4NjIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgX3R5cGVvZiA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZlwiKVtcImRlZmF1bHRcIl07XG5cbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShub2RlSW50ZXJvcCkge1xuICBpZiAodHlwZW9mIFdlYWtNYXAgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG51bGw7XG4gIHZhciBjYWNoZUJhYmVsSW50ZXJvcCA9IG5ldyBXZWFrTWFwKCk7XG4gIHZhciBjYWNoZU5vZGVJbnRlcm9wID0gbmV3IFdlYWtNYXAoKTtcbiAgcmV0dXJuIChfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApIHtcbiAgICByZXR1cm4gbm9kZUludGVyb3AgPyBjYWNoZU5vZGVJbnRlcm9wIDogY2FjaGVCYWJlbEludGVyb3A7XG4gIH0pKG5vZGVJbnRlcm9wKTtcbn1cblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqLCBub2RlSW50ZXJvcCkge1xuICBpZiAoIW5vZGVJbnRlcm9wICYmIG9iaiAmJiBvYmouX19lc01vZHVsZSkge1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBpZiAob2JqID09PSBudWxsIHx8IF90eXBlb2Yob2JqKSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygb2JqICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgXCJkZWZhdWx0XCI6IG9ialxuICAgIH07XG4gIH1cblxuICB2YXIgY2FjaGUgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApO1xuXG4gIGlmIChjYWNoZSAmJiBjYWNoZS5oYXMob2JqKSkge1xuICAgIHJldHVybiBjYWNoZS5nZXQob2JqKTtcbiAgfVxuXG4gIHZhciBuZXdPYmogPSB7fTtcbiAgdmFyIGhhc1Byb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4gIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICBpZiAoa2V5ICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICB2YXIgZGVzYyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvciA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpIDogbnVsbDtcblxuICAgICAgaWYgKGRlc2MgJiYgKGRlc2MuZ2V0IHx8IGRlc2Muc2V0KSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3T2JqLCBrZXksIGRlc2MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3T2JqW2tleV0gPSBvYmpba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZXdPYmpbXCJkZWZhdWx0XCJdID0gb2JqO1xuXG4gIGlmIChjYWNoZSkge1xuICAgIGNhY2hlLnNldChvYmosIG5ld09iaik7XG4gIH1cblxuICByZXR1cm4gbmV3T2JqO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkO1xubW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///862\n')},9786:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7294);\n/* harmony import */ var gatsby_plugin_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(9703);\n/* harmony import */ var gatsby_plugin_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(gatsby_plugin_intl__WEBPACK_IMPORTED_MODULE_1__);\n// styles\nvar pageStyles={color:\'#232129\',padding:\'96px\',fontFamily:\'-apple-system, Roboto, sans-serif, serif\'};var headingStyles={marginTop:0,marginBottom:64,maxWidth:320};var paragraphStyles={marginBottom:48};var codeStyles={color:\'#8A6534\',padding:4,backgroundColor:\'#FFF4DB\',fontSize:\'1.25rem\',borderRadius:4};// markup\nvar NotFoundPage=function NotFoundPage(){return/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("main",{style:pageStyles},/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("title",null,"Not found"),/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("h1",{style:headingStyles},"Page not found"),/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("p",{style:paragraphStyles},"Sorry",\' \',/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("span",{role:"img","aria-label":"Pensive emoji"},"\\uD83D\\uDE14"),\' \',"we couldn\\u2019t find what you were looking for.",/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("br",null), false?/*#__PURE__*/0:null,/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("br",null),/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(gatsby_plugin_intl__WEBPACK_IMPORTED_MODULE_1__.Link,{to:"/"},"Go home"),"."));};/* harmony default export */ __webpack_exports__["default"] = (NotFoundPage);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9wYWdlcy80MDQudHN4PzhiYWYiXSwibmFtZXMiOlsicGFnZVN0eWxlcyIsImNvbG9yIiwicGFkZGluZyIsImZvbnRGYW1pbHkiLCJoZWFkaW5nU3R5bGVzIiwibWFyZ2luVG9wIiwibWFyZ2luQm90dG9tIiwibWF4V2lkdGgiLCJwYXJhZ3JhcGhTdHlsZXMiLCJjb2RlU3R5bGVzIiwiYmFja2dyb3VuZENvbG9yIiwiZm9udFNpemUiLCJib3JkZXJSYWRpdXMiLCJOb3RGb3VuZFBhZ2UiLCJwcm9jZXNzIl0sIm1hcHBpbmdzIjoiOzs7O0FBR0E7QUFDQSxHQUFNQSxXQUFVLENBQUcsQ0FDakJDLEtBQUssQ0FBRSxTQURVLENBRWpCQyxPQUFPLENBQUUsTUFGUSxDQUdqQkMsVUFBVSxDQUFFLDBDQUhLLENBQW5CLENBS0EsR0FBTUMsY0FBYSxDQUFHLENBQ3BCQyxTQUFTLENBQUUsQ0FEUyxDQUVwQkMsWUFBWSxDQUFFLEVBRk0sQ0FHcEJDLFFBQVEsQ0FBRSxHQUhVLENBQXRCLENBTUEsR0FBTUMsZ0JBQWUsQ0FBRyxDQUN0QkYsWUFBWSxDQUFFLEVBRFEsQ0FBeEIsQ0FHQSxHQUFNRyxXQUFVLENBQUcsQ0FDakJSLEtBQUssQ0FBRSxTQURVLENBRWpCQyxPQUFPLENBQUUsQ0FGUSxDQUdqQlEsZUFBZSxDQUFFLFNBSEEsQ0FJakJDLFFBQVEsQ0FBRSxTQUpPLENBS2pCQyxZQUFZLENBQUUsQ0FMRyxDQUFuQixDQVFBO0FBQ0EsR0FBTUMsYUFBWSxDQUFHLFFBQWZBLGFBQWUsRUFBTSxDQUN6QixtQkFDRSx5REFBTSxLQUFLLENBQUViLFVBQWIsZUFDRSwwRUFERixjQUVFLHVEQUFJLEtBQUssQ0FBRUksYUFBWCxtQkFGRixjQUdFLHNEQUFHLEtBQUssQ0FBRUksZUFBVixVQUNRLEdBRFIsY0FFRSx5REFBTSxJQUFJLENBQUMsS0FBWCxDQUFpQixhQUFXLGVBQTVCLGlCQUZGLENBSVUsR0FKVixpRUFNRSwyREFORixDQU9HTSxNQUFBLGNBQ0MsQ0FERCxDQU1HLElBYk4sY0FjRSwyREFkRixjQWVFLGlEQUFDLG9EQUFELEVBQU0sRUFBRSxDQUFDLEdBQVQsWUFmRixLQUhGLENBREYsQ0F1QkQsQ0F4QkQsQ0EwQkEsK0RBQWVELFlBQWYiLCJmaWxlIjoiOTc4Ni5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7TGlua30gZnJvbSAnZ2F0c2J5LXBsdWdpbi1pbnRsJztcblxuLy8gc3R5bGVzXG5jb25zdCBwYWdlU3R5bGVzID0ge1xuICBjb2xvcjogJyMyMzIxMjknLFxuICBwYWRkaW5nOiAnOTZweCcsXG4gIGZvbnRGYW1pbHk6ICctYXBwbGUtc3lzdGVtLCBSb2JvdG8sIHNhbnMtc2VyaWYsIHNlcmlmJyxcbn07XG5jb25zdCBoZWFkaW5nU3R5bGVzID0ge1xuICBtYXJnaW5Ub3A6IDAsXG4gIG1hcmdpbkJvdHRvbTogNjQsXG4gIG1heFdpZHRoOiAzMjAsXG59O1xuXG5jb25zdCBwYXJhZ3JhcGhTdHlsZXMgPSB7XG4gIG1hcmdpbkJvdHRvbTogNDgsXG59O1xuY29uc3QgY29kZVN0eWxlcyA9IHtcbiAgY29sb3I6ICcjOEE2NTM0JyxcbiAgcGFkZGluZzogNCxcbiAgYmFja2dyb3VuZENvbG9yOiAnI0ZGRjREQicsXG4gIGZvbnRTaXplOiAnMS4yNXJlbScsXG4gIGJvcmRlclJhZGl1czogNCxcbn07XG5cbi8vIG1hcmt1cFxuY29uc3QgTm90Rm91bmRQYWdlID0gKCkgPT4ge1xuICByZXR1cm4gKFxuICAgIDxtYWluIHN0eWxlPXtwYWdlU3R5bGVzfT5cbiAgICAgIDx0aXRsZT5Ob3QgZm91bmQ8L3RpdGxlPlxuICAgICAgPGgxIHN0eWxlPXtoZWFkaW5nU3R5bGVzfT5QYWdlIG5vdCBmb3VuZDwvaDE+XG4gICAgICA8cCBzdHlsZT17cGFyYWdyYXBoU3R5bGVzfT5cbiAgICAgICAgU29ycnl7JyAnfVxuICAgICAgICA8c3BhbiByb2xlPVwiaW1nXCIgYXJpYS1sYWJlbD1cIlBlbnNpdmUgZW1vamlcIj5cbiAgICAgICAgICDwn5iUXG4gICAgICAgIDwvc3Bhbj57JyAnfVxuICAgICAgICB3ZSBjb3VsZG7igJl0IGZpbmQgd2hhdCB5b3Ugd2VyZSBsb29raW5nIGZvci5cbiAgICAgICAgPGJyIC8+XG4gICAgICAgIHtwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JyA/IChcbiAgICAgICAgICA8PlxuICAgICAgICAgICAgPGJyIC8+XG4gICAgICAgICAgICBUcnkgY3JlYXRpbmcgYSBwYWdlIGluIDxjb2RlIHN0eWxlPXtjb2RlU3R5bGVzfT5zcmMvcGFnZXMvPC9jb2RlPi5cbiAgICAgICAgICAgIDxiciAvPlxuICAgICAgICAgIDwvPlxuICAgICAgICApIDogbnVsbH1cbiAgICAgICAgPGJyIC8+XG4gICAgICAgIDxMaW5rIHRvPVwiL1wiPkdvIGhvbWU8L0xpbms+LlxuICAgICAgPC9wPlxuICAgIDwvbWFpbj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IE5vdEZvdW5kUGFnZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///9786\n')},9703:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('var _interopRequireDefault=__webpack_require__(5318);var _interopRequireWildcard=__webpack_require__(862);exports.__esModule=true;var _exportNames={Link:true,withIntl:true,navigate:true,changeLocale:true,IntlContextProvider:true,IntlContextConsumer:true};exports.IntlContextConsumer=exports.IntlContextProvider=exports.changeLocale=exports.navigate=exports.withIntl=exports.Link=void 0;var _reactIntl=__webpack_require__(3160);Object.keys(_reactIntl).forEach(function(key){if(key==="default"||key==="__esModule")return;if(Object.prototype.hasOwnProperty.call(_exportNames,key))return;exports[key]=_reactIntl[key];});var _link=_interopRequireWildcard(__webpack_require__(4687));exports.Link=_link.default;exports.navigate=_link.navigate;exports.changeLocale=_link.changeLocale;var _withIntl=_interopRequireDefault(__webpack_require__(8770));exports.withIntl=_withIntl.default;var _intlContext=__webpack_require__(8368);exports.IntlContextProvider=_intlContext.IntlContextProvider;exports.IntlContextConsumer=_intlContext.IntlContextConsumer;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9nYXRzYnktcGx1Z2luLWludGwvaW5kZXguanM/OTAyMiJdLCJuYW1lcyI6WyJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiZXhwb3J0cyIsIl9leHBvcnROYW1lcyIsIkxpbmsiLCJ3aXRoSW50bCIsIm5hdmlnYXRlIiwiY2hhbmdlTG9jYWxlIiwiSW50bENvbnRleHRQcm92aWRlciIsIkludGxDb250ZXh0Q29uc3VtZXIiLCJfcmVhY3RJbnRsIiwiT2JqZWN0Iiwia2V5cyIsImZvckVhY2giLCJrZXkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJfbGluayIsImRlZmF1bHQiLCJfd2l0aEludGwiLCJfaW50bENvbnRleHQiXSwibWFwcGluZ3MiOiJBQUVBLEdBQUlBLHVCQUFzQixDQUFHQyxtQkFBTyxDQUFDLElBQUQsQ0FBcEMsQ0FFQSxHQUFJQyx3QkFBdUIsQ0FBR0QsbUJBQU8sQ0FBQyxHQUFELENBQXJDLENBRUFFLGtCQUFBLENBQXFCLElBQXJCLENBQ0EsR0FBSUMsYUFBWSxDQUFHLENBQ2pCQyxJQUFJLENBQUUsSUFEVyxDQUVqQkMsUUFBUSxDQUFFLElBRk8sQ0FHakJDLFFBQVEsQ0FBRSxJQUhPLENBSWpCQyxZQUFZLENBQUUsSUFKRyxDQUtqQkMsbUJBQW1CLENBQUUsSUFMSixDQU1qQkMsbUJBQW1CLENBQUUsSUFOSixDQUFuQixDQVFBUCwyQkFBQSxDQUE4QkEsMkJBQUEsQ0FBOEJBLG9CQUFBLENBQXVCQSxnQkFBQSxDQUFtQkEsZ0JBQUEsQ0FBbUJBLFlBQUEsQ0FBZSxJQUFLLEVBQTdJLENBRUEsR0FBSVEsV0FBVSxDQUFHVixtQkFBTyxDQUFDLElBQUQsQ0FBeEIsQ0FFQVcsTUFBTSxDQUFDQyxJQUFQLENBQVlGLFVBQVosRUFBd0JHLE9BQXhCLENBQWdDLFNBQVVDLEdBQVYsQ0FBZSxDQUM3QyxHQUFJQSxHQUFHLEdBQUssU0FBUixFQUFxQkEsR0FBRyxHQUFLLFlBQWpDLENBQStDLE9BQy9DLEdBQUlILE1BQU0sQ0FBQ0ksU0FBUCxDQUFpQkMsY0FBakIsQ0FBZ0NDLElBQWhDLENBQXFDZCxZQUFyQyxDQUFtRFcsR0FBbkQsQ0FBSixDQUE2RCxPQUM3RFosT0FBTyxDQUFDWSxHQUFELENBQVAsQ0FBZUosVUFBVSxDQUFDSSxHQUFELENBQXpCLENBQ0QsQ0FKRCxFQU1BLEdBQUlJLE1BQUssQ0FBR2pCLHVCQUF1QixDQUFDRCxtQkFBTyxDQUFDLElBQUQsQ0FBUixDQUFuQyxDQUVBRSxZQUFBLENBQWVnQixLQUFLLENBQUNDLE9BQXJCLENBQ0FqQixnQkFBQSxDQUFtQmdCLEtBQUssQ0FBQ1osUUFBekIsQ0FDQUosb0JBQUEsQ0FBdUJnQixLQUFLLENBQUNYLFlBQTdCLENBRUEsR0FBSWEsVUFBUyxDQUFHckIsc0JBQXNCLENBQUNDLG1CQUFPLENBQUMsSUFBRCxDQUFSLENBQXRDLENBRUFFLGdCQUFBLENBQW1Ca0IsU0FBUyxDQUFDRCxPQUE3QixDQUVBLEdBQUlFLGFBQVksQ0FBR3JCLG1CQUFPLENBQUMsSUFBRCxDQUExQixDQUVBRSwyQkFBQSxDQUE4Qm1CLFlBQVksQ0FBQ2IsbUJBQTNDLENBQ0FOLDJCQUFBLENBQThCbUIsWUFBWSxDQUFDWixtQkFBM0MiLCJmaWxlIjoiOTcwMy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbnZhciBfZXhwb3J0TmFtZXMgPSB7XG4gIExpbms6IHRydWUsXG4gIHdpdGhJbnRsOiB0cnVlLFxuICBuYXZpZ2F0ZTogdHJ1ZSxcbiAgY2hhbmdlTG9jYWxlOiB0cnVlLFxuICBJbnRsQ29udGV4dFByb3ZpZGVyOiB0cnVlLFxuICBJbnRsQ29udGV4dENvbnN1bWVyOiB0cnVlXG59O1xuZXhwb3J0cy5JbnRsQ29udGV4dENvbnN1bWVyID0gZXhwb3J0cy5JbnRsQ29udGV4dFByb3ZpZGVyID0gZXhwb3J0cy5jaGFuZ2VMb2NhbGUgPSBleHBvcnRzLm5hdmlnYXRlID0gZXhwb3J0cy53aXRoSW50bCA9IGV4cG9ydHMuTGluayA9IHZvaWQgMDtcblxudmFyIF9yZWFjdEludGwgPSByZXF1aXJlKFwicmVhY3QtaW50bFwiKTtcblxuT2JqZWN0LmtleXMoX3JlYWN0SW50bCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gIGlmIChrZXkgPT09IFwiZGVmYXVsdFwiIHx8IGtleSA9PT0gXCJfX2VzTW9kdWxlXCIpIHJldHVybjtcbiAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChfZXhwb3J0TmFtZXMsIGtleSkpIHJldHVybjtcbiAgZXhwb3J0c1trZXldID0gX3JlYWN0SW50bFtrZXldO1xufSk7XG5cbnZhciBfbGluayA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCIuL2xpbmtcIikpO1xuXG5leHBvcnRzLkxpbmsgPSBfbGluay5kZWZhdWx0O1xuZXhwb3J0cy5uYXZpZ2F0ZSA9IF9saW5rLm5hdmlnYXRlO1xuZXhwb3J0cy5jaGFuZ2VMb2NhbGUgPSBfbGluay5jaGFuZ2VMb2NhbGU7XG5cbnZhciBfd2l0aEludGwgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3dpdGgtaW50bFwiKSk7XG5cbmV4cG9ydHMud2l0aEludGwgPSBfd2l0aEludGwuZGVmYXVsdDtcblxudmFyIF9pbnRsQ29udGV4dCA9IHJlcXVpcmUoXCIuL2ludGwtY29udGV4dFwiKTtcblxuZXhwb3J0cy5JbnRsQ29udGV4dFByb3ZpZGVyID0gX2ludGxDb250ZXh0LkludGxDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLkludGxDb250ZXh0Q29uc3VtZXIgPSBfaW50bENvbnRleHQuSW50bENvbnRleHRDb25zdW1lcjsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///9703\n')},4687:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('var _interopRequireDefault=__webpack_require__(5318);exports.__esModule=true;exports.changeLocale=exports.navigate=exports.default=void 0;var _extends2=_interopRequireDefault(__webpack_require__(7154));var _objectWithoutPropertiesLoose2=_interopRequireDefault(__webpack_require__(7316));var _react=_interopRequireDefault(__webpack_require__(7294));var _propTypes=_interopRequireDefault(__webpack_require__(5697));var _gatsby=__webpack_require__(5444);var _intlContext=__webpack_require__(8368);var Link=function Link(_ref){var to=_ref.to,language=_ref.language,children=_ref.children,onClick=_ref.onClick,rest=(0,_objectWithoutPropertiesLoose2.default)(_ref,["to","language","children","onClick"]);return _react.default.createElement(_intlContext.IntlContextConsumer,null,function(intl){var languageLink=language||intl.language;var link=intl.routed||language?"/"+languageLink+to:""+to;var handleClick=function handleClick(e){if(language){localStorage.setItem("gatsby-intl-language",language);}if(onClick){onClick(e);}};return _react.default.createElement(_gatsby.Link,(0,_extends2.default)({},rest,{to:link,onClick:handleClick}),children);});};Link.propTypes={children:_propTypes.default.node.isRequired,to:_propTypes.default.string,language:_propTypes.default.string};Link.defaultProps={to:""};var _default=Link;exports.default=_default;var navigate=function navigate(to,options){if(typeof window==="undefined"){return;}var _window$___gatsbyIntl=window.___gatsbyIntl,language=_window$___gatsbyIntl.language,routed=_window$___gatsbyIntl.routed;var link=routed?"/"+language+to:""+to;(0,_gatsby.navigate)(link,options);};exports.navigate=navigate;var changeLocale=function changeLocale(language,to){if(typeof window==="undefined"){return;}var routed=window.___gatsbyIntl.routed;var removePrefix=function removePrefix(pathname){var base= true?"/justice40-tool/63e863":0;if(base&&pathname.indexOf(base)===0){pathname=pathname.slice(base.length);}return pathname;};var removeLocalePart=function removeLocalePart(pathname){if(!routed){return pathname;}var i=pathname.indexOf("/",1);return pathname.substring(i);};var pathname=to||removeLocalePart(removePrefix(window.location.pathname));// TODO: check slash\nvar link="/"+language+pathname+window.location.search;localStorage.setItem("gatsby-intl-language",language);(0,_gatsby.navigate)(link);};exports.changeLocale=changeLocale;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9nYXRzYnktcGx1Z2luLWludGwvbGluay5qcz8xODJiIl0sIm5hbWVzIjpbIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiZXhwb3J0cyIsIl9leHRlbmRzMiIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlMiIsIl9yZWFjdCIsIl9wcm9wVHlwZXMiLCJfZ2F0c2J5IiwiX2ludGxDb250ZXh0IiwiTGluayIsIl9yZWYiLCJ0byIsImxhbmd1YWdlIiwiY2hpbGRyZW4iLCJvbkNsaWNrIiwicmVzdCIsImRlZmF1bHQiLCJjcmVhdGVFbGVtZW50IiwiSW50bENvbnRleHRDb25zdW1lciIsImludGwiLCJsYW5ndWFnZUxpbmsiLCJsaW5rIiwicm91dGVkIiwiaGFuZGxlQ2xpY2siLCJlIiwibG9jYWxTdG9yYWdlIiwic2V0SXRlbSIsInByb3BUeXBlcyIsIm5vZGUiLCJpc1JlcXVpcmVkIiwic3RyaW5nIiwiZGVmYXVsdFByb3BzIiwiX2RlZmF1bHQiLCJuYXZpZ2F0ZSIsIm9wdGlvbnMiLCJ3aW5kb3ciLCJfd2luZG93JF9fX2dhdHNieUludGwiLCJfX19nYXRzYnlJbnRsIiwiY2hhbmdlTG9jYWxlIiwicmVtb3ZlUHJlZml4IiwicGF0aG5hbWUiLCJiYXNlIiwiX19CQVNFX1BBVEhfXyIsIl9fUEFUSF9QUkVGSVhfXyIsImluZGV4T2YiLCJzbGljZSIsImxlbmd0aCIsInJlbW92ZUxvY2FsZVBhcnQiLCJpIiwic3Vic3RyaW5nIiwibG9jYXRpb24iLCJzZWFyY2giXSwibWFwcGluZ3MiOiJBQUVBLEdBQUlBLHVCQUFzQixDQUFHQyxtQkFBTyxDQUFDLElBQUQsQ0FBcEMsQ0FFQUMsa0JBQUEsQ0FBcUIsSUFBckIsQ0FDQUEsb0JBQUEsQ0FBdUJBLGdCQUFBLENBQW1CQSxlQUFBLENBQWtCLElBQUssRUFBakUsQ0FFQSxHQUFJQyxVQUFTLENBQUdILHNCQUFzQixD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Q0osTUFBTSxDQUFDZSxRQUFQLENBQWdCVixRQUFqQixDQUFiLENBQXJDLENBQStFO0FBRS9FLEdBQUluQixLQUFJLENBQUcsSUFBTVQsUUFBTixDQUFpQjRCLFFBQWpCLENBQTRCTCxNQUFNLENBQUNlLFFBQVAsQ0FBZ0JDLE1BQXZELENBQ0ExQixZQUFZLENBQUNDLE9BQWIsQ0FBcUIsc0JBQXJCLENBQTZDZCxRQUE3QyxFQUNBLENBQUMsRUFBR0wsT0FBTyxDQUFDMEIsUUFBWixFQUFzQlosSUFBdEIsRUFDRCxDQS9CRCxDQWlDQW5CLG9CQUFBLENBQXVCb0MsWUFBdkIiLCJmaWxlIjoiNDY4Ny5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuY2hhbmdlTG9jYWxlID0gZXhwb3J0cy5uYXZpZ2F0ZSA9IGV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2VcIikpO1xuXG52YXIgX3JlYWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3Byb3BUeXBlcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInByb3AtdHlwZXNcIikpO1xuXG52YXIgX2dhdHNieSA9IHJlcXVpcmUoXCJnYXRzYnlcIik7XG5cbnZhciBfaW50bENvbnRleHQgPSByZXF1aXJlKFwiLi9pbnRsLWNvbnRleHRcIik7XG5cbnZhciBMaW5rID0gZnVuY3Rpb24gTGluayhfcmVmKSB7XG4gIHZhciB0byA9IF9yZWYudG8sXG4gICAgICBsYW5ndWFnZSA9IF9yZWYubGFuZ3VhZ2UsXG4gICAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgICBvbkNsaWNrID0gX3JlZi5vbkNsaWNrLFxuICAgICAgcmVzdCA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZTIuZGVmYXVsdCkoX3JlZiwgW1widG9cIiwgXCJsYW5ndWFnZVwiLCBcImNoaWxkcmVuXCIsIFwib25DbGlja1wiXSk7XG4gIHJldHVybiBfcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KF9pbnRsQ29udGV4dC5JbnRsQ29udGV4dENvbnN1bWVyLCBudWxsLCBmdW5jdGlvbiAoaW50bCkge1xuICAgIHZhciBsYW5ndWFnZUxpbmsgPSBsYW5ndWFnZSB8fCBpbnRsLmxhbmd1YWdlO1xuICAgIHZhciBsaW5rID0gaW50bC5yb3V0ZWQgfHwgbGFuZ3VhZ2UgPyBcIi9cIiArIGxhbmd1YWdlTGluayArIHRvIDogXCJcIiArIHRvO1xuXG4gICAgdmFyIGhhbmRsZUNsaWNrID0gZnVuY3Rpb24gaGFuZGxlQ2xpY2soZSkge1xuICAgICAgaWYgKGxhbmd1YWdlKSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiZ2F0c2J5LWludGwtbGFuZ3VhZ2VcIiwgbGFuZ3VhZ2UpO1xuICAgICAgfVxuXG4gICAgICBpZiAob25DbGljaykge1xuICAgICAgICBvbkNsaWNrKGUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChfZ2F0c2J5LkxpbmssICgwLCBfZXh0ZW5kczIuZGVmYXVsdCkoe30sIHJlc3QsIHtcbiAgICAgIHRvOiBsaW5rLFxuICAgICAgb25DbGljazogaGFuZGxlQ2xpY2tcbiAgICB9KSwgY2hpbGRyZW4pO1xuICB9KTtcbn07XG5cbkxpbmsucHJvcFR5cGVzID0ge1xuICBjaGlsZHJlbjogX3Byb3BUeXBlcy5kZWZhdWx0Lm5vZGUuaXNSZXF1aXJlZCxcbiAgdG86IF9wcm9wVHlwZXMuZGVmYXVsdC5zdHJpbmcsXG4gIGxhbmd1YWdlOiBfcHJvcFR5cGVzLmRlZmF1bHQuc3RyaW5nXG59O1xuTGluay5kZWZhdWx0UHJvcHMgPSB7XG4gIHRvOiBcIlwiXG59O1xudmFyIF9kZWZhdWx0ID0gTGluaztcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0O1xuXG52YXIgbmF2aWdhdGUgPSBmdW5jdGlvbiBuYXZpZ2F0ZSh0bywgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBfd2luZG93JF9fX2dhdHNieUludGwgPSB3aW5kb3cuX19fZ2F0c2J5SW50bCxcbiAgICAgIGxhbmd1YWdlID0gX3dpbmRvdyRfX19nYXRzYnlJbnRsLmxhbmd1YWdlLFxuICAgICAgcm91dGVkID0gX3dpbmRvdyRfX19nYXRzYnlJbnRsLnJvdXRlZDtcbiAgdmFyIGxpbmsgPSByb3V0ZWQgPyBcIi9cIiArIGxhbmd1YWdlICsgdG8gOiBcIlwiICsgdG87XG4gICgwLCBfZ2F0c2J5Lm5hdmlnYXRlKShsaW5rLCBvcHRpb25zKTtcbn07XG5cbmV4cG9ydHMubmF2aWdhdGUgPSBuYXZpZ2F0ZTtcblxudmFyIGNoYW5nZUxvY2FsZSA9IGZ1bmN0aW9uIGNoYW5nZUxvY2FsZShsYW5ndWFnZSwgdG8pIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgcm91dGVkID0gd2luZG93Ll9fX2dhdHNieUludGwucm91dGVkO1xuXG4gIHZhciByZW1vdmVQcmVmaXggPSBmdW5jdGlvbiByZW1vdmVQcmVmaXgocGF0aG5hbWUpIHtcbiAgICB2YXIgYmFzZSA9IHR5cGVvZiBfX0JBU0VfUEFUSF9fICE9PSBcInVuZGVmaW5lZFwiID8gX19CQVNFX1BBVEhfXyA6IF9fUEFUSF9QUkVGSVhfXztcblxuICAgIGlmIChiYXNlICYmIHBhdGhuYW1lLmluZGV4T2YoYmFzZSkgPT09IDApIHtcbiAgICAgIHBhdGhuYW1lID0gcGF0aG5hbWUuc2xpY2UoYmFzZS5sZW5ndGgpO1xuICAgIH1cblxuICAgIHJldHVybiBwYXRobmFtZTtcbiAgfTtcblxuICB2YXIgcmVtb3ZlTG9jYWxlUGFydCA9IGZ1bmN0aW9uIHJlbW92ZUxvY2FsZVBhcnQocGF0aG5hbWUpIHtcbiAgICBpZiAoIXJvdXRlZCkge1xuICAgICAgcmV0dXJuIHBhdGhuYW1lO1xuICAgIH1cblxuICAgIHZhciBpID0gcGF0aG5hbWUuaW5kZXhPZihcIi9cIiwgMSk7XG4gICAgcmV0dXJuIHBhdGhuYW1lLnN1YnN0cmluZyhpKTtcbiAgfTtcblxuICB2YXIgcGF0aG5hbWUgPSB0byB8fCByZW1vdmVMb2NhbGVQYXJ0KHJlbW92ZVByZWZpeCh3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUpKTsgLy8gVE9ETzogY2hlY2sgc2xhc2hcblxuICB2YXIgbGluayA9IFwiL1wiICsgbGFuZ3VhZ2UgKyBwYXRobmFtZSArIHdpbmRvdy5sb2NhdGlvbi5zZWFyY2g7XG4gIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiZ2F0c2J5LWludGwtbGFuZ3VhZ2VcIiwgbGFuZ3VhZ2UpO1xuICAoMCwgX2dhdHNieS5uYXZpZ2F0ZSkobGluayk7XG59O1xuXG5leHBvcnRzLmNoYW5nZUxvY2FsZSA9IGNoYW5nZUxvY2FsZTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///4687\n')},8770:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('var _interopRequireDefault=__webpack_require__(5318);exports.__esModule=true;exports.default=void 0;var _react=_interopRequireDefault(__webpack_require__(7294));var _reactIntl=__webpack_require__(3160);var _default=function _default(Component){return function(props){console.warn("withIntl is deprecated. Please use injectIntl instead.");return _react.default.createElement((0,_reactIntl.injectIntl)(Component),props);};};exports.default=_default;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9nYXRzYnktcGx1Z2luLWludGwvd2l0aC1pbnRsLmpzPzdiNjgiXSwibmFtZXMiOlsiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJleHBvcnRzIiwiX3JlYWN0IiwiX3JlYWN0SW50bCIsIl9kZWZhdWx0IiwiQ29tcG9uZW50IiwicHJvcHMiLCJjb25zb2xlIiwid2FybiIsImRlZmF1bHQiLCJjcmVhdGVFbGVtZW50IiwiaW5qZWN0SW50bCJdLCJtYXBwaW5ncyI6IkFBRUEsR0FBSUEsdUJBQXNCLENBQUdDLG1CQUFPLENBQUMsSUFBRCxDQUFwQyxDQUVBQyxrQkFBQSxDQUFxQixJQUFyQixDQUNBQSxlQUFBLENBQWtCLElBQUssRUFBdkIsQ0FFQSxHQUFJQyxPQUFNLENBQUdILHNCQUFzQixDQUFDQyxtQkFBTyxDQUFDLElBQUQsQ0FBUixDQUFuQyxDQUVBLEdBQUlHLFdBQVUsQ0FBR0gsbUJBQU8sQ0FBQyxJQUFELENBQXhCLENBRUEsR0FBSUksU0FBUSxDQUFHLFFBQVNBLFNBQVQsQ0FBa0JDLFNBQWxCLENBQTZCLENBQzFDLE1BQU8sVUFBVUMsS0FBVixDQUFpQixDQUN0QkMsT0FBTyxDQUFDQyxJQUFSLENBQWEsd0RBQWIsRUFDQSxNQUFPTixPQUFNLENBQUNPLE9BQVAsQ0FBZUMsYUFBZixDQUE2QixDQUFDLEVBQUdQLFVBQVUsQ0FBQ1EsVUFBZixFQUEyQk4sU0FBM0IsQ0FBN0IsQ0FBb0VDLEtBQXBFLENBQVAsQ0FDRCxDQUhELENBSUQsQ0FMRCxDQU9BTCxlQUFBLENBQWtCRyxRQUFsQiIsImZpbGUiOiI4NzcwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX3JlYWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3JlYWN0SW50bCA9IHJlcXVpcmUoXCJyZWFjdC1pbnRsXCIpO1xuXG52YXIgX2RlZmF1bHQgPSBmdW5jdGlvbiBfZGVmYXVsdChDb21wb25lbnQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChwcm9wcykge1xuICAgIGNvbnNvbGUud2FybihcIndpdGhJbnRsIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgaW5qZWN0SW50bCBpbnN0ZWFkLlwiKTtcbiAgICByZXR1cm4gX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudCgoMCwgX3JlYWN0SW50bC5pbmplY3RJbnRsKShDb21wb25lbnQpLCBwcm9wcyk7XG4gIH07XG59O1xuXG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///8770\n')}}]); \ No newline at end of file diff --git a/63e863/component---src-pages-cejst-tsx-c4bb2c7dccab522ec388.js b/63e863/component---src-pages-cejst-tsx-c4bb2c7dccab522ec388.js new file mode 100644 index 00000000..4cda5094 --- /dev/null +++ b/63e863/component---src-pages-cejst-tsx-c4bb2c7dccab522ec388.js @@ -0,0 +1 @@ +(self.webpackChunkjustice40_tool=self.webpackChunkjustice40_tool||[]).push([[281],{9968:function(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "Z": function() { return /* binding */ _arrayWithHoles; }\n/* harmony export */ });\nfunction _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hcnJheVdpdGhIb2xlcy5qcz8wZDIxIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFlO0FBQ2Y7QUFDQSIsImZpbGUiOiI5OTY4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyO1xufSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///9968\n')},8970:function(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "Z": function() { return /* binding */ _nonIterableRest; }\n/* harmony export */ });\nfunction _nonIterableRest() {\n throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9ub25JdGVyYWJsZVJlc3QuanM/M2Q4YyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBZTtBQUNmO0FBQ0EiLCJmaWxlIjoiODk3MC5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///8970\n')},8481:function(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__){"use strict";eval('\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "Z": function() { return /* binding */ _slicedToArray; }\n});\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js\nvar arrayWithHoles = __webpack_require__(9968);\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js\nfunction _iterableToArrayLimit(arr, i) {\n var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];\n\n if (_i == null) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n\n var _s, _e;\n\n try {\n for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i["return"] != null) _i["return"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js\nvar unsupportedIterableToArray = __webpack_require__(2961);\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js\nvar nonIterableRest = __webpack_require__(8970);\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/slicedToArray.js\n\n\n\n\nfunction _slicedToArray(arr, i) {\n return (0,arrayWithHoles/* default */.Z)(arr) || _iterableToArrayLimit(arr, i) || (0,unsupportedIterableToArray/* default */.Z)(arr, i) || (0,nonIterableRest/* default */.Z)();\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pdGVyYWJsZVRvQXJyYXlMaW1pdC5qcz8wOWYwIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXkuanM/MzgzNSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBZTtBQUNmOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsMkJBQTJCLCtCQUErQjtBQUMxRDs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDOzs7Ozs7QUM1QmlEO0FBQ1k7QUFDWTtBQUN0QjtBQUNwQztBQUNmLFNBQVMsaUNBQWMsU0FBUyxxQkFBb0IsWUFBWSw2Q0FBMEIsWUFBWSxrQ0FBZTtBQUNySCIsImZpbGUiOiI4NDgxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkge1xuICB2YXIgX2kgPSBhcnIgPT0gbnVsbCA/IG51bGwgOiB0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIGFycltTeW1ib2wuaXRlcmF0b3JdIHx8IGFycltcIkBAaXRlcmF0b3JcIl07XG5cbiAgaWYgKF9pID09IG51bGwpIHJldHVybjtcbiAgdmFyIF9hcnIgPSBbXTtcbiAgdmFyIF9uID0gdHJ1ZTtcbiAgdmFyIF9kID0gZmFsc2U7XG5cbiAgdmFyIF9zLCBfZTtcblxuICB0cnkge1xuICAgIGZvciAoX2kgPSBfaS5jYWxsKGFycik7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHtcbiAgICAgIF9hcnIucHVzaChfcy52YWx1ZSk7XG5cbiAgICAgIGlmIChpICYmIF9hcnIubGVuZ3RoID09PSBpKSBicmVhaztcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9kID0gdHJ1ZTtcbiAgICBfZSA9IGVycjtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSAhPSBudWxsKSBfaVtcInJldHVyblwiXSgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoX2QpIHRocm93IF9lO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBfYXJyO1xufSIsImltcG9ydCBhcnJheVdpdGhIb2xlcyBmcm9tIFwiLi9hcnJheVdpdGhIb2xlcy5qc1wiO1xuaW1wb3J0IGl0ZXJhYmxlVG9BcnJheUxpbWl0IGZyb20gXCIuL2l0ZXJhYmxlVG9BcnJheUxpbWl0LmpzXCI7XG5pbXBvcnQgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkgZnJvbSBcIi4vdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkuanNcIjtcbmltcG9ydCBub25JdGVyYWJsZVJlc3QgZnJvbSBcIi4vbm9uSXRlcmFibGVSZXN0LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHtcbiAgcmV0dXJuIGFycmF5V2l0aEhvbGVzKGFycikgfHwgaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IG5vbkl0ZXJhYmxlUmVzdCgpO1xufSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///8481\n')},9809:function(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "Z": function() { return /* binding */ _toArray; }\n/* harmony export */ });\n/* harmony import */ var _arrayWithHoles_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(9968);\n/* harmony import */ var _iterableToArray_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6410);\n/* harmony import */ var _unsupportedIterableToArray_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(2961);\n/* harmony import */ var _nonIterableRest_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(8970);\n\n\n\n\nfunction _toArray(arr) {\n return (0,_arrayWithHoles_js__WEBPACK_IMPORTED_MODULE_0__/* .default */ .Z)(arr) || (0,_iterableToArray_js__WEBPACK_IMPORTED_MODULE_1__/* .default */ .Z)(arr) || (0,_unsupportedIterableToArray_js__WEBPACK_IMPORTED_MODULE_2__/* .default */ .Z)(arr) || (0,_nonIterableRest_js__WEBPACK_IMPORTED_MODULE_3__/* .default */ .Z)();\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0FycmF5LmpzPzRmOTYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFpRDtBQUNFO0FBQ3NCO0FBQ3RCO0FBQ3BDO0FBQ2YsU0FBUyxvRUFBYyxTQUFTLHFFQUFlLFNBQVMsZ0ZBQTBCLFNBQVMscUVBQWU7QUFDMUciLCJmaWxlIjoiOTgwOS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhcnJheVdpdGhIb2xlcyBmcm9tIFwiLi9hcnJheVdpdGhIb2xlcy5qc1wiO1xuaW1wb3J0IGl0ZXJhYmxlVG9BcnJheSBmcm9tIFwiLi9pdGVyYWJsZVRvQXJyYXkuanNcIjtcbmltcG9ydCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSBmcm9tIFwiLi91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qc1wiO1xuaW1wb3J0IG5vbkl0ZXJhYmxlUmVzdCBmcm9tIFwiLi9ub25JdGVyYWJsZVJlc3QuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF90b0FycmF5KGFycikge1xuICByZXR1cm4gYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBpdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IG5vbkl0ZXJhYmxlUmVzdCgpO1xufSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///9809\n')},5366:function(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__){"use strict";eval('\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "Z": function() { return /* binding */ _wrapNativeSuper; }\n});\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js\nvar getPrototypeOf = __webpack_require__(7608);\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js\nvar setPrototypeOf = __webpack_require__(4665);\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/isNativeFunction.js\nfunction _isNativeFunction(fn) {\n return Function.toString.call(fn).indexOf("[native code]") !== -1;\n}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/isNativeReflectConstruct.js\nfunction _isNativeReflectConstruct() {\n if (typeof Reflect === "undefined" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === "function") return true;\n\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/construct.js\n\n\nfunction _construct(Parent, args, Class) {\n if (_isNativeReflectConstruct()) {\n _construct = Reflect.construct;\n } else {\n _construct = function _construct(Parent, args, Class) {\n var a = [null];\n a.push.apply(a, args);\n var Constructor = Function.bind.apply(Parent, a);\n var instance = new Constructor();\n if (Class) (0,setPrototypeOf/* default */.Z)(instance, Class.prototype);\n return instance;\n };\n }\n\n return _construct.apply(null, arguments);\n}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/wrapNativeSuper.js\n\n\n\n\nfunction _wrapNativeSuper(Class) {\n var _cache = typeof Map === "function" ? new Map() : undefined;\n\n _wrapNativeSuper = function _wrapNativeSuper(Class) {\n if (Class === null || !_isNativeFunction(Class)) return Class;\n\n if (typeof Class !== "function") {\n throw new TypeError("Super expression must either be null or a function");\n }\n\n if (typeof _cache !== "undefined") {\n if (_cache.has(Class)) return _cache.get(Class);\n\n _cache.set(Class, Wrapper);\n }\n\n function Wrapper() {\n return _construct(Class, arguments, (0,getPrototypeOf/* default */.Z)(this).constructor);\n }\n\n Wrapper.prototype = Object.create(Class.prototype, {\n constructor: {\n value: Wrapper,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n return (0,setPrototypeOf/* default */.Z)(Wrapper, Class);\n };\n\n return _wrapNativeSuper(Class);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pc05hdGl2ZUZ1bmN0aW9uLmpzP2ZhOTUiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0LmpzP2Q5NjciLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY29uc3RydWN0LmpzPzQ0NzgiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vd3JhcE5hdGl2ZVN1cGVyLmpzPzkwNzIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBZTtBQUNmO0FBQ0EsQzs7QUNGZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGdGQUFnRjtBQUNoRjtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsQzs7QUNYaUQ7QUFDb0I7QUFDdEQ7QUFDZixNQUFNLHlCQUF3QjtBQUM5QjtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLGlDQUFjO0FBQy9CO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEM7O0FDakJpRDtBQUNBO0FBQ0k7QUFDZDtBQUN4QjtBQUNmOztBQUVBO0FBQ0EsMkJBQTJCLGlCQUFnQjs7QUFFM0M7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLGFBQWEsVUFBUyxtQkFBbUIsaUNBQWM7QUFDdkQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsV0FBVyxpQ0FBYztBQUN6Qjs7QUFFQTtBQUNBIiwiZmlsZSI6IjUzNjYuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaXNOYXRpdmVGdW5jdGlvbihmbikge1xuICByZXR1cm4gRnVuY3Rpb24udG9TdHJpbmcuY2FsbChmbikuaW5kZXhPZihcIltuYXRpdmUgY29kZV1cIikgIT09IC0xO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTtcbiAgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTtcbiAgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTtcblxuICB0cnkge1xuICAgIEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24gKCkge30pKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufSIsImltcG9ydCBzZXRQcm90b3R5cGVPZiBmcm9tIFwiLi9zZXRQcm90b3R5cGVPZi5qc1wiO1xuaW1wb3J0IGlzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCBmcm9tIFwiLi9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jb25zdHJ1Y3QoUGFyZW50LCBhcmdzLCBDbGFzcykge1xuICBpZiAoaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkpIHtcbiAgICBfY29uc3RydWN0ID0gUmVmbGVjdC5jb25zdHJ1Y3Q7XG4gIH0gZWxzZSB7XG4gICAgX2NvbnN0cnVjdCA9IGZ1bmN0aW9uIF9jb25zdHJ1Y3QoUGFyZW50LCBhcmdzLCBDbGFzcykge1xuICAgICAgdmFyIGEgPSBbbnVsbF07XG4gICAgICBhLnB1c2guYXBwbHkoYSwgYXJncyk7XG4gICAgICB2YXIgQ29uc3RydWN0b3IgPSBGdW5jdGlvbi5iaW5kLmFwcGx5KFBhcmVudCwgYSk7XG4gICAgICB2YXIgaW5zdGFuY2UgPSBuZXcgQ29uc3RydWN0b3IoKTtcbiAgICAgIGlmIChDbGFzcykgc2V0UHJvdG90eXBlT2YoaW5zdGFuY2UsIENsYXNzLnByb3RvdHlwZSk7XG4gICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBfY29uc3RydWN0LmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG59IiwiaW1wb3J0IGdldFByb3RvdHlwZU9mIGZyb20gXCIuL2dldFByb3RvdHlwZU9mLmpzXCI7XG5pbXBvcnQgc2V0UHJvdG90eXBlT2YgZnJvbSBcIi4vc2V0UHJvdG90eXBlT2YuanNcIjtcbmltcG9ydCBpc05hdGl2ZUZ1bmN0aW9uIGZyb20gXCIuL2lzTmF0aXZlRnVuY3Rpb24uanNcIjtcbmltcG9ydCBjb25zdHJ1Y3QgZnJvbSBcIi4vY29uc3RydWN0LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfd3JhcE5hdGl2ZVN1cGVyKENsYXNzKSB7XG4gIHZhciBfY2FjaGUgPSB0eXBlb2YgTWFwID09PSBcImZ1bmN0aW9uXCIgPyBuZXcgTWFwKCkgOiB1bmRlZmluZWQ7XG5cbiAgX3dyYXBOYXRpdmVTdXBlciA9IGZ1bmN0aW9uIF93cmFwTmF0aXZlU3VwZXIoQ2xhc3MpIHtcbiAgICBpZiAoQ2xhc3MgPT09IG51bGwgfHwgIWlzTmF0aXZlRnVuY3Rpb24oQ2xhc3MpKSByZXR1cm4gQ2xhc3M7XG5cbiAgICBpZiAodHlwZW9mIENsYXNzICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIF9jYWNoZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgaWYgKF9jYWNoZS5oYXMoQ2xhc3MpKSByZXR1cm4gX2NhY2hlLmdldChDbGFzcyk7XG5cbiAgICAgIF9jYWNoZS5zZXQoQ2xhc3MsIFdyYXBwZXIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFdyYXBwZXIoKSB7XG4gICAgICByZXR1cm4gY29uc3RydWN0KENsYXNzLCBhcmd1bWVudHMsIGdldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yKTtcbiAgICB9XG5cbiAgICBXcmFwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQ2xhc3MucHJvdG90eXBlLCB7XG4gICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICB2YWx1ZTogV3JhcHBlcixcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gc2V0UHJvdG90eXBlT2YoV3JhcHBlciwgQ2xhc3MpO1xuICB9O1xuXG4gIHJldHVybiBfd3JhcE5hdGl2ZVN1cGVyKENsYXNzKTtcbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5366\n')},3873:function(module){eval("/**\n * chroma.js - JavaScript library for color conversions\n *\n * Copyright (c) 2011-2019, Gregor Aisch\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation\n * and/or other materials provided with the distribution.\n *\n * 3. The name Gregor Aisch may not be used to endorse or promote products\n * derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL GREGOR AISCH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * -------------------------------------------------------\n *\n * chroma.js includes colors from colorbrewer2.org, which are released under\n * the following license:\n *\n * Copyright (c) 2002 Cynthia Brewer, Mark Harrower,\n * and The Pennsylvania State University.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,\n * either express or implied. See the License for the specific\n * language governing permissions and limitations under the License.\n *\n * ------------------------------------------------------\n *\n * Named colors are taken from X11 Color Names.\n * http://www.w3.org/TR/css3-color/#svg-color\n *\n * @preserve\n */\n(function (global, factory) {\n true ? module.exports = factory() : 0;\n})(this, function () {\n 'use strict';\n\n var limit = function limit(x, min, max) {\n if (min === void 0) min = 0;\n if (max === void 0) max = 1;\n return x < min ? min : x > max ? max : x;\n };\n\n var clip_rgb = function clip_rgb(rgb) {\n rgb._clipped = false;\n rgb._unclipped = rgb.slice(0);\n\n for (var i = 0; i <= 3; i++) {\n if (i < 3) {\n if (rgb[i] < 0 || rgb[i] > 255) {\n rgb._clipped = true;\n }\n\n rgb[i] = limit(rgb[i], 0, 255);\n } else if (i === 3) {\n rgb[i] = limit(rgb[i], 0, 1);\n }\n }\n\n return rgb;\n }; // ported from jQuery's $.type\n\n\n var classToType = {};\n\n for (var i = 0, list = ['Boolean', 'Number', 'String', 'Function', 'Array', 'Date', 'RegExp', 'Undefined', 'Null']; i < list.length; i += 1) {\n var name = list[i];\n classToType[\"[object \" + name + \"]\"] = name.toLowerCase();\n }\n\n var type = function type(obj) {\n return classToType[Object.prototype.toString.call(obj)] || \"object\";\n };\n\n var unpack = function unpack(args, keyOrder) {\n if (keyOrder === void 0) keyOrder = null; // if called with more than 3 arguments, we return the arguments\n\n if (args.length >= 3) {\n return Array.prototype.slice.call(args);\n } // with less than 3 args we check if first arg is object\n // and use the keyOrder string to extract and sort properties\n\n\n if (type(args[0]) == 'object' && keyOrder) {\n return keyOrder.split('').filter(function (k) {\n return args[0][k] !== undefined;\n }).map(function (k) {\n return args[0][k];\n });\n } // otherwise we just return the first argument\n // (which we suppose is an array of args)\n\n\n return args[0];\n };\n\n var last = function last(args) {\n if (args.length < 2) {\n return null;\n }\n\n var l = args.length - 1;\n\n if (type(args[l]) == 'string') {\n return args[l].toLowerCase();\n }\n\n return null;\n };\n\n var PI = Math.PI;\n var utils = {\n clip_rgb: clip_rgb,\n limit: limit,\n type: type,\n unpack: unpack,\n last: last,\n PI: PI,\n TWOPI: PI * 2,\n PITHIRD: PI / 3,\n DEG2RAD: PI / 180,\n RAD2DEG: 180 / PI\n };\n var input = {\n format: {},\n autodetect: []\n };\n var last$1 = utils.last;\n var clip_rgb$1 = utils.clip_rgb;\n var type$1 = utils.type;\n\n var Color = function Color() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n var me = this;\n\n if (type$1(args[0]) === 'object' && args[0].constructor && args[0].constructor === this.constructor) {\n // the argument is already a Color instance\n return args[0];\n } // last argument could be the mode\n\n\n var mode = last$1(args);\n var autodetect = false;\n\n if (!mode) {\n autodetect = true;\n\n if (!input.sorted) {\n input.autodetect = input.autodetect.sort(function (a, b) {\n return b.p - a.p;\n });\n input.sorted = true;\n } // auto-detect format\n\n\n for (var i = 0, list = input.autodetect; i < list.length; i += 1) {\n var chk = list[i];\n mode = chk.test.apply(chk, args);\n\n if (mode) {\n break;\n }\n }\n }\n\n if (input.format[mode]) {\n var rgb = input.format[mode].apply(null, autodetect ? args : args.slice(0, -1));\n me._rgb = clip_rgb$1(rgb);\n } else {\n throw new Error('unknown format: ' + args);\n } // add alpha channel\n\n\n if (me._rgb.length === 3) {\n me._rgb.push(1);\n }\n };\n\n Color.prototype.toString = function toString() {\n if (type$1(this.hex) == 'function') {\n return this.hex();\n }\n\n return \"[\" + this._rgb.join(',') + \"]\";\n };\n\n var Color_1 = Color;\n\n var chroma = function chroma() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n return new (Function.prototype.bind.apply(chroma.Color, [null].concat(args)))();\n };\n\n chroma.Color = Color_1;\n chroma.version = '2.1.2';\n var chroma_1 = chroma;\n var unpack$1 = utils.unpack;\n var max = Math.max;\n\n var rgb2cmyk = function rgb2cmyk() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n var ref = unpack$1(args, 'rgb');\n var r = ref[0];\n var g = ref[1];\n var b = ref[2];\n r = r / 255;\n g = g / 255;\n b = b / 255;\n var k = 1 - max(r, max(g, b));\n var f = k < 1 ? 1 / (1 - k) : 0;\n var c = (1 - r - k) * f;\n var m = (1 - g - k) * f;\n var y = (1 - b - k) * f;\n return [c, m, y, k];\n };\n\n var rgb2cmyk_1 = rgb2cmyk;\n var unpack$2 = utils.unpack;\n\n var cmyk2rgb = function cmyk2rgb() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n args = unpack$2(args, 'cmyk');\n var c = args[0];\n var m = args[1];\n var y = args[2];\n var k = args[3];\n var alpha = args.length > 4 ? args[4] : 1;\n\n if (k === 1) {\n return [0, 0, 0, alpha];\n }\n\n return [c >= 1 ? 0 : 255 * (1 - c) * (1 - k), // r\n m >= 1 ? 0 : 255 * (1 - m) * (1 - k), // g\n y >= 1 ? 0 : 255 * (1 - y) * (1 - k), // b\n alpha];\n };\n\n var cmyk2rgb_1 = cmyk2rgb;\n var unpack$3 = utils.unpack;\n var type$2 = utils.type;\n\n Color_1.prototype.cmyk = function () {\n return rgb2cmyk_1(this._rgb);\n };\n\n chroma_1.cmyk = function () {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n return new (Function.prototype.bind.apply(Color_1, [null].concat(args, ['cmyk'])))();\n };\n\n input.format.cmyk = cmyk2rgb_1;\n input.autodetect.push({\n p: 2,\n test: function test() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n args = unpack$3(args, 'cmyk');\n\n if (type$2(args) === 'array' && args.length === 4) {\n return 'cmyk';\n }\n }\n });\n var unpack$4 = utils.unpack;\n var last$2 = utils.last;\n\n var rnd = function rnd(a) {\n return Math.round(a * 100) / 100;\n };\n /*\n * supported arguments:\n * - hsl2css(h,s,l)\n * - hsl2css(h,s,l,a)\n * - hsl2css([h,s,l], mode)\n * - hsl2css([h,s,l,a], mode)\n * - hsl2css({h,s,l,a}, mode)\n */\n\n\n var hsl2css = function hsl2css() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n var hsla = unpack$4(args, 'hsla');\n var mode = last$2(args) || 'lsa';\n hsla[0] = rnd(hsla[0] || 0);\n hsla[1] = rnd(hsla[1] * 100) + '%';\n hsla[2] = rnd(hsla[2] * 100) + '%';\n\n if (mode === 'hsla' || hsla.length > 3 && hsla[3] < 1) {\n hsla[3] = hsla.length > 3 ? hsla[3] : 1;\n mode = 'hsla';\n } else {\n hsla.length = 3;\n }\n\n return mode + \"(\" + hsla.join(',') + \")\";\n };\n\n var hsl2css_1 = hsl2css;\n var unpack$5 = utils.unpack;\n /*\n * supported arguments:\n * - rgb2hsl(r,g,b)\n * - rgb2hsl(r,g,b,a)\n * - rgb2hsl([r,g,b])\n * - rgb2hsl([r,g,b,a])\n * - rgb2hsl({r,g,b,a})\n */\n\n var rgb2hsl = function rgb2hsl() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n args = unpack$5(args, 'rgba');\n var r = args[0];\n var g = args[1];\n var b = args[2];\n r /= 255;\n g /= 255;\n b /= 255;\n var min = Math.min(r, g, b);\n var max = Math.max(r, g, b);\n var l = (max + min) / 2;\n var s, h;\n\n if (max === min) {\n s = 0;\n h = Number.NaN;\n } else {\n s = l < 0.5 ? (max - min) / (max + min) : (max - min) / (2 - max - min);\n }\n\n if (r == max) {\n h = (g - b) / (max - min);\n } else if (g == max) {\n h = 2 + (b - r) / (max - min);\n } else if (b == max) {\n h = 4 + (r - g) / (max - min);\n }\n\n h *= 60;\n\n if (h < 0) {\n h += 360;\n }\n\n if (args.length > 3 && args[3] !== undefined) {\n return [h, s, l, args[3]];\n }\n\n return [h, s, l];\n };\n\n var rgb2hsl_1 = rgb2hsl;\n var unpack$6 = utils.unpack;\n var last$3 = utils.last;\n var round = Math.round;\n /*\n * supported arguments:\n * - rgb2css(r,g,b)\n * - rgb2css(r,g,b,a)\n * - rgb2css([r,g,b], mode)\n * - rgb2css([r,g,b,a], mode)\n * - rgb2css({r,g,b,a}, mode)\n */\n\n var rgb2css = function rgb2css() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n var rgba = unpack$6(args, 'rgba');\n var mode = last$3(args) || 'rgb';\n\n if (mode.substr(0, 3) == 'hsl') {\n return hsl2css_1(rgb2hsl_1(rgba), mode);\n }\n\n rgba[0] = round(rgba[0]);\n rgba[1] = round(rgba[1]);\n rgba[2] = round(rgba[2]);\n\n if (mode === 'rgba' || rgba.length > 3 && rgba[3] < 1) {\n rgba[3] = rgba.length > 3 ? rgba[3] : 1;\n mode = 'rgba';\n }\n\n return mode + \"(\" + rgba.slice(0, mode === 'rgb' ? 3 : 4).join(',') + \")\";\n };\n\n var rgb2css_1 = rgb2css;\n var unpack$7 = utils.unpack;\n var round$1 = Math.round;\n\n var hsl2rgb = function hsl2rgb() {\n var assign;\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n args = unpack$7(args, 'hsl');\n var h = args[0];\n var s = args[1];\n var l = args[2];\n var r, g, b;\n\n if (s === 0) {\n r = g = b = l * 255;\n } else {\n var t3 = [0, 0, 0];\n var c = [0, 0, 0];\n var t2 = l < 0.5 ? l * (1 + s) : l + s - l * s;\n var t1 = 2 * l - t2;\n var h_ = h / 360;\n t3[0] = h_ + 1 / 3;\n t3[1] = h_;\n t3[2] = h_ - 1 / 3;\n\n for (var i = 0; i < 3; i++) {\n if (t3[i] < 0) {\n t3[i] += 1;\n }\n\n if (t3[i] > 1) {\n t3[i] -= 1;\n }\n\n if (6 * t3[i] < 1) {\n c[i] = t1 + (t2 - t1) * 6 * t3[i];\n } else if (2 * t3[i] < 1) {\n c[i] = t2;\n } else if (3 * t3[i] < 2) {\n c[i] = t1 + (t2 - t1) * (2 / 3 - t3[i]) * 6;\n } else {\n c[i] = t1;\n }\n }\n\n assign = [round$1(c[0] * 255), round$1(c[1] * 255), round$1(c[2] * 255)], r = assign[0], g = assign[1], b = assign[2];\n }\n\n if (args.length > 3) {\n // keep alpha channel\n return [r, g, b, args[3]];\n }\n\n return [r, g, b, 1];\n };\n\n var hsl2rgb_1 = hsl2rgb;\n var RE_RGB = /^rgb\\(\\s*(-?\\d+),\\s*(-?\\d+)\\s*,\\s*(-?\\d+)\\s*\\)$/;\n var RE_RGBA = /^rgba\\(\\s*(-?\\d+),\\s*(-?\\d+)\\s*,\\s*(-?\\d+)\\s*,\\s*([01]|[01]?\\.\\d+)\\)$/;\n var RE_RGB_PCT = /^rgb\\(\\s*(-?\\d+(?:\\.\\d+)?)%,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*\\)$/;\n var RE_RGBA_PCT = /^rgba\\(\\s*(-?\\d+(?:\\.\\d+)?)%,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*([01]|[01]?\\.\\d+)\\)$/;\n var RE_HSL = /^hsl\\(\\s*(-?\\d+(?:\\.\\d+)?),\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*\\)$/;\n var RE_HSLA = /^hsla\\(\\s*(-?\\d+(?:\\.\\d+)?),\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*([01]|[01]?\\.\\d+)\\)$/;\n var round$2 = Math.round;\n\n var css2rgb = function css2rgb(css) {\n css = css.toLowerCase().trim();\n var m;\n\n if (input.format.named) {\n try {\n return input.format.named(css);\n } catch (e) {// eslint-disable-next-line\n }\n } // rgb(250,20,0)\n\n\n if (m = css.match(RE_RGB)) {\n var rgb = m.slice(1, 4);\n\n for (var i = 0; i < 3; i++) {\n rgb[i] = +rgb[i];\n }\n\n rgb[3] = 1; // default alpha\n\n return rgb;\n } // rgba(250,20,0,0.4)\n\n\n if (m = css.match(RE_RGBA)) {\n var rgb$1 = m.slice(1, 5);\n\n for (var i$1 = 0; i$1 < 4; i$1++) {\n rgb$1[i$1] = +rgb$1[i$1];\n }\n\n return rgb$1;\n } // rgb(100%,0%,0%)\n\n\n if (m = css.match(RE_RGB_PCT)) {\n var rgb$2 = m.slice(1, 4);\n\n for (var i$2 = 0; i$2 < 3; i$2++) {\n rgb$2[i$2] = round$2(rgb$2[i$2] * 2.55);\n }\n\n rgb$2[3] = 1; // default alpha\n\n return rgb$2;\n } // rgba(100%,0%,0%,0.4)\n\n\n if (m = css.match(RE_RGBA_PCT)) {\n var rgb$3 = m.slice(1, 5);\n\n for (var i$3 = 0; i$3 < 3; i$3++) {\n rgb$3[i$3] = round$2(rgb$3[i$3] * 2.55);\n }\n\n rgb$3[3] = +rgb$3[3];\n return rgb$3;\n } // hsl(0,100%,50%)\n\n\n if (m = css.match(RE_HSL)) {\n var hsl = m.slice(1, 4);\n hsl[1] *= 0.01;\n hsl[2] *= 0.01;\n var rgb$4 = hsl2rgb_1(hsl);\n rgb$4[3] = 1;\n return rgb$4;\n } // hsla(0,100%,50%,0.5)\n\n\n if (m = css.match(RE_HSLA)) {\n var hsl$1 = m.slice(1, 4);\n hsl$1[1] *= 0.01;\n hsl$1[2] *= 0.01;\n var rgb$5 = hsl2rgb_1(hsl$1);\n rgb$5[3] = +m[4]; // default alpha = 1\n\n return rgb$5;\n }\n };\n\n css2rgb.test = function (s) {\n return RE_RGB.test(s) || RE_RGBA.test(s) || RE_RGB_PCT.test(s) || RE_RGBA_PCT.test(s) || RE_HSL.test(s) || RE_HSLA.test(s);\n };\n\n var css2rgb_1 = css2rgb;\n var type$3 = utils.type;\n\n Color_1.prototype.css = function (mode) {\n return rgb2css_1(this._rgb, mode);\n };\n\n chroma_1.css = function () {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n return new (Function.prototype.bind.apply(Color_1, [null].concat(args, ['css'])))();\n };\n\n input.format.css = css2rgb_1;\n input.autodetect.push({\n p: 5,\n test: function test(h) {\n var rest = [],\n len = arguments.length - 1;\n\n while (len-- > 0) {\n rest[len] = arguments[len + 1];\n }\n\n if (!rest.length && type$3(h) === 'string' && css2rgb_1.test(h)) {\n return 'css';\n }\n }\n });\n var unpack$8 = utils.unpack;\n\n input.format.gl = function () {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n var rgb = unpack$8(args, 'rgba');\n rgb[0] *= 255;\n rgb[1] *= 255;\n rgb[2] *= 255;\n return rgb;\n };\n\n chroma_1.gl = function () {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n return new (Function.prototype.bind.apply(Color_1, [null].concat(args, ['gl'])))();\n };\n\n Color_1.prototype.gl = function () {\n var rgb = this._rgb;\n return [rgb[0] / 255, rgb[1] / 255, rgb[2] / 255, rgb[3]];\n };\n\n var unpack$9 = utils.unpack;\n\n var rgb2hcg = function rgb2hcg() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n var ref = unpack$9(args, 'rgb');\n var r = ref[0];\n var g = ref[1];\n var b = ref[2];\n var min = Math.min(r, g, b);\n var max = Math.max(r, g, b);\n var delta = max - min;\n var c = delta * 100 / 255;\n\n var _g = min / (255 - delta) * 100;\n\n var h;\n\n if (delta === 0) {\n h = Number.NaN;\n } else {\n if (r === max) {\n h = (g - b) / delta;\n }\n\n if (g === max) {\n h = 2 + (b - r) / delta;\n }\n\n if (b === max) {\n h = 4 + (r - g) / delta;\n }\n\n h *= 60;\n\n if (h < 0) {\n h += 360;\n }\n }\n\n return [h, c, _g];\n };\n\n var rgb2hcg_1 = rgb2hcg;\n var unpack$a = utils.unpack;\n var floor = Math.floor;\n /*\n * this is basically just HSV with some minor tweaks\n *\n * hue.. [0..360]\n * chroma .. [0..1]\n * grayness .. [0..1]\n */\n\n var hcg2rgb = function hcg2rgb() {\n var assign, assign$1, assign$2, assign$3, assign$4, assign$5;\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n args = unpack$a(args, 'hcg');\n var h = args[0];\n var c = args[1];\n var _g = args[2];\n var r, g, b;\n _g = _g * 255;\n\n var _c = c * 255;\n\n if (c === 0) {\n r = g = b = _g;\n } else {\n if (h === 360) {\n h = 0;\n }\n\n if (h > 360) {\n h -= 360;\n }\n\n if (h < 0) {\n h += 360;\n }\n\n h /= 60;\n var i = floor(h);\n var f = h - i;\n var p = _g * (1 - c);\n var q = p + _c * (1 - f);\n var t = p + _c * f;\n var v = p + _c;\n\n switch (i) {\n case 0:\n assign = [v, t, p], r = assign[0], g = assign[1], b = assign[2];\n break;\n\n case 1:\n assign$1 = [q, v, p], r = assign$1[0], g = assign$1[1], b = assign$1[2];\n break;\n\n case 2:\n assign$2 = [p, v, t], r = assign$2[0], g = assign$2[1], b = assign$2[2];\n break;\n\n case 3:\n assign$3 = [p, q, v], r = assign$3[0], g = assign$3[1], b = assign$3[2];\n break;\n\n case 4:\n assign$4 = [t, p, v], r = assign$4[0], g = assign$4[1], b = assign$4[2];\n break;\n\n case 5:\n assign$5 = [v, p, q], r = assign$5[0], g = assign$5[1], b = assign$5[2];\n break;\n }\n }\n\n return [r, g, b, args.length > 3 ? args[3] : 1];\n };\n\n var hcg2rgb_1 = hcg2rgb;\n var unpack$b = utils.unpack;\n var type$4 = utils.type;\n\n Color_1.prototype.hcg = function () {\n return rgb2hcg_1(this._rgb);\n };\n\n chroma_1.hcg = function () {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n return new (Function.prototype.bind.apply(Color_1, [null].concat(args, ['hcg'])))();\n };\n\n input.format.hcg = hcg2rgb_1;\n input.autodetect.push({\n p: 1,\n test: function test() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n args = unpack$b(args, 'hcg');\n\n if (type$4(args) === 'array' && args.length === 3) {\n return 'hcg';\n }\n }\n });\n var unpack$c = utils.unpack;\n var last$4 = utils.last;\n var round$3 = Math.round;\n\n var rgb2hex = function rgb2hex() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n var ref = unpack$c(args, 'rgba');\n var r = ref[0];\n var g = ref[1];\n var b = ref[2];\n var a = ref[3];\n var mode = last$4(args) || 'auto';\n\n if (a === undefined) {\n a = 1;\n }\n\n if (mode === 'auto') {\n mode = a < 1 ? 'rgba' : 'rgb';\n }\n\n r = round$3(r);\n g = round$3(g);\n b = round$3(b);\n var u = r << 16 | g << 8 | b;\n var str = \"000000\" + u.toString(16); //#.toUpperCase();\n\n str = str.substr(str.length - 6);\n var hxa = '0' + round$3(a * 255).toString(16);\n hxa = hxa.substr(hxa.length - 2);\n\n switch (mode.toLowerCase()) {\n case 'rgba':\n return \"#\" + str + hxa;\n\n case 'argb':\n return \"#\" + hxa + str;\n\n default:\n return \"#\" + str;\n }\n };\n\n var rgb2hex_1 = rgb2hex;\n var RE_HEX = /^#?([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/;\n var RE_HEXA = /^#?([A-Fa-f0-9]{8}|[A-Fa-f0-9]{4})$/;\n\n var hex2rgb = function hex2rgb(hex) {\n if (hex.match(RE_HEX)) {\n // remove optional leading #\n if (hex.length === 4 || hex.length === 7) {\n hex = hex.substr(1);\n } // expand short-notation to full six-digit\n\n\n if (hex.length === 3) {\n hex = hex.split('');\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\n }\n\n var u = parseInt(hex, 16);\n var r = u >> 16;\n var g = u >> 8 & 0xFF;\n var b = u & 0xFF;\n return [r, g, b, 1];\n } // match rgba hex format, eg #FF000077\n\n\n if (hex.match(RE_HEXA)) {\n if (hex.length === 5 || hex.length === 9) {\n // remove optional leading #\n hex = hex.substr(1);\n } // expand short-notation to full eight-digit\n\n\n if (hex.length === 4) {\n hex = hex.split('');\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2] + hex[3] + hex[3];\n }\n\n var u$1 = parseInt(hex, 16);\n var r$1 = u$1 >> 24 & 0xFF;\n var g$1 = u$1 >> 16 & 0xFF;\n var b$1 = u$1 >> 8 & 0xFF;\n var a = Math.round((u$1 & 0xFF) / 0xFF * 100) / 100;\n return [r$1, g$1, b$1, a];\n } // we used to check for css colors here\n // if _input.css? and rgb = _input.css hex\n // return rgb\n\n\n throw new Error(\"unknown hex color: \" + hex);\n };\n\n var hex2rgb_1 = hex2rgb;\n var type$5 = utils.type;\n\n Color_1.prototype.hex = function (mode) {\n return rgb2hex_1(this._rgb, mode);\n };\n\n chroma_1.hex = function () {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n return new (Function.prototype.bind.apply(Color_1, [null].concat(args, ['hex'])))();\n };\n\n input.format.hex = hex2rgb_1;\n input.autodetect.push({\n p: 4,\n test: function test(h) {\n var rest = [],\n len = arguments.length - 1;\n\n while (len-- > 0) {\n rest[len] = arguments[len + 1];\n }\n\n if (!rest.length && type$5(h) === 'string' && [3, 4, 5, 6, 7, 8, 9].indexOf(h.length) >= 0) {\n return 'hex';\n }\n }\n });\n var unpack$d = utils.unpack;\n var TWOPI = utils.TWOPI;\n var min = Math.min;\n var sqrt = Math.sqrt;\n var acos = Math.acos;\n\n var rgb2hsi = function rgb2hsi() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n /*\n borrowed from here:\n http://hummer.stanford.edu/museinfo/doc/examples/humdrum/keyscape2/rgb2hsi.cpp\n */\n\n\n var ref = unpack$d(args, 'rgb');\n var r = ref[0];\n var g = ref[1];\n var b = ref[2];\n r /= 255;\n g /= 255;\n b /= 255;\n var h;\n var min_ = min(r, g, b);\n var i = (r + g + b) / 3;\n var s = i > 0 ? 1 - min_ / i : 0;\n\n if (s === 0) {\n h = NaN;\n } else {\n h = (r - g + (r - b)) / 2;\n h /= sqrt((r - g) * (r - g) + (r - b) * (g - b));\n h = acos(h);\n\n if (b > g) {\n h = TWOPI - h;\n }\n\n h /= TWOPI;\n }\n\n return [h * 360, s, i];\n };\n\n var rgb2hsi_1 = rgb2hsi;\n var unpack$e = utils.unpack;\n var limit$1 = utils.limit;\n var TWOPI$1 = utils.TWOPI;\n var PITHIRD = utils.PITHIRD;\n var cos = Math.cos;\n /*\n * hue [0..360]\n * saturation [0..1]\n * intensity [0..1]\n */\n\n var hsi2rgb = function hsi2rgb() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n /*\n borrowed from here:\n http://hummer.stanford.edu/museinfo/doc/examples/humdrum/keyscape2/hsi2rgb.cpp\n */\n\n\n args = unpack$e(args, 'hsi');\n var h = args[0];\n var s = args[1];\n var i = args[2];\n var r, g, b;\n\n if (isNaN(h)) {\n h = 0;\n }\n\n if (isNaN(s)) {\n s = 0;\n } // normalize hue\n\n\n if (h > 360) {\n h -= 360;\n }\n\n if (h < 0) {\n h += 360;\n }\n\n h /= 360;\n\n if (h < 1 / 3) {\n b = (1 - s) / 3;\n r = (1 + s * cos(TWOPI$1 * h) / cos(PITHIRD - TWOPI$1 * h)) / 3;\n g = 1 - (b + r);\n } else if (h < 2 / 3) {\n h -= 1 / 3;\n r = (1 - s) / 3;\n g = (1 + s * cos(TWOPI$1 * h) / cos(PITHIRD - TWOPI$1 * h)) / 3;\n b = 1 - (r + g);\n } else {\n h -= 2 / 3;\n g = (1 - s) / 3;\n b = (1 + s * cos(TWOPI$1 * h) / cos(PITHIRD - TWOPI$1 * h)) / 3;\n r = 1 - (g + b);\n }\n\n r = limit$1(i * r * 3);\n g = limit$1(i * g * 3);\n b = limit$1(i * b * 3);\n return [r * 255, g * 255, b * 255, args.length > 3 ? args[3] : 1];\n };\n\n var hsi2rgb_1 = hsi2rgb;\n var unpack$f = utils.unpack;\n var type$6 = utils.type;\n\n Color_1.prototype.hsi = function () {\n return rgb2hsi_1(this._rgb);\n };\n\n chroma_1.hsi = function () {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n return new (Function.prototype.bind.apply(Color_1, [null].concat(args, ['hsi'])))();\n };\n\n input.format.hsi = hsi2rgb_1;\n input.autodetect.push({\n p: 2,\n test: function test() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n args = unpack$f(args, 'hsi');\n\n if (type$6(args) === 'array' && args.length === 3) {\n return 'hsi';\n }\n }\n });\n var unpack$g = utils.unpack;\n var type$7 = utils.type;\n\n Color_1.prototype.hsl = function () {\n return rgb2hsl_1(this._rgb);\n };\n\n chroma_1.hsl = function () {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n return new (Function.prototype.bind.apply(Color_1, [null].concat(args, ['hsl'])))();\n };\n\n input.format.hsl = hsl2rgb_1;\n input.autodetect.push({\n p: 2,\n test: function test() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n args = unpack$g(args, 'hsl');\n\n if (type$7(args) === 'array' && args.length === 3) {\n return 'hsl';\n }\n }\n });\n var unpack$h = utils.unpack;\n var min$1 = Math.min;\n var max$1 = Math.max;\n /*\n * supported arguments:\n * - rgb2hsv(r,g,b)\n * - rgb2hsv([r,g,b])\n * - rgb2hsv({r,g,b})\n */\n\n var rgb2hsl$1 = function rgb2hsl$1() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n args = unpack$h(args, 'rgb');\n var r = args[0];\n var g = args[1];\n var b = args[2];\n var min_ = min$1(r, g, b);\n var max_ = max$1(r, g, b);\n var delta = max_ - min_;\n var h, s, v;\n v = max_ / 255.0;\n\n if (max_ === 0) {\n h = Number.NaN;\n s = 0;\n } else {\n s = delta / max_;\n\n if (r === max_) {\n h = (g - b) / delta;\n }\n\n if (g === max_) {\n h = 2 + (b - r) / delta;\n }\n\n if (b === max_) {\n h = 4 + (r - g) / delta;\n }\n\n h *= 60;\n\n if (h < 0) {\n h += 360;\n }\n }\n\n return [h, s, v];\n };\n\n var rgb2hsv = rgb2hsl$1;\n var unpack$i = utils.unpack;\n var floor$1 = Math.floor;\n\n var hsv2rgb = function hsv2rgb() {\n var assign, assign$1, assign$2, assign$3, assign$4, assign$5;\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n args = unpack$i(args, 'hsv');\n var h = args[0];\n var s = args[1];\n var v = args[2];\n var r, g, b;\n v *= 255;\n\n if (s === 0) {\n r = g = b = v;\n } else {\n if (h === 360) {\n h = 0;\n }\n\n if (h > 360) {\n h -= 360;\n }\n\n if (h < 0) {\n h += 360;\n }\n\n h /= 60;\n var i = floor$1(h);\n var f = h - i;\n var p = v * (1 - s);\n var q = v * (1 - s * f);\n var t = v * (1 - s * (1 - f));\n\n switch (i) {\n case 0:\n assign = [v, t, p], r = assign[0], g = assign[1], b = assign[2];\n break;\n\n case 1:\n assign$1 = [q, v, p], r = assign$1[0], g = assign$1[1], b = assign$1[2];\n break;\n\n case 2:\n assign$2 = [p, v, t], r = assign$2[0], g = assign$2[1], b = assign$2[2];\n break;\n\n case 3:\n assign$3 = [p, q, v], r = assign$3[0], g = assign$3[1], b = assign$3[2];\n break;\n\n case 4:\n assign$4 = [t, p, v], r = assign$4[0], g = assign$4[1], b = assign$4[2];\n break;\n\n case 5:\n assign$5 = [v, p, q], r = assign$5[0], g = assign$5[1], b = assign$5[2];\n break;\n }\n }\n\n return [r, g, b, args.length > 3 ? args[3] : 1];\n };\n\n var hsv2rgb_1 = hsv2rgb;\n var unpack$j = utils.unpack;\n var type$8 = utils.type;\n\n Color_1.prototype.hsv = function () {\n return rgb2hsv(this._rgb);\n };\n\n chroma_1.hsv = function () {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n return new (Function.prototype.bind.apply(Color_1, [null].concat(args, ['hsv'])))();\n };\n\n input.format.hsv = hsv2rgb_1;\n input.autodetect.push({\n p: 2,\n test: function test() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n args = unpack$j(args, 'hsv');\n\n if (type$8(args) === 'array' && args.length === 3) {\n return 'hsv';\n }\n }\n });\n var labConstants = {\n // Corresponds roughly to RGB brighter/darker\n Kn: 18,\n // D65 standard referent\n Xn: 0.950470,\n Yn: 1,\n Zn: 1.088830,\n t0: 0.137931034,\n // 4 / 29\n t1: 0.206896552,\n // 6 / 29\n t2: 0.12841855,\n // 3 * t1 * t1\n t3: 0.008856452 // t1 * t1 * t1\n\n };\n var unpack$k = utils.unpack;\n var pow = Math.pow;\n\n var rgb2lab = function rgb2lab() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n var ref = unpack$k(args, 'rgb');\n var r = ref[0];\n var g = ref[1];\n var b = ref[2];\n var ref$1 = rgb2xyz(r, g, b);\n var x = ref$1[0];\n var y = ref$1[1];\n var z = ref$1[2];\n var l = 116 * y - 16;\n return [l < 0 ? 0 : l, 500 * (x - y), 200 * (y - z)];\n };\n\n var rgb_xyz = function rgb_xyz(r) {\n if ((r /= 255) <= 0.04045) {\n return r / 12.92;\n }\n\n return pow((r + 0.055) / 1.055, 2.4);\n };\n\n var xyz_lab = function xyz_lab(t) {\n if (t > labConstants.t3) {\n return pow(t, 1 / 3);\n }\n\n return t / labConstants.t2 + labConstants.t0;\n };\n\n var rgb2xyz = function rgb2xyz(r, g, b) {\n r = rgb_xyz(r);\n g = rgb_xyz(g);\n b = rgb_xyz(b);\n var x = xyz_lab((0.4124564 * r + 0.3575761 * g + 0.1804375 * b) / labConstants.Xn);\n var y = xyz_lab((0.2126729 * r + 0.7151522 * g + 0.0721750 * b) / labConstants.Yn);\n var z = xyz_lab((0.0193339 * r + 0.1191920 * g + 0.9503041 * b) / labConstants.Zn);\n return [x, y, z];\n };\n\n var rgb2lab_1 = rgb2lab;\n var unpack$l = utils.unpack;\n var pow$1 = Math.pow;\n /*\n * L* [0..100]\n * a [-100..100]\n * b [-100..100]\n */\n\n var lab2rgb = function lab2rgb() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n args = unpack$l(args, 'lab');\n var l = args[0];\n var a = args[1];\n var b = args[2];\n var x, y, z, r, g, b_;\n y = (l + 16) / 116;\n x = isNaN(a) ? y : y + a / 500;\n z = isNaN(b) ? y : y - b / 200;\n y = labConstants.Yn * lab_xyz(y);\n x = labConstants.Xn * lab_xyz(x);\n z = labConstants.Zn * lab_xyz(z);\n r = xyz_rgb(3.2404542 * x - 1.5371385 * y - 0.4985314 * z); // D65 -> sRGB\n\n g = xyz_rgb(-0.9692660 * x + 1.8760108 * y + 0.0415560 * z);\n b_ = xyz_rgb(0.0556434 * x - 0.2040259 * y + 1.0572252 * z);\n return [r, g, b_, args.length > 3 ? args[3] : 1];\n };\n\n var xyz_rgb = function xyz_rgb(r) {\n return 255 * (r <= 0.00304 ? 12.92 * r : 1.055 * pow$1(r, 1 / 2.4) - 0.055);\n };\n\n var lab_xyz = function lab_xyz(t) {\n return t > labConstants.t1 ? t * t * t : labConstants.t2 * (t - labConstants.t0);\n };\n\n var lab2rgb_1 = lab2rgb;\n var unpack$m = utils.unpack;\n var type$9 = utils.type;\n\n Color_1.prototype.lab = function () {\n return rgb2lab_1(this._rgb);\n };\n\n chroma_1.lab = function () {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n return new (Function.prototype.bind.apply(Color_1, [null].concat(args, ['lab'])))();\n };\n\n input.format.lab = lab2rgb_1;\n input.autodetect.push({\n p: 2,\n test: function test() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n args = unpack$m(args, 'lab');\n\n if (type$9(args) === 'array' && args.length === 3) {\n return 'lab';\n }\n }\n });\n var unpack$n = utils.unpack;\n var RAD2DEG = utils.RAD2DEG;\n var sqrt$1 = Math.sqrt;\n var atan2 = Math.atan2;\n var round$4 = Math.round;\n\n var lab2lch = function lab2lch() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n var ref = unpack$n(args, 'lab');\n var l = ref[0];\n var a = ref[1];\n var b = ref[2];\n var c = sqrt$1(a * a + b * b);\n var h = (atan2(b, a) * RAD2DEG + 360) % 360;\n\n if (round$4(c * 10000) === 0) {\n h = Number.NaN;\n }\n\n return [l, c, h];\n };\n\n var lab2lch_1 = lab2lch;\n var unpack$o = utils.unpack;\n\n var rgb2lch = function rgb2lch() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n var ref = unpack$o(args, 'rgb');\n var r = ref[0];\n var g = ref[1];\n var b = ref[2];\n var ref$1 = rgb2lab_1(r, g, b);\n var l = ref$1[0];\n var a = ref$1[1];\n var b_ = ref$1[2];\n return lab2lch_1(l, a, b_);\n };\n\n var rgb2lch_1 = rgb2lch;\n var unpack$p = utils.unpack;\n var DEG2RAD = utils.DEG2RAD;\n var sin = Math.sin;\n var cos$1 = Math.cos;\n\n var lch2lab = function lch2lab() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n /*\n Convert from a qualitative parameter h and a quantitative parameter l to a 24-bit pixel.\n These formulas were invented by David Dalrymple to obtain maximum contrast without going\n out of gamut if the parameters are in the range 0-1.\n A saturation multiplier was added by Gregor Aisch\n */\n\n\n var ref = unpack$p(args, 'lch');\n var l = ref[0];\n var c = ref[1];\n var h = ref[2];\n\n if (isNaN(h)) {\n h = 0;\n }\n\n h = h * DEG2RAD;\n return [l, cos$1(h) * c, sin(h) * c];\n };\n\n var lch2lab_1 = lch2lab;\n var unpack$q = utils.unpack;\n\n var lch2rgb = function lch2rgb() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n args = unpack$q(args, 'lch');\n var l = args[0];\n var c = args[1];\n var h = args[2];\n var ref = lch2lab_1(l, c, h);\n var L = ref[0];\n var a = ref[1];\n var b_ = ref[2];\n var ref$1 = lab2rgb_1(L, a, b_);\n var r = ref$1[0];\n var g = ref$1[1];\n var b = ref$1[2];\n return [r, g, b, args.length > 3 ? args[3] : 1];\n };\n\n var lch2rgb_1 = lch2rgb;\n var unpack$r = utils.unpack;\n\n var hcl2rgb = function hcl2rgb() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n var hcl = unpack$r(args, 'hcl').reverse();\n return lch2rgb_1.apply(void 0, hcl);\n };\n\n var hcl2rgb_1 = hcl2rgb;\n var unpack$s = utils.unpack;\n var type$a = utils.type;\n\n Color_1.prototype.lch = function () {\n return rgb2lch_1(this._rgb);\n };\n\n Color_1.prototype.hcl = function () {\n return rgb2lch_1(this._rgb).reverse();\n };\n\n chroma_1.lch = function () {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n return new (Function.prototype.bind.apply(Color_1, [null].concat(args, ['lch'])))();\n };\n\n chroma_1.hcl = function () {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n return new (Function.prototype.bind.apply(Color_1, [null].concat(args, ['hcl'])))();\n };\n\n input.format.lch = lch2rgb_1;\n input.format.hcl = hcl2rgb_1;\n ['lch', 'hcl'].forEach(function (m) {\n return input.autodetect.push({\n p: 2,\n test: function test() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n args = unpack$s(args, m);\n\n if (type$a(args) === 'array' && args.length === 3) {\n return m;\n }\n }\n });\n });\n /**\n \tX11 color names\n \thttp://www.w3.org/TR/css3-color/#svg-color\n */\n\n var w3cx11 = {\n aliceblue: '#f0f8ff',\n antiquewhite: '#faebd7',\n aqua: '#00ffff',\n aquamarine: '#7fffd4',\n azure: '#f0ffff',\n beige: '#f5f5dc',\n bisque: '#ffe4c4',\n black: '#000000',\n blanchedalmond: '#ffebcd',\n blue: '#0000ff',\n blueviolet: '#8a2be2',\n brown: '#a52a2a',\n burlywood: '#deb887',\n cadetblue: '#5f9ea0',\n chartreuse: '#7fff00',\n chocolate: '#d2691e',\n coral: '#ff7f50',\n cornflower: '#6495ed',\n cornflowerblue: '#6495ed',\n cornsilk: '#fff8dc',\n crimson: '#dc143c',\n cyan: '#00ffff',\n darkblue: '#00008b',\n darkcyan: '#008b8b',\n darkgoldenrod: '#b8860b',\n darkgray: '#a9a9a9',\n darkgreen: '#006400',\n darkgrey: '#a9a9a9',\n darkkhaki: '#bdb76b',\n darkmagenta: '#8b008b',\n darkolivegreen: '#556b2f',\n darkorange: '#ff8c00',\n darkorchid: '#9932cc',\n darkred: '#8b0000',\n darksalmon: '#e9967a',\n darkseagreen: '#8fbc8f',\n darkslateblue: '#483d8b',\n darkslategray: '#2f4f4f',\n darkslategrey: '#2f4f4f',\n darkturquoise: '#00ced1',\n darkviolet: '#9400d3',\n deeppink: '#ff1493',\n deepskyblue: '#00bfff',\n dimgray: '#696969',\n dimgrey: '#696969',\n dodgerblue: '#1e90ff',\n firebrick: '#b22222',\n floralwhite: '#fffaf0',\n forestgreen: '#228b22',\n fuchsia: '#ff00ff',\n gainsboro: '#dcdcdc',\n ghostwhite: '#f8f8ff',\n gold: '#ffd700',\n goldenrod: '#daa520',\n gray: '#808080',\n green: '#008000',\n greenyellow: '#adff2f',\n grey: '#808080',\n honeydew: '#f0fff0',\n hotpink: '#ff69b4',\n indianred: '#cd5c5c',\n indigo: '#4b0082',\n ivory: '#fffff0',\n khaki: '#f0e68c',\n laserlemon: '#ffff54',\n lavender: '#e6e6fa',\n lavenderblush: '#fff0f5',\n lawngreen: '#7cfc00',\n lemonchiffon: '#fffacd',\n lightblue: '#add8e6',\n lightcoral: '#f08080',\n lightcyan: '#e0ffff',\n lightgoldenrod: '#fafad2',\n lightgoldenrodyellow: '#fafad2',\n lightgray: '#d3d3d3',\n lightgreen: '#90ee90',\n lightgrey: '#d3d3d3',\n lightpink: '#ffb6c1',\n lightsalmon: '#ffa07a',\n lightseagreen: '#20b2aa',\n lightskyblue: '#87cefa',\n lightslategray: '#778899',\n lightslategrey: '#778899',\n lightsteelblue: '#b0c4de',\n lightyellow: '#ffffe0',\n lime: '#00ff00',\n limegreen: '#32cd32',\n linen: '#faf0e6',\n magenta: '#ff00ff',\n maroon: '#800000',\n maroon2: '#7f0000',\n maroon3: '#b03060',\n mediumaquamarine: '#66cdaa',\n mediumblue: '#0000cd',\n mediumorchid: '#ba55d3',\n mediumpurple: '#9370db',\n mediumseagreen: '#3cb371',\n mediumslateblue: '#7b68ee',\n mediumspringgreen: '#00fa9a',\n mediumturquoise: '#48d1cc',\n mediumvioletred: '#c71585',\n midnightblue: '#191970',\n mintcream: '#f5fffa',\n mistyrose: '#ffe4e1',\n moccasin: '#ffe4b5',\n navajowhite: '#ffdead',\n navy: '#000080',\n oldlace: '#fdf5e6',\n olive: '#808000',\n olivedrab: '#6b8e23',\n orange: '#ffa500',\n orangered: '#ff4500',\n orchid: '#da70d6',\n palegoldenrod: '#eee8aa',\n palegreen: '#98fb98',\n paleturquoise: '#afeeee',\n palevioletred: '#db7093',\n papayawhip: '#ffefd5',\n peachpuff: '#ffdab9',\n peru: '#cd853f',\n pink: '#ffc0cb',\n plum: '#dda0dd',\n powderblue: '#b0e0e6',\n purple: '#800080',\n purple2: '#7f007f',\n purple3: '#a020f0',\n rebeccapurple: '#663399',\n red: '#ff0000',\n rosybrown: '#bc8f8f',\n royalblue: '#4169e1',\n saddlebrown: '#8b4513',\n salmon: '#fa8072',\n sandybrown: '#f4a460',\n seagreen: '#2e8b57',\n seashell: '#fff5ee',\n sienna: '#a0522d',\n silver: '#c0c0c0',\n skyblue: '#87ceeb',\n slateblue: '#6a5acd',\n slategray: '#708090',\n slategrey: '#708090',\n snow: '#fffafa',\n springgreen: '#00ff7f',\n steelblue: '#4682b4',\n tan: '#d2b48c',\n teal: '#008080',\n thistle: '#d8bfd8',\n tomato: '#ff6347',\n turquoise: '#40e0d0',\n violet: '#ee82ee',\n wheat: '#f5deb3',\n white: '#ffffff',\n whitesmoke: '#f5f5f5',\n yellow: '#ffff00',\n yellowgreen: '#9acd32'\n };\n var w3cx11_1 = w3cx11;\n var type$b = utils.type;\n\n Color_1.prototype.name = function () {\n var hex = rgb2hex_1(this._rgb, 'rgb');\n\n for (var i = 0, list = Object.keys(w3cx11_1); i < list.length; i += 1) {\n var n = list[i];\n\n if (w3cx11_1[n] === hex) {\n return n.toLowerCase();\n }\n }\n\n return hex;\n };\n\n input.format.named = function (name) {\n name = name.toLowerCase();\n\n if (w3cx11_1[name]) {\n return hex2rgb_1(w3cx11_1[name]);\n }\n\n throw new Error('unknown color name: ' + name);\n };\n\n input.autodetect.push({\n p: 5,\n test: function test(h) {\n var rest = [],\n len = arguments.length - 1;\n\n while (len-- > 0) {\n rest[len] = arguments[len + 1];\n }\n\n if (!rest.length && type$b(h) === 'string' && w3cx11_1[h.toLowerCase()]) {\n return 'named';\n }\n }\n });\n var unpack$t = utils.unpack;\n\n var rgb2num = function rgb2num() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n var ref = unpack$t(args, 'rgb');\n var r = ref[0];\n var g = ref[1];\n var b = ref[2];\n return (r << 16) + (g << 8) + b;\n };\n\n var rgb2num_1 = rgb2num;\n var type$c = utils.type;\n\n var num2rgb = function num2rgb(num) {\n if (type$c(num) == \"number\" && num >= 0 && num <= 0xFFFFFF) {\n var r = num >> 16;\n var g = num >> 8 & 0xFF;\n var b = num & 0xFF;\n return [r, g, b, 1];\n }\n\n throw new Error(\"unknown num color: \" + num);\n };\n\n var num2rgb_1 = num2rgb;\n var type$d = utils.type;\n\n Color_1.prototype.num = function () {\n return rgb2num_1(this._rgb);\n };\n\n chroma_1.num = function () {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n return new (Function.prototype.bind.apply(Color_1, [null].concat(args, ['num'])))();\n };\n\n input.format.num = num2rgb_1;\n input.autodetect.push({\n p: 5,\n test: function test() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n if (args.length === 1 && type$d(args[0]) === 'number' && args[0] >= 0 && args[0] <= 0xFFFFFF) {\n return 'num';\n }\n }\n });\n var unpack$u = utils.unpack;\n var type$e = utils.type;\n var round$5 = Math.round;\n\n Color_1.prototype.rgb = function (rnd) {\n if (rnd === void 0) rnd = true;\n\n if (rnd === false) {\n return this._rgb.slice(0, 3);\n }\n\n return this._rgb.slice(0, 3).map(round$5);\n };\n\n Color_1.prototype.rgba = function (rnd) {\n if (rnd === void 0) rnd = true;\n return this._rgb.slice(0, 4).map(function (v, i) {\n return i < 3 ? rnd === false ? v : round$5(v) : v;\n });\n };\n\n chroma_1.rgb = function () {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n return new (Function.prototype.bind.apply(Color_1, [null].concat(args, ['rgb'])))();\n };\n\n input.format.rgb = function () {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n var rgba = unpack$u(args, 'rgba');\n\n if (rgba[3] === undefined) {\n rgba[3] = 1;\n }\n\n return rgba;\n };\n\n input.autodetect.push({\n p: 3,\n test: function test() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n args = unpack$u(args, 'rgba');\n\n if (type$e(args) === 'array' && (args.length === 3 || args.length === 4 && type$e(args[3]) == 'number' && args[3] >= 0 && args[3] <= 1)) {\n return 'rgb';\n }\n }\n });\n /*\n * Based on implementation by Neil Bartlett\n * https://github.com/neilbartlett/color-temperature\n */\n\n var log = Math.log;\n\n var temperature2rgb = function temperature2rgb(kelvin) {\n var temp = kelvin / 100;\n var r, g, b;\n\n if (temp < 66) {\n r = 255;\n g = -155.25485562709179 - 0.44596950469579133 * (g = temp - 2) + 104.49216199393888 * log(g);\n b = temp < 20 ? 0 : -254.76935184120902 + 0.8274096064007395 * (b = temp - 10) + 115.67994401066147 * log(b);\n } else {\n r = 351.97690566805693 + 0.114206453784165 * (r = temp - 55) - 40.25366309332127 * log(r);\n g = 325.4494125711974 + 0.07943456536662342 * (g = temp - 50) - 28.0852963507957 * log(g);\n b = 255;\n }\n\n return [r, g, b, 1];\n };\n\n var temperature2rgb_1 = temperature2rgb;\n /*\n * Based on implementation by Neil Bartlett\n * https://github.com/neilbartlett/color-temperature\n **/\n\n var unpack$v = utils.unpack;\n var round$6 = Math.round;\n\n var rgb2temperature = function rgb2temperature() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n var rgb = unpack$v(args, 'rgb');\n var r = rgb[0],\n b = rgb[2];\n var minTemp = 1000;\n var maxTemp = 40000;\n var eps = 0.4;\n var temp;\n\n while (maxTemp - minTemp > eps) {\n temp = (maxTemp + minTemp) * 0.5;\n var rgb$1 = temperature2rgb_1(temp);\n\n if (rgb$1[2] / rgb$1[0] >= b / r) {\n maxTemp = temp;\n } else {\n minTemp = temp;\n }\n }\n\n return round$6(temp);\n };\n\n var rgb2temperature_1 = rgb2temperature;\n\n Color_1.prototype.temp = Color_1.prototype.kelvin = Color_1.prototype.temperature = function () {\n return rgb2temperature_1(this._rgb);\n };\n\n chroma_1.temp = chroma_1.kelvin = chroma_1.temperature = function () {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n return new (Function.prototype.bind.apply(Color_1, [null].concat(args, ['temp'])))();\n };\n\n input.format.temp = input.format.kelvin = input.format.temperature = temperature2rgb_1;\n var type$f = utils.type;\n\n Color_1.prototype.alpha = function (a, mutate) {\n if (mutate === void 0) mutate = false;\n\n if (a !== undefined && type$f(a) === 'number') {\n if (mutate) {\n this._rgb[3] = a;\n return this;\n }\n\n return new Color_1([this._rgb[0], this._rgb[1], this._rgb[2], a], 'rgb');\n }\n\n return this._rgb[3];\n };\n\n Color_1.prototype.clipped = function () {\n return this._rgb._clipped || false;\n };\n\n Color_1.prototype.darken = function (amount) {\n if (amount === void 0) amount = 1;\n var me = this;\n var lab = me.lab();\n lab[0] -= labConstants.Kn * amount;\n return new Color_1(lab, 'lab').alpha(me.alpha(), true);\n };\n\n Color_1.prototype.brighten = function (amount) {\n if (amount === void 0) amount = 1;\n return this.darken(-amount);\n };\n\n Color_1.prototype.darker = Color_1.prototype.darken;\n Color_1.prototype.brighter = Color_1.prototype.brighten;\n\n Color_1.prototype.get = function (mc) {\n var ref = mc.split('.');\n var mode = ref[0];\n var channel = ref[1];\n var src = this[mode]();\n\n if (channel) {\n var i = mode.indexOf(channel);\n\n if (i > -1) {\n return src[i];\n }\n\n throw new Error(\"unknown channel \" + channel + \" in mode \" + mode);\n } else {\n return src;\n }\n };\n\n var type$g = utils.type;\n var pow$2 = Math.pow;\n var EPS = 1e-7;\n var MAX_ITER = 20;\n\n Color_1.prototype.luminance = function (lum) {\n if (lum !== undefined && type$g(lum) === 'number') {\n if (lum === 0) {\n // return pure black\n return new Color_1([0, 0, 0, this._rgb[3]], 'rgb');\n }\n\n if (lum === 1) {\n // return pure white\n return new Color_1([255, 255, 255, this._rgb[3]], 'rgb');\n } // compute new color using...\n\n\n var cur_lum = this.luminance();\n var mode = 'rgb';\n var max_iter = MAX_ITER;\n\n var test = function test(low, high) {\n var mid = low.interpolate(high, 0.5, mode);\n var lm = mid.luminance();\n\n if (Math.abs(lum - lm) < EPS || !max_iter--) {\n // close enough\n return mid;\n }\n\n return lm > lum ? test(low, mid) : test(mid, high);\n };\n\n var rgb = (cur_lum > lum ? test(new Color_1([0, 0, 0]), this) : test(this, new Color_1([255, 255, 255]))).rgb();\n return new Color_1(rgb.concat([this._rgb[3]]));\n }\n\n return rgb2luminance.apply(void 0, this._rgb.slice(0, 3));\n };\n\n var rgb2luminance = function rgb2luminance(r, g, b) {\n // relative luminance\n // see http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef\n r = luminance_x(r);\n g = luminance_x(g);\n b = luminance_x(b);\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n };\n\n var luminance_x = function luminance_x(x) {\n x /= 255;\n return x <= 0.03928 ? x / 12.92 : pow$2((x + 0.055) / 1.055, 2.4);\n };\n\n var interpolator = {};\n var type$h = utils.type;\n\n var mix = function mix(col1, col2, f) {\n if (f === void 0) f = 0.5;\n var rest = [],\n len = arguments.length - 3;\n\n while (len-- > 0) {\n rest[len] = arguments[len + 3];\n }\n\n var mode = rest[0] || 'lrgb';\n\n if (!interpolator[mode] && !rest.length) {\n // fall back to the first supported mode\n mode = Object.keys(interpolator)[0];\n }\n\n if (!interpolator[mode]) {\n throw new Error(\"interpolation mode \" + mode + \" is not defined\");\n }\n\n if (type$h(col1) !== 'object') {\n col1 = new Color_1(col1);\n }\n\n if (type$h(col2) !== 'object') {\n col2 = new Color_1(col2);\n }\n\n return interpolator[mode](col1, col2, f).alpha(col1.alpha() + f * (col2.alpha() - col1.alpha()));\n };\n\n Color_1.prototype.mix = Color_1.prototype.interpolate = function (col2, f) {\n if (f === void 0) f = 0.5;\n var rest = [],\n len = arguments.length - 2;\n\n while (len-- > 0) {\n rest[len] = arguments[len + 2];\n }\n\n return mix.apply(void 0, [this, col2, f].concat(rest));\n };\n\n Color_1.prototype.premultiply = function (mutate) {\n if (mutate === void 0) mutate = false;\n var rgb = this._rgb;\n var a = rgb[3];\n\n if (mutate) {\n this._rgb = [rgb[0] * a, rgb[1] * a, rgb[2] * a, a];\n return this;\n } else {\n return new Color_1([rgb[0] * a, rgb[1] * a, rgb[2] * a, a], 'rgb');\n }\n };\n\n Color_1.prototype.saturate = function (amount) {\n if (amount === void 0) amount = 1;\n var me = this;\n var lch = me.lch();\n lch[1] += labConstants.Kn * amount;\n\n if (lch[1] < 0) {\n lch[1] = 0;\n }\n\n return new Color_1(lch, 'lch').alpha(me.alpha(), true);\n };\n\n Color_1.prototype.desaturate = function (amount) {\n if (amount === void 0) amount = 1;\n return this.saturate(-amount);\n };\n\n var type$i = utils.type;\n\n Color_1.prototype.set = function (mc, value, mutate) {\n if (mutate === void 0) mutate = false;\n var ref = mc.split('.');\n var mode = ref[0];\n var channel = ref[1];\n var src = this[mode]();\n\n if (channel) {\n var i = mode.indexOf(channel);\n\n if (i > -1) {\n if (type$i(value) == 'string') {\n switch (value.charAt(0)) {\n case '+':\n src[i] += +value;\n break;\n\n case '-':\n src[i] += +value;\n break;\n\n case '*':\n src[i] *= +value.substr(1);\n break;\n\n case '/':\n src[i] /= +value.substr(1);\n break;\n\n default:\n src[i] = +value;\n }\n } else if (type$i(value) === 'number') {\n src[i] = value;\n } else {\n throw new Error(\"unsupported value for Color.set\");\n }\n\n var out = new Color_1(src, mode);\n\n if (mutate) {\n this._rgb = out._rgb;\n return this;\n }\n\n return out;\n }\n\n throw new Error(\"unknown channel \" + channel + \" in mode \" + mode);\n } else {\n return src;\n }\n };\n\n var rgb$1 = function rgb$1(col1, col2, f) {\n var xyz0 = col1._rgb;\n var xyz1 = col2._rgb;\n return new Color_1(xyz0[0] + f * (xyz1[0] - xyz0[0]), xyz0[1] + f * (xyz1[1] - xyz0[1]), xyz0[2] + f * (xyz1[2] - xyz0[2]), 'rgb');\n }; // register interpolator\n\n\n interpolator.rgb = rgb$1;\n var sqrt$2 = Math.sqrt;\n var pow$3 = Math.pow;\n\n var lrgb = function lrgb(col1, col2, f) {\n var ref = col1._rgb;\n var x1 = ref[0];\n var y1 = ref[1];\n var z1 = ref[2];\n var ref$1 = col2._rgb;\n var x2 = ref$1[0];\n var y2 = ref$1[1];\n var z2 = ref$1[2];\n return new Color_1(sqrt$2(pow$3(x1, 2) * (1 - f) + pow$3(x2, 2) * f), sqrt$2(pow$3(y1, 2) * (1 - f) + pow$3(y2, 2) * f), sqrt$2(pow$3(z1, 2) * (1 - f) + pow$3(z2, 2) * f), 'rgb');\n }; // register interpolator\n\n\n interpolator.lrgb = lrgb;\n\n var lab$1 = function lab$1(col1, col2, f) {\n var xyz0 = col1.lab();\n var xyz1 = col2.lab();\n return new Color_1(xyz0[0] + f * (xyz1[0] - xyz0[0]), xyz0[1] + f * (xyz1[1] - xyz0[1]), xyz0[2] + f * (xyz1[2] - xyz0[2]), 'lab');\n }; // register interpolator\n\n\n interpolator.lab = lab$1;\n\n var _hsx = function _hsx(col1, col2, f, m) {\n var assign, assign$1;\n var xyz0, xyz1;\n\n if (m === 'hsl') {\n xyz0 = col1.hsl();\n xyz1 = col2.hsl();\n } else if (m === 'hsv') {\n xyz0 = col1.hsv();\n xyz1 = col2.hsv();\n } else if (m === 'hcg') {\n xyz0 = col1.hcg();\n xyz1 = col2.hcg();\n } else if (m === 'hsi') {\n xyz0 = col1.hsi();\n xyz1 = col2.hsi();\n } else if (m === 'lch' || m === 'hcl') {\n m = 'hcl';\n xyz0 = col1.hcl();\n xyz1 = col2.hcl();\n }\n\n var hue0, hue1, sat0, sat1, lbv0, lbv1;\n\n if (m.substr(0, 1) === 'h') {\n assign = xyz0, hue0 = assign[0], sat0 = assign[1], lbv0 = assign[2];\n assign$1 = xyz1, hue1 = assign$1[0], sat1 = assign$1[1], lbv1 = assign$1[2];\n }\n\n var sat, hue, lbv, dh;\n\n if (!isNaN(hue0) && !isNaN(hue1)) {\n // both colors have hue\n if (hue1 > hue0 && hue1 - hue0 > 180) {\n dh = hue1 - (hue0 + 360);\n } else if (hue1 < hue0 && hue0 - hue1 > 180) {\n dh = hue1 + 360 - hue0;\n } else {\n dh = hue1 - hue0;\n }\n\n hue = hue0 + f * dh;\n } else if (!isNaN(hue0)) {\n hue = hue0;\n\n if ((lbv1 == 1 || lbv1 == 0) && m != 'hsv') {\n sat = sat0;\n }\n } else if (!isNaN(hue1)) {\n hue = hue1;\n\n if ((lbv0 == 1 || lbv0 == 0) && m != 'hsv') {\n sat = sat1;\n }\n } else {\n hue = Number.NaN;\n }\n\n if (sat === undefined) {\n sat = sat0 + f * (sat1 - sat0);\n }\n\n lbv = lbv0 + f * (lbv1 - lbv0);\n return new Color_1([hue, sat, lbv], m);\n };\n\n var lch$1 = function lch$1(col1, col2, f) {\n return _hsx(col1, col2, f, 'lch');\n }; // register interpolator\n\n\n interpolator.lch = lch$1;\n interpolator.hcl = lch$1;\n\n var num$1 = function num$1(col1, col2, f) {\n var c1 = col1.num();\n var c2 = col2.num();\n return new Color_1(c1 + f * (c2 - c1), 'num');\n }; // register interpolator\n\n\n interpolator.num = num$1;\n\n var hcg$1 = function hcg$1(col1, col2, f) {\n return _hsx(col1, col2, f, 'hcg');\n }; // register interpolator\n\n\n interpolator.hcg = hcg$1;\n\n var hsi$1 = function hsi$1(col1, col2, f) {\n return _hsx(col1, col2, f, 'hsi');\n }; // register interpolator\n\n\n interpolator.hsi = hsi$1;\n\n var hsl$1 = function hsl$1(col1, col2, f) {\n return _hsx(col1, col2, f, 'hsl');\n }; // register interpolator\n\n\n interpolator.hsl = hsl$1;\n\n var hsv$1 = function hsv$1(col1, col2, f) {\n return _hsx(col1, col2, f, 'hsv');\n }; // register interpolator\n\n\n interpolator.hsv = hsv$1;\n var clip_rgb$2 = utils.clip_rgb;\n var pow$4 = Math.pow;\n var sqrt$3 = Math.sqrt;\n var PI$1 = Math.PI;\n var cos$2 = Math.cos;\n var sin$1 = Math.sin;\n var atan2$1 = Math.atan2;\n\n var average = function average(colors, mode, weights) {\n if (mode === void 0) mode = 'lrgb';\n if (weights === void 0) weights = null;\n var l = colors.length;\n\n if (!weights) {\n weights = Array.from(new Array(l)).map(function () {\n return 1;\n });\n } // normalize weights\n\n\n var k = l / weights.reduce(function (a, b) {\n return a + b;\n });\n weights.forEach(function (w, i) {\n weights[i] *= k;\n }); // convert colors to Color objects\n\n colors = colors.map(function (c) {\n return new Color_1(c);\n });\n\n if (mode === 'lrgb') {\n return _average_lrgb(colors, weights);\n }\n\n var first = colors.shift();\n var xyz = first.get(mode);\n var cnt = [];\n var dx = 0;\n var dy = 0; // initial color\n\n for (var i = 0; i < xyz.length; i++) {\n xyz[i] = (xyz[i] || 0) * weights[0];\n cnt.push(isNaN(xyz[i]) ? 0 : weights[0]);\n\n if (mode.charAt(i) === 'h' && !isNaN(xyz[i])) {\n var A = xyz[i] / 180 * PI$1;\n dx += cos$2(A) * weights[0];\n dy += sin$1(A) * weights[0];\n }\n }\n\n var alpha = first.alpha() * weights[0];\n colors.forEach(function (c, ci) {\n var xyz2 = c.get(mode);\n alpha += c.alpha() * weights[ci + 1];\n\n for (var i = 0; i < xyz.length; i++) {\n if (!isNaN(xyz2[i])) {\n cnt[i] += weights[ci + 1];\n\n if (mode.charAt(i) === 'h') {\n var A = xyz2[i] / 180 * PI$1;\n dx += cos$2(A) * weights[ci + 1];\n dy += sin$1(A) * weights[ci + 1];\n } else {\n xyz[i] += xyz2[i] * weights[ci + 1];\n }\n }\n }\n });\n\n for (var i$1 = 0; i$1 < xyz.length; i$1++) {\n if (mode.charAt(i$1) === 'h') {\n var A$1 = atan2$1(dy / cnt[i$1], dx / cnt[i$1]) / PI$1 * 180;\n\n while (A$1 < 0) {\n A$1 += 360;\n }\n\n while (A$1 >= 360) {\n A$1 -= 360;\n }\n\n xyz[i$1] = A$1;\n } else {\n xyz[i$1] = xyz[i$1] / cnt[i$1];\n }\n }\n\n alpha /= l;\n return new Color_1(xyz, mode).alpha(alpha > 0.99999 ? 1 : alpha, true);\n };\n\n var _average_lrgb = function _average_lrgb(colors, weights) {\n var l = colors.length;\n var xyz = [0, 0, 0, 0];\n\n for (var i = 0; i < colors.length; i++) {\n var col = colors[i];\n var f = weights[i] / l;\n var rgb = col._rgb;\n xyz[0] += pow$4(rgb[0], 2) * f;\n xyz[1] += pow$4(rgb[1], 2) * f;\n xyz[2] += pow$4(rgb[2], 2) * f;\n xyz[3] += rgb[3] * f;\n }\n\n xyz[0] = sqrt$3(xyz[0]);\n xyz[1] = sqrt$3(xyz[1]);\n xyz[2] = sqrt$3(xyz[2]);\n\n if (xyz[3] > 0.9999999) {\n xyz[3] = 1;\n }\n\n return new Color_1(clip_rgb$2(xyz));\n }; // minimal multi-purpose interface\n // @requires utils color analyze\n\n\n var type$j = utils.type;\n var pow$5 = Math.pow;\n\n var scale = function scale(colors) {\n // constructor\n var _mode = 'rgb';\n\n var _nacol = chroma_1('#ccc');\n\n var _spread = 0; // const _fixed = false;\n\n var _domain = [0, 1];\n var _pos = [];\n var _padding = [0, 0];\n var _classes = false;\n var _colors = [];\n var _out = false;\n var _min = 0;\n var _max = 1;\n var _correctLightness = false;\n var _colorCache = {};\n var _useCache = true;\n var _gamma = 1; // private methods\n\n var setColors = function setColors(colors) {\n colors = colors || ['#fff', '#000'];\n\n if (colors && type$j(colors) === 'string' && chroma_1.brewer && chroma_1.brewer[colors.toLowerCase()]) {\n colors = chroma_1.brewer[colors.toLowerCase()];\n }\n\n if (type$j(colors) === 'array') {\n // handle single color\n if (colors.length === 1) {\n colors = [colors[0], colors[0]];\n } // make a copy of the colors\n\n\n colors = colors.slice(0); // convert to chroma classes\n\n for (var c = 0; c < colors.length; c++) {\n colors[c] = chroma_1(colors[c]);\n } // auto-fill color position\n\n\n _pos.length = 0;\n\n for (var c$1 = 0; c$1 < colors.length; c$1++) {\n _pos.push(c$1 / (colors.length - 1));\n }\n }\n\n resetCache();\n return _colors = colors;\n };\n\n var getClass = function getClass(value) {\n if (_classes != null) {\n var n = _classes.length - 1;\n var i = 0;\n\n while (i < n && value >= _classes[i]) {\n i++;\n }\n\n return i - 1;\n }\n\n return 0;\n };\n\n var tMapLightness = function tMapLightness(t) {\n return t;\n };\n\n var tMapDomain = function tMapDomain(t) {\n return t;\n }; // const classifyValue = function(value) {\n // let val = value;\n // if (_classes.length > 2) {\n // const n = _classes.length-1;\n // const i = getClass(value);\n // const minc = _classes[0] + ((_classes[1]-_classes[0]) * (0 + (_spread * 0.5))); // center of 1st class\n // const maxc = _classes[n-1] + ((_classes[n]-_classes[n-1]) * (1 - (_spread * 0.5))); // center of last class\n // val = _min + ((((_classes[i] + ((_classes[i+1] - _classes[i]) * 0.5)) - minc) / (maxc-minc)) * (_max - _min));\n // }\n // return val;\n // };\n\n\n var getColor = function getColor(val, bypassMap) {\n var col, t;\n\n if (bypassMap == null) {\n bypassMap = false;\n }\n\n if (isNaN(val) || val === null) {\n return _nacol;\n }\n\n if (!bypassMap) {\n if (_classes && _classes.length > 2) {\n // find the class\n var c = getClass(val);\n t = c / (_classes.length - 2);\n } else if (_max !== _min) {\n // just interpolate between min/max\n t = (val - _min) / (_max - _min);\n } else {\n t = 1;\n }\n } else {\n t = val;\n } // domain map\n\n\n t = tMapDomain(t);\n\n if (!bypassMap) {\n t = tMapLightness(t); // lightness correction\n }\n\n if (_gamma !== 1) {\n t = pow$5(t, _gamma);\n }\n\n t = _padding[0] + t * (1 - _padding[0] - _padding[1]);\n t = Math.min(1, Math.max(0, t));\n var k = Math.floor(t * 10000);\n\n if (_useCache && _colorCache[k]) {\n col = _colorCache[k];\n } else {\n if (type$j(_colors) === 'array') {\n //for i in [0.._pos.length-1]\n for (var i = 0; i < _pos.length; i++) {\n var p = _pos[i];\n\n if (t <= p) {\n col = _colors[i];\n break;\n }\n\n if (t >= p && i === _pos.length - 1) {\n col = _colors[i];\n break;\n }\n\n if (t > p && t < _pos[i + 1]) {\n t = (t - p) / (_pos[i + 1] - p);\n col = chroma_1.interpolate(_colors[i], _colors[i + 1], t, _mode);\n break;\n }\n }\n } else if (type$j(_colors) === 'function') {\n col = _colors(t);\n }\n\n if (_useCache) {\n _colorCache[k] = col;\n }\n }\n\n return col;\n };\n\n var resetCache = function resetCache() {\n return _colorCache = {};\n };\n\n setColors(colors); // public interface\n\n var f = function f(v) {\n var c = chroma_1(getColor(v));\n\n if (_out && c[_out]) {\n return c[_out]();\n } else {\n return c;\n }\n };\n\n f.classes = function (classes) {\n if (classes != null) {\n if (type$j(classes) === 'array') {\n _classes = classes;\n _domain = [classes[0], classes[classes.length - 1]];\n } else {\n var d = chroma_1.analyze(_domain);\n\n if (classes === 0) {\n _classes = [d.min, d.max];\n } else {\n _classes = chroma_1.limits(d, 'e', classes);\n }\n }\n\n return f;\n }\n\n return _classes;\n };\n\n f.domain = function (domain) {\n if (!arguments.length) {\n return _domain;\n }\n\n _min = domain[0];\n _max = domain[domain.length - 1];\n _pos = [];\n var k = _colors.length;\n\n if (domain.length === k && _min !== _max) {\n // update positions\n for (var i = 0, list = Array.from(domain); i < list.length; i += 1) {\n var d = list[i];\n\n _pos.push((d - _min) / (_max - _min));\n }\n } else {\n for (var c = 0; c < k; c++) {\n _pos.push(c / (k - 1));\n }\n\n if (domain.length > 2) {\n // set domain map\n var tOut = domain.map(function (d, i) {\n return i / (domain.length - 1);\n });\n var tBreaks = domain.map(function (d) {\n return (d - _min) / (_max - _min);\n });\n\n if (!tBreaks.every(function (val, i) {\n return tOut[i] === val;\n })) {\n tMapDomain = function tMapDomain(t) {\n if (t <= 0 || t >= 1) {\n return t;\n }\n\n var i = 0;\n\n while (t >= tBreaks[i + 1]) {\n i++;\n }\n\n var f = (t - tBreaks[i]) / (tBreaks[i + 1] - tBreaks[i]);\n var out = tOut[i] + f * (tOut[i + 1] - tOut[i]);\n return out;\n };\n }\n }\n }\n\n _domain = [_min, _max];\n return f;\n };\n\n f.mode = function (_m) {\n if (!arguments.length) {\n return _mode;\n }\n\n _mode = _m;\n resetCache();\n return f;\n };\n\n f.range = function (colors, _pos) {\n setColors(colors, _pos);\n return f;\n };\n\n f.out = function (_o) {\n _out = _o;\n return f;\n };\n\n f.spread = function (val) {\n if (!arguments.length) {\n return _spread;\n }\n\n _spread = val;\n return f;\n };\n\n f.correctLightness = function (v) {\n if (v == null) {\n v = true;\n }\n\n _correctLightness = v;\n resetCache();\n\n if (_correctLightness) {\n tMapLightness = function tMapLightness(t) {\n var L0 = getColor(0, true).lab()[0];\n var L1 = getColor(1, true).lab()[0];\n var pol = L0 > L1;\n var L_actual = getColor(t, true).lab()[0];\n var L_ideal = L0 + (L1 - L0) * t;\n var L_diff = L_actual - L_ideal;\n var t0 = 0;\n var t1 = 1;\n var max_iter = 20;\n\n while (Math.abs(L_diff) > 1e-2 && max_iter-- > 0) {\n (function () {\n if (pol) {\n L_diff *= -1;\n }\n\n if (L_diff < 0) {\n t0 = t;\n t += (t1 - t) * 0.5;\n } else {\n t1 = t;\n t += (t0 - t) * 0.5;\n }\n\n L_actual = getColor(t, true).lab()[0];\n return L_diff = L_actual - L_ideal;\n })();\n }\n\n return t;\n };\n } else {\n tMapLightness = function tMapLightness(t) {\n return t;\n };\n }\n\n return f;\n };\n\n f.padding = function (p) {\n if (p != null) {\n if (type$j(p) === 'number') {\n p = [p, p];\n }\n\n _padding = p;\n return f;\n } else {\n return _padding;\n }\n };\n\n f.colors = function (numColors, out) {\n // If no arguments are given, return the original colors that were provided\n if (arguments.length < 2) {\n out = 'hex';\n }\n\n var result = [];\n\n if (arguments.length === 0) {\n result = _colors.slice(0);\n } else if (numColors === 1) {\n result = [f(0.5)];\n } else if (numColors > 1) {\n var dm = _domain[0];\n var dd = _domain[1] - dm;\n result = __range__(0, numColors, false).map(function (i) {\n return f(dm + i / (numColors - 1) * dd);\n });\n } else {\n // returns all colors based on the defined classes\n colors = [];\n var samples = [];\n\n if (_classes && _classes.length > 2) {\n for (var i = 1, end = _classes.length, asc = 1 <= end; asc ? i < end : i > end; asc ? i++ : i--) {\n samples.push((_classes[i - 1] + _classes[i]) * 0.5);\n }\n } else {\n samples = _domain;\n }\n\n result = samples.map(function (v) {\n return f(v);\n });\n }\n\n if (chroma_1[out]) {\n result = result.map(function (c) {\n return c[out]();\n });\n }\n\n return result;\n };\n\n f.cache = function (c) {\n if (c != null) {\n _useCache = c;\n return f;\n } else {\n return _useCache;\n }\n };\n\n f.gamma = function (g) {\n if (g != null) {\n _gamma = g;\n return f;\n } else {\n return _gamma;\n }\n };\n\n f.nodata = function (d) {\n if (d != null) {\n _nacol = chroma_1(d);\n return f;\n } else {\n return _nacol;\n }\n };\n\n return f;\n };\n\n function __range__(left, right, inclusive) {\n var range = [];\n var ascending = left < right;\n var end = !inclusive ? right : ascending ? right + 1 : right - 1;\n\n for (var i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {\n range.push(i);\n }\n\n return range;\n } //\n // interpolates between a set of colors uzing a bezier spline\n //\n // @requires utils lab\n\n\n var bezier = function bezier(colors) {\n var assign, assign$1, assign$2;\n var I, lab0, lab1, lab2;\n colors = colors.map(function (c) {\n return new Color_1(c);\n });\n\n if (colors.length === 2) {\n // linear interpolation\n assign = colors.map(function (c) {\n return c.lab();\n }), lab0 = assign[0], lab1 = assign[1];\n\n I = function I(t) {\n var lab = [0, 1, 2].map(function (i) {\n return lab0[i] + t * (lab1[i] - lab0[i]);\n });\n return new Color_1(lab, 'lab');\n };\n } else if (colors.length === 3) {\n // quadratic bezier interpolation\n assign$1 = colors.map(function (c) {\n return c.lab();\n }), lab0 = assign$1[0], lab1 = assign$1[1], lab2 = assign$1[2];\n\n I = function I(t) {\n var lab = [0, 1, 2].map(function (i) {\n return (1 - t) * (1 - t) * lab0[i] + 2 * (1 - t) * t * lab1[i] + t * t * lab2[i];\n });\n return new Color_1(lab, 'lab');\n };\n } else if (colors.length === 4) {\n // cubic bezier interpolation\n var lab3;\n assign$2 = colors.map(function (c) {\n return c.lab();\n }), lab0 = assign$2[0], lab1 = assign$2[1], lab2 = assign$2[2], lab3 = assign$2[3];\n\n I = function I(t) {\n var lab = [0, 1, 2].map(function (i) {\n return (1 - t) * (1 - t) * (1 - t) * lab0[i] + 3 * (1 - t) * (1 - t) * t * lab1[i] + 3 * (1 - t) * t * t * lab2[i] + t * t * t * lab3[i];\n });\n return new Color_1(lab, 'lab');\n };\n } else if (colors.length === 5) {\n var I0 = bezier(colors.slice(0, 3));\n var I1 = bezier(colors.slice(2, 5));\n\n I = function I(t) {\n if (t < 0.5) {\n return I0(t * 2);\n } else {\n return I1((t - 0.5) * 2);\n }\n };\n }\n\n return I;\n };\n\n var bezier_1 = function bezier_1(colors) {\n var f = bezier(colors);\n\n f.scale = function () {\n return scale(f);\n };\n\n return f;\n };\n /*\n * interpolates between a set of colors uzing a bezier spline\n * blend mode formulas taken from http://www.venture-ware.com/kevin/coding/lets-learn-math-photoshop-blend-modes/\n */\n\n\n var blend = function blend(bottom, top, mode) {\n if (!blend[mode]) {\n throw new Error('unknown blend mode ' + mode);\n }\n\n return blend[mode](bottom, top);\n };\n\n var blend_f = function blend_f(f) {\n return function (bottom, top) {\n var c0 = chroma_1(top).rgb();\n var c1 = chroma_1(bottom).rgb();\n return chroma_1.rgb(f(c0, c1));\n };\n };\n\n var each = function each(f) {\n return function (c0, c1) {\n var out = [];\n out[0] = f(c0[0], c1[0]);\n out[1] = f(c0[1], c1[1]);\n out[2] = f(c0[2], c1[2]);\n return out;\n };\n };\n\n var normal = function normal(a) {\n return a;\n };\n\n var multiply = function multiply(a, b) {\n return a * b / 255;\n };\n\n var darken$1 = function darken$1(a, b) {\n return a > b ? b : a;\n };\n\n var lighten = function lighten(a, b) {\n return a > b ? a : b;\n };\n\n var screen = function screen(a, b) {\n return 255 * (1 - (1 - a / 255) * (1 - b / 255));\n };\n\n var overlay = function overlay(a, b) {\n return b < 128 ? 2 * a * b / 255 : 255 * (1 - 2 * (1 - a / 255) * (1 - b / 255));\n };\n\n var burn = function burn(a, b) {\n return 255 * (1 - (1 - b / 255) / (a / 255));\n };\n\n var dodge = function dodge(a, b) {\n if (a === 255) {\n return 255;\n }\n\n a = 255 * (b / 255) / (1 - a / 255);\n return a > 255 ? 255 : a;\n }; // # add = (a,b) ->\n // # if (a + b > 255) then 255 else a + b\n\n\n blend.normal = blend_f(each(normal));\n blend.multiply = blend_f(each(multiply));\n blend.screen = blend_f(each(screen));\n blend.overlay = blend_f(each(overlay));\n blend.darken = blend_f(each(darken$1));\n blend.lighten = blend_f(each(lighten));\n blend.dodge = blend_f(each(dodge));\n blend.burn = blend_f(each(burn)); // blend.add = blend_f(each(add));\n\n var blend_1 = blend; // cubehelix interpolation\n // based on D.A. Green \"A colour scheme for the display of astronomical intensity images\"\n // http://astron-soc.in/bulletin/11June/289392011.pdf\n\n var type$k = utils.type;\n var clip_rgb$3 = utils.clip_rgb;\n var TWOPI$2 = utils.TWOPI;\n var pow$6 = Math.pow;\n var sin$2 = Math.sin;\n var cos$3 = Math.cos;\n\n var cubehelix = function cubehelix(start, rotations, hue, gamma, lightness) {\n if (start === void 0) start = 300;\n if (rotations === void 0) rotations = -1.5;\n if (hue === void 0) hue = 1;\n if (gamma === void 0) gamma = 1;\n if (lightness === void 0) lightness = [0, 1];\n var dh = 0,\n dl;\n\n if (type$k(lightness) === 'array') {\n dl = lightness[1] - lightness[0];\n } else {\n dl = 0;\n lightness = [lightness, lightness];\n }\n\n var f = function f(fract) {\n var a = TWOPI$2 * ((start + 120) / 360 + rotations * fract);\n var l = pow$6(lightness[0] + dl * fract, gamma);\n var h = dh !== 0 ? hue[0] + fract * dh : hue;\n var amp = h * l * (1 - l) / 2;\n var cos_a = cos$3(a);\n var sin_a = sin$2(a);\n var r = l + amp * (-0.14861 * cos_a + 1.78277 * sin_a);\n var g = l + amp * (-0.29227 * cos_a - 0.90649 * sin_a);\n var b = l + amp * (+1.97294 * cos_a);\n return chroma_1(clip_rgb$3([r * 255, g * 255, b * 255, 1]));\n };\n\n f.start = function (s) {\n if (s == null) {\n return start;\n }\n\n start = s;\n return f;\n };\n\n f.rotations = function (r) {\n if (r == null) {\n return rotations;\n }\n\n rotations = r;\n return f;\n };\n\n f.gamma = function (g) {\n if (g == null) {\n return gamma;\n }\n\n gamma = g;\n return f;\n };\n\n f.hue = function (h) {\n if (h == null) {\n return hue;\n }\n\n hue = h;\n\n if (type$k(hue) === 'array') {\n dh = hue[1] - hue[0];\n\n if (dh === 0) {\n hue = hue[1];\n }\n } else {\n dh = 0;\n }\n\n return f;\n };\n\n f.lightness = function (h) {\n if (h == null) {\n return lightness;\n }\n\n if (type$k(h) === 'array') {\n lightness = h;\n dl = h[1] - h[0];\n } else {\n lightness = [h, h];\n dl = 0;\n }\n\n return f;\n };\n\n f.scale = function () {\n return chroma_1.scale(f);\n };\n\n f.hue(hue);\n return f;\n };\n\n var digits = '0123456789abcdef';\n var floor$2 = Math.floor;\n var random = Math.random;\n\n var random_1 = function random_1() {\n var code = '#';\n\n for (var i = 0; i < 6; i++) {\n code += digits.charAt(floor$2(random() * 16));\n }\n\n return new Color_1(code, 'hex');\n };\n\n var log$1 = Math.log;\n var pow$7 = Math.pow;\n var floor$3 = Math.floor;\n var abs = Math.abs;\n\n var analyze = function analyze(data, key) {\n if (key === void 0) key = null;\n var r = {\n min: Number.MAX_VALUE,\n max: Number.MAX_VALUE * -1,\n sum: 0,\n values: [],\n count: 0\n };\n\n if (type(data) === 'object') {\n data = Object.values(data);\n }\n\n data.forEach(function (val) {\n if (key && type(val) === 'object') {\n val = val[key];\n }\n\n if (val !== undefined && val !== null && !isNaN(val)) {\n r.values.push(val);\n r.sum += val;\n\n if (val < r.min) {\n r.min = val;\n }\n\n if (val > r.max) {\n r.max = val;\n }\n\n r.count += 1;\n }\n });\n r.domain = [r.min, r.max];\n\n r.limits = function (mode, num) {\n return limits(r, mode, num);\n };\n\n return r;\n };\n\n var limits = function limits(data, mode, num) {\n if (mode === void 0) mode = 'equal';\n if (num === void 0) num = 7;\n\n if (type(data) == 'array') {\n data = analyze(data);\n }\n\n var min = data.min;\n var max = data.max;\n var values = data.values.sort(function (a, b) {\n return a - b;\n });\n\n if (num === 1) {\n return [min, max];\n }\n\n var limits = [];\n\n if (mode.substr(0, 1) === 'c') {\n // continuous\n limits.push(min);\n limits.push(max);\n }\n\n if (mode.substr(0, 1) === 'e') {\n // equal interval\n limits.push(min);\n\n for (var i = 1; i < num; i++) {\n limits.push(min + i / num * (max - min));\n }\n\n limits.push(max);\n } else if (mode.substr(0, 1) === 'l') {\n // log scale\n if (min <= 0) {\n throw new Error('Logarithmic scales are only possible for values > 0');\n }\n\n var min_log = Math.LOG10E * log$1(min);\n var max_log = Math.LOG10E * log$1(max);\n limits.push(min);\n\n for (var i$1 = 1; i$1 < num; i$1++) {\n limits.push(pow$7(10, min_log + i$1 / num * (max_log - min_log)));\n }\n\n limits.push(max);\n } else if (mode.substr(0, 1) === 'q') {\n // quantile scale\n limits.push(min);\n\n for (var i$2 = 1; i$2 < num; i$2++) {\n var p = (values.length - 1) * i$2 / num;\n var pb = floor$3(p);\n\n if (pb === p) {\n limits.push(values[pb]);\n } else {\n // p > pb\n var pr = p - pb;\n limits.push(values[pb] * (1 - pr) + values[pb + 1] * pr);\n }\n }\n\n limits.push(max);\n } else if (mode.substr(0, 1) === 'k') {\n // k-means clustering\n\n /*\n implementation based on\n http://code.google.com/p/figue/source/browse/trunk/figue.js#336\n simplified for 1-d input values\n */\n var cluster;\n var n = values.length;\n var assignments = new Array(n);\n var clusterSizes = new Array(num);\n var repeat = true;\n var nb_iters = 0;\n var centroids = null; // get seed values\n\n centroids = [];\n centroids.push(min);\n\n for (var i$3 = 1; i$3 < num; i$3++) {\n centroids.push(min + i$3 / num * (max - min));\n }\n\n centroids.push(max);\n\n while (repeat) {\n // assignment step\n for (var j = 0; j < num; j++) {\n clusterSizes[j] = 0;\n }\n\n for (var i$4 = 0; i$4 < n; i$4++) {\n var value = values[i$4];\n var mindist = Number.MAX_VALUE;\n var best = void 0;\n\n for (var j$1 = 0; j$1 < num; j$1++) {\n var dist = abs(centroids[j$1] - value);\n\n if (dist < mindist) {\n mindist = dist;\n best = j$1;\n }\n\n clusterSizes[best]++;\n assignments[i$4] = best;\n }\n } // update centroids step\n\n\n var newCentroids = new Array(num);\n\n for (var j$2 = 0; j$2 < num; j$2++) {\n newCentroids[j$2] = null;\n }\n\n for (var i$5 = 0; i$5 < n; i$5++) {\n cluster = assignments[i$5];\n\n if (newCentroids[cluster] === null) {\n newCentroids[cluster] = values[i$5];\n } else {\n newCentroids[cluster] += values[i$5];\n }\n }\n\n for (var j$3 = 0; j$3 < num; j$3++) {\n newCentroids[j$3] *= 1 / clusterSizes[j$3];\n } // check convergence\n\n\n repeat = false;\n\n for (var j$4 = 0; j$4 < num; j$4++) {\n if (newCentroids[j$4] !== centroids[j$4]) {\n repeat = true;\n break;\n }\n }\n\n centroids = newCentroids;\n nb_iters++;\n\n if (nb_iters > 200) {\n repeat = false;\n }\n } // finished k-means clustering\n // the next part is borrowed from gabrielflor.it\n\n\n var kClusters = {};\n\n for (var j$5 = 0; j$5 < num; j$5++) {\n kClusters[j$5] = [];\n }\n\n for (var i$6 = 0; i$6 < n; i$6++) {\n cluster = assignments[i$6];\n kClusters[cluster].push(values[i$6]);\n }\n\n var tmpKMeansBreaks = [];\n\n for (var j$6 = 0; j$6 < num; j$6++) {\n tmpKMeansBreaks.push(kClusters[j$6][0]);\n tmpKMeansBreaks.push(kClusters[j$6][kClusters[j$6].length - 1]);\n }\n\n tmpKMeansBreaks = tmpKMeansBreaks.sort(function (a, b) {\n return a - b;\n });\n limits.push(tmpKMeansBreaks[0]);\n\n for (var i$7 = 1; i$7 < tmpKMeansBreaks.length; i$7 += 2) {\n var v = tmpKMeansBreaks[i$7];\n\n if (!isNaN(v) && limits.indexOf(v) === -1) {\n limits.push(v);\n }\n }\n }\n\n return limits;\n };\n\n var analyze_1 = {\n analyze: analyze,\n limits: limits\n };\n\n var contrast = function contrast(a, b) {\n // WCAG contrast ratio\n // see http://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef\n a = new Color_1(a);\n b = new Color_1(b);\n var l1 = a.luminance();\n var l2 = b.luminance();\n return l1 > l2 ? (l1 + 0.05) / (l2 + 0.05) : (l2 + 0.05) / (l1 + 0.05);\n };\n\n var sqrt$4 = Math.sqrt;\n var atan2$2 = Math.atan2;\n var abs$1 = Math.abs;\n var cos$4 = Math.cos;\n var PI$2 = Math.PI;\n\n var deltaE = function deltaE(a, b, L, C) {\n if (L === void 0) L = 1;\n if (C === void 0) C = 1; // Delta E (CMC)\n // see http://www.brucelindbloom.com/index.html?Eqn_DeltaE_CMC.html\n\n a = new Color_1(a);\n b = new Color_1(b);\n var ref = Array.from(a.lab());\n var L1 = ref[0];\n var a1 = ref[1];\n var b1 = ref[2];\n var ref$1 = Array.from(b.lab());\n var L2 = ref$1[0];\n var a2 = ref$1[1];\n var b2 = ref$1[2];\n var c1 = sqrt$4(a1 * a1 + b1 * b1);\n var c2 = sqrt$4(a2 * a2 + b2 * b2);\n var sl = L1 < 16.0 ? 0.511 : 0.040975 * L1 / (1.0 + 0.01765 * L1);\n var sc = 0.0638 * c1 / (1.0 + 0.0131 * c1) + 0.638;\n var h1 = c1 < 0.000001 ? 0.0 : atan2$2(b1, a1) * 180.0 / PI$2;\n\n while (h1 < 0) {\n h1 += 360;\n }\n\n while (h1 >= 360) {\n h1 -= 360;\n }\n\n var t = h1 >= 164.0 && h1 <= 345.0 ? 0.56 + abs$1(0.2 * cos$4(PI$2 * (h1 + 168.0) / 180.0)) : 0.36 + abs$1(0.4 * cos$4(PI$2 * (h1 + 35.0) / 180.0));\n var c4 = c1 * c1 * c1 * c1;\n var f = sqrt$4(c4 / (c4 + 1900.0));\n var sh = sc * (f * t + 1.0 - f);\n var delL = L1 - L2;\n var delC = c1 - c2;\n var delA = a1 - a2;\n var delB = b1 - b2;\n var dH2 = delA * delA + delB * delB - delC * delC;\n var v1 = delL / (L * sl);\n var v2 = delC / (C * sc);\n var v3 = sh;\n return sqrt$4(v1 * v1 + v2 * v2 + dH2 / (v3 * v3));\n }; // simple Euclidean distance\n\n\n var distance = function distance(a, b, mode) {\n if (mode === void 0) mode = 'lab'; // Delta E (CIE 1976)\n // see http://www.brucelindbloom.com/index.html?Equations.html\n\n a = new Color_1(a);\n b = new Color_1(b);\n var l1 = a.get(mode);\n var l2 = b.get(mode);\n var sum_sq = 0;\n\n for (var i in l1) {\n var d = (l1[i] || 0) - (l2[i] || 0);\n sum_sq += d * d;\n }\n\n return Math.sqrt(sum_sq);\n };\n\n var valid = function valid() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n try {\n new (Function.prototype.bind.apply(Color_1, [null].concat(args)))();\n return true;\n } catch (e) {\n return false;\n }\n }; // some pre-defined color scales:\n\n\n var scales = {\n cool: function cool() {\n return scale([chroma_1.hsl(180, 1, .9), chroma_1.hsl(250, .7, .4)]);\n },\n hot: function hot() {\n return scale(['#000', '#f00', '#ff0', '#fff'], [0, .25, .75, 1]).mode('rgb');\n }\n };\n /**\n ColorBrewer colors for chroma.js\n Copyright (c) 2002 Cynthia Brewer, Mark Harrower, and The\n Pennsylvania State University.\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n http://www.apache.org/licenses/LICENSE-2.0\n Unless required by applicable law or agreed to in writing, software distributed\n under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR\n CONDITIONS OF ANY KIND, either express or implied. See the License for the\n specific language governing permissions and limitations under the License.\n */\n\n var colorbrewer = {\n // sequential\n OrRd: ['#fff7ec', '#fee8c8', '#fdd49e', '#fdbb84', '#fc8d59', '#ef6548', '#d7301f', '#b30000', '#7f0000'],\n PuBu: ['#fff7fb', '#ece7f2', '#d0d1e6', '#a6bddb', '#74a9cf', '#3690c0', '#0570b0', '#045a8d', '#023858'],\n BuPu: ['#f7fcfd', '#e0ecf4', '#bfd3e6', '#9ebcda', '#8c96c6', '#8c6bb1', '#88419d', '#810f7c', '#4d004b'],\n Oranges: ['#fff5eb', '#fee6ce', '#fdd0a2', '#fdae6b', '#fd8d3c', '#f16913', '#d94801', '#a63603', '#7f2704'],\n BuGn: ['#f7fcfd', '#e5f5f9', '#ccece6', '#99d8c9', '#66c2a4', '#41ae76', '#238b45', '#006d2c', '#00441b'],\n YlOrBr: ['#ffffe5', '#fff7bc', '#fee391', '#fec44f', '#fe9929', '#ec7014', '#cc4c02', '#993404', '#662506'],\n YlGn: ['#ffffe5', '#f7fcb9', '#d9f0a3', '#addd8e', '#78c679', '#41ab5d', '#238443', '#006837', '#004529'],\n Reds: ['#fff5f0', '#fee0d2', '#fcbba1', '#fc9272', '#fb6a4a', '#ef3b2c', '#cb181d', '#a50f15', '#67000d'],\n RdPu: ['#fff7f3', '#fde0dd', '#fcc5c0', '#fa9fb5', '#f768a1', '#dd3497', '#ae017e', '#7a0177', '#49006a'],\n Greens: ['#f7fcf5', '#e5f5e0', '#c7e9c0', '#a1d99b', '#74c476', '#41ab5d', '#238b45', '#006d2c', '#00441b'],\n YlGnBu: ['#ffffd9', '#edf8b1', '#c7e9b4', '#7fcdbb', '#41b6c4', '#1d91c0', '#225ea8', '#253494', '#081d58'],\n Purples: ['#fcfbfd', '#efedf5', '#dadaeb', '#bcbddc', '#9e9ac8', '#807dba', '#6a51a3', '#54278f', '#3f007d'],\n GnBu: ['#f7fcf0', '#e0f3db', '#ccebc5', '#a8ddb5', '#7bccc4', '#4eb3d3', '#2b8cbe', '#0868ac', '#084081'],\n Greys: ['#ffffff', '#f0f0f0', '#d9d9d9', '#bdbdbd', '#969696', '#737373', '#525252', '#252525', '#000000'],\n YlOrRd: ['#ffffcc', '#ffeda0', '#fed976', '#feb24c', '#fd8d3c', '#fc4e2a', '#e31a1c', '#bd0026', '#800026'],\n PuRd: ['#f7f4f9', '#e7e1ef', '#d4b9da', '#c994c7', '#df65b0', '#e7298a', '#ce1256', '#980043', '#67001f'],\n Blues: ['#f7fbff', '#deebf7', '#c6dbef', '#9ecae1', '#6baed6', '#4292c6', '#2171b5', '#08519c', '#08306b'],\n PuBuGn: ['#fff7fb', '#ece2f0', '#d0d1e6', '#a6bddb', '#67a9cf', '#3690c0', '#02818a', '#016c59', '#014636'],\n Viridis: ['#440154', '#482777', '#3f4a8a', '#31678e', '#26838f', '#1f9d8a', '#6cce5a', '#b6de2b', '#fee825'],\n // diverging\n Spectral: ['#9e0142', '#d53e4f', '#f46d43', '#fdae61', '#fee08b', '#ffffbf', '#e6f598', '#abdda4', '#66c2a5', '#3288bd', '#5e4fa2'],\n RdYlGn: ['#a50026', '#d73027', '#f46d43', '#fdae61', '#fee08b', '#ffffbf', '#d9ef8b', '#a6d96a', '#66bd63', '#1a9850', '#006837'],\n RdBu: ['#67001f', '#b2182b', '#d6604d', '#f4a582', '#fddbc7', '#f7f7f7', '#d1e5f0', '#92c5de', '#4393c3', '#2166ac', '#053061'],\n PiYG: ['#8e0152', '#c51b7d', '#de77ae', '#f1b6da', '#fde0ef', '#f7f7f7', '#e6f5d0', '#b8e186', '#7fbc41', '#4d9221', '#276419'],\n PRGn: ['#40004b', '#762a83', '#9970ab', '#c2a5cf', '#e7d4e8', '#f7f7f7', '#d9f0d3', '#a6dba0', '#5aae61', '#1b7837', '#00441b'],\n RdYlBu: ['#a50026', '#d73027', '#f46d43', '#fdae61', '#fee090', '#ffffbf', '#e0f3f8', '#abd9e9', '#74add1', '#4575b4', '#313695'],\n BrBG: ['#543005', '#8c510a', '#bf812d', '#dfc27d', '#f6e8c3', '#f5f5f5', '#c7eae5', '#80cdc1', '#35978f', '#01665e', '#003c30'],\n RdGy: ['#67001f', '#b2182b', '#d6604d', '#f4a582', '#fddbc7', '#ffffff', '#e0e0e0', '#bababa', '#878787', '#4d4d4d', '#1a1a1a'],\n PuOr: ['#7f3b08', '#b35806', '#e08214', '#fdb863', '#fee0b6', '#f7f7f7', '#d8daeb', '#b2abd2', '#8073ac', '#542788', '#2d004b'],\n // qualitative\n Set2: ['#66c2a5', '#fc8d62', '#8da0cb', '#e78ac3', '#a6d854', '#ffd92f', '#e5c494', '#b3b3b3'],\n Accent: ['#7fc97f', '#beaed4', '#fdc086', '#ffff99', '#386cb0', '#f0027f', '#bf5b17', '#666666'],\n Set1: ['#e41a1c', '#377eb8', '#4daf4a', '#984ea3', '#ff7f00', '#ffff33', '#a65628', '#f781bf', '#999999'],\n Set3: ['#8dd3c7', '#ffffb3', '#bebada', '#fb8072', '#80b1d3', '#fdb462', '#b3de69', '#fccde5', '#d9d9d9', '#bc80bd', '#ccebc5', '#ffed6f'],\n Dark2: ['#1b9e77', '#d95f02', '#7570b3', '#e7298a', '#66a61e', '#e6ab02', '#a6761d', '#666666'],\n Paired: ['#a6cee3', '#1f78b4', '#b2df8a', '#33a02c', '#fb9a99', '#e31a1c', '#fdbf6f', '#ff7f00', '#cab2d6', '#6a3d9a', '#ffff99', '#b15928'],\n Pastel2: ['#b3e2cd', '#fdcdac', '#cbd5e8', '#f4cae4', '#e6f5c9', '#fff2ae', '#f1e2cc', '#cccccc'],\n Pastel1: ['#fbb4ae', '#b3cde3', '#ccebc5', '#decbe4', '#fed9a6', '#ffffcc', '#e5d8bd', '#fddaec', '#f2f2f2']\n }; // add lowercase aliases for case-insensitive matches\n\n for (var i$1 = 0, list$1 = Object.keys(colorbrewer); i$1 < list$1.length; i$1 += 1) {\n var key = list$1[i$1];\n colorbrewer[key.toLowerCase()] = colorbrewer[key];\n }\n\n var colorbrewer_1 = colorbrewer; // feel free to comment out anything to rollup\n // a smaller chroma.js built\n // io --\x3e convert colors\n // operators --\x3e modify existing Colors\n // interpolators\n // generators -- > create new colors\n\n chroma_1.average = average;\n chroma_1.bezier = bezier_1;\n chroma_1.blend = blend_1;\n chroma_1.cubehelix = cubehelix;\n chroma_1.mix = chroma_1.interpolate = mix;\n chroma_1.random = random_1;\n chroma_1.scale = scale; // other utility methods\n\n chroma_1.analyze = analyze_1.analyze;\n chroma_1.contrast = contrast;\n chroma_1.deltaE = deltaE;\n chroma_1.distance = distance;\n chroma_1.limits = analyze_1.limits;\n chroma_1.valid = valid; // scale\n\n chroma_1.scales = scales; // colors\n\n chroma_1.colors = w3cx11_1;\n chroma_1.brewer = colorbrewer_1;\n var chroma_js = chroma_1;\n return chroma_js;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jaHJvbWEtanMvY2hyb21hLmpzP2JmNDQiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUVBQW1FO0FBQ25FLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsS0FBNEQsZ0NBQWdDLENBQXdGO0FBQ3RMLENBQUM7QUFDRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxtQkFBbUIsUUFBUTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJOzs7QUFHSjs7QUFFQSxxSEFBcUgsaUJBQWlCO0FBQ3RJO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw2Q0FBNkM7O0FBRTdDO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7OztBQUdBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLE9BQU87OztBQUdQLDhDQUE4QyxpQkFBaUI7QUFDL0Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixRQUFRO0FBQ3hCOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLFFBQVE7QUFDeEI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsUUFBUTtBQUN4Qjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscUJBQXFCLE9BQU87QUFDNUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTyxZQUFZO0FBQ25CO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTs7QUFFQSxxQkFBcUIsT0FBTztBQUM1QjtBQUNBOztBQUVBLGlCQUFpQjs7QUFFakI7QUFDQSxLQUFLOzs7QUFHTDtBQUNBOztBQUVBLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOzs7QUFHTDtBQUNBOztBQUVBLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7O0FBRUEsbUJBQW1COztBQUVuQjtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7O0FBRUEsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCOztBQUV2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7O0FBRXhDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGdDQUFnQyxFQUFFLGFBQWEsRUFBRTtBQUNqRCxpQ0FBaUMsRUFBRSxhQUFhLEVBQUU7O0FBRWxEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixNQUFNO0FBQ3RCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRDs7QUFFL0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGlEQUFpRCxpQkFBaUI7QUFDbEU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjs7QUFFQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7O0FBRUE7QUFDQTtBQUNBLElBQUk7OztBQUdKOztBQUVBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjs7QUFFQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSzs7O0FBR0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSyxFQUFFOztBQUVQO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7O0FBRWYsbUJBQW1CLGdCQUFnQjtBQUNuQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQkFBcUIsZ0JBQWdCO0FBQ3JDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMLHFCQUFxQixrQkFBa0I7QUFDdkM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLG1CQUFtQixtQkFBbUI7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxvQkFBb0I7O0FBRXBCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7O0FBRW5CO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7O0FBR1QsaUNBQWlDOztBQUVqQyx1QkFBdUIsbUJBQW1CO0FBQzFDO0FBQ0EsU0FBUzs7O0FBR1Q7O0FBRUEseUJBQXlCLHFCQUFxQjtBQUM5QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSw4RkFBOEY7QUFDOUYsa0dBQWtHO0FBQ2xHO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPOzs7QUFHUDs7QUFFQTtBQUNBLDZCQUE2QjtBQUM3Qjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLHlCQUF5QixpQkFBaUI7QUFDMUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsc0JBQXNCOztBQUV0QjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrREFBa0QsaUJBQWlCO0FBQ25FOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsdUJBQXVCLE9BQU87QUFDOUI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsV0FBVzs7QUFFWDtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGdFQUFnRSx5QkFBeUI7QUFDekY7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQkFBc0IsK0JBQStCO0FBQ3JEO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQzs7QUFFbkMsc0JBQXNCO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxtQkFBbUIsT0FBTztBQUMxQjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxxQkFBcUIsU0FBUztBQUM5QjtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSx1QkFBdUIsV0FBVztBQUNsQztBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUEsdUJBQXVCLFdBQVc7QUFDbEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjs7QUFFM0I7QUFDQTs7QUFFQSx1QkFBdUIsV0FBVztBQUNsQztBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSx1QkFBdUIsU0FBUztBQUNoQztBQUNBOztBQUVBLHlCQUF5QixTQUFTO0FBQ2xDO0FBQ0E7QUFDQTs7QUFFQSwyQkFBMkIsV0FBVztBQUN0Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOzs7QUFHVDs7QUFFQSx5QkFBeUIsV0FBVztBQUNwQztBQUNBOztBQUVBLHlCQUF5QixTQUFTO0FBQ2xDOztBQUVBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBLHlCQUF5QixXQUFXO0FBQ3BDO0FBQ0EsU0FBUzs7O0FBR1Q7O0FBRUEseUJBQXlCLFdBQVc7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7O0FBR0E7O0FBRUEsdUJBQXVCLFdBQVc7QUFDbEM7QUFDQTs7QUFFQSx1QkFBdUIsU0FBUztBQUNoQztBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsdUJBQXVCLFdBQVc7QUFDbEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUEsdUJBQXVCLDhCQUE4QjtBQUNyRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDRCQUE0QjtBQUM1Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0Esc0NBQXNDO0FBQ3RDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKLHNEQUFzRCxxQkFBcUI7QUFDM0U7QUFDQTtBQUNBOztBQUVBLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5Qjs7QUFFekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5Qjs7QUFFekIsMkJBQTJCOztBQUUzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMiLCJmaWxlIjoiMzg3My5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogY2hyb21hLmpzIC0gSmF2YVNjcmlwdCBsaWJyYXJ5IGZvciBjb2xvciBjb252ZXJzaW9uc1xuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE5LCBHcmVnb3IgQWlzY2hcbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbiAqXG4gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiAqIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICpcbiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cbiAqIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICpcbiAqIDMuIFRoZSBuYW1lIEdyZWdvciBBaXNjaCBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzXG4gKiBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBHUkVHT1IgQUlTQ0ggT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCxcbiAqIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLFxuICogQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSxcbiAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUllcbiAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HXG4gKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsXG4gKiBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICpcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqXG4gKiBjaHJvbWEuanMgaW5jbHVkZXMgY29sb3JzIGZyb20gY29sb3JicmV3ZXIyLm9yZywgd2hpY2ggYXJlIHJlbGVhc2VkIHVuZGVyXG4gKiB0aGUgZm9sbG93aW5nIGxpY2Vuc2U6XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDAyIEN5bnRoaWEgQnJld2VyLCBNYXJrIEhhcnJvd2VyLFxuICogYW5kIFRoZSBQZW5uc3lsdmFuaWEgU3RhdGUgVW5pdmVyc2l0eS5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCxcbiAqIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljXG4gKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICpcbiAqIE5hbWVkIGNvbG9ycyBhcmUgdGFrZW4gZnJvbSBYMTEgQ29sb3IgTmFtZXMuXG4gKiBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLWNvbG9yLyNzdmctY29sb3JcbiAqXG4gKiBAcHJlc2VydmVcbiAqL1xuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOiB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOiBnbG9iYWwuY2hyb21hID0gZmFjdG9yeSgpO1xufSkodGhpcywgZnVuY3Rpb24gKCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdmFyIGxpbWl0ID0gZnVuY3Rpb24gbGltaXQoeCwgbWluLCBtYXgpIHtcbiAgICBpZiAobWluID09PSB2b2lkIDApIG1pbiA9IDA7XG4gICAgaWYgKG1heCA9PT0gdm9pZCAwKSBtYXggPSAxO1xuICAgIHJldHVybiB4IDwgbWluID8gbWluIDogeCA+IG1heCA/IG1heCA6IHg7XG4gIH07XG5cbiAgdmFyIGNsaXBfcmdiID0gZnVuY3Rpb24gY2xpcF9yZ2IocmdiKSB7XG4gICAgcmdiLl9jbGlwcGVkID0gZmFsc2U7XG4gICAgcmdiLl91bmNsaXBwZWQgPSByZ2Iuc2xpY2UoMCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8PSAzOyBpKyspIHtcbiAgICAgIGlmIChpIDwgMykge1xuICAgICAgICBpZiAocmdiW2ldIDwgMCB8fCByZ2JbaV0gPiAyNTUpIHtcbiAgICAgICAgICByZ2IuX2NsaXBwZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmdiW2ldID0gbGltaXQocmdiW2ldLCAwLCAyNTUpO1xuICAgICAgfSBlbHNlIGlmIChpID09PSAzKSB7XG4gICAgICAgIHJnYltpXSA9IGxpbWl0KHJnYltpXSwgMCwgMSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJnYjtcbiAgfTsgLy8gcG9ydGVkIGZyb20galF1ZXJ5J3MgJC50eXBlXG5cblxuICB2YXIgY2xhc3NUb1R5cGUgPSB7fTtcblxuICBmb3IgKHZhciBpID0gMCwgbGlzdCA9IFsnQm9vbGVhbicsICdOdW1iZXInLCAnU3RyaW5nJywgJ0Z1bmN0aW9uJywgJ0FycmF5JywgJ0RhdGUnLCAnUmVnRXhwJywgJ1VuZGVmaW5lZCcsICdOdWxsJ107IGkgPCBsaXN0Lmxlbmd0aDsgaSArPSAxKSB7XG4gICAgdmFyIG5hbWUgPSBsaXN0W2ldO1xuICAgIGNsYXNzVG9UeXBlW1wiW29iamVjdCBcIiArIG5hbWUgKyBcIl1cIl0gPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gIH1cblxuICB2YXIgdHlwZSA9IGZ1bmN0aW9uIHR5cGUob2JqKSB7XG4gICAgcmV0dXJuIGNsYXNzVG9UeXBlW09iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopXSB8fCBcIm9iamVjdFwiO1xuICB9O1xuXG4gIHZhciB1bnBhY2sgPSBmdW5jdGlvbiB1bnBhY2soYXJncywga2V5T3JkZXIpIHtcbiAgICBpZiAoa2V5T3JkZXIgPT09IHZvaWQgMCkga2V5T3JkZXIgPSBudWxsOyAvLyBpZiBjYWxsZWQgd2l0aCBtb3JlIHRoYW4gMyBhcmd1bWVudHMsIHdlIHJldHVybiB0aGUgYXJndW1lbnRzXG5cbiAgICBpZiAoYXJncy5sZW5ndGggPj0gMykge1xuICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3MpO1xuICAgIH0gLy8gd2l0aCBsZXNzIHRoYW4gMyBhcmdzIHdlIGNoZWNrIGlmIGZpcnN0IGFyZyBpcyBvYmplY3RcbiAgICAvLyBhbmQgdXNlIHRoZSBrZXlPcmRlciBzdHJpbmcgdG8gZXh0cmFjdCBhbmQgc29ydCBwcm9wZXJ0aWVzXG5cblxuICAgIGlmICh0eXBlKGFyZ3NbMF0pID09ICdvYmplY3QnICYmIGtleU9yZGVyKSB7XG4gICAgICByZXR1cm4ga2V5T3JkZXIuc3BsaXQoJycpLmZpbHRlcihmdW5jdGlvbiAoaykge1xuICAgICAgICByZXR1cm4gYXJnc1swXVtrXSAhPT0gdW5kZWZpbmVkO1xuICAgICAgfSkubWFwKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgIHJldHVybiBhcmdzWzBdW2tdO1xuICAgICAgfSk7XG4gICAgfSAvLyBvdGhlcndpc2Ugd2UganVzdCByZXR1cm4gdGhlIGZpcnN0IGFyZ3VtZW50XG4gICAgLy8gKHdoaWNoIHdlIHN1cHBvc2UgaXMgYW4gYXJyYXkgb2YgYXJncylcblxuXG4gICAgcmV0dXJuIGFyZ3NbMF07XG4gIH07XG5cbiAgdmFyIGxhc3QgPSBmdW5jdGlvbiBsYXN0KGFyZ3MpIHtcbiAgICBpZiAoYXJncy5sZW5ndGggPCAyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgbCA9IGFyZ3MubGVuZ3RoIC0gMTtcblxuICAgIGlmICh0eXBlKGFyZ3NbbF0pID09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gYXJnc1tsXS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIHZhciBQSSA9IE1hdGguUEk7XG4gIHZhciB1dGlscyA9IHtcbiAgICBjbGlwX3JnYjogY2xpcF9yZ2IsXG4gICAgbGltaXQ6IGxpbWl0LFxuICAgIHR5cGU6IHR5cGUsXG4gICAgdW5wYWNrOiB1bnBhY2ssXG4gICAgbGFzdDogbGFzdCxcbiAgICBQSTogUEksXG4gICAgVFdPUEk6IFBJICogMixcbiAgICBQSVRISVJEOiBQSSAvIDMsXG4gICAgREVHMlJBRDogUEkgLyAxODAsXG4gICAgUkFEMkRFRzogMTgwIC8gUElcbiAgfTtcbiAgdmFyIGlucHV0ID0ge1xuICAgIGZvcm1hdDoge30sXG4gICAgYXV0b2RldGVjdDogW11cbiAgfTtcbiAgdmFyIGxhc3QkMSA9IHV0aWxzLmxhc3Q7XG4gIHZhciBjbGlwX3JnYiQxID0gdXRpbHMuY2xpcF9yZ2I7XG4gIHZhciB0eXBlJDEgPSB1dGlscy50eXBlO1xuXG4gIHZhciBDb2xvciA9IGZ1bmN0aW9uIENvbG9yKCkge1xuICAgIHZhciBhcmdzID0gW10sXG4gICAgICAgIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICB3aGlsZSAobGVuLS0pIHtcbiAgICAgIGFyZ3NbbGVuXSA9IGFyZ3VtZW50c1tsZW5dO1xuICAgIH1cblxuICAgIHZhciBtZSA9IHRoaXM7XG5cbiAgICBpZiAodHlwZSQxKGFyZ3NbMF0pID09PSAnb2JqZWN0JyAmJiBhcmdzWzBdLmNvbnN0cnVjdG9yICYmIGFyZ3NbMF0uY29uc3RydWN0b3IgPT09IHRoaXMuY29uc3RydWN0b3IpIHtcbiAgICAgIC8vIHRoZSBhcmd1bWVudCBpcyBhbHJlYWR5IGEgQ29sb3IgaW5zdGFuY2VcbiAgICAgIHJldHVybiBhcmdzWzBdO1xuICAgIH0gLy8gbGFzdCBhcmd1bWVudCBjb3VsZCBiZSB0aGUgbW9kZVxuXG5cbiAgICB2YXIgbW9kZSA9IGxhc3QkMShhcmdzKTtcbiAgICB2YXIgYXV0b2RldGVjdCA9IGZhbHNlO1xuXG4gICAgaWYgKCFtb2RlKSB7XG4gICAgICBhdXRvZGV0ZWN0ID0gdHJ1ZTtcblxuICAgICAgaWYgKCFpbnB1dC5zb3J0ZWQpIHtcbiAgICAgICAgaW5wdXQuYXV0b2RldGVjdCA9IGlucHV0LmF1dG9kZXRlY3Quc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgIHJldHVybiBiLnAgLSBhLnA7XG4gICAgICAgIH0pO1xuICAgICAgICBpbnB1dC5zb3J0ZWQgPSB0cnVlO1xuICAgICAgfSAvLyBhdXRvLWRldGVjdCBmb3JtYXRcblxuXG4gICAgICBmb3IgKHZhciBpID0gMCwgbGlzdCA9IGlucHV0LmF1dG9kZXRlY3Q7IGkgPCBsaXN0Lmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBjaGsgPSBsaXN0W2ldO1xuICAgICAgICBtb2RlID0gY2hrLnRlc3QuYXBwbHkoY2hrLCBhcmdzKTtcblxuICAgICAgICBpZiAobW9kZSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlucHV0LmZvcm1hdFttb2RlXSkge1xuICAgICAgdmFyIHJnYiA9IGlucHV0LmZvcm1hdFttb2RlXS5hcHBseShudWxsLCBhdXRvZGV0ZWN0ID8gYXJncyA6IGFyZ3Muc2xpY2UoMCwgLTEpKTtcbiAgICAgIG1lLl9yZ2IgPSBjbGlwX3JnYiQxKHJnYik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndW5rbm93biBmb3JtYXQ6ICcgKyBhcmdzKTtcbiAgICB9IC8vIGFkZCBhbHBoYSBjaGFubmVsXG5cblxuICAgIGlmIChtZS5fcmdiLmxlbmd0aCA9PT0gMykge1xuICAgICAgbWUuX3JnYi5wdXNoKDEpO1xuICAgIH1cbiAgfTtcblxuICBDb2xvci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICBpZiAodHlwZSQxKHRoaXMuaGV4KSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gdGhpcy5oZXgoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gXCJbXCIgKyB0aGlzLl9yZ2Iuam9pbignLCcpICsgXCJdXCI7XG4gIH07XG5cbiAgdmFyIENvbG9yXzEgPSBDb2xvcjtcblxuICB2YXIgY2hyb21hID0gZnVuY3Rpb24gY2hyb21hKCkge1xuICAgIHZhciBhcmdzID0gW10sXG4gICAgICAgIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICB3aGlsZSAobGVuLS0pIHtcbiAgICAgIGFyZ3NbbGVuXSA9IGFyZ3VtZW50c1tsZW5dO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgKEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmFwcGx5KGNocm9tYS5Db2xvciwgW251bGxdLmNvbmNhdChhcmdzKSkpKCk7XG4gIH07XG5cbiAgY2hyb21hLkNvbG9yID0gQ29sb3JfMTtcbiAgY2hyb21hLnZlcnNpb24gPSAnMi4xLjInO1xuICB2YXIgY2hyb21hXzEgPSBjaHJvbWE7XG4gIHZhciB1bnBhY2skMSA9IHV0aWxzLnVucGFjaztcbiAgdmFyIG1heCA9IE1hdGgubWF4O1xuXG4gIHZhciByZ2IyY215ayA9IGZ1bmN0aW9uIHJnYjJjbXlrKCkge1xuICAgIHZhciBhcmdzID0gW10sXG4gICAgICAgIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICB3aGlsZSAobGVuLS0pIHtcbiAgICAgIGFyZ3NbbGVuXSA9IGFyZ3VtZW50c1tsZW5dO1xuICAgIH1cblxuICAgIHZhciByZWYgPSB1bnBhY2skMShhcmdzLCAncmdiJyk7XG4gICAgdmFyIHIgPSByZWZbMF07XG4gICAgdmFyIGcgPSByZWZbMV07XG4gICAgdmFyIGIgPSByZWZbMl07XG4gICAgciA9IHIgLyAyNTU7XG4gICAgZyA9IGcgLyAyNTU7XG4gICAgYiA9IGIgLyAyNTU7XG4gICAgdmFyIGsgPSAxIC0gbWF4KHIsIG1heChnLCBiKSk7XG4gICAgdmFyIGYgPSBrIDwgMSA/IDEgLyAoMSAtIGspIDogMDtcbiAgICB2YXIgYyA9ICgxIC0gciAtIGspICogZjtcbiAgICB2YXIgbSA9ICgxIC0gZyAtIGspICogZjtcbiAgICB2YXIgeSA9ICgxIC0gYiAtIGspICogZjtcbiAgICByZXR1cm4gW2MsIG0sIHksIGtdO1xuICB9O1xuXG4gIHZhciByZ2IyY215a18xID0gcmdiMmNteWs7XG4gIHZhciB1bnBhY2skMiA9IHV0aWxzLnVucGFjaztcblxuICB2YXIgY215azJyZ2IgPSBmdW5jdGlvbiBjbXlrMnJnYigpIHtcbiAgICB2YXIgYXJncyA9IFtdLFxuICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGxlbi0tKSB7XG4gICAgICBhcmdzW2xlbl0gPSBhcmd1bWVudHNbbGVuXTtcbiAgICB9XG5cbiAgICBhcmdzID0gdW5wYWNrJDIoYXJncywgJ2NteWsnKTtcbiAgICB2YXIgYyA9IGFyZ3NbMF07XG4gICAgdmFyIG0gPSBhcmdzWzFdO1xuICAgIHZhciB5ID0gYXJnc1syXTtcbiAgICB2YXIgayA9IGFyZ3NbM107XG4gICAgdmFyIGFscGhhID0gYXJncy5sZW5ndGggPiA0ID8gYXJnc1s0XSA6IDE7XG5cbiAgICBpZiAoayA9PT0gMSkge1xuICAgICAgcmV0dXJuIFswLCAwLCAwLCBhbHBoYV07XG4gICAgfVxuXG4gICAgcmV0dXJuIFtjID49IDEgPyAwIDogMjU1ICogKDEgLSBjKSAqICgxIC0gayksIC8vIHJcbiAgICBtID49IDEgPyAwIDogMjU1ICogKDEgLSBtKSAqICgxIC0gayksIC8vIGdcbiAgICB5ID49IDEgPyAwIDogMjU1ICogKDEgLSB5KSAqICgxIC0gayksIC8vIGJcbiAgICBhbHBoYV07XG4gIH07XG5cbiAgdmFyIGNteWsycmdiXzEgPSBjbXlrMnJnYjtcbiAgdmFyIHVucGFjayQzID0gdXRpbHMudW5wYWNrO1xuICB2YXIgdHlwZSQyID0gdXRpbHMudHlwZTtcblxuICBDb2xvcl8xLnByb3RvdHlwZS5jbXlrID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiByZ2IyY215a18xKHRoaXMuX3JnYik7XG4gIH07XG5cbiAgY2hyb21hXzEuY215ayA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJncyA9IFtdLFxuICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGxlbi0tKSB7XG4gICAgICBhcmdzW2xlbl0gPSBhcmd1bWVudHNbbGVuXTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IChGdW5jdGlvbi5wcm90b3R5cGUuYmluZC5hcHBseShDb2xvcl8xLCBbbnVsbF0uY29uY2F0KGFyZ3MsIFsnY215ayddKSkpKCk7XG4gIH07XG5cbiAgaW5wdXQuZm9ybWF0LmNteWsgPSBjbXlrMnJnYl8xO1xuICBpbnB1dC5hdXRvZGV0ZWN0LnB1c2goe1xuICAgIHA6IDIsXG4gICAgdGVzdDogZnVuY3Rpb24gdGVzdCgpIHtcbiAgICAgIHZhciBhcmdzID0gW10sXG4gICAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKGxlbi0tKSB7XG4gICAgICAgIGFyZ3NbbGVuXSA9IGFyZ3VtZW50c1tsZW5dO1xuICAgICAgfVxuXG4gICAgICBhcmdzID0gdW5wYWNrJDMoYXJncywgJ2NteWsnKTtcblxuICAgICAgaWYgKHR5cGUkMihhcmdzKSA9PT0gJ2FycmF5JyAmJiBhcmdzLmxlbmd0aCA9PT0gNCkge1xuICAgICAgICByZXR1cm4gJ2NteWsnO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHZhciB1bnBhY2skNCA9IHV0aWxzLnVucGFjaztcbiAgdmFyIGxhc3QkMiA9IHV0aWxzLmxhc3Q7XG5cbiAgdmFyIHJuZCA9IGZ1bmN0aW9uIHJuZChhKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQoYSAqIDEwMCkgLyAxMDA7XG4gIH07XG4gIC8qXG4gICAqIHN1cHBvcnRlZCBhcmd1bWVudHM6XG4gICAqIC0gaHNsMmNzcyhoLHMsbClcbiAgICogLSBoc2wyY3NzKGgscyxsLGEpXG4gICAqIC0gaHNsMmNzcyhbaCxzLGxdLCBtb2RlKVxuICAgKiAtIGhzbDJjc3MoW2gscyxsLGFdLCBtb2RlKVxuICAgKiAtIGhzbDJjc3Moe2gscyxsLGF9LCBtb2RlKVxuICAgKi9cblxuXG4gIHZhciBoc2wyY3NzID0gZnVuY3Rpb24gaHNsMmNzcygpIHtcbiAgICB2YXIgYXJncyA9IFtdLFxuICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGxlbi0tKSB7XG4gICAgICBhcmdzW2xlbl0gPSBhcmd1bWVudHNbbGVuXTtcbiAgICB9XG5cbiAgICB2YXIgaHNsYSA9IHVucGFjayQ0KGFyZ3MsICdoc2xhJyk7XG4gICAgdmFyIG1vZGUgPSBsYXN0JDIoYXJncykgfHwgJ2xzYSc7XG4gICAgaHNsYVswXSA9IHJuZChoc2xhWzBdIHx8IDApO1xuICAgIGhzbGFbMV0gPSBybmQoaHNsYVsxXSAqIDEwMCkgKyAnJSc7XG4gICAgaHNsYVsyXSA9IHJuZChoc2xhWzJdICogMTAwKSArICclJztcblxuICAgIGlmIChtb2RlID09PSAnaHNsYScgfHwgaHNsYS5sZW5ndGggPiAzICYmIGhzbGFbM10gPCAxKSB7XG4gICAgICBoc2xhWzNdID0gaHNsYS5sZW5ndGggPiAzID8gaHNsYVszXSA6IDE7XG4gICAgICBtb2RlID0gJ2hzbGEnO1xuICAgIH0gZWxzZSB7XG4gICAgICBoc2xhLmxlbmd0aCA9IDM7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZGUgKyBcIihcIiArIGhzbGEuam9pbignLCcpICsgXCIpXCI7XG4gIH07XG5cbiAgdmFyIGhzbDJjc3NfMSA9IGhzbDJjc3M7XG4gIHZhciB1bnBhY2skNSA9IHV0aWxzLnVucGFjaztcbiAgLypcbiAgICogc3VwcG9ydGVkIGFyZ3VtZW50czpcbiAgICogLSByZ2IyaHNsKHIsZyxiKVxuICAgKiAtIHJnYjJoc2wocixnLGIsYSlcbiAgICogLSByZ2IyaHNsKFtyLGcsYl0pXG4gICAqIC0gcmdiMmhzbChbcixnLGIsYV0pXG4gICAqIC0gcmdiMmhzbCh7cixnLGIsYX0pXG4gICAqL1xuXG4gIHZhciByZ2IyaHNsID0gZnVuY3Rpb24gcmdiMmhzbCgpIHtcbiAgICB2YXIgYXJncyA9IFtdLFxuICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGxlbi0tKSB7XG4gICAgICBhcmdzW2xlbl0gPSBhcmd1bWVudHNbbGVuXTtcbiAgICB9XG5cbiAgICBhcmdzID0gdW5wYWNrJDUoYXJncywgJ3JnYmEnKTtcbiAgICB2YXIgciA9IGFyZ3NbMF07XG4gICAgdmFyIGcgPSBhcmdzWzFdO1xuICAgIHZhciBiID0gYXJnc1syXTtcbiAgICByIC89IDI1NTtcbiAgICBnIC89IDI1NTtcbiAgICBiIC89IDI1NTtcbiAgICB2YXIgbWluID0gTWF0aC5taW4ociwgZywgYik7XG4gICAgdmFyIG1heCA9IE1hdGgubWF4KHIsIGcsIGIpO1xuICAgIHZhciBsID0gKG1heCArIG1pbikgLyAyO1xuICAgIHZhciBzLCBoO1xuXG4gICAgaWYgKG1heCA9PT0gbWluKSB7XG4gICAgICBzID0gMDtcbiAgICAgIGggPSBOdW1iZXIuTmFOO1xuICAgIH0gZWxzZSB7XG4gICAgICBzID0gbCA8IDAuNSA/IChtYXggLSBtaW4pIC8gKG1heCArIG1pbikgOiAobWF4IC0gbWluKSAvICgyIC0gbWF4IC0gbWluKTtcbiAgICB9XG5cbiAgICBpZiAociA9PSBtYXgpIHtcbiAgICAgIGggPSAoZyAtIGIpIC8gKG1heCAtIG1pbik7XG4gICAgfSBlbHNlIGlmIChnID09IG1heCkge1xuICAgICAgaCA9IDIgKyAoYiAtIHIpIC8gKG1heCAtIG1pbik7XG4gICAgfSBlbHNlIGlmIChiID09IG1heCkge1xuICAgICAgaCA9IDQgKyAociAtIGcpIC8gKG1heCAtIG1pbik7XG4gICAgfVxuXG4gICAgaCAqPSA2MDtcblxuICAgIGlmIChoIDwgMCkge1xuICAgICAgaCArPSAzNjA7XG4gICAgfVxuXG4gICAgaWYgKGFyZ3MubGVuZ3RoID4gMyAmJiBhcmdzWzNdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBbaCwgcywgbCwgYXJnc1szXV07XG4gICAgfVxuXG4gICAgcmV0dXJuIFtoLCBzLCBsXTtcbiAgfTtcblxuICB2YXIgcmdiMmhzbF8xID0gcmdiMmhzbDtcbiAgdmFyIHVucGFjayQ2ID0gdXRpbHMudW5wYWNrO1xuICB2YXIgbGFzdCQzID0gdXRpbHMubGFzdDtcbiAgdmFyIHJvdW5kID0gTWF0aC5yb3VuZDtcbiAgLypcbiAgICogc3VwcG9ydGVkIGFyZ3VtZW50czpcbiAgICogLSByZ2IyY3NzKHIsZyxiKVxuICAgKiAtIHJnYjJjc3MocixnLGIsYSlcbiAgICogLSByZ2IyY3NzKFtyLGcsYl0sIG1vZGUpXG4gICAqIC0gcmdiMmNzcyhbcixnLGIsYV0sIG1vZGUpXG4gICAqIC0gcmdiMmNzcyh7cixnLGIsYX0sIG1vZGUpXG4gICAqL1xuXG4gIHZhciByZ2IyY3NzID0gZnVuY3Rpb24gcmdiMmNzcygpIHtcbiAgICB2YXIgYXJncyA9IFtdLFxuICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGxlbi0tKSB7XG4gICAgICBhcmdzW2xlbl0gPSBhcmd1bWVudHNbbGVuXTtcbiAgICB9XG5cbiAgICB2YXIgcmdiYSA9IHVucGFjayQ2KGFyZ3MsICdyZ2JhJyk7XG4gICAgdmFyIG1vZGUgPSBsYXN0JDMoYXJncykgfHwgJ3JnYic7XG5cbiAgICBpZiAobW9kZS5zdWJzdHIoMCwgMykgPT0gJ2hzbCcpIHtcbiAgICAgIHJldHVybiBoc2wyY3NzXzEocmdiMmhzbF8xKHJnYmEpLCBtb2RlKTtcbiAgICB9XG5cbiAgICByZ2JhWzBdID0gcm91bmQocmdiYVswXSk7XG4gICAgcmdiYVsxXSA9IHJvdW5kKHJnYmFbMV0pO1xuICAgIHJnYmFbMl0gPSByb3VuZChyZ2JhWzJdKTtcblxuICAgIGlmIChtb2RlID09PSAncmdiYScgfHwgcmdiYS5sZW5ndGggPiAzICYmIHJnYmFbM10gPCAxKSB7XG4gICAgICByZ2JhWzNdID0gcmdiYS5sZW5ndGggPiAzID8gcmdiYVszXSA6IDE7XG4gICAgICBtb2RlID0gJ3JnYmEnO1xuICAgIH1cblxuICAgIHJldHVybiBtb2RlICsgXCIoXCIgKyByZ2JhLnNsaWNlKDAsIG1vZGUgPT09ICdyZ2InID8gMyA6IDQpLmpvaW4oJywnKSArIFwiKVwiO1xuICB9O1xuXG4gIHZhciByZ2IyY3NzXzEgPSByZ2IyY3NzO1xuICB2YXIgdW5wYWNrJDcgPSB1dGlscy51bnBhY2s7XG4gIHZhciByb3VuZCQxID0gTWF0aC5yb3VuZDtcblxuICB2YXIgaHNsMnJnYiA9IGZ1bmN0aW9uIGhzbDJyZ2IoKSB7XG4gICAgdmFyIGFzc2lnbjtcbiAgICB2YXIgYXJncyA9IFtdLFxuICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGxlbi0tKSB7XG4gICAgICBhcmdzW2xlbl0gPSBhcmd1bWVudHNbbGVuXTtcbiAgICB9XG5cbiAgICBhcmdzID0gdW5wYWNrJDcoYXJncywgJ2hzbCcpO1xuICAgIHZhciBoID0gYXJnc1swXTtcbiAgICB2YXIgcyA9IGFyZ3NbMV07XG4gICAgdmFyIGwgPSBhcmdzWzJdO1xuICAgIHZhciByLCBnLCBiO1xuXG4gICAgaWYgKHMgPT09IDApIHtcbiAgICAgIHIgPSBnID0gYiA9IGwgKiAyNTU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB0MyA9IFswLCAwLCAwXTtcbiAgICAgIHZhciBjID0gWzAsIDAsIDBdO1xuICAgICAgdmFyIHQyID0gbCA8IDAuNSA/IGwgKiAoMSArIHMpIDogbCArIHMgLSBsICogcztcbiAgICAgIHZhciB0MSA9IDIgKiBsIC0gdDI7XG4gICAgICB2YXIgaF8gPSBoIC8gMzYwO1xuICAgICAgdDNbMF0gPSBoXyArIDEgLyAzO1xuICAgICAgdDNbMV0gPSBoXztcbiAgICAgIHQzWzJdID0gaF8gLSAxIC8gMztcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAzOyBpKyspIHtcbiAgICAgICAgaWYgKHQzW2ldIDwgMCkge1xuICAgICAgICAgIHQzW2ldICs9IDE7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodDNbaV0gPiAxKSB7XG4gICAgICAgICAgdDNbaV0gLT0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICg2ICogdDNbaV0gPCAxKSB7XG4gICAgICAgICAgY1tpXSA9IHQxICsgKHQyIC0gdDEpICogNiAqIHQzW2ldO1xuICAgICAgICB9IGVsc2UgaWYgKDIgKiB0M1tpXSA8IDEpIHtcbiAgICAgICAgICBjW2ldID0gdDI7XG4gICAgICAgIH0gZWxzZSBpZiAoMyAqIHQzW2ldIDwgMikge1xuICAgICAgICAgIGNbaV0gPSB0MSArICh0MiAtIHQxKSAqICgyIC8gMyAtIHQzW2ldKSAqIDY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY1tpXSA9IHQxO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGFzc2lnbiA9IFtyb3VuZCQxKGNbMF0gKiAyNTUpLCByb3VuZCQxKGNbMV0gKiAyNTUpLCByb3VuZCQxKGNbMl0gKiAyNTUpXSwgciA9IGFzc2lnblswXSwgZyA9IGFzc2lnblsxXSwgYiA9IGFzc2lnblsyXTtcbiAgICB9XG5cbiAgICBpZiAoYXJncy5sZW5ndGggPiAzKSB7XG4gICAgICAvLyBrZWVwIGFscGhhIGNoYW5uZWxcbiAgICAgIHJldHVybiBbciwgZywgYiwgYXJnc1szXV07XG4gICAgfVxuXG4gICAgcmV0dXJuIFtyLCBnLCBiLCAxXTtcbiAgfTtcblxuICB2YXIgaHNsMnJnYl8xID0gaHNsMnJnYjtcbiAgdmFyIFJFX1JHQiA9IC9ecmdiXFwoXFxzKigtP1xcZCspLFxccyooLT9cXGQrKVxccyosXFxzKigtP1xcZCspXFxzKlxcKSQvO1xuICB2YXIgUkVfUkdCQSA9IC9ecmdiYVxcKFxccyooLT9cXGQrKSxcXHMqKC0/XFxkKylcXHMqLFxccyooLT9cXGQrKVxccyosXFxzKihbMDFdfFswMV0/XFwuXFxkKylcXCkkLztcbiAgdmFyIFJFX1JHQl9QQ1QgPSAvXnJnYlxcKFxccyooLT9cXGQrKD86XFwuXFxkKyk/KSUsXFxzKigtP1xcZCsoPzpcXC5cXGQrKT8pJVxccyosXFxzKigtP1xcZCsoPzpcXC5cXGQrKT8pJVxccypcXCkkLztcbiAgdmFyIFJFX1JHQkFfUENUID0gL15yZ2JhXFwoXFxzKigtP1xcZCsoPzpcXC5cXGQrKT8pJSxcXHMqKC0/XFxkKyg/OlxcLlxcZCspPyklXFxzKixcXHMqKC0/XFxkKyg/OlxcLlxcZCspPyklXFxzKixcXHMqKFswMV18WzAxXT9cXC5cXGQrKVxcKSQvO1xuICB2YXIgUkVfSFNMID0gL15oc2xcXChcXHMqKC0/XFxkKyg/OlxcLlxcZCspPyksXFxzKigtP1xcZCsoPzpcXC5cXGQrKT8pJVxccyosXFxzKigtP1xcZCsoPzpcXC5cXGQrKT8pJVxccypcXCkkLztcbiAgdmFyIFJFX0hTTEEgPSAvXmhzbGFcXChcXHMqKC0/XFxkKyg/OlxcLlxcZCspPyksXFxzKigtP1xcZCsoPzpcXC5cXGQrKT8pJVxccyosXFxzKigtP1xcZCsoPzpcXC5cXGQrKT8pJVxccyosXFxzKihbMDFdfFswMV0/XFwuXFxkKylcXCkkLztcbiAgdmFyIHJvdW5kJDIgPSBNYXRoLnJvdW5kO1xuXG4gIHZhciBjc3MycmdiID0gZnVuY3Rpb24gY3NzMnJnYihjc3MpIHtcbiAgICBjc3MgPSBjc3MudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgdmFyIG07XG5cbiAgICBpZiAoaW5wdXQuZm9ybWF0Lm5hbWVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gaW5wdXQuZm9ybWF0Lm5hbWVkKGNzcyk7XG4gICAgICB9IGNhdGNoIChlKSB7Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICB9XG4gICAgfSAvLyByZ2IoMjUwLDIwLDApXG5cblxuICAgIGlmIChtID0gY3NzLm1hdGNoKFJFX1JHQikpIHtcbiAgICAgIHZhciByZ2IgPSBtLnNsaWNlKDEsIDQpO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDM7IGkrKykge1xuICAgICAgICByZ2JbaV0gPSArcmdiW2ldO1xuICAgICAgfVxuXG4gICAgICByZ2JbM10gPSAxOyAvLyBkZWZhdWx0IGFscGhhXG5cbiAgICAgIHJldHVybiByZ2I7XG4gICAgfSAvLyByZ2JhKDI1MCwyMCwwLDAuNClcblxuXG4gICAgaWYgKG0gPSBjc3MubWF0Y2goUkVfUkdCQSkpIHtcbiAgICAgIHZhciByZ2IkMSA9IG0uc2xpY2UoMSwgNSk7XG5cbiAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IDQ7IGkkMSsrKSB7XG4gICAgICAgIHJnYiQxW2kkMV0gPSArcmdiJDFbaSQxXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJnYiQxO1xuICAgIH0gLy8gcmdiKDEwMCUsMCUsMCUpXG5cblxuICAgIGlmIChtID0gY3NzLm1hdGNoKFJFX1JHQl9QQ1QpKSB7XG4gICAgICB2YXIgcmdiJDIgPSBtLnNsaWNlKDEsIDQpO1xuXG4gICAgICBmb3IgKHZhciBpJDIgPSAwOyBpJDIgPCAzOyBpJDIrKykge1xuICAgICAgICByZ2IkMltpJDJdID0gcm91bmQkMihyZ2IkMltpJDJdICogMi41NSk7XG4gICAgICB9XG5cbiAgICAgIHJnYiQyWzNdID0gMTsgLy8gZGVmYXVsdCBhbHBoYVxuXG4gICAgICByZXR1cm4gcmdiJDI7XG4gICAgfSAvLyByZ2JhKDEwMCUsMCUsMCUsMC40KVxuXG5cbiAgICBpZiAobSA9IGNzcy5tYXRjaChSRV9SR0JBX1BDVCkpIHtcbiAgICAgIHZhciByZ2IkMyA9IG0uc2xpY2UoMSwgNSk7XG5cbiAgICAgIGZvciAodmFyIGkkMyA9IDA7IGkkMyA8IDM7IGkkMysrKSB7XG4gICAgICAgIHJnYiQzW2kkM10gPSByb3VuZCQyKHJnYiQzW2kkM10gKiAyLjU1KTtcbiAgICAgIH1cblxuICAgICAgcmdiJDNbM10gPSArcmdiJDNbM107XG4gICAgICByZXR1cm4gcmdiJDM7XG4gICAgfSAvLyBoc2woMCwxMDAlLDUwJSlcblxuXG4gICAgaWYgKG0gPSBjc3MubWF0Y2goUkVfSFNMKSkge1xuICAgICAgdmFyIGhzbCA9IG0uc2xpY2UoMSwgNCk7XG4gICAgICBoc2xbMV0gKj0gMC4wMTtcbiAgICAgIGhzbFsyXSAqPSAwLjAxO1xuICAgICAgdmFyIHJnYiQ0ID0gaHNsMnJnYl8xKGhzbCk7XG4gICAgICByZ2IkNFszXSA9IDE7XG4gICAgICByZXR1cm4gcmdiJDQ7XG4gICAgfSAvLyBoc2xhKDAsMTAwJSw1MCUsMC41KVxuXG5cbiAgICBpZiAobSA9IGNzcy5tYXRjaChSRV9IU0xBKSkge1xuICAgICAgdmFyIGhzbCQxID0gbS5zbGljZSgxLCA0KTtcbiAgICAgIGhzbCQxWzFdICo9IDAuMDE7XG4gICAgICBoc2wkMVsyXSAqPSAwLjAxO1xuICAgICAgdmFyIHJnYiQ1ID0gaHNsMnJnYl8xKGhzbCQxKTtcbiAgICAgIHJnYiQ1WzNdID0gK21bNF07IC8vIGRlZmF1bHQgYWxwaGEgPSAxXG5cbiAgICAgIHJldHVybiByZ2IkNTtcbiAgICB9XG4gIH07XG5cbiAgY3NzMnJnYi50ZXN0ID0gZnVuY3Rpb24gKHMpIHtcbiAgICByZXR1cm4gUkVfUkdCLnRlc3QocykgfHwgUkVfUkdCQS50ZXN0KHMpIHx8IFJFX1JHQl9QQ1QudGVzdChzKSB8fCBSRV9SR0JBX1BDVC50ZXN0KHMpIHx8IFJFX0hTTC50ZXN0KHMpIHx8IFJFX0hTTEEudGVzdChzKTtcbiAgfTtcblxuICB2YXIgY3NzMnJnYl8xID0gY3NzMnJnYjtcbiAgdmFyIHR5cGUkMyA9IHV0aWxzLnR5cGU7XG5cbiAgQ29sb3JfMS5wcm90b3R5cGUuY3NzID0gZnVuY3Rpb24gKG1vZGUpIHtcbiAgICByZXR1cm4gcmdiMmNzc18xKHRoaXMuX3JnYiwgbW9kZSk7XG4gIH07XG5cbiAgY2hyb21hXzEuY3NzID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcmdzID0gW10sXG4gICAgICAgIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICB3aGlsZSAobGVuLS0pIHtcbiAgICAgIGFyZ3NbbGVuXSA9IGFyZ3VtZW50c1tsZW5dO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgKEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmFwcGx5KENvbG9yXzEsIFtudWxsXS5jb25jYXQoYXJncywgWydjc3MnXSkpKSgpO1xuICB9O1xuXG4gIGlucHV0LmZvcm1hdC5jc3MgPSBjc3MycmdiXzE7XG4gIGlucHV0LmF1dG9kZXRlY3QucHVzaCh7XG4gICAgcDogNSxcbiAgICB0ZXN0OiBmdW5jdGlvbiB0ZXN0KGgpIHtcbiAgICAgIHZhciByZXN0ID0gW10sXG4gICAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7XG5cbiAgICAgIHdoaWxlIChsZW4tLSA+IDApIHtcbiAgICAgICAgcmVzdFtsZW5dID0gYXJndW1lbnRzW2xlbiArIDFdO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXJlc3QubGVuZ3RoICYmIHR5cGUkMyhoKSA9PT0gJ3N0cmluZycgJiYgY3NzMnJnYl8xLnRlc3QoaCkpIHtcbiAgICAgICAgcmV0dXJuICdjc3MnO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHZhciB1bnBhY2skOCA9IHV0aWxzLnVucGFjaztcblxuICBpbnB1dC5mb3JtYXQuZ2wgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSxcbiAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW4tLSkge1xuICAgICAgYXJnc1tsZW5dID0gYXJndW1lbnRzW2xlbl07XG4gICAgfVxuXG4gICAgdmFyIHJnYiA9IHVucGFjayQ4KGFyZ3MsICdyZ2JhJyk7XG4gICAgcmdiWzBdICo9IDI1NTtcbiAgICByZ2JbMV0gKj0gMjU1O1xuICAgIHJnYlsyXSAqPSAyNTU7XG4gICAgcmV0dXJuIHJnYjtcbiAgfTtcblxuICBjaHJvbWFfMS5nbCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJncyA9IFtdLFxuICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGxlbi0tKSB7XG4gICAgICBhcmdzW2xlbl0gPSBhcmd1bWVudHNbbGVuXTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IChGdW5jdGlvbi5wcm90b3R5cGUuYmluZC5hcHBseShDb2xvcl8xLCBbbnVsbF0uY29uY2F0KGFyZ3MsIFsnZ2wnXSkpKSgpO1xuICB9O1xuXG4gIENvbG9yXzEucHJvdG90eXBlLmdsID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciByZ2IgPSB0aGlzLl9yZ2I7XG4gICAgcmV0dXJuIFtyZ2JbMF0gLyAyNTUsIHJnYlsxXSAvIDI1NSwgcmdiWzJdIC8gMjU1LCByZ2JbM11dO1xuICB9O1xuXG4gIHZhciB1bnBhY2skOSA9IHV0aWxzLnVucGFjaztcblxuICB2YXIgcmdiMmhjZyA9IGZ1bmN0aW9uIHJnYjJoY2coKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSxcbiAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW4tLSkge1xuICAgICAgYXJnc1tsZW5dID0gYXJndW1lbnRzW2xlbl07XG4gICAgfVxuXG4gICAgdmFyIHJlZiA9IHVucGFjayQ5KGFyZ3MsICdyZ2InKTtcbiAgICB2YXIgciA9IHJlZlswXTtcbiAgICB2YXIgZyA9IHJlZlsxXTtcbiAgICB2YXIgYiA9IHJlZlsyXTtcbiAgICB2YXIgbWluID0gTWF0aC5taW4ociwgZywgYik7XG4gICAgdmFyIG1heCA9IE1hdGgubWF4KHIsIGcsIGIpO1xuICAgIHZhciBkZWx0YSA9IG1heCAtIG1pbjtcbiAgICB2YXIgYyA9IGRlbHRhICogMTAwIC8gMjU1O1xuXG4gICAgdmFyIF9nID0gbWluIC8gKDI1NSAtIGRlbHRhKSAqIDEwMDtcblxuICAgIHZhciBoO1xuXG4gICAgaWYgKGRlbHRhID09PSAwKSB7XG4gICAgICBoID0gTnVtYmVyLk5hTjtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHIgPT09IG1heCkge1xuICAgICAgICBoID0gKGcgLSBiKSAvIGRlbHRhO1xuICAgICAgfVxuXG4gICAgICBpZiAoZyA9PT0gbWF4KSB7XG4gICAgICAgIGggPSAyICsgKGIgLSByKSAvIGRlbHRhO1xuICAgICAgfVxuXG4gICAgICBpZiAoYiA9PT0gbWF4KSB7XG4gICAgICAgIGggPSA0ICsgKHIgLSBnKSAvIGRlbHRhO1xuICAgICAgfVxuXG4gICAgICBoICo9IDYwO1xuXG4gICAgICBpZiAoaCA8IDApIHtcbiAgICAgICAgaCArPSAzNjA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFtoLCBjLCBfZ107XG4gIH07XG5cbiAgdmFyIHJnYjJoY2dfMSA9IHJnYjJoY2c7XG4gIHZhciB1bnBhY2skYSA9IHV0aWxzLnVucGFjaztcbiAgdmFyIGZsb29yID0gTWF0aC5mbG9vcjtcbiAgLypcbiAgICogdGhpcyBpcyBiYXNpY2FsbHkganVzdCBIU1Ygd2l0aCBzb21lIG1pbm9yIHR3ZWFrc1xuICAgKlxuICAgKiBodWUuLiBbMC4uMzYwXVxuICAgKiBjaHJvbWEgLi4gWzAuLjFdXG4gICAqIGdyYXluZXNzIC4uIFswLi4xXVxuICAgKi9cblxuICB2YXIgaGNnMnJnYiA9IGZ1bmN0aW9uIGhjZzJyZ2IoKSB7XG4gICAgdmFyIGFzc2lnbiwgYXNzaWduJDEsIGFzc2lnbiQyLCBhc3NpZ24kMywgYXNzaWduJDQsIGFzc2lnbiQ1O1xuICAgIHZhciBhcmdzID0gW10sXG4gICAgICAgIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICB3aGlsZSAobGVuLS0pIHtcbiAgICAgIGFyZ3NbbGVuXSA9IGFyZ3VtZW50c1tsZW5dO1xuICAgIH1cblxuICAgIGFyZ3MgPSB1bnBhY2skYShhcmdzLCAnaGNnJyk7XG4gICAgdmFyIGggPSBhcmdzWzBdO1xuICAgIHZhciBjID0gYXJnc1sxXTtcbiAgICB2YXIgX2cgPSBhcmdzWzJdO1xuICAgIHZhciByLCBnLCBiO1xuICAgIF9nID0gX2cgKiAyNTU7XG5cbiAgICB2YXIgX2MgPSBjICogMjU1O1xuXG4gICAgaWYgKGMgPT09IDApIHtcbiAgICAgIHIgPSBnID0gYiA9IF9nO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaCA9PT0gMzYwKSB7XG4gICAgICAgIGggPSAwO1xuICAgICAgfVxuXG4gICAgICBpZiAoaCA+IDM2MCkge1xuICAgICAgICBoIC09IDM2MDtcbiAgICAgIH1cblxuICAgICAgaWYgKGggPCAwKSB7XG4gICAgICAgIGggKz0gMzYwO1xuICAgICAgfVxuXG4gICAgICBoIC89IDYwO1xuICAgICAgdmFyIGkgPSBmbG9vcihoKTtcbiAgICAgIHZhciBmID0gaCAtIGk7XG4gICAgICB2YXIgcCA9IF9nICogKDEgLSBjKTtcbiAgICAgIHZhciBxID0gcCArIF9jICogKDEgLSBmKTtcbiAgICAgIHZhciB0ID0gcCArIF9jICogZjtcbiAgICAgIHZhciB2ID0gcCArIF9jO1xuXG4gICAgICBzd2l0Y2ggKGkpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGFzc2lnbiA9IFt2LCB0LCBwXSwgciA9IGFzc2lnblswXSwgZyA9IGFzc2lnblsxXSwgYiA9IGFzc2lnblsyXTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgYXNzaWduJDEgPSBbcSwgdiwgcF0sIHIgPSBhc3NpZ24kMVswXSwgZyA9IGFzc2lnbiQxWzFdLCBiID0gYXNzaWduJDFbMl07XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIGFzc2lnbiQyID0gW3AsIHYsIHRdLCByID0gYXNzaWduJDJbMF0sIGcgPSBhc3NpZ24kMlsxXSwgYiA9IGFzc2lnbiQyWzJdO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBhc3NpZ24kMyA9IFtwLCBxLCB2XSwgciA9IGFzc2lnbiQzWzBdLCBnID0gYXNzaWduJDNbMV0sIGIgPSBhc3NpZ24kM1syXTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgYXNzaWduJDQgPSBbdCwgcCwgdl0sIHIgPSBhc3NpZ24kNFswXSwgZyA9IGFzc2lnbiQ0WzFdLCBiID0gYXNzaWduJDRbMl07XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIGFzc2lnbiQ1ID0gW3YsIHAsIHFdLCByID0gYXNzaWduJDVbMF0sIGcgPSBhc3NpZ24kNVsxXSwgYiA9IGFzc2lnbiQ1WzJdO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBbciwgZywgYiwgYXJncy5sZW5ndGggPiAzID8gYXJnc1szXSA6IDFdO1xuICB9O1xuXG4gIHZhciBoY2cycmdiXzEgPSBoY2cycmdiO1xuICB2YXIgdW5wYWNrJGIgPSB1dGlscy51bnBhY2s7XG4gIHZhciB0eXBlJDQgPSB1dGlscy50eXBlO1xuXG4gIENvbG9yXzEucHJvdG90eXBlLmhjZyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gcmdiMmhjZ18xKHRoaXMuX3JnYik7XG4gIH07XG5cbiAgY2hyb21hXzEuaGNnID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcmdzID0gW10sXG4gICAgICAgIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICB3aGlsZSAobGVuLS0pIHtcbiAgICAgIGFyZ3NbbGVuXSA9IGFyZ3VtZW50c1tsZW5dO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgKEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmFwcGx5KENvbG9yXzEsIFtudWxsXS5jb25jYXQoYXJncywgWydoY2cnXSkpKSgpO1xuICB9O1xuXG4gIGlucHV0LmZvcm1hdC5oY2cgPSBoY2cycmdiXzE7XG4gIGlucHV0LmF1dG9kZXRlY3QucHVzaCh7XG4gICAgcDogMSxcbiAgICB0ZXN0OiBmdW5jdGlvbiB0ZXN0KCkge1xuICAgICAgdmFyIGFyZ3MgPSBbXSxcbiAgICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAobGVuLS0pIHtcbiAgICAgICAgYXJnc1tsZW5dID0gYXJndW1lbnRzW2xlbl07XG4gICAgICB9XG5cbiAgICAgIGFyZ3MgPSB1bnBhY2skYihhcmdzLCAnaGNnJyk7XG5cbiAgICAgIGlmICh0eXBlJDQoYXJncykgPT09ICdhcnJheScgJiYgYXJncy5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgcmV0dXJuICdoY2cnO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHZhciB1bnBhY2skYyA9IHV0aWxzLnVucGFjaztcbiAgdmFyIGxhc3QkNCA9IHV0aWxzLmxhc3Q7XG4gIHZhciByb3VuZCQzID0gTWF0aC5yb3VuZDtcblxuICB2YXIgcmdiMmhleCA9IGZ1bmN0aW9uIHJnYjJoZXgoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSxcbiAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW4tLSkge1xuICAgICAgYXJnc1tsZW5dID0gYXJndW1lbnRzW2xlbl07XG4gICAgfVxuXG4gICAgdmFyIHJlZiA9IHVucGFjayRjKGFyZ3MsICdyZ2JhJyk7XG4gICAgdmFyIHIgPSByZWZbMF07XG4gICAgdmFyIGcgPSByZWZbMV07XG4gICAgdmFyIGIgPSByZWZbMl07XG4gICAgdmFyIGEgPSByZWZbM107XG4gICAgdmFyIG1vZGUgPSBsYXN0JDQoYXJncykgfHwgJ2F1dG8nO1xuXG4gICAgaWYgKGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYSA9IDE7XG4gICAgfVxuXG4gICAgaWYgKG1vZGUgPT09ICdhdXRvJykge1xuICAgICAgbW9kZSA9IGEgPCAxID8gJ3JnYmEnIDogJ3JnYic7XG4gICAgfVxuXG4gICAgciA9IHJvdW5kJDMocik7XG4gICAgZyA9IHJvdW5kJDMoZyk7XG4gICAgYiA9IHJvdW5kJDMoYik7XG4gICAgdmFyIHUgPSByIDw8IDE2IHwgZyA8PCA4IHwgYjtcbiAgICB2YXIgc3RyID0gXCIwMDAwMDBcIiArIHUudG9TdHJpbmcoMTYpOyAvLyMudG9VcHBlckNhc2UoKTtcblxuICAgIHN0ciA9IHN0ci5zdWJzdHIoc3RyLmxlbmd0aCAtIDYpO1xuICAgIHZhciBoeGEgPSAnMCcgKyByb3VuZCQzKGEgKiAyNTUpLnRvU3RyaW5nKDE2KTtcbiAgICBoeGEgPSBoeGEuc3Vic3RyKGh4YS5sZW5ndGggLSAyKTtcblxuICAgIHN3aXRjaCAobW9kZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICBjYXNlICdyZ2JhJzpcbiAgICAgICAgcmV0dXJuIFwiI1wiICsgc3RyICsgaHhhO1xuXG4gICAgICBjYXNlICdhcmdiJzpcbiAgICAgICAgcmV0dXJuIFwiI1wiICsgaHhhICsgc3RyO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gXCIjXCIgKyBzdHI7XG4gICAgfVxuICB9O1xuXG4gIHZhciByZ2IyaGV4XzEgPSByZ2IyaGV4O1xuICB2YXIgUkVfSEVYID0gL14jPyhbQS1GYS1mMC05XXs2fXxbQS1GYS1mMC05XXszfSkkLztcbiAgdmFyIFJFX0hFWEEgPSAvXiM/KFtBLUZhLWYwLTldezh9fFtBLUZhLWYwLTldezR9KSQvO1xuXG4gIHZhciBoZXgycmdiID0gZnVuY3Rpb24gaGV4MnJnYihoZXgpIHtcbiAgICBpZiAoaGV4Lm1hdGNoKFJFX0hFWCkpIHtcbiAgICAgIC8vIHJlbW92ZSBvcHRpb25hbCBsZWFkaW5nICNcbiAgICAgIGlmIChoZXgubGVuZ3RoID09PSA0IHx8IGhleC5sZW5ndGggPT09IDcpIHtcbiAgICAgICAgaGV4ID0gaGV4LnN1YnN0cigxKTtcbiAgICAgIH0gLy8gZXhwYW5kIHNob3J0LW5vdGF0aW9uIHRvIGZ1bGwgc2l4LWRpZ2l0XG5cblxuICAgICAgaWYgKGhleC5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgaGV4ID0gaGV4LnNwbGl0KCcnKTtcbiAgICAgICAgaGV4ID0gaGV4WzBdICsgaGV4WzBdICsgaGV4WzFdICsgaGV4WzFdICsgaGV4WzJdICsgaGV4WzJdO1xuICAgICAgfVxuXG4gICAgICB2YXIgdSA9IHBhcnNlSW50KGhleCwgMTYpO1xuICAgICAgdmFyIHIgPSB1ID4+IDE2O1xuICAgICAgdmFyIGcgPSB1ID4+IDggJiAweEZGO1xuICAgICAgdmFyIGIgPSB1ICYgMHhGRjtcbiAgICAgIHJldHVybiBbciwgZywgYiwgMV07XG4gICAgfSAvLyBtYXRjaCByZ2JhIGhleCBmb3JtYXQsIGVnICNGRjAwMDA3N1xuXG5cbiAgICBpZiAoaGV4Lm1hdGNoKFJFX0hFWEEpKSB7XG4gICAgICBpZiAoaGV4Lmxlbmd0aCA9PT0gNSB8fCBoZXgubGVuZ3RoID09PSA5KSB7XG4gICAgICAgIC8vIHJlbW92ZSBvcHRpb25hbCBsZWFkaW5nICNcbiAgICAgICAgaGV4ID0gaGV4LnN1YnN0cigxKTtcbiAgICAgIH0gLy8gZXhwYW5kIHNob3J0LW5vdGF0aW9uIHRvIGZ1bGwgZWlnaHQtZGlnaXRcblxuXG4gICAgICBpZiAoaGV4Lmxlbmd0aCA9PT0gNCkge1xuICAgICAgICBoZXggPSBoZXguc3BsaXQoJycpO1xuICAgICAgICBoZXggPSBoZXhbMF0gKyBoZXhbMF0gKyBoZXhbMV0gKyBoZXhbMV0gKyBoZXhbMl0gKyBoZXhbMl0gKyBoZXhbM10gKyBoZXhbM107XG4gICAgICB9XG5cbiAgICAgIHZhciB1JDEgPSBwYXJzZUludChoZXgsIDE2KTtcbiAgICAgIHZhciByJDEgPSB1JDEgPj4gMjQgJiAweEZGO1xuICAgICAgdmFyIGckMSA9IHUkMSA+PiAxNiAmIDB4RkY7XG4gICAgICB2YXIgYiQxID0gdSQxID4+IDggJiAweEZGO1xuICAgICAgdmFyIGEgPSBNYXRoLnJvdW5kKCh1JDEgJiAweEZGKSAvIDB4RkYgKiAxMDApIC8gMTAwO1xuICAgICAgcmV0dXJuIFtyJDEsIGckMSwgYiQxLCBhXTtcbiAgICB9IC8vIHdlIHVzZWQgdG8gY2hlY2sgZm9yIGNzcyBjb2xvcnMgaGVyZVxuICAgIC8vIGlmIF9pbnB1dC5jc3M/IGFuZCByZ2IgPSBfaW5wdXQuY3NzIGhleFxuICAgIC8vICAgICByZXR1cm4gcmdiXG5cblxuICAgIHRocm93IG5ldyBFcnJvcihcInVua25vd24gaGV4IGNvbG9yOiBcIiArIGhleCk7XG4gIH07XG5cbiAgdmFyIGhleDJyZ2JfMSA9IGhleDJyZ2I7XG4gIHZhciB0eXBlJDUgPSB1dGlscy50eXBlO1xuXG4gIENvbG9yXzEucHJvdG90eXBlLmhleCA9IGZ1bmN0aW9uIChtb2RlKSB7XG4gICAgcmV0dXJuIHJnYjJoZXhfMSh0aGlzLl9yZ2IsIG1vZGUpO1xuICB9O1xuXG4gIGNocm9tYV8xLmhleCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJncyA9IFtdLFxuICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGxlbi0tKSB7XG4gICAgICBhcmdzW2xlbl0gPSBhcmd1bWVudHNbbGVuXTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IChGdW5jdGlvbi5wcm90b3R5cGUuYmluZC5hcHBseShDb2xvcl8xLCBbbnVsbF0uY29uY2F0KGFyZ3MsIFsnaGV4J10pKSkoKTtcbiAgfTtcblxuICBpbnB1dC5mb3JtYXQuaGV4ID0gaGV4MnJnYl8xO1xuICBpbnB1dC5hdXRvZGV0ZWN0LnB1c2goe1xuICAgIHA6IDQsXG4gICAgdGVzdDogZnVuY3Rpb24gdGVzdChoKSB7XG4gICAgICB2YXIgcmVzdCA9IFtdLFxuICAgICAgICAgIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGggLSAxO1xuXG4gICAgICB3aGlsZSAobGVuLS0gPiAwKSB7XG4gICAgICAgIHJlc3RbbGVuXSA9IGFyZ3VtZW50c1tsZW4gKyAxXTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFyZXN0Lmxlbmd0aCAmJiB0eXBlJDUoaCkgPT09ICdzdHJpbmcnICYmIFszLCA0LCA1LCA2LCA3LCA4LCA5XS5pbmRleE9mKGgubGVuZ3RoKSA+PSAwKSB7XG4gICAgICAgIHJldHVybiAnaGV4JztcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICB2YXIgdW5wYWNrJGQgPSB1dGlscy51bnBhY2s7XG4gIHZhciBUV09QSSA9IHV0aWxzLlRXT1BJO1xuICB2YXIgbWluID0gTWF0aC5taW47XG4gIHZhciBzcXJ0ID0gTWF0aC5zcXJ0O1xuICB2YXIgYWNvcyA9IE1hdGguYWNvcztcblxuICB2YXIgcmdiMmhzaSA9IGZ1bmN0aW9uIHJnYjJoc2koKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSxcbiAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW4tLSkge1xuICAgICAgYXJnc1tsZW5dID0gYXJndW1lbnRzW2xlbl07XG4gICAgfVxuICAgIC8qXG4gICAgYm9ycm93ZWQgZnJvbSBoZXJlOlxuICAgIGh0dHA6Ly9odW1tZXIuc3RhbmZvcmQuZWR1L211c2VpbmZvL2RvYy9leGFtcGxlcy9odW1kcnVtL2tleXNjYXBlMi9yZ2IyaHNpLmNwcFxuICAgICovXG5cblxuICAgIHZhciByZWYgPSB1bnBhY2skZChhcmdzLCAncmdiJyk7XG4gICAgdmFyIHIgPSByZWZbMF07XG4gICAgdmFyIGcgPSByZWZbMV07XG4gICAgdmFyIGIgPSByZWZbMl07XG4gICAgciAvPSAyNTU7XG4gICAgZyAvPSAyNTU7XG4gICAgYiAvPSAyNTU7XG4gICAgdmFyIGg7XG4gICAgdmFyIG1pbl8gPSBtaW4ociwgZywgYik7XG4gICAgdmFyIGkgPSAociArIGcgKyBiKSAvIDM7XG4gICAgdmFyIHMgPSBpID4gMCA/IDEgLSBtaW5fIC8gaSA6IDA7XG5cbiAgICBpZiAocyA9PT0gMCkge1xuICAgICAgaCA9IE5hTjtcbiAgICB9IGVsc2Uge1xuICAgICAgaCA9IChyIC0gZyArIChyIC0gYikpIC8gMjtcbiAgICAgIGggLz0gc3FydCgociAtIGcpICogKHIgLSBnKSArIChyIC0gYikgKiAoZyAtIGIpKTtcbiAgICAgIGggPSBhY29zKGgpO1xuXG4gICAgICBpZiAoYiA+IGcpIHtcbiAgICAgICAgaCA9IFRXT1BJIC0gaDtcbiAgICAgIH1cblxuICAgICAgaCAvPSBUV09QSTtcbiAgICB9XG5cbiAgICByZXR1cm4gW2ggKiAzNjAsIHMsIGldO1xuICB9O1xuXG4gIHZhciByZ2IyaHNpXzEgPSByZ2IyaHNpO1xuICB2YXIgdW5wYWNrJGUgPSB1dGlscy51bnBhY2s7XG4gIHZhciBsaW1pdCQxID0gdXRpbHMubGltaXQ7XG4gIHZhciBUV09QSSQxID0gdXRpbHMuVFdPUEk7XG4gIHZhciBQSVRISVJEID0gdXRpbHMuUElUSElSRDtcbiAgdmFyIGNvcyA9IE1hdGguY29zO1xuICAvKlxuICAgKiBodWUgWzAuLjM2MF1cbiAgICogc2F0dXJhdGlvbiBbMC4uMV1cbiAgICogaW50ZW5zaXR5IFswLi4xXVxuICAgKi9cblxuICB2YXIgaHNpMnJnYiA9IGZ1bmN0aW9uIGhzaTJyZ2IoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSxcbiAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW4tLSkge1xuICAgICAgYXJnc1tsZW5dID0gYXJndW1lbnRzW2xlbl07XG4gICAgfVxuICAgIC8qXG4gICAgYm9ycm93ZWQgZnJvbSBoZXJlOlxuICAgIGh0dHA6Ly9odW1tZXIuc3RhbmZvcmQuZWR1L211c2VpbmZvL2RvYy9leGFtcGxlcy9odW1kcnVtL2tleXNjYXBlMi9oc2kycmdiLmNwcFxuICAgICovXG5cblxuICAgIGFyZ3MgPSB1bnBhY2skZShhcmdzLCAnaHNpJyk7XG4gICAgdmFyIGggPSBhcmdzWzBdO1xuICAgIHZhciBzID0gYXJnc1sxXTtcbiAgICB2YXIgaSA9IGFyZ3NbMl07XG4gICAgdmFyIHIsIGcsIGI7XG5cbiAgICBpZiAoaXNOYU4oaCkpIHtcbiAgICAgIGggPSAwO1xuICAgIH1cblxuICAgIGlmIChpc05hTihzKSkge1xuICAgICAgcyA9IDA7XG4gICAgfSAvLyBub3JtYWxpemUgaHVlXG5cblxuICAgIGlmIChoID4gMzYwKSB7XG4gICAgICBoIC09IDM2MDtcbiAgICB9XG5cbiAgICBpZiAoaCA8IDApIHtcbiAgICAgIGggKz0gMzYwO1xuICAgIH1cblxuICAgIGggLz0gMzYwO1xuXG4gICAgaWYgKGggPCAxIC8gMykge1xuICAgICAgYiA9ICgxIC0gcykgLyAzO1xuICAgICAgciA9ICgxICsgcyAqIGNvcyhUV09QSSQxICogaCkgLyBjb3MoUElUSElSRCAtIFRXT1BJJDEgKiBoKSkgLyAzO1xuICAgICAgZyA9IDEgLSAoYiArIHIpO1xuICAgIH0gZWxzZSBpZiAoaCA8IDIgLyAzKSB7XG4gICAgICBoIC09IDEgLyAzO1xuICAgICAgciA9ICgxIC0gcykgLyAzO1xuICAgICAgZyA9ICgxICsgcyAqIGNvcyhUV09QSSQxICogaCkgLyBjb3MoUElUSElSRCAtIFRXT1BJJDEgKiBoKSkgLyAzO1xuICAgICAgYiA9IDEgLSAociArIGcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBoIC09IDIgLyAzO1xuICAgICAgZyA9ICgxIC0gcykgLyAzO1xuICAgICAgYiA9ICgxICsgcyAqIGNvcyhUV09QSSQxICogaCkgLyBjb3MoUElUSElSRCAtIFRXT1BJJDEgKiBoKSkgLyAzO1xuICAgICAgciA9IDEgLSAoZyArIGIpO1xuICAgIH1cblxuICAgIHIgPSBsaW1pdCQxKGkgKiByICogMyk7XG4gICAgZyA9IGxpbWl0JDEoaSAqIGcgKiAzKTtcbiAgICBiID0gbGltaXQkMShpICogYiAqIDMpO1xuICAgIHJldHVybiBbciAqIDI1NSwgZyAqIDI1NSwgYiAqIDI1NSwgYXJncy5sZW5ndGggPiAzID8gYXJnc1szXSA6IDFdO1xuICB9O1xuXG4gIHZhciBoc2kycmdiXzEgPSBoc2kycmdiO1xuICB2YXIgdW5wYWNrJGYgPSB1dGlscy51bnBhY2s7XG4gIHZhciB0eXBlJDYgPSB1dGlscy50eXBlO1xuXG4gIENvbG9yXzEucHJvdG90eXBlLmhzaSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gcmdiMmhzaV8xKHRoaXMuX3JnYik7XG4gIH07XG5cbiAgY2hyb21hXzEuaHNpID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcmdzID0gW10sXG4gICAgICAgIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICB3aGlsZSAobGVuLS0pIHtcbiAgICAgIGFyZ3NbbGVuXSA9IGFyZ3VtZW50c1tsZW5dO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgKEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmFwcGx5KENvbG9yXzEsIFtudWxsXS5jb25jYXQoYXJncywgWydoc2knXSkpKSgpO1xuICB9O1xuXG4gIGlucHV0LmZvcm1hdC5oc2kgPSBoc2kycmdiXzE7XG4gIGlucHV0LmF1dG9kZXRlY3QucHVzaCh7XG4gICAgcDogMixcbiAgICB0ZXN0OiBmdW5jdGlvbiB0ZXN0KCkge1xuICAgICAgdmFyIGFyZ3MgPSBbXSxcbiAgICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAobGVuLS0pIHtcbiAgICAgICAgYXJnc1tsZW5dID0gYXJndW1lbnRzW2xlbl07XG4gICAgICB9XG5cbiAgICAgIGFyZ3MgPSB1bnBhY2skZihhcmdzLCAnaHNpJyk7XG5cbiAgICAgIGlmICh0eXBlJDYoYXJncykgPT09ICdhcnJheScgJiYgYXJncy5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgcmV0dXJuICdoc2knO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHZhciB1bnBhY2skZyA9IHV0aWxzLnVucGFjaztcbiAgdmFyIHR5cGUkNyA9IHV0aWxzLnR5cGU7XG5cbiAgQ29sb3JfMS5wcm90b3R5cGUuaHNsID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiByZ2IyaHNsXzEodGhpcy5fcmdiKTtcbiAgfTtcblxuICBjaHJvbWFfMS5oc2wgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSxcbiAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW4tLSkge1xuICAgICAgYXJnc1tsZW5dID0gYXJndW1lbnRzW2xlbl07XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyAoRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQuYXBwbHkoQ29sb3JfMSwgW251bGxdLmNvbmNhdChhcmdzLCBbJ2hzbCddKSkpKCk7XG4gIH07XG5cbiAgaW5wdXQuZm9ybWF0LmhzbCA9IGhzbDJyZ2JfMTtcbiAgaW5wdXQuYXV0b2RldGVjdC5wdXNoKHtcbiAgICBwOiAyLFxuICAgIHRlc3Q6IGZ1bmN0aW9uIHRlc3QoKSB7XG4gICAgICB2YXIgYXJncyA9IFtdLFxuICAgICAgICAgIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICAgIHdoaWxlIChsZW4tLSkge1xuICAgICAgICBhcmdzW2xlbl0gPSBhcmd1bWVudHNbbGVuXTtcbiAgICAgIH1cblxuICAgICAgYXJncyA9IHVucGFjayRnKGFyZ3MsICdoc2wnKTtcblxuICAgICAgaWYgKHR5cGUkNyhhcmdzKSA9PT0gJ2FycmF5JyAmJiBhcmdzLmxlbmd0aCA9PT0gMykge1xuICAgICAgICByZXR1cm4gJ2hzbCc7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgdmFyIHVucGFjayRoID0gdXRpbHMudW5wYWNrO1xuICB2YXIgbWluJDEgPSBNYXRoLm1pbjtcbiAgdmFyIG1heCQxID0gTWF0aC5tYXg7XG4gIC8qXG4gICAqIHN1cHBvcnRlZCBhcmd1bWVudHM6XG4gICAqIC0gcmdiMmhzdihyLGcsYilcbiAgICogLSByZ2IyaHN2KFtyLGcsYl0pXG4gICAqIC0gcmdiMmhzdih7cixnLGJ9KVxuICAgKi9cblxuICB2YXIgcmdiMmhzbCQxID0gZnVuY3Rpb24gcmdiMmhzbCQxKCkge1xuICAgIHZhciBhcmdzID0gW10sXG4gICAgICAgIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICB3aGlsZSAobGVuLS0pIHtcbiAgICAgIGFyZ3NbbGVuXSA9IGFyZ3VtZW50c1tsZW5dO1xuICAgIH1cblxuICAgIGFyZ3MgPSB1bnBhY2skaChhcmdzLCAncmdiJyk7XG4gICAgdmFyIHIgPSBhcmdzWzBdO1xuICAgIHZhciBnID0gYXJnc1sxXTtcbiAgICB2YXIgYiA9IGFyZ3NbMl07XG4gICAgdmFyIG1pbl8gPSBtaW4kMShyLCBnLCBiKTtcbiAgICB2YXIgbWF4XyA9IG1heCQxKHIsIGcsIGIpO1xuICAgIHZhciBkZWx0YSA9IG1heF8gLSBtaW5fO1xuICAgIHZhciBoLCBzLCB2O1xuICAgIHYgPSBtYXhfIC8gMjU1LjA7XG5cbiAgICBpZiAobWF4XyA9PT0gMCkge1xuICAgICAgaCA9IE51bWJlci5OYU47XG4gICAgICBzID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgcyA9IGRlbHRhIC8gbWF4XztcblxuICAgICAgaWYgKHIgPT09IG1heF8pIHtcbiAgICAgICAgaCA9IChnIC0gYikgLyBkZWx0YTtcbiAgICAgIH1cblxuICAgICAgaWYgKGcgPT09IG1heF8pIHtcbiAgICAgICAgaCA9IDIgKyAoYiAtIHIpIC8gZGVsdGE7XG4gICAgICB9XG5cbiAgICAgIGlmIChiID09PSBtYXhfKSB7XG4gICAgICAgIGggPSA0ICsgKHIgLSBnKSAvIGRlbHRhO1xuICAgICAgfVxuXG4gICAgICBoICo9IDYwO1xuXG4gICAgICBpZiAoaCA8IDApIHtcbiAgICAgICAgaCArPSAzNjA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFtoLCBzLCB2XTtcbiAgfTtcblxuICB2YXIgcmdiMmhzdiA9IHJnYjJoc2wkMTtcbiAgdmFyIHVucGFjayRpID0gdXRpbHMudW5wYWNrO1xuICB2YXIgZmxvb3IkMSA9IE1hdGguZmxvb3I7XG5cbiAgdmFyIGhzdjJyZ2IgPSBmdW5jdGlvbiBoc3YycmdiKCkge1xuICAgIHZhciBhc3NpZ24sIGFzc2lnbiQxLCBhc3NpZ24kMiwgYXNzaWduJDMsIGFzc2lnbiQ0LCBhc3NpZ24kNTtcbiAgICB2YXIgYXJncyA9IFtdLFxuICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGxlbi0tKSB7XG4gICAgICBhcmdzW2xlbl0gPSBhcmd1bWVudHNbbGVuXTtcbiAgICB9XG5cbiAgICBhcmdzID0gdW5wYWNrJGkoYXJncywgJ2hzdicpO1xuICAgIHZhciBoID0gYXJnc1swXTtcbiAgICB2YXIgcyA9IGFyZ3NbMV07XG4gICAgdmFyIHYgPSBhcmdzWzJdO1xuICAgIHZhciByLCBnLCBiO1xuICAgIHYgKj0gMjU1O1xuXG4gICAgaWYgKHMgPT09IDApIHtcbiAgICAgIHIgPSBnID0gYiA9IHY7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChoID09PSAzNjApIHtcbiAgICAgICAgaCA9IDA7XG4gICAgICB9XG5cbiAgICAgIGlmIChoID4gMzYwKSB7XG4gICAgICAgIGggLT0gMzYwO1xuICAgICAgfVxuXG4gICAgICBpZiAoaCA8IDApIHtcbiAgICAgICAgaCArPSAzNjA7XG4gICAgICB9XG5cbiAgICAgIGggLz0gNjA7XG4gICAgICB2YXIgaSA9IGZsb29yJDEoaCk7XG4gICAgICB2YXIgZiA9IGggLSBpO1xuICAgICAgdmFyIHAgPSB2ICogKDEgLSBzKTtcbiAgICAgIHZhciBxID0gdiAqICgxIC0gcyAqIGYpO1xuICAgICAgdmFyIHQgPSB2ICogKDEgLSBzICogKDEgLSBmKSk7XG5cbiAgICAgIHN3aXRjaCAoaSkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgYXNzaWduID0gW3YsIHQsIHBdLCByID0gYXNzaWduWzBdLCBnID0gYXNzaWduWzFdLCBiID0gYXNzaWduWzJdO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBhc3NpZ24kMSA9IFtxLCB2LCBwXSwgciA9IGFzc2lnbiQxWzBdLCBnID0gYXNzaWduJDFbMV0sIGIgPSBhc3NpZ24kMVsyXTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgYXNzaWduJDIgPSBbcCwgdiwgdF0sIHIgPSBhc3NpZ24kMlswXSwgZyA9IGFzc2lnbiQyWzFdLCBiID0gYXNzaWduJDJbMl07XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIGFzc2lnbiQzID0gW3AsIHEsIHZdLCByID0gYXNzaWduJDNbMF0sIGcgPSBhc3NpZ24kM1sxXSwgYiA9IGFzc2lnbiQzWzJdO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBhc3NpZ24kNCA9IFt0LCBwLCB2XSwgciA9IGFzc2lnbiQ0WzBdLCBnID0gYXNzaWduJDRbMV0sIGIgPSBhc3NpZ24kNFsyXTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgYXNzaWduJDUgPSBbdiwgcCwgcV0sIHIgPSBhc3NpZ24kNVswXSwgZyA9IGFzc2lnbiQ1WzFdLCBiID0gYXNzaWduJDVbMl07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFtyLCBnLCBiLCBhcmdzLmxlbmd0aCA+IDMgPyBhcmdzWzNdIDogMV07XG4gIH07XG5cbiAgdmFyIGhzdjJyZ2JfMSA9IGhzdjJyZ2I7XG4gIHZhciB1bnBhY2skaiA9IHV0aWxzLnVucGFjaztcbiAgdmFyIHR5cGUkOCA9IHV0aWxzLnR5cGU7XG5cbiAgQ29sb3JfMS5wcm90b3R5cGUuaHN2ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiByZ2IyaHN2KHRoaXMuX3JnYik7XG4gIH07XG5cbiAgY2hyb21hXzEuaHN2ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcmdzID0gW10sXG4gICAgICAgIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICB3aGlsZSAobGVuLS0pIHtcbiAgICAgIGFyZ3NbbGVuXSA9IGFyZ3VtZW50c1tsZW5dO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgKEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmFwcGx5KENvbG9yXzEsIFtudWxsXS5jb25jYXQoYXJncywgWydoc3YnXSkpKSgpO1xuICB9O1xuXG4gIGlucHV0LmZvcm1hdC5oc3YgPSBoc3YycmdiXzE7XG4gIGlucHV0LmF1dG9kZXRlY3QucHVzaCh7XG4gICAgcDogMixcbiAgICB0ZXN0OiBmdW5jdGlvbiB0ZXN0KCkge1xuICAgICAgdmFyIGFyZ3MgPSBbXSxcbiAgICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAobGVuLS0pIHtcbiAgICAgICAgYXJnc1tsZW5dID0gYXJndW1lbnRzW2xlbl07XG4gICAgICB9XG5cbiAgICAgIGFyZ3MgPSB1bnBhY2skaihhcmdzLCAnaHN2Jyk7XG5cbiAgICAgIGlmICh0eXBlJDgoYXJncykgPT09ICdhcnJheScgJiYgYXJncy5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgcmV0dXJuICdoc3YnO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHZhciBsYWJDb25zdGFudHMgPSB7XG4gICAgLy8gQ29ycmVzcG9uZHMgcm91Z2hseSB0byBSR0IgYnJpZ2h0ZXIvZGFya2VyXG4gICAgS246IDE4LFxuICAgIC8vIEQ2NSBzdGFuZGFyZCByZWZlcmVudFxuICAgIFhuOiAwLjk1MDQ3MCxcbiAgICBZbjogMSxcbiAgICBabjogMS4wODg4MzAsXG4gICAgdDA6IDAuMTM3OTMxMDM0LFxuICAgIC8vIDQgLyAyOVxuICAgIHQxOiAwLjIwNjg5NjU1MixcbiAgICAvLyA2IC8gMjlcbiAgICB0MjogMC4xMjg0MTg1NSxcbiAgICAvLyAzICogdDEgKiB0MVxuICAgIHQzOiAwLjAwODg1NjQ1MiAvLyB0MSAqIHQxICogdDFcblxuICB9O1xuICB2YXIgdW5wYWNrJGsgPSB1dGlscy51bnBhY2s7XG4gIHZhciBwb3cgPSBNYXRoLnBvdztcblxuICB2YXIgcmdiMmxhYiA9IGZ1bmN0aW9uIHJnYjJsYWIoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSxcbiAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW4tLSkge1xuICAgICAgYXJnc1tsZW5dID0gYXJndW1lbnRzW2xlbl07XG4gICAgfVxuXG4gICAgdmFyIHJlZiA9IHVucGFjayRrKGFyZ3MsICdyZ2InKTtcbiAgICB2YXIgciA9IHJlZlswXTtcbiAgICB2YXIgZyA9IHJlZlsxXTtcbiAgICB2YXIgYiA9IHJlZlsyXTtcbiAgICB2YXIgcmVmJDEgPSByZ2IyeHl6KHIsIGcsIGIpO1xuICAgIHZhciB4ID0gcmVmJDFbMF07XG4gICAgdmFyIHkgPSByZWYkMVsxXTtcbiAgICB2YXIgeiA9IHJlZiQxWzJdO1xuICAgIHZhciBsID0gMTE2ICogeSAtIDE2O1xuICAgIHJldHVybiBbbCA8IDAgPyAwIDogbCwgNTAwICogKHggLSB5KSwgMjAwICogKHkgLSB6KV07XG4gIH07XG5cbiAgdmFyIHJnYl94eXogPSBmdW5jdGlvbiByZ2JfeHl6KHIpIHtcbiAgICBpZiAoKHIgLz0gMjU1KSA8PSAwLjA0MDQ1KSB7XG4gICAgICByZXR1cm4gciAvIDEyLjkyO1xuICAgIH1cblxuICAgIHJldHVybiBwb3coKHIgKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgfTtcblxuICB2YXIgeHl6X2xhYiA9IGZ1bmN0aW9uIHh5el9sYWIodCkge1xuICAgIGlmICh0ID4gbGFiQ29uc3RhbnRzLnQzKSB7XG4gICAgICByZXR1cm4gcG93KHQsIDEgLyAzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdCAvIGxhYkNvbnN0YW50cy50MiArIGxhYkNvbnN0YW50cy50MDtcbiAgfTtcblxuICB2YXIgcmdiMnh5eiA9IGZ1bmN0aW9uIHJnYjJ4eXoociwgZywgYikge1xuICAgIHIgPSByZ2JfeHl6KHIpO1xuICAgIGcgPSByZ2JfeHl6KGcpO1xuICAgIGIgPSByZ2JfeHl6KGIpO1xuICAgIHZhciB4ID0geHl6X2xhYigoMC40MTI0NTY0ICogciArIDAuMzU3NTc2MSAqIGcgKyAwLjE4MDQzNzUgKiBiKSAvIGxhYkNvbnN0YW50cy5Ybik7XG4gICAgdmFyIHkgPSB4eXpfbGFiKCgwLjIxMjY3MjkgKiByICsgMC43MTUxNTIyICogZyArIDAuMDcyMTc1MCAqIGIpIC8gbGFiQ29uc3RhbnRzLlluKTtcbiAgICB2YXIgeiA9IHh5el9sYWIoKDAuMDE5MzMzOSAqIHIgKyAwLjExOTE5MjAgKiBnICsgMC45NTAzMDQxICogYikgLyBsYWJDb25zdGFudHMuWm4pO1xuICAgIHJldHVybiBbeCwgeSwgel07XG4gIH07XG5cbiAgdmFyIHJnYjJsYWJfMSA9IHJnYjJsYWI7XG4gIHZhciB1bnBhY2skbCA9IHV0aWxzLnVucGFjaztcbiAgdmFyIHBvdyQxID0gTWF0aC5wb3c7XG4gIC8qXG4gICAqIEwqIFswLi4xMDBdXG4gICAqIGEgWy0xMDAuLjEwMF1cbiAgICogYiBbLTEwMC4uMTAwXVxuICAgKi9cblxuICB2YXIgbGFiMnJnYiA9IGZ1bmN0aW9uIGxhYjJyZ2IoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSxcbiAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW4tLSkge1xuICAgICAgYXJnc1tsZW5dID0gYXJndW1lbnRzW2xlbl07XG4gICAgfVxuXG4gICAgYXJncyA9IHVucGFjayRsKGFyZ3MsICdsYWInKTtcbiAgICB2YXIgbCA9IGFyZ3NbMF07XG4gICAgdmFyIGEgPSBhcmdzWzFdO1xuICAgIHZhciBiID0gYXJnc1syXTtcbiAgICB2YXIgeCwgeSwgeiwgciwgZywgYl87XG4gICAgeSA9IChsICsgMTYpIC8gMTE2O1xuICAgIHggPSBpc05hTihhKSA/IHkgOiB5ICsgYSAvIDUwMDtcbiAgICB6ID0gaXNOYU4oYikgPyB5IDogeSAtIGIgLyAyMDA7XG4gICAgeSA9IGxhYkNvbnN0YW50cy5ZbiAqIGxhYl94eXooeSk7XG4gICAgeCA9IGxhYkNvbnN0YW50cy5YbiAqIGxhYl94eXooeCk7XG4gICAgeiA9IGxhYkNvbnN0YW50cy5abiAqIGxhYl94eXooeik7XG4gICAgciA9IHh5el9yZ2IoMy4yNDA0NTQyICogeCAtIDEuNTM3MTM4NSAqIHkgLSAwLjQ5ODUzMTQgKiB6KTsgLy8gRDY1IC0+IHNSR0JcblxuICAgIGcgPSB4eXpfcmdiKC0wLjk2OTI2NjAgKiB4ICsgMS44NzYwMTA4ICogeSArIDAuMDQxNTU2MCAqIHopO1xuICAgIGJfID0geHl6X3JnYigwLjA1NTY0MzQgKiB4IC0gMC4yMDQwMjU5ICogeSArIDEuMDU3MjI1MiAqIHopO1xuICAgIHJldHVybiBbciwgZywgYl8sIGFyZ3MubGVuZ3RoID4gMyA/IGFyZ3NbM10gOiAxXTtcbiAgfTtcblxuICB2YXIgeHl6X3JnYiA9IGZ1bmN0aW9uIHh5el9yZ2Iocikge1xuICAgIHJldHVybiAyNTUgKiAociA8PSAwLjAwMzA0ID8gMTIuOTIgKiByIDogMS4wNTUgKiBwb3ckMShyLCAxIC8gMi40KSAtIDAuMDU1KTtcbiAgfTtcblxuICB2YXIgbGFiX3h5eiA9IGZ1bmN0aW9uIGxhYl94eXoodCkge1xuICAgIHJldHVybiB0ID4gbGFiQ29uc3RhbnRzLnQxID8gdCAqIHQgKiB0IDogbGFiQ29uc3RhbnRzLnQyICogKHQgLSBsYWJDb25zdGFudHMudDApO1xuICB9O1xuXG4gIHZhciBsYWIycmdiXzEgPSBsYWIycmdiO1xuICB2YXIgdW5wYWNrJG0gPSB1dGlscy51bnBhY2s7XG4gIHZhciB0eXBlJDkgPSB1dGlscy50eXBlO1xuXG4gIENvbG9yXzEucHJvdG90eXBlLmxhYiA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gcmdiMmxhYl8xKHRoaXMuX3JnYik7XG4gIH07XG5cbiAgY2hyb21hXzEubGFiID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcmdzID0gW10sXG4gICAgICAgIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICB3aGlsZSAobGVuLS0pIHtcbiAgICAgIGFyZ3NbbGVuXSA9IGFyZ3VtZW50c1tsZW5dO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgKEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmFwcGx5KENvbG9yXzEsIFtudWxsXS5jb25jYXQoYXJncywgWydsYWInXSkpKSgpO1xuICB9O1xuXG4gIGlucHV0LmZvcm1hdC5sYWIgPSBsYWIycmdiXzE7XG4gIGlucHV0LmF1dG9kZXRlY3QucHVzaCh7XG4gICAgcDogMixcbiAgICB0ZXN0OiBmdW5jdGlvbiB0ZXN0KCkge1xuICAgICAgdmFyIGFyZ3MgPSBbXSxcbiAgICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAobGVuLS0pIHtcbiAgICAgICAgYXJnc1tsZW5dID0gYXJndW1lbnRzW2xlbl07XG4gICAgICB9XG5cbiAgICAgIGFyZ3MgPSB1bnBhY2skbShhcmdzLCAnbGFiJyk7XG5cbiAgICAgIGlmICh0eXBlJDkoYXJncykgPT09ICdhcnJheScgJiYgYXJncy5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgcmV0dXJuICdsYWInO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHZhciB1bnBhY2skbiA9IHV0aWxzLnVucGFjaztcbiAgdmFyIFJBRDJERUcgPSB1dGlscy5SQUQyREVHO1xuICB2YXIgc3FydCQxID0gTWF0aC5zcXJ0O1xuICB2YXIgYXRhbjIgPSBNYXRoLmF0YW4yO1xuICB2YXIgcm91bmQkNCA9IE1hdGgucm91bmQ7XG5cbiAgdmFyIGxhYjJsY2ggPSBmdW5jdGlvbiBsYWIybGNoKCkge1xuICAgIHZhciBhcmdzID0gW10sXG4gICAgICAgIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICB3aGlsZSAobGVuLS0pIHtcbiAgICAgIGFyZ3NbbGVuXSA9IGFyZ3VtZW50c1tsZW5dO1xuICAgIH1cblxuICAgIHZhciByZWYgPSB1bnBhY2skbihhcmdzLCAnbGFiJyk7XG4gICAgdmFyIGwgPSByZWZbMF07XG4gICAgdmFyIGEgPSByZWZbMV07XG4gICAgdmFyIGIgPSByZWZbMl07XG4gICAgdmFyIGMgPSBzcXJ0JDEoYSAqIGEgKyBiICogYik7XG4gICAgdmFyIGggPSAoYXRhbjIoYiwgYSkgKiBSQUQyREVHICsgMzYwKSAlIDM2MDtcblxuICAgIGlmIChyb3VuZCQ0KGMgKiAxMDAwMCkgPT09IDApIHtcbiAgICAgIGggPSBOdW1iZXIuTmFOO1xuICAgIH1cblxuICAgIHJldHVybiBbbCwgYywgaF07XG4gIH07XG5cbiAgdmFyIGxhYjJsY2hfMSA9IGxhYjJsY2g7XG4gIHZhciB1bnBhY2skbyA9IHV0aWxzLnVucGFjaztcblxuICB2YXIgcmdiMmxjaCA9IGZ1bmN0aW9uIHJnYjJsY2goKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSxcbiAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW4tLSkge1xuICAgICAgYXJnc1tsZW5dID0gYXJndW1lbnRzW2xlbl07XG4gICAgfVxuXG4gICAgdmFyIHJlZiA9IHVucGFjayRvKGFyZ3MsICdyZ2InKTtcbiAgICB2YXIgciA9IHJlZlswXTtcbiAgICB2YXIgZyA9IHJlZlsxXTtcbiAgICB2YXIgYiA9IHJlZlsyXTtcbiAgICB2YXIgcmVmJDEgPSByZ2IybGFiXzEociwgZywgYik7XG4gICAgdmFyIGwgPSByZWYkMVswXTtcbiAgICB2YXIgYSA9IHJlZiQxWzFdO1xuICAgIHZhciBiXyA9IHJlZiQxWzJdO1xuICAgIHJldHVybiBsYWIybGNoXzEobCwgYSwgYl8pO1xuICB9O1xuXG4gIHZhciByZ2IybGNoXzEgPSByZ2IybGNoO1xuICB2YXIgdW5wYWNrJHAgPSB1dGlscy51bnBhY2s7XG4gIHZhciBERUcyUkFEID0gdXRpbHMuREVHMlJBRDtcbiAgdmFyIHNpbiA9IE1hdGguc2luO1xuICB2YXIgY29zJDEgPSBNYXRoLmNvcztcblxuICB2YXIgbGNoMmxhYiA9IGZ1bmN0aW9uIGxjaDJsYWIoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSxcbiAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW4tLSkge1xuICAgICAgYXJnc1tsZW5dID0gYXJndW1lbnRzW2xlbl07XG4gICAgfVxuICAgIC8qXG4gICAgQ29udmVydCBmcm9tIGEgcXVhbGl0YXRpdmUgcGFyYW1ldGVyIGggYW5kIGEgcXVhbnRpdGF0aXZlIHBhcmFtZXRlciBsIHRvIGEgMjQtYml0IHBpeGVsLlxuICAgIFRoZXNlIGZvcm11bGFzIHdlcmUgaW52ZW50ZWQgYnkgRGF2aWQgRGFscnltcGxlIHRvIG9idGFpbiBtYXhpbXVtIGNvbnRyYXN0IHdpdGhvdXQgZ29pbmdcbiAgICBvdXQgb2YgZ2FtdXQgaWYgdGhlIHBhcmFtZXRlcnMgYXJlIGluIHRoZSByYW5nZSAwLTEuXG4gICAgIEEgc2F0dXJhdGlvbiBtdWx0aXBsaWVyIHdhcyBhZGRlZCBieSBHcmVnb3IgQWlzY2hcbiAgICAqL1xuXG5cbiAgICB2YXIgcmVmID0gdW5wYWNrJHAoYXJncywgJ2xjaCcpO1xuICAgIHZhciBsID0gcmVmWzBdO1xuICAgIHZhciBjID0gcmVmWzFdO1xuICAgIHZhciBoID0gcmVmWzJdO1xuXG4gICAgaWYgKGlzTmFOKGgpKSB7XG4gICAgICBoID0gMDtcbiAgICB9XG5cbiAgICBoID0gaCAqIERFRzJSQUQ7XG4gICAgcmV0dXJuIFtsLCBjb3MkMShoKSAqIGMsIHNpbihoKSAqIGNdO1xuICB9O1xuXG4gIHZhciBsY2gybGFiXzEgPSBsY2gybGFiO1xuICB2YXIgdW5wYWNrJHEgPSB1dGlscy51bnBhY2s7XG5cbiAgdmFyIGxjaDJyZ2IgPSBmdW5jdGlvbiBsY2gycmdiKCkge1xuICAgIHZhciBhcmdzID0gW10sXG4gICAgICAgIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICB3aGlsZSAobGVuLS0pIHtcbiAgICAgIGFyZ3NbbGVuXSA9IGFyZ3VtZW50c1tsZW5dO1xuICAgIH1cblxuICAgIGFyZ3MgPSB1bnBhY2skcShhcmdzLCAnbGNoJyk7XG4gICAgdmFyIGwgPSBhcmdzWzBdO1xuICAgIHZhciBjID0gYXJnc1sxXTtcbiAgICB2YXIgaCA9IGFyZ3NbMl07XG4gICAgdmFyIHJlZiA9IGxjaDJsYWJfMShsLCBjLCBoKTtcbiAgICB2YXIgTCA9IHJlZlswXTtcbiAgICB2YXIgYSA9IHJlZlsxXTtcbiAgICB2YXIgYl8gPSByZWZbMl07XG4gICAgdmFyIHJlZiQxID0gbGFiMnJnYl8xKEwsIGEsIGJfKTtcbiAgICB2YXIgciA9IHJlZiQxWzBdO1xuICAgIHZhciBnID0gcmVmJDFbMV07XG4gICAgdmFyIGIgPSByZWYkMVsyXTtcbiAgICByZXR1cm4gW3IsIGcsIGIsIGFyZ3MubGVuZ3RoID4gMyA/IGFyZ3NbM10gOiAxXTtcbiAgfTtcblxuICB2YXIgbGNoMnJnYl8xID0gbGNoMnJnYjtcbiAgdmFyIHVucGFjayRyID0gdXRpbHMudW5wYWNrO1xuXG4gIHZhciBoY2wycmdiID0gZnVuY3Rpb24gaGNsMnJnYigpIHtcbiAgICB2YXIgYXJncyA9IFtdLFxuICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGxlbi0tKSB7XG4gICAgICBhcmdzW2xlbl0gPSBhcmd1bWVudHNbbGVuXTtcbiAgICB9XG5cbiAgICB2YXIgaGNsID0gdW5wYWNrJHIoYXJncywgJ2hjbCcpLnJldmVyc2UoKTtcbiAgICByZXR1cm4gbGNoMnJnYl8xLmFwcGx5KHZvaWQgMCwgaGNsKTtcbiAgfTtcblxuICB2YXIgaGNsMnJnYl8xID0gaGNsMnJnYjtcbiAgdmFyIHVucGFjayRzID0gdXRpbHMudW5wYWNrO1xuICB2YXIgdHlwZSRhID0gdXRpbHMudHlwZTtcblxuICBDb2xvcl8xLnByb3RvdHlwZS5sY2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHJnYjJsY2hfMSh0aGlzLl9yZ2IpO1xuICB9O1xuXG4gIENvbG9yXzEucHJvdG90eXBlLmhjbCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gcmdiMmxjaF8xKHRoaXMuX3JnYikucmV2ZXJzZSgpO1xuICB9O1xuXG4gIGNocm9tYV8xLmxjaCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJncyA9IFtdLFxuICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGxlbi0tKSB7XG4gICAgICBhcmdzW2xlbl0gPSBhcmd1bWVudHNbbGVuXTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IChGdW5jdGlvbi5wcm90b3R5cGUuYmluZC5hcHBseShDb2xvcl8xLCBbbnVsbF0uY29uY2F0KGFyZ3MsIFsnbGNoJ10pKSkoKTtcbiAgfTtcblxuICBjaHJvbWFfMS5oY2wgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSxcbiAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW4tLSkge1xuICAgICAgYXJnc1tsZW5dID0gYXJndW1lbnRzW2xlbl07XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyAoRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQuYXBwbHkoQ29sb3JfMSwgW251bGxdLmNvbmNhdChhcmdzLCBbJ2hjbCddKSkpKCk7XG4gIH07XG5cbiAgaW5wdXQuZm9ybWF0LmxjaCA9IGxjaDJyZ2JfMTtcbiAgaW5wdXQuZm9ybWF0LmhjbCA9IGhjbDJyZ2JfMTtcbiAgWydsY2gnLCAnaGNsJ10uZm9yRWFjaChmdW5jdGlvbiAobSkge1xuICAgIHJldHVybiBpbnB1dC5hdXRvZGV0ZWN0LnB1c2goe1xuICAgICAgcDogMixcbiAgICAgIHRlc3Q6IGZ1bmN0aW9uIHRlc3QoKSB7XG4gICAgICAgIHZhciBhcmdzID0gW10sXG4gICAgICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgICAgIHdoaWxlIChsZW4tLSkge1xuICAgICAgICAgIGFyZ3NbbGVuXSA9IGFyZ3VtZW50c1tsZW5dO1xuICAgICAgICB9XG5cbiAgICAgICAgYXJncyA9IHVucGFjayRzKGFyZ3MsIG0pO1xuXG4gICAgICAgIGlmICh0eXBlJGEoYXJncykgPT09ICdhcnJheScgJiYgYXJncy5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgICByZXR1cm4gbTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgLyoqXG4gIFx0WDExIGNvbG9yIG5hbWVzXG4gICBcdGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtY29sb3IvI3N2Zy1jb2xvclxuICAqL1xuXG4gIHZhciB3M2N4MTEgPSB7XG4gICAgYWxpY2VibHVlOiAnI2YwZjhmZicsXG4gICAgYW50aXF1ZXdoaXRlOiAnI2ZhZWJkNycsXG4gICAgYXF1YTogJyMwMGZmZmYnLFxuICAgIGFxdWFtYXJpbmU6ICcjN2ZmZmQ0JyxcbiAgICBhenVyZTogJyNmMGZmZmYnLFxuICAgIGJlaWdlOiAnI2Y1ZjVkYycsXG4gICAgYmlzcXVlOiAnI2ZmZTRjNCcsXG4gICAgYmxhY2s6ICcjMDAwMDAwJyxcbiAgICBibGFuY2hlZGFsbW9uZDogJyNmZmViY2QnLFxuICAgIGJsdWU6ICcjMDAwMGZmJyxcbiAgICBibHVldmlvbGV0OiAnIzhhMmJlMicsXG4gICAgYnJvd246ICcjYTUyYTJhJyxcbiAgICBidXJseXdvb2Q6ICcjZGViODg3JyxcbiAgICBjYWRldGJsdWU6ICcjNWY5ZWEwJyxcbiAgICBjaGFydHJldXNlOiAnIzdmZmYwMCcsXG4gICAgY2hvY29sYXRlOiAnI2QyNjkxZScsXG4gICAgY29yYWw6ICcjZmY3ZjUwJyxcbiAgICBjb3JuZmxvd2VyOiAnIzY0OTVlZCcsXG4gICAgY29ybmZsb3dlcmJsdWU6ICcjNjQ5NWVkJyxcbiAgICBjb3Juc2lsazogJyNmZmY4ZGMnLFxuICAgIGNyaW1zb246ICcjZGMxNDNjJyxcbiAgICBjeWFuOiAnIzAwZmZmZicsXG4gICAgZGFya2JsdWU6ICcjMDAwMDhiJyxcbiAgICBkYXJrY3lhbjogJyMwMDhiOGInLFxuICAgIGRhcmtnb2xkZW5yb2Q6ICcjYjg4NjBiJyxcbiAgICBkYXJrZ3JheTogJyNhOWE5YTknLFxuICAgIGRhcmtncmVlbjogJyMwMDY0MDAnLFxuICAgIGRhcmtncmV5OiAnI2E5YTlhOScsXG4gICAgZGFya2toYWtpOiAnI2JkYjc2YicsXG4gICAgZGFya21hZ2VudGE6ICcjOGIwMDhiJyxcbiAgICBkYXJrb2xpdmVncmVlbjogJyM1NTZiMmYnLFxuICAgIGRhcmtvcmFuZ2U6ICcjZmY4YzAwJyxcbiAgICBkYXJrb3JjaGlkOiAnIzk5MzJjYycsXG4gICAgZGFya3JlZDogJyM4YjAwMDAnLFxuICAgIGRhcmtzYWxtb246ICcjZTk5NjdhJyxcbiAgICBkYXJrc2VhZ3JlZW46ICcjOGZiYzhmJyxcbiAgICBkYXJrc2xhdGVibHVlOiAnIzQ4M2Q4YicsXG4gICAgZGFya3NsYXRlZ3JheTogJyMyZjRmNGYnLFxuICAgIGRhcmtzbGF0ZWdyZXk6ICcjMmY0ZjRmJyxcbiAgICBkYXJrdHVycXVvaXNlOiAnIzAwY2VkMScsXG4gICAgZGFya3Zpb2xldDogJyM5NDAwZDMnLFxuICAgIGRlZXBwaW5rOiAnI2ZmMTQ5MycsXG4gICAgZGVlcHNreWJsdWU6ICcjMDBiZmZmJyxcbiAgICBkaW1ncmF5OiAnIzY5Njk2OScsXG4gICAgZGltZ3JleTogJyM2OTY5NjknLFxuICAgIGRvZGdlcmJsdWU6ICcjMWU5MGZmJyxcbiAgICBmaXJlYnJpY2s6ICcjYjIyMjIyJyxcbiAgICBmbG9yYWx3aGl0ZTogJyNmZmZhZjAnLFxuICAgIGZvcmVzdGdyZWVuOiAnIzIyOGIyMicsXG4gICAgZnVjaHNpYTogJyNmZjAwZmYnLFxuICAgIGdhaW5zYm9ybzogJyNkY2RjZGMnLFxuICAgIGdob3N0d2hpdGU6ICcjZjhmOGZmJyxcbiAgICBnb2xkOiAnI2ZmZDcwMCcsXG4gICAgZ29sZGVucm9kOiAnI2RhYTUyMCcsXG4gICAgZ3JheTogJyM4MDgwODAnLFxuICAgIGdyZWVuOiAnIzAwODAwMCcsXG4gICAgZ3JlZW55ZWxsb3c6ICcjYWRmZjJmJyxcbiAgICBncmV5OiAnIzgwODA4MCcsXG4gICAgaG9uZXlkZXc6ICcjZjBmZmYwJyxcbiAgICBob3RwaW5rOiAnI2ZmNjliNCcsXG4gICAgaW5kaWFucmVkOiAnI2NkNWM1YycsXG4gICAgaW5kaWdvOiAnIzRiMDA4MicsXG4gICAgaXZvcnk6ICcjZmZmZmYwJyxcbiAgICBraGFraTogJyNmMGU2OGMnLFxuICAgIGxhc2VybGVtb246ICcjZmZmZjU0JyxcbiAgICBsYXZlbmRlcjogJyNlNmU2ZmEnLFxuICAgIGxhdmVuZGVyYmx1c2g6ICcjZmZmMGY1JyxcbiAgICBsYXduZ3JlZW46ICcjN2NmYzAwJyxcbiAgICBsZW1vbmNoaWZmb246ICcjZmZmYWNkJyxcbiAgICBsaWdodGJsdWU6ICcjYWRkOGU2JyxcbiAgICBsaWdodGNvcmFsOiAnI2YwODA4MCcsXG4gICAgbGlnaHRjeWFuOiAnI2UwZmZmZicsXG4gICAgbGlnaHRnb2xkZW5yb2Q6ICcjZmFmYWQyJyxcbiAgICBsaWdodGdvbGRlbnJvZHllbGxvdzogJyNmYWZhZDInLFxuICAgIGxpZ2h0Z3JheTogJyNkM2QzZDMnLFxuICAgIGxpZ2h0Z3JlZW46ICcjOTBlZTkwJyxcbiAgICBsaWdodGdyZXk6ICcjZDNkM2QzJyxcbiAgICBsaWdodHBpbms6ICcjZmZiNmMxJyxcbiAgICBsaWdodHNhbG1vbjogJyNmZmEwN2EnLFxuICAgIGxpZ2h0c2VhZ3JlZW46ICcjMjBiMmFhJyxcbiAgICBsaWdodHNreWJsdWU6ICcjODdjZWZhJyxcbiAgICBsaWdodHNsYXRlZ3JheTogJyM3Nzg4OTknLFxuICAgIGxpZ2h0c2xhdGVncmV5OiAnIzc3ODg5OScsXG4gICAgbGlnaHRzdGVlbGJsdWU6ICcjYjBjNGRlJyxcbiAgICBsaWdodHllbGxvdzogJyNmZmZmZTAnLFxuICAgIGxpbWU6ICcjMDBmZjAwJyxcbiAgICBsaW1lZ3JlZW46ICcjMzJjZDMyJyxcbiAgICBsaW5lbjogJyNmYWYwZTYnLFxuICAgIG1hZ2VudGE6ICcjZmYwMGZmJyxcbiAgICBtYXJvb246ICcjODAwMDAwJyxcbiAgICBtYXJvb24yOiAnIzdmMDAwMCcsXG4gICAgbWFyb29uMzogJyNiMDMwNjAnLFxuICAgIG1lZGl1bWFxdWFtYXJpbmU6ICcjNjZjZGFhJyxcbiAgICBtZWRpdW1ibHVlOiAnIzAwMDBjZCcsXG4gICAgbWVkaXVtb3JjaGlkOiAnI2JhNTVkMycsXG4gICAgbWVkaXVtcHVycGxlOiAnIzkzNzBkYicsXG4gICAgbWVkaXVtc2VhZ3JlZW46ICcjM2NiMzcxJyxcbiAgICBtZWRpdW1zbGF0ZWJsdWU6ICcjN2I2OGVlJyxcbiAgICBtZWRpdW1zcHJpbmdncmVlbjogJyMwMGZhOWEnLFxuICAgIG1lZGl1bXR1cnF1b2lzZTogJyM0OGQxY2MnLFxuICAgIG1lZGl1bXZpb2xldHJlZDogJyNjNzE1ODUnLFxuICAgIG1pZG5pZ2h0Ymx1ZTogJyMxOTE5NzAnLFxuICAgIG1pbnRjcmVhbTogJyNmNWZmZmEnLFxuICAgIG1pc3R5cm9zZTogJyNmZmU0ZTEnLFxuICAgIG1vY2Nhc2luOiAnI2ZmZTRiNScsXG4gICAgbmF2YWpvd2hpdGU6ICcjZmZkZWFkJyxcbiAgICBuYXZ5OiAnIzAwMDA4MCcsXG4gICAgb2xkbGFjZTogJyNmZGY1ZTYnLFxuICAgIG9saXZlOiAnIzgwODAwMCcsXG4gICAgb2xpdmVkcmFiOiAnIzZiOGUyMycsXG4gICAgb3JhbmdlOiAnI2ZmYTUwMCcsXG4gICAgb3JhbmdlcmVkOiAnI2ZmNDUwMCcsXG4gICAgb3JjaGlkOiAnI2RhNzBkNicsXG4gICAgcGFsZWdvbGRlbnJvZDogJyNlZWU4YWEnLFxuICAgIHBhbGVncmVlbjogJyM5OGZiOTgnLFxuICAgIHBhbGV0dXJxdW9pc2U6ICcjYWZlZWVlJyxcbiAgICBwYWxldmlvbGV0cmVkOiAnI2RiNzA5MycsXG4gICAgcGFwYXlhd2hpcDogJyNmZmVmZDUnLFxuICAgIHBlYWNocHVmZjogJyNmZmRhYjknLFxuICAgIHBlcnU6ICcjY2Q4NTNmJyxcbiAgICBwaW5rOiAnI2ZmYzBjYicsXG4gICAgcGx1bTogJyNkZGEwZGQnLFxuICAgIHBvd2RlcmJsdWU6ICcjYjBlMGU2JyxcbiAgICBwdXJwbGU6ICcjODAwMDgwJyxcbiAgICBwdXJwbGUyOiAnIzdmMDA3ZicsXG4gICAgcHVycGxlMzogJyNhMDIwZjAnLFxuICAgIHJlYmVjY2FwdXJwbGU6ICcjNjYzMzk5JyxcbiAgICByZWQ6ICcjZmYwMDAwJyxcbiAgICByb3N5YnJvd246ICcjYmM4ZjhmJyxcbiAgICByb3lhbGJsdWU6ICcjNDE2OWUxJyxcbiAgICBzYWRkbGVicm93bjogJyM4YjQ1MTMnLFxuICAgIHNhbG1vbjogJyNmYTgwNzInLFxuICAgIHNhbmR5YnJvd246ICcjZjRhNDYwJyxcbiAgICBzZWFncmVlbjogJyMyZThiNTcnLFxuICAgIHNlYXNoZWxsOiAnI2ZmZjVlZScsXG4gICAgc2llbm5hOiAnI2EwNTIyZCcsXG4gICAgc2lsdmVyOiAnI2MwYzBjMCcsXG4gICAgc2t5Ymx1ZTogJyM4N2NlZWInLFxuICAgIHNsYXRlYmx1ZTogJyM2YTVhY2QnLFxuICAgIHNsYXRlZ3JheTogJyM3MDgwOTAnLFxuICAgIHNsYXRlZ3JleTogJyM3MDgwOTAnLFxuICAgIHNub3c6ICcjZmZmYWZhJyxcbiAgICBzcHJpbmdncmVlbjogJyMwMGZmN2YnLFxuICAgIHN0ZWVsYmx1ZTogJyM0NjgyYjQnLFxuICAgIHRhbjogJyNkMmI0OGMnLFxuICAgIHRlYWw6ICcjMDA4MDgwJyxcbiAgICB0aGlzdGxlOiAnI2Q4YmZkOCcsXG4gICAgdG9tYXRvOiAnI2ZmNjM0NycsXG4gICAgdHVycXVvaXNlOiAnIzQwZTBkMCcsXG4gICAgdmlvbGV0OiAnI2VlODJlZScsXG4gICAgd2hlYXQ6ICcjZjVkZWIzJyxcbiAgICB3aGl0ZTogJyNmZmZmZmYnLFxuICAgIHdoaXRlc21va2U6ICcjZjVmNWY1JyxcbiAgICB5ZWxsb3c6ICcjZmZmZjAwJyxcbiAgICB5ZWxsb3dncmVlbjogJyM5YWNkMzInXG4gIH07XG4gIHZhciB3M2N4MTFfMSA9IHczY3gxMTtcbiAgdmFyIHR5cGUkYiA9IHV0aWxzLnR5cGU7XG5cbiAgQ29sb3JfMS5wcm90b3R5cGUubmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgaGV4ID0gcmdiMmhleF8xKHRoaXMuX3JnYiwgJ3JnYicpO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGxpc3QgPSBPYmplY3Qua2V5cyh3M2N4MTFfMSk7IGkgPCBsaXN0Lmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICB2YXIgbiA9IGxpc3RbaV07XG5cbiAgICAgIGlmICh3M2N4MTFfMVtuXSA9PT0gaGV4KSB7XG4gICAgICAgIHJldHVybiBuLnRvTG93ZXJDYXNlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGhleDtcbiAgfTtcblxuICBpbnB1dC5mb3JtYXQubmFtZWQgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBpZiAodzNjeDExXzFbbmFtZV0pIHtcbiAgICAgIHJldHVybiBoZXgycmdiXzEodzNjeDExXzFbbmFtZV0pO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcigndW5rbm93biBjb2xvciBuYW1lOiAnICsgbmFtZSk7XG4gIH07XG5cbiAgaW5wdXQuYXV0b2RldGVjdC5wdXNoKHtcbiAgICBwOiA1LFxuICAgIHRlc3Q6IGZ1bmN0aW9uIHRlc3QoaCkge1xuICAgICAgdmFyIHJlc3QgPSBbXSxcbiAgICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMTtcblxuICAgICAgd2hpbGUgKGxlbi0tID4gMCkge1xuICAgICAgICByZXN0W2xlbl0gPSBhcmd1bWVudHNbbGVuICsgMV07XG4gICAgICB9XG5cbiAgICAgIGlmICghcmVzdC5sZW5ndGggJiYgdHlwZSRiKGgpID09PSAnc3RyaW5nJyAmJiB3M2N4MTFfMVtoLnRvTG93ZXJDYXNlKCldKSB7XG4gICAgICAgIHJldHVybiAnbmFtZWQnO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHZhciB1bnBhY2skdCA9IHV0aWxzLnVucGFjaztcblxuICB2YXIgcmdiMm51bSA9IGZ1bmN0aW9uIHJnYjJudW0oKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSxcbiAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW4tLSkge1xuICAgICAgYXJnc1tsZW5dID0gYXJndW1lbnRzW2xlbl07XG4gICAgfVxuXG4gICAgdmFyIHJlZiA9IHVucGFjayR0KGFyZ3MsICdyZ2InKTtcbiAgICB2YXIgciA9IHJlZlswXTtcbiAgICB2YXIgZyA9IHJlZlsxXTtcbiAgICB2YXIgYiA9IHJlZlsyXTtcbiAgICByZXR1cm4gKHIgPDwgMTYpICsgKGcgPDwgOCkgKyBiO1xuICB9O1xuXG4gIHZhciByZ2IybnVtXzEgPSByZ2IybnVtO1xuICB2YXIgdHlwZSRjID0gdXRpbHMudHlwZTtcblxuICB2YXIgbnVtMnJnYiA9IGZ1bmN0aW9uIG51bTJyZ2IobnVtKSB7XG4gICAgaWYgKHR5cGUkYyhudW0pID09IFwibnVtYmVyXCIgJiYgbnVtID49IDAgJiYgbnVtIDw9IDB4RkZGRkZGKSB7XG4gICAgICB2YXIgciA9IG51bSA+PiAxNjtcbiAgICAgIHZhciBnID0gbnVtID4+IDggJiAweEZGO1xuICAgICAgdmFyIGIgPSBudW0gJiAweEZGO1xuICAgICAgcmV0dXJuIFtyLCBnLCBiLCAxXTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIG51bSBjb2xvcjogXCIgKyBudW0pO1xuICB9O1xuXG4gIHZhciBudW0ycmdiXzEgPSBudW0ycmdiO1xuICB2YXIgdHlwZSRkID0gdXRpbHMudHlwZTtcblxuICBDb2xvcl8xLnByb3RvdHlwZS5udW0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHJnYjJudW1fMSh0aGlzLl9yZ2IpO1xuICB9O1xuXG4gIGNocm9tYV8xLm51bSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJncyA9IFtdLFxuICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGxlbi0tKSB7XG4gICAgICBhcmdzW2xlbl0gPSBhcmd1bWVudHNbbGVuXTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IChGdW5jdGlvbi5wcm90b3R5cGUuYmluZC5hcHBseShDb2xvcl8xLCBbbnVsbF0uY29uY2F0KGFyZ3MsIFsnbnVtJ10pKSkoKTtcbiAgfTtcblxuICBpbnB1dC5mb3JtYXQubnVtID0gbnVtMnJnYl8xO1xuICBpbnB1dC5hdXRvZGV0ZWN0LnB1c2goe1xuICAgIHA6IDUsXG4gICAgdGVzdDogZnVuY3Rpb24gdGVzdCgpIHtcbiAgICAgIHZhciBhcmdzID0gW10sXG4gICAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKGxlbi0tKSB7XG4gICAgICAgIGFyZ3NbbGVuXSA9IGFyZ3VtZW50c1tsZW5dO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEgJiYgdHlwZSRkKGFyZ3NbMF0pID09PSAnbnVtYmVyJyAmJiBhcmdzWzBdID49IDAgJiYgYXJnc1swXSA8PSAweEZGRkZGRikge1xuICAgICAgICByZXR1cm4gJ251bSc7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgdmFyIHVucGFjayR1ID0gdXRpbHMudW5wYWNrO1xuICB2YXIgdHlwZSRlID0gdXRpbHMudHlwZTtcbiAgdmFyIHJvdW5kJDUgPSBNYXRoLnJvdW5kO1xuXG4gIENvbG9yXzEucHJvdG90eXBlLnJnYiA9IGZ1bmN0aW9uIChybmQpIHtcbiAgICBpZiAocm5kID09PSB2b2lkIDApIHJuZCA9IHRydWU7XG5cbiAgICBpZiAocm5kID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3JnYi5zbGljZSgwLCAzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fcmdiLnNsaWNlKDAsIDMpLm1hcChyb3VuZCQ1KTtcbiAgfTtcblxuICBDb2xvcl8xLnByb3RvdHlwZS5yZ2JhID0gZnVuY3Rpb24gKHJuZCkge1xuICAgIGlmIChybmQgPT09IHZvaWQgMCkgcm5kID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5fcmdiLnNsaWNlKDAsIDQpLm1hcChmdW5jdGlvbiAodiwgaSkge1xuICAgICAgcmV0dXJuIGkgPCAzID8gcm5kID09PSBmYWxzZSA/IHYgOiByb3VuZCQ1KHYpIDogdjtcbiAgICB9KTtcbiAgfTtcblxuICBjaHJvbWFfMS5yZ2IgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSxcbiAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW4tLSkge1xuICAgICAgYXJnc1tsZW5dID0gYXJndW1lbnRzW2xlbl07XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyAoRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQuYXBwbHkoQ29sb3JfMSwgW251bGxdLmNvbmNhdChhcmdzLCBbJ3JnYiddKSkpKCk7XG4gIH07XG5cbiAgaW5wdXQuZm9ybWF0LnJnYiA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJncyA9IFtdLFxuICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGxlbi0tKSB7XG4gICAgICBhcmdzW2xlbl0gPSBhcmd1bWVudHNbbGVuXTtcbiAgICB9XG5cbiAgICB2YXIgcmdiYSA9IHVucGFjayR1KGFyZ3MsICdyZ2JhJyk7XG5cbiAgICBpZiAocmdiYVszXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZ2JhWzNdID0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmdiYTtcbiAgfTtcblxuICBpbnB1dC5hdXRvZGV0ZWN0LnB1c2goe1xuICAgIHA6IDMsXG4gICAgdGVzdDogZnVuY3Rpb24gdGVzdCgpIHtcbiAgICAgIHZhciBhcmdzID0gW10sXG4gICAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKGxlbi0tKSB7XG4gICAgICAgIGFyZ3NbbGVuXSA9IGFyZ3VtZW50c1tsZW5dO1xuICAgICAgfVxuXG4gICAgICBhcmdzID0gdW5wYWNrJHUoYXJncywgJ3JnYmEnKTtcblxuICAgICAgaWYgKHR5cGUkZShhcmdzKSA9PT0gJ2FycmF5JyAmJiAoYXJncy5sZW5ndGggPT09IDMgfHwgYXJncy5sZW5ndGggPT09IDQgJiYgdHlwZSRlKGFyZ3NbM10pID09ICdudW1iZXInICYmIGFyZ3NbM10gPj0gMCAmJiBhcmdzWzNdIDw9IDEpKSB7XG4gICAgICAgIHJldHVybiAncmdiJztcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICAvKlxuICAgKiBCYXNlZCBvbiBpbXBsZW1lbnRhdGlvbiBieSBOZWlsIEJhcnRsZXR0XG4gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9uZWlsYmFydGxldHQvY29sb3ItdGVtcGVyYXR1cmVcbiAgICovXG5cbiAgdmFyIGxvZyA9IE1hdGgubG9nO1xuXG4gIHZhciB0ZW1wZXJhdHVyZTJyZ2IgPSBmdW5jdGlvbiB0ZW1wZXJhdHVyZTJyZ2Ioa2VsdmluKSB7XG4gICAgdmFyIHRlbXAgPSBrZWx2aW4gLyAxMDA7XG4gICAgdmFyIHIsIGcsIGI7XG5cbiAgICBpZiAodGVtcCA8IDY2KSB7XG4gICAgICByID0gMjU1O1xuICAgICAgZyA9IC0xNTUuMjU0ODU1NjI3MDkxNzkgLSAwLjQ0NTk2OTUwNDY5NTc5MTMzICogKGcgPSB0ZW1wIC0gMikgKyAxMDQuNDkyMTYxOTkzOTM4ODggKiBsb2coZyk7XG4gICAgICBiID0gdGVtcCA8IDIwID8gMCA6IC0yNTQuNzY5MzUxODQxMjA5MDIgKyAwLjgyNzQwOTYwNjQwMDczOTUgKiAoYiA9IHRlbXAgLSAxMCkgKyAxMTUuNjc5OTQ0MDEwNjYxNDcgKiBsb2coYik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHIgPSAzNTEuOTc2OTA1NjY4MDU2OTMgKyAwLjExNDIwNjQ1Mzc4NDE2NSAqIChyID0gdGVtcCAtIDU1KSAtIDQwLjI1MzY2MzA5MzMyMTI3ICogbG9nKHIpO1xuICAgICAgZyA9IDMyNS40NDk0MTI1NzExOTc0ICsgMC4wNzk0MzQ1NjUzNjY2MjM0MiAqIChnID0gdGVtcCAtIDUwKSAtIDI4LjA4NTI5NjM1MDc5NTcgKiBsb2coZyk7XG4gICAgICBiID0gMjU1O1xuICAgIH1cblxuICAgIHJldHVybiBbciwgZywgYiwgMV07XG4gIH07XG5cbiAgdmFyIHRlbXBlcmF0dXJlMnJnYl8xID0gdGVtcGVyYXR1cmUycmdiO1xuICAvKlxuICAgKiBCYXNlZCBvbiBpbXBsZW1lbnRhdGlvbiBieSBOZWlsIEJhcnRsZXR0XG4gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9uZWlsYmFydGxldHQvY29sb3ItdGVtcGVyYXR1cmVcbiAgICoqL1xuXG4gIHZhciB1bnBhY2skdiA9IHV0aWxzLnVucGFjaztcbiAgdmFyIHJvdW5kJDYgPSBNYXRoLnJvdW5kO1xuXG4gIHZhciByZ2IydGVtcGVyYXR1cmUgPSBmdW5jdGlvbiByZ2IydGVtcGVyYXR1cmUoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSxcbiAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW4tLSkge1xuICAgICAgYXJnc1tsZW5dID0gYXJndW1lbnRzW2xlbl07XG4gICAgfVxuXG4gICAgdmFyIHJnYiA9IHVucGFjayR2KGFyZ3MsICdyZ2InKTtcbiAgICB2YXIgciA9IHJnYlswXSxcbiAgICAgICAgYiA9IHJnYlsyXTtcbiAgICB2YXIgbWluVGVtcCA9IDEwMDA7XG4gICAgdmFyIG1heFRlbXAgPSA0MDAwMDtcbiAgICB2YXIgZXBzID0gMC40O1xuICAgIHZhciB0ZW1wO1xuXG4gICAgd2hpbGUgKG1heFRlbXAgLSBtaW5UZW1wID4gZXBzKSB7XG4gICAgICB0ZW1wID0gKG1heFRlbXAgKyBtaW5UZW1wKSAqIDAuNTtcbiAgICAgIHZhciByZ2IkMSA9IHRlbXBlcmF0dXJlMnJnYl8xKHRlbXApO1xuXG4gICAgICBpZiAocmdiJDFbMl0gLyByZ2IkMVswXSA+PSBiIC8gcikge1xuICAgICAgICBtYXhUZW1wID0gdGVtcDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1pblRlbXAgPSB0ZW1wO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByb3VuZCQ2KHRlbXApO1xuICB9O1xuXG4gIHZhciByZ2IydGVtcGVyYXR1cmVfMSA9IHJnYjJ0ZW1wZXJhdHVyZTtcblxuICBDb2xvcl8xLnByb3RvdHlwZS50ZW1wID0gQ29sb3JfMS5wcm90b3R5cGUua2VsdmluID0gQ29sb3JfMS5wcm90b3R5cGUudGVtcGVyYXR1cmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHJnYjJ0ZW1wZXJhdHVyZV8xKHRoaXMuX3JnYik7XG4gIH07XG5cbiAgY2hyb21hXzEudGVtcCA9IGNocm9tYV8xLmtlbHZpbiA9IGNocm9tYV8xLnRlbXBlcmF0dXJlID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcmdzID0gW10sXG4gICAgICAgIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICB3aGlsZSAobGVuLS0pIHtcbiAgICAgIGFyZ3NbbGVuXSA9IGFyZ3VtZW50c1tsZW5dO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgKEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmFwcGx5KENvbG9yXzEsIFtudWxsXS5jb25jYXQoYXJncywgWyd0ZW1wJ10pKSkoKTtcbiAgfTtcblxuICBpbnB1dC5mb3JtYXQudGVtcCA9IGlucHV0LmZvcm1hdC5rZWx2aW4gPSBpbnB1dC5mb3JtYXQudGVtcGVyYXR1cmUgPSB0ZW1wZXJhdHVyZTJyZ2JfMTtcbiAgdmFyIHR5cGUkZiA9IHV0aWxzLnR5cGU7XG5cbiAgQ29sb3JfMS5wcm90b3R5cGUuYWxwaGEgPSBmdW5jdGlvbiAoYSwgbXV0YXRlKSB7XG4gICAgaWYgKG11dGF0ZSA9PT0gdm9pZCAwKSBtdXRhdGUgPSBmYWxzZTtcblxuICAgIGlmIChhICE9PSB1bmRlZmluZWQgJiYgdHlwZSRmKGEpID09PSAnbnVtYmVyJykge1xuICAgICAgaWYgKG11dGF0ZSkge1xuICAgICAgICB0aGlzLl9yZ2JbM10gPSBhO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBDb2xvcl8xKFt0aGlzLl9yZ2JbMF0sIHRoaXMuX3JnYlsxXSwgdGhpcy5fcmdiWzJdLCBhXSwgJ3JnYicpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9yZ2JbM107XG4gIH07XG5cbiAgQ29sb3JfMS5wcm90b3R5cGUuY2xpcHBlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmdiLl9jbGlwcGVkIHx8IGZhbHNlO1xuICB9O1xuXG4gIENvbG9yXzEucHJvdG90eXBlLmRhcmtlbiA9IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICBpZiAoYW1vdW50ID09PSB2b2lkIDApIGFtb3VudCA9IDE7XG4gICAgdmFyIG1lID0gdGhpcztcbiAgICB2YXIgbGFiID0gbWUubGFiKCk7XG4gICAgbGFiWzBdIC09IGxhYkNvbnN0YW50cy5LbiAqIGFtb3VudDtcbiAgICByZXR1cm4gbmV3IENvbG9yXzEobGFiLCAnbGFiJykuYWxwaGEobWUuYWxwaGEoKSwgdHJ1ZSk7XG4gIH07XG5cbiAgQ29sb3JfMS5wcm90b3R5cGUuYnJpZ2h0ZW4gPSBmdW5jdGlvbiAoYW1vdW50KSB7XG4gICAgaWYgKGFtb3VudCA9PT0gdm9pZCAwKSBhbW91bnQgPSAxO1xuICAgIHJldHVybiB0aGlzLmRhcmtlbigtYW1vdW50KTtcbiAgfTtcblxuICBDb2xvcl8xLnByb3RvdHlwZS5kYXJrZXIgPSBDb2xvcl8xLnByb3RvdHlwZS5kYXJrZW47XG4gIENvbG9yXzEucHJvdG90eXBlLmJyaWdodGVyID0gQ29sb3JfMS5wcm90b3R5cGUuYnJpZ2h0ZW47XG5cbiAgQ29sb3JfMS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKG1jKSB7XG4gICAgdmFyIHJlZiA9IG1jLnNwbGl0KCcuJyk7XG4gICAgdmFyIG1vZGUgPSByZWZbMF07XG4gICAgdmFyIGNoYW5uZWwgPSByZWZbMV07XG4gICAgdmFyIHNyYyA9IHRoaXNbbW9kZV0oKTtcblxuICAgIGlmIChjaGFubmVsKSB7XG4gICAgICB2YXIgaSA9IG1vZGUuaW5kZXhPZihjaGFubmVsKTtcblxuICAgICAgaWYgKGkgPiAtMSkge1xuICAgICAgICByZXR1cm4gc3JjW2ldO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIGNoYW5uZWwgXCIgKyBjaGFubmVsICsgXCIgaW4gbW9kZSBcIiArIG1vZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc3JjO1xuICAgIH1cbiAgfTtcblxuICB2YXIgdHlwZSRnID0gdXRpbHMudHlwZTtcbiAgdmFyIHBvdyQyID0gTWF0aC5wb3c7XG4gIHZhciBFUFMgPSAxZS03O1xuICB2YXIgTUFYX0lURVIgPSAyMDtcblxuICBDb2xvcl8xLnByb3RvdHlwZS5sdW1pbmFuY2UgPSBmdW5jdGlvbiAobHVtKSB7XG4gICAgaWYgKGx1bSAhPT0gdW5kZWZpbmVkICYmIHR5cGUkZyhsdW0pID09PSAnbnVtYmVyJykge1xuICAgICAgaWYgKGx1bSA9PT0gMCkge1xuICAgICAgICAvLyByZXR1cm4gcHVyZSBibGFja1xuICAgICAgICByZXR1cm4gbmV3IENvbG9yXzEoWzAsIDAsIDAsIHRoaXMuX3JnYlszXV0sICdyZ2InKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGx1bSA9PT0gMSkge1xuICAgICAgICAvLyByZXR1cm4gcHVyZSB3aGl0ZVxuICAgICAgICByZXR1cm4gbmV3IENvbG9yXzEoWzI1NSwgMjU1LCAyNTUsIHRoaXMuX3JnYlszXV0sICdyZ2InKTtcbiAgICAgIH0gLy8gY29tcHV0ZSBuZXcgY29sb3IgdXNpbmcuLi5cblxuXG4gICAgICB2YXIgY3VyX2x1bSA9IHRoaXMubHVtaW5hbmNlKCk7XG4gICAgICB2YXIgbW9kZSA9ICdyZ2InO1xuICAgICAgdmFyIG1heF9pdGVyID0gTUFYX0lURVI7XG5cbiAgICAgIHZhciB0ZXN0ID0gZnVuY3Rpb24gdGVzdChsb3csIGhpZ2gpIHtcbiAgICAgICAgdmFyIG1pZCA9IGxvdy5pbnRlcnBvbGF0ZShoaWdoLCAwLjUsIG1vZGUpO1xuICAgICAgICB2YXIgbG0gPSBtaWQubHVtaW5hbmNlKCk7XG5cbiAgICAgICAgaWYgKE1hdGguYWJzKGx1bSAtIGxtKSA8IEVQUyB8fCAhbWF4X2l0ZXItLSkge1xuICAgICAgICAgIC8vIGNsb3NlIGVub3VnaFxuICAgICAgICAgIHJldHVybiBtaWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbG0gPiBsdW0gPyB0ZXN0KGxvdywgbWlkKSA6IHRlc3QobWlkLCBoaWdoKTtcbiAgICAgIH07XG5cbiAgICAgIHZhciByZ2IgPSAoY3VyX2x1bSA+IGx1bSA/IHRlc3QobmV3IENvbG9yXzEoWzAsIDAsIDBdKSwgdGhpcykgOiB0ZXN0KHRoaXMsIG5ldyBDb2xvcl8xKFsyNTUsIDI1NSwgMjU1XSkpKS5yZ2IoKTtcbiAgICAgIHJldHVybiBuZXcgQ29sb3JfMShyZ2IuY29uY2F0KFt0aGlzLl9yZ2JbM11dKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJnYjJsdW1pbmFuY2UuYXBwbHkodm9pZCAwLCB0aGlzLl9yZ2Iuc2xpY2UoMCwgMykpO1xuICB9O1xuXG4gIHZhciByZ2IybHVtaW5hbmNlID0gZnVuY3Rpb24gcmdiMmx1bWluYW5jZShyLCBnLCBiKSB7XG4gICAgLy8gcmVsYXRpdmUgbHVtaW5hbmNlXG4gICAgLy8gc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDgvUkVDLVdDQUcyMC0yMDA4MTIxMS8jcmVsYXRpdmVsdW1pbmFuY2VkZWZcbiAgICByID0gbHVtaW5hbmNlX3gocik7XG4gICAgZyA9IGx1bWluYW5jZV94KGcpO1xuICAgIGIgPSBsdW1pbmFuY2VfeChiKTtcbiAgICByZXR1cm4gMC4yMTI2ICogciArIDAuNzE1MiAqIGcgKyAwLjA3MjIgKiBiO1xuICB9O1xuXG4gIHZhciBsdW1pbmFuY2VfeCA9IGZ1bmN0aW9uIGx1bWluYW5jZV94KHgpIHtcbiAgICB4IC89IDI1NTtcbiAgICByZXR1cm4geCA8PSAwLjAzOTI4ID8geCAvIDEyLjkyIDogcG93JDIoKHggKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgfTtcblxuICB2YXIgaW50ZXJwb2xhdG9yID0ge307XG4gIHZhciB0eXBlJGggPSB1dGlscy50eXBlO1xuXG4gIHZhciBtaXggPSBmdW5jdGlvbiBtaXgoY29sMSwgY29sMiwgZikge1xuICAgIGlmIChmID09PSB2b2lkIDApIGYgPSAwLjU7XG4gICAgdmFyIHJlc3QgPSBbXSxcbiAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDM7XG5cbiAgICB3aGlsZSAobGVuLS0gPiAwKSB7XG4gICAgICByZXN0W2xlbl0gPSBhcmd1bWVudHNbbGVuICsgM107XG4gICAgfVxuXG4gICAgdmFyIG1vZGUgPSByZXN0WzBdIHx8ICdscmdiJztcblxuICAgIGlmICghaW50ZXJwb2xhdG9yW21vZGVdICYmICFyZXN0Lmxlbmd0aCkge1xuICAgICAgLy8gZmFsbCBiYWNrIHRvIHRoZSBmaXJzdCBzdXBwb3J0ZWQgbW9kZVxuICAgICAgbW9kZSA9IE9iamVjdC5rZXlzKGludGVycG9sYXRvcilbMF07XG4gICAgfVxuXG4gICAgaWYgKCFpbnRlcnBvbGF0b3JbbW9kZV0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImludGVycG9sYXRpb24gbW9kZSBcIiArIG1vZGUgKyBcIiBpcyBub3QgZGVmaW5lZFwiKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZSRoKGNvbDEpICE9PSAnb2JqZWN0Jykge1xuICAgICAgY29sMSA9IG5ldyBDb2xvcl8xKGNvbDEpO1xuICAgIH1cblxuICAgIGlmICh0eXBlJGgoY29sMikgIT09ICdvYmplY3QnKSB7XG4gICAgICBjb2wyID0gbmV3IENvbG9yXzEoY29sMik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGludGVycG9sYXRvclttb2RlXShjb2wxLCBjb2wyLCBmKS5hbHBoYShjb2wxLmFscGhhKCkgKyBmICogKGNvbDIuYWxwaGEoKSAtIGNvbDEuYWxwaGEoKSkpO1xuICB9O1xuXG4gIENvbG9yXzEucHJvdG90eXBlLm1peCA9IENvbG9yXzEucHJvdG90eXBlLmludGVycG9sYXRlID0gZnVuY3Rpb24gKGNvbDIsIGYpIHtcbiAgICBpZiAoZiA9PT0gdm9pZCAwKSBmID0gMC41O1xuICAgIHZhciByZXN0ID0gW10sXG4gICAgICAgIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGggLSAyO1xuXG4gICAgd2hpbGUgKGxlbi0tID4gMCkge1xuICAgICAgcmVzdFtsZW5dID0gYXJndW1lbnRzW2xlbiArIDJdO1xuICAgIH1cblxuICAgIHJldHVybiBtaXguYXBwbHkodm9pZCAwLCBbdGhpcywgY29sMiwgZl0uY29uY2F0KHJlc3QpKTtcbiAgfTtcblxuICBDb2xvcl8xLnByb3RvdHlwZS5wcmVtdWx0aXBseSA9IGZ1bmN0aW9uIChtdXRhdGUpIHtcbiAgICBpZiAobXV0YXRlID09PSB2b2lkIDApIG11dGF0ZSA9IGZhbHNlO1xuICAgIHZhciByZ2IgPSB0aGlzLl9yZ2I7XG4gICAgdmFyIGEgPSByZ2JbM107XG5cbiAgICBpZiAobXV0YXRlKSB7XG4gICAgICB0aGlzLl9yZ2IgPSBbcmdiWzBdICogYSwgcmdiWzFdICogYSwgcmdiWzJdICogYSwgYV07XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBDb2xvcl8xKFtyZ2JbMF0gKiBhLCByZ2JbMV0gKiBhLCByZ2JbMl0gKiBhLCBhXSwgJ3JnYicpO1xuICAgIH1cbiAgfTtcblxuICBDb2xvcl8xLnByb3RvdHlwZS5zYXR1cmF0ZSA9IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICBpZiAoYW1vdW50ID09PSB2b2lkIDApIGFtb3VudCA9IDE7XG4gICAgdmFyIG1lID0gdGhpcztcbiAgICB2YXIgbGNoID0gbWUubGNoKCk7XG4gICAgbGNoWzFdICs9IGxhYkNvbnN0YW50cy5LbiAqIGFtb3VudDtcblxuICAgIGlmIChsY2hbMV0gPCAwKSB7XG4gICAgICBsY2hbMV0gPSAwO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgQ29sb3JfMShsY2gsICdsY2gnKS5hbHBoYShtZS5hbHBoYSgpLCB0cnVlKTtcbiAgfTtcblxuICBDb2xvcl8xLnByb3RvdHlwZS5kZXNhdHVyYXRlID0gZnVuY3Rpb24gKGFtb3VudCkge1xuICAgIGlmIChhbW91bnQgPT09IHZvaWQgMCkgYW1vdW50ID0gMTtcbiAgICByZXR1cm4gdGhpcy5zYXR1cmF0ZSgtYW1vdW50KTtcbiAgfTtcblxuICB2YXIgdHlwZSRpID0gdXRpbHMudHlwZTtcblxuICBDb2xvcl8xLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAobWMsIHZhbHVlLCBtdXRhdGUpIHtcbiAgICBpZiAobXV0YXRlID09PSB2b2lkIDApIG11dGF0ZSA9IGZhbHNlO1xuICAgIHZhciByZWYgPSBtYy5zcGxpdCgnLicpO1xuICAgIHZhciBtb2RlID0gcmVmWzBdO1xuICAgIHZhciBjaGFubmVsID0gcmVmWzFdO1xuICAgIHZhciBzcmMgPSB0aGlzW21vZGVdKCk7XG5cbiAgICBpZiAoY2hhbm5lbCkge1xuICAgICAgdmFyIGkgPSBtb2RlLmluZGV4T2YoY2hhbm5lbCk7XG5cbiAgICAgIGlmIChpID4gLTEpIHtcbiAgICAgICAgaWYgKHR5cGUkaSh2YWx1ZSkgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBzd2l0Y2ggKHZhbHVlLmNoYXJBdCgwKSkge1xuICAgICAgICAgICAgY2FzZSAnKyc6XG4gICAgICAgICAgICAgIHNyY1tpXSArPSArdmFsdWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICctJzpcbiAgICAgICAgICAgICAgc3JjW2ldICs9ICt2YWx1ZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJyonOlxuICAgICAgICAgICAgICBzcmNbaV0gKj0gK3ZhbHVlLnN1YnN0cigxKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJy8nOlxuICAgICAgICAgICAgICBzcmNbaV0gLz0gK3ZhbHVlLnN1YnN0cigxKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHNyY1tpXSA9ICt2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSRpKHZhbHVlKSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICBzcmNbaV0gPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1bnN1cHBvcnRlZCB2YWx1ZSBmb3IgQ29sb3Iuc2V0XCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG91dCA9IG5ldyBDb2xvcl8xKHNyYywgbW9kZSk7XG5cbiAgICAgICAgaWYgKG11dGF0ZSkge1xuICAgICAgICAgIHRoaXMuX3JnYiA9IG91dC5fcmdiO1xuICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwidW5rbm93biBjaGFubmVsIFwiICsgY2hhbm5lbCArIFwiIGluIG1vZGUgXCIgKyBtb2RlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHNyYztcbiAgICB9XG4gIH07XG5cbiAgdmFyIHJnYiQxID0gZnVuY3Rpb24gcmdiJDEoY29sMSwgY29sMiwgZikge1xuICAgIHZhciB4eXowID0gY29sMS5fcmdiO1xuICAgIHZhciB4eXoxID0gY29sMi5fcmdiO1xuICAgIHJldHVybiBuZXcgQ29sb3JfMSh4eXowWzBdICsgZiAqICh4eXoxWzBdIC0geHl6MFswXSksIHh5ejBbMV0gKyBmICogKHh5ejFbMV0gLSB4eXowWzFdKSwgeHl6MFsyXSArIGYgKiAoeHl6MVsyXSAtIHh5ejBbMl0pLCAncmdiJyk7XG4gIH07IC8vIHJlZ2lzdGVyIGludGVycG9sYXRvclxuXG5cbiAgaW50ZXJwb2xhdG9yLnJnYiA9IHJnYiQxO1xuICB2YXIgc3FydCQyID0gTWF0aC5zcXJ0O1xuICB2YXIgcG93JDMgPSBNYXRoLnBvdztcblxuICB2YXIgbHJnYiA9IGZ1bmN0aW9uIGxyZ2IoY29sMSwgY29sMiwgZikge1xuICAgIHZhciByZWYgPSBjb2wxLl9yZ2I7XG4gICAgdmFyIHgxID0gcmVmWzBdO1xuICAgIHZhciB5MSA9IHJlZlsxXTtcbiAgICB2YXIgejEgPSByZWZbMl07XG4gICAgdmFyIHJlZiQxID0gY29sMi5fcmdiO1xuICAgIHZhciB4MiA9IHJlZiQxWzBdO1xuICAgIHZhciB5MiA9IHJlZiQxWzFdO1xuICAgIHZhciB6MiA9IHJlZiQxWzJdO1xuICAgIHJldHVybiBuZXcgQ29sb3JfMShzcXJ0JDIocG93JDMoeDEsIDIpICogKDEgLSBmKSArIHBvdyQzKHgyLCAyKSAqIGYpLCBzcXJ0JDIocG93JDMoeTEsIDIpICogKDEgLSBmKSArIHBvdyQzKHkyLCAyKSAqIGYpLCBzcXJ0JDIocG93JDMoejEsIDIpICogKDEgLSBmKSArIHBvdyQzKHoyLCAyKSAqIGYpLCAncmdiJyk7XG4gIH07IC8vIHJlZ2lzdGVyIGludGVycG9sYXRvclxuXG5cbiAgaW50ZXJwb2xhdG9yLmxyZ2IgPSBscmdiO1xuXG4gIHZhciBsYWIkMSA9IGZ1bmN0aW9uIGxhYiQxKGNvbDEsIGNvbDIsIGYpIHtcbiAgICB2YXIgeHl6MCA9IGNvbDEubGFiKCk7XG4gICAgdmFyIHh5ejEgPSBjb2wyLmxhYigpO1xuICAgIHJldHVybiBuZXcgQ29sb3JfMSh4eXowWzBdICsgZiAqICh4eXoxWzBdIC0geHl6MFswXSksIHh5ejBbMV0gKyBmICogKHh5ejFbMV0gLSB4eXowWzFdKSwgeHl6MFsyXSArIGYgKiAoeHl6MVsyXSAtIHh5ejBbMl0pLCAnbGFiJyk7XG4gIH07IC8vIHJlZ2lzdGVyIGludGVycG9sYXRvclxuXG5cbiAgaW50ZXJwb2xhdG9yLmxhYiA9IGxhYiQxO1xuXG4gIHZhciBfaHN4ID0gZnVuY3Rpb24gX2hzeChjb2wxLCBjb2wyLCBmLCBtKSB7XG4gICAgdmFyIGFzc2lnbiwgYXNzaWduJDE7XG4gICAgdmFyIHh5ejAsIHh5ejE7XG5cbiAgICBpZiAobSA9PT0gJ2hzbCcpIHtcbiAgICAgIHh5ejAgPSBjb2wxLmhzbCgpO1xuICAgICAgeHl6MSA9IGNvbDIuaHNsKCk7XG4gICAgfSBlbHNlIGlmIChtID09PSAnaHN2Jykge1xuICAgICAgeHl6MCA9IGNvbDEuaHN2KCk7XG4gICAgICB4eXoxID0gY29sMi5oc3YoKTtcbiAgICB9IGVsc2UgaWYgKG0gPT09ICdoY2cnKSB7XG4gICAgICB4eXowID0gY29sMS5oY2coKTtcbiAgICAgIHh5ejEgPSBjb2wyLmhjZygpO1xuICAgIH0gZWxzZSBpZiAobSA9PT0gJ2hzaScpIHtcbiAgICAgIHh5ejAgPSBjb2wxLmhzaSgpO1xuICAgICAgeHl6MSA9IGNvbDIuaHNpKCk7XG4gICAgfSBlbHNlIGlmIChtID09PSAnbGNoJyB8fCBtID09PSAnaGNsJykge1xuICAgICAgbSA9ICdoY2wnO1xuICAgICAgeHl6MCA9IGNvbDEuaGNsKCk7XG4gICAgICB4eXoxID0gY29sMi5oY2woKTtcbiAgICB9XG5cbiAgICB2YXIgaHVlMCwgaHVlMSwgc2F0MCwgc2F0MSwgbGJ2MCwgbGJ2MTtcblxuICAgIGlmIChtLnN1YnN0cigwLCAxKSA9PT0gJ2gnKSB7XG4gICAgICBhc3NpZ24gPSB4eXowLCBodWUwID0gYXNzaWduWzBdLCBzYXQwID0gYXNzaWduWzFdLCBsYnYwID0gYXNzaWduWzJdO1xuICAgICAgYXNzaWduJDEgPSB4eXoxLCBodWUxID0gYXNzaWduJDFbMF0sIHNhdDEgPSBhc3NpZ24kMVsxXSwgbGJ2MSA9IGFzc2lnbiQxWzJdO1xuICAgIH1cblxuICAgIHZhciBzYXQsIGh1ZSwgbGJ2LCBkaDtcblxuICAgIGlmICghaXNOYU4oaHVlMCkgJiYgIWlzTmFOKGh1ZTEpKSB7XG4gICAgICAvLyBib3RoIGNvbG9ycyBoYXZlIGh1ZVxuICAgICAgaWYgKGh1ZTEgPiBodWUwICYmIGh1ZTEgLSBodWUwID4gMTgwKSB7XG4gICAgICAgIGRoID0gaHVlMSAtIChodWUwICsgMzYwKTtcbiAgICAgIH0gZWxzZSBpZiAoaHVlMSA8IGh1ZTAgJiYgaHVlMCAtIGh1ZTEgPiAxODApIHtcbiAgICAgICAgZGggPSBodWUxICsgMzYwIC0gaHVlMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRoID0gaHVlMSAtIGh1ZTA7XG4gICAgICB9XG5cbiAgICAgIGh1ZSA9IGh1ZTAgKyBmICogZGg7XG4gICAgfSBlbHNlIGlmICghaXNOYU4oaHVlMCkpIHtcbiAgICAgIGh1ZSA9IGh1ZTA7XG5cbiAgICAgIGlmICgobGJ2MSA9PSAxIHx8IGxidjEgPT0gMCkgJiYgbSAhPSAnaHN2Jykge1xuICAgICAgICBzYXQgPSBzYXQwO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWlzTmFOKGh1ZTEpKSB7XG4gICAgICBodWUgPSBodWUxO1xuXG4gICAgICBpZiAoKGxidjAgPT0gMSB8fCBsYnYwID09IDApICYmIG0gIT0gJ2hzdicpIHtcbiAgICAgICAgc2F0ID0gc2F0MTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaHVlID0gTnVtYmVyLk5hTjtcbiAgICB9XG5cbiAgICBpZiAoc2F0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHNhdCA9IHNhdDAgKyBmICogKHNhdDEgLSBzYXQwKTtcbiAgICB9XG5cbiAgICBsYnYgPSBsYnYwICsgZiAqIChsYnYxIC0gbGJ2MCk7XG4gICAgcmV0dXJuIG5ldyBDb2xvcl8xKFtodWUsIHNhdCwgbGJ2XSwgbSk7XG4gIH07XG5cbiAgdmFyIGxjaCQxID0gZnVuY3Rpb24gbGNoJDEoY29sMSwgY29sMiwgZikge1xuICAgIHJldHVybiBfaHN4KGNvbDEsIGNvbDIsIGYsICdsY2gnKTtcbiAgfTsgLy8gcmVnaXN0ZXIgaW50ZXJwb2xhdG9yXG5cblxuICBpbnRlcnBvbGF0b3IubGNoID0gbGNoJDE7XG4gIGludGVycG9sYXRvci5oY2wgPSBsY2gkMTtcblxuICB2YXIgbnVtJDEgPSBmdW5jdGlvbiBudW0kMShjb2wxLCBjb2wyLCBmKSB7XG4gICAgdmFyIGMxID0gY29sMS5udW0oKTtcbiAgICB2YXIgYzIgPSBjb2wyLm51bSgpO1xuICAgIHJldHVybiBuZXcgQ29sb3JfMShjMSArIGYgKiAoYzIgLSBjMSksICdudW0nKTtcbiAgfTsgLy8gcmVnaXN0ZXIgaW50ZXJwb2xhdG9yXG5cblxuICBpbnRlcnBvbGF0b3IubnVtID0gbnVtJDE7XG5cbiAgdmFyIGhjZyQxID0gZnVuY3Rpb24gaGNnJDEoY29sMSwgY29sMiwgZikge1xuICAgIHJldHVybiBfaHN4KGNvbDEsIGNvbDIsIGYsICdoY2cnKTtcbiAgfTsgLy8gcmVnaXN0ZXIgaW50ZXJwb2xhdG9yXG5cblxuICBpbnRlcnBvbGF0b3IuaGNnID0gaGNnJDE7XG5cbiAgdmFyIGhzaSQxID0gZnVuY3Rpb24gaHNpJDEoY29sMSwgY29sMiwgZikge1xuICAgIHJldHVybiBfaHN4KGNvbDEsIGNvbDIsIGYsICdoc2knKTtcbiAgfTsgLy8gcmVnaXN0ZXIgaW50ZXJwb2xhdG9yXG5cblxuICBpbnRlcnBvbGF0b3IuaHNpID0gaHNpJDE7XG5cbiAgdmFyIGhzbCQxID0gZnVuY3Rpb24gaHNsJDEoY29sMSwgY29sMiwgZikge1xuICAgIHJldHVybiBfaHN4KGNvbDEsIGNvbDIsIGYsICdoc2wnKTtcbiAgfTsgLy8gcmVnaXN0ZXIgaW50ZXJwb2xhdG9yXG5cblxuICBpbnRlcnBvbGF0b3IuaHNsID0gaHNsJDE7XG5cbiAgdmFyIGhzdiQxID0gZnVuY3Rpb24gaHN2JDEoY29sMSwgY29sMiwgZikge1xuICAgIHJldHVybiBfaHN4KGNvbDEsIGNvbDIsIGYsICdoc3YnKTtcbiAgfTsgLy8gcmVnaXN0ZXIgaW50ZXJwb2xhdG9yXG5cblxuICBpbnRlcnBvbGF0b3IuaHN2ID0gaHN2JDE7XG4gIHZhciBjbGlwX3JnYiQyID0gdXRpbHMuY2xpcF9yZ2I7XG4gIHZhciBwb3ckNCA9IE1hdGgucG93O1xuICB2YXIgc3FydCQzID0gTWF0aC5zcXJ0O1xuICB2YXIgUEkkMSA9IE1hdGguUEk7XG4gIHZhciBjb3MkMiA9IE1hdGguY29zO1xuICB2YXIgc2luJDEgPSBNYXRoLnNpbjtcbiAgdmFyIGF0YW4yJDEgPSBNYXRoLmF0YW4yO1xuXG4gIHZhciBhdmVyYWdlID0gZnVuY3Rpb24gYXZlcmFnZShjb2xvcnMsIG1vZGUsIHdlaWdodHMpIHtcbiAgICBpZiAobW9kZSA9PT0gdm9pZCAwKSBtb2RlID0gJ2xyZ2InO1xuICAgIGlmICh3ZWlnaHRzID09PSB2b2lkIDApIHdlaWdodHMgPSBudWxsO1xuICAgIHZhciBsID0gY29sb3JzLmxlbmd0aDtcblxuICAgIGlmICghd2VpZ2h0cykge1xuICAgICAgd2VpZ2h0cyA9IEFycmF5LmZyb20obmV3IEFycmF5KGwpKS5tYXAoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH0pO1xuICAgIH0gLy8gbm9ybWFsaXplIHdlaWdodHNcblxuXG4gICAgdmFyIGsgPSBsIC8gd2VpZ2h0cy5yZWR1Y2UoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBhICsgYjtcbiAgICB9KTtcbiAgICB3ZWlnaHRzLmZvckVhY2goZnVuY3Rpb24gKHcsIGkpIHtcbiAgICAgIHdlaWdodHNbaV0gKj0gaztcbiAgICB9KTsgLy8gY29udmVydCBjb2xvcnMgdG8gQ29sb3Igb2JqZWN0c1xuXG4gICAgY29sb3JzID0gY29sb3JzLm1hcChmdW5jdGlvbiAoYykge1xuICAgICAgcmV0dXJuIG5ldyBDb2xvcl8xKGMpO1xuICAgIH0pO1xuXG4gICAgaWYgKG1vZGUgPT09ICdscmdiJykge1xuICAgICAgcmV0dXJuIF9hdmVyYWdlX2xyZ2IoY29sb3JzLCB3ZWlnaHRzKTtcbiAgICB9XG5cbiAgICB2YXIgZmlyc3QgPSBjb2xvcnMuc2hpZnQoKTtcbiAgICB2YXIgeHl6ID0gZmlyc3QuZ2V0KG1vZGUpO1xuICAgIHZhciBjbnQgPSBbXTtcbiAgICB2YXIgZHggPSAwO1xuICAgIHZhciBkeSA9IDA7IC8vIGluaXRpYWwgY29sb3JcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgeHl6Lmxlbmd0aDsgaSsrKSB7XG4gICAgICB4eXpbaV0gPSAoeHl6W2ldIHx8IDApICogd2VpZ2h0c1swXTtcbiAgICAgIGNudC5wdXNoKGlzTmFOKHh5eltpXSkgPyAwIDogd2VpZ2h0c1swXSk7XG5cbiAgICAgIGlmIChtb2RlLmNoYXJBdChpKSA9PT0gJ2gnICYmICFpc05hTih4eXpbaV0pKSB7XG4gICAgICAgIHZhciBBID0geHl6W2ldIC8gMTgwICogUEkkMTtcbiAgICAgICAgZHggKz0gY29zJDIoQSkgKiB3ZWlnaHRzWzBdO1xuICAgICAgICBkeSArPSBzaW4kMShBKSAqIHdlaWdodHNbMF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGFscGhhID0gZmlyc3QuYWxwaGEoKSAqIHdlaWdodHNbMF07XG4gICAgY29sb3JzLmZvckVhY2goZnVuY3Rpb24gKGMsIGNpKSB7XG4gICAgICB2YXIgeHl6MiA9IGMuZ2V0KG1vZGUpO1xuICAgICAgYWxwaGEgKz0gYy5hbHBoYSgpICogd2VpZ2h0c1tjaSArIDFdO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHh5ei5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoIWlzTmFOKHh5ejJbaV0pKSB7XG4gICAgICAgICAgY250W2ldICs9IHdlaWdodHNbY2kgKyAxXTtcblxuICAgICAgICAgIGlmIChtb2RlLmNoYXJBdChpKSA9PT0gJ2gnKSB7XG4gICAgICAgICAgICB2YXIgQSA9IHh5ejJbaV0gLyAxODAgKiBQSSQxO1xuICAgICAgICAgICAgZHggKz0gY29zJDIoQSkgKiB3ZWlnaHRzW2NpICsgMV07XG4gICAgICAgICAgICBkeSArPSBzaW4kMShBKSAqIHdlaWdodHNbY2kgKyAxXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgeHl6W2ldICs9IHh5ejJbaV0gKiB3ZWlnaHRzW2NpICsgMV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCB4eXoubGVuZ3RoOyBpJDErKykge1xuICAgICAgaWYgKG1vZGUuY2hhckF0KGkkMSkgPT09ICdoJykge1xuICAgICAgICB2YXIgQSQxID0gYXRhbjIkMShkeSAvIGNudFtpJDFdLCBkeCAvIGNudFtpJDFdKSAvIFBJJDEgKiAxODA7XG5cbiAgICAgICAgd2hpbGUgKEEkMSA8IDApIHtcbiAgICAgICAgICBBJDEgKz0gMzYwO1xuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKEEkMSA+PSAzNjApIHtcbiAgICAgICAgICBBJDEgLT0gMzYwO1xuICAgICAgICB9XG5cbiAgICAgICAgeHl6W2kkMV0gPSBBJDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB4eXpbaSQxXSA9IHh5eltpJDFdIC8gY250W2kkMV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgYWxwaGEgLz0gbDtcbiAgICByZXR1cm4gbmV3IENvbG9yXzEoeHl6LCBtb2RlKS5hbHBoYShhbHBoYSA+IDAuOTk5OTkgPyAxIDogYWxwaGEsIHRydWUpO1xuICB9O1xuXG4gIHZhciBfYXZlcmFnZV9scmdiID0gZnVuY3Rpb24gX2F2ZXJhZ2VfbHJnYihjb2xvcnMsIHdlaWdodHMpIHtcbiAgICB2YXIgbCA9IGNvbG9ycy5sZW5ndGg7XG4gICAgdmFyIHh5eiA9IFswLCAwLCAwLCAwXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY29sID0gY29sb3JzW2ldO1xuICAgICAgdmFyIGYgPSB3ZWlnaHRzW2ldIC8gbDtcbiAgICAgIHZhciByZ2IgPSBjb2wuX3JnYjtcbiAgICAgIHh5elswXSArPSBwb3ckNChyZ2JbMF0sIDIpICogZjtcbiAgICAgIHh5elsxXSArPSBwb3ckNChyZ2JbMV0sIDIpICogZjtcbiAgICAgIHh5elsyXSArPSBwb3ckNChyZ2JbMl0sIDIpICogZjtcbiAgICAgIHh5elszXSArPSByZ2JbM10gKiBmO1xuICAgIH1cblxuICAgIHh5elswXSA9IHNxcnQkMyh4eXpbMF0pO1xuICAgIHh5elsxXSA9IHNxcnQkMyh4eXpbMV0pO1xuICAgIHh5elsyXSA9IHNxcnQkMyh4eXpbMl0pO1xuXG4gICAgaWYgKHh5elszXSA+IDAuOTk5OTk5OSkge1xuICAgICAgeHl6WzNdID0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IENvbG9yXzEoY2xpcF9yZ2IkMih4eXopKTtcbiAgfTsgLy8gbWluaW1hbCBtdWx0aS1wdXJwb3NlIGludGVyZmFjZVxuICAvLyBAcmVxdWlyZXMgdXRpbHMgY29sb3IgYW5hbHl6ZVxuXG5cbiAgdmFyIHR5cGUkaiA9IHV0aWxzLnR5cGU7XG4gIHZhciBwb3ckNSA9IE1hdGgucG93O1xuXG4gIHZhciBzY2FsZSA9IGZ1bmN0aW9uIHNjYWxlKGNvbG9ycykge1xuICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgdmFyIF9tb2RlID0gJ3JnYic7XG5cbiAgICB2YXIgX25hY29sID0gY2hyb21hXzEoJyNjY2MnKTtcblxuICAgIHZhciBfc3ByZWFkID0gMDsgLy8gY29uc3QgX2ZpeGVkID0gZmFsc2U7XG5cbiAgICB2YXIgX2RvbWFpbiA9IFswLCAxXTtcbiAgICB2YXIgX3BvcyA9IFtdO1xuICAgIHZhciBfcGFkZGluZyA9IFswLCAwXTtcbiAgICB2YXIgX2NsYXNzZXMgPSBmYWxzZTtcbiAgICB2YXIgX2NvbG9ycyA9IFtdO1xuICAgIHZhciBfb3V0ID0gZmFsc2U7XG4gICAgdmFyIF9taW4gPSAwO1xuICAgIHZhciBfbWF4ID0gMTtcbiAgICB2YXIgX2NvcnJlY3RMaWdodG5lc3MgPSBmYWxzZTtcbiAgICB2YXIgX2NvbG9yQ2FjaGUgPSB7fTtcbiAgICB2YXIgX3VzZUNhY2hlID0gdHJ1ZTtcbiAgICB2YXIgX2dhbW1hID0gMTsgLy8gcHJpdmF0ZSBtZXRob2RzXG5cbiAgICB2YXIgc2V0Q29sb3JzID0gZnVuY3Rpb24gc2V0Q29sb3JzKGNvbG9ycykge1xuICAgICAgY29sb3JzID0gY29sb3JzIHx8IFsnI2ZmZicsICcjMDAwJ107XG5cbiAgICAgIGlmIChjb2xvcnMgJiYgdHlwZSRqKGNvbG9ycykgPT09ICdzdHJpbmcnICYmIGNocm9tYV8xLmJyZXdlciAmJiBjaHJvbWFfMS5icmV3ZXJbY29sb3JzLnRvTG93ZXJDYXNlKCldKSB7XG4gICAgICAgIGNvbG9ycyA9IGNocm9tYV8xLmJyZXdlcltjb2xvcnMudG9Mb3dlckNhc2UoKV07XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlJGooY29sb3JzKSA9PT0gJ2FycmF5Jykge1xuICAgICAgICAvLyBoYW5kbGUgc2luZ2xlIGNvbG9yXG4gICAgICAgIGlmIChjb2xvcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgY29sb3JzID0gW2NvbG9yc1swXSwgY29sb3JzWzBdXTtcbiAgICAgICAgfSAvLyBtYWtlIGEgY29weSBvZiB0aGUgY29sb3JzXG5cblxuICAgICAgICBjb2xvcnMgPSBjb2xvcnMuc2xpY2UoMCk7IC8vIGNvbnZlcnQgdG8gY2hyb21hIGNsYXNzZXNcblxuICAgICAgICBmb3IgKHZhciBjID0gMDsgYyA8IGNvbG9ycy5sZW5ndGg7IGMrKykge1xuICAgICAgICAgIGNvbG9yc1tjXSA9IGNocm9tYV8xKGNvbG9yc1tjXSk7XG4gICAgICAgIH0gLy8gYXV0by1maWxsIGNvbG9yIHBvc2l0aW9uXG5cblxuICAgICAgICBfcG9zLmxlbmd0aCA9IDA7XG5cbiAgICAgICAgZm9yICh2YXIgYyQxID0gMDsgYyQxIDwgY29sb3JzLmxlbmd0aDsgYyQxKyspIHtcbiAgICAgICAgICBfcG9zLnB1c2goYyQxIC8gKGNvbG9ycy5sZW5ndGggLSAxKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVzZXRDYWNoZSgpO1xuICAgICAgcmV0dXJuIF9jb2xvcnMgPSBjb2xvcnM7XG4gICAgfTtcblxuICAgIHZhciBnZXRDbGFzcyA9IGZ1bmN0aW9uIGdldENsYXNzKHZhbHVlKSB7XG4gICAgICBpZiAoX2NsYXNzZXMgIT0gbnVsbCkge1xuICAgICAgICB2YXIgbiA9IF9jbGFzc2VzLmxlbmd0aCAtIDE7XG4gICAgICAgIHZhciBpID0gMDtcblxuICAgICAgICB3aGlsZSAoaSA8IG4gJiYgdmFsdWUgPj0gX2NsYXNzZXNbaV0pIHtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaSAtIDE7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAwO1xuICAgIH07XG5cbiAgICB2YXIgdE1hcExpZ2h0bmVzcyA9IGZ1bmN0aW9uIHRNYXBMaWdodG5lc3ModCkge1xuICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcblxuICAgIHZhciB0TWFwRG9tYWluID0gZnVuY3Rpb24gdE1hcERvbWFpbih0KSB7XG4gICAgICByZXR1cm4gdDtcbiAgICB9OyAvLyBjb25zdCBjbGFzc2lmeVZhbHVlID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAvLyAgICAgbGV0IHZhbCA9IHZhbHVlO1xuICAgIC8vICAgICBpZiAoX2NsYXNzZXMubGVuZ3RoID4gMikge1xuICAgIC8vICAgICAgICAgY29uc3QgbiA9IF9jbGFzc2VzLmxlbmd0aC0xO1xuICAgIC8vICAgICAgICAgY29uc3QgaSA9IGdldENsYXNzKHZhbHVlKTtcbiAgICAvLyAgICAgICAgIGNvbnN0IG1pbmMgPSBfY2xhc3Nlc1swXSArICgoX2NsYXNzZXNbMV0tX2NsYXNzZXNbMF0pICogKDAgKyAoX3NwcmVhZCAqIDAuNSkpKTsgIC8vIGNlbnRlciBvZiAxc3QgY2xhc3NcbiAgICAvLyAgICAgICAgIGNvbnN0IG1heGMgPSBfY2xhc3Nlc1tuLTFdICsgKChfY2xhc3Nlc1tuXS1fY2xhc3Nlc1tuLTFdKSAqICgxIC0gKF9zcHJlYWQgKiAwLjUpKSk7ICAvLyBjZW50ZXIgb2YgbGFzdCBjbGFzc1xuICAgIC8vICAgICAgICAgdmFsID0gX21pbiArICgoKChfY2xhc3Nlc1tpXSArICgoX2NsYXNzZXNbaSsxXSAtIF9jbGFzc2VzW2ldKSAqIDAuNSkpIC0gbWluYykgLyAobWF4Yy1taW5jKSkgKiAoX21heCAtIF9taW4pKTtcbiAgICAvLyAgICAgfVxuICAgIC8vICAgICByZXR1cm4gdmFsO1xuICAgIC8vIH07XG5cblxuICAgIHZhciBnZXRDb2xvciA9IGZ1bmN0aW9uIGdldENvbG9yKHZhbCwgYnlwYXNzTWFwKSB7XG4gICAgICB2YXIgY29sLCB0O1xuXG4gICAgICBpZiAoYnlwYXNzTWFwID09IG51bGwpIHtcbiAgICAgICAgYnlwYXNzTWFwID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc05hTih2YWwpIHx8IHZhbCA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gX25hY29sO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWJ5cGFzc01hcCkge1xuICAgICAgICBpZiAoX2NsYXNzZXMgJiYgX2NsYXNzZXMubGVuZ3RoID4gMikge1xuICAgICAgICAgIC8vIGZpbmQgdGhlIGNsYXNzXG4gICAgICAgICAgdmFyIGMgPSBnZXRDbGFzcyh2YWwpO1xuICAgICAgICAgIHQgPSBjIC8gKF9jbGFzc2VzLmxlbmd0aCAtIDIpO1xuICAgICAgICB9IGVsc2UgaWYgKF9tYXggIT09IF9taW4pIHtcbiAgICAgICAgICAvLyBqdXN0IGludGVycG9sYXRlIGJldHdlZW4gbWluL21heFxuICAgICAgICAgIHQgPSAodmFsIC0gX21pbikgLyAoX21heCAtIF9taW4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHQgPSAxO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0ID0gdmFsO1xuICAgICAgfSAvLyBkb21haW4gbWFwXG5cblxuICAgICAgdCA9IHRNYXBEb21haW4odCk7XG5cbiAgICAgIGlmICghYnlwYXNzTWFwKSB7XG4gICAgICAgIHQgPSB0TWFwTGlnaHRuZXNzKHQpOyAvLyBsaWdodG5lc3MgY29ycmVjdGlvblxuICAgICAgfVxuXG4gICAgICBpZiAoX2dhbW1hICE9PSAxKSB7XG4gICAgICAgIHQgPSBwb3ckNSh0LCBfZ2FtbWEpO1xuICAgICAgfVxuXG4gICAgICB0ID0gX3BhZGRpbmdbMF0gKyB0ICogKDEgLSBfcGFkZGluZ1swXSAtIF9wYWRkaW5nWzFdKTtcbiAgICAgIHQgPSBNYXRoLm1pbigxLCBNYXRoLm1heCgwLCB0KSk7XG4gICAgICB2YXIgayA9IE1hdGguZmxvb3IodCAqIDEwMDAwKTtcblxuICAgICAgaWYgKF91c2VDYWNoZSAmJiBfY29sb3JDYWNoZVtrXSkge1xuICAgICAgICBjb2wgPSBfY29sb3JDYWNoZVtrXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0eXBlJGooX2NvbG9ycykgPT09ICdhcnJheScpIHtcbiAgICAgICAgICAvL2ZvciBpIGluIFswLi5fcG9zLmxlbmd0aC0xXVxuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgX3Bvcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHAgPSBfcG9zW2ldO1xuXG4gICAgICAgICAgICBpZiAodCA8PSBwKSB7XG4gICAgICAgICAgICAgIGNvbCA9IF9jb2xvcnNbaV07XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodCA+PSBwICYmIGkgPT09IF9wb3MubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICBjb2wgPSBfY29sb3JzW2ldO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHQgPiBwICYmIHQgPCBfcG9zW2kgKyAxXSkge1xuICAgICAgICAgICAgICB0ID0gKHQgLSBwKSAvIChfcG9zW2kgKyAxXSAtIHApO1xuICAgICAgICAgICAgICBjb2wgPSBjaHJvbWFfMS5pbnRlcnBvbGF0ZShfY29sb3JzW2ldLCBfY29sb3JzW2kgKyAxXSwgdCwgX21vZGUpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSRqKF9jb2xvcnMpID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgY29sID0gX2NvbG9ycyh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChfdXNlQ2FjaGUpIHtcbiAgICAgICAgICBfY29sb3JDYWNoZVtrXSA9IGNvbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29sO1xuICAgIH07XG5cbiAgICB2YXIgcmVzZXRDYWNoZSA9IGZ1bmN0aW9uIHJlc2V0Q2FjaGUoKSB7XG4gICAgICByZXR1cm4gX2NvbG9yQ2FjaGUgPSB7fTtcbiAgICB9O1xuXG4gICAgc2V0Q29sb3JzKGNvbG9ycyk7IC8vIHB1YmxpYyBpbnRlcmZhY2VcblxuICAgIHZhciBmID0gZnVuY3Rpb24gZih2KSB7XG4gICAgICB2YXIgYyA9IGNocm9tYV8xKGdldENvbG9yKHYpKTtcblxuICAgICAgaWYgKF9vdXQgJiYgY1tfb3V0XSkge1xuICAgICAgICByZXR1cm4gY1tfb3V0XSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGM7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGYuY2xhc3NlcyA9IGZ1bmN0aW9uIChjbGFzc2VzKSB7XG4gICAgICBpZiAoY2xhc3NlcyAhPSBudWxsKSB7XG4gICAgICAgIGlmICh0eXBlJGooY2xhc3NlcykgPT09ICdhcnJheScpIHtcbiAgICAgICAgICBfY2xhc3NlcyA9IGNsYXNzZXM7XG4gICAgICAgICAgX2RvbWFpbiA9IFtjbGFzc2VzWzBdLCBjbGFzc2VzW2NsYXNzZXMubGVuZ3RoIC0gMV1dO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBkID0gY2hyb21hXzEuYW5hbHl6ZShfZG9tYWluKTtcblxuICAgICAgICAgIGlmIChjbGFzc2VzID09PSAwKSB7XG4gICAgICAgICAgICBfY2xhc3NlcyA9IFtkLm1pbiwgZC5tYXhdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfY2xhc3NlcyA9IGNocm9tYV8xLmxpbWl0cyhkLCAnZScsIGNsYXNzZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX2NsYXNzZXM7XG4gICAgfTtcblxuICAgIGYuZG9tYWluID0gZnVuY3Rpb24gKGRvbWFpbikge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBfZG9tYWluO1xuICAgICAgfVxuXG4gICAgICBfbWluID0gZG9tYWluWzBdO1xuICAgICAgX21heCA9IGRvbWFpbltkb21haW4ubGVuZ3RoIC0gMV07XG4gICAgICBfcG9zID0gW107XG4gICAgICB2YXIgayA9IF9jb2xvcnMubGVuZ3RoO1xuXG4gICAgICBpZiAoZG9tYWluLmxlbmd0aCA9PT0gayAmJiBfbWluICE9PSBfbWF4KSB7XG4gICAgICAgIC8vIHVwZGF0ZSBwb3NpdGlvbnNcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxpc3QgPSBBcnJheS5mcm9tKGRvbWFpbik7IGkgPCBsaXN0Lmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgdmFyIGQgPSBsaXN0W2ldO1xuXG4gICAgICAgICAgX3Bvcy5wdXNoKChkIC0gX21pbikgLyAoX21heCAtIF9taW4pKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBrOyBjKyspIHtcbiAgICAgICAgICBfcG9zLnB1c2goYyAvIChrIC0gMSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRvbWFpbi5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgLy8gc2V0IGRvbWFpbiBtYXBcbiAgICAgICAgICB2YXIgdE91dCA9IGRvbWFpbi5tYXAoZnVuY3Rpb24gKGQsIGkpIHtcbiAgICAgICAgICAgIHJldHVybiBpIC8gKGRvbWFpbi5sZW5ndGggLSAxKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB2YXIgdEJyZWFrcyA9IGRvbWFpbi5tYXAoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICAgIHJldHVybiAoZCAtIF9taW4pIC8gKF9tYXggLSBfbWluKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmICghdEJyZWFrcy5ldmVyeShmdW5jdGlvbiAodmFsLCBpKSB7XG4gICAgICAgICAgICByZXR1cm4gdE91dFtpXSA9PT0gdmFsO1xuICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICB0TWFwRG9tYWluID0gZnVuY3Rpb24gdE1hcERvbWFpbih0KSB7XG4gICAgICAgICAgICAgIGlmICh0IDw9IDAgfHwgdCA+PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB2YXIgaSA9IDA7XG5cbiAgICAgICAgICAgICAgd2hpbGUgKHQgPj0gdEJyZWFrc1tpICsgMV0pIHtcbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB2YXIgZiA9ICh0IC0gdEJyZWFrc1tpXSkgLyAodEJyZWFrc1tpICsgMV0gLSB0QnJlYWtzW2ldKTtcbiAgICAgICAgICAgICAgdmFyIG91dCA9IHRPdXRbaV0gKyBmICogKHRPdXRbaSArIDFdIC0gdE91dFtpXSk7XG4gICAgICAgICAgICAgIHJldHVybiBvdXQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBfZG9tYWluID0gW19taW4sIF9tYXhdO1xuICAgICAgcmV0dXJuIGY7XG4gICAgfTtcblxuICAgIGYubW9kZSA9IGZ1bmN0aW9uIChfbSkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBfbW9kZTtcbiAgICAgIH1cblxuICAgICAgX21vZGUgPSBfbTtcbiAgICAgIHJlc2V0Q2FjaGUoKTtcbiAgICAgIHJldHVybiBmO1xuICAgIH07XG5cbiAgICBmLnJhbmdlID0gZnVuY3Rpb24gKGNvbG9ycywgX3Bvcykge1xuICAgICAgc2V0Q29sb3JzKGNvbG9ycywgX3Bvcyk7XG4gICAgICByZXR1cm4gZjtcbiAgICB9O1xuXG4gICAgZi5vdXQgPSBmdW5jdGlvbiAoX28pIHtcbiAgICAgIF9vdXQgPSBfbztcbiAgICAgIHJldHVybiBmO1xuICAgIH07XG5cbiAgICBmLnNwcmVhZCA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gX3NwcmVhZDtcbiAgICAgIH1cblxuICAgICAgX3NwcmVhZCA9IHZhbDtcbiAgICAgIHJldHVybiBmO1xuICAgIH07XG5cbiAgICBmLmNvcnJlY3RMaWdodG5lc3MgPSBmdW5jdGlvbiAodikge1xuICAgICAgaWYgKHYgPT0gbnVsbCkge1xuICAgICAgICB2ID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgX2NvcnJlY3RMaWdodG5lc3MgPSB2O1xuICAgICAgcmVzZXRDYWNoZSgpO1xuXG4gICAgICBpZiAoX2NvcnJlY3RMaWdodG5lc3MpIHtcbiAgICAgICAgdE1hcExpZ2h0bmVzcyA9IGZ1bmN0aW9uIHRNYXBMaWdodG5lc3ModCkge1xuICAgICAgICAgIHZhciBMMCA9IGdldENvbG9yKDAsIHRydWUpLmxhYigpWzBdO1xuICAgICAgICAgIHZhciBMMSA9IGdldENvbG9yKDEsIHRydWUpLmxhYigpWzBdO1xuICAgICAgICAgIHZhciBwb2wgPSBMMCA+IEwxO1xuICAgICAgICAgIHZhciBMX2FjdHVhbCA9IGdldENvbG9yKHQsIHRydWUpLmxhYigpWzBdO1xuICAgICAgICAgIHZhciBMX2lkZWFsID0gTDAgKyAoTDEgLSBMMCkgKiB0O1xuICAgICAgICAgIHZhciBMX2RpZmYgPSBMX2FjdHVhbCAtIExfaWRlYWw7XG4gICAgICAgICAgdmFyIHQwID0gMDtcbiAgICAgICAgICB2YXIgdDEgPSAxO1xuICAgICAgICAgIHZhciBtYXhfaXRlciA9IDIwO1xuXG4gICAgICAgICAgd2hpbGUgKE1hdGguYWJzKExfZGlmZikgPiAxZS0yICYmIG1heF9pdGVyLS0gPiAwKSB7XG4gICAgICAgICAgICAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICBpZiAocG9sKSB7XG4gICAgICAgICAgICAgICAgTF9kaWZmICo9IC0xO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKExfZGlmZiA8IDApIHtcbiAgICAgICAgICAgICAgICB0MCA9IHQ7XG4gICAgICAgICAgICAgICAgdCArPSAodDEgLSB0KSAqIDAuNTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0MSA9IHQ7XG4gICAgICAgICAgICAgICAgdCArPSAodDAgLSB0KSAqIDAuNTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIExfYWN0dWFsID0gZ2V0Q29sb3IodCwgdHJ1ZSkubGFiKClbMF07XG4gICAgICAgICAgICAgIHJldHVybiBMX2RpZmYgPSBMX2FjdHVhbCAtIExfaWRlYWw7XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB0O1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdE1hcExpZ2h0bmVzcyA9IGZ1bmN0aW9uIHRNYXBMaWdodG5lc3ModCkge1xuICAgICAgICAgIHJldHVybiB0O1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZjtcbiAgICB9O1xuXG4gICAgZi5wYWRkaW5nID0gZnVuY3Rpb24gKHApIHtcbiAgICAgIGlmIChwICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHR5cGUkaihwKSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICBwID0gW3AsIHBdO1xuICAgICAgICB9XG5cbiAgICAgICAgX3BhZGRpbmcgPSBwO1xuICAgICAgICByZXR1cm4gZjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBfcGFkZGluZztcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZi5jb2xvcnMgPSBmdW5jdGlvbiAobnVtQ29sb3JzLCBvdXQpIHtcbiAgICAgIC8vIElmIG5vIGFyZ3VtZW50cyBhcmUgZ2l2ZW4sIHJldHVybiB0aGUgb3JpZ2luYWwgY29sb3JzIHRoYXQgd2VyZSBwcm92aWRlZFxuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgICAgIG91dCA9ICdoZXgnO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVzdWx0ID0gW107XG5cbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJlc3VsdCA9IF9jb2xvcnMuc2xpY2UoMCk7XG4gICAgICB9IGVsc2UgaWYgKG51bUNvbG9ycyA9PT0gMSkge1xuICAgICAgICByZXN1bHQgPSBbZigwLjUpXTtcbiAgICAgIH0gZWxzZSBpZiAobnVtQ29sb3JzID4gMSkge1xuICAgICAgICB2YXIgZG0gPSBfZG9tYWluWzBdO1xuICAgICAgICB2YXIgZGQgPSBfZG9tYWluWzFdIC0gZG07XG4gICAgICAgIHJlc3VsdCA9IF9fcmFuZ2VfXygwLCBudW1Db2xvcnMsIGZhbHNlKS5tYXAoZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICByZXR1cm4gZihkbSArIGkgLyAobnVtQ29sb3JzIC0gMSkgKiBkZCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcmV0dXJucyBhbGwgY29sb3JzIGJhc2VkIG9uIHRoZSBkZWZpbmVkIGNsYXNzZXNcbiAgICAgICAgY29sb3JzID0gW107XG4gICAgICAgIHZhciBzYW1wbGVzID0gW107XG5cbiAgICAgICAgaWYgKF9jbGFzc2VzICYmIF9jbGFzc2VzLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMSwgZW5kID0gX2NsYXNzZXMubGVuZ3RoLCBhc2MgPSAxIDw9IGVuZDsgYXNjID8gaSA8IGVuZCA6IGkgPiBlbmQ7IGFzYyA/IGkrKyA6IGktLSkge1xuICAgICAgICAgICAgc2FtcGxlcy5wdXNoKChfY2xhc3Nlc1tpIC0gMV0gKyBfY2xhc3Nlc1tpXSkgKiAwLjUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzYW1wbGVzID0gX2RvbWFpbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdCA9IHNhbXBsZXMubWFwKGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgcmV0dXJuIGYodik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hyb21hXzFbb3V0XSkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQubWFwKGZ1bmN0aW9uIChjKSB7XG4gICAgICAgICAgcmV0dXJuIGNbb3V0XSgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgZi5jYWNoZSA9IGZ1bmN0aW9uIChjKSB7XG4gICAgICBpZiAoYyAhPSBudWxsKSB7XG4gICAgICAgIF91c2VDYWNoZSA9IGM7XG4gICAgICAgIHJldHVybiBmO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIF91c2VDYWNoZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZi5nYW1tYSA9IGZ1bmN0aW9uIChnKSB7XG4gICAgICBpZiAoZyAhPSBudWxsKSB7XG4gICAgICAgIF9nYW1tYSA9IGc7XG4gICAgICAgIHJldHVybiBmO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIF9nYW1tYTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZi5ub2RhdGEgPSBmdW5jdGlvbiAoZCkge1xuICAgICAgaWYgKGQgIT0gbnVsbCkge1xuICAgICAgICBfbmFjb2wgPSBjaHJvbWFfMShkKTtcbiAgICAgICAgcmV0dXJuIGY7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gX25hY29sO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gZjtcbiAgfTtcblxuICBmdW5jdGlvbiBfX3JhbmdlX18obGVmdCwgcmlnaHQsIGluY2x1c2l2ZSkge1xuICAgIHZhciByYW5nZSA9IFtdO1xuICAgIHZhciBhc2NlbmRpbmcgPSBsZWZ0IDwgcmlnaHQ7XG4gICAgdmFyIGVuZCA9ICFpbmNsdXNpdmUgPyByaWdodCA6IGFzY2VuZGluZyA/IHJpZ2h0ICsgMSA6IHJpZ2h0IC0gMTtcblxuICAgIGZvciAodmFyIGkgPSBsZWZ0OyBhc2NlbmRpbmcgPyBpIDwgZW5kIDogaSA+IGVuZDsgYXNjZW5kaW5nID8gaSsrIDogaS0tKSB7XG4gICAgICByYW5nZS5wdXNoKGkpO1xuICAgIH1cblxuICAgIHJldHVybiByYW5nZTtcbiAgfSAvL1xuICAvLyBpbnRlcnBvbGF0ZXMgYmV0d2VlbiBhIHNldCBvZiBjb2xvcnMgdXppbmcgYSBiZXppZXIgc3BsaW5lXG4gIC8vXG4gIC8vIEByZXF1aXJlcyB1dGlscyBsYWJcblxuXG4gIHZhciBiZXppZXIgPSBmdW5jdGlvbiBiZXppZXIoY29sb3JzKSB7XG4gICAgdmFyIGFzc2lnbiwgYXNzaWduJDEsIGFzc2lnbiQyO1xuICAgIHZhciBJLCBsYWIwLCBsYWIxLCBsYWIyO1xuICAgIGNvbG9ycyA9IGNvbG9ycy5tYXAoZnVuY3Rpb24gKGMpIHtcbiAgICAgIHJldHVybiBuZXcgQ29sb3JfMShjKTtcbiAgICB9KTtcblxuICAgIGlmIChjb2xvcnMubGVuZ3RoID09PSAyKSB7XG4gICAgICAvLyBsaW5lYXIgaW50ZXJwb2xhdGlvblxuICAgICAgYXNzaWduID0gY29sb3JzLm1hcChmdW5jdGlvbiAoYykge1xuICAgICAgICByZXR1cm4gYy5sYWIoKTtcbiAgICAgIH0pLCBsYWIwID0gYXNzaWduWzBdLCBsYWIxID0gYXNzaWduWzFdO1xuXG4gICAgICBJID0gZnVuY3Rpb24gSSh0KSB7XG4gICAgICAgIHZhciBsYWIgPSBbMCwgMSwgMl0ubWFwKGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgcmV0dXJuIGxhYjBbaV0gKyB0ICogKGxhYjFbaV0gLSBsYWIwW2ldKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXcgQ29sb3JfMShsYWIsICdsYWInKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChjb2xvcnMubGVuZ3RoID09PSAzKSB7XG4gICAgICAvLyBxdWFkcmF0aWMgYmV6aWVyIGludGVycG9sYXRpb25cbiAgICAgIGFzc2lnbiQxID0gY29sb3JzLm1hcChmdW5jdGlvbiAoYykge1xuICAgICAgICByZXR1cm4gYy5sYWIoKTtcbiAgICAgIH0pLCBsYWIwID0gYXNzaWduJDFbMF0sIGxhYjEgPSBhc3NpZ24kMVsxXSwgbGFiMiA9IGFzc2lnbiQxWzJdO1xuXG4gICAgICBJID0gZnVuY3Rpb24gSSh0KSB7XG4gICAgICAgIHZhciBsYWIgPSBbMCwgMSwgMl0ubWFwKGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgcmV0dXJuICgxIC0gdCkgKiAoMSAtIHQpICogbGFiMFtpXSArIDIgKiAoMSAtIHQpICogdCAqIGxhYjFbaV0gKyB0ICogdCAqIGxhYjJbaV07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3IENvbG9yXzEobGFiLCAnbGFiJyk7XG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoY29sb3JzLmxlbmd0aCA9PT0gNCkge1xuICAgICAgLy8gY3ViaWMgYmV6aWVyIGludGVycG9sYXRpb25cbiAgICAgIHZhciBsYWIzO1xuICAgICAgYXNzaWduJDIgPSBjb2xvcnMubWFwKGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIHJldHVybiBjLmxhYigpO1xuICAgICAgfSksIGxhYjAgPSBhc3NpZ24kMlswXSwgbGFiMSA9IGFzc2lnbiQyWzFdLCBsYWIyID0gYXNzaWduJDJbMl0sIGxhYjMgPSBhc3NpZ24kMlszXTtcblxuICAgICAgSSA9IGZ1bmN0aW9uIEkodCkge1xuICAgICAgICB2YXIgbGFiID0gWzAsIDEsIDJdLm1hcChmdW5jdGlvbiAoaSkge1xuICAgICAgICAgIHJldHVybiAoMSAtIHQpICogKDEgLSB0KSAqICgxIC0gdCkgKiBsYWIwW2ldICsgMyAqICgxIC0gdCkgKiAoMSAtIHQpICogdCAqIGxhYjFbaV0gKyAzICogKDEgLSB0KSAqIHQgKiB0ICogbGFiMltpXSArIHQgKiB0ICogdCAqIGxhYjNbaV07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3IENvbG9yXzEobGFiLCAnbGFiJyk7XG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoY29sb3JzLmxlbmd0aCA9PT0gNSkge1xuICAgICAgdmFyIEkwID0gYmV6aWVyKGNvbG9ycy5zbGljZSgwLCAzKSk7XG4gICAgICB2YXIgSTEgPSBiZXppZXIoY29sb3JzLnNsaWNlKDIsIDUpKTtcblxuICAgICAgSSA9IGZ1bmN0aW9uIEkodCkge1xuICAgICAgICBpZiAodCA8IDAuNSkge1xuICAgICAgICAgIHJldHVybiBJMCh0ICogMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIEkxKCh0IC0gMC41KSAqIDIpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBJO1xuICB9O1xuXG4gIHZhciBiZXppZXJfMSA9IGZ1bmN0aW9uIGJlemllcl8xKGNvbG9ycykge1xuICAgIHZhciBmID0gYmV6aWVyKGNvbG9ycyk7XG5cbiAgICBmLnNjYWxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHNjYWxlKGYpO1xuICAgIH07XG5cbiAgICByZXR1cm4gZjtcbiAgfTtcbiAgLypcbiAgICogaW50ZXJwb2xhdGVzIGJldHdlZW4gYSBzZXQgb2YgY29sb3JzIHV6aW5nIGEgYmV6aWVyIHNwbGluZVxuICAgKiBibGVuZCBtb2RlIGZvcm11bGFzIHRha2VuIGZyb20gaHR0cDovL3d3dy52ZW50dXJlLXdhcmUuY29tL2tldmluL2NvZGluZy9sZXRzLWxlYXJuLW1hdGgtcGhvdG9zaG9wLWJsZW5kLW1vZGVzL1xuICAgKi9cblxuXG4gIHZhciBibGVuZCA9IGZ1bmN0aW9uIGJsZW5kKGJvdHRvbSwgdG9wLCBtb2RlKSB7XG4gICAgaWYgKCFibGVuZFttb2RlXSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIGJsZW5kIG1vZGUgJyArIG1vZGUpO1xuICAgIH1cblxuICAgIHJldHVybiBibGVuZFttb2RlXShib3R0b20sIHRvcCk7XG4gIH07XG5cbiAgdmFyIGJsZW5kX2YgPSBmdW5jdGlvbiBibGVuZF9mKGYpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGJvdHRvbSwgdG9wKSB7XG4gICAgICB2YXIgYzAgPSBjaHJvbWFfMSh0b3ApLnJnYigpO1xuICAgICAgdmFyIGMxID0gY2hyb21hXzEoYm90dG9tKS5yZ2IoKTtcbiAgICAgIHJldHVybiBjaHJvbWFfMS5yZ2IoZihjMCwgYzEpKTtcbiAgICB9O1xuICB9O1xuXG4gIHZhciBlYWNoID0gZnVuY3Rpb24gZWFjaChmKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChjMCwgYzEpIHtcbiAgICAgIHZhciBvdXQgPSBbXTtcbiAgICAgIG91dFswXSA9IGYoYzBbMF0sIGMxWzBdKTtcbiAgICAgIG91dFsxXSA9IGYoYzBbMV0sIGMxWzFdKTtcbiAgICAgIG91dFsyXSA9IGYoYzBbMl0sIGMxWzJdKTtcbiAgICAgIHJldHVybiBvdXQ7XG4gICAgfTtcbiAgfTtcblxuICB2YXIgbm9ybWFsID0gZnVuY3Rpb24gbm9ybWFsKGEpIHtcbiAgICByZXR1cm4gYTtcbiAgfTtcblxuICB2YXIgbXVsdGlwbHkgPSBmdW5jdGlvbiBtdWx0aXBseShhLCBiKSB7XG4gICAgcmV0dXJuIGEgKiBiIC8gMjU1O1xuICB9O1xuXG4gIHZhciBkYXJrZW4kMSA9IGZ1bmN0aW9uIGRhcmtlbiQxKGEsIGIpIHtcbiAgICByZXR1cm4gYSA+IGIgPyBiIDogYTtcbiAgfTtcblxuICB2YXIgbGlnaHRlbiA9IGZ1bmN0aW9uIGxpZ2h0ZW4oYSwgYikge1xuICAgIHJldHVybiBhID4gYiA/IGEgOiBiO1xuICB9O1xuXG4gIHZhciBzY3JlZW4gPSBmdW5jdGlvbiBzY3JlZW4oYSwgYikge1xuICAgIHJldHVybiAyNTUgKiAoMSAtICgxIC0gYSAvIDI1NSkgKiAoMSAtIGIgLyAyNTUpKTtcbiAgfTtcblxuICB2YXIgb3ZlcmxheSA9IGZ1bmN0aW9uIG92ZXJsYXkoYSwgYikge1xuICAgIHJldHVybiBiIDwgMTI4ID8gMiAqIGEgKiBiIC8gMjU1IDogMjU1ICogKDEgLSAyICogKDEgLSBhIC8gMjU1KSAqICgxIC0gYiAvIDI1NSkpO1xuICB9O1xuXG4gIHZhciBidXJuID0gZnVuY3Rpb24gYnVybihhLCBiKSB7XG4gICAgcmV0dXJuIDI1NSAqICgxIC0gKDEgLSBiIC8gMjU1KSAvIChhIC8gMjU1KSk7XG4gIH07XG5cbiAgdmFyIGRvZGdlID0gZnVuY3Rpb24gZG9kZ2UoYSwgYikge1xuICAgIGlmIChhID09PSAyNTUpIHtcbiAgICAgIHJldHVybiAyNTU7XG4gICAgfVxuXG4gICAgYSA9IDI1NSAqIChiIC8gMjU1KSAvICgxIC0gYSAvIDI1NSk7XG4gICAgcmV0dXJuIGEgPiAyNTUgPyAyNTUgOiBhO1xuICB9OyAvLyAjIGFkZCA9IChhLGIpIC0+XG4gIC8vICMgICAgIGlmIChhICsgYiA+IDI1NSkgdGhlbiAyNTUgZWxzZSBhICsgYlxuXG5cbiAgYmxlbmQubm9ybWFsID0gYmxlbmRfZihlYWNoKG5vcm1hbCkpO1xuICBibGVuZC5tdWx0aXBseSA9IGJsZW5kX2YoZWFjaChtdWx0aXBseSkpO1xuICBibGVuZC5zY3JlZW4gPSBibGVuZF9mKGVhY2goc2NyZWVuKSk7XG4gIGJsZW5kLm92ZXJsYXkgPSBibGVuZF9mKGVhY2gob3ZlcmxheSkpO1xuICBibGVuZC5kYXJrZW4gPSBibGVuZF9mKGVhY2goZGFya2VuJDEpKTtcbiAgYmxlbmQubGlnaHRlbiA9IGJsZW5kX2YoZWFjaChsaWdodGVuKSk7XG4gIGJsZW5kLmRvZGdlID0gYmxlbmRfZihlYWNoKGRvZGdlKSk7XG4gIGJsZW5kLmJ1cm4gPSBibGVuZF9mKGVhY2goYnVybikpOyAvLyBibGVuZC5hZGQgPSBibGVuZF9mKGVhY2goYWRkKSk7XG5cbiAgdmFyIGJsZW5kXzEgPSBibGVuZDsgLy8gY3ViZWhlbGl4IGludGVycG9sYXRpb25cbiAgLy8gYmFzZWQgb24gRC5BLiBHcmVlbiBcIkEgY29sb3VyIHNjaGVtZSBmb3IgdGhlIGRpc3BsYXkgb2YgYXN0cm9ub21pY2FsIGludGVuc2l0eSBpbWFnZXNcIlxuICAvLyBodHRwOi8vYXN0cm9uLXNvYy5pbi9idWxsZXRpbi8xMUp1bmUvMjg5MzkyMDExLnBkZlxuXG4gIHZhciB0eXBlJGsgPSB1dGlscy50eXBlO1xuICB2YXIgY2xpcF9yZ2IkMyA9IHV0aWxzLmNsaXBfcmdiO1xuICB2YXIgVFdPUEkkMiA9IHV0aWxzLlRXT1BJO1xuICB2YXIgcG93JDYgPSBNYXRoLnBvdztcbiAgdmFyIHNpbiQyID0gTWF0aC5zaW47XG4gIHZhciBjb3MkMyA9IE1hdGguY29zO1xuXG4gIHZhciBjdWJlaGVsaXggPSBmdW5jdGlvbiBjdWJlaGVsaXgoc3RhcnQsIHJvdGF0aW9ucywgaHVlLCBnYW1tYSwgbGlnaHRuZXNzKSB7XG4gICAgaWYgKHN0YXJ0ID09PSB2b2lkIDApIHN0YXJ0ID0gMzAwO1xuICAgIGlmIChyb3RhdGlvbnMgPT09IHZvaWQgMCkgcm90YXRpb25zID0gLTEuNTtcbiAgICBpZiAoaHVlID09PSB2b2lkIDApIGh1ZSA9IDE7XG4gICAgaWYgKGdhbW1hID09PSB2b2lkIDApIGdhbW1hID0gMTtcbiAgICBpZiAobGlnaHRuZXNzID09PSB2b2lkIDApIGxpZ2h0bmVzcyA9IFswLCAxXTtcbiAgICB2YXIgZGggPSAwLFxuICAgICAgICBkbDtcblxuICAgIGlmICh0eXBlJGsobGlnaHRuZXNzKSA9PT0gJ2FycmF5Jykge1xuICAgICAgZGwgPSBsaWdodG5lc3NbMV0gLSBsaWdodG5lc3NbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRsID0gMDtcbiAgICAgIGxpZ2h0bmVzcyA9IFtsaWdodG5lc3MsIGxpZ2h0bmVzc107XG4gICAgfVxuXG4gICAgdmFyIGYgPSBmdW5jdGlvbiBmKGZyYWN0KSB7XG4gICAgICB2YXIgYSA9IFRXT1BJJDIgKiAoKHN0YXJ0ICsgMTIwKSAvIDM2MCArIHJvdGF0aW9ucyAqIGZyYWN0KTtcbiAgICAgIHZhciBsID0gcG93JDYobGlnaHRuZXNzWzBdICsgZGwgKiBmcmFjdCwgZ2FtbWEpO1xuICAgICAgdmFyIGggPSBkaCAhPT0gMCA/IGh1ZVswXSArIGZyYWN0ICogZGggOiBodWU7XG4gICAgICB2YXIgYW1wID0gaCAqIGwgKiAoMSAtIGwpIC8gMjtcbiAgICAgIHZhciBjb3NfYSA9IGNvcyQzKGEpO1xuICAgICAgdmFyIHNpbl9hID0gc2luJDIoYSk7XG4gICAgICB2YXIgciA9IGwgKyBhbXAgKiAoLTAuMTQ4NjEgKiBjb3NfYSArIDEuNzgyNzcgKiBzaW5fYSk7XG4gICAgICB2YXIgZyA9IGwgKyBhbXAgKiAoLTAuMjkyMjcgKiBjb3NfYSAtIDAuOTA2NDkgKiBzaW5fYSk7XG4gICAgICB2YXIgYiA9IGwgKyBhbXAgKiAoKzEuOTcyOTQgKiBjb3NfYSk7XG4gICAgICByZXR1cm4gY2hyb21hXzEoY2xpcF9yZ2IkMyhbciAqIDI1NSwgZyAqIDI1NSwgYiAqIDI1NSwgMV0pKTtcbiAgICB9O1xuXG4gICAgZi5zdGFydCA9IGZ1bmN0aW9uIChzKSB7XG4gICAgICBpZiAocyA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBzdGFydDtcbiAgICAgIH1cblxuICAgICAgc3RhcnQgPSBzO1xuICAgICAgcmV0dXJuIGY7XG4gICAgfTtcblxuICAgIGYucm90YXRpb25zID0gZnVuY3Rpb24gKHIpIHtcbiAgICAgIGlmIChyID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHJvdGF0aW9ucztcbiAgICAgIH1cblxuICAgICAgcm90YXRpb25zID0gcjtcbiAgICAgIHJldHVybiBmO1xuICAgIH07XG5cbiAgICBmLmdhbW1hID0gZnVuY3Rpb24gKGcpIHtcbiAgICAgIGlmIChnID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGdhbW1hO1xuICAgICAgfVxuXG4gICAgICBnYW1tYSA9IGc7XG4gICAgICByZXR1cm4gZjtcbiAgICB9O1xuXG4gICAgZi5odWUgPSBmdW5jdGlvbiAoaCkge1xuICAgICAgaWYgKGggPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gaHVlO1xuICAgICAgfVxuXG4gICAgICBodWUgPSBoO1xuXG4gICAgICBpZiAodHlwZSRrKGh1ZSkgPT09ICdhcnJheScpIHtcbiAgICAgICAgZGggPSBodWVbMV0gLSBodWVbMF07XG5cbiAgICAgICAgaWYgKGRoID09PSAwKSB7XG4gICAgICAgICAgaHVlID0gaHVlWzFdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkaCA9IDA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmO1xuICAgIH07XG5cbiAgICBmLmxpZ2h0bmVzcyA9IGZ1bmN0aW9uIChoKSB7XG4gICAgICBpZiAoaCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBsaWdodG5lc3M7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlJGsoaCkgPT09ICdhcnJheScpIHtcbiAgICAgICAgbGlnaHRuZXNzID0gaDtcbiAgICAgICAgZGwgPSBoWzFdIC0gaFswXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpZ2h0bmVzcyA9IFtoLCBoXTtcbiAgICAgICAgZGwgPSAwO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZjtcbiAgICB9O1xuXG4gICAgZi5zY2FsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBjaHJvbWFfMS5zY2FsZShmKTtcbiAgICB9O1xuXG4gICAgZi5odWUoaHVlKTtcbiAgICByZXR1cm4gZjtcbiAgfTtcblxuICB2YXIgZGlnaXRzID0gJzAxMjM0NTY3ODlhYmNkZWYnO1xuICB2YXIgZmxvb3IkMiA9IE1hdGguZmxvb3I7XG4gIHZhciByYW5kb20gPSBNYXRoLnJhbmRvbTtcblxuICB2YXIgcmFuZG9tXzEgPSBmdW5jdGlvbiByYW5kb21fMSgpIHtcbiAgICB2YXIgY29kZSA9ICcjJztcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNjsgaSsrKSB7XG4gICAgICBjb2RlICs9IGRpZ2l0cy5jaGFyQXQoZmxvb3IkMihyYW5kb20oKSAqIDE2KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBDb2xvcl8xKGNvZGUsICdoZXgnKTtcbiAgfTtcblxuICB2YXIgbG9nJDEgPSBNYXRoLmxvZztcbiAgdmFyIHBvdyQ3ID0gTWF0aC5wb3c7XG4gIHZhciBmbG9vciQzID0gTWF0aC5mbG9vcjtcbiAgdmFyIGFicyA9IE1hdGguYWJzO1xuXG4gIHZhciBhbmFseXplID0gZnVuY3Rpb24gYW5hbHl6ZShkYXRhLCBrZXkpIHtcbiAgICBpZiAoa2V5ID09PSB2b2lkIDApIGtleSA9IG51bGw7XG4gICAgdmFyIHIgPSB7XG4gICAgICBtaW46IE51bWJlci5NQVhfVkFMVUUsXG4gICAgICBtYXg6IE51bWJlci5NQVhfVkFMVUUgKiAtMSxcbiAgICAgIHN1bTogMCxcbiAgICAgIHZhbHVlczogW10sXG4gICAgICBjb3VudDogMFxuICAgIH07XG5cbiAgICBpZiAodHlwZShkYXRhKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGRhdGEgPSBPYmplY3QudmFsdWVzKGRhdGEpO1xuICAgIH1cblxuICAgIGRhdGEuZm9yRWFjaChmdW5jdGlvbiAodmFsKSB7XG4gICAgICBpZiAoa2V5ICYmIHR5cGUodmFsKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgdmFsID0gdmFsW2tleV07XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCAmJiB2YWwgIT09IG51bGwgJiYgIWlzTmFOKHZhbCkpIHtcbiAgICAgICAgci52YWx1ZXMucHVzaCh2YWwpO1xuICAgICAgICByLnN1bSArPSB2YWw7XG5cbiAgICAgICAgaWYgKHZhbCA8IHIubWluKSB7XG4gICAgICAgICAgci5taW4gPSB2YWw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsID4gci5tYXgpIHtcbiAgICAgICAgICByLm1heCA9IHZhbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHIuY291bnQgKz0gMTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByLmRvbWFpbiA9IFtyLm1pbiwgci5tYXhdO1xuXG4gICAgci5saW1pdHMgPSBmdW5jdGlvbiAobW9kZSwgbnVtKSB7XG4gICAgICByZXR1cm4gbGltaXRzKHIsIG1vZGUsIG51bSk7XG4gICAgfTtcblxuICAgIHJldHVybiByO1xuICB9O1xuXG4gIHZhciBsaW1pdHMgPSBmdW5jdGlvbiBsaW1pdHMoZGF0YSwgbW9kZSwgbnVtKSB7XG4gICAgaWYgKG1vZGUgPT09IHZvaWQgMCkgbW9kZSA9ICdlcXVhbCc7XG4gICAgaWYgKG51bSA9PT0gdm9pZCAwKSBudW0gPSA3O1xuXG4gICAgaWYgKHR5cGUoZGF0YSkgPT0gJ2FycmF5Jykge1xuICAgICAgZGF0YSA9IGFuYWx5emUoZGF0YSk7XG4gICAgfVxuXG4gICAgdmFyIG1pbiA9IGRhdGEubWluO1xuICAgIHZhciBtYXggPSBkYXRhLm1heDtcbiAgICB2YXIgdmFsdWVzID0gZGF0YS52YWx1ZXMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEgLSBiO1xuICAgIH0pO1xuXG4gICAgaWYgKG51bSA9PT0gMSkge1xuICAgICAgcmV0dXJuIFttaW4sIG1heF07XG4gICAgfVxuXG4gICAgdmFyIGxpbWl0cyA9IFtdO1xuXG4gICAgaWYgKG1vZGUuc3Vic3RyKDAsIDEpID09PSAnYycpIHtcbiAgICAgIC8vIGNvbnRpbnVvdXNcbiAgICAgIGxpbWl0cy5wdXNoKG1pbik7XG4gICAgICBsaW1pdHMucHVzaChtYXgpO1xuICAgIH1cblxuICAgIGlmIChtb2RlLnN1YnN0cigwLCAxKSA9PT0gJ2UnKSB7XG4gICAgICAvLyBlcXVhbCBpbnRlcnZhbFxuICAgICAgbGltaXRzLnB1c2gobWluKTtcblxuICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBudW07IGkrKykge1xuICAgICAgICBsaW1pdHMucHVzaChtaW4gKyBpIC8gbnVtICogKG1heCAtIG1pbikpO1xuICAgICAgfVxuXG4gICAgICBsaW1pdHMucHVzaChtYXgpO1xuICAgIH0gZWxzZSBpZiAobW9kZS5zdWJzdHIoMCwgMSkgPT09ICdsJykge1xuICAgICAgLy8gbG9nIHNjYWxlXG4gICAgICBpZiAobWluIDw9IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdMb2dhcml0aG1pYyBzY2FsZXMgYXJlIG9ubHkgcG9zc2libGUgZm9yIHZhbHVlcyA+IDAnKTtcbiAgICAgIH1cblxuICAgICAgdmFyIG1pbl9sb2cgPSBNYXRoLkxPRzEwRSAqIGxvZyQxKG1pbik7XG4gICAgICB2YXIgbWF4X2xvZyA9IE1hdGguTE9HMTBFICogbG9nJDEobWF4KTtcbiAgICAgIGxpbWl0cy5wdXNoKG1pbik7XG5cbiAgICAgIGZvciAodmFyIGkkMSA9IDE7IGkkMSA8IG51bTsgaSQxKyspIHtcbiAgICAgICAgbGltaXRzLnB1c2gocG93JDcoMTAsIG1pbl9sb2cgKyBpJDEgLyBudW0gKiAobWF4X2xvZyAtIG1pbl9sb2cpKSk7XG4gICAgICB9XG5cbiAgICAgIGxpbWl0cy5wdXNoKG1heCk7XG4gICAgfSBlbHNlIGlmIChtb2RlLnN1YnN0cigwLCAxKSA9PT0gJ3EnKSB7XG4gICAgICAvLyBxdWFudGlsZSBzY2FsZVxuICAgICAgbGltaXRzLnB1c2gobWluKTtcblxuICAgICAgZm9yICh2YXIgaSQyID0gMTsgaSQyIDwgbnVtOyBpJDIrKykge1xuICAgICAgICB2YXIgcCA9ICh2YWx1ZXMubGVuZ3RoIC0gMSkgKiBpJDIgLyBudW07XG4gICAgICAgIHZhciBwYiA9IGZsb29yJDMocCk7XG5cbiAgICAgICAgaWYgKHBiID09PSBwKSB7XG4gICAgICAgICAgbGltaXRzLnB1c2godmFsdWVzW3BiXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gcCA+IHBiXG4gICAgICAgICAgdmFyIHByID0gcCAtIHBiO1xuICAgICAgICAgIGxpbWl0cy5wdXNoKHZhbHVlc1twYl0gKiAoMSAtIHByKSArIHZhbHVlc1twYiArIDFdICogcHIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxpbWl0cy5wdXNoKG1heCk7XG4gICAgfSBlbHNlIGlmIChtb2RlLnN1YnN0cigwLCAxKSA9PT0gJ2snKSB7XG4gICAgICAvLyBrLW1lYW5zIGNsdXN0ZXJpbmdcblxuICAgICAgLypcbiAgICAgIGltcGxlbWVudGF0aW9uIGJhc2VkIG9uXG4gICAgICBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZmlndWUvc291cmNlL2Jyb3dzZS90cnVuay9maWd1ZS5qcyMzMzZcbiAgICAgIHNpbXBsaWZpZWQgZm9yIDEtZCBpbnB1dCB2YWx1ZXNcbiAgICAgICovXG4gICAgICB2YXIgY2x1c3RlcjtcbiAgICAgIHZhciBuID0gdmFsdWVzLmxlbmd0aDtcbiAgICAgIHZhciBhc3NpZ25tZW50cyA9IG5ldyBBcnJheShuKTtcbiAgICAgIHZhciBjbHVzdGVyU2l6ZXMgPSBuZXcgQXJyYXkobnVtKTtcbiAgICAgIHZhciByZXBlYXQgPSB0cnVlO1xuICAgICAgdmFyIG5iX2l0ZXJzID0gMDtcbiAgICAgIHZhciBjZW50cm9pZHMgPSBudWxsOyAvLyBnZXQgc2VlZCB2YWx1ZXNcblxuICAgICAgY2VudHJvaWRzID0gW107XG4gICAgICBjZW50cm9pZHMucHVzaChtaW4pO1xuXG4gICAgICBmb3IgKHZhciBpJDMgPSAxOyBpJDMgPCBudW07IGkkMysrKSB7XG4gICAgICAgIGNlbnRyb2lkcy5wdXNoKG1pbiArIGkkMyAvIG51bSAqIChtYXggLSBtaW4pKTtcbiAgICAgIH1cblxuICAgICAgY2VudHJvaWRzLnB1c2gobWF4KTtcblxuICAgICAgd2hpbGUgKHJlcGVhdCkge1xuICAgICAgICAvLyBhc3NpZ25tZW50IHN0ZXBcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBudW07IGorKykge1xuICAgICAgICAgIGNsdXN0ZXJTaXplc1tqXSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBpJDQgPSAwOyBpJDQgPCBuOyBpJDQrKykge1xuICAgICAgICAgIHZhciB2YWx1ZSA9IHZhbHVlc1tpJDRdO1xuICAgICAgICAgIHZhciBtaW5kaXN0ID0gTnVtYmVyLk1BWF9WQUxVRTtcbiAgICAgICAgICB2YXIgYmVzdCA9IHZvaWQgMDtcblxuICAgICAgICAgIGZvciAodmFyIGokMSA9IDA7IGokMSA8IG51bTsgaiQxKyspIHtcbiAgICAgICAgICAgIHZhciBkaXN0ID0gYWJzKGNlbnRyb2lkc1tqJDFdIC0gdmFsdWUpO1xuXG4gICAgICAgICAgICBpZiAoZGlzdCA8IG1pbmRpc3QpIHtcbiAgICAgICAgICAgICAgbWluZGlzdCA9IGRpc3Q7XG4gICAgICAgICAgICAgIGJlc3QgPSBqJDE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNsdXN0ZXJTaXplc1tiZXN0XSsrO1xuICAgICAgICAgICAgYXNzaWdubWVudHNbaSQ0XSA9IGJlc3Q7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIHVwZGF0ZSBjZW50cm9pZHMgc3RlcFxuXG5cbiAgICAgICAgdmFyIG5ld0NlbnRyb2lkcyA9IG5ldyBBcnJheShudW0pO1xuXG4gICAgICAgIGZvciAodmFyIGokMiA9IDA7IGokMiA8IG51bTsgaiQyKyspIHtcbiAgICAgICAgICBuZXdDZW50cm9pZHNbaiQyXSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBpJDUgPSAwOyBpJDUgPCBuOyBpJDUrKykge1xuICAgICAgICAgIGNsdXN0ZXIgPSBhc3NpZ25tZW50c1tpJDVdO1xuXG4gICAgICAgICAgaWYgKG5ld0NlbnRyb2lkc1tjbHVzdGVyXSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgbmV3Q2VudHJvaWRzW2NsdXN0ZXJdID0gdmFsdWVzW2kkNV07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld0NlbnRyb2lkc1tjbHVzdGVyXSArPSB2YWx1ZXNbaSQ1XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBqJDMgPSAwOyBqJDMgPCBudW07IGokMysrKSB7XG4gICAgICAgICAgbmV3Q2VudHJvaWRzW2okM10gKj0gMSAvIGNsdXN0ZXJTaXplc1tqJDNdO1xuICAgICAgICB9IC8vIGNoZWNrIGNvbnZlcmdlbmNlXG5cblxuICAgICAgICByZXBlYXQgPSBmYWxzZTtcblxuICAgICAgICBmb3IgKHZhciBqJDQgPSAwOyBqJDQgPCBudW07IGokNCsrKSB7XG4gICAgICAgICAgaWYgKG5ld0NlbnRyb2lkc1tqJDRdICE9PSBjZW50cm9pZHNbaiQ0XSkge1xuICAgICAgICAgICAgcmVwZWF0ID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNlbnRyb2lkcyA9IG5ld0NlbnRyb2lkcztcbiAgICAgICAgbmJfaXRlcnMrKztcblxuICAgICAgICBpZiAobmJfaXRlcnMgPiAyMDApIHtcbiAgICAgICAgICByZXBlYXQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBmaW5pc2hlZCBrLW1lYW5zIGNsdXN0ZXJpbmdcbiAgICAgIC8vIHRoZSBuZXh0IHBhcnQgaXMgYm9ycm93ZWQgZnJvbSBnYWJyaWVsZmxvci5pdFxuXG5cbiAgICAgIHZhciBrQ2x1c3RlcnMgPSB7fTtcblxuICAgICAgZm9yICh2YXIgaiQ1ID0gMDsgaiQ1IDwgbnVtOyBqJDUrKykge1xuICAgICAgICBrQ2x1c3RlcnNbaiQ1XSA9IFtdO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpJDYgPSAwOyBpJDYgPCBuOyBpJDYrKykge1xuICAgICAgICBjbHVzdGVyID0gYXNzaWdubWVudHNbaSQ2XTtcbiAgICAgICAga0NsdXN0ZXJzW2NsdXN0ZXJdLnB1c2godmFsdWVzW2kkNl0pO1xuICAgICAgfVxuXG4gICAgICB2YXIgdG1wS01lYW5zQnJlYWtzID0gW107XG5cbiAgICAgIGZvciAodmFyIGokNiA9IDA7IGokNiA8IG51bTsgaiQ2KyspIHtcbiAgICAgICAgdG1wS01lYW5zQnJlYWtzLnB1c2goa0NsdXN0ZXJzW2okNl1bMF0pO1xuICAgICAgICB0bXBLTWVhbnNCcmVha3MucHVzaChrQ2x1c3RlcnNbaiQ2XVtrQ2x1c3RlcnNbaiQ2XS5sZW5ndGggLSAxXSk7XG4gICAgICB9XG5cbiAgICAgIHRtcEtNZWFuc0JyZWFrcyA9IHRtcEtNZWFuc0JyZWFrcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIHJldHVybiBhIC0gYjtcbiAgICAgIH0pO1xuICAgICAgbGltaXRzLnB1c2godG1wS01lYW5zQnJlYWtzWzBdKTtcblxuICAgICAgZm9yICh2YXIgaSQ3ID0gMTsgaSQ3IDwgdG1wS01lYW5zQnJlYWtzLmxlbmd0aDsgaSQ3ICs9IDIpIHtcbiAgICAgICAgdmFyIHYgPSB0bXBLTWVhbnNCcmVha3NbaSQ3XTtcblxuICAgICAgICBpZiAoIWlzTmFOKHYpICYmIGxpbWl0cy5pbmRleE9mKHYpID09PSAtMSkge1xuICAgICAgICAgIGxpbWl0cy5wdXNoKHYpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbWl0cztcbiAgfTtcblxuICB2YXIgYW5hbHl6ZV8xID0ge1xuICAgIGFuYWx5emU6IGFuYWx5emUsXG4gICAgbGltaXRzOiBsaW1pdHNcbiAgfTtcblxuICB2YXIgY29udHJhc3QgPSBmdW5jdGlvbiBjb250cmFzdChhLCBiKSB7XG4gICAgLy8gV0NBRyBjb250cmFzdCByYXRpb1xuICAgIC8vIHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA4L1JFQy1XQ0FHMjAtMjAwODEyMTEvI2NvbnRyYXN0LXJhdGlvZGVmXG4gICAgYSA9IG5ldyBDb2xvcl8xKGEpO1xuICAgIGIgPSBuZXcgQ29sb3JfMShiKTtcbiAgICB2YXIgbDEgPSBhLmx1bWluYW5jZSgpO1xuICAgIHZhciBsMiA9IGIubHVtaW5hbmNlKCk7XG4gICAgcmV0dXJuIGwxID4gbDIgPyAobDEgKyAwLjA1KSAvIChsMiArIDAuMDUpIDogKGwyICsgMC4wNSkgLyAobDEgKyAwLjA1KTtcbiAgfTtcblxuICB2YXIgc3FydCQ0ID0gTWF0aC5zcXJ0O1xuICB2YXIgYXRhbjIkMiA9IE1hdGguYXRhbjI7XG4gIHZhciBhYnMkMSA9IE1hdGguYWJzO1xuICB2YXIgY29zJDQgPSBNYXRoLmNvcztcbiAgdmFyIFBJJDIgPSBNYXRoLlBJO1xuXG4gIHZhciBkZWx0YUUgPSBmdW5jdGlvbiBkZWx0YUUoYSwgYiwgTCwgQykge1xuICAgIGlmIChMID09PSB2b2lkIDApIEwgPSAxO1xuICAgIGlmIChDID09PSB2b2lkIDApIEMgPSAxOyAvLyBEZWx0YSBFIChDTUMpXG4gICAgLy8gc2VlIGh0dHA6Ly93d3cuYnJ1Y2VsaW5kYmxvb20uY29tL2luZGV4Lmh0bWw/RXFuX0RlbHRhRV9DTUMuaHRtbFxuXG4gICAgYSA9IG5ldyBDb2xvcl8xKGEpO1xuICAgIGIgPSBuZXcgQ29sb3JfMShiKTtcbiAgICB2YXIgcmVmID0gQXJyYXkuZnJvbShhLmxhYigpKTtcbiAgICB2YXIgTDEgPSByZWZbMF07XG4gICAgdmFyIGExID0gcmVmWzFdO1xuICAgIHZhciBiMSA9IHJlZlsyXTtcbiAgICB2YXIgcmVmJDEgPSBBcnJheS5mcm9tKGIubGFiKCkpO1xuICAgIHZhciBMMiA9IHJlZiQxWzBdO1xuICAgIHZhciBhMiA9IHJlZiQxWzFdO1xuICAgIHZhciBiMiA9IHJlZiQxWzJdO1xuICAgIHZhciBjMSA9IHNxcnQkNChhMSAqIGExICsgYjEgKiBiMSk7XG4gICAgdmFyIGMyID0gc3FydCQ0KGEyICogYTIgKyBiMiAqIGIyKTtcbiAgICB2YXIgc2wgPSBMMSA8IDE2LjAgPyAwLjUxMSA6IDAuMDQwOTc1ICogTDEgLyAoMS4wICsgMC4wMTc2NSAqIEwxKTtcbiAgICB2YXIgc2MgPSAwLjA2MzggKiBjMSAvICgxLjAgKyAwLjAxMzEgKiBjMSkgKyAwLjYzODtcbiAgICB2YXIgaDEgPSBjMSA8IDAuMDAwMDAxID8gMC4wIDogYXRhbjIkMihiMSwgYTEpICogMTgwLjAgLyBQSSQyO1xuXG4gICAgd2hpbGUgKGgxIDwgMCkge1xuICAgICAgaDEgKz0gMzYwO1xuICAgIH1cblxuICAgIHdoaWxlIChoMSA+PSAzNjApIHtcbiAgICAgIGgxIC09IDM2MDtcbiAgICB9XG5cbiAgICB2YXIgdCA9IGgxID49IDE2NC4wICYmIGgxIDw9IDM0NS4wID8gMC41NiArIGFicyQxKDAuMiAqIGNvcyQ0KFBJJDIgKiAoaDEgKyAxNjguMCkgLyAxODAuMCkpIDogMC4zNiArIGFicyQxKDAuNCAqIGNvcyQ0KFBJJDIgKiAoaDEgKyAzNS4wKSAvIDE4MC4wKSk7XG4gICAgdmFyIGM0ID0gYzEgKiBjMSAqIGMxICogYzE7XG4gICAgdmFyIGYgPSBzcXJ0JDQoYzQgLyAoYzQgKyAxOTAwLjApKTtcbiAgICB2YXIgc2ggPSBzYyAqIChmICogdCArIDEuMCAtIGYpO1xuICAgIHZhciBkZWxMID0gTDEgLSBMMjtcbiAgICB2YXIgZGVsQyA9IGMxIC0gYzI7XG4gICAgdmFyIGRlbEEgPSBhMSAtIGEyO1xuICAgIHZhciBkZWxCID0gYjEgLSBiMjtcbiAgICB2YXIgZEgyID0gZGVsQSAqIGRlbEEgKyBkZWxCICogZGVsQiAtIGRlbEMgKiBkZWxDO1xuICAgIHZhciB2MSA9IGRlbEwgLyAoTCAqIHNsKTtcbiAgICB2YXIgdjIgPSBkZWxDIC8gKEMgKiBzYyk7XG4gICAgdmFyIHYzID0gc2g7XG4gICAgcmV0dXJuIHNxcnQkNCh2MSAqIHYxICsgdjIgKiB2MiArIGRIMiAvICh2MyAqIHYzKSk7XG4gIH07IC8vIHNpbXBsZSBFdWNsaWRlYW4gZGlzdGFuY2VcblxuXG4gIHZhciBkaXN0YW5jZSA9IGZ1bmN0aW9uIGRpc3RhbmNlKGEsIGIsIG1vZGUpIHtcbiAgICBpZiAobW9kZSA9PT0gdm9pZCAwKSBtb2RlID0gJ2xhYic7IC8vIERlbHRhIEUgKENJRSAxOTc2KVxuICAgIC8vIHNlZSBodHRwOi8vd3d3LmJydWNlbGluZGJsb29tLmNvbS9pbmRleC5odG1sP0VxdWF0aW9ucy5odG1sXG5cbiAgICBhID0gbmV3IENvbG9yXzEoYSk7XG4gICAgYiA9IG5ldyBDb2xvcl8xKGIpO1xuICAgIHZhciBsMSA9IGEuZ2V0KG1vZGUpO1xuICAgIHZhciBsMiA9IGIuZ2V0KG1vZGUpO1xuICAgIHZhciBzdW1fc3EgPSAwO1xuXG4gICAgZm9yICh2YXIgaSBpbiBsMSkge1xuICAgICAgdmFyIGQgPSAobDFbaV0gfHwgMCkgLSAobDJbaV0gfHwgMCk7XG4gICAgICBzdW1fc3EgKz0gZCAqIGQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIE1hdGguc3FydChzdW1fc3EpO1xuICB9O1xuXG4gIHZhciB2YWxpZCA9IGZ1bmN0aW9uIHZhbGlkKCkge1xuICAgIHZhciBhcmdzID0gW10sXG4gICAgICAgIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICB3aGlsZSAobGVuLS0pIHtcbiAgICAgIGFyZ3NbbGVuXSA9IGFyZ3VtZW50c1tsZW5dO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBuZXcgKEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmFwcGx5KENvbG9yXzEsIFtudWxsXS5jb25jYXQoYXJncykpKSgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTsgLy8gc29tZSBwcmUtZGVmaW5lZCBjb2xvciBzY2FsZXM6XG5cblxuICB2YXIgc2NhbGVzID0ge1xuICAgIGNvb2w6IGZ1bmN0aW9uIGNvb2woKSB7XG4gICAgICByZXR1cm4gc2NhbGUoW2Nocm9tYV8xLmhzbCgxODAsIDEsIC45KSwgY2hyb21hXzEuaHNsKDI1MCwgLjcsIC40KV0pO1xuICAgIH0sXG4gICAgaG90OiBmdW5jdGlvbiBob3QoKSB7XG4gICAgICByZXR1cm4gc2NhbGUoWycjMDAwJywgJyNmMDAnLCAnI2ZmMCcsICcjZmZmJ10sIFswLCAuMjUsIC43NSwgMV0pLm1vZGUoJ3JnYicpO1xuICAgIH1cbiAgfTtcbiAgLyoqXG4gICAgICBDb2xvckJyZXdlciBjb2xvcnMgZm9yIGNocm9tYS5qc1xuICAgICAgIENvcHlyaWdodCAoYykgMjAwMiBDeW50aGlhIEJyZXdlciwgTWFyayBIYXJyb3dlciwgYW5kIFRoZVxuICAgICAgUGVubnN5bHZhbmlhIFN0YXRlIFVuaXZlcnNpdHkuXG4gICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZFxuICAgICAgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1JcbiAgICAgIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gICAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICAqL1xuXG4gIHZhciBjb2xvcmJyZXdlciA9IHtcbiAgICAvLyBzZXF1ZW50aWFsXG4gICAgT3JSZDogWycjZmZmN2VjJywgJyNmZWU4YzgnLCAnI2ZkZDQ5ZScsICcjZmRiYjg0JywgJyNmYzhkNTknLCAnI2VmNjU0OCcsICcjZDczMDFmJywgJyNiMzAwMDAnLCAnIzdmMDAwMCddLFxuICAgIFB1QnU6IFsnI2ZmZjdmYicsICcjZWNlN2YyJywgJyNkMGQxZTYnLCAnI2E2YmRkYicsICcjNzRhOWNmJywgJyMzNjkwYzAnLCAnIzA1NzBiMCcsICcjMDQ1YThkJywgJyMwMjM4NTgnXSxcbiAgICBCdVB1OiBbJyNmN2ZjZmQnLCAnI2UwZWNmNCcsICcjYmZkM2U2JywgJyM5ZWJjZGEnLCAnIzhjOTZjNicsICcjOGM2YmIxJywgJyM4ODQxOWQnLCAnIzgxMGY3YycsICcjNGQwMDRiJ10sXG4gICAgT3JhbmdlczogWycjZmZmNWViJywgJyNmZWU2Y2UnLCAnI2ZkZDBhMicsICcjZmRhZTZiJywgJyNmZDhkM2MnLCAnI2YxNjkxMycsICcjZDk0ODAxJywgJyNhNjM2MDMnLCAnIzdmMjcwNCddLFxuICAgIEJ1R246IFsnI2Y3ZmNmZCcsICcjZTVmNWY5JywgJyNjY2VjZTYnLCAnIzk5ZDhjOScsICcjNjZjMmE0JywgJyM0MWFlNzYnLCAnIzIzOGI0NScsICcjMDA2ZDJjJywgJyMwMDQ0MWInXSxcbiAgICBZbE9yQnI6IFsnI2ZmZmZlNScsICcjZmZmN2JjJywgJyNmZWUzOTEnLCAnI2ZlYzQ0ZicsICcjZmU5OTI5JywgJyNlYzcwMTQnLCAnI2NjNGMwMicsICcjOTkzNDA0JywgJyM2NjI1MDYnXSxcbiAgICBZbEduOiBbJyNmZmZmZTUnLCAnI2Y3ZmNiOScsICcjZDlmMGEzJywgJyNhZGRkOGUnLCAnIzc4YzY3OScsICcjNDFhYjVkJywgJyMyMzg0NDMnLCAnIzAwNjgzNycsICcjMDA0NTI5J10sXG4gICAgUmVkczogWycjZmZmNWYwJywgJyNmZWUwZDInLCAnI2ZjYmJhMScsICcjZmM5MjcyJywgJyNmYjZhNGEnLCAnI2VmM2IyYycsICcjY2IxODFkJywgJyNhNTBmMTUnLCAnIzY3MDAwZCddLFxuICAgIFJkUHU6IFsnI2ZmZjdmMycsICcjZmRlMGRkJywgJyNmY2M1YzAnLCAnI2ZhOWZiNScsICcjZjc2OGExJywgJyNkZDM0OTcnLCAnI2FlMDE3ZScsICcjN2EwMTc3JywgJyM0OTAwNmEnXSxcbiAgICBHcmVlbnM6IFsnI2Y3ZmNmNScsICcjZTVmNWUwJywgJyNjN2U5YzAnLCAnI2ExZDk5YicsICcjNzRjNDc2JywgJyM0MWFiNWQnLCAnIzIzOGI0NScsICcjMDA2ZDJjJywgJyMwMDQ0MWInXSxcbiAgICBZbEduQnU6IFsnI2ZmZmZkOScsICcjZWRmOGIxJywgJyNjN2U5YjQnLCAnIzdmY2RiYicsICcjNDFiNmM0JywgJyMxZDkxYzAnLCAnIzIyNWVhOCcsICcjMjUzNDk0JywgJyMwODFkNTgnXSxcbiAgICBQdXJwbGVzOiBbJyNmY2ZiZmQnLCAnI2VmZWRmNScsICcjZGFkYWViJywgJyNiY2JkZGMnLCAnIzllOWFjOCcsICcjODA3ZGJhJywgJyM2YTUxYTMnLCAnIzU0Mjc4ZicsICcjM2YwMDdkJ10sXG4gICAgR25CdTogWycjZjdmY2YwJywgJyNlMGYzZGInLCAnI2NjZWJjNScsICcjYThkZGI1JywgJyM3YmNjYzQnLCAnIzRlYjNkMycsICcjMmI4Y2JlJywgJyMwODY4YWMnLCAnIzA4NDA4MSddLFxuICAgIEdyZXlzOiBbJyNmZmZmZmYnLCAnI2YwZjBmMCcsICcjZDlkOWQ5JywgJyNiZGJkYmQnLCAnIzk2OTY5NicsICcjNzM3MzczJywgJyM1MjUyNTInLCAnIzI1MjUyNScsICcjMDAwMDAwJ10sXG4gICAgWWxPclJkOiBbJyNmZmZmY2MnLCAnI2ZmZWRhMCcsICcjZmVkOTc2JywgJyNmZWIyNGMnLCAnI2ZkOGQzYycsICcjZmM0ZTJhJywgJyNlMzFhMWMnLCAnI2JkMDAyNicsICcjODAwMDI2J10sXG4gICAgUHVSZDogWycjZjdmNGY5JywgJyNlN2UxZWYnLCAnI2Q0YjlkYScsICcjYzk5NGM3JywgJyNkZjY1YjAnLCAnI2U3Mjk4YScsICcjY2UxMjU2JywgJyM5ODAwNDMnLCAnIzY3MDAxZiddLFxuICAgIEJsdWVzOiBbJyNmN2ZiZmYnLCAnI2RlZWJmNycsICcjYzZkYmVmJywgJyM5ZWNhZTEnLCAnIzZiYWVkNicsICcjNDI5MmM2JywgJyMyMTcxYjUnLCAnIzA4NTE5YycsICcjMDgzMDZiJ10sXG4gICAgUHVCdUduOiBbJyNmZmY3ZmInLCAnI2VjZTJmMCcsICcjZDBkMWU2JywgJyNhNmJkZGInLCAnIzY3YTljZicsICcjMzY5MGMwJywgJyMwMjgxOGEnLCAnIzAxNmM1OScsICcjMDE0NjM2J10sXG4gICAgVmlyaWRpczogWycjNDQwMTU0JywgJyM0ODI3NzcnLCAnIzNmNGE4YScsICcjMzE2NzhlJywgJyMyNjgzOGYnLCAnIzFmOWQ4YScsICcjNmNjZTVhJywgJyNiNmRlMmInLCAnI2ZlZTgyNSddLFxuICAgIC8vIGRpdmVyZ2luZ1xuICAgIFNwZWN0cmFsOiBbJyM5ZTAxNDInLCAnI2Q1M2U0ZicsICcjZjQ2ZDQzJywgJyNmZGFlNjEnLCAnI2ZlZTA4YicsICcjZmZmZmJmJywgJyNlNmY1OTgnLCAnI2FiZGRhNCcsICcjNjZjMmE1JywgJyMzMjg4YmQnLCAnIzVlNGZhMiddLFxuICAgIFJkWWxHbjogWycjYTUwMDI2JywgJyNkNzMwMjcnLCAnI2Y0NmQ0MycsICcjZmRhZTYxJywgJyNmZWUwOGInLCAnI2ZmZmZiZicsICcjZDllZjhiJywgJyNhNmQ5NmEnLCAnIzY2YmQ2MycsICcjMWE5ODUwJywgJyMwMDY4MzcnXSxcbiAgICBSZEJ1OiBbJyM2NzAwMWYnLCAnI2IyMTgyYicsICcjZDY2MDRkJywgJyNmNGE1ODInLCAnI2ZkZGJjNycsICcjZjdmN2Y3JywgJyNkMWU1ZjAnLCAnIzkyYzVkZScsICcjNDM5M2MzJywgJyMyMTY2YWMnLCAnIzA1MzA2MSddLFxuICAgIFBpWUc6IFsnIzhlMDE1MicsICcjYzUxYjdkJywgJyNkZTc3YWUnLCAnI2YxYjZkYScsICcjZmRlMGVmJywgJyNmN2Y3ZjcnLCAnI2U2ZjVkMCcsICcjYjhlMTg2JywgJyM3ZmJjNDEnLCAnIzRkOTIyMScsICcjMjc2NDE5J10sXG4gICAgUFJHbjogWycjNDAwMDRiJywgJyM3NjJhODMnLCAnIzk5NzBhYicsICcjYzJhNWNmJywgJyNlN2Q0ZTgnLCAnI2Y3ZjdmNycsICcjZDlmMGQzJywgJyNhNmRiYTAnLCAnIzVhYWU2MScsICcjMWI3ODM3JywgJyMwMDQ0MWInXSxcbiAgICBSZFlsQnU6IFsnI2E1MDAyNicsICcjZDczMDI3JywgJyNmNDZkNDMnLCAnI2ZkYWU2MScsICcjZmVlMDkwJywgJyNmZmZmYmYnLCAnI2UwZjNmOCcsICcjYWJkOWU5JywgJyM3NGFkZDEnLCAnIzQ1NzViNCcsICcjMzEzNjk1J10sXG4gICAgQnJCRzogWycjNTQzMDA1JywgJyM4YzUxMGEnLCAnI2JmODEyZCcsICcjZGZjMjdkJywgJyNmNmU4YzMnLCAnI2Y1ZjVmNScsICcjYzdlYWU1JywgJyM4MGNkYzEnLCAnIzM1OTc4ZicsICcjMDE2NjVlJywgJyMwMDNjMzAnXSxcbiAgICBSZEd5OiBbJyM2NzAwMWYnLCAnI2IyMTgyYicsICcjZDY2MDRkJywgJyNmNGE1ODInLCAnI2ZkZGJjNycsICcjZmZmZmZmJywgJyNlMGUwZTAnLCAnI2JhYmFiYScsICcjODc4Nzg3JywgJyM0ZDRkNGQnLCAnIzFhMWExYSddLFxuICAgIFB1T3I6IFsnIzdmM2IwOCcsICcjYjM1ODA2JywgJyNlMDgyMTQnLCAnI2ZkYjg2MycsICcjZmVlMGI2JywgJyNmN2Y3ZjcnLCAnI2Q4ZGFlYicsICcjYjJhYmQyJywgJyM4MDczYWMnLCAnIzU0Mjc4OCcsICcjMmQwMDRiJ10sXG4gICAgLy8gcXVhbGl0YXRpdmVcbiAgICBTZXQyOiBbJyM2NmMyYTUnLCAnI2ZjOGQ2MicsICcjOGRhMGNiJywgJyNlNzhhYzMnLCAnI2E2ZDg1NCcsICcjZmZkOTJmJywgJyNlNWM0OTQnLCAnI2IzYjNiMyddLFxuICAgIEFjY2VudDogWycjN2ZjOTdmJywgJyNiZWFlZDQnLCAnI2ZkYzA4NicsICcjZmZmZjk5JywgJyMzODZjYjAnLCAnI2YwMDI3ZicsICcjYmY1YjE3JywgJyM2NjY2NjYnXSxcbiAgICBTZXQxOiBbJyNlNDFhMWMnLCAnIzM3N2ViOCcsICcjNGRhZjRhJywgJyM5ODRlYTMnLCAnI2ZmN2YwMCcsICcjZmZmZjMzJywgJyNhNjU2MjgnLCAnI2Y3ODFiZicsICcjOTk5OTk5J10sXG4gICAgU2V0MzogWycjOGRkM2M3JywgJyNmZmZmYjMnLCAnI2JlYmFkYScsICcjZmI4MDcyJywgJyM4MGIxZDMnLCAnI2ZkYjQ2MicsICcjYjNkZTY5JywgJyNmY2NkZTUnLCAnI2Q5ZDlkOScsICcjYmM4MGJkJywgJyNjY2ViYzUnLCAnI2ZmZWQ2ZiddLFxuICAgIERhcmsyOiBbJyMxYjllNzcnLCAnI2Q5NWYwMicsICcjNzU3MGIzJywgJyNlNzI5OGEnLCAnIzY2YTYxZScsICcjZTZhYjAyJywgJyNhNjc2MWQnLCAnIzY2NjY2NiddLFxuICAgIFBhaXJlZDogWycjYTZjZWUzJywgJyMxZjc4YjQnLCAnI2IyZGY4YScsICcjMzNhMDJjJywgJyNmYjlhOTknLCAnI2UzMWExYycsICcjZmRiZjZmJywgJyNmZjdmMDAnLCAnI2NhYjJkNicsICcjNmEzZDlhJywgJyNmZmZmOTknLCAnI2IxNTkyOCddLFxuICAgIFBhc3RlbDI6IFsnI2IzZTJjZCcsICcjZmRjZGFjJywgJyNjYmQ1ZTgnLCAnI2Y0Y2FlNCcsICcjZTZmNWM5JywgJyNmZmYyYWUnLCAnI2YxZTJjYycsICcjY2NjY2NjJ10sXG4gICAgUGFzdGVsMTogWycjZmJiNGFlJywgJyNiM2NkZTMnLCAnI2NjZWJjNScsICcjZGVjYmU0JywgJyNmZWQ5YTYnLCAnI2ZmZmZjYycsICcjZTVkOGJkJywgJyNmZGRhZWMnLCAnI2YyZjJmMiddXG4gIH07IC8vIGFkZCBsb3dlcmNhc2UgYWxpYXNlcyBmb3IgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaGVzXG5cbiAgZm9yICh2YXIgaSQxID0gMCwgbGlzdCQxID0gT2JqZWN0LmtleXMoY29sb3JicmV3ZXIpOyBpJDEgPCBsaXN0JDEubGVuZ3RoOyBpJDEgKz0gMSkge1xuICAgIHZhciBrZXkgPSBsaXN0JDFbaSQxXTtcbiAgICBjb2xvcmJyZXdlcltrZXkudG9Mb3dlckNhc2UoKV0gPSBjb2xvcmJyZXdlcltrZXldO1xuICB9XG5cbiAgdmFyIGNvbG9yYnJld2VyXzEgPSBjb2xvcmJyZXdlcjsgLy8gZmVlbCBmcmVlIHRvIGNvbW1lbnQgb3V0IGFueXRoaW5nIHRvIHJvbGx1cFxuICAvLyBhIHNtYWxsZXIgY2hyb21hLmpzIGJ1aWx0XG4gIC8vIGlvIC0tPiBjb252ZXJ0IGNvbG9yc1xuICAvLyBvcGVyYXRvcnMgLS0+IG1vZGlmeSBleGlzdGluZyBDb2xvcnNcbiAgLy8gaW50ZXJwb2xhdG9yc1xuICAvLyBnZW5lcmF0b3JzIC0tID4gY3JlYXRlIG5ldyBjb2xvcnNcblxuICBjaHJvbWFfMS5hdmVyYWdlID0gYXZlcmFnZTtcbiAgY2hyb21hXzEuYmV6aWVyID0gYmV6aWVyXzE7XG4gIGNocm9tYV8xLmJsZW5kID0gYmxlbmRfMTtcbiAgY2hyb21hXzEuY3ViZWhlbGl4ID0gY3ViZWhlbGl4O1xuICBjaHJvbWFfMS5taXggPSBjaHJvbWFfMS5pbnRlcnBvbGF0ZSA9IG1peDtcbiAgY2hyb21hXzEucmFuZG9tID0gcmFuZG9tXzE7XG4gIGNocm9tYV8xLnNjYWxlID0gc2NhbGU7IC8vIG90aGVyIHV0aWxpdHkgbWV0aG9kc1xuXG4gIGNocm9tYV8xLmFuYWx5emUgPSBhbmFseXplXzEuYW5hbHl6ZTtcbiAgY2hyb21hXzEuY29udHJhc3QgPSBjb250cmFzdDtcbiAgY2hyb21hXzEuZGVsdGFFID0gZGVsdGFFO1xuICBjaHJvbWFfMS5kaXN0YW5jZSA9IGRpc3RhbmNlO1xuICBjaHJvbWFfMS5saW1pdHMgPSBhbmFseXplXzEubGltaXRzO1xuICBjaHJvbWFfMS52YWxpZCA9IHZhbGlkOyAvLyBzY2FsZVxuXG4gIGNocm9tYV8xLnNjYWxlcyA9IHNjYWxlczsgLy8gY29sb3JzXG5cbiAgY2hyb21hXzEuY29sb3JzID0gdzNjeDExXzE7XG4gIGNocm9tYV8xLmJyZXdlciA9IGNvbG9yYnJld2VyXzE7XG4gIHZhciBjaHJvbWFfanMgPSBjaHJvbWFfMTtcbiAgcmV0dXJuIGNocm9tYV9qcztcbn0pOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///3873\n")},2846:function(__unused_webpack_module,exports){eval("/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m;\n var eLen = nBytes * 8 - mLen - 1;\n var eMax = (1 << eLen) - 1;\n var eBias = eMax >> 1;\n var nBits = -7;\n var i = isLE ? nBytes - 1 : 0;\n var d = isLE ? -1 : 1;\n var s = buffer[offset + i];\n i += d;\n e = s & (1 << -nBits) - 1;\n s >>= -nBits;\n nBits += eLen;\n\n for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & (1 << -nBits) - 1;\n e >>= -nBits;\n nBits += mLen;\n\n for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias;\n } else if (e === eMax) {\n return m ? NaN : (s ? -1 : 1) * Infinity;\n } else {\n m = m + Math.pow(2, mLen);\n e = e - eBias;\n }\n\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen);\n};\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c;\n var eLen = nBytes * 8 - mLen - 1;\n var eMax = (1 << eLen) - 1;\n var eBias = eMax >> 1;\n var rt = mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0;\n var i = isLE ? 0 : nBytes - 1;\n var d = isLE ? 1 : -1;\n var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;\n value = Math.abs(value);\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0;\n e = eMax;\n } else {\n e = Math.floor(Math.log(value) / Math.LN2);\n\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--;\n c *= 2;\n }\n\n if (e + eBias >= 1) {\n value += rt / c;\n } else {\n value += rt * Math.pow(2, 1 - eBias);\n }\n\n if (value * c >= 2) {\n e++;\n c /= 2;\n }\n\n if (e + eBias >= eMax) {\n m = 0;\n e = eMax;\n } else if (e + eBias >= 1) {\n m = (value * c - 1) * Math.pow(2, mLen);\n e = e + eBias;\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);\n e = 0;\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = e << mLen | m;\n eLen += mLen;\n\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9pZWVlNzU0L2luZGV4LmpzPzBiNzkiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFFBQVEsV0FBVzs7QUFFbkI7QUFDQTtBQUNBOztBQUVBLFFBQVEsV0FBVzs7QUFFbkI7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsUUFBUSxXQUFXOztBQUVuQjtBQUNBOztBQUVBLFFBQVEsVUFBVTs7QUFFbEI7QUFDQSIsImZpbGUiOiIyODQ2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyohIGllZWU3NTQuIEJTRC0zLUNsYXVzZSBMaWNlbnNlLiBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmcvb3BlbnNvdXJjZT4gKi9cbmV4cG9ydHMucmVhZCA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtO1xuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMTtcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDE7XG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMTtcbiAgdmFyIG5CaXRzID0gLTc7XG4gIHZhciBpID0gaXNMRSA/IG5CeXRlcyAtIDEgOiAwO1xuICB2YXIgZCA9IGlzTEUgPyAtMSA6IDE7XG4gIHZhciBzID0gYnVmZmVyW29mZnNldCArIGldO1xuICBpICs9IGQ7XG4gIGUgPSBzICYgKDEgPDwgLW5CaXRzKSAtIDE7XG4gIHMgPj49IC1uQml0cztcbiAgbkJpdHMgKz0gZUxlbjtcblxuICBmb3IgKDsgbkJpdHMgPiAwOyBlID0gZSAqIDI1NiArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIG0gPSBlICYgKDEgPDwgLW5CaXRzKSAtIDE7XG4gIGUgPj49IC1uQml0cztcbiAgbkJpdHMgKz0gbUxlbjtcblxuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gbSAqIDI1NiArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhcztcbiAgfSBlbHNlIGlmIChlID09PSBlTWF4KSB7XG4gICAgcmV0dXJuIG0gPyBOYU4gOiAocyA/IC0xIDogMSkgKiBJbmZpbml0eTtcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pO1xuICAgIGUgPSBlIC0gZUJpYXM7XG4gIH1cblxuICByZXR1cm4gKHMgPyAtMSA6IDEpICogbSAqIE1hdGgucG93KDIsIGUgLSBtTGVuKTtcbn07XG5cbmV4cG9ydHMud3JpdGUgPSBmdW5jdGlvbiAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG0sIGM7XG4gIHZhciBlTGVuID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxO1xuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMTtcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxO1xuICB2YXIgcnQgPSBtTGVuID09PSAyMyA/IE1hdGgucG93KDIsIC0yNCkgLSBNYXRoLnBvdygyLCAtNzcpIDogMDtcbiAgdmFyIGkgPSBpc0xFID8gMCA6IG5CeXRlcyAtIDE7XG4gIHZhciBkID0gaXNMRSA/IDEgOiAtMTtcbiAgdmFyIHMgPSB2YWx1ZSA8IDAgfHwgdmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCA/IDEgOiAwO1xuICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKTtcblxuICBpZiAoaXNOYU4odmFsdWUpIHx8IHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgIG0gPSBpc05hTih2YWx1ZSkgPyAxIDogMDtcbiAgICBlID0gZU1heDtcbiAgfSBlbHNlIHtcbiAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMik7XG5cbiAgICBpZiAodmFsdWUgKiAoYyA9IE1hdGgucG93KDIsIC1lKSkgPCAxKSB7XG4gICAgICBlLS07XG4gICAgICBjICo9IDI7XG4gICAgfVxuXG4gICAgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICB2YWx1ZSArPSBydCAvIGM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlICs9IHJ0ICogTWF0aC5wb3coMiwgMSAtIGVCaWFzKTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgKiBjID49IDIpIHtcbiAgICAgIGUrKztcbiAgICAgIGMgLz0gMjtcbiAgICB9XG5cbiAgICBpZiAoZSArIGVCaWFzID49IGVNYXgpIHtcbiAgICAgIG0gPSAwO1xuICAgICAgZSA9IGVNYXg7XG4gICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgbSA9ICh2YWx1ZSAqIGMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pO1xuICAgICAgZSA9IGUgKyBlQmlhcztcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IHZhbHVlICogTWF0aC5wb3coMiwgZUJpYXMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pO1xuICAgICAgZSA9IDA7XG4gICAgfVxuICB9XG5cbiAgZm9yICg7IG1MZW4gPj0gODsgYnVmZmVyW29mZnNldCArIGldID0gbSAmIDB4ZmYsIGkgKz0gZCwgbSAvPSAyNTYsIG1MZW4gLT0gOCkge31cblxuICBlID0gZSA8PCBtTGVuIHwgbTtcbiAgZUxlbiArPSBtTGVuO1xuXG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjg7XG59OyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///2846\n")},5978:function(module){eval("var fontWeights = {\n thin: 100,\n hairline: 100,\n 'ultra-light': 100,\n 'extra-light': 100,\n light: 200,\n book: 300,\n regular: 400,\n normal: 400,\n plain: 400,\n roman: 400,\n standard: 400,\n medium: 500,\n 'semi-bold': 600,\n 'demi-bold': 600,\n bold: 700,\n heavy: 800,\n black: 800,\n 'extra-bold': 800,\n 'ultra-black': 900,\n 'extra-black': 900,\n 'ultra-bold': 900,\n 'heavy-black': 900,\n fat: 900,\n poster: 900\n};\nvar sp = ' ';\nvar italicRE = /(italic|oblique)$/i;\nvar fontCache = {};\n\nmodule.exports = function (fonts, size, lineHeight) {\n var cssData = fontCache[fonts];\n\n if (!cssData) {\n if (!Array.isArray(fonts)) {\n fonts = [fonts];\n }\n\n var weight = 400;\n var style = 'normal';\n var fontFamilies = [];\n var haveWeight, haveStyle;\n\n for (var i = 0, ii = fonts.length; i < ii; ++i) {\n var font = fonts[i];\n var parts = font.split(' ');\n var maybeWeight = parts[parts.length - 1].toLowerCase();\n\n if (maybeWeight == 'normal' || maybeWeight == 'italic' || maybeWeight == 'oblique') {\n style = haveStyle ? style : maybeWeight;\n parts.pop();\n maybeWeight = parts[parts.length - 1].toLowerCase();\n } else if (italicRE.test(maybeWeight)) {\n maybeWeight = maybeWeight.replace(italicRE, '');\n style = haveStyle ? style : parts[parts.length - 1].replace(maybeWeight, '');\n }\n\n for (var w in fontWeights) {\n if (maybeWeight == w || maybeWeight == w.replace('-', '') || maybeWeight == w.replace('-', sp)) {\n weight = haveWeight ? weight : fontWeights[w];\n parts.pop();\n break;\n }\n }\n\n if (!haveWeight && typeof maybeWeight == 'number') {\n weight = maybeWeight;\n }\n\n var fontFamily = parts.join(sp).replace('Klokantech Noto Sans', 'Noto Sans');\n\n if (fontFamily.indexOf(sp) !== -1) {\n fontFamily = '\"' + fontFamily + '\"';\n }\n\n fontFamilies.push(fontFamily);\n } // CSS font property: font-style font-weight font-size/line-height font-family\n\n\n cssData = fontCache[fonts] = [style, weight, fontFamilies];\n }\n\n return cssData[0] + sp + cssData[1] + sp + size + 'px' + (lineHeight ? '/' + lineHeight : '') + sp + cssData[2];\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9tYXBib3gtdG8tY3NzLWZvbnQvaW5kZXguanM/M2VhNSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsc0NBQXNDLFFBQVE7QUFDOUM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTs7QUFFQTtBQUNBIiwiZmlsZSI6IjU5NzguanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZm9udFdlaWdodHMgPSB7XG4gIHRoaW46IDEwMCxcbiAgaGFpcmxpbmU6IDEwMCxcbiAgJ3VsdHJhLWxpZ2h0JzogMTAwLFxuICAnZXh0cmEtbGlnaHQnOiAxMDAsXG4gIGxpZ2h0OiAyMDAsXG4gIGJvb2s6IDMwMCxcbiAgcmVndWxhcjogNDAwLFxuICBub3JtYWw6IDQwMCxcbiAgcGxhaW46IDQwMCxcbiAgcm9tYW46IDQwMCxcbiAgc3RhbmRhcmQ6IDQwMCxcbiAgbWVkaXVtOiA1MDAsXG4gICdzZW1pLWJvbGQnOiA2MDAsXG4gICdkZW1pLWJvbGQnOiA2MDAsXG4gIGJvbGQ6IDcwMCxcbiAgaGVhdnk6IDgwMCxcbiAgYmxhY2s6IDgwMCxcbiAgJ2V4dHJhLWJvbGQnOiA4MDAsXG4gICd1bHRyYS1ibGFjayc6IDkwMCxcbiAgJ2V4dHJhLWJsYWNrJzogOTAwLFxuICAndWx0cmEtYm9sZCc6IDkwMCxcbiAgJ2hlYXZ5LWJsYWNrJzogOTAwLFxuICBmYXQ6IDkwMCxcbiAgcG9zdGVyOiA5MDBcbn07XG52YXIgc3AgPSAnICc7XG52YXIgaXRhbGljUkUgPSAvKGl0YWxpY3xvYmxpcXVlKSQvaTtcbnZhciBmb250Q2FjaGUgPSB7fTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm9udHMsIHNpemUsIGxpbmVIZWlnaHQpIHtcbiAgdmFyIGNzc0RhdGEgPSBmb250Q2FjaGVbZm9udHNdO1xuXG4gIGlmICghY3NzRGF0YSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShmb250cykpIHtcbiAgICAgIGZvbnRzID0gW2ZvbnRzXTtcbiAgICB9XG5cbiAgICB2YXIgd2VpZ2h0ID0gNDAwO1xuICAgIHZhciBzdHlsZSA9ICdub3JtYWwnO1xuICAgIHZhciBmb250RmFtaWxpZXMgPSBbXTtcbiAgICB2YXIgaGF2ZVdlaWdodCwgaGF2ZVN0eWxlO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGlpID0gZm9udHMubGVuZ3RoOyBpIDwgaWk7ICsraSkge1xuICAgICAgdmFyIGZvbnQgPSBmb250c1tpXTtcbiAgICAgIHZhciBwYXJ0cyA9IGZvbnQuc3BsaXQoJyAnKTtcbiAgICAgIHZhciBtYXliZVdlaWdodCA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIGlmIChtYXliZVdlaWdodCA9PSAnbm9ybWFsJyB8fCBtYXliZVdlaWdodCA9PSAnaXRhbGljJyB8fCBtYXliZVdlaWdodCA9PSAnb2JsaXF1ZScpIHtcbiAgICAgICAgc3R5bGUgPSBoYXZlU3R5bGUgPyBzdHlsZSA6IG1heWJlV2VpZ2h0O1xuICAgICAgICBwYXJ0cy5wb3AoKTtcbiAgICAgICAgbWF5YmVXZWlnaHQgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgfSBlbHNlIGlmIChpdGFsaWNSRS50ZXN0KG1heWJlV2VpZ2h0KSkge1xuICAgICAgICBtYXliZVdlaWdodCA9IG1heWJlV2VpZ2h0LnJlcGxhY2UoaXRhbGljUkUsICcnKTtcbiAgICAgICAgc3R5bGUgPSBoYXZlU3R5bGUgPyBzdHlsZSA6IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdLnJlcGxhY2UobWF5YmVXZWlnaHQsICcnKTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgdyBpbiBmb250V2VpZ2h0cykge1xuICAgICAgICBpZiAobWF5YmVXZWlnaHQgPT0gdyB8fCBtYXliZVdlaWdodCA9PSB3LnJlcGxhY2UoJy0nLCAnJykgfHwgbWF5YmVXZWlnaHQgPT0gdy5yZXBsYWNlKCctJywgc3ApKSB7XG4gICAgICAgICAgd2VpZ2h0ID0gaGF2ZVdlaWdodCA/IHdlaWdodCA6IGZvbnRXZWlnaHRzW3ddO1xuICAgICAgICAgIHBhcnRzLnBvcCgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghaGF2ZVdlaWdodCAmJiB0eXBlb2YgbWF5YmVXZWlnaHQgPT0gJ251bWJlcicpIHtcbiAgICAgICAgd2VpZ2h0ID0gbWF5YmVXZWlnaHQ7XG4gICAgICB9XG5cbiAgICAgIHZhciBmb250RmFtaWx5ID0gcGFydHMuam9pbihzcCkucmVwbGFjZSgnS2xva2FudGVjaCBOb3RvIFNhbnMnLCAnTm90byBTYW5zJyk7XG5cbiAgICAgIGlmIChmb250RmFtaWx5LmluZGV4T2Yoc3ApICE9PSAtMSkge1xuICAgICAgICBmb250RmFtaWx5ID0gJ1wiJyArIGZvbnRGYW1pbHkgKyAnXCInO1xuICAgICAgfVxuXG4gICAgICBmb250RmFtaWxpZXMucHVzaChmb250RmFtaWx5KTtcbiAgICB9IC8vIENTUyBmb250IHByb3BlcnR5OiBmb250LXN0eWxlIGZvbnQtd2VpZ2h0IGZvbnQtc2l6ZS9saW5lLWhlaWdodCBmb250LWZhbWlseVxuXG5cbiAgICBjc3NEYXRhID0gZm9udENhY2hlW2ZvbnRzXSA9IFtzdHlsZSwgd2VpZ2h0LCBmb250RmFtaWxpZXNdO1xuICB9XG5cbiAgcmV0dXJuIGNzc0RhdGFbMF0gKyBzcCArIGNzc0RhdGFbMV0gKyBzcCArIHNpemUgKyAncHgnICsgKGxpbmVIZWlnaHQgPyAnLycgKyBsaW5lSGVpZ2h0IDogJycpICsgc3AgKyBjc3NEYXRhWzJdO1xufTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5978\n")},4362:function(module,__unused_webpack_exports,__webpack_require__){"use strict";eval("\n\nmodule.exports = Pbf;\n\nvar ieee754 = __webpack_require__(2846);\n\nfunction Pbf(buf) {\n this.buf = ArrayBuffer.isView && ArrayBuffer.isView(buf) ? buf : new Uint8Array(buf || 0);\n this.pos = 0;\n this.type = 0;\n this.length = this.buf.length;\n}\n\nPbf.Varint = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum\n\nPbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64\n\nPbf.Bytes = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields\n\nPbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32\n\nvar SHIFT_LEFT_32 = (1 << 16) * (1 << 16),\n SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32; // Threshold chosen based on both benchmarking and knowledge about browser string\n// data structures (which currently switch structure types at 12 bytes or more)\n\nvar TEXT_DECODER_MIN_LENGTH = 12;\nvar utf8TextDecoder = typeof TextDecoder === 'undefined' ? null : new TextDecoder('utf8');\nPbf.prototype = {\n destroy: function destroy() {\n this.buf = null;\n },\n // === READING =================================================================\n readFields: function readFields(readField, result, end) {\n end = end || this.length;\n\n while (this.pos < end) {\n var val = this.readVarint(),\n tag = val >> 3,\n startPos = this.pos;\n this.type = val & 0x7;\n readField(tag, result, this);\n if (this.pos === startPos) this.skip(val);\n }\n\n return result;\n },\n readMessage: function readMessage(readField, result) {\n return this.readFields(readField, result, this.readVarint() + this.pos);\n },\n readFixed32: function readFixed32() {\n var val = readUInt32(this.buf, this.pos);\n this.pos += 4;\n return val;\n },\n readSFixed32: function readSFixed32() {\n var val = readInt32(this.buf, this.pos);\n this.pos += 4;\n return val;\n },\n // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed)\n readFixed64: function readFixed64() {\n var val = readUInt32(this.buf, this.pos) + readUInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;\n this.pos += 8;\n return val;\n },\n readSFixed64: function readSFixed64() {\n var val = readUInt32(this.buf, this.pos) + readInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;\n this.pos += 8;\n return val;\n },\n readFloat: function readFloat() {\n var val = ieee754.read(this.buf, this.pos, true, 23, 4);\n this.pos += 4;\n return val;\n },\n readDouble: function readDouble() {\n var val = ieee754.read(this.buf, this.pos, true, 52, 8);\n this.pos += 8;\n return val;\n },\n readVarint: function readVarint(isSigned) {\n var buf = this.buf,\n val,\n b;\n b = buf[this.pos++];\n val = b & 0x7f;\n if (b < 0x80) return val;\n b = buf[this.pos++];\n val |= (b & 0x7f) << 7;\n if (b < 0x80) return val;\n b = buf[this.pos++];\n val |= (b & 0x7f) << 14;\n if (b < 0x80) return val;\n b = buf[this.pos++];\n val |= (b & 0x7f) << 21;\n if (b < 0x80) return val;\n b = buf[this.pos];\n val |= (b & 0x0f) << 28;\n return readVarintRemainder(val, isSigned, this);\n },\n readVarint64: function readVarint64() {\n // for compatibility with v2.0.1\n return this.readVarint(true);\n },\n readSVarint: function readSVarint() {\n var num = this.readVarint();\n return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding\n },\n readBoolean: function readBoolean() {\n return Boolean(this.readVarint());\n },\n readString: function readString() {\n var end = this.readVarint() + this.pos;\n var pos = this.pos;\n this.pos = end;\n\n if (end - pos >= TEXT_DECODER_MIN_LENGTH && utf8TextDecoder) {\n // longer strings are fast with the built-in browser TextDecoder API\n return readUtf8TextDecoder(this.buf, pos, end);\n } // short strings are fast with our custom implementation\n\n\n return readUtf8(this.buf, pos, end);\n },\n readBytes: function readBytes() {\n var end = this.readVarint() + this.pos,\n buffer = this.buf.subarray(this.pos, end);\n this.pos = end;\n return buffer;\n },\n // verbose for performance reasons; doesn't affect gzipped size\n readPackedVarint: function readPackedVarint(arr, isSigned) {\n if (this.type !== Pbf.Bytes) return arr.push(this.readVarint(isSigned));\n var end = readPackedEnd(this);\n arr = arr || [];\n\n while (this.pos < end) {\n arr.push(this.readVarint(isSigned));\n }\n\n return arr;\n },\n readPackedSVarint: function readPackedSVarint(arr) {\n if (this.type !== Pbf.Bytes) return arr.push(this.readSVarint());\n var end = readPackedEnd(this);\n arr = arr || [];\n\n while (this.pos < end) {\n arr.push(this.readSVarint());\n }\n\n return arr;\n },\n readPackedBoolean: function readPackedBoolean(arr) {\n if (this.type !== Pbf.Bytes) return arr.push(this.readBoolean());\n var end = readPackedEnd(this);\n arr = arr || [];\n\n while (this.pos < end) {\n arr.push(this.readBoolean());\n }\n\n return arr;\n },\n readPackedFloat: function readPackedFloat(arr) {\n if (this.type !== Pbf.Bytes) return arr.push(this.readFloat());\n var end = readPackedEnd(this);\n arr = arr || [];\n\n while (this.pos < end) {\n arr.push(this.readFloat());\n }\n\n return arr;\n },\n readPackedDouble: function readPackedDouble(arr) {\n if (this.type !== Pbf.Bytes) return arr.push(this.readDouble());\n var end = readPackedEnd(this);\n arr = arr || [];\n\n while (this.pos < end) {\n arr.push(this.readDouble());\n }\n\n return arr;\n },\n readPackedFixed32: function readPackedFixed32(arr) {\n if (this.type !== Pbf.Bytes) return arr.push(this.readFixed32());\n var end = readPackedEnd(this);\n arr = arr || [];\n\n while (this.pos < end) {\n arr.push(this.readFixed32());\n }\n\n return arr;\n },\n readPackedSFixed32: function readPackedSFixed32(arr) {\n if (this.type !== Pbf.Bytes) return arr.push(this.readSFixed32());\n var end = readPackedEnd(this);\n arr = arr || [];\n\n while (this.pos < end) {\n arr.push(this.readSFixed32());\n }\n\n return arr;\n },\n readPackedFixed64: function readPackedFixed64(arr) {\n if (this.type !== Pbf.Bytes) return arr.push(this.readFixed64());\n var end = readPackedEnd(this);\n arr = arr || [];\n\n while (this.pos < end) {\n arr.push(this.readFixed64());\n }\n\n return arr;\n },\n readPackedSFixed64: function readPackedSFixed64(arr) {\n if (this.type !== Pbf.Bytes) return arr.push(this.readSFixed64());\n var end = readPackedEnd(this);\n arr = arr || [];\n\n while (this.pos < end) {\n arr.push(this.readSFixed64());\n }\n\n return arr;\n },\n skip: function skip(val) {\n var type = val & 0x7;\n if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {} else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos;else if (type === Pbf.Fixed32) this.pos += 4;else if (type === Pbf.Fixed64) this.pos += 8;else throw new Error('Unimplemented type: ' + type);\n },\n // === WRITING =================================================================\n writeTag: function writeTag(tag, type) {\n this.writeVarint(tag << 3 | type);\n },\n realloc: function realloc(min) {\n var length = this.length || 16;\n\n while (length < this.pos + min) {\n length *= 2;\n }\n\n if (length !== this.length) {\n var buf = new Uint8Array(length);\n buf.set(this.buf);\n this.buf = buf;\n this.length = length;\n }\n },\n finish: function finish() {\n this.length = this.pos;\n this.pos = 0;\n return this.buf.subarray(0, this.length);\n },\n writeFixed32: function writeFixed32(val) {\n this.realloc(4);\n writeInt32(this.buf, val, this.pos);\n this.pos += 4;\n },\n writeSFixed32: function writeSFixed32(val) {\n this.realloc(4);\n writeInt32(this.buf, val, this.pos);\n this.pos += 4;\n },\n writeFixed64: function writeFixed64(val) {\n this.realloc(8);\n writeInt32(this.buf, val & -1, this.pos);\n writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);\n this.pos += 8;\n },\n writeSFixed64: function writeSFixed64(val) {\n this.realloc(8);\n writeInt32(this.buf, val & -1, this.pos);\n writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);\n this.pos += 8;\n },\n writeVarint: function writeVarint(val) {\n val = +val || 0;\n\n if (val > 0xfffffff || val < 0) {\n writeBigVarint(val, this);\n return;\n }\n\n this.realloc(4);\n this.buf[this.pos++] = val & 0x7f | (val > 0x7f ? 0x80 : 0);\n if (val <= 0x7f) return;\n this.buf[this.pos++] = (val >>>= 7) & 0x7f | (val > 0x7f ? 0x80 : 0);\n if (val <= 0x7f) return;\n this.buf[this.pos++] = (val >>>= 7) & 0x7f | (val > 0x7f ? 0x80 : 0);\n if (val <= 0x7f) return;\n this.buf[this.pos++] = val >>> 7 & 0x7f;\n },\n writeSVarint: function writeSVarint(val) {\n this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2);\n },\n writeBoolean: function writeBoolean(val) {\n this.writeVarint(Boolean(val));\n },\n writeString: function writeString(str) {\n str = String(str);\n this.realloc(str.length * 4);\n this.pos++; // reserve 1 byte for short string length\n\n var startPos = this.pos; // write the string directly to the buffer and see how much was written\n\n this.pos = writeUtf8(this.buf, str, this.pos);\n var len = this.pos - startPos;\n if (len >= 0x80) makeRoomForExtraLength(startPos, len, this); // finally, write the message length in the reserved place and restore the position\n\n this.pos = startPos - 1;\n this.writeVarint(len);\n this.pos += len;\n },\n writeFloat: function writeFloat(val) {\n this.realloc(4);\n ieee754.write(this.buf, val, this.pos, true, 23, 4);\n this.pos += 4;\n },\n writeDouble: function writeDouble(val) {\n this.realloc(8);\n ieee754.write(this.buf, val, this.pos, true, 52, 8);\n this.pos += 8;\n },\n writeBytes: function writeBytes(buffer) {\n var len = buffer.length;\n this.writeVarint(len);\n this.realloc(len);\n\n for (var i = 0; i < len; i++) {\n this.buf[this.pos++] = buffer[i];\n }\n },\n writeRawMessage: function writeRawMessage(fn, obj) {\n this.pos++; // reserve 1 byte for short message length\n // write the message directly to the buffer and see how much was written\n\n var startPos = this.pos;\n fn(obj, this);\n var len = this.pos - startPos;\n if (len >= 0x80) makeRoomForExtraLength(startPos, len, this); // finally, write the message length in the reserved place and restore the position\n\n this.pos = startPos - 1;\n this.writeVarint(len);\n this.pos += len;\n },\n writeMessage: function writeMessage(tag, fn, obj) {\n this.writeTag(tag, Pbf.Bytes);\n this.writeRawMessage(fn, obj);\n },\n writePackedVarint: function writePackedVarint(tag, arr) {\n if (arr.length) this.writeMessage(tag, _writePackedVarint, arr);\n },\n writePackedSVarint: function writePackedSVarint(tag, arr) {\n if (arr.length) this.writeMessage(tag, _writePackedSVarint, arr);\n },\n writePackedBoolean: function writePackedBoolean(tag, arr) {\n if (arr.length) this.writeMessage(tag, _writePackedBoolean, arr);\n },\n writePackedFloat: function writePackedFloat(tag, arr) {\n if (arr.length) this.writeMessage(tag, _writePackedFloat, arr);\n },\n writePackedDouble: function writePackedDouble(tag, arr) {\n if (arr.length) this.writeMessage(tag, _writePackedDouble, arr);\n },\n writePackedFixed32: function writePackedFixed32(tag, arr) {\n if (arr.length) this.writeMessage(tag, _writePackedFixed, arr);\n },\n writePackedSFixed32: function writePackedSFixed32(tag, arr) {\n if (arr.length) this.writeMessage(tag, _writePackedSFixed, arr);\n },\n writePackedFixed64: function writePackedFixed64(tag, arr) {\n if (arr.length) this.writeMessage(tag, _writePackedFixed2, arr);\n },\n writePackedSFixed64: function writePackedSFixed64(tag, arr) {\n if (arr.length) this.writeMessage(tag, _writePackedSFixed2, arr);\n },\n writeBytesField: function writeBytesField(tag, buffer) {\n this.writeTag(tag, Pbf.Bytes);\n this.writeBytes(buffer);\n },\n writeFixed32Field: function writeFixed32Field(tag, val) {\n this.writeTag(tag, Pbf.Fixed32);\n this.writeFixed32(val);\n },\n writeSFixed32Field: function writeSFixed32Field(tag, val) {\n this.writeTag(tag, Pbf.Fixed32);\n this.writeSFixed32(val);\n },\n writeFixed64Field: function writeFixed64Field(tag, val) {\n this.writeTag(tag, Pbf.Fixed64);\n this.writeFixed64(val);\n },\n writeSFixed64Field: function writeSFixed64Field(tag, val) {\n this.writeTag(tag, Pbf.Fixed64);\n this.writeSFixed64(val);\n },\n writeVarintField: function writeVarintField(tag, val) {\n this.writeTag(tag, Pbf.Varint);\n this.writeVarint(val);\n },\n writeSVarintField: function writeSVarintField(tag, val) {\n this.writeTag(tag, Pbf.Varint);\n this.writeSVarint(val);\n },\n writeStringField: function writeStringField(tag, str) {\n this.writeTag(tag, Pbf.Bytes);\n this.writeString(str);\n },\n writeFloatField: function writeFloatField(tag, val) {\n this.writeTag(tag, Pbf.Fixed32);\n this.writeFloat(val);\n },\n writeDoubleField: function writeDoubleField(tag, val) {\n this.writeTag(tag, Pbf.Fixed64);\n this.writeDouble(val);\n },\n writeBooleanField: function writeBooleanField(tag, val) {\n this.writeVarintField(tag, Boolean(val));\n }\n};\n\nfunction readVarintRemainder(l, s, p) {\n var buf = p.buf,\n h,\n b;\n b = buf[p.pos++];\n h = (b & 0x70) >> 4;\n if (b < 0x80) return toNum(l, h, s);\n b = buf[p.pos++];\n h |= (b & 0x7f) << 3;\n if (b < 0x80) return toNum(l, h, s);\n b = buf[p.pos++];\n h |= (b & 0x7f) << 10;\n if (b < 0x80) return toNum(l, h, s);\n b = buf[p.pos++];\n h |= (b & 0x7f) << 17;\n if (b < 0x80) return toNum(l, h, s);\n b = buf[p.pos++];\n h |= (b & 0x7f) << 24;\n if (b < 0x80) return toNum(l, h, s);\n b = buf[p.pos++];\n h |= (b & 0x01) << 31;\n if (b < 0x80) return toNum(l, h, s);\n throw new Error('Expected varint not more than 10 bytes');\n}\n\nfunction readPackedEnd(pbf) {\n return pbf.type === Pbf.Bytes ? pbf.readVarint() + pbf.pos : pbf.pos + 1;\n}\n\nfunction toNum(low, high, isSigned) {\n if (isSigned) {\n return high * 0x100000000 + (low >>> 0);\n }\n\n return (high >>> 0) * 0x100000000 + (low >>> 0);\n}\n\nfunction writeBigVarint(val, pbf) {\n var low, high;\n\n if (val >= 0) {\n low = val % 0x100000000 | 0;\n high = val / 0x100000000 | 0;\n } else {\n low = ~(-val % 0x100000000);\n high = ~(-val / 0x100000000);\n\n if (low ^ 0xffffffff) {\n low = low + 1 | 0;\n } else {\n low = 0;\n high = high + 1 | 0;\n }\n }\n\n if (val >= 0x10000000000000000 || val < -0x10000000000000000) {\n throw new Error('Given varint doesn\\'t fit into 10 bytes');\n }\n\n pbf.realloc(10);\n writeBigVarintLow(low, high, pbf);\n writeBigVarintHigh(high, pbf);\n}\n\nfunction writeBigVarintLow(low, high, pbf) {\n pbf.buf[pbf.pos++] = low & 0x7f | 0x80;\n low >>>= 7;\n pbf.buf[pbf.pos++] = low & 0x7f | 0x80;\n low >>>= 7;\n pbf.buf[pbf.pos++] = low & 0x7f | 0x80;\n low >>>= 7;\n pbf.buf[pbf.pos++] = low & 0x7f | 0x80;\n low >>>= 7;\n pbf.buf[pbf.pos] = low & 0x7f;\n}\n\nfunction writeBigVarintHigh(high, pbf) {\n var lsb = (high & 0x07) << 4;\n pbf.buf[pbf.pos++] |= lsb | ((high >>>= 3) ? 0x80 : 0);\n if (!high) return;\n pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0);\n if (!high) return;\n pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0);\n if (!high) return;\n pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0);\n if (!high) return;\n pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0);\n if (!high) return;\n pbf.buf[pbf.pos++] = high & 0x7f;\n}\n\nfunction makeRoomForExtraLength(startPos, len, pbf) {\n var extraLen = len <= 0x3fff ? 1 : len <= 0x1fffff ? 2 : len <= 0xfffffff ? 3 : Math.floor(Math.log(len) / (Math.LN2 * 7)); // if 1 byte isn't enough for encoding message length, shift the data to the right\n\n pbf.realloc(extraLen);\n\n for (var i = pbf.pos - 1; i >= startPos; i--) {\n pbf.buf[i + extraLen] = pbf.buf[i];\n }\n}\n\nfunction _writePackedVarint(arr, pbf) {\n for (var i = 0; i < arr.length; i++) {\n pbf.writeVarint(arr[i]);\n }\n}\n\nfunction _writePackedSVarint(arr, pbf) {\n for (var i = 0; i < arr.length; i++) {\n pbf.writeSVarint(arr[i]);\n }\n}\n\nfunction _writePackedFloat(arr, pbf) {\n for (var i = 0; i < arr.length; i++) {\n pbf.writeFloat(arr[i]);\n }\n}\n\nfunction _writePackedDouble(arr, pbf) {\n for (var i = 0; i < arr.length; i++) {\n pbf.writeDouble(arr[i]);\n }\n}\n\nfunction _writePackedBoolean(arr, pbf) {\n for (var i = 0; i < arr.length; i++) {\n pbf.writeBoolean(arr[i]);\n }\n}\n\nfunction _writePackedFixed(arr, pbf) {\n for (var i = 0; i < arr.length; i++) {\n pbf.writeFixed32(arr[i]);\n }\n}\n\nfunction _writePackedSFixed(arr, pbf) {\n for (var i = 0; i < arr.length; i++) {\n pbf.writeSFixed32(arr[i]);\n }\n}\n\nfunction _writePackedFixed2(arr, pbf) {\n for (var i = 0; i < arr.length; i++) {\n pbf.writeFixed64(arr[i]);\n }\n}\n\nfunction _writePackedSFixed2(arr, pbf) {\n for (var i = 0; i < arr.length; i++) {\n pbf.writeSFixed64(arr[i]);\n }\n} // Buffer code below from https://github.com/feross/buffer, MIT-licensed\n\n\nfunction readUInt32(buf, pos) {\n return (buf[pos] | buf[pos + 1] << 8 | buf[pos + 2] << 16) + buf[pos + 3] * 0x1000000;\n}\n\nfunction writeInt32(buf, val, pos) {\n buf[pos] = val;\n buf[pos + 1] = val >>> 8;\n buf[pos + 2] = val >>> 16;\n buf[pos + 3] = val >>> 24;\n}\n\nfunction readInt32(buf, pos) {\n return (buf[pos] | buf[pos + 1] << 8 | buf[pos + 2] << 16) + (buf[pos + 3] << 24);\n}\n\nfunction readUtf8(buf, pos, end) {\n var str = '';\n var i = pos;\n\n while (i < end) {\n var b0 = buf[i];\n var c = null; // codepoint\n\n var bytesPerSequence = b0 > 0xEF ? 4 : b0 > 0xDF ? 3 : b0 > 0xBF ? 2 : 1;\n if (i + bytesPerSequence > end) break;\n var b1, b2, b3;\n\n if (bytesPerSequence === 1) {\n if (b0 < 0x80) {\n c = b0;\n }\n } else if (bytesPerSequence === 2) {\n b1 = buf[i + 1];\n\n if ((b1 & 0xC0) === 0x80) {\n c = (b0 & 0x1F) << 0x6 | b1 & 0x3F;\n\n if (c <= 0x7F) {\n c = null;\n }\n }\n } else if (bytesPerSequence === 3) {\n b1 = buf[i + 1];\n b2 = buf[i + 2];\n\n if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80) {\n c = (b0 & 0xF) << 0xC | (b1 & 0x3F) << 0x6 | b2 & 0x3F;\n\n if (c <= 0x7FF || c >= 0xD800 && c <= 0xDFFF) {\n c = null;\n }\n }\n } else if (bytesPerSequence === 4) {\n b1 = buf[i + 1];\n b2 = buf[i + 2];\n b3 = buf[i + 3];\n\n if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) {\n c = (b0 & 0xF) << 0x12 | (b1 & 0x3F) << 0xC | (b2 & 0x3F) << 0x6 | b3 & 0x3F;\n\n if (c <= 0xFFFF || c >= 0x110000) {\n c = null;\n }\n }\n }\n\n if (c === null) {\n c = 0xFFFD;\n bytesPerSequence = 1;\n } else if (c > 0xFFFF) {\n c -= 0x10000;\n str += String.fromCharCode(c >>> 10 & 0x3FF | 0xD800);\n c = 0xDC00 | c & 0x3FF;\n }\n\n str += String.fromCharCode(c);\n i += bytesPerSequence;\n }\n\n return str;\n}\n\nfunction readUtf8TextDecoder(buf, pos, end) {\n return utf8TextDecoder.decode(buf.subarray(pos, end));\n}\n\nfunction writeUtf8(buf, str, pos) {\n for (var i = 0, c, lead; i < str.length; i++) {\n c = str.charCodeAt(i); // code point\n\n if (c > 0xD7FF && c < 0xE000) {\n if (lead) {\n if (c < 0xDC00) {\n buf[pos++] = 0xEF;\n buf[pos++] = 0xBF;\n buf[pos++] = 0xBD;\n lead = c;\n continue;\n } else {\n c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000;\n lead = null;\n }\n } else {\n if (c > 0xDBFF || i + 1 === str.length) {\n buf[pos++] = 0xEF;\n buf[pos++] = 0xBF;\n buf[pos++] = 0xBD;\n } else {\n lead = c;\n }\n\n continue;\n }\n } else if (lead) {\n buf[pos++] = 0xEF;\n buf[pos++] = 0xBF;\n buf[pos++] = 0xBD;\n lead = null;\n }\n\n if (c < 0x80) {\n buf[pos++] = c;\n } else {\n if (c < 0x800) {\n buf[pos++] = c >> 0x6 | 0xC0;\n } else {\n if (c < 0x10000) {\n buf[pos++] = c >> 0xC | 0xE0;\n } else {\n buf[pos++] = c >> 0x12 | 0xF0;\n buf[pos++] = c >> 0xC & 0x3F | 0x80;\n }\n\n buf[pos++] = c >> 0x6 & 0x3F | 0x80;\n }\n\n buf[pos++] = c & 0x3F | 0x80;\n }\n }\n\n return pos;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9wYmYvaW5kZXguanM/NmVmZCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjs7QUFFQSxjQUFjLG1CQUFPLENBQUMsSUFBUzs7QUFFL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGVBQWU7O0FBRWYsZ0JBQWdCOztBQUVoQixjQUFjOztBQUVkLGdCQUFnQjs7QUFFaEI7QUFDQSx1Q0FBdUM7QUFDdkM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxvREFBb0Q7QUFDcEQsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLG1FQUFtRSxzRUFBc0UsNkNBQTZDLDZDQUE2QztBQUNuTyxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxlQUFlOztBQUVmLDRCQUE0Qjs7QUFFNUI7QUFDQTtBQUNBLGlFQUFpRTs7QUFFakU7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG1CQUFtQixTQUFTO0FBQzVCO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxlQUFlO0FBQ2Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUVBQWlFOztBQUVqRTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw2SEFBNkg7O0FBRTdIOztBQUVBLDJCQUEyQixlQUFlO0FBQzFDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQixnQkFBZ0I7QUFDakM7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCLGdCQUFnQjtBQUNqQztBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUIsZ0JBQWdCO0FBQ2pDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQixnQkFBZ0I7QUFDakM7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCLGdCQUFnQjtBQUNqQztBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUIsZ0JBQWdCO0FBQ2pDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQixnQkFBZ0I7QUFDakM7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCLGdCQUFnQjtBQUNqQztBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUIsZ0JBQWdCO0FBQ2pDO0FBQ0E7QUFDQSxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlCQUFpQjs7QUFFakI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBCQUEwQixnQkFBZ0I7QUFDMUMsMEJBQTBCOztBQUUxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSIsImZpbGUiOiI0MzYyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBiZjtcblxudmFyIGllZWU3NTQgPSByZXF1aXJlKCdpZWVlNzU0Jyk7XG5cbmZ1bmN0aW9uIFBiZihidWYpIHtcbiAgdGhpcy5idWYgPSBBcnJheUJ1ZmZlci5pc1ZpZXcgJiYgQXJyYXlCdWZmZXIuaXNWaWV3KGJ1ZikgPyBidWYgOiBuZXcgVWludDhBcnJheShidWYgfHwgMCk7XG4gIHRoaXMucG9zID0gMDtcbiAgdGhpcy50eXBlID0gMDtcbiAgdGhpcy5sZW5ndGggPSB0aGlzLmJ1Zi5sZW5ndGg7XG59XG5cblBiZi5WYXJpbnQgPSAwOyAvLyB2YXJpbnQ6IGludDMyLCBpbnQ2NCwgdWludDMyLCB1aW50NjQsIHNpbnQzMiwgc2ludDY0LCBib29sLCBlbnVtXG5cblBiZi5GaXhlZDY0ID0gMTsgLy8gNjQtYml0OiBkb3VibGUsIGZpeGVkNjQsIHNmaXhlZDY0XG5cblBiZi5CeXRlcyA9IDI7IC8vIGxlbmd0aC1kZWxpbWl0ZWQ6IHN0cmluZywgYnl0ZXMsIGVtYmVkZGVkIG1lc3NhZ2VzLCBwYWNrZWQgcmVwZWF0ZWQgZmllbGRzXG5cblBiZi5GaXhlZDMyID0gNTsgLy8gMzItYml0OiBmbG9hdCwgZml4ZWQzMiwgc2ZpeGVkMzJcblxudmFyIFNISUZUX0xFRlRfMzIgPSAoMSA8PCAxNikgKiAoMSA8PCAxNiksXG4gICAgU0hJRlRfUklHSFRfMzIgPSAxIC8gU0hJRlRfTEVGVF8zMjsgLy8gVGhyZXNob2xkIGNob3NlbiBiYXNlZCBvbiBib3RoIGJlbmNobWFya2luZyBhbmQga25vd2xlZGdlIGFib3V0IGJyb3dzZXIgc3RyaW5nXG4vLyBkYXRhIHN0cnVjdHVyZXMgKHdoaWNoIGN1cnJlbnRseSBzd2l0Y2ggc3RydWN0dXJlIHR5cGVzIGF0IDEyIGJ5dGVzIG9yIG1vcmUpXG5cbnZhciBURVhUX0RFQ09ERVJfTUlOX0xFTkdUSCA9IDEyO1xudmFyIHV0ZjhUZXh0RGVjb2RlciA9IHR5cGVvZiBUZXh0RGVjb2RlciA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogbmV3IFRleHREZWNvZGVyKCd1dGY4Jyk7XG5QYmYucHJvdG90eXBlID0ge1xuICBkZXN0cm95OiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgIHRoaXMuYnVmID0gbnVsbDtcbiAgfSxcbiAgLy8gPT09IFJFQURJTkcgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgcmVhZEZpZWxkczogZnVuY3Rpb24gcmVhZEZpZWxkcyhyZWFkRmllbGQsIHJlc3VsdCwgZW5kKSB7XG4gICAgZW5kID0gZW5kIHx8IHRoaXMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSB7XG4gICAgICB2YXIgdmFsID0gdGhpcy5yZWFkVmFyaW50KCksXG4gICAgICAgICAgdGFnID0gdmFsID4+IDMsXG4gICAgICAgICAgc3RhcnRQb3MgPSB0aGlzLnBvcztcbiAgICAgIHRoaXMudHlwZSA9IHZhbCAmIDB4NztcbiAgICAgIHJlYWRGaWVsZCh0YWcsIHJlc3VsdCwgdGhpcyk7XG4gICAgICBpZiAodGhpcy5wb3MgPT09IHN0YXJ0UG9zKSB0aGlzLnNraXAodmFsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9LFxuICByZWFkTWVzc2FnZTogZnVuY3Rpb24gcmVhZE1lc3NhZ2UocmVhZEZpZWxkLCByZXN1bHQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkRmllbGRzKHJlYWRGaWVsZCwgcmVzdWx0LCB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zKTtcbiAgfSxcbiAgcmVhZEZpeGVkMzI6IGZ1bmN0aW9uIHJlYWRGaXhlZDMyKCkge1xuICAgIHZhciB2YWwgPSByZWFkVUludDMyKHRoaXMuYnVmLCB0aGlzLnBvcyk7XG4gICAgdGhpcy5wb3MgKz0gNDtcbiAgICByZXR1cm4gdmFsO1xuICB9LFxuICByZWFkU0ZpeGVkMzI6IGZ1bmN0aW9uIHJlYWRTRml4ZWQzMigpIHtcbiAgICB2YXIgdmFsID0gcmVhZEludDMyKHRoaXMuYnVmLCB0aGlzLnBvcyk7XG4gICAgdGhpcy5wb3MgKz0gNDtcbiAgICByZXR1cm4gdmFsO1xuICB9LFxuICAvLyA2NC1iaXQgaW50IGhhbmRsaW5nIGlzIGJhc2VkIG9uIGdpdGh1Yi5jb20vZHB3L25vZGUtYnVmZmVyLW1vcmUtaW50cyAoTUlULWxpY2Vuc2VkKVxuICByZWFkRml4ZWQ2NDogZnVuY3Rpb24gcmVhZEZpeGVkNjQoKSB7XG4gICAgdmFyIHZhbCA9IHJlYWRVSW50MzIodGhpcy5idWYsIHRoaXMucG9zKSArIHJlYWRVSW50MzIodGhpcy5idWYsIHRoaXMucG9zICsgNCkgKiBTSElGVF9MRUZUXzMyO1xuICAgIHRoaXMucG9zICs9IDg7XG4gICAgcmV0dXJuIHZhbDtcbiAgfSxcbiAgcmVhZFNGaXhlZDY0OiBmdW5jdGlvbiByZWFkU0ZpeGVkNjQoKSB7XG4gICAgdmFyIHZhbCA9IHJlYWRVSW50MzIodGhpcy5idWYsIHRoaXMucG9zKSArIHJlYWRJbnQzMih0aGlzLmJ1ZiwgdGhpcy5wb3MgKyA0KSAqIFNISUZUX0xFRlRfMzI7XG4gICAgdGhpcy5wb3MgKz0gODtcbiAgICByZXR1cm4gdmFsO1xuICB9LFxuICByZWFkRmxvYXQ6IGZ1bmN0aW9uIHJlYWRGbG9hdCgpIHtcbiAgICB2YXIgdmFsID0gaWVlZTc1NC5yZWFkKHRoaXMuYnVmLCB0aGlzLnBvcywgdHJ1ZSwgMjMsIDQpO1xuICAgIHRoaXMucG9zICs9IDQ7XG4gICAgcmV0dXJuIHZhbDtcbiAgfSxcbiAgcmVhZERvdWJsZTogZnVuY3Rpb24gcmVhZERvdWJsZSgpIHtcbiAgICB2YXIgdmFsID0gaWVlZTc1NC5yZWFkKHRoaXMuYnVmLCB0aGlzLnBvcywgdHJ1ZSwgNTIsIDgpO1xuICAgIHRoaXMucG9zICs9IDg7XG4gICAgcmV0dXJuIHZhbDtcbiAgfSxcbiAgcmVhZFZhcmludDogZnVuY3Rpb24gcmVhZFZhcmludChpc1NpZ25lZCkge1xuICAgIHZhciBidWYgPSB0aGlzLmJ1ZixcbiAgICAgICAgdmFsLFxuICAgICAgICBiO1xuICAgIGIgPSBidWZbdGhpcy5wb3MrK107XG4gICAgdmFsID0gYiAmIDB4N2Y7XG4gICAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgIGIgPSBidWZbdGhpcy5wb3MrK107XG4gICAgdmFsIHw9IChiICYgMHg3ZikgPDwgNztcbiAgICBpZiAoYiA8IDB4ODApIHJldHVybiB2YWw7XG4gICAgYiA9IGJ1Zlt0aGlzLnBvcysrXTtcbiAgICB2YWwgfD0gKGIgJiAweDdmKSA8PCAxNDtcbiAgICBpZiAoYiA8IDB4ODApIHJldHVybiB2YWw7XG4gICAgYiA9IGJ1Zlt0aGlzLnBvcysrXTtcbiAgICB2YWwgfD0gKGIgJiAweDdmKSA8PCAyMTtcbiAgICBpZiAoYiA8IDB4ODApIHJldHVybiB2YWw7XG4gICAgYiA9IGJ1Zlt0aGlzLnBvc107XG4gICAgdmFsIHw9IChiICYgMHgwZikgPDwgMjg7XG4gICAgcmV0dXJuIHJlYWRWYXJpbnRSZW1haW5kZXIodmFsLCBpc1NpZ25lZCwgdGhpcyk7XG4gIH0sXG4gIHJlYWRWYXJpbnQ2NDogZnVuY3Rpb24gcmVhZFZhcmludDY0KCkge1xuICAgIC8vIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdjIuMC4xXG4gICAgcmV0dXJuIHRoaXMucmVhZFZhcmludCh0cnVlKTtcbiAgfSxcbiAgcmVhZFNWYXJpbnQ6IGZ1bmN0aW9uIHJlYWRTVmFyaW50KCkge1xuICAgIHZhciBudW0gPSB0aGlzLnJlYWRWYXJpbnQoKTtcbiAgICByZXR1cm4gbnVtICUgMiA9PT0gMSA/IChudW0gKyAxKSAvIC0yIDogbnVtIC8gMjsgLy8gemlnemFnIGVuY29kaW5nXG4gIH0sXG4gIHJlYWRCb29sZWFuOiBmdW5jdGlvbiByZWFkQm9vbGVhbigpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLnJlYWRWYXJpbnQoKSk7XG4gIH0sXG4gIHJlYWRTdHJpbmc6IGZ1bmN0aW9uIHJlYWRTdHJpbmcoKSB7XG4gICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3M7XG4gICAgdmFyIHBvcyA9IHRoaXMucG9zO1xuICAgIHRoaXMucG9zID0gZW5kO1xuXG4gICAgaWYgKGVuZCAtIHBvcyA+PSBURVhUX0RFQ09ERVJfTUlOX0xFTkdUSCAmJiB1dGY4VGV4dERlY29kZXIpIHtcbiAgICAgIC8vIGxvbmdlciBzdHJpbmdzIGFyZSBmYXN0IHdpdGggdGhlIGJ1aWx0LWluIGJyb3dzZXIgVGV4dERlY29kZXIgQVBJXG4gICAgICByZXR1cm4gcmVhZFV0ZjhUZXh0RGVjb2Rlcih0aGlzLmJ1ZiwgcG9zLCBlbmQpO1xuICAgIH0gLy8gc2hvcnQgc3RyaW5ncyBhcmUgZmFzdCB3aXRoIG91ciBjdXN0b20gaW1wbGVtZW50YXRpb25cblxuXG4gICAgcmV0dXJuIHJlYWRVdGY4KHRoaXMuYnVmLCBwb3MsIGVuZCk7XG4gIH0sXG4gIHJlYWRCeXRlczogZnVuY3Rpb24gcmVhZEJ5dGVzKCkge1xuICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLFxuICAgICAgICBidWZmZXIgPSB0aGlzLmJ1Zi5zdWJhcnJheSh0aGlzLnBvcywgZW5kKTtcbiAgICB0aGlzLnBvcyA9IGVuZDtcbiAgICByZXR1cm4gYnVmZmVyO1xuICB9LFxuICAvLyB2ZXJib3NlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zOyBkb2Vzbid0IGFmZmVjdCBnemlwcGVkIHNpemVcbiAgcmVhZFBhY2tlZFZhcmludDogZnVuY3Rpb24gcmVhZFBhY2tlZFZhcmludChhcnIsIGlzU2lnbmVkKSB7XG4gICAgaWYgKHRoaXMudHlwZSAhPT0gUGJmLkJ5dGVzKSByZXR1cm4gYXJyLnB1c2godGhpcy5yZWFkVmFyaW50KGlzU2lnbmVkKSk7XG4gICAgdmFyIGVuZCA9IHJlYWRQYWNrZWRFbmQodGhpcyk7XG4gICAgYXJyID0gYXJyIHx8IFtdO1xuXG4gICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSB7XG4gICAgICBhcnIucHVzaCh0aGlzLnJlYWRWYXJpbnQoaXNTaWduZWQpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJyO1xuICB9LFxuICByZWFkUGFja2VkU1ZhcmludDogZnVuY3Rpb24gcmVhZFBhY2tlZFNWYXJpbnQoYXJyKSB7XG4gICAgaWYgKHRoaXMudHlwZSAhPT0gUGJmLkJ5dGVzKSByZXR1cm4gYXJyLnB1c2godGhpcy5yZWFkU1ZhcmludCgpKTtcbiAgICB2YXIgZW5kID0gcmVhZFBhY2tlZEVuZCh0aGlzKTtcbiAgICBhcnIgPSBhcnIgfHwgW107XG5cbiAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIHtcbiAgICAgIGFyci5wdXNoKHRoaXMucmVhZFNWYXJpbnQoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFycjtcbiAgfSxcbiAgcmVhZFBhY2tlZEJvb2xlYW46IGZ1bmN0aW9uIHJlYWRQYWNrZWRCb29sZWFuKGFycikge1xuICAgIGlmICh0aGlzLnR5cGUgIT09IFBiZi5CeXRlcykgcmV0dXJuIGFyci5wdXNoKHRoaXMucmVhZEJvb2xlYW4oKSk7XG4gICAgdmFyIGVuZCA9IHJlYWRQYWNrZWRFbmQodGhpcyk7XG4gICAgYXJyID0gYXJyIHx8IFtdO1xuXG4gICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSB7XG4gICAgICBhcnIucHVzaCh0aGlzLnJlYWRCb29sZWFuKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBhcnI7XG4gIH0sXG4gIHJlYWRQYWNrZWRGbG9hdDogZnVuY3Rpb24gcmVhZFBhY2tlZEZsb2F0KGFycikge1xuICAgIGlmICh0aGlzLnR5cGUgIT09IFBiZi5CeXRlcykgcmV0dXJuIGFyci5wdXNoKHRoaXMucmVhZEZsb2F0KCkpO1xuICAgIHZhciBlbmQgPSByZWFkUGFja2VkRW5kKHRoaXMpO1xuICAgIGFyciA9IGFyciB8fCBbXTtcblxuICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkge1xuICAgICAgYXJyLnB1c2godGhpcy5yZWFkRmxvYXQoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFycjtcbiAgfSxcbiAgcmVhZFBhY2tlZERvdWJsZTogZnVuY3Rpb24gcmVhZFBhY2tlZERvdWJsZShhcnIpIHtcbiAgICBpZiAodGhpcy50eXBlICE9PSBQYmYuQnl0ZXMpIHJldHVybiBhcnIucHVzaCh0aGlzLnJlYWREb3VibGUoKSk7XG4gICAgdmFyIGVuZCA9IHJlYWRQYWNrZWRFbmQodGhpcyk7XG4gICAgYXJyID0gYXJyIHx8IFtdO1xuXG4gICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSB7XG4gICAgICBhcnIucHVzaCh0aGlzLnJlYWREb3VibGUoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFycjtcbiAgfSxcbiAgcmVhZFBhY2tlZEZpeGVkMzI6IGZ1bmN0aW9uIHJlYWRQYWNrZWRGaXhlZDMyKGFycikge1xuICAgIGlmICh0aGlzLnR5cGUgIT09IFBiZi5CeXRlcykgcmV0dXJuIGFyci5wdXNoKHRoaXMucmVhZEZpeGVkMzIoKSk7XG4gICAgdmFyIGVuZCA9IHJlYWRQYWNrZWRFbmQodGhpcyk7XG4gICAgYXJyID0gYXJyIHx8IFtdO1xuXG4gICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSB7XG4gICAgICBhcnIucHVzaCh0aGlzLnJlYWRGaXhlZDMyKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBhcnI7XG4gIH0sXG4gIHJlYWRQYWNrZWRTRml4ZWQzMjogZnVuY3Rpb24gcmVhZFBhY2tlZFNGaXhlZDMyKGFycikge1xuICAgIGlmICh0aGlzLnR5cGUgIT09IFBiZi5CeXRlcykgcmV0dXJuIGFyci5wdXNoKHRoaXMucmVhZFNGaXhlZDMyKCkpO1xuICAgIHZhciBlbmQgPSByZWFkUGFja2VkRW5kKHRoaXMpO1xuICAgIGFyciA9IGFyciB8fCBbXTtcblxuICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkge1xuICAgICAgYXJyLnB1c2godGhpcy5yZWFkU0ZpeGVkMzIoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFycjtcbiAgfSxcbiAgcmVhZFBhY2tlZEZpeGVkNjQ6IGZ1bmN0aW9uIHJlYWRQYWNrZWRGaXhlZDY0KGFycikge1xuICAgIGlmICh0aGlzLnR5cGUgIT09IFBiZi5CeXRlcykgcmV0dXJuIGFyci5wdXNoKHRoaXMucmVhZEZpeGVkNjQoKSk7XG4gICAgdmFyIGVuZCA9IHJlYWRQYWNrZWRFbmQodGhpcyk7XG4gICAgYXJyID0gYXJyIHx8IFtdO1xuXG4gICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSB7XG4gICAgICBhcnIucHVzaCh0aGlzLnJlYWRGaXhlZDY0KCkpO1xuICAgIH1cblxuICAgIHJldHVybiBhcnI7XG4gIH0sXG4gIHJlYWRQYWNrZWRTRml4ZWQ2NDogZnVuY3Rpb24gcmVhZFBhY2tlZFNGaXhlZDY0KGFycikge1xuICAgIGlmICh0aGlzLnR5cGUgIT09IFBiZi5CeXRlcykgcmV0dXJuIGFyci5wdXNoKHRoaXMucmVhZFNGaXhlZDY0KCkpO1xuICAgIHZhciBlbmQgPSByZWFkUGFja2VkRW5kKHRoaXMpO1xuICAgIGFyciA9IGFyciB8fCBbXTtcblxuICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkge1xuICAgICAgYXJyLnB1c2godGhpcy5yZWFkU0ZpeGVkNjQoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFycjtcbiAgfSxcbiAgc2tpcDogZnVuY3Rpb24gc2tpcCh2YWwpIHtcbiAgICB2YXIgdHlwZSA9IHZhbCAmIDB4NztcbiAgICBpZiAodHlwZSA9PT0gUGJmLlZhcmludCkgd2hpbGUgKHRoaXMuYnVmW3RoaXMucG9zKytdID4gMHg3Zikge30gZWxzZSBpZiAodHlwZSA9PT0gUGJmLkJ5dGVzKSB0aGlzLnBvcyA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3M7ZWxzZSBpZiAodHlwZSA9PT0gUGJmLkZpeGVkMzIpIHRoaXMucG9zICs9IDQ7ZWxzZSBpZiAodHlwZSA9PT0gUGJmLkZpeGVkNjQpIHRoaXMucG9zICs9IDg7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoJ1VuaW1wbGVtZW50ZWQgdHlwZTogJyArIHR5cGUpO1xuICB9LFxuICAvLyA9PT0gV1JJVElORyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB3cml0ZVRhZzogZnVuY3Rpb24gd3JpdGVUYWcodGFnLCB0eXBlKSB7XG4gICAgdGhpcy53cml0ZVZhcmludCh0YWcgPDwgMyB8IHR5cGUpO1xuICB9LFxuICByZWFsbG9jOiBmdW5jdGlvbiByZWFsbG9jKG1pbikge1xuICAgIHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aCB8fCAxNjtcblxuICAgIHdoaWxlIChsZW5ndGggPCB0aGlzLnBvcyArIG1pbikge1xuICAgICAgbGVuZ3RoICo9IDI7XG4gICAgfVxuXG4gICAgaWYgKGxlbmd0aCAhPT0gdGhpcy5sZW5ndGgpIHtcbiAgICAgIHZhciBidWYgPSBuZXcgVWludDhBcnJheShsZW5ndGgpO1xuICAgICAgYnVmLnNldCh0aGlzLmJ1Zik7XG4gICAgICB0aGlzLmJ1ZiA9IGJ1ZjtcbiAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgIH1cbiAgfSxcbiAgZmluaXNoOiBmdW5jdGlvbiBmaW5pc2goKSB7XG4gICAgdGhpcy5sZW5ndGggPSB0aGlzLnBvcztcbiAgICB0aGlzLnBvcyA9IDA7XG4gICAgcmV0dXJuIHRoaXMuYnVmLnN1YmFycmF5KDAsIHRoaXMubGVuZ3RoKTtcbiAgfSxcbiAgd3JpdGVGaXhlZDMyOiBmdW5jdGlvbiB3cml0ZUZpeGVkMzIodmFsKSB7XG4gICAgdGhpcy5yZWFsbG9jKDQpO1xuICAgIHdyaXRlSW50MzIodGhpcy5idWYsIHZhbCwgdGhpcy5wb3MpO1xuICAgIHRoaXMucG9zICs9IDQ7XG4gIH0sXG4gIHdyaXRlU0ZpeGVkMzI6IGZ1bmN0aW9uIHdyaXRlU0ZpeGVkMzIodmFsKSB7XG4gICAgdGhpcy5yZWFsbG9jKDQpO1xuICAgIHdyaXRlSW50MzIodGhpcy5idWYsIHZhbCwgdGhpcy5wb3MpO1xuICAgIHRoaXMucG9zICs9IDQ7XG4gIH0sXG4gIHdyaXRlRml4ZWQ2NDogZnVuY3Rpb24gd3JpdGVGaXhlZDY0KHZhbCkge1xuICAgIHRoaXMucmVhbGxvYyg4KTtcbiAgICB3cml0ZUludDMyKHRoaXMuYnVmLCB2YWwgJiAtMSwgdGhpcy5wb3MpO1xuICAgIHdyaXRlSW50MzIodGhpcy5idWYsIE1hdGguZmxvb3IodmFsICogU0hJRlRfUklHSFRfMzIpLCB0aGlzLnBvcyArIDQpO1xuICAgIHRoaXMucG9zICs9IDg7XG4gIH0sXG4gIHdyaXRlU0ZpeGVkNjQ6IGZ1bmN0aW9uIHdyaXRlU0ZpeGVkNjQodmFsKSB7XG4gICAgdGhpcy5yZWFsbG9jKDgpO1xuICAgIHdyaXRlSW50MzIodGhpcy5idWYsIHZhbCAmIC0xLCB0aGlzLnBvcyk7XG4gICAgd3JpdGVJbnQzMih0aGlzLmJ1ZiwgTWF0aC5mbG9vcih2YWwgKiBTSElGVF9SSUdIVF8zMiksIHRoaXMucG9zICsgNCk7XG4gICAgdGhpcy5wb3MgKz0gODtcbiAgfSxcbiAgd3JpdGVWYXJpbnQ6IGZ1bmN0aW9uIHdyaXRlVmFyaW50KHZhbCkge1xuICAgIHZhbCA9ICt2YWwgfHwgMDtcblxuICAgIGlmICh2YWwgPiAweGZmZmZmZmYgfHwgdmFsIDwgMCkge1xuICAgICAgd3JpdGVCaWdWYXJpbnQodmFsLCB0aGlzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnJlYWxsb2MoNCk7XG4gICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSB2YWwgJiAweDdmIHwgKHZhbCA+IDB4N2YgPyAweDgwIDogMCk7XG4gICAgaWYgKHZhbCA8PSAweDdmKSByZXR1cm47XG4gICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAodmFsID4+Pj0gNykgJiAweDdmIHwgKHZhbCA+IDB4N2YgPyAweDgwIDogMCk7XG4gICAgaWYgKHZhbCA8PSAweDdmKSByZXR1cm47XG4gICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAodmFsID4+Pj0gNykgJiAweDdmIHwgKHZhbCA+IDB4N2YgPyAweDgwIDogMCk7XG4gICAgaWYgKHZhbCA8PSAweDdmKSByZXR1cm47XG4gICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSB2YWwgPj4+IDcgJiAweDdmO1xuICB9LFxuICB3cml0ZVNWYXJpbnQ6IGZ1bmN0aW9uIHdyaXRlU1ZhcmludCh2YWwpIHtcbiAgICB0aGlzLndyaXRlVmFyaW50KHZhbCA8IDAgPyAtdmFsICogMiAtIDEgOiB2YWwgKiAyKTtcbiAgfSxcbiAgd3JpdGVCb29sZWFuOiBmdW5jdGlvbiB3cml0ZUJvb2xlYW4odmFsKSB7XG4gICAgdGhpcy53cml0ZVZhcmludChCb29sZWFuKHZhbCkpO1xuICB9LFxuICB3cml0ZVN0cmluZzogZnVuY3Rpb24gd3JpdGVTdHJpbmcoc3RyKSB7XG4gICAgc3RyID0gU3RyaW5nKHN0cik7XG4gICAgdGhpcy5yZWFsbG9jKHN0ci5sZW5ndGggKiA0KTtcbiAgICB0aGlzLnBvcysrOyAvLyByZXNlcnZlIDEgYnl0ZSBmb3Igc2hvcnQgc3RyaW5nIGxlbmd0aFxuXG4gICAgdmFyIHN0YXJ0UG9zID0gdGhpcy5wb3M7IC8vIHdyaXRlIHRoZSBzdHJpbmcgZGlyZWN0bHkgdG8gdGhlIGJ1ZmZlciBhbmQgc2VlIGhvdyBtdWNoIHdhcyB3cml0dGVuXG5cbiAgICB0aGlzLnBvcyA9IHdyaXRlVXRmOCh0aGlzLmJ1Ziwgc3RyLCB0aGlzLnBvcyk7XG4gICAgdmFyIGxlbiA9IHRoaXMucG9zIC0gc3RhcnRQb3M7XG4gICAgaWYgKGxlbiA+PSAweDgwKSBtYWtlUm9vbUZvckV4dHJhTGVuZ3RoKHN0YXJ0UG9zLCBsZW4sIHRoaXMpOyAvLyBmaW5hbGx5LCB3cml0ZSB0aGUgbWVzc2FnZSBsZW5ndGggaW4gdGhlIHJlc2VydmVkIHBsYWNlIGFuZCByZXN0b3JlIHRoZSBwb3NpdGlvblxuXG4gICAgdGhpcy5wb3MgPSBzdGFydFBvcyAtIDE7XG4gICAgdGhpcy53cml0ZVZhcmludChsZW4pO1xuICAgIHRoaXMucG9zICs9IGxlbjtcbiAgfSxcbiAgd3JpdGVGbG9hdDogZnVuY3Rpb24gd3JpdGVGbG9hdCh2YWwpIHtcbiAgICB0aGlzLnJlYWxsb2MoNCk7XG4gICAgaWVlZTc1NC53cml0ZSh0aGlzLmJ1ZiwgdmFsLCB0aGlzLnBvcywgdHJ1ZSwgMjMsIDQpO1xuICAgIHRoaXMucG9zICs9IDQ7XG4gIH0sXG4gIHdyaXRlRG91YmxlOiBmdW5jdGlvbiB3cml0ZURvdWJsZSh2YWwpIHtcbiAgICB0aGlzLnJlYWxsb2MoOCk7XG4gICAgaWVlZTc1NC53cml0ZSh0aGlzLmJ1ZiwgdmFsLCB0aGlzLnBvcywgdHJ1ZSwgNTIsIDgpO1xuICAgIHRoaXMucG9zICs9IDg7XG4gIH0sXG4gIHdyaXRlQnl0ZXM6IGZ1bmN0aW9uIHdyaXRlQnl0ZXMoYnVmZmVyKSB7XG4gICAgdmFyIGxlbiA9IGJ1ZmZlci5sZW5ndGg7XG4gICAgdGhpcy53cml0ZVZhcmludChsZW4pO1xuICAgIHRoaXMucmVhbGxvYyhsZW4pO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSBidWZmZXJbaV07XG4gICAgfVxuICB9LFxuICB3cml0ZVJhd01lc3NhZ2U6IGZ1bmN0aW9uIHdyaXRlUmF3TWVzc2FnZShmbiwgb2JqKSB7XG4gICAgdGhpcy5wb3MrKzsgLy8gcmVzZXJ2ZSAxIGJ5dGUgZm9yIHNob3J0IG1lc3NhZ2UgbGVuZ3RoXG4gICAgLy8gd3JpdGUgdGhlIG1lc3NhZ2UgZGlyZWN0bHkgdG8gdGhlIGJ1ZmZlciBhbmQgc2VlIGhvdyBtdWNoIHdhcyB3cml0dGVuXG5cbiAgICB2YXIgc3RhcnRQb3MgPSB0aGlzLnBvcztcbiAgICBmbihvYmosIHRoaXMpO1xuICAgIHZhciBsZW4gPSB0aGlzLnBvcyAtIHN0YXJ0UG9zO1xuICAgIGlmIChsZW4gPj0gMHg4MCkgbWFrZVJvb21Gb3JFeHRyYUxlbmd0aChzdGFydFBvcywgbGVuLCB0aGlzKTsgLy8gZmluYWxseSwgd3JpdGUgdGhlIG1lc3NhZ2UgbGVuZ3RoIGluIHRoZSByZXNlcnZlZCBwbGFjZSBhbmQgcmVzdG9yZSB0aGUgcG9zaXRpb25cblxuICAgIHRoaXMucG9zID0gc3RhcnRQb3MgLSAxO1xuICAgIHRoaXMud3JpdGVWYXJpbnQobGVuKTtcbiAgICB0aGlzLnBvcyArPSBsZW47XG4gIH0sXG4gIHdyaXRlTWVzc2FnZTogZnVuY3Rpb24gd3JpdGVNZXNzYWdlKHRhZywgZm4sIG9iaikge1xuICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuQnl0ZXMpO1xuICAgIHRoaXMud3JpdGVSYXdNZXNzYWdlKGZuLCBvYmopO1xuICB9LFxuICB3cml0ZVBhY2tlZFZhcmludDogZnVuY3Rpb24gd3JpdGVQYWNrZWRWYXJpbnQodGFnLCBhcnIpIHtcbiAgICBpZiAoYXJyLmxlbmd0aCkgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCBfd3JpdGVQYWNrZWRWYXJpbnQsIGFycik7XG4gIH0sXG4gIHdyaXRlUGFja2VkU1ZhcmludDogZnVuY3Rpb24gd3JpdGVQYWNrZWRTVmFyaW50KHRhZywgYXJyKSB7XG4gICAgaWYgKGFyci5sZW5ndGgpIHRoaXMud3JpdGVNZXNzYWdlKHRhZywgX3dyaXRlUGFja2VkU1ZhcmludCwgYXJyKTtcbiAgfSxcbiAgd3JpdGVQYWNrZWRCb29sZWFuOiBmdW5jdGlvbiB3cml0ZVBhY2tlZEJvb2xlYW4odGFnLCBhcnIpIHtcbiAgICBpZiAoYXJyLmxlbmd0aCkgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCBfd3JpdGVQYWNrZWRCb29sZWFuLCBhcnIpO1xuICB9LFxuICB3cml0ZVBhY2tlZEZsb2F0OiBmdW5jdGlvbiB3cml0ZVBhY2tlZEZsb2F0KHRhZywgYXJyKSB7XG4gICAgaWYgKGFyci5sZW5ndGgpIHRoaXMud3JpdGVNZXNzYWdlKHRhZywgX3dyaXRlUGFja2VkRmxvYXQsIGFycik7XG4gIH0sXG4gIHdyaXRlUGFja2VkRG91YmxlOiBmdW5jdGlvbiB3cml0ZVBhY2tlZERvdWJsZSh0YWcsIGFycikge1xuICAgIGlmIChhcnIubGVuZ3RoKSB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIF93cml0ZVBhY2tlZERvdWJsZSwgYXJyKTtcbiAgfSxcbiAgd3JpdGVQYWNrZWRGaXhlZDMyOiBmdW5jdGlvbiB3cml0ZVBhY2tlZEZpeGVkMzIodGFnLCBhcnIpIHtcbiAgICBpZiAoYXJyLmxlbmd0aCkgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCBfd3JpdGVQYWNrZWRGaXhlZCwgYXJyKTtcbiAgfSxcbiAgd3JpdGVQYWNrZWRTRml4ZWQzMjogZnVuY3Rpb24gd3JpdGVQYWNrZWRTRml4ZWQzMih0YWcsIGFycikge1xuICAgIGlmIChhcnIubGVuZ3RoKSB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIF93cml0ZVBhY2tlZFNGaXhlZCwgYXJyKTtcbiAgfSxcbiAgd3JpdGVQYWNrZWRGaXhlZDY0OiBmdW5jdGlvbiB3cml0ZVBhY2tlZEZpeGVkNjQodGFnLCBhcnIpIHtcbiAgICBpZiAoYXJyLmxlbmd0aCkgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCBfd3JpdGVQYWNrZWRGaXhlZDIsIGFycik7XG4gIH0sXG4gIHdyaXRlUGFja2VkU0ZpeGVkNjQ6IGZ1bmN0aW9uIHdyaXRlUGFja2VkU0ZpeGVkNjQodGFnLCBhcnIpIHtcbiAgICBpZiAoYXJyLmxlbmd0aCkgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCBfd3JpdGVQYWNrZWRTRml4ZWQyLCBhcnIpO1xuICB9LFxuICB3cml0ZUJ5dGVzRmllbGQ6IGZ1bmN0aW9uIHdyaXRlQnl0ZXNGaWVsZCh0YWcsIGJ1ZmZlcikge1xuICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuQnl0ZXMpO1xuICAgIHRoaXMud3JpdGVCeXRlcyhidWZmZXIpO1xuICB9LFxuICB3cml0ZUZpeGVkMzJGaWVsZDogZnVuY3Rpb24gd3JpdGVGaXhlZDMyRmllbGQodGFnLCB2YWwpIHtcbiAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkMzIpO1xuICAgIHRoaXMud3JpdGVGaXhlZDMyKHZhbCk7XG4gIH0sXG4gIHdyaXRlU0ZpeGVkMzJGaWVsZDogZnVuY3Rpb24gd3JpdGVTRml4ZWQzMkZpZWxkKHRhZywgdmFsKSB7XG4gICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5GaXhlZDMyKTtcbiAgICB0aGlzLndyaXRlU0ZpeGVkMzIodmFsKTtcbiAgfSxcbiAgd3JpdGVGaXhlZDY0RmllbGQ6IGZ1bmN0aW9uIHdyaXRlRml4ZWQ2NEZpZWxkKHRhZywgdmFsKSB7XG4gICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5GaXhlZDY0KTtcbiAgICB0aGlzLndyaXRlRml4ZWQ2NCh2YWwpO1xuICB9LFxuICB3cml0ZVNGaXhlZDY0RmllbGQ6IGZ1bmN0aW9uIHdyaXRlU0ZpeGVkNjRGaWVsZCh0YWcsIHZhbCkge1xuICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQ2NCk7XG4gICAgdGhpcy53cml0ZVNGaXhlZDY0KHZhbCk7XG4gIH0sXG4gIHdyaXRlVmFyaW50RmllbGQ6IGZ1bmN0aW9uIHdyaXRlVmFyaW50RmllbGQodGFnLCB2YWwpIHtcbiAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLlZhcmludCk7XG4gICAgdGhpcy53cml0ZVZhcmludCh2YWwpO1xuICB9LFxuICB3cml0ZVNWYXJpbnRGaWVsZDogZnVuY3Rpb24gd3JpdGVTVmFyaW50RmllbGQodGFnLCB2YWwpIHtcbiAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLlZhcmludCk7XG4gICAgdGhpcy53cml0ZVNWYXJpbnQodmFsKTtcbiAgfSxcbiAgd3JpdGVTdHJpbmdGaWVsZDogZnVuY3Rpb24gd3JpdGVTdHJpbmdGaWVsZCh0YWcsIHN0cikge1xuICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuQnl0ZXMpO1xuICAgIHRoaXMud3JpdGVTdHJpbmcoc3RyKTtcbiAgfSxcbiAgd3JpdGVGbG9hdEZpZWxkOiBmdW5jdGlvbiB3cml0ZUZsb2F0RmllbGQodGFnLCB2YWwpIHtcbiAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkMzIpO1xuICAgIHRoaXMud3JpdGVGbG9hdCh2YWwpO1xuICB9LFxuICB3cml0ZURvdWJsZUZpZWxkOiBmdW5jdGlvbiB3cml0ZURvdWJsZUZpZWxkKHRhZywgdmFsKSB7XG4gICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5GaXhlZDY0KTtcbiAgICB0aGlzLndyaXRlRG91YmxlKHZhbCk7XG4gIH0sXG4gIHdyaXRlQm9vbGVhbkZpZWxkOiBmdW5jdGlvbiB3cml0ZUJvb2xlYW5GaWVsZCh0YWcsIHZhbCkge1xuICAgIHRoaXMud3JpdGVWYXJpbnRGaWVsZCh0YWcsIEJvb2xlYW4odmFsKSk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHJlYWRWYXJpbnRSZW1haW5kZXIobCwgcywgcCkge1xuICB2YXIgYnVmID0gcC5idWYsXG4gICAgICBoLFxuICAgICAgYjtcbiAgYiA9IGJ1ZltwLnBvcysrXTtcbiAgaCA9IChiICYgMHg3MCkgPj4gNDtcbiAgaWYgKGIgPCAweDgwKSByZXR1cm4gdG9OdW0obCwgaCwgcyk7XG4gIGIgPSBidWZbcC5wb3MrK107XG4gIGggfD0gKGIgJiAweDdmKSA8PCAzO1xuICBpZiAoYiA8IDB4ODApIHJldHVybiB0b051bShsLCBoLCBzKTtcbiAgYiA9IGJ1ZltwLnBvcysrXTtcbiAgaCB8PSAoYiAmIDB4N2YpIDw8IDEwO1xuICBpZiAoYiA8IDB4ODApIHJldHVybiB0b051bShsLCBoLCBzKTtcbiAgYiA9IGJ1ZltwLnBvcysrXTtcbiAgaCB8PSAoYiAmIDB4N2YpIDw8IDE3O1xuICBpZiAoYiA8IDB4ODApIHJldHVybiB0b051bShsLCBoLCBzKTtcbiAgYiA9IGJ1ZltwLnBvcysrXTtcbiAgaCB8PSAoYiAmIDB4N2YpIDw8IDI0O1xuICBpZiAoYiA8IDB4ODApIHJldHVybiB0b051bShsLCBoLCBzKTtcbiAgYiA9IGJ1ZltwLnBvcysrXTtcbiAgaCB8PSAoYiAmIDB4MDEpIDw8IDMxO1xuICBpZiAoYiA8IDB4ODApIHJldHVybiB0b051bShsLCBoLCBzKTtcbiAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB2YXJpbnQgbm90IG1vcmUgdGhhbiAxMCBieXRlcycpO1xufVxuXG5mdW5jdGlvbiByZWFkUGFja2VkRW5kKHBiZikge1xuICByZXR1cm4gcGJmLnR5cGUgPT09IFBiZi5CeXRlcyA/IHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zIDogcGJmLnBvcyArIDE7XG59XG5cbmZ1bmN0aW9uIHRvTnVtKGxvdywgaGlnaCwgaXNTaWduZWQpIHtcbiAgaWYgKGlzU2lnbmVkKSB7XG4gICAgcmV0dXJuIGhpZ2ggKiAweDEwMDAwMDAwMCArIChsb3cgPj4+IDApO1xuICB9XG5cbiAgcmV0dXJuIChoaWdoID4+PiAwKSAqIDB4MTAwMDAwMDAwICsgKGxvdyA+Pj4gMCk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlQmlnVmFyaW50KHZhbCwgcGJmKSB7XG4gIHZhciBsb3csIGhpZ2g7XG5cbiAgaWYgKHZhbCA+PSAwKSB7XG4gICAgbG93ID0gdmFsICUgMHgxMDAwMDAwMDAgfCAwO1xuICAgIGhpZ2ggPSB2YWwgLyAweDEwMDAwMDAwMCB8IDA7XG4gIH0gZWxzZSB7XG4gICAgbG93ID0gfigtdmFsICUgMHgxMDAwMDAwMDApO1xuICAgIGhpZ2ggPSB+KC12YWwgLyAweDEwMDAwMDAwMCk7XG5cbiAgICBpZiAobG93IF4gMHhmZmZmZmZmZikge1xuICAgICAgbG93ID0gbG93ICsgMSB8IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvdyA9IDA7XG4gICAgICBoaWdoID0gaGlnaCArIDEgfCAwO1xuICAgIH1cbiAgfVxuXG4gIGlmICh2YWwgPj0gMHgxMDAwMDAwMDAwMDAwMDAwMCB8fCB2YWwgPCAtMHgxMDAwMDAwMDAwMDAwMDAwMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignR2l2ZW4gdmFyaW50IGRvZXNuXFwndCBmaXQgaW50byAxMCBieXRlcycpO1xuICB9XG5cbiAgcGJmLnJlYWxsb2MoMTApO1xuICB3cml0ZUJpZ1ZhcmludExvdyhsb3csIGhpZ2gsIHBiZik7XG4gIHdyaXRlQmlnVmFyaW50SGlnaChoaWdoLCBwYmYpO1xufVxuXG5mdW5jdGlvbiB3cml0ZUJpZ1ZhcmludExvdyhsb3csIGhpZ2gsIHBiZikge1xuICBwYmYuYnVmW3BiZi5wb3MrK10gPSBsb3cgJiAweDdmIHwgMHg4MDtcbiAgbG93ID4+Pj0gNztcbiAgcGJmLmJ1ZltwYmYucG9zKytdID0gbG93ICYgMHg3ZiB8IDB4ODA7XG4gIGxvdyA+Pj49IDc7XG4gIHBiZi5idWZbcGJmLnBvcysrXSA9IGxvdyAmIDB4N2YgfCAweDgwO1xuICBsb3cgPj4+PSA3O1xuICBwYmYuYnVmW3BiZi5wb3MrK10gPSBsb3cgJiAweDdmIHwgMHg4MDtcbiAgbG93ID4+Pj0gNztcbiAgcGJmLmJ1ZltwYmYucG9zXSA9IGxvdyAmIDB4N2Y7XG59XG5cbmZ1bmN0aW9uIHdyaXRlQmlnVmFyaW50SGlnaChoaWdoLCBwYmYpIHtcbiAgdmFyIGxzYiA9IChoaWdoICYgMHgwNykgPDwgNDtcbiAgcGJmLmJ1ZltwYmYucG9zKytdIHw9IGxzYiB8ICgoaGlnaCA+Pj49IDMpID8gMHg4MCA6IDApO1xuICBpZiAoIWhpZ2gpIHJldHVybjtcbiAgcGJmLmJ1ZltwYmYucG9zKytdID0gaGlnaCAmIDB4N2YgfCAoKGhpZ2ggPj4+PSA3KSA/IDB4ODAgOiAwKTtcbiAgaWYgKCFoaWdoKSByZXR1cm47XG4gIHBiZi5idWZbcGJmLnBvcysrXSA9IGhpZ2ggJiAweDdmIHwgKChoaWdoID4+Pj0gNykgPyAweDgwIDogMCk7XG4gIGlmICghaGlnaCkgcmV0dXJuO1xuICBwYmYuYnVmW3BiZi5wb3MrK10gPSBoaWdoICYgMHg3ZiB8ICgoaGlnaCA+Pj49IDcpID8gMHg4MCA6IDApO1xuICBpZiAoIWhpZ2gpIHJldHVybjtcbiAgcGJmLmJ1ZltwYmYucG9zKytdID0gaGlnaCAmIDB4N2YgfCAoKGhpZ2ggPj4+PSA3KSA/IDB4ODAgOiAwKTtcbiAgaWYgKCFoaWdoKSByZXR1cm47XG4gIHBiZi5idWZbcGJmLnBvcysrXSA9IGhpZ2ggJiAweDdmO1xufVxuXG5mdW5jdGlvbiBtYWtlUm9vbUZvckV4dHJhTGVuZ3RoKHN0YXJ0UG9zLCBsZW4sIHBiZikge1xuICB2YXIgZXh0cmFMZW4gPSBsZW4gPD0gMHgzZmZmID8gMSA6IGxlbiA8PSAweDFmZmZmZiA/IDIgOiBsZW4gPD0gMHhmZmZmZmZmID8gMyA6IE1hdGguZmxvb3IoTWF0aC5sb2cobGVuKSAvIChNYXRoLkxOMiAqIDcpKTsgLy8gaWYgMSBieXRlIGlzbid0IGVub3VnaCBmb3IgZW5jb2RpbmcgbWVzc2FnZSBsZW5ndGgsIHNoaWZ0IHRoZSBkYXRhIHRvIHRoZSByaWdodFxuXG4gIHBiZi5yZWFsbG9jKGV4dHJhTGVuKTtcblxuICBmb3IgKHZhciBpID0gcGJmLnBvcyAtIDE7IGkgPj0gc3RhcnRQb3M7IGktLSkge1xuICAgIHBiZi5idWZbaSArIGV4dHJhTGVuXSA9IHBiZi5idWZbaV07XG4gIH1cbn1cblxuZnVuY3Rpb24gX3dyaXRlUGFja2VkVmFyaW50KGFyciwgcGJmKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgcGJmLndyaXRlVmFyaW50KGFycltpXSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3dyaXRlUGFja2VkU1ZhcmludChhcnIsIHBiZikge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgIHBiZi53cml0ZVNWYXJpbnQoYXJyW2ldKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfd3JpdGVQYWNrZWRGbG9hdChhcnIsIHBiZikge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgIHBiZi53cml0ZUZsb2F0KGFycltpXSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3dyaXRlUGFja2VkRG91YmxlKGFyciwgcGJmKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgcGJmLndyaXRlRG91YmxlKGFycltpXSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3dyaXRlUGFja2VkQm9vbGVhbihhcnIsIHBiZikge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgIHBiZi53cml0ZUJvb2xlYW4oYXJyW2ldKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfd3JpdGVQYWNrZWRGaXhlZChhcnIsIHBiZikge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgIHBiZi53cml0ZUZpeGVkMzIoYXJyW2ldKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfd3JpdGVQYWNrZWRTRml4ZWQoYXJyLCBwYmYpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICBwYmYud3JpdGVTRml4ZWQzMihhcnJbaV0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIF93cml0ZVBhY2tlZEZpeGVkMihhcnIsIHBiZikge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgIHBiZi53cml0ZUZpeGVkNjQoYXJyW2ldKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfd3JpdGVQYWNrZWRTRml4ZWQyKGFyciwgcGJmKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgcGJmLndyaXRlU0ZpeGVkNjQoYXJyW2ldKTtcbiAgfVxufSAvLyBCdWZmZXIgY29kZSBiZWxvdyBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyLCBNSVQtbGljZW5zZWRcblxuXG5mdW5jdGlvbiByZWFkVUludDMyKGJ1ZiwgcG9zKSB7XG4gIHJldHVybiAoYnVmW3Bvc10gfCBidWZbcG9zICsgMV0gPDwgOCB8IGJ1Zltwb3MgKyAyXSA8PCAxNikgKyBidWZbcG9zICsgM10gKiAweDEwMDAwMDA7XG59XG5cbmZ1bmN0aW9uIHdyaXRlSW50MzIoYnVmLCB2YWwsIHBvcykge1xuICBidWZbcG9zXSA9IHZhbDtcbiAgYnVmW3BvcyArIDFdID0gdmFsID4+PiA4O1xuICBidWZbcG9zICsgMl0gPSB2YWwgPj4+IDE2O1xuICBidWZbcG9zICsgM10gPSB2YWwgPj4+IDI0O1xufVxuXG5mdW5jdGlvbiByZWFkSW50MzIoYnVmLCBwb3MpIHtcbiAgcmV0dXJuIChidWZbcG9zXSB8IGJ1Zltwb3MgKyAxXSA8PCA4IHwgYnVmW3BvcyArIDJdIDw8IDE2KSArIChidWZbcG9zICsgM10gPDwgMjQpO1xufVxuXG5mdW5jdGlvbiByZWFkVXRmOChidWYsIHBvcywgZW5kKSB7XG4gIHZhciBzdHIgPSAnJztcbiAgdmFyIGkgPSBwb3M7XG5cbiAgd2hpbGUgKGkgPCBlbmQpIHtcbiAgICB2YXIgYjAgPSBidWZbaV07XG4gICAgdmFyIGMgPSBudWxsOyAvLyBjb2RlcG9pbnRcblxuICAgIHZhciBieXRlc1BlclNlcXVlbmNlID0gYjAgPiAweEVGID8gNCA6IGIwID4gMHhERiA/IDMgOiBiMCA+IDB4QkYgPyAyIDogMTtcbiAgICBpZiAoaSArIGJ5dGVzUGVyU2VxdWVuY2UgPiBlbmQpIGJyZWFrO1xuICAgIHZhciBiMSwgYjIsIGIzO1xuXG4gICAgaWYgKGJ5dGVzUGVyU2VxdWVuY2UgPT09IDEpIHtcbiAgICAgIGlmIChiMCA8IDB4ODApIHtcbiAgICAgICAgYyA9IGIwO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYnl0ZXNQZXJTZXF1ZW5jZSA9PT0gMikge1xuICAgICAgYjEgPSBidWZbaSArIDFdO1xuXG4gICAgICBpZiAoKGIxICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgYyA9IChiMCAmIDB4MUYpIDw8IDB4NiB8IGIxICYgMHgzRjtcblxuICAgICAgICBpZiAoYyA8PSAweDdGKSB7XG4gICAgICAgICAgYyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGJ5dGVzUGVyU2VxdWVuY2UgPT09IDMpIHtcbiAgICAgIGIxID0gYnVmW2kgKyAxXTtcbiAgICAgIGIyID0gYnVmW2kgKyAyXTtcblxuICAgICAgaWYgKChiMSAmIDB4QzApID09PSAweDgwICYmIChiMiAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgIGMgPSAoYjAgJiAweEYpIDw8IDB4QyB8IChiMSAmIDB4M0YpIDw8IDB4NiB8IGIyICYgMHgzRjtcblxuICAgICAgICBpZiAoYyA8PSAweDdGRiB8fCBjID49IDB4RDgwMCAmJiBjIDw9IDB4REZGRikge1xuICAgICAgICAgIGMgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChieXRlc1BlclNlcXVlbmNlID09PSA0KSB7XG4gICAgICBiMSA9IGJ1ZltpICsgMV07XG4gICAgICBiMiA9IGJ1ZltpICsgMl07XG4gICAgICBiMyA9IGJ1ZltpICsgM107XG5cbiAgICAgIGlmICgoYjEgJiAweEMwKSA9PT0gMHg4MCAmJiAoYjIgJiAweEMwKSA9PT0gMHg4MCAmJiAoYjMgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICBjID0gKGIwICYgMHhGKSA8PCAweDEyIHwgKGIxICYgMHgzRikgPDwgMHhDIHwgKGIyICYgMHgzRikgPDwgMHg2IHwgYjMgJiAweDNGO1xuXG4gICAgICAgIGlmIChjIDw9IDB4RkZGRiB8fCBjID49IDB4MTEwMDAwKSB7XG4gICAgICAgICAgYyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYyA9PT0gbnVsbCkge1xuICAgICAgYyA9IDB4RkZGRDtcbiAgICAgIGJ5dGVzUGVyU2VxdWVuY2UgPSAxO1xuICAgIH0gZWxzZSBpZiAoYyA+IDB4RkZGRikge1xuICAgICAgYyAtPSAweDEwMDAwO1xuICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYyA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMCk7XG4gICAgICBjID0gMHhEQzAwIHwgYyAmIDB4M0ZGO1xuICAgIH1cblxuICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpO1xuICAgIGkgKz0gYnl0ZXNQZXJTZXF1ZW5jZTtcbiAgfVxuXG4gIHJldHVybiBzdHI7XG59XG5cbmZ1bmN0aW9uIHJlYWRVdGY4VGV4dERlY29kZXIoYnVmLCBwb3MsIGVuZCkge1xuICByZXR1cm4gdXRmOFRleHREZWNvZGVyLmRlY29kZShidWYuc3ViYXJyYXkocG9zLCBlbmQpKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVVdGY4KGJ1Ziwgc3RyLCBwb3MpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGMsIGxlYWQ7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSk7IC8vIGNvZGUgcG9pbnRcblxuICAgIGlmIChjID4gMHhEN0ZGICYmIGMgPCAweEUwMDApIHtcbiAgICAgIGlmIChsZWFkKSB7XG4gICAgICAgIGlmIChjIDwgMHhEQzAwKSB7XG4gICAgICAgICAgYnVmW3BvcysrXSA9IDB4RUY7XG4gICAgICAgICAgYnVmW3BvcysrXSA9IDB4QkY7XG4gICAgICAgICAgYnVmW3BvcysrXSA9IDB4QkQ7XG4gICAgICAgICAgbGVhZCA9IGM7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYyA9IGxlYWQgLSAweEQ4MDAgPDwgMTAgfCBjIC0gMHhEQzAwIHwgMHgxMDAwMDtcbiAgICAgICAgICBsZWFkID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGMgPiAweERCRkYgfHwgaSArIDEgPT09IHN0ci5sZW5ndGgpIHtcbiAgICAgICAgICBidWZbcG9zKytdID0gMHhFRjtcbiAgICAgICAgICBidWZbcG9zKytdID0gMHhCRjtcbiAgICAgICAgICBidWZbcG9zKytdID0gMHhCRDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZWFkID0gYztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobGVhZCkge1xuICAgICAgYnVmW3BvcysrXSA9IDB4RUY7XG4gICAgICBidWZbcG9zKytdID0gMHhCRjtcbiAgICAgIGJ1Zltwb3MrK10gPSAweEJEO1xuICAgICAgbGVhZCA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGMgPCAweDgwKSB7XG4gICAgICBidWZbcG9zKytdID0gYztcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGMgPCAweDgwMCkge1xuICAgICAgICBidWZbcG9zKytdID0gYyA+PiAweDYgfCAweEMwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGMgPCAweDEwMDAwKSB7XG4gICAgICAgICAgYnVmW3BvcysrXSA9IGMgPj4gMHhDIHwgMHhFMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBidWZbcG9zKytdID0gYyA+PiAweDEyIHwgMHhGMDtcbiAgICAgICAgICBidWZbcG9zKytdID0gYyA+PiAweEMgJiAweDNGIHwgMHg4MDtcbiAgICAgICAgfVxuXG4gICAgICAgIGJ1Zltwb3MrK10gPSBjID4+IDB4NiAmIDB4M0YgfCAweDgwO1xuICAgICAgfVxuXG4gICAgICBidWZbcG9zKytdID0gYyAmIDB4M0YgfCAweDgwO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwb3M7XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4362\n")},5792:function(module){eval('!function (t, i) {\n true ? module.exports = i() : 0;\n}(this, function () {\n "use strict";\n\n function t(t, r, e, a, h) {\n !function t(n, r, e, a, h) {\n for (; a > e;) {\n if (a - e > 600) {\n var o = a - e + 1,\n s = r - e + 1,\n l = Math.log(o),\n f = .5 * Math.exp(2 * l / 3),\n u = .5 * Math.sqrt(l * f * (o - f) / o) * (s - o / 2 < 0 ? -1 : 1),\n m = Math.max(e, Math.floor(r - s * f / o + u)),\n c = Math.min(a, Math.floor(r + (o - s) * f / o + u));\n t(n, r, m, c, h);\n }\n\n var p = n[r],\n d = e,\n x = a;\n\n for (i(n, e, r), h(n[a], p) > 0 && i(n, e, a); d < x;) {\n for (i(n, d, x), d++, x--; h(n[d], p) < 0;) {\n d++;\n }\n\n for (; h(n[x], p) > 0;) {\n x--;\n }\n }\n\n 0 === h(n[e], p) ? i(n, e, x) : i(n, ++x, a), x <= r && (e = x + 1), r <= x && (a = x - 1);\n }\n }(t, r, e || 0, a || t.length - 1, h || n);\n }\n\n function i(t, i, n) {\n var r = t[i];\n t[i] = t[n], t[n] = r;\n }\n\n function n(t, i) {\n return t < i ? -1 : t > i ? 1 : 0;\n }\n\n var r = function r(t) {\n void 0 === t && (t = 9), this._maxEntries = Math.max(4, t), this._minEntries = Math.max(2, Math.ceil(.4 * this._maxEntries)), this.clear();\n };\n\n function e(t, i, n) {\n if (!n) return i.indexOf(t);\n\n for (var r = 0; r < i.length; r++) {\n if (n(t, i[r])) return r;\n }\n\n return -1;\n }\n\n function a(t, i) {\n h(t, 0, t.children.length, i, t);\n }\n\n function h(t, i, n, r, e) {\n e || (e = p(null)), e.minX = 1 / 0, e.minY = 1 / 0, e.maxX = -1 / 0, e.maxY = -1 / 0;\n\n for (var a = i; a < n; a++) {\n var h = t.children[a];\n o(e, t.leaf ? r(h) : h);\n }\n\n return e;\n }\n\n function o(t, i) {\n return t.minX = Math.min(t.minX, i.minX), t.minY = Math.min(t.minY, i.minY), t.maxX = Math.max(t.maxX, i.maxX), t.maxY = Math.max(t.maxY, i.maxY), t;\n }\n\n function s(t, i) {\n return t.minX - i.minX;\n }\n\n function l(t, i) {\n return t.minY - i.minY;\n }\n\n function f(t) {\n return (t.maxX - t.minX) * (t.maxY - t.minY);\n }\n\n function u(t) {\n return t.maxX - t.minX + (t.maxY - t.minY);\n }\n\n function m(t, i) {\n return t.minX <= i.minX && t.minY <= i.minY && i.maxX <= t.maxX && i.maxY <= t.maxY;\n }\n\n function c(t, i) {\n return i.minX <= t.maxX && i.minY <= t.maxY && i.maxX >= t.minX && i.maxY >= t.minY;\n }\n\n function p(t) {\n return {\n children: t,\n height: 1,\n leaf: !0,\n minX: 1 / 0,\n minY: 1 / 0,\n maxX: -1 / 0,\n maxY: -1 / 0\n };\n }\n\n function d(i, n, r, e, a) {\n for (var h = [n, r]; h.length;) {\n if (!((r = h.pop()) - (n = h.pop()) <= e)) {\n var o = n + Math.ceil((r - n) / e / 2) * e;\n t(i, o, n, r, a), h.push(n, o, o, r);\n }\n }\n }\n\n return r.prototype.all = function () {\n return this._all(this.data, []);\n }, r.prototype.search = function (t) {\n var i = this.data,\n n = [];\n if (!c(t, i)) return n;\n\n for (var r = this.toBBox, e = []; i;) {\n for (var a = 0; a < i.children.length; a++) {\n var h = i.children[a],\n o = i.leaf ? r(h) : h;\n c(t, o) && (i.leaf ? n.push(h) : m(t, o) ? this._all(h, n) : e.push(h));\n }\n\n i = e.pop();\n }\n\n return n;\n }, r.prototype.collides = function (t) {\n var i = this.data;\n if (!c(t, i)) return !1;\n\n for (var n = []; i;) {\n for (var r = 0; r < i.children.length; r++) {\n var e = i.children[r],\n a = i.leaf ? this.toBBox(e) : e;\n\n if (c(t, a)) {\n if (i.leaf || m(t, a)) return !0;\n n.push(e);\n }\n }\n\n i = n.pop();\n }\n\n return !1;\n }, r.prototype.load = function (t) {\n if (!t || !t.length) return this;\n\n if (t.length < this._minEntries) {\n for (var i = 0; i < t.length; i++) {\n this.insert(t[i]);\n }\n\n return this;\n }\n\n var n = this._build(t.slice(), 0, t.length - 1, 0);\n\n if (this.data.children.length) {\n if (this.data.height === n.height) this._splitRoot(this.data, n);else {\n if (this.data.height < n.height) {\n var r = this.data;\n this.data = n, n = r;\n }\n\n this._insert(n, this.data.height - n.height - 1, !0);\n }\n } else this.data = n;\n return this;\n }, r.prototype.insert = function (t) {\n return t && this._insert(t, this.data.height - 1), this;\n }, r.prototype.clear = function () {\n return this.data = p([]), this;\n }, r.prototype.remove = function (t, i) {\n if (!t) return this;\n\n for (var n, r, a, h = this.data, o = this.toBBox(t), s = [], l = []; h || s.length;) {\n if (h || (h = s.pop(), r = s[s.length - 1], n = l.pop(), a = !0), h.leaf) {\n var f = e(t, h.children, i);\n if (-1 !== f) return h.children.splice(f, 1), s.push(h), this._condense(s), this;\n }\n\n a || h.leaf || !m(h, o) ? r ? (n++, h = r.children[n], a = !1) : h = null : (s.push(h), l.push(n), n = 0, r = h, h = h.children[0]);\n }\n\n return this;\n }, r.prototype.toBBox = function (t) {\n return t;\n }, r.prototype.compareMinX = function (t, i) {\n return t.minX - i.minX;\n }, r.prototype.compareMinY = function (t, i) {\n return t.minY - i.minY;\n }, r.prototype.toJSON = function () {\n return this.data;\n }, r.prototype.fromJSON = function (t) {\n return this.data = t, this;\n }, r.prototype._all = function (t, i) {\n for (var n = []; t;) {\n t.leaf ? i.push.apply(i, t.children) : n.push.apply(n, t.children), t = n.pop();\n }\n\n return i;\n }, r.prototype._build = function (t, i, n, r) {\n var e,\n h = n - i + 1,\n o = this._maxEntries;\n if (h <= o) return a(e = p(t.slice(i, n + 1)), this.toBBox), e;\n r || (r = Math.ceil(Math.log(h) / Math.log(o)), o = Math.ceil(h / Math.pow(o, r - 1))), (e = p([])).leaf = !1, e.height = r;\n var s = Math.ceil(h / o),\n l = s * Math.ceil(Math.sqrt(o));\n d(t, i, n, l, this.compareMinX);\n\n for (var f = i; f <= n; f += l) {\n var u = Math.min(f + l - 1, n);\n d(t, f, u, s, this.compareMinY);\n\n for (var m = f; m <= u; m += s) {\n var c = Math.min(m + s - 1, u);\n e.children.push(this._build(t, m, c, r - 1));\n }\n }\n\n return a(e, this.toBBox), e;\n }, r.prototype._chooseSubtree = function (t, i, n, r) {\n for (; r.push(i), !i.leaf && r.length - 1 !== n;) {\n for (var e = 1 / 0, a = 1 / 0, h = void 0, o = 0; o < i.children.length; o++) {\n var s = i.children[o],\n l = f(s),\n u = (m = t, c = s, (Math.max(c.maxX, m.maxX) - Math.min(c.minX, m.minX)) * (Math.max(c.maxY, m.maxY) - Math.min(c.minY, m.minY)) - l);\n u < a ? (a = u, e = l < e ? l : e, h = s) : u === a && l < e && (e = l, h = s);\n }\n\n i = h || i.children[0];\n }\n\n var m, c;\n return i;\n }, r.prototype._insert = function (t, i, n) {\n var r = n ? t : this.toBBox(t),\n e = [],\n a = this._chooseSubtree(r, this.data, i, e);\n\n for (a.children.push(t), o(a, r); i >= 0 && e[i].children.length > this._maxEntries;) {\n this._split(e, i), i--;\n }\n\n this._adjustParentBBoxes(r, e, i);\n }, r.prototype._split = function (t, i) {\n var n = t[i],\n r = n.children.length,\n e = this._minEntries;\n\n this._chooseSplitAxis(n, e, r);\n\n var h = this._chooseSplitIndex(n, e, r),\n o = p(n.children.splice(h, n.children.length - h));\n\n o.height = n.height, o.leaf = n.leaf, a(n, this.toBBox), a(o, this.toBBox), i ? t[i - 1].children.push(o) : this._splitRoot(n, o);\n }, r.prototype._splitRoot = function (t, i) {\n this.data = p([t, i]), this.data.height = t.height + 1, this.data.leaf = !1, a(this.data, this.toBBox);\n }, r.prototype._chooseSplitIndex = function (t, i, n) {\n for (var r, e, a, o, s, l, u, m = 1 / 0, c = 1 / 0, p = i; p <= n - i; p++) {\n var d = h(t, 0, p, this.toBBox),\n x = h(t, p, n, this.toBBox),\n v = (e = d, a = x, o = void 0, s = void 0, l = void 0, u = void 0, o = Math.max(e.minX, a.minX), s = Math.max(e.minY, a.minY), l = Math.min(e.maxX, a.maxX), u = Math.min(e.maxY, a.maxY), Math.max(0, l - o) * Math.max(0, u - s)),\n M = f(d) + f(x);\n v < m ? (m = v, r = p, c = M < c ? M : c) : v === m && M < c && (c = M, r = p);\n }\n\n return r || n - i;\n }, r.prototype._chooseSplitAxis = function (t, i, n) {\n var r = t.leaf ? this.compareMinX : s,\n e = t.leaf ? this.compareMinY : l;\n this._allDistMargin(t, i, n, r) < this._allDistMargin(t, i, n, e) && t.children.sort(r);\n }, r.prototype._allDistMargin = function (t, i, n, r) {\n t.children.sort(r);\n\n for (var e = this.toBBox, a = h(t, 0, i, e), s = h(t, n - i, n, e), l = u(a) + u(s), f = i; f < n - i; f++) {\n var m = t.children[f];\n o(a, t.leaf ? e(m) : m), l += u(a);\n }\n\n for (var c = n - i - 1; c >= i; c--) {\n var p = t.children[c];\n o(s, t.leaf ? e(p) : p), l += u(s);\n }\n\n return l;\n }, r.prototype._adjustParentBBoxes = function (t, i, n) {\n for (var r = n; r >= 0; r--) {\n o(i[r], t);\n }\n }, r.prototype._condense = function (t) {\n for (var i = t.length - 1, n = void 0; i >= 0; i--) {\n 0 === t[i].children.length ? i > 0 ? (n = t[i - 1].children).splice(n.indexOf(t[i]), 1) : this.clear() : a(t[i], this.toBBox);\n }\n }, r;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yYnVzaC9yYnVzaC5taW4uanM/NzliYyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBLEVBQUUsS0FBMEQsMEJBQTBCLENBQW1GO0FBQ3pLLENBQUM7QUFDRDs7QUFFQTtBQUNBO0FBQ0EsWUFBWSxPQUFPO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxzREFBc0QsT0FBTztBQUM3RCxvQ0FBb0MsZ0JBQWdCO0FBQ3BEO0FBQ0E7O0FBRUEsZ0JBQWdCLGdCQUFnQjtBQUNoQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsbUJBQW1CLGNBQWM7QUFDakM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLG1CQUFtQixPQUFPO0FBQzFCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0JBQXdCLFVBQVU7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBLHFDQUFxQyxHQUFHO0FBQ3hDLHFCQUFxQix1QkFBdUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBLG9CQUFvQixHQUFHO0FBQ3ZCLHFCQUFxQix1QkFBdUI7QUFDNUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQSxxQkFBcUIsY0FBYztBQUNuQztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSx1RUFBdUU7QUFDdkU7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDs7QUFFQSx3RUFBd0UsZUFBZTtBQUN2RjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNILG9CQUFvQixHQUFHO0FBQ3ZCO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQkFBbUIsUUFBUTtBQUMzQjtBQUNBOztBQUVBLHFCQUFxQixRQUFRO0FBQzdCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNILFVBQVUsMENBQTBDO0FBQ3BELHVEQUF1RCx1QkFBdUI7QUFDOUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBLHFDQUFxQyxtREFBbUQ7QUFDeEY7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSCw4REFBOEQsWUFBWTtBQUMxRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBLCtGQUErRixXQUFXO0FBQzFHO0FBQ0E7QUFDQTs7QUFFQSwyQkFBMkIsUUFBUTtBQUNuQztBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0gsbUJBQW1CLFFBQVE7QUFDM0I7QUFDQTtBQUNBLEdBQUc7QUFDSCwwQ0FBMEMsUUFBUTtBQUNsRDtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUMiLCJmaWxlIjoiNTc5Mi5qcyIsInNvdXJjZXNDb250ZW50IjpbIiFmdW5jdGlvbiAodCwgaSkge1xuICBcIm9iamVjdFwiID09IHR5cGVvZiBleHBvcnRzICYmIFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIG1vZHVsZSA/IG1vZHVsZS5leHBvcnRzID0gaSgpIDogXCJmdW5jdGlvblwiID09IHR5cGVvZiBkZWZpbmUgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShpKSA6ICh0ID0gdCB8fCBzZWxmKS5SQnVzaCA9IGkoKTtcbn0odGhpcywgZnVuY3Rpb24gKCkge1xuICBcInVzZSBzdHJpY3RcIjtcblxuICBmdW5jdGlvbiB0KHQsIHIsIGUsIGEsIGgpIHtcbiAgICAhZnVuY3Rpb24gdChuLCByLCBlLCBhLCBoKSB7XG4gICAgICBmb3IgKDsgYSA+IGU7KSB7XG4gICAgICAgIGlmIChhIC0gZSA+IDYwMCkge1xuICAgICAgICAgIHZhciBvID0gYSAtIGUgKyAxLFxuICAgICAgICAgICAgICBzID0gciAtIGUgKyAxLFxuICAgICAgICAgICAgICBsID0gTWF0aC5sb2cobyksXG4gICAgICAgICAgICAgIGYgPSAuNSAqIE1hdGguZXhwKDIgKiBsIC8gMyksXG4gICAgICAgICAgICAgIHUgPSAuNSAqIE1hdGguc3FydChsICogZiAqIChvIC0gZikgLyBvKSAqIChzIC0gbyAvIDIgPCAwID8gLTEgOiAxKSxcbiAgICAgICAgICAgICAgbSA9IE1hdGgubWF4KGUsIE1hdGguZmxvb3IociAtIHMgKiBmIC8gbyArIHUpKSxcbiAgICAgICAgICAgICAgYyA9IE1hdGgubWluKGEsIE1hdGguZmxvb3IociArIChvIC0gcykgKiBmIC8gbyArIHUpKTtcbiAgICAgICAgICB0KG4sIHIsIG0sIGMsIGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHAgPSBuW3JdLFxuICAgICAgICAgICAgZCA9IGUsXG4gICAgICAgICAgICB4ID0gYTtcblxuICAgICAgICBmb3IgKGkobiwgZSwgciksIGgoblthXSwgcCkgPiAwICYmIGkobiwgZSwgYSk7IGQgPCB4Oykge1xuICAgICAgICAgIGZvciAoaShuLCBkLCB4KSwgZCsrLCB4LS07IGgobltkXSwgcCkgPCAwOykge1xuICAgICAgICAgICAgZCsrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAoOyBoKG5beF0sIHApID4gMDspIHtcbiAgICAgICAgICAgIHgtLTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAwID09PSBoKG5bZV0sIHApID8gaShuLCBlLCB4KSA6IGkobiwgKyt4LCBhKSwgeCA8PSByICYmIChlID0geCArIDEpLCByIDw9IHggJiYgKGEgPSB4IC0gMSk7XG4gICAgICB9XG4gICAgfSh0LCByLCBlIHx8IDAsIGEgfHwgdC5sZW5ndGggLSAxLCBoIHx8IG4pO1xuICB9XG5cbiAgZnVuY3Rpb24gaSh0LCBpLCBuKSB7XG4gICAgdmFyIHIgPSB0W2ldO1xuICAgIHRbaV0gPSB0W25dLCB0W25dID0gcjtcbiAgfVxuXG4gIGZ1bmN0aW9uIG4odCwgaSkge1xuICAgIHJldHVybiB0IDwgaSA/IC0xIDogdCA+IGkgPyAxIDogMDtcbiAgfVxuXG4gIHZhciByID0gZnVuY3Rpb24gcih0KSB7XG4gICAgdm9pZCAwID09PSB0ICYmICh0ID0gOSksIHRoaXMuX21heEVudHJpZXMgPSBNYXRoLm1heCg0LCB0KSwgdGhpcy5fbWluRW50cmllcyA9IE1hdGgubWF4KDIsIE1hdGguY2VpbCguNCAqIHRoaXMuX21heEVudHJpZXMpKSwgdGhpcy5jbGVhcigpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIGUodCwgaSwgbikge1xuICAgIGlmICghbikgcmV0dXJuIGkuaW5kZXhPZih0KTtcblxuICAgIGZvciAodmFyIHIgPSAwOyByIDwgaS5sZW5ndGg7IHIrKykge1xuICAgICAgaWYgKG4odCwgaVtyXSkpIHJldHVybiByO1xuICAgIH1cblxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGEodCwgaSkge1xuICAgIGgodCwgMCwgdC5jaGlsZHJlbi5sZW5ndGgsIGksIHQpO1xuICB9XG5cbiAgZnVuY3Rpb24gaCh0LCBpLCBuLCByLCBlKSB7XG4gICAgZSB8fCAoZSA9IHAobnVsbCkpLCBlLm1pblggPSAxIC8gMCwgZS5taW5ZID0gMSAvIDAsIGUubWF4WCA9IC0xIC8gMCwgZS5tYXhZID0gLTEgLyAwO1xuXG4gICAgZm9yICh2YXIgYSA9IGk7IGEgPCBuOyBhKyspIHtcbiAgICAgIHZhciBoID0gdC5jaGlsZHJlblthXTtcbiAgICAgIG8oZSwgdC5sZWFmID8gcihoKSA6IGgpO1xuICAgIH1cblxuICAgIHJldHVybiBlO1xuICB9XG5cbiAgZnVuY3Rpb24gbyh0LCBpKSB7XG4gICAgcmV0dXJuIHQubWluWCA9IE1hdGgubWluKHQubWluWCwgaS5taW5YKSwgdC5taW5ZID0gTWF0aC5taW4odC5taW5ZLCBpLm1pblkpLCB0Lm1heFggPSBNYXRoLm1heCh0Lm1heFgsIGkubWF4WCksIHQubWF4WSA9IE1hdGgubWF4KHQubWF4WSwgaS5tYXhZKSwgdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHModCwgaSkge1xuICAgIHJldHVybiB0Lm1pblggLSBpLm1pblg7XG4gIH1cblxuICBmdW5jdGlvbiBsKHQsIGkpIHtcbiAgICByZXR1cm4gdC5taW5ZIC0gaS5taW5ZO1xuICB9XG5cbiAgZnVuY3Rpb24gZih0KSB7XG4gICAgcmV0dXJuICh0Lm1heFggLSB0Lm1pblgpICogKHQubWF4WSAtIHQubWluWSk7XG4gIH1cblxuICBmdW5jdGlvbiB1KHQpIHtcbiAgICByZXR1cm4gdC5tYXhYIC0gdC5taW5YICsgKHQubWF4WSAtIHQubWluWSk7XG4gIH1cblxuICBmdW5jdGlvbiBtKHQsIGkpIHtcbiAgICByZXR1cm4gdC5taW5YIDw9IGkubWluWCAmJiB0Lm1pblkgPD0gaS5taW5ZICYmIGkubWF4WCA8PSB0Lm1heFggJiYgaS5tYXhZIDw9IHQubWF4WTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGModCwgaSkge1xuICAgIHJldHVybiBpLm1pblggPD0gdC5tYXhYICYmIGkubWluWSA8PSB0Lm1heFkgJiYgaS5tYXhYID49IHQubWluWCAmJiBpLm1heFkgPj0gdC5taW5ZO1xuICB9XG5cbiAgZnVuY3Rpb24gcCh0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNoaWxkcmVuOiB0LFxuICAgICAgaGVpZ2h0OiAxLFxuICAgICAgbGVhZjogITAsXG4gICAgICBtaW5YOiAxIC8gMCxcbiAgICAgIG1pblk6IDEgLyAwLFxuICAgICAgbWF4WDogLTEgLyAwLFxuICAgICAgbWF4WTogLTEgLyAwXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGQoaSwgbiwgciwgZSwgYSkge1xuICAgIGZvciAodmFyIGggPSBbbiwgcl07IGgubGVuZ3RoOykge1xuICAgICAgaWYgKCEoKHIgPSBoLnBvcCgpKSAtIChuID0gaC5wb3AoKSkgPD0gZSkpIHtcbiAgICAgICAgdmFyIG8gPSBuICsgTWF0aC5jZWlsKChyIC0gbikgLyBlIC8gMikgKiBlO1xuICAgICAgICB0KGksIG8sIG4sIHIsIGEpLCBoLnB1c2gobiwgbywgbywgcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHIucHJvdG90eXBlLmFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5fYWxsKHRoaXMuZGF0YSwgW10pO1xuICB9LCByLnByb3RvdHlwZS5zZWFyY2ggPSBmdW5jdGlvbiAodCkge1xuICAgIHZhciBpID0gdGhpcy5kYXRhLFxuICAgICAgICBuID0gW107XG4gICAgaWYgKCFjKHQsIGkpKSByZXR1cm4gbjtcblxuICAgIGZvciAodmFyIHIgPSB0aGlzLnRvQkJveCwgZSA9IFtdOyBpOykge1xuICAgICAgZm9yICh2YXIgYSA9IDA7IGEgPCBpLmNoaWxkcmVuLmxlbmd0aDsgYSsrKSB7XG4gICAgICAgIHZhciBoID0gaS5jaGlsZHJlblthXSxcbiAgICAgICAgICAgIG8gPSBpLmxlYWYgPyByKGgpIDogaDtcbiAgICAgICAgYyh0LCBvKSAmJiAoaS5sZWFmID8gbi5wdXNoKGgpIDogbSh0LCBvKSA/IHRoaXMuX2FsbChoLCBuKSA6IGUucHVzaChoKSk7XG4gICAgICB9XG5cbiAgICAgIGkgPSBlLnBvcCgpO1xuICAgIH1cblxuICAgIHJldHVybiBuO1xuICB9LCByLnByb3RvdHlwZS5jb2xsaWRlcyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgdmFyIGkgPSB0aGlzLmRhdGE7XG4gICAgaWYgKCFjKHQsIGkpKSByZXR1cm4gITE7XG5cbiAgICBmb3IgKHZhciBuID0gW107IGk7KSB7XG4gICAgICBmb3IgKHZhciByID0gMDsgciA8IGkuY2hpbGRyZW4ubGVuZ3RoOyByKyspIHtcbiAgICAgICAgdmFyIGUgPSBpLmNoaWxkcmVuW3JdLFxuICAgICAgICAgICAgYSA9IGkubGVhZiA/IHRoaXMudG9CQm94KGUpIDogZTtcblxuICAgICAgICBpZiAoYyh0LCBhKSkge1xuICAgICAgICAgIGlmIChpLmxlYWYgfHwgbSh0LCBhKSkgcmV0dXJuICEwO1xuICAgICAgICAgIG4ucHVzaChlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpID0gbi5wb3AoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gITE7XG4gIH0sIHIucHJvdG90eXBlLmxvYWQgPSBmdW5jdGlvbiAodCkge1xuICAgIGlmICghdCB8fCAhdC5sZW5ndGgpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKHQubGVuZ3RoIDwgdGhpcy5fbWluRW50cmllcykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuaW5zZXJ0KHRbaV0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB2YXIgbiA9IHRoaXMuX2J1aWxkKHQuc2xpY2UoKSwgMCwgdC5sZW5ndGggLSAxLCAwKTtcblxuICAgIGlmICh0aGlzLmRhdGEuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICBpZiAodGhpcy5kYXRhLmhlaWdodCA9PT0gbi5oZWlnaHQpIHRoaXMuX3NwbGl0Um9vdCh0aGlzLmRhdGEsIG4pO2Vsc2Uge1xuICAgICAgICBpZiAodGhpcy5kYXRhLmhlaWdodCA8IG4uaGVpZ2h0KSB7XG4gICAgICAgICAgdmFyIHIgPSB0aGlzLmRhdGE7XG4gICAgICAgICAgdGhpcy5kYXRhID0gbiwgbiA9IHI7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9pbnNlcnQobiwgdGhpcy5kYXRhLmhlaWdodCAtIG4uaGVpZ2h0IC0gMSwgITApO1xuICAgICAgfVxuICAgIH0gZWxzZSB0aGlzLmRhdGEgPSBuO1xuICAgIHJldHVybiB0aGlzO1xuICB9LCByLnByb3RvdHlwZS5pbnNlcnQgPSBmdW5jdGlvbiAodCkge1xuICAgIHJldHVybiB0ICYmIHRoaXMuX2luc2VydCh0LCB0aGlzLmRhdGEuaGVpZ2h0IC0gMSksIHRoaXM7XG4gIH0sIHIucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGEgPSBwKFtdKSwgdGhpcztcbiAgfSwgci5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKHQsIGkpIHtcbiAgICBpZiAoIXQpIHJldHVybiB0aGlzO1xuXG4gICAgZm9yICh2YXIgbiwgciwgYSwgaCA9IHRoaXMuZGF0YSwgbyA9IHRoaXMudG9CQm94KHQpLCBzID0gW10sIGwgPSBbXTsgaCB8fCBzLmxlbmd0aDspIHtcbiAgICAgIGlmIChoIHx8IChoID0gcy5wb3AoKSwgciA9IHNbcy5sZW5ndGggLSAxXSwgbiA9IGwucG9wKCksIGEgPSAhMCksIGgubGVhZikge1xuICAgICAgICB2YXIgZiA9IGUodCwgaC5jaGlsZHJlbiwgaSk7XG4gICAgICAgIGlmICgtMSAhPT0gZikgcmV0dXJuIGguY2hpbGRyZW4uc3BsaWNlKGYsIDEpLCBzLnB1c2goaCksIHRoaXMuX2NvbmRlbnNlKHMpLCB0aGlzO1xuICAgICAgfVxuXG4gICAgICBhIHx8IGgubGVhZiB8fCAhbShoLCBvKSA/IHIgPyAobisrLCBoID0gci5jaGlsZHJlbltuXSwgYSA9ICExKSA6IGggPSBudWxsIDogKHMucHVzaChoKSwgbC5wdXNoKG4pLCBuID0gMCwgciA9IGgsIGggPSBoLmNoaWxkcmVuWzBdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSwgci5wcm90b3R5cGUudG9CQm94ID0gZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdDtcbiAgfSwgci5wcm90b3R5cGUuY29tcGFyZU1pblggPSBmdW5jdGlvbiAodCwgaSkge1xuICAgIHJldHVybiB0Lm1pblggLSBpLm1pblg7XG4gIH0sIHIucHJvdG90eXBlLmNvbXBhcmVNaW5ZID0gZnVuY3Rpb24gKHQsIGkpIHtcbiAgICByZXR1cm4gdC5taW5ZIC0gaS5taW5ZO1xuICB9LCByLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YTtcbiAgfSwgci5wcm90b3R5cGUuZnJvbUpTT04gPSBmdW5jdGlvbiAodCkge1xuICAgIHJldHVybiB0aGlzLmRhdGEgPSB0LCB0aGlzO1xuICB9LCByLnByb3RvdHlwZS5fYWxsID0gZnVuY3Rpb24gKHQsIGkpIHtcbiAgICBmb3IgKHZhciBuID0gW107IHQ7KSB7XG4gICAgICB0LmxlYWYgPyBpLnB1c2guYXBwbHkoaSwgdC5jaGlsZHJlbikgOiBuLnB1c2guYXBwbHkobiwgdC5jaGlsZHJlbiksIHQgPSBuLnBvcCgpO1xuICAgIH1cblxuICAgIHJldHVybiBpO1xuICB9LCByLnByb3RvdHlwZS5fYnVpbGQgPSBmdW5jdGlvbiAodCwgaSwgbiwgcikge1xuICAgIHZhciBlLFxuICAgICAgICBoID0gbiAtIGkgKyAxLFxuICAgICAgICBvID0gdGhpcy5fbWF4RW50cmllcztcbiAgICBpZiAoaCA8PSBvKSByZXR1cm4gYShlID0gcCh0LnNsaWNlKGksIG4gKyAxKSksIHRoaXMudG9CQm94KSwgZTtcbiAgICByIHx8IChyID0gTWF0aC5jZWlsKE1hdGgubG9nKGgpIC8gTWF0aC5sb2cobykpLCBvID0gTWF0aC5jZWlsKGggLyBNYXRoLnBvdyhvLCByIC0gMSkpKSwgKGUgPSBwKFtdKSkubGVhZiA9ICExLCBlLmhlaWdodCA9IHI7XG4gICAgdmFyIHMgPSBNYXRoLmNlaWwoaCAvIG8pLFxuICAgICAgICBsID0gcyAqIE1hdGguY2VpbChNYXRoLnNxcnQobykpO1xuICAgIGQodCwgaSwgbiwgbCwgdGhpcy5jb21wYXJlTWluWCk7XG5cbiAgICBmb3IgKHZhciBmID0gaTsgZiA8PSBuOyBmICs9IGwpIHtcbiAgICAgIHZhciB1ID0gTWF0aC5taW4oZiArIGwgLSAxLCBuKTtcbiAgICAgIGQodCwgZiwgdSwgcywgdGhpcy5jb21wYXJlTWluWSk7XG5cbiAgICAgIGZvciAodmFyIG0gPSBmOyBtIDw9IHU7IG0gKz0gcykge1xuICAgICAgICB2YXIgYyA9IE1hdGgubWluKG0gKyBzIC0gMSwgdSk7XG4gICAgICAgIGUuY2hpbGRyZW4ucHVzaCh0aGlzLl9idWlsZCh0LCBtLCBjLCByIC0gMSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhKGUsIHRoaXMudG9CQm94KSwgZTtcbiAgfSwgci5wcm90b3R5cGUuX2Nob29zZVN1YnRyZWUgPSBmdW5jdGlvbiAodCwgaSwgbiwgcikge1xuICAgIGZvciAoOyByLnB1c2goaSksICFpLmxlYWYgJiYgci5sZW5ndGggLSAxICE9PSBuOykge1xuICAgICAgZm9yICh2YXIgZSA9IDEgLyAwLCBhID0gMSAvIDAsIGggPSB2b2lkIDAsIG8gPSAwOyBvIDwgaS5jaGlsZHJlbi5sZW5ndGg7IG8rKykge1xuICAgICAgICB2YXIgcyA9IGkuY2hpbGRyZW5bb10sXG4gICAgICAgICAgICBsID0gZihzKSxcbiAgICAgICAgICAgIHUgPSAobSA9IHQsIGMgPSBzLCAoTWF0aC5tYXgoYy5tYXhYLCBtLm1heFgpIC0gTWF0aC5taW4oYy5taW5YLCBtLm1pblgpKSAqIChNYXRoLm1heChjLm1heFksIG0ubWF4WSkgLSBNYXRoLm1pbihjLm1pblksIG0ubWluWSkpIC0gbCk7XG4gICAgICAgIHUgPCBhID8gKGEgPSB1LCBlID0gbCA8IGUgPyBsIDogZSwgaCA9IHMpIDogdSA9PT0gYSAmJiBsIDwgZSAmJiAoZSA9IGwsIGggPSBzKTtcbiAgICAgIH1cblxuICAgICAgaSA9IGggfHwgaS5jaGlsZHJlblswXTtcbiAgICB9XG5cbiAgICB2YXIgbSwgYztcbiAgICByZXR1cm4gaTtcbiAgfSwgci5wcm90b3R5cGUuX2luc2VydCA9IGZ1bmN0aW9uICh0LCBpLCBuKSB7XG4gICAgdmFyIHIgPSBuID8gdCA6IHRoaXMudG9CQm94KHQpLFxuICAgICAgICBlID0gW10sXG4gICAgICAgIGEgPSB0aGlzLl9jaG9vc2VTdWJ0cmVlKHIsIHRoaXMuZGF0YSwgaSwgZSk7XG5cbiAgICBmb3IgKGEuY2hpbGRyZW4ucHVzaCh0KSwgbyhhLCByKTsgaSA+PSAwICYmIGVbaV0uY2hpbGRyZW4ubGVuZ3RoID4gdGhpcy5fbWF4RW50cmllczspIHtcbiAgICAgIHRoaXMuX3NwbGl0KGUsIGkpLCBpLS07XG4gICAgfVxuXG4gICAgdGhpcy5fYWRqdXN0UGFyZW50QkJveGVzKHIsIGUsIGkpO1xuICB9LCByLnByb3RvdHlwZS5fc3BsaXQgPSBmdW5jdGlvbiAodCwgaSkge1xuICAgIHZhciBuID0gdFtpXSxcbiAgICAgICAgciA9IG4uY2hpbGRyZW4ubGVuZ3RoLFxuICAgICAgICBlID0gdGhpcy5fbWluRW50cmllcztcblxuICAgIHRoaXMuX2Nob29zZVNwbGl0QXhpcyhuLCBlLCByKTtcblxuICAgIHZhciBoID0gdGhpcy5fY2hvb3NlU3BsaXRJbmRleChuLCBlLCByKSxcbiAgICAgICAgbyA9IHAobi5jaGlsZHJlbi5zcGxpY2UoaCwgbi5jaGlsZHJlbi5sZW5ndGggLSBoKSk7XG5cbiAgICBvLmhlaWdodCA9IG4uaGVpZ2h0LCBvLmxlYWYgPSBuLmxlYWYsIGEobiwgdGhpcy50b0JCb3gpLCBhKG8sIHRoaXMudG9CQm94KSwgaSA/IHRbaSAtIDFdLmNoaWxkcmVuLnB1c2gobykgOiB0aGlzLl9zcGxpdFJvb3Qobiwgbyk7XG4gIH0sIHIucHJvdG90eXBlLl9zcGxpdFJvb3QgPSBmdW5jdGlvbiAodCwgaSkge1xuICAgIHRoaXMuZGF0YSA9IHAoW3QsIGldKSwgdGhpcy5kYXRhLmhlaWdodCA9IHQuaGVpZ2h0ICsgMSwgdGhpcy5kYXRhLmxlYWYgPSAhMSwgYSh0aGlzLmRhdGEsIHRoaXMudG9CQm94KTtcbiAgfSwgci5wcm90b3R5cGUuX2Nob29zZVNwbGl0SW5kZXggPSBmdW5jdGlvbiAodCwgaSwgbikge1xuICAgIGZvciAodmFyIHIsIGUsIGEsIG8sIHMsIGwsIHUsIG0gPSAxIC8gMCwgYyA9IDEgLyAwLCBwID0gaTsgcCA8PSBuIC0gaTsgcCsrKSB7XG4gICAgICB2YXIgZCA9IGgodCwgMCwgcCwgdGhpcy50b0JCb3gpLFxuICAgICAgICAgIHggPSBoKHQsIHAsIG4sIHRoaXMudG9CQm94KSxcbiAgICAgICAgICB2ID0gKGUgPSBkLCBhID0geCwgbyA9IHZvaWQgMCwgcyA9IHZvaWQgMCwgbCA9IHZvaWQgMCwgdSA9IHZvaWQgMCwgbyA9IE1hdGgubWF4KGUubWluWCwgYS5taW5YKSwgcyA9IE1hdGgubWF4KGUubWluWSwgYS5taW5ZKSwgbCA9IE1hdGgubWluKGUubWF4WCwgYS5tYXhYKSwgdSA9IE1hdGgubWluKGUubWF4WSwgYS5tYXhZKSwgTWF0aC5tYXgoMCwgbCAtIG8pICogTWF0aC5tYXgoMCwgdSAtIHMpKSxcbiAgICAgICAgICBNID0gZihkKSArIGYoeCk7XG4gICAgICB2IDwgbSA/IChtID0gdiwgciA9IHAsIGMgPSBNIDwgYyA/IE0gOiBjKSA6IHYgPT09IG0gJiYgTSA8IGMgJiYgKGMgPSBNLCByID0gcCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHIgfHwgbiAtIGk7XG4gIH0sIHIucHJvdG90eXBlLl9jaG9vc2VTcGxpdEF4aXMgPSBmdW5jdGlvbiAodCwgaSwgbikge1xuICAgIHZhciByID0gdC5sZWFmID8gdGhpcy5jb21wYXJlTWluWCA6IHMsXG4gICAgICAgIGUgPSB0LmxlYWYgPyB0aGlzLmNvbXBhcmVNaW5ZIDogbDtcbiAgICB0aGlzLl9hbGxEaXN0TWFyZ2luKHQsIGksIG4sIHIpIDwgdGhpcy5fYWxsRGlzdE1hcmdpbih0LCBpLCBuLCBlKSAmJiB0LmNoaWxkcmVuLnNvcnQocik7XG4gIH0sIHIucHJvdG90eXBlLl9hbGxEaXN0TWFyZ2luID0gZnVuY3Rpb24gKHQsIGksIG4sIHIpIHtcbiAgICB0LmNoaWxkcmVuLnNvcnQocik7XG5cbiAgICBmb3IgKHZhciBlID0gdGhpcy50b0JCb3gsIGEgPSBoKHQsIDAsIGksIGUpLCBzID0gaCh0LCBuIC0gaSwgbiwgZSksIGwgPSB1KGEpICsgdShzKSwgZiA9IGk7IGYgPCBuIC0gaTsgZisrKSB7XG4gICAgICB2YXIgbSA9IHQuY2hpbGRyZW5bZl07XG4gICAgICBvKGEsIHQubGVhZiA/IGUobSkgOiBtKSwgbCArPSB1KGEpO1xuICAgIH1cblxuICAgIGZvciAodmFyIGMgPSBuIC0gaSAtIDE7IGMgPj0gaTsgYy0tKSB7XG4gICAgICB2YXIgcCA9IHQuY2hpbGRyZW5bY107XG4gICAgICBvKHMsIHQubGVhZiA/IGUocCkgOiBwKSwgbCArPSB1KHMpO1xuICAgIH1cblxuICAgIHJldHVybiBsO1xuICB9LCByLnByb3RvdHlwZS5fYWRqdXN0UGFyZW50QkJveGVzID0gZnVuY3Rpb24gKHQsIGksIG4pIHtcbiAgICBmb3IgKHZhciByID0gbjsgciA+PSAwOyByLS0pIHtcbiAgICAgIG8oaVtyXSwgdCk7XG4gICAgfVxuICB9LCByLnByb3RvdHlwZS5fY29uZGVuc2UgPSBmdW5jdGlvbiAodCkge1xuICAgIGZvciAodmFyIGkgPSB0Lmxlbmd0aCAtIDEsIG4gPSB2b2lkIDA7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAwID09PSB0W2ldLmNoaWxkcmVuLmxlbmd0aCA/IGkgPiAwID8gKG4gPSB0W2kgLSAxXS5jaGlsZHJlbikuc3BsaWNlKG4uaW5kZXhPZih0W2ldKSwgMSkgOiB0aGlzLmNsZWFyKCkgOiBhKHRbaV0sIHRoaXMudG9CQm94KTtcbiAgICB9XG4gIH0sIHI7XG59KTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5792\n')},4239:function(module){eval('// Generated by CoffeeScript 1.10.0\n(function () {\n var families;\n module.exports = {\n icon: \'icons/google.svg\',\n name: \'google\',\n title: \'Google Fonts\',\n link: \'google.com/fonts\',\n getNames: function getNames() {\n return families;\n },\n getLink: function getLink(name) {\n return "https://fonts.google.com/specimen/" + name.replace(/( )/g, \'+\');\n },\n normalizeName: function normalizeName(name) {\n return name;\n }\n };\n families = ["ABeeZee", "Abel", "Abril Fatface", "Aclonica", "Acme", "Actor", "Adamina", "Advent Pro", "Aguafina Script", "Akronim", "Aladin", "Aldrich", "Alef", "Alegreya", "Alegreya SC", "Alegreya Sans", "Alegreya Sans SC", "Alex Brush", "Alfa Slab One", "Alice", "Alike", "Alike Angular", "Allan", "Allerta", "Allerta Stencil", "Allura", "Almendra", "Almendra Display", "Almendra SC", "Amarante", "Amaranth", "Amatic SC", "Amethysta", "Amiri", "Amita", "Anaheim", "Andada", "Andika", "Angkor", "Annie Use Your Telescope", "Anonymous Pro", "Antic", "Antic Didone", "Antic Slab", "Anton", "Arapey", "Arbutus", "Arbutus Slab", "Architects Daughter", "Archivo Black", "Archivo Narrow", "Arimo", "Arizonia", "Armata", "Artifika", "Arvo", "Arya", "Asap", "Asar", "Asset", "Astloch", "Asul", "Atomic Age", "Aubrey", "Audiowide", "Autour One", "Average", "Average Sans", "Averia Gruesa Libre", "Averia Libre", "Averia Sans Libre", "Averia Serif Libre", "Bad Script", "Balthazar", "Bangers", "Basic", "Battambang", "Baumans", "Bayon", "Belgrano", "Belleza", "BenchNine", "Bentham", "Berkshire Swash", "Bevan", "Bigelow Rules", "Bigshot One", "Bilbo", "Bilbo Swash Caps", "Biryani", "Bitter", "Black Ops One", "Bokor", "Bonbon", "Boogaloo", "Bowlby One", "Bowlby One SC", "Brawler", "Bree Serif", "Bubblegum Sans", "Bubbler One", "Buda", "Buenard", "Butcherman", "Butterfly Kids", "Cabin", "Cabin Condensed", "Cabin Sketch", "Caesar Dressing", "Cagliostro", "Calligraffitti", "Cambay", "Cambo", "Candal", "Cantarell", "Cantata One", "Cantora One", "Capriola", "Cardo", "Carme", "Carrois Gothic", "Carrois Gothic SC", "Carter One", "Catamaran", "Caudex", "Caveat", "Caveat Brush", "Cedarville Cursive", "Ceviche One", "Changa One", "Chango", "Chau Philomene One", "Chela One", "Chelsea Market", "Chenla", "Cherry Cream Soda", "Cherry Swash", "Chewy", "Chicle", "Chivo", "Chonburi", "Cinzel", "Cinzel Decorative", "Clicker Script", "Coda", "Coda Caption", "Codystar", "Combo", "Comfortaa", "Coming Soon", "Concert One", "Condiment", "Content", "Contrail One", "Convergence", "Cookie", "Copse", "Corben", "Courgette", "Cousine", "Coustard", "Covered By Your Grace", "Crafty Girls", "Creepster", "Crete Round", "Crimson Text", "Croissant One", "Crushed", "Cuprum", "Cutive", "Cutive Mono", "Damion", "Dancing Script", "Dangrek", "Dawning of a New Day", "Days One", "Dekko", "Delius", "Delius Swash Caps", "Delius Unicase", "Della Respira", "Denk One", "Devonshire", "Dhurjati", "Didact Gothic", "Diplomata", "Diplomata SC", "Domine", "Donegal One", "Doppio One", "Dorsa", "Dosis", "Dr Sugiyama", "Droid Sans", "Droid Sans Mono", "Droid Serif", "Duru Sans", "Dynalight", "EB Garamond", "Eagle Lake", "Eater", "Economica", "Eczar", "Ek Mukta", "Electrolize", "Elsie", "Elsie Swash Caps", "Emblema One", "Emilys Candy", "Engagement", "Englebert", "Enriqueta", "Erica One", "Esteban", "Euphoria Script", "Ewert", "Exo", "Exo 2", "Expletus Sans", "Fanwood Text", "Fascinate", "Fascinate Inline", "Faster One", "Fasthand", "Fauna One", "Federant", "Federo", "Felipa", "Fenix", "Finger Paint", "Fira Mono", "Fira Sans", "Fjalla One", "Fjord One", "Flamenco", "Flavors", "Fondamento", "Fontdiner Swanky", "Forum", "Francois One", "Freckle Face", "Fredericka the Great", "Fredoka One", "Freehand", "Fresca", "Frijole", "Fruktur", "Fugaz One", "GFS Didot", "GFS Neohellenic", "Gabriela", "Gafata", "Galdeano", "Galindo", "Gentium Basic", "Gentium Book Basic", "Geo", "Geostar", "Geostar Fill", "Germania One", "Gidugu", "Gilda Display", "Give You Glory", "Glass Antiqua", "Glegoo", "Gloria Hallelujah", "Goblin One", "Gochi Hand", "Gorditas", "Goudy Bookletter 1911", "Graduate", "Grand Hotel", "Gravitas One", "Great Vibes", "Griffy", "Gruppo", "Gudea", "Gurajada", "Habibi", "Halant", "Hammersmith One", "Hanalei", "Hanalei Fill", "Handlee", "Hanuman", "Happy Monkey", "Headland One", "Henny Penny", "Herr Von Muellerhoff", "Hind", "Hind Siliguri", "Hind Vadodara", "Holtwood One SC", "Homemade Apple", "Homenaje", "IM Fell DW Pica", "IM Fell DW Pica SC", "IM Fell Double Pica", "IM Fell Double Pica SC", "IM Fell English", "IM Fell English SC", "IM Fell French Canon", "IM Fell French Canon SC", "IM Fell Great Primer", "IM Fell Great Primer SC", "Iceberg", "Iceland", "Imprima", "Inconsolata", "Inder", "Indie Flower", "Inika", "Inknut Antiqua", "Irish Grover", "Istok Web", "Italiana", "Italianno", "Itim", "Jacques Francois", "Jacques Francois Shadow", "Jaldi", "Jim Nightshade", "Jockey One", "Jolly Lodger", "Josefin Sans", "Josefin Slab", "Joti One", "Judson", "Julee", "Julius Sans One", "Junge", "Jura", "Just Another Hand", "Just Me Again Down Here", "Kadwa", "Kalam", "Kameron", "Kantumruy", "Karla", "Karma", "Kaushan Script", "Kavoon", "Kdam Thmor", "Keania One", "Kelly Slab", "Kenia", "Khand", "Khmer", "Khula", "Kite One", "Knewave", "Kotta One", "Koulen", "Kranky", "Kreon", "Kristi", "Krona One", "Kurale", "La Belle Aurore", "Laila", "Lakki Reddy", "Lancelot", "Lateef", "Lato", "League Script", "Leckerli One", "Ledger", "Lekton", "Lemon", "Libre Baskerville", "Life Savers", "Lilita One", "Lily Script One", "Limelight", "Linden Hill", "Lobster", "Lobster Two", "Londrina Outline", "Londrina Shadow", "Londrina Sketch", "Londrina Solid", "Lora", "Love Ya Like A Sister", "Loved by the King", "Lovers Quarrel", "Luckiest Guy", "Lusitana", "Lustria", "Macondo", "Macondo Swash Caps", "Magra", "Maiden Orange", "Mako", "Mallanna", "Mandali", "Marcellus", "Marcellus SC", "Marck Script", "Margarine", "Marko One", "Marmelad", "Martel", "Martel Sans", "Marvel", "Mate", "Mate SC", "Maven Pro", "McLaren", "Meddon", "MedievalSharp", "Medula One", "Megrim", "Meie Script", "Merienda", "Merienda One", "Merriweather", "Merriweather Sans", "Metal", "Metal Mania", "Metamorphous", "Metrophobic", "Michroma", "Milonga", "Miltonian", "Miltonian Tattoo", "Miniver", "Miss Fajardose", "Modak", "Modern Antiqua", "Molengo", "Molle", "Monda", "Monofett", "Monoton", "Monsieur La Doulaise", "Montaga", "Montez", "Montserrat", "Montserrat Alternates", "Montserrat Subrayada", "Moul", "Moulpali", "Mountains of Christmas", "Mouse Memoirs", "Mr Bedfort", "Mr Dafoe", "Mr De Haviland", "Mrs Saint Delafield", "Mrs Sheppards", "Muli", "Mystery Quest", "NTR", "Neucha", "Neuton", "New Rocker", "News Cycle", "Niconne", "Nixie One", "Nobile", "Nokora", "Norican", "Nosifer", "Nothing You Could Do", "Noticia Text", "Noto Sans", "Noto Serif", "Nova Cut", "Nova Flat", "Nova Mono", "Nova Oval", "Nova Round", "Nova Script", "Nova Slim", "Nova Square", "Numans", "Nunito", "Odor Mean Chey", "Offside", "Old Standard TT", "Oldenburg", "Oleo Script", "Oleo Script Swash Caps", "Open Sans", "Open Sans Condensed", "Oranienbaum", "Orbitron", "Oregano", "Orienta", "Original Surfer", "Oswald", "Over the Rainbow", "Overlock", "Overlock SC", "Ovo", "Oxygen", "Oxygen Mono", "PT Mono", "PT Sans", "PT Sans Caption", "PT Sans Narrow", "PT Serif", "PT Serif Caption", "Pacifico", "Palanquin", "Palanquin Dark", "Paprika", "Parisienne", "Passero One", "Passion One", "Pathway Gothic One", "Patrick Hand", "Patrick Hand SC", "Patua One", "Paytone One", "Peddana", "Peralta", "Permanent Marker", "Petit Formal Script", "Petrona", "Philosopher", "Piedra", "Pinyon Script", "Pirata One", "Plaster", "Play", "Playball", "Playfair Display", "Playfair Display SC", "Podkova", "Poiret One", "Poller One", "Poly", "Pompiere", "Pontano Sans", "Poppins", "Port Lligat Sans", "Port Lligat Slab", "Pragati Narrow", "Prata", "Preahvihear", "Press Start 2P", "Princess Sofia", "Prociono", "Prosto One", "Puritan", "Purple Purse", "Quando", "Quantico", "Quattrocento", "Quattrocento Sans", "Questrial", "Quicksand", "Quintessential", "Qwigley", "Racing Sans One", "Radley", "Rajdhani", "Raleway", "Raleway Dots", "Ramabhadra", "Ramaraja", "Rambla", "Rammetto One", "Ranchers", "Rancho", "Ranga", "Rationale", "Ravi Prakash", "Redressed", "Reenie Beanie", "Revalia", "Rhodium Libre", "Ribeye", "Ribeye Marrow", "Righteous", "Risque", "Roboto", "Roboto Condensed", "Roboto Mono", "Roboto Slab", "Rochester", "Rock Salt", "Rokkitt", "Romanesco", "Ropa Sans", "Rosario", "Rosarivo", "Rouge Script", "Rozha One", "Rubik", "Rubik Mono One", "Rubik One", "Ruda", "Rufina", "Ruge Boogie", "Ruluko", "Rum Raisin", "Ruslan Display", "Russo One", "Ruthie", "Rye", "Sacramento", "Sahitya", "Sail", "Salsa", "Sanchez", "Sancreek", "Sansita One", "Sarala", "Sarina", "Sarpanch", "Satisfy", "Scada", "Scheherazade", "Schoolbell", "Seaweed Script", "Sevillana", "Seymour One", "Shadows Into Light", "Shadows Into Light Two", "Shanti", "Share", "Share Tech", "Share Tech Mono", "Shojumaru", "Short Stack", "Siemreap", "Sigmar One", "Signika", "Signika Negative", "Simonetta", "Sintony", "Sirin Stencil", "Six Caps", "Skranji", "Slabo 13px", "Slabo 27px", "Slackey", "Smokum", "Smythe", "Sniglet", "Snippet", "Snowburst One", "Sofadi One", "Sofia", "Sonsie One", "Sorts Mill Goudy", "Source Code Pro", "Source Sans Pro", "Source Serif Pro", "Special Elite", "Spicy Rice", "Spinnaker", "Spirax", "Squada One", "Sree Krushnadevaraya", "Stalemate", "Stalinist One", "Stardos Stencil", "Stint Ultra Condensed", "Stint Ultra Expanded", "Stoke", "Strait", "Sue Ellen Francisco", "Sumana", "Sunshiney", "Supermercado One", "Sura", "Suranna", "Suravaram", "Suwannaphum", "Swanky and Moo Moo", "Syncopate", "Tangerine", "Taprom", "Tauri", "Teko", "Telex", "Tenali Ramakrishna", "Tenor Sans", "Text Me One", "The Girl Next Door", "Tienne", "Tillana", "Timmana", "Tinos", "Titan One", "Titillium Web", "Trade Winds", "Trocchi", "Trochut", "Trykker", "Tulpen One", "Ubuntu", "Ubuntu Condensed", "Ubuntu Mono", "Ultra", "Uncial Antiqua", "Underdog", "Unica One", "UnifrakturCook", "UnifrakturMaguntia", "Unkempt", "Unlock", "Unna", "VT323", "Vampiro One", "Varela", "Varela Round", "Vast Shadow", "Vesper Libre", "Vibur", "Vidaloka", "Viga", "Voces", "Volkhov", "Vollkorn", "Voltaire", "Waiting for the Sunrise", "Wallpoet", "Walter Turncoat", "Warnes", "Wellfleet", "Wendy One", "Wire One", "Work Sans", "Yanone Kaffeesatz", "Yantramanav", "Yellowtail", "Yeseva One", "Yesteryear", "Zeyada"];\n}).call(this);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy93ZWJmb250LW1hdGNoZXIvbGliL2ZvbnRzL2dvb2dsZS5qcz9lYjdhIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMiLCJmaWxlIjoiNDIzOS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMC4wXG4oZnVuY3Rpb24gKCkge1xuICB2YXIgZmFtaWxpZXM7XG4gIG1vZHVsZS5leHBvcnRzID0ge1xuICAgIGljb246ICdpY29ucy9nb29nbGUuc3ZnJyxcbiAgICBuYW1lOiAnZ29vZ2xlJyxcbiAgICB0aXRsZTogJ0dvb2dsZSBGb250cycsXG4gICAgbGluazogJ2dvb2dsZS5jb20vZm9udHMnLFxuICAgIGdldE5hbWVzOiBmdW5jdGlvbiBnZXROYW1lcygpIHtcbiAgICAgIHJldHVybiBmYW1pbGllcztcbiAgICB9LFxuICAgIGdldExpbms6IGZ1bmN0aW9uIGdldExpbmsobmFtZSkge1xuICAgICAgcmV0dXJuIFwiaHR0cHM6Ly9mb250cy5nb29nbGUuY29tL3NwZWNpbWVuL1wiICsgbmFtZS5yZXBsYWNlKC8oICkvZywgJysnKTtcbiAgICB9LFxuICAgIG5vcm1hbGl6ZU5hbWU6IGZ1bmN0aW9uIG5vcm1hbGl6ZU5hbWUobmFtZSkge1xuICAgICAgcmV0dXJuIG5hbWU7XG4gICAgfVxuICB9O1xuICBmYW1pbGllcyA9IFtcIkFCZWVaZWVcIiwgXCJBYmVsXCIsIFwiQWJyaWwgRmF0ZmFjZVwiLCBcIkFjbG9uaWNhXCIsIFwiQWNtZVwiLCBcIkFjdG9yXCIsIFwiQWRhbWluYVwiLCBcIkFkdmVudCBQcm9cIiwgXCJBZ3VhZmluYSBTY3JpcHRcIiwgXCJBa3JvbmltXCIsIFwiQWxhZGluXCIsIFwiQWxkcmljaFwiLCBcIkFsZWZcIiwgXCJBbGVncmV5YVwiLCBcIkFsZWdyZXlhIFNDXCIsIFwiQWxlZ3JleWEgU2Fuc1wiLCBcIkFsZWdyZXlhIFNhbnMgU0NcIiwgXCJBbGV4IEJydXNoXCIsIFwiQWxmYSBTbGFiIE9uZVwiLCBcIkFsaWNlXCIsIFwiQWxpa2VcIiwgXCJBbGlrZSBBbmd1bGFyXCIsIFwiQWxsYW5cIiwgXCJBbGxlcnRhXCIsIFwiQWxsZXJ0YSBTdGVuY2lsXCIsIFwiQWxsdXJhXCIsIFwiQWxtZW5kcmFcIiwgXCJBbG1lbmRyYSBEaXNwbGF5XCIsIFwiQWxtZW5kcmEgU0NcIiwgXCJBbWFyYW50ZVwiLCBcIkFtYXJhbnRoXCIsIFwiQW1hdGljIFNDXCIsIFwiQW1ldGh5c3RhXCIsIFwiQW1pcmlcIiwgXCJBbWl0YVwiLCBcIkFuYWhlaW1cIiwgXCJBbmRhZGFcIiwgXCJBbmRpa2FcIiwgXCJBbmdrb3JcIiwgXCJBbm5pZSBVc2UgWW91ciBUZWxlc2NvcGVcIiwgXCJBbm9ueW1vdXMgUHJvXCIsIFwiQW50aWNcIiwgXCJBbnRpYyBEaWRvbmVcIiwgXCJBbnRpYyBTbGFiXCIsIFwiQW50b25cIiwgXCJBcmFwZXlcIiwgXCJBcmJ1dHVzXCIsIFwiQXJidXR1cyBTbGFiXCIsIFwiQXJjaGl0ZWN0cyBEYXVnaHRlclwiLCBcIkFyY2hpdm8gQmxhY2tcIiwgXCJBcmNoaXZvIE5hcnJvd1wiLCBcIkFyaW1vXCIsIFwiQXJpem9uaWFcIiwgXCJBcm1hdGFcIiwgXCJBcnRpZmlrYVwiLCBcIkFydm9cIiwgXCJBcnlhXCIsIFwiQXNhcFwiLCBcIkFzYXJcIiwgXCJBc3NldFwiLCBcIkFzdGxvY2hcIiwgXCJBc3VsXCIsIFwiQXRvbWljIEFnZVwiLCBcIkF1YnJleVwiLCBcIkF1ZGlvd2lkZVwiLCBcIkF1dG91ciBPbmVcIiwgXCJBdmVyYWdlXCIsIFwiQXZlcmFnZSBTYW5zXCIsIFwiQXZlcmlhIEdydWVzYSBMaWJyZVwiLCBcIkF2ZXJpYSBMaWJyZVwiLCBcIkF2ZXJpYSBTYW5zIExpYnJlXCIsIFwiQXZlcmlhIFNlcmlmIExpYnJlXCIsIFwiQmFkIFNjcmlwdFwiLCBcIkJhbHRoYXphclwiLCBcIkJhbmdlcnNcIiwgXCJCYXNpY1wiLCBcIkJhdHRhbWJhbmdcIiwgXCJCYXVtYW5zXCIsIFwiQmF5b25cIiwgXCJCZWxncmFub1wiLCBcIkJlbGxlemFcIiwgXCJCZW5jaE5pbmVcIiwgXCJCZW50aGFtXCIsIFwiQmVya3NoaXJlIFN3YXNoXCIsIFwiQmV2YW5cIiwgXCJCaWdlbG93IFJ1bGVzXCIsIFwiQmlnc2hvdCBPbmVcIiwgXCJCaWxib1wiLCBcIkJpbGJvIFN3YXNoIENhcHNcIiwgXCJCaXJ5YW5pXCIsIFwiQml0dGVyXCIsIFwiQmxhY2sgT3BzIE9uZVwiLCBcIkJva29yXCIsIFwiQm9uYm9uXCIsIFwiQm9vZ2Fsb29cIiwgXCJCb3dsYnkgT25lXCIsIFwiQm93bGJ5IE9uZSBTQ1wiLCBcIkJyYXdsZXJcIiwgXCJCcmVlIFNlcmlmXCIsIFwiQnViYmxlZ3VtIFNhbnNcIiwgXCJCdWJibGVyIE9uZVwiLCBcIkJ1ZGFcIiwgXCJCdWVuYXJkXCIsIFwiQnV0Y2hlcm1hblwiLCBcIkJ1dHRlcmZseSBLaWRzXCIsIFwiQ2FiaW5cIiwgXCJDYWJpbiBDb25kZW5zZWRcIiwgXCJDYWJpbiBTa2V0Y2hcIiwgXCJDYWVzYXIgRHJlc3NpbmdcIiwgXCJDYWdsaW9zdHJvXCIsIFwiQ2FsbGlncmFmZml0dGlcIiwgXCJDYW1iYXlcIiwgXCJDYW1ib1wiLCBcIkNhbmRhbFwiLCBcIkNhbnRhcmVsbFwiLCBcIkNhbnRhdGEgT25lXCIsIFwiQ2FudG9yYSBPbmVcIiwgXCJDYXByaW9sYVwiLCBcIkNhcmRvXCIsIFwiQ2FybWVcIiwgXCJDYXJyb2lzIEdvdGhpY1wiLCBcIkNhcnJvaXMgR290aGljIFNDXCIsIFwiQ2FydGVyIE9uZVwiLCBcIkNhdGFtYXJhblwiLCBcIkNhdWRleFwiLCBcIkNhdmVhdFwiLCBcIkNhdmVhdCBCcnVzaFwiLCBcIkNlZGFydmlsbGUgQ3Vyc2l2ZVwiLCBcIkNldmljaGUgT25lXCIsIFwiQ2hhbmdhIE9uZVwiLCBcIkNoYW5nb1wiLCBcIkNoYXUgUGhpbG9tZW5lIE9uZVwiLCBcIkNoZWxhIE9uZVwiLCBcIkNoZWxzZWEgTWFya2V0XCIsIFwiQ2hlbmxhXCIsIFwiQ2hlcnJ5IENyZWFtIFNvZGFcIiwgXCJDaGVycnkgU3dhc2hcIiwgXCJDaGV3eVwiLCBcIkNoaWNsZVwiLCBcIkNoaXZvXCIsIFwiQ2hvbmJ1cmlcIiwgXCJDaW56ZWxcIiwgXCJDaW56ZWwgRGVjb3JhdGl2ZVwiLCBcIkNsaWNrZXIgU2NyaXB0XCIsIFwiQ29kYVwiLCBcIkNvZGEgQ2FwdGlvblwiLCBcIkNvZHlzdGFyXCIsIFwiQ29tYm9cIiwgXCJDb21mb3J0YWFcIiwgXCJDb21pbmcgU29vblwiLCBcIkNvbmNlcnQgT25lXCIsIFwiQ29uZGltZW50XCIsIFwiQ29udGVudFwiLCBcIkNvbnRyYWlsIE9uZVwiLCBcIkNvbnZlcmdlbmNlXCIsIFwiQ29va2llXCIsIFwiQ29wc2VcIiwgXCJDb3JiZW5cIiwgXCJDb3VyZ2V0dGVcIiwgXCJDb3VzaW5lXCIsIFwiQ291c3RhcmRcIiwgXCJDb3ZlcmVkIEJ5IFlvdXIgR3JhY2VcIiwgXCJDcmFmdHkgR2lybHNcIiwgXCJDcmVlcHN0ZXJcIiwgXCJDcmV0ZSBSb3VuZFwiLCBcIkNyaW1zb24gVGV4dFwiLCBcIkNyb2lzc2FudCBPbmVcIiwgXCJDcnVzaGVkXCIsIFwiQ3VwcnVtXCIsIFwiQ3V0aXZlXCIsIFwiQ3V0aXZlIE1vbm9cIiwgXCJEYW1pb25cIiwgXCJEYW5jaW5nIFNjcmlwdFwiLCBcIkRhbmdyZWtcIiwgXCJEYXduaW5nIG9mIGEgTmV3IERheVwiLCBcIkRheXMgT25lXCIsIFwiRGVra29cIiwgXCJEZWxpdXNcIiwgXCJEZWxpdXMgU3dhc2ggQ2Fwc1wiLCBcIkRlbGl1cyBVbmljYXNlXCIsIFwiRGVsbGEgUmVzcGlyYVwiLCBcIkRlbmsgT25lXCIsIFwiRGV2b25zaGlyZVwiLCBcIkRodXJqYXRpXCIsIFwiRGlkYWN0IEdvdGhpY1wiLCBcIkRpcGxvbWF0YVwiLCBcIkRpcGxvbWF0YSBTQ1wiLCBcIkRvbWluZVwiLCBcIkRvbmVnYWwgT25lXCIsIFwiRG9wcGlvIE9uZVwiLCBcIkRvcnNhXCIsIFwiRG9zaXNcIiwgXCJEciBTdWdpeWFtYVwiLCBcIkRyb2lkIFNhbnNcIiwgXCJEcm9pZCBTYW5zIE1vbm9cIiwgXCJEcm9pZCBTZXJpZlwiLCBcIkR1cnUgU2Fuc1wiLCBcIkR5bmFsaWdodFwiLCBcIkVCIEdhcmFtb25kXCIsIFwiRWFnbGUgTGFrZVwiLCBcIkVhdGVyXCIsIFwiRWNvbm9taWNhXCIsIFwiRWN6YXJcIiwgXCJFayBNdWt0YVwiLCBcIkVsZWN0cm9saXplXCIsIFwiRWxzaWVcIiwgXCJFbHNpZSBTd2FzaCBDYXBzXCIsIFwiRW1ibGVtYSBPbmVcIiwgXCJFbWlseXMgQ2FuZHlcIiwgXCJFbmdhZ2VtZW50XCIsIFwiRW5nbGViZXJ0XCIsIFwiRW5yaXF1ZXRhXCIsIFwiRXJpY2EgT25lXCIsIFwiRXN0ZWJhblwiLCBcIkV1cGhvcmlhIFNjcmlwdFwiLCBcIkV3ZXJ0XCIsIFwiRXhvXCIsIFwiRXhvIDJcIiwgXCJFeHBsZXR1cyBTYW5zXCIsIFwiRmFud29vZCBUZXh0XCIsIFwiRmFzY2luYXRlXCIsIFwiRmFzY2luYXRlIElubGluZVwiLCBcIkZhc3RlciBPbmVcIiwgXCJGYXN0aGFuZFwiLCBcIkZhdW5hIE9uZVwiLCBcIkZlZGVyYW50XCIsIFwiRmVkZXJvXCIsIFwiRmVsaXBhXCIsIFwiRmVuaXhcIiwgXCJGaW5nZXIgUGFpbnRcIiwgXCJGaXJhIE1vbm9cIiwgXCJGaXJhIFNhbnNcIiwgXCJGamFsbGEgT25lXCIsIFwiRmpvcmQgT25lXCIsIFwiRmxhbWVuY29cIiwgXCJGbGF2b3JzXCIsIFwiRm9uZGFtZW50b1wiLCBcIkZvbnRkaW5lciBTd2Fua3lcIiwgXCJGb3J1bVwiLCBcIkZyYW5jb2lzIE9uZVwiLCBcIkZyZWNrbGUgRmFjZVwiLCBcIkZyZWRlcmlja2EgdGhlIEdyZWF0XCIsIFwiRnJlZG9rYSBPbmVcIiwgXCJGcmVlaGFuZFwiLCBcIkZyZXNjYVwiLCBcIkZyaWpvbGVcIiwgXCJGcnVrdHVyXCIsIFwiRnVnYXogT25lXCIsIFwiR0ZTIERpZG90XCIsIFwiR0ZTIE5lb2hlbGxlbmljXCIsIFwiR2FicmllbGFcIiwgXCJHYWZhdGFcIiwgXCJHYWxkZWFub1wiLCBcIkdhbGluZG9cIiwgXCJHZW50aXVtIEJhc2ljXCIsIFwiR2VudGl1bSBCb29rIEJhc2ljXCIsIFwiR2VvXCIsIFwiR2Vvc3RhclwiLCBcIkdlb3N0YXIgRmlsbFwiLCBcIkdlcm1hbmlhIE9uZVwiLCBcIkdpZHVndVwiLCBcIkdpbGRhIERpc3BsYXlcIiwgXCJHaXZlIFlvdSBHbG9yeVwiLCBcIkdsYXNzIEFudGlxdWFcIiwgXCJHbGVnb29cIiwgXCJHbG9yaWEgSGFsbGVsdWphaFwiLCBcIkdvYmxpbiBPbmVcIiwgXCJHb2NoaSBIYW5kXCIsIFwiR29yZGl0YXNcIiwgXCJHb3VkeSBCb29rbGV0dGVyIDE5MTFcIiwgXCJHcmFkdWF0ZVwiLCBcIkdyYW5kIEhvdGVsXCIsIFwiR3Jhdml0YXMgT25lXCIsIFwiR3JlYXQgVmliZXNcIiwgXCJHcmlmZnlcIiwgXCJHcnVwcG9cIiwgXCJHdWRlYVwiLCBcIkd1cmFqYWRhXCIsIFwiSGFiaWJpXCIsIFwiSGFsYW50XCIsIFwiSGFtbWVyc21pdGggT25lXCIsIFwiSGFuYWxlaVwiLCBcIkhhbmFsZWkgRmlsbFwiLCBcIkhhbmRsZWVcIiwgXCJIYW51bWFuXCIsIFwiSGFwcHkgTW9ua2V5XCIsIFwiSGVhZGxhbmQgT25lXCIsIFwiSGVubnkgUGVubnlcIiwgXCJIZXJyIFZvbiBNdWVsbGVyaG9mZlwiLCBcIkhpbmRcIiwgXCJIaW5kIFNpbGlndXJpXCIsIFwiSGluZCBWYWRvZGFyYVwiLCBcIkhvbHR3b29kIE9uZSBTQ1wiLCBcIkhvbWVtYWRlIEFwcGxlXCIsIFwiSG9tZW5hamVcIiwgXCJJTSBGZWxsIERXIFBpY2FcIiwgXCJJTSBGZWxsIERXIFBpY2EgU0NcIiwgXCJJTSBGZWxsIERvdWJsZSBQaWNhXCIsIFwiSU0gRmVsbCBEb3VibGUgUGljYSBTQ1wiLCBcIklNIEZlbGwgRW5nbGlzaFwiLCBcIklNIEZlbGwgRW5nbGlzaCBTQ1wiLCBcIklNIEZlbGwgRnJlbmNoIENhbm9uXCIsIFwiSU0gRmVsbCBGcmVuY2ggQ2Fub24gU0NcIiwgXCJJTSBGZWxsIEdyZWF0IFByaW1lclwiLCBcIklNIEZlbGwgR3JlYXQgUHJpbWVyIFNDXCIsIFwiSWNlYmVyZ1wiLCBcIkljZWxhbmRcIiwgXCJJbXByaW1hXCIsIFwiSW5jb25zb2xhdGFcIiwgXCJJbmRlclwiLCBcIkluZGllIEZsb3dlclwiLCBcIkluaWthXCIsIFwiSW5rbnV0IEFudGlxdWFcIiwgXCJJcmlzaCBHcm92ZXJcIiwgXCJJc3RvayBXZWJcIiwgXCJJdGFsaWFuYVwiLCBcIkl0YWxpYW5ub1wiLCBcIkl0aW1cIiwgXCJKYWNxdWVzIEZyYW5jb2lzXCIsIFwiSmFjcXVlcyBGcmFuY29pcyBTaGFkb3dcIiwgXCJKYWxkaVwiLCBcIkppbSBOaWdodHNoYWRlXCIsIFwiSm9ja2V5IE9uZVwiLCBcIkpvbGx5IExvZGdlclwiLCBcIkpvc2VmaW4gU2Fuc1wiLCBcIkpvc2VmaW4gU2xhYlwiLCBcIkpvdGkgT25lXCIsIFwiSnVkc29uXCIsIFwiSnVsZWVcIiwgXCJKdWxpdXMgU2FucyBPbmVcIiwgXCJKdW5nZVwiLCBcIkp1cmFcIiwgXCJKdXN0IEFub3RoZXIgSGFuZFwiLCBcIkp1c3QgTWUgQWdhaW4gRG93biBIZXJlXCIsIFwiS2Fkd2FcIiwgXCJLYWxhbVwiLCBcIkthbWVyb25cIiwgXCJLYW50dW1ydXlcIiwgXCJLYXJsYVwiLCBcIkthcm1hXCIsIFwiS2F1c2hhbiBTY3JpcHRcIiwgXCJLYXZvb25cIiwgXCJLZGFtIFRobW9yXCIsIFwiS2VhbmlhIE9uZVwiLCBcIktlbGx5IFNsYWJcIiwgXCJLZW5pYVwiLCBcIktoYW5kXCIsIFwiS2htZXJcIiwgXCJLaHVsYVwiLCBcIktpdGUgT25lXCIsIFwiS25ld2F2ZVwiLCBcIktvdHRhIE9uZVwiLCBcIktvdWxlblwiLCBcIktyYW5reVwiLCBcIktyZW9uXCIsIFwiS3Jpc3RpXCIsIFwiS3JvbmEgT25lXCIsIFwiS3VyYWxlXCIsIFwiTGEgQmVsbGUgQXVyb3JlXCIsIFwiTGFpbGFcIiwgXCJMYWtraSBSZWRkeVwiLCBcIkxhbmNlbG90XCIsIFwiTGF0ZWVmXCIsIFwiTGF0b1wiLCBcIkxlYWd1ZSBTY3JpcHRcIiwgXCJMZWNrZXJsaSBPbmVcIiwgXCJMZWRnZXJcIiwgXCJMZWt0b25cIiwgXCJMZW1vblwiLCBcIkxpYnJlIEJhc2tlcnZpbGxlXCIsIFwiTGlmZSBTYXZlcnNcIiwgXCJMaWxpdGEgT25lXCIsIFwiTGlseSBTY3JpcHQgT25lXCIsIFwiTGltZWxpZ2h0XCIsIFwiTGluZGVuIEhpbGxcIiwgXCJMb2JzdGVyXCIsIFwiTG9ic3RlciBUd29cIiwgXCJMb25kcmluYSBPdXRsaW5lXCIsIFwiTG9uZHJpbmEgU2hhZG93XCIsIFwiTG9uZHJpbmEgU2tldGNoXCIsIFwiTG9uZHJpbmEgU29saWRcIiwgXCJMb3JhXCIsIFwiTG92ZSBZYSBMaWtlIEEgU2lzdGVyXCIsIFwiTG92ZWQgYnkgdGhlIEtpbmdcIiwgXCJMb3ZlcnMgUXVhcnJlbFwiLCBcIkx1Y2tpZXN0IEd1eVwiLCBcIkx1c2l0YW5hXCIsIFwiTHVzdHJpYVwiLCBcIk1hY29uZG9cIiwgXCJNYWNvbmRvIFN3YXNoIENhcHNcIiwgXCJNYWdyYVwiLCBcIk1haWRlbiBPcmFuZ2VcIiwgXCJNYWtvXCIsIFwiTWFsbGFubmFcIiwgXCJNYW5kYWxpXCIsIFwiTWFyY2VsbHVzXCIsIFwiTWFyY2VsbHVzIFNDXCIsIFwiTWFyY2sgU2NyaXB0XCIsIFwiTWFyZ2FyaW5lXCIsIFwiTWFya28gT25lXCIsIFwiTWFybWVsYWRcIiwgXCJNYXJ0ZWxcIiwgXCJNYXJ0ZWwgU2Fuc1wiLCBcIk1hcnZlbFwiLCBcIk1hdGVcIiwgXCJNYXRlIFNDXCIsIFwiTWF2ZW4gUHJvXCIsIFwiTWNMYXJlblwiLCBcIk1lZGRvblwiLCBcIk1lZGlldmFsU2hhcnBcIiwgXCJNZWR1bGEgT25lXCIsIFwiTWVncmltXCIsIFwiTWVpZSBTY3JpcHRcIiwgXCJNZXJpZW5kYVwiLCBcIk1lcmllbmRhIE9uZVwiLCBcIk1lcnJpd2VhdGhlclwiLCBcIk1lcnJpd2VhdGhlciBTYW5zXCIsIFwiTWV0YWxcIiwgXCJNZXRhbCBNYW5pYVwiLCBcIk1ldGFtb3JwaG91c1wiLCBcIk1ldHJvcGhvYmljXCIsIFwiTWljaHJvbWFcIiwgXCJNaWxvbmdhXCIsIFwiTWlsdG9uaWFuXCIsIFwiTWlsdG9uaWFuIFRhdHRvb1wiLCBcIk1pbml2ZXJcIiwgXCJNaXNzIEZhamFyZG9zZVwiLCBcIk1vZGFrXCIsIFwiTW9kZXJuIEFudGlxdWFcIiwgXCJNb2xlbmdvXCIsIFwiTW9sbGVcIiwgXCJNb25kYVwiLCBcIk1vbm9mZXR0XCIsIFwiTW9ub3RvblwiLCBcIk1vbnNpZXVyIExhIERvdWxhaXNlXCIsIFwiTW9udGFnYVwiLCBcIk1vbnRlelwiLCBcIk1vbnRzZXJyYXRcIiwgXCJNb250c2VycmF0IEFsdGVybmF0ZXNcIiwgXCJNb250c2VycmF0IFN1YnJheWFkYVwiLCBcIk1vdWxcIiwgXCJNb3VscGFsaVwiLCBcIk1vdW50YWlucyBvZiBDaHJpc3RtYXNcIiwgXCJNb3VzZSBNZW1vaXJzXCIsIFwiTXIgQmVkZm9ydFwiLCBcIk1yIERhZm9lXCIsIFwiTXIgRGUgSGF2aWxhbmRcIiwgXCJNcnMgU2FpbnQgRGVsYWZpZWxkXCIsIFwiTXJzIFNoZXBwYXJkc1wiLCBcIk11bGlcIiwgXCJNeXN0ZXJ5IFF1ZXN0XCIsIFwiTlRSXCIsIFwiTmV1Y2hhXCIsIFwiTmV1dG9uXCIsIFwiTmV3IFJvY2tlclwiLCBcIk5ld3MgQ3ljbGVcIiwgXCJOaWNvbm5lXCIsIFwiTml4aWUgT25lXCIsIFwiTm9iaWxlXCIsIFwiTm9rb3JhXCIsIFwiTm9yaWNhblwiLCBcIk5vc2lmZXJcIiwgXCJOb3RoaW5nIFlvdSBDb3VsZCBEb1wiLCBcIk5vdGljaWEgVGV4dFwiLCBcIk5vdG8gU2Fuc1wiLCBcIk5vdG8gU2VyaWZcIiwgXCJOb3ZhIEN1dFwiLCBcIk5vdmEgRmxhdFwiLCBcIk5vdmEgTW9ub1wiLCBcIk5vdmEgT3ZhbFwiLCBcIk5vdmEgUm91bmRcIiwgXCJOb3ZhIFNjcmlwdFwiLCBcIk5vdmEgU2xpbVwiLCBcIk5vdmEgU3F1YXJlXCIsIFwiTnVtYW5zXCIsIFwiTnVuaXRvXCIsIFwiT2RvciBNZWFuIENoZXlcIiwgXCJPZmZzaWRlXCIsIFwiT2xkIFN0YW5kYXJkIFRUXCIsIFwiT2xkZW5idXJnXCIsIFwiT2xlbyBTY3JpcHRcIiwgXCJPbGVvIFNjcmlwdCBTd2FzaCBDYXBzXCIsIFwiT3BlbiBTYW5zXCIsIFwiT3BlbiBTYW5zIENvbmRlbnNlZFwiLCBcIk9yYW5pZW5iYXVtXCIsIFwiT3JiaXRyb25cIiwgXCJPcmVnYW5vXCIsIFwiT3JpZW50YVwiLCBcIk9yaWdpbmFsIFN1cmZlclwiLCBcIk9zd2FsZFwiLCBcIk92ZXIgdGhlIFJhaW5ib3dcIiwgXCJPdmVybG9ja1wiLCBcIk92ZXJsb2NrIFNDXCIsIFwiT3ZvXCIsIFwiT3h5Z2VuXCIsIFwiT3h5Z2VuIE1vbm9cIiwgXCJQVCBNb25vXCIsIFwiUFQgU2Fuc1wiLCBcIlBUIFNhbnMgQ2FwdGlvblwiLCBcIlBUIFNhbnMgTmFycm93XCIsIFwiUFQgU2VyaWZcIiwgXCJQVCBTZXJpZiBDYXB0aW9uXCIsIFwiUGFjaWZpY29cIiwgXCJQYWxhbnF1aW5cIiwgXCJQYWxhbnF1aW4gRGFya1wiLCBcIlBhcHJpa2FcIiwgXCJQYXJpc2llbm5lXCIsIFwiUGFzc2VybyBPbmVcIiwgXCJQYXNzaW9uIE9uZVwiLCBcIlBhdGh3YXkgR290aGljIE9uZVwiLCBcIlBhdHJpY2sgSGFuZFwiLCBcIlBhdHJpY2sgSGFuZCBTQ1wiLCBcIlBhdHVhIE9uZVwiLCBcIlBheXRvbmUgT25lXCIsIFwiUGVkZGFuYVwiLCBcIlBlcmFsdGFcIiwgXCJQZXJtYW5lbnQgTWFya2VyXCIsIFwiUGV0aXQgRm9ybWFsIFNjcmlwdFwiLCBcIlBldHJvbmFcIiwgXCJQaGlsb3NvcGhlclwiLCBcIlBpZWRyYVwiLCBcIlBpbnlvbiBTY3JpcHRcIiwgXCJQaXJhdGEgT25lXCIsIFwiUGxhc3RlclwiLCBcIlBsYXlcIiwgXCJQbGF5YmFsbFwiLCBcIlBsYXlmYWlyIERpc3BsYXlcIiwgXCJQbGF5ZmFpciBEaXNwbGF5IFNDXCIsIFwiUG9ka292YVwiLCBcIlBvaXJldCBPbmVcIiwgXCJQb2xsZXIgT25lXCIsIFwiUG9seVwiLCBcIlBvbXBpZXJlXCIsIFwiUG9udGFubyBTYW5zXCIsIFwiUG9wcGluc1wiLCBcIlBvcnQgTGxpZ2F0IFNhbnNcIiwgXCJQb3J0IExsaWdhdCBTbGFiXCIsIFwiUHJhZ2F0aSBOYXJyb3dcIiwgXCJQcmF0YVwiLCBcIlByZWFodmloZWFyXCIsIFwiUHJlc3MgU3RhcnQgMlBcIiwgXCJQcmluY2VzcyBTb2ZpYVwiLCBcIlByb2Npb25vXCIsIFwiUHJvc3RvIE9uZVwiLCBcIlB1cml0YW5cIiwgXCJQdXJwbGUgUHVyc2VcIiwgXCJRdWFuZG9cIiwgXCJRdWFudGljb1wiLCBcIlF1YXR0cm9jZW50b1wiLCBcIlF1YXR0cm9jZW50byBTYW5zXCIsIFwiUXVlc3RyaWFsXCIsIFwiUXVpY2tzYW5kXCIsIFwiUXVpbnRlc3NlbnRpYWxcIiwgXCJRd2lnbGV5XCIsIFwiUmFjaW5nIFNhbnMgT25lXCIsIFwiUmFkbGV5XCIsIFwiUmFqZGhhbmlcIiwgXCJSYWxld2F5XCIsIFwiUmFsZXdheSBEb3RzXCIsIFwiUmFtYWJoYWRyYVwiLCBcIlJhbWFyYWphXCIsIFwiUmFtYmxhXCIsIFwiUmFtbWV0dG8gT25lXCIsIFwiUmFuY2hlcnNcIiwgXCJSYW5jaG9cIiwgXCJSYW5nYVwiLCBcIlJhdGlvbmFsZVwiLCBcIlJhdmkgUHJha2FzaFwiLCBcIlJlZHJlc3NlZFwiLCBcIlJlZW5pZSBCZWFuaWVcIiwgXCJSZXZhbGlhXCIsIFwiUmhvZGl1bSBMaWJyZVwiLCBcIlJpYmV5ZVwiLCBcIlJpYmV5ZSBNYXJyb3dcIiwgXCJSaWdodGVvdXNcIiwgXCJSaXNxdWVcIiwgXCJSb2JvdG9cIiwgXCJSb2JvdG8gQ29uZGVuc2VkXCIsIFwiUm9ib3RvIE1vbm9cIiwgXCJSb2JvdG8gU2xhYlwiLCBcIlJvY2hlc3RlclwiLCBcIlJvY2sgU2FsdFwiLCBcIlJva2tpdHRcIiwgXCJSb21hbmVzY29cIiwgXCJSb3BhIFNhbnNcIiwgXCJSb3NhcmlvXCIsIFwiUm9zYXJpdm9cIiwgXCJSb3VnZSBTY3JpcHRcIiwgXCJSb3poYSBPbmVcIiwgXCJSdWJpa1wiLCBcIlJ1YmlrIE1vbm8gT25lXCIsIFwiUnViaWsgT25lXCIsIFwiUnVkYVwiLCBcIlJ1ZmluYVwiLCBcIlJ1Z2UgQm9vZ2llXCIsIFwiUnVsdWtvXCIsIFwiUnVtIFJhaXNpblwiLCBcIlJ1c2xhbiBEaXNwbGF5XCIsIFwiUnVzc28gT25lXCIsIFwiUnV0aGllXCIsIFwiUnllXCIsIFwiU2FjcmFtZW50b1wiLCBcIlNhaGl0eWFcIiwgXCJTYWlsXCIsIFwiU2Fsc2FcIiwgXCJTYW5jaGV6XCIsIFwiU2FuY3JlZWtcIiwgXCJTYW5zaXRhIE9uZVwiLCBcIlNhcmFsYVwiLCBcIlNhcmluYVwiLCBcIlNhcnBhbmNoXCIsIFwiU2F0aXNmeVwiLCBcIlNjYWRhXCIsIFwiU2NoZWhlcmF6YWRlXCIsIFwiU2Nob29sYmVsbFwiLCBcIlNlYXdlZWQgU2NyaXB0XCIsIFwiU2V2aWxsYW5hXCIsIFwiU2V5bW91ciBPbmVcIiwgXCJTaGFkb3dzIEludG8gTGlnaHRcIiwgXCJTaGFkb3dzIEludG8gTGlnaHQgVHdvXCIsIFwiU2hhbnRpXCIsIFwiU2hhcmVcIiwgXCJTaGFyZSBUZWNoXCIsIFwiU2hhcmUgVGVjaCBNb25vXCIsIFwiU2hvanVtYXJ1XCIsIFwiU2hvcnQgU3RhY2tcIiwgXCJTaWVtcmVhcFwiLCBcIlNpZ21hciBPbmVcIiwgXCJTaWduaWthXCIsIFwiU2lnbmlrYSBOZWdhdGl2ZVwiLCBcIlNpbW9uZXR0YVwiLCBcIlNpbnRvbnlcIiwgXCJTaXJpbiBTdGVuY2lsXCIsIFwiU2l4IENhcHNcIiwgXCJTa3JhbmppXCIsIFwiU2xhYm8gMTNweFwiLCBcIlNsYWJvIDI3cHhcIiwgXCJTbGFja2V5XCIsIFwiU21va3VtXCIsIFwiU215dGhlXCIsIFwiU25pZ2xldFwiLCBcIlNuaXBwZXRcIiwgXCJTbm93YnVyc3QgT25lXCIsIFwiU29mYWRpIE9uZVwiLCBcIlNvZmlhXCIsIFwiU29uc2llIE9uZVwiLCBcIlNvcnRzIE1pbGwgR291ZHlcIiwgXCJTb3VyY2UgQ29kZSBQcm9cIiwgXCJTb3VyY2UgU2FucyBQcm9cIiwgXCJTb3VyY2UgU2VyaWYgUHJvXCIsIFwiU3BlY2lhbCBFbGl0ZVwiLCBcIlNwaWN5IFJpY2VcIiwgXCJTcGlubmFrZXJcIiwgXCJTcGlyYXhcIiwgXCJTcXVhZGEgT25lXCIsIFwiU3JlZSBLcnVzaG5hZGV2YXJheWFcIiwgXCJTdGFsZW1hdGVcIiwgXCJTdGFsaW5pc3QgT25lXCIsIFwiU3RhcmRvcyBTdGVuY2lsXCIsIFwiU3RpbnQgVWx0cmEgQ29uZGVuc2VkXCIsIFwiU3RpbnQgVWx0cmEgRXhwYW5kZWRcIiwgXCJTdG9rZVwiLCBcIlN0cmFpdFwiLCBcIlN1ZSBFbGxlbiBGcmFuY2lzY29cIiwgXCJTdW1hbmFcIiwgXCJTdW5zaGluZXlcIiwgXCJTdXBlcm1lcmNhZG8gT25lXCIsIFwiU3VyYVwiLCBcIlN1cmFubmFcIiwgXCJTdXJhdmFyYW1cIiwgXCJTdXdhbm5hcGh1bVwiLCBcIlN3YW5reSBhbmQgTW9vIE1vb1wiLCBcIlN5bmNvcGF0ZVwiLCBcIlRhbmdlcmluZVwiLCBcIlRhcHJvbVwiLCBcIlRhdXJpXCIsIFwiVGVrb1wiLCBcIlRlbGV4XCIsIFwiVGVuYWxpIFJhbWFrcmlzaG5hXCIsIFwiVGVub3IgU2Fuc1wiLCBcIlRleHQgTWUgT25lXCIsIFwiVGhlIEdpcmwgTmV4dCBEb29yXCIsIFwiVGllbm5lXCIsIFwiVGlsbGFuYVwiLCBcIlRpbW1hbmFcIiwgXCJUaW5vc1wiLCBcIlRpdGFuIE9uZVwiLCBcIlRpdGlsbGl1bSBXZWJcIiwgXCJUcmFkZSBXaW5kc1wiLCBcIlRyb2NjaGlcIiwgXCJUcm9jaHV0XCIsIFwiVHJ5a2tlclwiLCBcIlR1bHBlbiBPbmVcIiwgXCJVYnVudHVcIiwgXCJVYnVudHUgQ29uZGVuc2VkXCIsIFwiVWJ1bnR1IE1vbm9cIiwgXCJVbHRyYVwiLCBcIlVuY2lhbCBBbnRpcXVhXCIsIFwiVW5kZXJkb2dcIiwgXCJVbmljYSBPbmVcIiwgXCJVbmlmcmFrdHVyQ29va1wiLCBcIlVuaWZyYWt0dXJNYWd1bnRpYVwiLCBcIlVua2VtcHRcIiwgXCJVbmxvY2tcIiwgXCJVbm5hXCIsIFwiVlQzMjNcIiwgXCJWYW1waXJvIE9uZVwiLCBcIlZhcmVsYVwiLCBcIlZhcmVsYSBSb3VuZFwiLCBcIlZhc3QgU2hhZG93XCIsIFwiVmVzcGVyIExpYnJlXCIsIFwiVmlidXJcIiwgXCJWaWRhbG9rYVwiLCBcIlZpZ2FcIiwgXCJWb2Nlc1wiLCBcIlZvbGtob3ZcIiwgXCJWb2xsa29yblwiLCBcIlZvbHRhaXJlXCIsIFwiV2FpdGluZyBmb3IgdGhlIFN1bnJpc2VcIiwgXCJXYWxscG9ldFwiLCBcIldhbHRlciBUdXJuY29hdFwiLCBcIldhcm5lc1wiLCBcIldlbGxmbGVldFwiLCBcIldlbmR5IE9uZVwiLCBcIldpcmUgT25lXCIsIFwiV29yayBTYW5zXCIsIFwiWWFub25lIEthZmZlZXNhdHpcIiwgXCJZYW50cmFtYW5hdlwiLCBcIlllbGxvd3RhaWxcIiwgXCJZZXNldmEgT25lXCIsIFwiWWVzdGVyeWVhclwiLCBcIlpleWFkYVwiXTtcbn0pLmNhbGwodGhpcyk7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4239\n')},5417:function(module,__unused_webpack_exports,__webpack_require__){eval("var isObject = __webpack_require__(111);\nvar isArray = __webpack_require__(3157);\nvar wellKnownSymbol = __webpack_require__(5112);\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `ArraySpeciesCreate` abstract operation\n// https://tc39.es/ecma262/#sec-arrayspeciescreate\nmodule.exports = function (originalArray, length) {\n var C;\n if (isArray(originalArray)) {\n C = originalArray.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n else if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return new (C === undefined ? Array : C)(length === 0 ? 0 : length);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZS5qcz82NWYwIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGVBQWUsbUJBQU8sQ0FBQyxHQUF3QjtBQUMvQyxjQUFjLG1CQUFPLENBQUMsSUFBdUI7QUFDN0Msc0JBQXNCLG1CQUFPLENBQUMsSUFBZ0M7O0FBRTlEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCIsImZpbGUiOiI1NDE3LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXknKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcblxuLy8gYEFycmF5U3BlY2llc0NyZWF0ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5c3BlY2llc2NyZWF0ZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3JpZ2luYWxBcnJheSwgbGVuZ3RoKSB7XG4gIHZhciBDO1xuICBpZiAoaXNBcnJheShvcmlnaW5hbEFycmF5KSkge1xuICAgIEMgPSBvcmlnaW5hbEFycmF5LmNvbnN0cnVjdG9yO1xuICAgIC8vIGNyb3NzLXJlYWxtIGZhbGxiYWNrXG4gICAgaWYgKHR5cGVvZiBDID09ICdmdW5jdGlvbicgJiYgKEMgPT09IEFycmF5IHx8IGlzQXJyYXkoQy5wcm90b3R5cGUpKSkgQyA9IHVuZGVmaW5lZDtcbiAgICBlbHNlIGlmIChpc09iamVjdChDKSkge1xuICAgICAgQyA9IENbU1BFQ0lFU107XG4gICAgICBpZiAoQyA9PT0gbnVsbCkgQyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0gcmV0dXJuIG5ldyAoQyA9PT0gdW5kZWZpbmVkID8gQXJyYXkgOiBDKShsZW5ndGggPT09IDAgPyAwIDogbGVuZ3RoKTtcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5417\n")},6790:function(module,__unused_webpack_exports,__webpack_require__){"use strict";eval("\nvar isArray = __webpack_require__(3157);\nvar toLength = __webpack_require__(7466);\nvar bind = __webpack_require__(9974);\n\n// `FlattenIntoArray` abstract operation\n// https://tc39.github.io/proposal-flatMap/#sec-FlattenIntoArray\nvar flattenIntoArray = function (target, original, source, sourceLen, start, depth, mapper, thisArg) {\n var targetIndex = start;\n var sourceIndex = 0;\n var mapFn = mapper ? bind(mapper, thisArg, 3) : false;\n var element;\n\n while (sourceIndex < sourceLen) {\n if (sourceIndex in source) {\n element = mapFn ? mapFn(source[sourceIndex], sourceIndex, original) : source[sourceIndex];\n\n if (depth > 0 && isArray(element)) {\n targetIndex = flattenIntoArray(target, original, element, toLength(element.length), targetIndex, depth - 1) - 1;\n } else {\n if (targetIndex >= 0x1FFFFFFFFFFFFF) throw TypeError('Exceed the acceptable array length');\n target[targetIndex] = element;\n }\n\n targetIndex++;\n }\n sourceIndex++;\n }\n return targetIndex;\n};\n\nmodule.exports = flattenIntoArray;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mbGF0dGVuLWludG8tYXJyYXkuanM/YTJiZiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTtBQUNiLGNBQWMsbUJBQU8sQ0FBQyxJQUF1QjtBQUM3QyxlQUFlLG1CQUFPLENBQUMsSUFBd0I7QUFDL0MsV0FBVyxtQkFBTyxDQUFDLElBQW9DOztBQUV2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjY3OTAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheScpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG5cbi8vIGBGbGF0dGVuSW50b0FycmF5YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtZmxhdE1hcC8jc2VjLUZsYXR0ZW5JbnRvQXJyYXlcbnZhciBmbGF0dGVuSW50b0FycmF5ID0gZnVuY3Rpb24gKHRhcmdldCwgb3JpZ2luYWwsIHNvdXJjZSwgc291cmNlTGVuLCBzdGFydCwgZGVwdGgsIG1hcHBlciwgdGhpc0FyZykge1xuICB2YXIgdGFyZ2V0SW5kZXggPSBzdGFydDtcbiAgdmFyIHNvdXJjZUluZGV4ID0gMDtcbiAgdmFyIG1hcEZuID0gbWFwcGVyID8gYmluZChtYXBwZXIsIHRoaXNBcmcsIDMpIDogZmFsc2U7XG4gIHZhciBlbGVtZW50O1xuXG4gIHdoaWxlIChzb3VyY2VJbmRleCA8IHNvdXJjZUxlbikge1xuICAgIGlmIChzb3VyY2VJbmRleCBpbiBzb3VyY2UpIHtcbiAgICAgIGVsZW1lbnQgPSBtYXBGbiA/IG1hcEZuKHNvdXJjZVtzb3VyY2VJbmRleF0sIHNvdXJjZUluZGV4LCBvcmlnaW5hbCkgOiBzb3VyY2Vbc291cmNlSW5kZXhdO1xuXG4gICAgICBpZiAoZGVwdGggPiAwICYmIGlzQXJyYXkoZWxlbWVudCkpIHtcbiAgICAgICAgdGFyZ2V0SW5kZXggPSBmbGF0dGVuSW50b0FycmF5KHRhcmdldCwgb3JpZ2luYWwsIGVsZW1lbnQsIHRvTGVuZ3RoKGVsZW1lbnQubGVuZ3RoKSwgdGFyZ2V0SW5kZXgsIGRlcHRoIC0gMSkgLSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRhcmdldEluZGV4ID49IDB4MUZGRkZGRkZGRkZGRkYpIHRocm93IFR5cGVFcnJvcignRXhjZWVkIHRoZSBhY2NlcHRhYmxlIGFycmF5IGxlbmd0aCcpO1xuICAgICAgICB0YXJnZXRbdGFyZ2V0SW5kZXhdID0gZWxlbWVudDtcbiAgICAgIH1cblxuICAgICAgdGFyZ2V0SW5kZXgrKztcbiAgICB9XG4gICAgc291cmNlSW5kZXgrKztcbiAgfVxuICByZXR1cm4gdGFyZ2V0SW5kZXg7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZsYXR0ZW5JbnRvQXJyYXk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///6790\n")},9974:function(module,__unused_webpack_exports,__webpack_require__){eval("var aFunction = __webpack_require__(3099);\n\n// optional / simple context binding\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 0: return function () {\n return fn.call(that);\n };\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQuanM/MDM2NiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxnQkFBZ0IsbUJBQU8sQ0FBQyxJQUF5Qjs7QUFFakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiOTk3NC5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xuXG4vLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuLCB0aGF0LCBsZW5ndGgpIHtcbiAgYUZ1bmN0aW9uKGZuKTtcbiAgaWYgKHRoYXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZuO1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgMDogcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQpO1xuICAgIH07XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24gKGEpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEpO1xuICAgIH07XG4gICAgY2FzZSAyOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIpO1xuICAgIH07XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIsIGMpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIsIGMpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uICgvKiAuLi5hcmdzICovKSB7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3VtZW50cyk7XG4gIH07XG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///9974\n")},3157:function(module,__unused_webpack_exports,__webpack_require__){eval("var classof = __webpack_require__(4326);\n\n// `IsArray` abstract operation\n// https://tc39.es/ecma262/#sec-isarray\n// eslint-disable-next-line es/no-array-isarray -- safe\nmodule.exports = Array.isArray || function isArray(arg) {\n return classof(arg) == 'Array';\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1hcnJheS5qcz9lOGI1Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsbUJBQU8sQ0FBQyxJQUEwQjs7QUFFaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjMxNTcuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xuXG4vLyBgSXNBcnJheWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWlzYXJyYXlcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1hcnJheS1pc2FycmF5IC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiBpc0FycmF5KGFyZykge1xuICByZXR1cm4gY2xhc3NvZihhcmcpID09ICdBcnJheSc7XG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///3157\n")},4944:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){"use strict";eval("\nvar $ = __webpack_require__(2109);\nvar flattenIntoArray = __webpack_require__(6790);\nvar toObject = __webpack_require__(7908);\nvar toLength = __webpack_require__(7466);\nvar toInteger = __webpack_require__(9958);\nvar arraySpeciesCreate = __webpack_require__(5417);\n\n// `Array.prototype.flat` method\n// https://tc39.es/ecma262/#sec-array.prototype.flat\n$({ target: 'Array', proto: true }, {\n flat: function flat(/* depthArg = 1 */) {\n var depthArg = arguments.length ? arguments[0] : undefined;\n var O = toObject(this);\n var sourceLen = toLength(O.length);\n var A = arraySpeciesCreate(O, 0);\n A.length = flattenIntoArray(A, O, O, sourceLen, 0, depthArg === undefined ? 1 : toInteger(depthArg));\n return A;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmxhdC5qcz8wNDgxIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhO0FBQ2IsUUFBUSxtQkFBTyxDQUFDLElBQXFCO0FBQ3JDLHVCQUF1QixtQkFBTyxDQUFDLElBQWlDO0FBQ2hFLGVBQWUsbUJBQU8sQ0FBQyxJQUF3QjtBQUMvQyxlQUFlLG1CQUFPLENBQUMsSUFBd0I7QUFDL0MsZ0JBQWdCLG1CQUFPLENBQUMsSUFBeUI7QUFDakQseUJBQXlCLG1CQUFPLENBQUMsSUFBbUM7O0FBRXBFO0FBQ0E7QUFDQSxHQUFHLCtCQUErQjtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyIsImZpbGUiOiI0OTQ0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZmxhdHRlbkludG9BcnJheSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mbGF0dGVuLWludG8tYXJyYXknKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW50ZWdlcicpO1xudmFyIGFycmF5U3BlY2llc0NyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZScpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmZsYXRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmxhdFxuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUgfSwge1xuICBmbGF0OiBmdW5jdGlvbiBmbGF0KC8qIGRlcHRoQXJnID0gMSAqLykge1xuICAgIHZhciBkZXB0aEFyZyA9IGFyZ3VtZW50cy5sZW5ndGggPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQ7XG4gICAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgICB2YXIgc291cmNlTGVuID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgIHZhciBBID0gYXJyYXlTcGVjaWVzQ3JlYXRlKE8sIDApO1xuICAgIEEubGVuZ3RoID0gZmxhdHRlbkludG9BcnJheShBLCBPLCBPLCBzb3VyY2VMZW4sIDAsIGRlcHRoQXJnID09PSB1bmRlZmluZWQgPyAxIDogdG9JbnRlZ2VyKGRlcHRoQXJnKSk7XG4gICAgcmV0dXJuIEE7XG4gIH1cbn0pO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4944\n")},5438:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("var $ = __webpack_require__(2109);\n\n// eslint-disable-next-line es/no-math-hypot -- required for testing\nvar $hypot = Math.hypot;\nvar abs = Math.abs;\nvar sqrt = Math.sqrt;\n\n// Chrome 77 bug\n// https://bugs.chromium.org/p/v8/issues/detail?id=9546\nvar BUGGY = !!$hypot && $hypot(Infinity, NaN) !== Infinity;\n\n// `Math.hypot` method\n// https://tc39.es/ecma262/#sec-math.hypot\n$({ target: 'Math', stat: true, forced: BUGGY }, {\n // eslint-disable-next-line no-unused-vars -- required for `.length`\n hypot: function hypot(value1, value2) {\n var sum = 0;\n var i = 0;\n var aLen = arguments.length;\n var larg = 0;\n var arg, div;\n while (i < aLen) {\n arg = abs(arguments[i++]);\n if (larg < arg) {\n div = larg / arg;\n sum = sum * div * div + 1;\n larg = arg;\n } else if (arg > 0) {\n div = arg / larg;\n sum += div * div;\n } else sum += arg;\n }\n return larg === Infinity ? Infinity : larg * sqrt(sum);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5oeXBvdC5qcz80MDU3Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFFBQVEsbUJBQU8sQ0FBQyxJQUFxQjs7QUFFckM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHLDRDQUE0QztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLENBQUMiLCJmaWxlIjoiNTQzOC5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tbWF0aC1oeXBvdCAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xudmFyICRoeXBvdCA9IE1hdGguaHlwb3Q7XG52YXIgYWJzID0gTWF0aC5hYnM7XG52YXIgc3FydCA9IE1hdGguc3FydDtcblxuLy8gQ2hyb21lIDc3IGJ1Z1xuLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9OTU0NlxudmFyIEJVR0dZID0gISEkaHlwb3QgJiYgJGh5cG90KEluZmluaXR5LCBOYU4pICE9PSBJbmZpbml0eTtcblxuLy8gYE1hdGguaHlwb3RgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXRoLmh5cG90XG4kKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogQlVHR1kgfSwge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMgLS0gcmVxdWlyZWQgZm9yIGAubGVuZ3RoYFxuICBoeXBvdDogZnVuY3Rpb24gaHlwb3QodmFsdWUxLCB2YWx1ZTIpIHtcbiAgICB2YXIgc3VtID0gMDtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIGFMZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciBsYXJnID0gMDtcbiAgICB2YXIgYXJnLCBkaXY7XG4gICAgd2hpbGUgKGkgPCBhTGVuKSB7XG4gICAgICBhcmcgPSBhYnMoYXJndW1lbnRzW2krK10pO1xuICAgICAgaWYgKGxhcmcgPCBhcmcpIHtcbiAgICAgICAgZGl2ID0gbGFyZyAvIGFyZztcbiAgICAgICAgc3VtID0gc3VtICogZGl2ICogZGl2ICsgMTtcbiAgICAgICAgbGFyZyA9IGFyZztcbiAgICAgIH0gZWxzZSBpZiAoYXJnID4gMCkge1xuICAgICAgICBkaXYgPSBhcmcgLyBsYXJnO1xuICAgICAgICBzdW0gKz0gZGl2ICogZGl2O1xuICAgICAgfSBlbHNlIHN1bSArPSBhcmc7XG4gICAgfVxuICAgIHJldHVybiBsYXJnID09PSBJbmZpbml0eSA/IEluZmluaXR5IDogbGFyZyAqIHNxcnQoc3VtKTtcbiAgfVxufSk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5438\n")},1529:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "default": function() { return /* binding */ cejst; }\n});\n\n// EXTERNAL MODULE: ./node_modules/react/index.js\nvar react = __webpack_require__(7294);\n// EXTERNAL MODULE: ./src/components/layout.tsx + 7 modules\nvar layout = __webpack_require__(1857);\n// EXTERNAL MODULE: ./src/contexts/FlagContext.tsx\nvar FlagContext = __webpack_require__(774);\n// EXTERNAL MODULE: ./node_modules/mapbox-gl/dist/mapbox-gl.js\nvar mapbox_gl = __webpack_require__(2974);\n// EXTERNAL MODULE: ./node_modules/chroma-js/chroma.js\nvar chroma = __webpack_require__(3873);\nvar chroma_default = /*#__PURE__*/__webpack_require__.n(chroma);\n;// CONCATENATED MODULE: ./src/data/constants.tsx\nvar SCORE_PROPERTY=\'Score D (percentile)\';var GEOID_PROPERTY=\'GEOID10\';var GLOBAL_MIN_ZOOM=3;var GLOBAL_MAX_ZOOM=11;var GLOBAL_MIN_ZOOM_LOW=3;var GLOBAL_MAX_ZOOM_LOW=11;var GLOBAL_MIN_ZOOM_HIGH=9;var GLOBAL_MAX_ZOOM_HIGH=11;var GLOBAL_MAX_BOUNDS=[[-167.276413,5.499550],[-52.233040,83.162102]];var DEFAULT_CENTER=[32.4687126,-86.502136];\n;// CONCATENATED MODULE: ./src/data/mapStyle.tsx\n// eslint-disable-next-line require-jsdoc\nfunction hexToHSLA(hex,alpha){return chroma_default()(hex).alpha(alpha).css(\'hsl\');}/**\n * `MakePaint` generates a zoom-faded Mapbox style formatted layer given a set of parameters.\n *\n * @param {string} field : the field within the data to consult\n * @param {number} minRamp : the minimum value this can assume\n * @param {number} medRamp : the medium value this can assume\n * @param {number} maxRamp : the maximum value this can assume\n * @param {boolean} high : whether this is a "high" or "low" layer\n * @return {FillPaint} a mapboxgl fill layer\n **/function makePaint(_ref){var field=_ref.field,minRamp=_ref.minRamp,medRamp=_ref.medRamp,maxRamp=_ref.maxRamp,high=_ref.high;var minColor=\'white\';// \'232, 88%, 100%\';\nvar medColor=\'#D1DAE6\';var maxColor=\'#768FB3\';// \'0, 98%, 56%\';\nreturn{\'fill-color\':[\'interpolate\',[\'linear\'],[\'zoom\'],high?9:0,[\'step\',[\'get\',field],hexToHSLA(minColor,high?0:0.5),minRamp,hexToHSLA(minColor,high?0:0.5),medRamp,hexToHSLA(medColor,high?0:0.5),maxRamp,hexToHSLA(maxColor,high?0:0.5)],high?11:9,[\'step\',[\'get\',field],hexToHSLA(minColor,high?0.5:0.5),minRamp,hexToHSLA(minColor,high?0.5:0.5),medRamp,hexToHSLA(medColor,high?0.5:0.5),maxRamp,hexToHSLA(maxColor,high?0.5:0.5)],high?22:11,[\'step\',[\'get\',field],hexToHSLA(minColor,high?0.5:0),minRamp,hexToHSLA(minColor,high?0.5:0),medRamp,hexToHSLA(medColor,high?0.5:0),maxRamp,hexToHSLA(maxColor,high?0.5:0)]]};}var mapStyle={\'version\':8,\'sources\':{\'carto\':{\'type\':\'raster\',\'tiles\':[\'https://a.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}.png\',\'https://b.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}.png\',\'https://c.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}.png\',\'https://d.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}.png\']},\'geo\':{\'type\':\'raster\',\'tiles\':[\'https://mt0.google.com/vt/lyrs=p&hl=en&x={x}&y={y}&z={z}\']},\'custom\':{\'type\':\'vector\',\'tiles\':[\'https://d2zjid6n5ja2pt.cloudfront.net/0629_demo/{z}/{x}/{y}.pbf\'// For local development, use:\n// \'http://localhost:8080/data/tl_2010_bg_with_data/{z}/{x}/{y}.pbf\',\n]},\'labels\':{\'type\':\'raster\',\'tiles\':[\'https://cartodb-basemaps-a.global.ssl.fastly.net/light_only_labels/{z}/{x}/{y}@2x.png\',\'https://cartodb-basemaps-b.global.ssl.fastly.net/light_only_labels/{z}/{x}/{y}@2x.png\',\'https://cartodb-basemaps-c.global.ssl.fastly.net/light_only_labels/{z}/{x}/{y}@2x.png\',\'https://cartodb-basemaps-d.global.ssl.fastly.net/light_only_labels/{z}/{x}/{y}@2x.png\']}},\'layers\':[{\'id\':\'carto\',\'source\':\'carto\',\'type\':\'raster\',\'minzoom\':GLOBAL_MIN_ZOOM-1,\'maxzoom\':GLOBAL_MAX_ZOOM+1},{\'id\':\'geo\',\'source\':\'geo\',\'type\':\'raster\',\'minzoom\':GLOBAL_MIN_ZOOM-1,\'maxzoom\':GLOBAL_MAX_ZOOM+1,\'layout\':{// Make the layer visible by default.\n\'visibility\':\'none\'}},{\'id\':\'score-low\',\'source\':\'custom\',\'source-layer\':\'blocks\',\'type\':\'fill\',\'filter\':[\'all\',[\'>\',SCORE_PROPERTY,0.6]// [\'in\', \'STATEFP10\', \'01\', \'30\', \'34\', \'35\', \'36\'],\n],\'paint\':makePaint({field:SCORE_PROPERTY,minRamp:0,medRamp:0.6,maxRamp:0.75,high:false}),\'minzoom\':GLOBAL_MIN_ZOOM_LOW,\'maxzoom\':GLOBAL_MAX_ZOOM_LOW},{\'id\':\'score-high\',\'source\':\'custom\',\'source-layer\':\'blocks\',\'type\':\'fill\',\'filter\':[\'all\',[\'>\',SCORE_PROPERTY,0.6]// [\'in\', \'STATEFP10\', \'01\', \'30\', \'34\', \'35\', \'36\'],\n],\'paint\':makePaint({field:SCORE_PROPERTY,minRamp:0,medRamp:0.6,maxRamp:1.0,high:true}),\'minzoom\':GLOBAL_MIN_ZOOM_HIGH,\'maxzoom\':GLOBAL_MAX_ZOOM_HIGH},{\'id\':\'labels-only\',\'type\':\'raster\',\'source\':\'labels\',\'minzoom\':GLOBAL_MIN_ZOOM,\'maxzoom\':GLOBAL_MAX_ZOOM}]};/* harmony default export */ var data_mapStyle = (mapStyle);\n;// CONCATENATED MODULE: ./src/components/zoomWarning.module.scss\n// extracted by mini-css-extract-plugin\nvar zoomWarning = "zoomWarning-module--zoomWarning--jGeOk";\n;// CONCATENATED MODULE: ./node_modules/uswds/dist/img/usa-icons/zoom_in.svg\n/* harmony default export */ var zoom_in = ("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0Ij48cGF0aCBkPSJNMCAwaDI0djI0SDBWMHoiIGZpbGw9Im5vbmUiLz48cGF0aCBkPSJNMTUuNSAxNGgtLjc5bC0uMjgtLjI3QzE1LjQxIDEyLjU5IDE2IDExLjExIDE2IDkuNSAxNiA1LjkxIDEzLjA5IDMgOS41IDNTMyA1LjkxIDMgOS41IDUuOTEgMTYgOS41IDE2YzEuNjEgMCAzLjA5LS41OSA0LjIzLTEuNTdsLjI3LjI4di43OWw1IDQuOTlMMjAuNDkgMTlsLTQuOTktNXptLTYgMEM3LjAxIDE0IDUgMTEuOTkgNSA5LjVTNy4wMSA1IDkuNSA1IDE0IDcuMDEgMTQgOS41IDExLjk5IDE0IDkuNSAxNHoiLz48cGF0aCBkPSJNMTIgMTBoLTJ2Mkg5di0ySDdWOWgyVjdoMXYyaDJ2MXoiLz48L3N2Zz4=");\n;// CONCATENATED MODULE: ./src/components/zoomWarning.tsx\n// @ts-ignore\nvar ZoomWarning=function ZoomWarning(_ref){var zoomLevel=_ref.zoomLevel;return/*#__PURE__*/react.createElement(react.Fragment,null,zoomLevel<=5?/*#__PURE__*/react.createElement("div",{className:zoomWarning},/*#__PURE__*/react.createElement("img",{src:zoom_in,alt:\'zoom icon\'}),"Zoom in to the state or regional level to see prioritized communities on the map."):\'\');};/* harmony default export */ var components_zoomWarning = (ZoomWarning);\n// EXTERNAL MODULE: ./node_modules/@trussworks/react-uswds/lib/index.js\nvar lib = __webpack_require__(2593);\n;// CONCATENATED MODULE: ./src/components/popupContent.tsx\nvar PopupContent=function PopupContent(_ref){var properties=_ref.properties;var readablePercent=function readablePercent(percent){return(percent*100).toFixed(2)+"%";};var getCategorization=function getCategorization(percentile){var categorization;if(percentile>=0.75){categorization=\'Prioritized\';}else if(0.60<=percentile&&percentile<0.75){categorization=\'Threshold\';}else{categorization=\'Non-prioritized\';}return categorization;};var getTitleContent=function getTitleContent(properties){var blockGroup=properties[GEOID_PROPERTY];var score=properties[SCORE_PROPERTY];return/*#__PURE__*/react.createElement("table",null,/*#__PURE__*/react.createElement("tbody",null,/*#__PURE__*/react.createElement("tr",null,/*#__PURE__*/react.createElement("td",null,/*#__PURE__*/react.createElement("strong",null,"Census Block Group:")),/*#__PURE__*/react.createElement("td",null,blockGroup)),/*#__PURE__*/react.createElement("tr",null,/*#__PURE__*/react.createElement("td",null,/*#__PURE__*/react.createElement("strong",null,"Just Progress Categorization:")),/*#__PURE__*/react.createElement("td",null,getCategorization(score))),/*#__PURE__*/react.createElement("tr",null,/*#__PURE__*/react.createElement("td",null,/*#__PURE__*/react.createElement("strong",null,"Cumulative Index Score:")),/*#__PURE__*/react.createElement("td",null,readablePercent(score)))));};var getBodyContent=function getBodyContent(properties){var rows=[];for(var _i=0,_Object$entries=Object.entries(properties);_i<_Object$entries.length;_i++){var _Object$entries$_i=_Object$entries[_i],key=_Object$entries$_i[0],value=_Object$entries$_i[1];// Filter out all caps\nif(!key.match(/^[A-Z0-9]+$/)){rows.push(/*#__PURE__*/react.createElement("tr",{key:key},/*#__PURE__*/react.createElement("td",null,key),/*#__PURE__*/react.createElement("td",null,value)));}}return rows;};return/*#__PURE__*/react.createElement(react.Fragment,null,properties?/*#__PURE__*/react.createElement("div",null,getTitleContent(properties),/*#__PURE__*/react.createElement(lib.Table,{bordered:false},/*#__PURE__*/react.createElement("thead",null,/*#__PURE__*/react.createElement("tr",null,/*#__PURE__*/react.createElement("th",{scope:"col"},"Indicator"),/*#__PURE__*/react.createElement("th",{scope:"col"},"Percentile(0-100)"))),/*#__PURE__*/react.createElement("tbody",null,getBodyContent(properties)))):\'\');};/* harmony default export */ var popupContent = (PopupContent);\n;// CONCATENATED MODULE: ./src/components/mapboxMap.module.scss\n// extracted by mini-css-extract-plugin\nvar mapboxMap_module_mapContainer = "mapboxMap-module--mapContainer--3rGD6";\nvar sidebar = "mapboxMap-module--sidebar--3-Kl5";\nvar j40Popup = "mapboxMap-module--j40Popup--mt6lB";\nvar mapboxglPopupContent = "mapboxMap-module--mapboxgl-popup-content--co4zE";\n// EXTERNAL MODULE: ./node_modules/react-dom/index.js\nvar react_dom = __webpack_require__(3935);\n;// CONCATENATED MODULE: ./src/components/mapboxMap.tsx\n/* eslint-disable no-unused-vars */var MapboxMap=function MapboxMap(){var mapContainer=react.useRef(null);var map=(0,react.useRef)();var _useState=(0,react.useState)(GLOBAL_MIN_ZOOM),zoom=_useState[0],setZoom=_useState[1];(0,react.useEffect)(function(){// Only initialize once\nif(map.current&&mapContainer.current)return;var initialMap=new mapbox_gl.Map({container:mapContainer.current,style:data_mapStyle,center:DEFAULT_CENTER,zoom:zoom,minZoom:GLOBAL_MIN_ZOOM,maxZoom:GLOBAL_MAX_ZOOM,maxBounds:GLOBAL_MAX_BOUNDS});initialMap.on(\'click\',handleClick);initialMap.addControl(new mapbox_gl.NavigationControl());map.current=initialMap;});var handleClick=function handleClick(e){var map=e.target;var clickedCoord=e.point;var features=map.queryRenderedFeatures(clickedCoord,{layers:[\'score-low\']});if(features.length&&features[0].properties){var placeholder=document.createElement(\'div\');react_dom.render(/*#__PURE__*/react.createElement(popupContent,{properties:features[0].properties}),placeholder);var options={offset:[0,0],className:j40Popup};new mapbox_gl.Popup(options).setLngLat(e.lngLat).setDOMContent(placeholder).setMaxWidth(\'300px\').addTo(map);}};(0,react.useEffect)(function(){if(!map.current)return;// wait for map to initialize\nmap.current.on(\'move\',function(){setZoom(map.current.getZoom());});map.current.on(\'mouseenter\',\'score-low\',function(){map.current.getCanvas().style.cursor=\'pointer\';});map.current.on(\'mouseleave\',\'score-low\',function(){map.current.getCanvas().style.cursor=\'\';});});return/*#__PURE__*/react.createElement("div",null,/*#__PURE__*/react.createElement("div",{ref:mapContainer,className:mapboxMap_module_mapContainer}),/*#__PURE__*/react.createElement(components_zoomWarning,{zoomLevel:zoom}));};/* harmony default export */ var mapboxMap = (MapboxMap);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.flat.js\nvar es_array_flat = __webpack_require__(4944);\n;// CONCATENATED MODULE: ./node_modules/ol/Disposable.js\n/**\n * @module ol/Disposable\n */\n\n/**\n * @classdesc\n * Objects that need to clean up after themselves.\n */\nvar Disposable =\n/** @class */\nfunction () {\n function Disposable() {\n /**\n * The object has already been disposed.\n * @type {boolean}\n * @protected\n */\n this.disposed = false;\n }\n /**\n * Clean up.\n */\n\n\n Disposable.prototype.dispose = function () {\n if (!this.disposed) {\n this.disposed = true;\n this.disposeInternal();\n }\n };\n /**\n * Extension point for disposable objects.\n * @protected\n */\n\n\n Disposable.prototype.disposeInternal = function () {};\n\n return Disposable;\n}();\n\n/* harmony default export */ var ol_Disposable = (Disposable);\n;// CONCATENATED MODULE: ./node_modules/ol/array.js\n/**\n * @module ol/array\n */\n\n/**\n * Performs a binary search on the provided sorted list and returns the index of the item if found. If it can\'t be found it\'ll return -1.\n * https://github.com/darkskyapp/binary-search\n *\n * @param {Array<*>} haystack Items to search through.\n * @param {*} needle The item to look for.\n * @param {Function=} opt_comparator Comparator function.\n * @return {number} The index of the item if found, -1 if not.\n */\nfunction binarySearch(haystack, needle, opt_comparator) {\n var mid, cmp;\n var comparator = opt_comparator || numberSafeCompareFunction;\n var low = 0;\n var high = haystack.length;\n var found = false;\n\n while (low < high) {\n /* Note that "(low + high) >>> 1" may overflow, and results in a typecast\n * to double (which gives the wrong results). */\n mid = low + (high - low >> 1);\n cmp = +comparator(haystack[mid], needle);\n\n if (cmp < 0.0) {\n /* Too low. */\n low = mid + 1;\n } else {\n /* Key found or too high */\n high = mid;\n found = !cmp;\n }\n }\n /* Key not found. */\n\n\n return found ? low : ~low;\n}\n/**\n * Compare function for array sort that is safe for numbers.\n * @param {*} a The first object to be compared.\n * @param {*} b The second object to be compared.\n * @return {number} A negative number, zero, or a positive number as the first\n * argument is less than, equal to, or greater than the second.\n */\n\nfunction numberSafeCompareFunction(a, b) {\n return a > b ? 1 : a < b ? -1 : 0;\n}\n/**\n * Whether the array contains the given object.\n * @param {Array<*>} arr The array to test for the presence of the element.\n * @param {*} obj The object for which to test.\n * @return {boolean} The object is in the array.\n */\n\nfunction includes(arr, obj) {\n return arr.indexOf(obj) >= 0;\n}\n/**\n * @param {Array} arr Array.\n * @param {number} target Target.\n * @param {number} direction 0 means return the nearest, > 0\n * means return the largest nearest, < 0 means return the\n * smallest nearest.\n * @return {number} Index.\n */\n\nfunction linearFindNearest(arr, target, direction) {\n var n = arr.length;\n\n if (arr[0] <= target) {\n return 0;\n } else if (target <= arr[n - 1]) {\n return n - 1;\n } else {\n var i = void 0;\n\n if (direction > 0) {\n for (i = 1; i < n; ++i) {\n if (arr[i] < target) {\n return i - 1;\n }\n }\n } else if (direction < 0) {\n for (i = 1; i < n; ++i) {\n if (arr[i] <= target) {\n return i;\n }\n }\n } else {\n for (i = 1; i < n; ++i) {\n if (arr[i] == target) {\n return i;\n } else if (arr[i] < target) {\n if (arr[i - 1] - target < target - arr[i]) {\n return i - 1;\n } else {\n return i;\n }\n }\n }\n }\n\n return n - 1;\n }\n}\n/**\n * @param {Array<*>} arr Array.\n * @param {number} begin Begin index.\n * @param {number} end End index.\n */\n\nfunction reverseSubArray(arr, begin, end) {\n while (begin < end) {\n var tmp = arr[begin];\n arr[begin] = arr[end];\n arr[end] = tmp;\n ++begin;\n --end;\n }\n}\n/**\n * @param {Array} arr The array to modify.\n * @param {!Array|VALUE} data The elements or arrays of elements to add to arr.\n * @template VALUE\n */\n\nfunction array_extend(arr, data) {\n var extension = Array.isArray(data) ? data : [data];\n var length = extension.length;\n\n for (var i = 0; i < length; i++) {\n arr[arr.length] = extension[i];\n }\n}\n/**\n * @param {Array} arr The array to modify.\n * @param {VALUE} obj The element to remove.\n * @template VALUE\n * @return {boolean} If the element was removed.\n */\n\nfunction remove(arr, obj) {\n var i = arr.indexOf(obj);\n var found = i > -1;\n\n if (found) {\n arr.splice(i, 1);\n }\n\n return found;\n}\n/**\n * @param {Array} arr The array to search in.\n * @param {function(VALUE, number, ?) : boolean} func The function to compare.\n * @template VALUE\n * @return {VALUE|null} The element found or null.\n */\n\nfunction find(arr, func) {\n var length = arr.length >>> 0;\n var value;\n\n for (var i = 0; i < length; i++) {\n value = arr[i];\n\n if (func(value, i, arr)) {\n return value;\n }\n }\n\n return null;\n}\n/**\n * @param {Array|Uint8ClampedArray} arr1 The first array to compare.\n * @param {Array|Uint8ClampedArray} arr2 The second array to compare.\n * @return {boolean} Whether the two arrays are equal.\n */\n\nfunction equals(arr1, arr2) {\n var len1 = arr1.length;\n\n if (len1 !== arr2.length) {\n return false;\n }\n\n for (var i = 0; i < len1; i++) {\n if (arr1[i] !== arr2[i]) {\n return false;\n }\n }\n\n return true;\n}\n/**\n * Sort the passed array such that the relative order of equal elements is preverved.\n * See https://en.wikipedia.org/wiki/Sorting_algorithm#Stability for details.\n * @param {Array<*>} arr The array to sort (modifies original).\n * @param {!function(*, *): number} compareFnc Comparison function.\n * @api\n */\n\nfunction stableSort(arr, compareFnc) {\n var length = arr.length;\n var tmp = Array(arr.length);\n var i;\n\n for (i = 0; i < length; i++) {\n tmp[i] = {\n index: i,\n value: arr[i]\n };\n }\n\n tmp.sort(function (a, b) {\n return compareFnc(a.value, b.value) || a.index - b.index;\n });\n\n for (i = 0; i < arr.length; i++) {\n arr[i] = tmp[i].value;\n }\n}\n/**\n * @param {Array<*>} arr The array to search in.\n * @param {Function} func Comparison function.\n * @return {number} Return index.\n */\n\nfunction findIndex(arr, func) {\n var index;\n var found = !arr.every(function (el, idx) {\n index = idx;\n return !func(el, idx, arr);\n });\n return found ? index : -1;\n}\n/**\n * @param {Array<*>} arr The array to test.\n * @param {Function=} opt_func Comparison function.\n * @param {boolean=} opt_strict Strictly sorted (default false).\n * @return {boolean} Return index.\n */\n\nfunction isSorted(arr, opt_func, opt_strict) {\n var compare = opt_func || numberSafeCompareFunction;\n return arr.every(function (currentVal, index) {\n if (index === 0) {\n return true;\n }\n\n var res = compare(arr[index - 1], currentVal);\n return !(res > 0 || opt_strict && res === 0);\n });\n}\n;// CONCATENATED MODULE: ./node_modules/ol/functions.js\n/**\n * @module ol/functions\n */\n\n/**\n * Always returns true.\n * @returns {boolean} true.\n */\n\nfunction TRUE() {\n return true;\n}\n/**\n * Always returns false.\n * @returns {boolean} false.\n */\n\nfunction functions_FALSE() {\n return false;\n}\n/**\n * A reusable function, used e.g. as a default for callbacks.\n *\n * @return {void} Nothing.\n */\n\nfunction VOID() {}\n/**\n * Wrap a function in another function that remembers the last return. If the\n * returned function is called twice in a row with the same arguments and the same\n * this object, it will return the value from the first call in the second call.\n *\n * @param {function(...any): ReturnType} fn The function to memoize.\n * @return {function(...any): ReturnType} The memoized function.\n * @template ReturnType\n */\n\nfunction memoizeOne(fn) {\n var called = false;\n /** @type {ReturnType} */\n\n var lastResult;\n /** @type {Array} */\n\n var lastArgs;\n var lastThis;\n return function () {\n var nextArgs = Array.prototype.slice.call(arguments);\n\n if (!called || this !== lastThis || !equals(nextArgs, lastArgs)) {\n called = true;\n lastThis = this;\n lastArgs = nextArgs;\n lastResult = fn.apply(this, arguments);\n }\n\n return lastResult;\n };\n}\n;// CONCATENATED MODULE: ./node_modules/ol/util.js\n/**\n * @module ol/util\n */\n\n/**\n * @return {?} Any return.\n */\nfunction util_abstract() {\n return (\n /** @type {?} */\n function () {\n throw new Error(\'Unimplemented abstract method.\');\n }()\n );\n}\n/**\n * Counter for getUid.\n * @type {number}\n * @private\n */\n\nvar uidCounter_ = 0;\n/**\n * Gets a unique ID for an object. This mutates the object so that further calls\n * with the same object as a parameter returns the same value. Unique IDs are generated\n * as a strictly increasing sequence. Adapted from goog.getUid.\n *\n * @param {Object} obj The object to get the unique ID for.\n * @return {string} The unique ID for the object.\n * @api\n */\n\nfunction getUid(obj) {\n return obj.ol_uid || (obj.ol_uid = String(++uidCounter_));\n}\n/**\n * OpenLayers version.\n * @type {string}\n */\n\nvar VERSION = \'6.5.0\';\n;// CONCATENATED MODULE: ./node_modules/ol/AssertionError.js\nvar __extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n/**\n * @module ol/AssertionError\n */\n\n\n\n/**\n * Error object thrown when an assertion failed. This is an ECMA-262 Error,\n * extended with a `code` property.\n * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error.\n */\n\nvar AssertionError =\n/** @class */\nfunction (_super) {\n __extends(AssertionError, _super);\n /**\n * @param {number} code Error code.\n */\n\n\n function AssertionError(code) {\n var _this = this;\n\n var path = VERSION === \'latest\' ? VERSION : \'v\' + VERSION.split(\'-\')[0];\n var message = \'Assertion failed. See https://openlayers.org/en/\' + path + \'/doc/errors/#\' + code + \' for details.\';\n _this = _super.call(this, message) || this;\n /**\n * Error code. The meaning of the code can be found on\n * https://openlayers.org/en/latest/doc/errors/ (replace `latest` with\n * the version found in the OpenLayers script\'s header comment if a version\n * other than the latest is used).\n * @type {number}\n * @api\n */\n\n _this.code = code;\n /**\n * @type {string}\n */\n\n _this.name = \'AssertionError\'; // Re-assign message, see https://github.com/Rich-Harris/buble/issues/40\n\n _this.message = message;\n return _this;\n }\n\n return AssertionError;\n}(Error);\n\n/* harmony default export */ var ol_AssertionError = (AssertionError);\n;// CONCATENATED MODULE: ./node_modules/ol/asserts.js\n/**\n * @module ol/asserts\n */\n\n/**\n * @param {*} assertion Assertion we expected to be truthy.\n * @param {number} errorCode Error code.\n */\n\nfunction asserts_assert(assertion, errorCode) {\n if (!assertion) {\n throw new ol_AssertionError(errorCode);\n }\n}\n;// CONCATENATED MODULE: ./node_modules/ol/transform.js\n/**\n * @module ol/transform\n */\n\n/**\n * An array representing an affine 2d transformation for use with\n * {@link module:ol/transform} functions. The array has 6 elements.\n * @typedef {!Array} Transform\n * @api\n */\n\n/**\n * Collection of affine 2d transformation functions. The functions work on an\n * array of 6 elements. The element order is compatible with the [SVGMatrix\n * interface](https://developer.mozilla.org/en-US/docs/Web/API/SVGMatrix) and is\n * a subset (elements a to f) of a 3×3 matrix:\n * ```\n * [ a c e ]\n * [ b d f ]\n * [ 0 0 1 ]\n * ```\n */\n\n/**\n * @private\n * @type {Transform}\n */\n\nvar tmp_ = new Array(6);\n/**\n * Create an identity transform.\n * @return {!Transform} Identity transform.\n */\n\nfunction create() {\n return [1, 0, 0, 1, 0, 0];\n}\n/**\n * Resets the given transform to an identity transform.\n * @param {!Transform} transform Transform.\n * @return {!Transform} Transform.\n */\n\nfunction transform_reset(transform) {\n return set(transform, 1, 0, 0, 1, 0, 0);\n}\n/**\n * Multiply the underlying matrices of two transforms and return the result in\n * the first transform.\n * @param {!Transform} transform1 Transform parameters of matrix 1.\n * @param {!Transform} transform2 Transform parameters of matrix 2.\n * @return {!Transform} transform1 multiplied with transform2.\n */\n\nfunction multiply(transform1, transform2) {\n var a1 = transform1[0];\n var b1 = transform1[1];\n var c1 = transform1[2];\n var d1 = transform1[3];\n var e1 = transform1[4];\n var f1 = transform1[5];\n var a2 = transform2[0];\n var b2 = transform2[1];\n var c2 = transform2[2];\n var d2 = transform2[3];\n var e2 = transform2[4];\n var f2 = transform2[5];\n transform1[0] = a1 * a2 + c1 * b2;\n transform1[1] = b1 * a2 + d1 * b2;\n transform1[2] = a1 * c2 + c1 * d2;\n transform1[3] = b1 * c2 + d1 * d2;\n transform1[4] = a1 * e2 + c1 * f2 + e1;\n transform1[5] = b1 * e2 + d1 * f2 + f1;\n return transform1;\n}\n/**\n * Set the transform components a-f on a given transform.\n * @param {!Transform} transform Transform.\n * @param {number} a The a component of the transform.\n * @param {number} b The b component of the transform.\n * @param {number} c The c component of the transform.\n * @param {number} d The d component of the transform.\n * @param {number} e The e component of the transform.\n * @param {number} f The f component of the transform.\n * @return {!Transform} Matrix with transform applied.\n */\n\nfunction set(transform, a, b, c, d, e, f) {\n transform[0] = a;\n transform[1] = b;\n transform[2] = c;\n transform[3] = d;\n transform[4] = e;\n transform[5] = f;\n return transform;\n}\n/**\n * Set transform on one matrix from another matrix.\n * @param {!Transform} transform1 Matrix to set transform to.\n * @param {!Transform} transform2 Matrix to set transform from.\n * @return {!Transform} transform1 with transform from transform2 applied.\n */\n\nfunction setFromArray(transform1, transform2) {\n transform1[0] = transform2[0];\n transform1[1] = transform2[1];\n transform1[2] = transform2[2];\n transform1[3] = transform2[3];\n transform1[4] = transform2[4];\n transform1[5] = transform2[5];\n return transform1;\n}\n/**\n * Transforms the given coordinate with the given transform returning the\n * resulting, transformed coordinate. The coordinate will be modified in-place.\n *\n * @param {Transform} transform The transformation.\n * @param {import("./coordinate.js").Coordinate|import("./pixel.js").Pixel} coordinate The coordinate to transform.\n * @return {import("./coordinate.js").Coordinate|import("./pixel.js").Pixel} return coordinate so that operations can be\n * chained together.\n */\n\nfunction apply(transform, coordinate) {\n var x = coordinate[0];\n var y = coordinate[1];\n coordinate[0] = transform[0] * x + transform[2] * y + transform[4];\n coordinate[1] = transform[1] * x + transform[3] * y + transform[5];\n return coordinate;\n}\n/**\n * Applies rotation to the given transform.\n * @param {!Transform} transform Transform.\n * @param {number} angle Angle in radians.\n * @return {!Transform} The rotated transform.\n */\n\nfunction rotate(transform, angle) {\n var cos = Math.cos(angle);\n var sin = Math.sin(angle);\n return multiply(transform, set(tmp_, cos, sin, -sin, cos, 0, 0));\n}\n/**\n * Applies scale to a given transform.\n * @param {!Transform} transform Transform.\n * @param {number} x Scale factor x.\n * @param {number} y Scale factor y.\n * @return {!Transform} The scaled transform.\n */\n\nfunction scale(transform, x, y) {\n return multiply(transform, set(tmp_, x, 0, 0, y, 0, 0));\n}\n/**\n * Creates a scale transform.\n * @param {!Transform} target Transform to overwrite.\n * @param {number} x Scale factor x.\n * @param {number} y Scale factor y.\n * @return {!Transform} The scale transform.\n */\n\nfunction makeScale(target, x, y) {\n return set(target, x, 0, 0, y, 0, 0);\n}\n/**\n * Applies translation to the given transform.\n * @param {!Transform} transform Transform.\n * @param {number} dx Translation x.\n * @param {number} dy Translation y.\n * @return {!Transform} The translated transform.\n */\n\nfunction translate(transform, dx, dy) {\n return multiply(transform, set(tmp_, 1, 0, 0, 1, dx, dy));\n}\n/**\n * Creates a composite transform given an initial translation, scale, rotation, and\n * final translation (in that order only, not commutative).\n * @param {!Transform} transform The transform (will be modified in place).\n * @param {number} dx1 Initial translation x.\n * @param {number} dy1 Initial translation y.\n * @param {number} sx Scale factor x.\n * @param {number} sy Scale factor y.\n * @param {number} angle Rotation (in counter-clockwise radians).\n * @param {number} dx2 Final translation x.\n * @param {number} dy2 Final translation y.\n * @return {!Transform} The composite transform.\n */\n\nfunction compose(transform, dx1, dy1, sx, sy, angle, dx2, dy2) {\n var sin = Math.sin(angle);\n var cos = Math.cos(angle);\n transform[0] = sx * cos;\n transform[1] = sy * sin;\n transform[2] = -sx * sin;\n transform[3] = sy * cos;\n transform[4] = dx2 * sx * cos - dy2 * sx * sin + dx1;\n transform[5] = dx2 * sy * sin + dy2 * sy * cos + dy1;\n return transform;\n}\n/**\n * Creates a composite transform given an initial translation, scale, rotation, and\n * final translation (in that order only, not commutative). The resulting transform\n * string can be applied as `transform` porperty of an HTMLElement\'s style.\n * @param {number} dx1 Initial translation x.\n * @param {number} dy1 Initial translation y.\n * @param {number} sx Scale factor x.\n * @param {number} sy Scale factor y.\n * @param {number} angle Rotation (in counter-clockwise radians).\n * @param {number} dx2 Final translation x.\n * @param {number} dy2 Final translation y.\n * @return {string} The composite css transform.\n * @api\n */\n\nfunction composeCssTransform(dx1, dy1, sx, sy, angle, dx2, dy2) {\n return transform_toString(compose(create(), dx1, dy1, sx, sy, angle, dx2, dy2));\n}\n/**\n * Invert the given transform.\n * @param {!Transform} source The source transform to invert.\n * @return {!Transform} The inverted (source) transform.\n */\n\nfunction invert(source) {\n return makeInverse(source, source);\n}\n/**\n * Invert the given transform.\n * @param {!Transform} target Transform to be set as the inverse of\n * the source transform.\n * @param {!Transform} source The source transform to invert.\n * @return {!Transform} The inverted (target) transform.\n */\n\nfunction makeInverse(target, source) {\n var det = determinant(source);\n asserts_assert(det !== 0, 32); // Transformation matrix cannot be inverted\n\n var a = source[0];\n var b = source[1];\n var c = source[2];\n var d = source[3];\n var e = source[4];\n var f = source[5];\n target[0] = d / det;\n target[1] = -b / det;\n target[2] = -c / det;\n target[3] = a / det;\n target[4] = (c * f - d * e) / det;\n target[5] = -(a * f - b * e) / det;\n return target;\n}\n/**\n * Returns the determinant of the given matrix.\n * @param {!Transform} mat Matrix.\n * @return {number} Determinant.\n */\n\nfunction determinant(mat) {\n return mat[0] * mat[3] - mat[1] * mat[2];\n}\n/**\n * A string version of the transform. This can be used\n * for CSS transforms.\n * @param {!Transform} mat Matrix.\n * @return {string} The transform as a string.\n */\n\nfunction transform_toString(mat) {\n return \'matrix(\' + mat.join(\', \') + \')\';\n}\n;// CONCATENATED MODULE: ./node_modules/ol/extent/Corner.js\n/**\n * @module ol/extent/Corner\n */\n\n/**\n * Extent corner.\n * @enum {string}\n */\n/* harmony default export */ var extent_Corner = ({\n BOTTOM_LEFT: \'bottom-left\',\n BOTTOM_RIGHT: \'bottom-right\',\n TOP_LEFT: \'top-left\',\n TOP_RIGHT: \'top-right\'\n});\n;// CONCATENATED MODULE: ./node_modules/ol/extent/Relationship.js\n/**\n * @module ol/extent/Relationship\n */\n\n/**\n * Relationship to an extent.\n * @enum {number}\n */\n/* harmony default export */ var extent_Relationship = ({\n UNKNOWN: 0,\n INTERSECTING: 1,\n ABOVE: 2,\n RIGHT: 4,\n BELOW: 8,\n LEFT: 16\n});\n;// CONCATENATED MODULE: ./node_modules/ol/extent.js\n/**\n * @module ol/extent\n */\n\n\n\n/**\n * An array of numbers representing an extent: `[minx, miny, maxx, maxy]`.\n * @typedef {Array} Extent\n * @api\n */\n\n/**\n * Build an extent that includes all given coordinates.\n *\n * @param {Array} coordinates Coordinates.\n * @return {Extent} Bounding extent.\n * @api\n */\n\nfunction boundingExtent(coordinates) {\n var extent = createEmpty();\n\n for (var i = 0, ii = coordinates.length; i < ii; ++i) {\n extendCoordinate(extent, coordinates[i]);\n }\n\n return extent;\n}\n/**\n * @param {Array} xs Xs.\n * @param {Array} ys Ys.\n * @param {Extent=} opt_extent Destination extent.\n * @private\n * @return {Extent} Extent.\n */\n\nfunction _boundingExtentXYs(xs, ys, opt_extent) {\n var minX = Math.min.apply(null, xs);\n var minY = Math.min.apply(null, ys);\n var maxX = Math.max.apply(null, xs);\n var maxY = Math.max.apply(null, ys);\n return createOrUpdate(minX, minY, maxX, maxY, opt_extent);\n}\n/**\n * Return extent increased by the provided value.\n * @param {Extent} extent Extent.\n * @param {number} value The amount by which the extent should be buffered.\n * @param {Extent=} opt_extent Extent.\n * @return {Extent} Extent.\n * @api\n */\n\n\nfunction buffer(extent, value, opt_extent) {\n if (opt_extent) {\n opt_extent[0] = extent[0] - value;\n opt_extent[1] = extent[1] - value;\n opt_extent[2] = extent[2] + value;\n opt_extent[3] = extent[3] + value;\n return opt_extent;\n } else {\n return [extent[0] - value, extent[1] - value, extent[2] + value, extent[3] + value];\n }\n}\n/**\n * Creates a clone of an extent.\n *\n * @param {Extent} extent Extent to clone.\n * @param {Extent=} opt_extent Extent.\n * @return {Extent} The clone.\n */\n\nfunction clone(extent, opt_extent) {\n if (opt_extent) {\n opt_extent[0] = extent[0];\n opt_extent[1] = extent[1];\n opt_extent[2] = extent[2];\n opt_extent[3] = extent[3];\n return opt_extent;\n } else {\n return extent.slice();\n }\n}\n/**\n * @param {Extent} extent Extent.\n * @param {number} x X.\n * @param {number} y Y.\n * @return {number} Closest squared distance.\n */\n\nfunction closestSquaredDistanceXY(extent, x, y) {\n var dx, dy;\n\n if (x < extent[0]) {\n dx = extent[0] - x;\n } else if (extent[2] < x) {\n dx = x - extent[2];\n } else {\n dx = 0;\n }\n\n if (y < extent[1]) {\n dy = extent[1] - y;\n } else if (extent[3] < y) {\n dy = y - extent[3];\n } else {\n dy = 0;\n }\n\n return dx * dx + dy * dy;\n}\n/**\n * Check if the passed coordinate is contained or on the edge of the extent.\n *\n * @param {Extent} extent Extent.\n * @param {import("./coordinate.js").Coordinate} coordinate Coordinate.\n * @return {boolean} The coordinate is contained in the extent.\n * @api\n */\n\nfunction containsCoordinate(extent, coordinate) {\n return containsXY(extent, coordinate[0], coordinate[1]);\n}\n/**\n * Check if one extent contains another.\n *\n * An extent is deemed contained if it lies completely within the other extent,\n * including if they share one or more edges.\n *\n * @param {Extent} extent1 Extent 1.\n * @param {Extent} extent2 Extent 2.\n * @return {boolean} The second extent is contained by or on the edge of the\n * first.\n * @api\n */\n\nfunction containsExtent(extent1, extent2) {\n return extent1[0] <= extent2[0] && extent2[2] <= extent1[2] && extent1[1] <= extent2[1] && extent2[3] <= extent1[3];\n}\n/**\n * Check if the passed coordinate is contained or on the edge of the extent.\n *\n * @param {Extent} extent Extent.\n * @param {number} x X coordinate.\n * @param {number} y Y coordinate.\n * @return {boolean} The x, y values are contained in the extent.\n * @api\n */\n\nfunction containsXY(extent, x, y) {\n return extent[0] <= x && x <= extent[2] && extent[1] <= y && y <= extent[3];\n}\n/**\n * Get the relationship between a coordinate and extent.\n * @param {Extent} extent The extent.\n * @param {import("./coordinate.js").Coordinate} coordinate The coordinate.\n * @return {import("./extent/Relationship.js").default} The relationship (bitwise compare with\n * import("./extent/Relationship.js").Relationship).\n */\n\nfunction coordinateRelationship(extent, coordinate) {\n var minX = extent[0];\n var minY = extent[1];\n var maxX = extent[2];\n var maxY = extent[3];\n var x = coordinate[0];\n var y = coordinate[1];\n var relationship = extent_Relationship.UNKNOWN;\n\n if (x < minX) {\n relationship = relationship | extent_Relationship.LEFT;\n } else if (x > maxX) {\n relationship = relationship | extent_Relationship.RIGHT;\n }\n\n if (y < minY) {\n relationship = relationship | extent_Relationship.BELOW;\n } else if (y > maxY) {\n relationship = relationship | extent_Relationship.ABOVE;\n }\n\n if (relationship === extent_Relationship.UNKNOWN) {\n relationship = extent_Relationship.INTERSECTING;\n }\n\n return relationship;\n}\n/**\n * Create an empty extent.\n * @return {Extent} Empty extent.\n * @api\n */\n\nfunction createEmpty() {\n return [Infinity, Infinity, -Infinity, -Infinity];\n}\n/**\n * Create a new extent or update the provided extent.\n * @param {number} minX Minimum X.\n * @param {number} minY Minimum Y.\n * @param {number} maxX Maximum X.\n * @param {number} maxY Maximum Y.\n * @param {Extent=} opt_extent Destination extent.\n * @return {Extent} Extent.\n */\n\nfunction createOrUpdate(minX, minY, maxX, maxY, opt_extent) {\n if (opt_extent) {\n opt_extent[0] = minX;\n opt_extent[1] = minY;\n opt_extent[2] = maxX;\n opt_extent[3] = maxY;\n return opt_extent;\n } else {\n return [minX, minY, maxX, maxY];\n }\n}\n/**\n * Create a new empty extent or make the provided one empty.\n * @param {Extent=} opt_extent Extent.\n * @return {Extent} Extent.\n */\n\nfunction createOrUpdateEmpty(opt_extent) {\n return createOrUpdate(Infinity, Infinity, -Infinity, -Infinity, opt_extent);\n}\n/**\n * @param {import("./coordinate.js").Coordinate} coordinate Coordinate.\n * @param {Extent=} opt_extent Extent.\n * @return {Extent} Extent.\n */\n\nfunction createOrUpdateFromCoordinate(coordinate, opt_extent) {\n var x = coordinate[0];\n var y = coordinate[1];\n return createOrUpdate(x, y, x, y, opt_extent);\n}\n/**\n * @param {Array} coordinates Coordinates.\n * @param {Extent=} opt_extent Extent.\n * @return {Extent} Extent.\n */\n\nfunction createOrUpdateFromCoordinates(coordinates, opt_extent) {\n var extent = createOrUpdateEmpty(opt_extent);\n return extendCoordinates(extent, coordinates);\n}\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {Extent=} opt_extent Extent.\n * @return {Extent} Extent.\n */\n\nfunction createOrUpdateFromFlatCoordinates(flatCoordinates, offset, end, stride, opt_extent) {\n var extent = createOrUpdateEmpty(opt_extent);\n return extendFlatCoordinates(extent, flatCoordinates, offset, end, stride);\n}\n/**\n * @param {Array>} rings Rings.\n * @param {Extent=} opt_extent Extent.\n * @return {Extent} Extent.\n */\n\nfunction createOrUpdateFromRings(rings, opt_extent) {\n var extent = createOrUpdateEmpty(opt_extent);\n return extendRings(extent, rings);\n}\n/**\n * Determine if two extents are equivalent.\n * @param {Extent} extent1 Extent 1.\n * @param {Extent} extent2 Extent 2.\n * @return {boolean} The two extents are equivalent.\n * @api\n */\n\nfunction extent_equals(extent1, extent2) {\n return extent1[0] == extent2[0] && extent1[2] == extent2[2] && extent1[1] == extent2[1] && extent1[3] == extent2[3];\n}\n/**\n * Determine if two extents are approximately equivalent.\n * @param {Extent} extent1 Extent 1.\n * @param {Extent} extent2 Extent 2.\n * @param {number} tolerance Tolerance in extent coordinate units.\n * @return {boolean} The two extents differ by less than the tolerance.\n */\n\nfunction approximatelyEquals(extent1, extent2, tolerance) {\n return Math.abs(extent1[0] - extent2[0]) < tolerance && Math.abs(extent1[2] - extent2[2]) < tolerance && Math.abs(extent1[1] - extent2[1]) < tolerance && Math.abs(extent1[3] - extent2[3]) < tolerance;\n}\n/**\n * Modify an extent to include another extent.\n * @param {Extent} extent1 The extent to be modified.\n * @param {Extent} extent2 The extent that will be included in the first.\n * @return {Extent} A reference to the first (extended) extent.\n * @api\n */\n\nfunction extent_extend(extent1, extent2) {\n if (extent2[0] < extent1[0]) {\n extent1[0] = extent2[0];\n }\n\n if (extent2[2] > extent1[2]) {\n extent1[2] = extent2[2];\n }\n\n if (extent2[1] < extent1[1]) {\n extent1[1] = extent2[1];\n }\n\n if (extent2[3] > extent1[3]) {\n extent1[3] = extent2[3];\n }\n\n return extent1;\n}\n/**\n * @param {Extent} extent Extent.\n * @param {import("./coordinate.js").Coordinate} coordinate Coordinate.\n */\n\nfunction extendCoordinate(extent, coordinate) {\n if (coordinate[0] < extent[0]) {\n extent[0] = coordinate[0];\n }\n\n if (coordinate[0] > extent[2]) {\n extent[2] = coordinate[0];\n }\n\n if (coordinate[1] < extent[1]) {\n extent[1] = coordinate[1];\n }\n\n if (coordinate[1] > extent[3]) {\n extent[3] = coordinate[1];\n }\n}\n/**\n * @param {Extent} extent Extent.\n * @param {Array} coordinates Coordinates.\n * @return {Extent} Extent.\n */\n\nfunction extendCoordinates(extent, coordinates) {\n for (var i = 0, ii = coordinates.length; i < ii; ++i) {\n extendCoordinate(extent, coordinates[i]);\n }\n\n return extent;\n}\n/**\n * @param {Extent} extent Extent.\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @return {Extent} Extent.\n */\n\nfunction extendFlatCoordinates(extent, flatCoordinates, offset, end, stride) {\n for (; offset < end; offset += stride) {\n extendXY(extent, flatCoordinates[offset], flatCoordinates[offset + 1]);\n }\n\n return extent;\n}\n/**\n * @param {Extent} extent Extent.\n * @param {Array>} rings Rings.\n * @return {Extent} Extent.\n */\n\nfunction extendRings(extent, rings) {\n for (var i = 0, ii = rings.length; i < ii; ++i) {\n extendCoordinates(extent, rings[i]);\n }\n\n return extent;\n}\n/**\n * @param {Extent} extent Extent.\n * @param {number} x X.\n * @param {number} y Y.\n */\n\nfunction extendXY(extent, x, y) {\n extent[0] = Math.min(extent[0], x);\n extent[1] = Math.min(extent[1], y);\n extent[2] = Math.max(extent[2], x);\n extent[3] = Math.max(extent[3], y);\n}\n/**\n * This function calls `callback` for each corner of the extent. If the\n * callback returns a truthy value the function returns that value\n * immediately. Otherwise the function returns `false`.\n * @param {Extent} extent Extent.\n * @param {function(import("./coordinate.js").Coordinate): S} callback Callback.\n * @return {S|boolean} Value.\n * @template S\n */\n\nfunction forEachCorner(extent, callback) {\n var val;\n val = callback(getBottomLeft(extent));\n\n if (val) {\n return val;\n }\n\n val = callback(getBottomRight(extent));\n\n if (val) {\n return val;\n }\n\n val = callback(getTopRight(extent));\n\n if (val) {\n return val;\n }\n\n val = callback(getTopLeft(extent));\n\n if (val) {\n return val;\n }\n\n return false;\n}\n/**\n * Get the size of an extent.\n * @param {Extent} extent Extent.\n * @return {number} Area.\n * @api\n */\n\nfunction getArea(extent) {\n var area = 0;\n\n if (!extent_isEmpty(extent)) {\n area = extent_getWidth(extent) * getHeight(extent);\n }\n\n return area;\n}\n/**\n * Get the bottom left coordinate of an extent.\n * @param {Extent} extent Extent.\n * @return {import("./coordinate.js").Coordinate} Bottom left coordinate.\n * @api\n */\n\nfunction getBottomLeft(extent) {\n return [extent[0], extent[1]];\n}\n/**\n * Get the bottom right coordinate of an extent.\n * @param {Extent} extent Extent.\n * @return {import("./coordinate.js").Coordinate} Bottom right coordinate.\n * @api\n */\n\nfunction getBottomRight(extent) {\n return [extent[2], extent[1]];\n}\n/**\n * Get the center coordinate of an extent.\n * @param {Extent} extent Extent.\n * @return {import("./coordinate.js").Coordinate} Center.\n * @api\n */\n\nfunction getCenter(extent) {\n return [(extent[0] + extent[2]) / 2, (extent[1] + extent[3]) / 2];\n}\n/**\n * Get a corner coordinate of an extent.\n * @param {Extent} extent Extent.\n * @param {import("./extent/Corner.js").default} corner Corner.\n * @return {import("./coordinate.js").Coordinate} Corner coordinate.\n */\n\nfunction getCorner(extent, corner) {\n var coordinate;\n\n if (corner === extent_Corner.BOTTOM_LEFT) {\n coordinate = getBottomLeft(extent);\n } else if (corner === extent_Corner.BOTTOM_RIGHT) {\n coordinate = getBottomRight(extent);\n } else if (corner === extent_Corner.TOP_LEFT) {\n coordinate = getTopLeft(extent);\n } else if (corner === extent_Corner.TOP_RIGHT) {\n coordinate = getTopRight(extent);\n } else {\n asserts_assert(false, 13); // Invalid corner\n }\n\n return coordinate;\n}\n/**\n * @param {Extent} extent1 Extent 1.\n * @param {Extent} extent2 Extent 2.\n * @return {number} Enlarged area.\n */\n\nfunction getEnlargedArea(extent1, extent2) {\n var minX = Math.min(extent1[0], extent2[0]);\n var minY = Math.min(extent1[1], extent2[1]);\n var maxX = Math.max(extent1[2], extent2[2]);\n var maxY = Math.max(extent1[3], extent2[3]);\n return (maxX - minX) * (maxY - minY);\n}\n/**\n * @param {import("./coordinate.js").Coordinate} center Center.\n * @param {number} resolution Resolution.\n * @param {number} rotation Rotation.\n * @param {import("./size.js").Size} size Size.\n * @param {Extent=} opt_extent Destination extent.\n * @return {Extent} Extent.\n */\n\nfunction getForViewAndSize(center, resolution, rotation, size, opt_extent) {\n var dx = resolution * size[0] / 2;\n var dy = resolution * size[1] / 2;\n var cosRotation = Math.cos(rotation);\n var sinRotation = Math.sin(rotation);\n var xCos = dx * cosRotation;\n var xSin = dx * sinRotation;\n var yCos = dy * cosRotation;\n var ySin = dy * sinRotation;\n var x = center[0];\n var y = center[1];\n var x0 = x - xCos + ySin;\n var x1 = x - xCos - ySin;\n var x2 = x + xCos - ySin;\n var x3 = x + xCos + ySin;\n var y0 = y - xSin - yCos;\n var y1 = y - xSin + yCos;\n var y2 = y + xSin + yCos;\n var y3 = y + xSin - yCos;\n return createOrUpdate(Math.min(x0, x1, x2, x3), Math.min(y0, y1, y2, y3), Math.max(x0, x1, x2, x3), Math.max(y0, y1, y2, y3), opt_extent);\n}\n/**\n * Get the height of an extent.\n * @param {Extent} extent Extent.\n * @return {number} Height.\n * @api\n */\n\nfunction getHeight(extent) {\n return extent[3] - extent[1];\n}\n/**\n * @param {Extent} extent1 Extent 1.\n * @param {Extent} extent2 Extent 2.\n * @return {number} Intersection area.\n */\n\nfunction getIntersectionArea(extent1, extent2) {\n var intersection = getIntersection(extent1, extent2);\n return getArea(intersection);\n}\n/**\n * Get the intersection of two extents.\n * @param {Extent} extent1 Extent 1.\n * @param {Extent} extent2 Extent 2.\n * @param {Extent=} opt_extent Optional extent to populate with intersection.\n * @return {Extent} Intersecting extent.\n * @api\n */\n\nfunction getIntersection(extent1, extent2, opt_extent) {\n var intersection = opt_extent ? opt_extent : createEmpty();\n\n if (intersects(extent1, extent2)) {\n if (extent1[0] > extent2[0]) {\n intersection[0] = extent1[0];\n } else {\n intersection[0] = extent2[0];\n }\n\n if (extent1[1] > extent2[1]) {\n intersection[1] = extent1[1];\n } else {\n intersection[1] = extent2[1];\n }\n\n if (extent1[2] < extent2[2]) {\n intersection[2] = extent1[2];\n } else {\n intersection[2] = extent2[2];\n }\n\n if (extent1[3] < extent2[3]) {\n intersection[3] = extent1[3];\n } else {\n intersection[3] = extent2[3];\n }\n } else {\n createOrUpdateEmpty(intersection);\n }\n\n return intersection;\n}\n/**\n * @param {Extent} extent Extent.\n * @return {number} Margin.\n */\n\nfunction getMargin(extent) {\n return extent_getWidth(extent) + getHeight(extent);\n}\n/**\n * Get the size (width, height) of an extent.\n * @param {Extent} extent The extent.\n * @return {import("./size.js").Size} The extent size.\n * @api\n */\n\nfunction getSize(extent) {\n return [extent[2] - extent[0], extent[3] - extent[1]];\n}\n/**\n * Get the top left coordinate of an extent.\n * @param {Extent} extent Extent.\n * @return {import("./coordinate.js").Coordinate} Top left coordinate.\n * @api\n */\n\nfunction getTopLeft(extent) {\n return [extent[0], extent[3]];\n}\n/**\n * Get the top right coordinate of an extent.\n * @param {Extent} extent Extent.\n * @return {import("./coordinate.js").Coordinate} Top right coordinate.\n * @api\n */\n\nfunction getTopRight(extent) {\n return [extent[2], extent[3]];\n}\n/**\n * Get the width of an extent.\n * @param {Extent} extent Extent.\n * @return {number} Width.\n * @api\n */\n\nfunction extent_getWidth(extent) {\n return extent[2] - extent[0];\n}\n/**\n * Determine if one extent intersects another.\n * @param {Extent} extent1 Extent 1.\n * @param {Extent} extent2 Extent.\n * @return {boolean} The two extents intersect.\n * @api\n */\n\nfunction intersects(extent1, extent2) {\n return extent1[0] <= extent2[2] && extent1[2] >= extent2[0] && extent1[1] <= extent2[3] && extent1[3] >= extent2[1];\n}\n/**\n * Determine if an extent is empty.\n * @param {Extent} extent Extent.\n * @return {boolean} Is empty.\n * @api\n */\n\nfunction extent_isEmpty(extent) {\n return extent[2] < extent[0] || extent[3] < extent[1];\n}\n/**\n * @param {Extent} extent Extent.\n * @param {Extent=} opt_extent Extent.\n * @return {Extent} Extent.\n */\n\nfunction returnOrUpdate(extent, opt_extent) {\n if (opt_extent) {\n opt_extent[0] = extent[0];\n opt_extent[1] = extent[1];\n opt_extent[2] = extent[2];\n opt_extent[3] = extent[3];\n return opt_extent;\n } else {\n return extent;\n }\n}\n/**\n * @param {Extent} extent Extent.\n * @param {number} value Value.\n */\n\nfunction scaleFromCenter(extent, value) {\n var deltaX = (extent[2] - extent[0]) / 2 * (value - 1);\n var deltaY = (extent[3] - extent[1]) / 2 * (value - 1);\n extent[0] -= deltaX;\n extent[2] += deltaX;\n extent[1] -= deltaY;\n extent[3] += deltaY;\n}\n/**\n * Determine if the segment between two coordinates intersects (crosses,\n * touches, or is contained by) the provided extent.\n * @param {Extent} extent The extent.\n * @param {import("./coordinate.js").Coordinate} start Segment start coordinate.\n * @param {import("./coordinate.js").Coordinate} end Segment end coordinate.\n * @return {boolean} The segment intersects the extent.\n */\n\nfunction intersectsSegment(extent, start, end) {\n var intersects = false;\n var startRel = coordinateRelationship(extent, start);\n var endRel = coordinateRelationship(extent, end);\n\n if (startRel === extent_Relationship.INTERSECTING || endRel === extent_Relationship.INTERSECTING) {\n intersects = true;\n } else {\n var minX = extent[0];\n var minY = extent[1];\n var maxX = extent[2];\n var maxY = extent[3];\n var startX = start[0];\n var startY = start[1];\n var endX = end[0];\n var endY = end[1];\n var slope = (endY - startY) / (endX - startX);\n var x = void 0,\n y = void 0;\n\n if (!!(endRel & extent_Relationship.ABOVE) && !(startRel & extent_Relationship.ABOVE)) {\n // potentially intersects top\n x = endX - (endY - maxY) / slope;\n intersects = x >= minX && x <= maxX;\n }\n\n if (!intersects && !!(endRel & extent_Relationship.RIGHT) && !(startRel & extent_Relationship.RIGHT)) {\n // potentially intersects right\n y = endY - (endX - maxX) * slope;\n intersects = y >= minY && y <= maxY;\n }\n\n if (!intersects && !!(endRel & extent_Relationship.BELOW) && !(startRel & extent_Relationship.BELOW)) {\n // potentially intersects bottom\n x = endX - (endY - minY) / slope;\n intersects = x >= minX && x <= maxX;\n }\n\n if (!intersects && !!(endRel & extent_Relationship.LEFT) && !(startRel & extent_Relationship.LEFT)) {\n // potentially intersects left\n y = endY - (endX - minX) * slope;\n intersects = y >= minY && y <= maxY;\n }\n }\n\n return intersects;\n}\n/**\n * Apply a transform function to the extent.\n * @param {Extent} extent Extent.\n * @param {import("./proj.js").TransformFunction} transformFn Transform function.\n * Called with `[minX, minY, maxX, maxY]` extent coordinates.\n * @param {Extent=} opt_extent Destination extent.\n * @param {number=} opt_stops Number of stops per side used for the transform.\n * By default only the corners are used.\n * @return {Extent} Extent.\n * @api\n */\n\nfunction applyTransform(extent, transformFn, opt_extent, opt_stops) {\n var coordinates = [];\n\n if (opt_stops > 1) {\n var width = extent[2] - extent[0];\n var height = extent[3] - extent[1];\n\n for (var i = 0; i < opt_stops; ++i) {\n coordinates.push(extent[0] + width * i / opt_stops, extent[1], extent[2], extent[1] + height * i / opt_stops, extent[2] - width * i / opt_stops, extent[3], extent[0], extent[3] - height * i / opt_stops);\n }\n } else {\n coordinates = [extent[0], extent[1], extent[2], extent[1], extent[2], extent[3], extent[0], extent[3]];\n }\n\n transformFn(coordinates, coordinates, 2);\n var xs = [];\n var ys = [];\n\n for (var i = 0, l = coordinates.length; i < l; i += 2) {\n xs.push(coordinates[i]);\n ys.push(coordinates[i + 1]);\n }\n\n return _boundingExtentXYs(xs, ys, opt_extent);\n}\n/**\n * Modifies the provided extent in-place to be within the real world\n * extent.\n *\n * @param {Extent} extent Extent.\n * @param {import("./proj/Projection.js").default} projection Projection\n * @return {Extent} The extent within the real world extent.\n */\n\nfunction wrapX(extent, projection) {\n var projectionExtent = projection.getExtent();\n var center = getCenter(extent);\n\n if (projection.canWrapX() && (center[0] < projectionExtent[0] || center[0] >= projectionExtent[2])) {\n var worldWidth = extent_getWidth(projectionExtent);\n var worldsAway = Math.floor((center[0] - projectionExtent[0]) / worldWidth);\n var offset = worldsAway * worldWidth;\n extent[0] -= offset;\n extent[2] -= offset;\n }\n\n return extent;\n}\n;// CONCATENATED MODULE: ./node_modules/ol/math.js\n/**\n * @module ol/math\n */\n\n/**\n * Takes a number and clamps it to within the provided bounds.\n * @param {number} value The input number.\n * @param {number} min The minimum value to return.\n * @param {number} max The maximum value to return.\n * @return {number} The input number if it is within bounds, or the nearest\n * number within the bounds.\n */\nfunction math_clamp(value, min, max) {\n return Math.min(Math.max(value, min), max);\n}\n/**\n * Return the hyperbolic cosine of a given number. The method will use the\n * native `Math.cosh` function if it is available, otherwise the hyperbolic\n * cosine will be calculated via the reference implementation of the Mozilla\n * developer network.\n *\n * @param {number} x X.\n * @return {number} Hyperbolic cosine of x.\n */\n\nvar cosh = function () {\n // Wrapped in a iife, to save the overhead of checking for the native\n // implementation on every invocation.\n var cosh;\n\n if (\'cosh\' in Math) {\n // The environment supports the native Math.cosh function, use it…\n cosh = Math.cosh;\n } else {\n // … else, use the reference implementation of MDN:\n cosh = function cosh(x) {\n var y =\n /** @type {Math} */\n Math.exp(x);\n return (y + 1 / y) / 2;\n };\n }\n\n return cosh;\n}();\n/**\n * Return the base 2 logarithm of a given number. The method will use the\n * native `Math.log2` function if it is available, otherwise the base 2\n * logarithm will be calculated via the reference implementation of the\n * Mozilla developer network.\n *\n * @param {number} x X.\n * @return {number} Base 2 logarithm of x.\n */\n\nvar log2 = function () {\n // Wrapped in a iife, to save the overhead of checking for the native\n // implementation on every invocation.\n var log2;\n\n if (\'log2\' in Math) {\n // The environment supports the native Math.log2 function, use it…\n log2 = Math.log2;\n } else {\n // … else, use the reference implementation of MDN:\n log2 = function log2(x) {\n return Math.log(x) * Math.LOG2E;\n };\n }\n\n return log2;\n}();\n/**\n * Returns the square of the closest distance between the point (x, y) and the\n * line segment (x1, y1) to (x2, y2).\n * @param {number} x X.\n * @param {number} y Y.\n * @param {number} x1 X1.\n * @param {number} y1 Y1.\n * @param {number} x2 X2.\n * @param {number} y2 Y2.\n * @return {number} Squared distance.\n */\n\nfunction squaredSegmentDistance(x, y, x1, y1, x2, y2) {\n var dx = x2 - x1;\n var dy = y2 - y1;\n\n if (dx !== 0 || dy !== 0) {\n var t = ((x - x1) * dx + (y - y1) * dy) / (dx * dx + dy * dy);\n\n if (t > 1) {\n x1 = x2;\n y1 = y2;\n } else if (t > 0) {\n x1 += dx * t;\n y1 += dy * t;\n }\n }\n\n return math_squaredDistance(x, y, x1, y1);\n}\n/**\n * Returns the square of the distance between the points (x1, y1) and (x2, y2).\n * @param {number} x1 X1.\n * @param {number} y1 Y1.\n * @param {number} x2 X2.\n * @param {number} y2 Y2.\n * @return {number} Squared distance.\n */\n\nfunction math_squaredDistance(x1, y1, x2, y2) {\n var dx = x2 - x1;\n var dy = y2 - y1;\n return dx * dx + dy * dy;\n}\n/**\n * Solves system of linear equations using Gaussian elimination method.\n *\n * @param {Array>} mat Augmented matrix (n x n + 1 column)\n * in row-major order.\n * @return {Array} The resulting vector.\n */\n\nfunction solveLinearSystem(mat) {\n var n = mat.length;\n\n for (var i = 0; i < n; i++) {\n // Find max in the i-th column (ignoring i - 1 first rows)\n var maxRow = i;\n var maxEl = Math.abs(mat[i][i]);\n\n for (var r = i + 1; r < n; r++) {\n var absValue = Math.abs(mat[r][i]);\n\n if (absValue > maxEl) {\n maxEl = absValue;\n maxRow = r;\n }\n }\n\n if (maxEl === 0) {\n return null; // matrix is singular\n } // Swap max row with i-th (current) row\n\n\n var tmp = mat[maxRow];\n mat[maxRow] = mat[i];\n mat[i] = tmp; // Subtract the i-th row to make all the remaining rows 0 in the i-th column\n\n for (var j = i + 1; j < n; j++) {\n var coef = -mat[j][i] / mat[i][i];\n\n for (var k = i; k < n + 1; k++) {\n if (i == k) {\n mat[j][k] = 0;\n } else {\n mat[j][k] += coef * mat[i][k];\n }\n }\n }\n } // Solve Ax=b for upper triangular matrix A (mat)\n\n\n var x = new Array(n);\n\n for (var l = n - 1; l >= 0; l--) {\n x[l] = mat[l][n] / mat[l][l];\n\n for (var m = l - 1; m >= 0; m--) {\n mat[m][n] -= mat[m][l] * x[l];\n }\n }\n\n return x;\n}\n/**\n * Converts radians to to degrees.\n *\n * @param {number} angleInRadians Angle in radians.\n * @return {number} Angle in degrees.\n */\n\nfunction math_toDegrees(angleInRadians) {\n return angleInRadians * 180 / Math.PI;\n}\n/**\n * Converts degrees to radians.\n *\n * @param {number} angleInDegrees Angle in degrees.\n * @return {number} Angle in radians.\n */\n\nfunction math_toRadians(angleInDegrees) {\n return angleInDegrees * Math.PI / 180;\n}\n/**\n * Returns the modulo of a / b, depending on the sign of b.\n *\n * @param {number} a Dividend.\n * @param {number} b Divisor.\n * @return {number} Modulo.\n */\n\nfunction math_modulo(a, b) {\n var r = a % b;\n return r * b < 0 ? r + b : r;\n}\n/**\n * Calculates the linearly interpolated value of x between a and b.\n *\n * @param {number} a Number\n * @param {number} b Number\n * @param {number} x Value to be interpolated.\n * @return {number} Interpolated value.\n */\n\nfunction lerp(a, b, x) {\n return a + x * (b - a);\n}\n;// CONCATENATED MODULE: ./node_modules/ol/color.js\n/**\n * @module ol/color\n */\n\n\n/**\n * A color represented as a short array [red, green, blue, alpha].\n * red, green, and blue should be integers in the range 0..255 inclusive.\n * alpha should be a float in the range 0..1 inclusive. If no alpha value is\n * given then `1` will be used.\n * @typedef {Array} Color\n * @api\n */\n\n/**\n * This RegExp matches # followed by 3, 4, 6, or 8 hex digits.\n * @const\n * @type {RegExp}\n * @private\n */\n\nvar HEX_COLOR_RE_ = /^#([a-f0-9]{3}|[a-f0-9]{4}(?:[a-f0-9]{2}){0,2})$/i;\n/**\n * Regular expression for matching potential named color style strings.\n * @const\n * @type {RegExp}\n * @private\n */\n\nvar NAMED_COLOR_RE_ = /^([a-z]*)$|^hsla?\\(.*\\)$/i;\n/**\n * Return the color as an rgba string.\n * @param {Color|string} color Color.\n * @return {string} Rgba string.\n * @api\n */\n\nfunction asString(color) {\n if (typeof color === \'string\') {\n return color;\n } else {\n return color_toString(color);\n }\n}\n/**\n * Return named color as an rgba string.\n * @param {string} color Named color.\n * @return {string} Rgb string.\n */\n\nfunction fromNamed(color) {\n var el = document.createElement(\'div\');\n el.style.color = color;\n\n if (el.style.color !== \'\') {\n document.body.appendChild(el);\n var rgb = getComputedStyle(el).color;\n document.body.removeChild(el);\n return rgb;\n } else {\n return \'\';\n }\n}\n/**\n * @param {string} s String.\n * @return {Color} Color.\n */\n\n\nvar fromString = function () {\n // We maintain a small cache of parsed strings. To provide cheap LRU-like\n // semantics, whenever the cache grows too large we simply delete an\n // arbitrary 25% of the entries.\n\n /**\n * @const\n * @type {number}\n */\n var MAX_CACHE_SIZE = 1024;\n /**\n * @type {Object}\n */\n\n var cache = {};\n /**\n * @type {number}\n */\n\n var cacheSize = 0;\n return (\n /**\n * @param {string} s String.\n * @return {Color} Color.\n */\n function (s) {\n var color;\n\n if (cache.hasOwnProperty(s)) {\n color = cache[s];\n } else {\n if (cacheSize >= MAX_CACHE_SIZE) {\n var i = 0;\n\n for (var key in cache) {\n if ((i++ & 3) === 0) {\n delete cache[key];\n --cacheSize;\n }\n }\n }\n\n color = fromStringInternal_(s);\n cache[s] = color;\n ++cacheSize;\n }\n\n return color;\n }\n );\n}();\n/**\n * Return the color as an array. This function maintains a cache of calculated\n * arrays which means the result should not be modified.\n * @param {Color|string} color Color.\n * @return {Color} Color.\n * @api\n */\n\nfunction asArray(color) {\n if (Array.isArray(color)) {\n return color;\n } else {\n return fromString(color);\n }\n}\n/**\n * @param {string} s String.\n * @private\n * @return {Color} Color.\n */\n\nfunction fromStringInternal_(s) {\n var r, g, b, a, color;\n\n if (NAMED_COLOR_RE_.exec(s)) {\n s = fromNamed(s);\n }\n\n if (HEX_COLOR_RE_.exec(s)) {\n // hex\n var n = s.length - 1; // number of hex digits\n\n var d = // number of digits per channel\n void 0; // number of digits per channel\n\n if (n <= 4) {\n d = 1;\n } else {\n d = 2;\n }\n\n var hasAlpha = n === 4 || n === 8;\n r = parseInt(s.substr(1 + 0 * d, d), 16);\n g = parseInt(s.substr(1 + 1 * d, d), 16);\n b = parseInt(s.substr(1 + 2 * d, d), 16);\n\n if (hasAlpha) {\n a = parseInt(s.substr(1 + 3 * d, d), 16);\n } else {\n a = 255;\n }\n\n if (d == 1) {\n r = (r << 4) + r;\n g = (g << 4) + g;\n b = (b << 4) + b;\n\n if (hasAlpha) {\n a = (a << 4) + a;\n }\n }\n\n color = [r, g, b, a / 255];\n } else if (s.indexOf(\'rgba(\') == 0) {\n // rgba()\n color = s.slice(5, -1).split(\',\').map(Number);\n normalize(color);\n } else if (s.indexOf(\'rgb(\') == 0) {\n // rgb()\n color = s.slice(4, -1).split(\',\').map(Number);\n color.push(1);\n normalize(color);\n } else {\n asserts_assert(false, 14); // Invalid color\n }\n\n return color;\n}\n/**\n * TODO this function is only used in the test, we probably shouldn\'t export it\n * @param {Color} color Color.\n * @return {Color} Clamped color.\n */\n\n\nfunction normalize(color) {\n color[0] = math_clamp(color[0] + 0.5 | 0, 0, 255);\n color[1] = math_clamp(color[1] + 0.5 | 0, 0, 255);\n color[2] = math_clamp(color[2] + 0.5 | 0, 0, 255);\n color[3] = math_clamp(color[3], 0, 1);\n return color;\n}\n/**\n * @param {Color} color Color.\n * @return {string} String.\n */\n\nfunction color_toString(color) {\n var r = color[0];\n\n if (r != (r | 0)) {\n r = r + 0.5 | 0;\n }\n\n var g = color[1];\n\n if (g != (g | 0)) {\n g = g + 0.5 | 0;\n }\n\n var b = color[2];\n\n if (b != (b | 0)) {\n b = b + 0.5 | 0;\n }\n\n var a = color[3] === undefined ? 1 : color[3];\n return \'rgba(\' + r + \',\' + g + \',\' + b + \',\' + a + \')\';\n}\n/**\n * @param {string} s String.\n * @return {boolean} Whether the string is actually a valid color\n */\n\nfunction isStringColor(s) {\n if (NAMED_COLOR_RE_.test(s)) {\n s = fromNamed(s);\n }\n\n return HEX_COLOR_RE_.test(s) || s.indexOf(\'rgba(\') === 0 || s.indexOf(\'rgb(\') === 0;\n}\n;// CONCATENATED MODULE: ./node_modules/ol/style/IconImageCache.js\n/**\n * @module ol/style/IconImageCache\n */\n\n/**\n * @classdesc\n * Singleton class. Available through {@link module:ol/style/IconImageCache~shared}.\n */\n\nvar IconImageCache =\n/** @class */\nfunction () {\n function IconImageCache() {\n /**\n * @type {!Object}\n * @private\n */\n this.cache_ = {};\n /**\n * @type {number}\n * @private\n */\n\n this.cacheSize_ = 0;\n /**\n * @type {number}\n * @private\n */\n\n this.maxCacheSize_ = 32;\n }\n /**\n * FIXME empty description for jsdoc\n */\n\n\n IconImageCache.prototype.clear = function () {\n this.cache_ = {};\n this.cacheSize_ = 0;\n };\n /**\n * @return {boolean} Can expire cache.\n */\n\n\n IconImageCache.prototype.canExpireCache = function () {\n return this.cacheSize_ > this.maxCacheSize_;\n };\n /**\n * FIXME empty description for jsdoc\n */\n\n\n IconImageCache.prototype.expire = function () {\n if (this.canExpireCache()) {\n var i = 0;\n\n for (var key in this.cache_) {\n var iconImage = this.cache_[key];\n\n if ((i++ & 3) === 0 && !iconImage.hasListener()) {\n delete this.cache_[key];\n --this.cacheSize_;\n }\n }\n }\n };\n /**\n * @param {string} src Src.\n * @param {?string} crossOrigin Cross origin.\n * @param {import("../color.js").Color} color Color.\n * @return {import("./IconImage.js").default} Icon image.\n */\n\n\n IconImageCache.prototype.get = function (src, crossOrigin, color) {\n var key = getKey(src, crossOrigin, color);\n return key in this.cache_ ? this.cache_[key] : null;\n };\n /**\n * @param {string} src Src.\n * @param {?string} crossOrigin Cross origin.\n * @param {import("../color.js").Color} color Color.\n * @param {import("./IconImage.js").default} iconImage Icon image.\n */\n\n\n IconImageCache.prototype.set = function (src, crossOrigin, color, iconImage) {\n var key = getKey(src, crossOrigin, color);\n this.cache_[key] = iconImage;\n ++this.cacheSize_;\n };\n /**\n * Set the cache size of the icon cache. Default is `32`. Change this value when\n * your map uses more than 32 different icon images and you are not caching icon\n * styles on the application level.\n * @param {number} maxCacheSize Cache max size.\n * @api\n */\n\n\n IconImageCache.prototype.setSize = function (maxCacheSize) {\n this.maxCacheSize_ = maxCacheSize;\n this.expire();\n };\n\n return IconImageCache;\n}();\n/**\n * @param {string} src Src.\n * @param {?string} crossOrigin Cross origin.\n * @param {import("../color.js").Color} color Color.\n * @return {string} Cache key.\n */\n\n\nfunction getKey(src, crossOrigin, color) {\n var colorString = color ? asString(color) : \'null\';\n return crossOrigin + \':\' + src + \':\' + colorString;\n}\n\n/* harmony default export */ var style_IconImageCache = ((/* unused pure expression or super */ null && (IconImageCache)));\n/**\n * The {@link module:ol/style/IconImageCache~IconImageCache} for\n * {@link module:ol/style/Icon~Icon} images.\n * @api\n */\n\nvar shared = new IconImageCache();\n;// CONCATENATED MODULE: ./node_modules/ol/events/Event.js\n/**\n * @module ol/events/Event\n */\n\n/**\n * @classdesc\n * Stripped down implementation of the W3C DOM Level 2 Event interface.\n * See https://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-interface.\n *\n * This implementation only provides `type` and `target` properties, and\n * `stopPropagation` and `preventDefault` methods. It is meant as base class\n * for higher level events defined in the library, and works with\n * {@link module:ol/events/Target~Target}.\n */\nvar BaseEvent =\n/** @class */\nfunction () {\n /**\n * @param {string} type Type.\n */\n function BaseEvent(type) {\n /**\n * @type {boolean}\n */\n this.propagationStopped;\n /**\n * The event type.\n * @type {string}\n * @api\n */\n\n this.type = type;\n /**\n * The event target.\n * @type {Object}\n * @api\n */\n\n this.target = null;\n }\n /**\n * Stop event propagation.\n * @api\n */\n\n\n BaseEvent.prototype.preventDefault = function () {\n this.propagationStopped = true;\n };\n /**\n * Stop event propagation.\n * @api\n */\n\n\n BaseEvent.prototype.stopPropagation = function () {\n this.propagationStopped = true;\n };\n\n return BaseEvent;\n}();\n/**\n * @param {Event|import("./Event.js").default} evt Event\n */\n\n\nfunction stopPropagation(evt) {\n evt.stopPropagation();\n}\n/**\n * @param {Event|import("./Event.js").default} evt Event\n */\n\nfunction preventDefault(evt) {\n evt.preventDefault();\n}\n/* harmony default export */ var Event = (BaseEvent);\n;// CONCATENATED MODULE: ./node_modules/ol/ObjectEventType.js\n/**\n * @module ol/ObjectEventType\n */\n\n/**\n * @enum {string}\n */\n/* harmony default export */ var ObjectEventType = ({\n /**\n * Triggered when a property is changed.\n * @event module:ol/Object.ObjectEvent#propertychange\n * @api\n */\n PROPERTYCHANGE: \'propertychange\'\n});\n;// CONCATENATED MODULE: ./node_modules/ol/obj.js\n/**\n * @module ol/obj\n */\n\n/**\n * Polyfill for Object.assign(). Assigns enumerable and own properties from\n * one or more source objects to a target object.\n * See https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign.\n *\n * @param {!Object} target The target object.\n * @param {...Object} var_sources The source object(s).\n * @return {!Object} The modified target object.\n */\nvar obj_assign = typeof Object.assign === \'function\' ? Object.assign : function (target, var_sources) {\n if (target === undefined || target === null) {\n throw new TypeError(\'Cannot convert undefined or null to object\');\n }\n\n var output = Object(target);\n\n for (var i = 1, ii = arguments.length; i < ii; ++i) {\n var source = arguments[i];\n\n if (source !== undefined && source !== null) {\n for (var key in source) {\n if (source.hasOwnProperty(key)) {\n output[key] = source[key];\n }\n }\n }\n }\n\n return output;\n};\n/**\n * Removes all properties from an object.\n * @param {Object} object The object to clear.\n */\n\nfunction clear(object) {\n for (var property in object) {\n delete object[property];\n }\n}\n/**\n * Polyfill for Object.values(). Get an array of property values from an object.\n * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/values\n *\n * @param {!Object} object The object from which to get the values.\n * @return {!Array} The property values.\n * @template K,V\n */\n\nvar getValues = typeof Object.values === \'function\' ? Object.values : function (object) {\n var values = [];\n\n for (var property in object) {\n values.push(object[property]);\n }\n\n return values;\n};\n/**\n * Determine if an object has any properties.\n * @param {Object} object The object to check.\n * @return {boolean} The object is empty.\n */\n\nfunction obj_isEmpty(object) {\n var property;\n\n for (property in object) {\n return false;\n }\n\n return !property;\n}\n;// CONCATENATED MODULE: ./node_modules/ol/events/Target.js\nvar Target_extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n/**\n * @module ol/events/Target\n */\n\n\n\n\n\n\n/**\n * @typedef {EventTarget|Target} EventTargetLike\n */\n\n/**\n * @classdesc\n * A simplified implementation of the W3C DOM Level 2 EventTarget interface.\n * See https://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113/events.html#Events-EventTarget.\n *\n * There are two important simplifications compared to the specification:\n *\n * 1. The handling of `useCapture` in `addEventListener` and\n * `removeEventListener`. There is no real capture model.\n * 2. The handling of `stopPropagation` and `preventDefault` on `dispatchEvent`.\n * There is no event target hierarchy. When a listener calls\n * `stopPropagation` or `preventDefault` on an event object, it means that no\n * more listeners after this one will be called. Same as when the listener\n * returns false.\n */\n\nvar Target =\n/** @class */\nfunction (_super) {\n Target_extends(Target, _super);\n /**\n * @param {*=} opt_target Default event target for dispatched events.\n */\n\n\n function Target(opt_target) {\n var _this = _super.call(this) || this;\n /**\n * @private\n * @type {*}\n */\n\n\n _this.eventTarget_ = opt_target;\n /**\n * @private\n * @type {Object}\n */\n\n _this.pendingRemovals_ = null;\n /**\n * @private\n * @type {Object}\n */\n\n _this.dispatching_ = null;\n /**\n * @private\n * @type {Object>}\n */\n\n _this.listeners_ = null;\n return _this;\n }\n /**\n * @param {string} type Type.\n * @param {import("../events.js").Listener} listener Listener.\n */\n\n\n Target.prototype.addEventListener = function (type, listener) {\n if (!type || !listener) {\n return;\n }\n\n var listeners = this.listeners_ || (this.listeners_ = {});\n var listenersForType = listeners[type] || (listeners[type] = []);\n\n if (listenersForType.indexOf(listener) === -1) {\n listenersForType.push(listener);\n }\n };\n /**\n * Dispatches an event and calls all listeners listening for events\n * of this type. The event parameter can either be a string or an\n * Object with a `type` property.\n *\n * @param {import("./Event.js").default|string} event Event object.\n * @return {boolean|undefined} `false` if anyone called preventDefault on the\n * event object or if any of the listeners returned false.\n * @api\n */\n\n\n Target.prototype.dispatchEvent = function (event) {\n /** @type {import("./Event.js").default|Event} */\n var evt = typeof event === \'string\' ? new Event(event) : event;\n var type = evt.type;\n\n if (!evt.target) {\n evt.target = this.eventTarget_ || this;\n }\n\n var listeners = this.listeners_ && this.listeners_[type];\n var propagate;\n\n if (listeners) {\n var dispatching = this.dispatching_ || (this.dispatching_ = {});\n var pendingRemovals = this.pendingRemovals_ || (this.pendingRemovals_ = {});\n\n if (!(type in dispatching)) {\n dispatching[type] = 0;\n pendingRemovals[type] = 0;\n }\n\n ++dispatching[type];\n\n for (var i = 0, ii = listeners.length; i < ii; ++i) {\n if (\'handleEvent\' in listeners[i]) {\n propagate =\n /** @type {import("../events.js").ListenerObject} */\n listeners[i].handleEvent(evt);\n } else {\n propagate =\n /** @type {import("../events.js").ListenerFunction} */\n listeners[i].call(this, evt);\n }\n\n if (propagate === false || evt.propagationStopped) {\n propagate = false;\n break;\n }\n }\n\n --dispatching[type];\n\n if (dispatching[type] === 0) {\n var pr = pendingRemovals[type];\n delete pendingRemovals[type];\n\n while (pr--) {\n this.removeEventListener(type, VOID);\n }\n\n delete dispatching[type];\n }\n\n return propagate;\n }\n };\n /**\n * Clean up.\n */\n\n\n Target.prototype.disposeInternal = function () {\n this.listeners_ && clear(this.listeners_);\n };\n /**\n * Get the listeners for a specified event type. Listeners are returned in the\n * order that they will be called in.\n *\n * @param {string} type Type.\n * @return {Array|undefined} Listeners.\n */\n\n\n Target.prototype.getListeners = function (type) {\n return this.listeners_ && this.listeners_[type] || undefined;\n };\n /**\n * @param {string=} opt_type Type. If not provided,\n * `true` will be returned if this event target has any listeners.\n * @return {boolean} Has listeners.\n */\n\n\n Target.prototype.hasListener = function (opt_type) {\n if (!this.listeners_) {\n return false;\n }\n\n return opt_type ? opt_type in this.listeners_ : Object.keys(this.listeners_).length > 0;\n };\n /**\n * @param {string} type Type.\n * @param {import("../events.js").Listener} listener Listener.\n */\n\n\n Target.prototype.removeEventListener = function (type, listener) {\n var listeners = this.listeners_ && this.listeners_[type];\n\n if (listeners) {\n var index = listeners.indexOf(listener);\n\n if (index !== -1) {\n if (this.pendingRemovals_ && type in this.pendingRemovals_) {\n // make listener a no-op, and remove later in #dispatchEvent()\n listeners[index] = VOID;\n ++this.pendingRemovals_[type];\n } else {\n listeners.splice(index, 1);\n\n if (listeners.length === 0) {\n delete this.listeners_[type];\n }\n }\n }\n }\n };\n\n return Target;\n}(ol_Disposable);\n\n/* harmony default export */ var events_Target = (Target);\n;// CONCATENATED MODULE: ./node_modules/ol/events/EventType.js\n/**\n * @module ol/events/EventType\n */\n\n/**\n * @enum {string}\n * @const\n */\n/* harmony default export */ var EventType = ({\n /**\n * Generic change event. Triggered when the revision counter is increased.\n * @event module:ol/events/Event~BaseEvent#change\n * @api\n */\n CHANGE: \'change\',\n\n /**\n * Generic error event. Triggered when an error occurs.\n * @event module:ol/events/Event~BaseEvent#error\n * @api\n */\n ERROR: \'error\',\n BLUR: \'blur\',\n CLEAR: \'clear\',\n CONTEXTMENU: \'contextmenu\',\n CLICK: \'click\',\n DBLCLICK: \'dblclick\',\n DRAGENTER: \'dragenter\',\n DRAGOVER: \'dragover\',\n DROP: \'drop\',\n FOCUS: \'focus\',\n KEYDOWN: \'keydown\',\n KEYPRESS: \'keypress\',\n LOAD: \'load\',\n RESIZE: \'resize\',\n TOUCHMOVE: \'touchmove\',\n WHEEL: \'wheel\'\n});\n;// CONCATENATED MODULE: ./node_modules/ol/events.js\n/**\n * @module ol/events\n */\n\n/**\n * Key to use with {@link module:ol/Observable~Observable#unByKey}.\n * @typedef {Object} EventsKey\n * @property {ListenerFunction} listener\n * @property {import("./events/Target.js").EventTargetLike} target\n * @property {string} type\n * @api\n */\n\n/**\n * Listener function. This function is called with an event object as argument.\n * When the function returns `false`, event propagation will stop.\n *\n * @typedef {function((Event|import("./events/Event.js").default)): (void|boolean)} ListenerFunction\n * @api\n */\n\n/**\n * @typedef {Object} ListenerObject\n * @property {ListenerFunction} handleEvent\n */\n\n/**\n * @typedef {ListenerFunction|ListenerObject} Listener\n */\n\n/**\n * Registers an event listener on an event target. Inspired by\n * https://google.github.io/closure-library/api/source/closure/goog/events/events.js.src.html\n *\n * This function efficiently binds a `listener` to a `this` object, and returns\n * a key for use with {@link module:ol/events~unlistenByKey}.\n *\n * @param {import("./events/Target.js").EventTargetLike} target Event target.\n * @param {string} type Event type.\n * @param {ListenerFunction} listener Listener.\n * @param {Object=} opt_this Object referenced by the `this` keyword in the\n * listener. Default is the `target`.\n * @param {boolean=} opt_once If true, add the listener as one-off listener.\n * @return {EventsKey} Unique key for the listener.\n */\n\nfunction listen(target, type, _listener, opt_this, opt_once) {\n if (opt_this && opt_this !== target) {\n _listener = _listener.bind(opt_this);\n }\n\n if (opt_once) {\n var originalListener_1 = _listener;\n\n _listener = function listener() {\n target.removeEventListener(type, _listener);\n originalListener_1.apply(this, arguments);\n };\n }\n\n var eventsKey = {\n target: target,\n type: type,\n listener: _listener\n };\n target.addEventListener(type, _listener);\n return eventsKey;\n}\n/**\n * Registers a one-off event listener on an event target. Inspired by\n * https://google.github.io/closure-library/api/source/closure/goog/events/events.js.src.html\n *\n * This function efficiently binds a `listener` as self-unregistering listener\n * to a `this` object, and returns a key for use with\n * {@link module:ol/events~unlistenByKey} in case the listener needs to be\n * unregistered before it is called.\n *\n * When {@link module:ol/events~listen} is called with the same arguments after this\n * function, the self-unregistering listener will be turned into a permanent\n * listener.\n *\n * @param {import("./events/Target.js").EventTargetLike} target Event target.\n * @param {string} type Event type.\n * @param {ListenerFunction} listener Listener.\n * @param {Object=} opt_this Object referenced by the `this` keyword in the\n * listener. Default is the `target`.\n * @return {EventsKey} Key for unlistenByKey.\n */\n\nfunction listenOnce(target, type, listener, opt_this) {\n return listen(target, type, listener, opt_this, true);\n}\n/**\n * Unregisters event listeners on an event target. Inspired by\n * https://google.github.io/closure-library/api/source/closure/goog/events/events.js.src.html\n *\n * The argument passed to this function is the key returned from\n * {@link module:ol/events~listen} or {@link module:ol/events~listenOnce}.\n *\n * @param {EventsKey} key The key.\n */\n\nfunction unlistenByKey(key) {\n if (key && key.target) {\n key.target.removeEventListener(key.type, key.listener);\n clear(key);\n }\n}\n;// CONCATENATED MODULE: ./node_modules/ol/Observable.js\nvar Observable_extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n/**\n * @module ol/Observable\n */\n\n\n\n\n\n/**\n * @classdesc\n * Abstract base class; normally only used for creating subclasses and not\n * instantiated in apps.\n * An event target providing convenient methods for listener registration\n * and unregistration. A generic `change` event is always available through\n * {@link module:ol/Observable~Observable#changed}.\n *\n * @fires import("./events/Event.js").default\n * @api\n */\n\nvar Observable =\n/** @class */\nfunction (_super) {\n Observable_extends(Observable, _super);\n\n function Observable() {\n var _this = _super.call(this) || this;\n /**\n * @private\n * @type {number}\n */\n\n\n _this.revision_ = 0;\n return _this;\n }\n /**\n * Increases the revision counter and dispatches a \'change\' event.\n * @api\n */\n\n\n Observable.prototype.changed = function () {\n ++this.revision_;\n this.dispatchEvent(EventType.CHANGE);\n };\n /**\n * Get the version number for this object. Each time the object is modified,\n * its version number will be incremented.\n * @return {number} Revision.\n * @api\n */\n\n\n Observable.prototype.getRevision = function () {\n return this.revision_;\n };\n /**\n * Listen for a certain type of event.\n * @param {string|Array} type The event type or array of event types.\n * @param {function(?): ?} listener The listener function.\n * @return {import("./events.js").EventsKey|Array} Unique key for the listener. If\n * called with an array of event types as the first argument, the return\n * will be an array of keys.\n * @api\n */\n\n\n Observable.prototype.on = function (type, listener) {\n if (Array.isArray(type)) {\n var len = type.length;\n var keys = new Array(len);\n\n for (var i = 0; i < len; ++i) {\n keys[i] = listen(this, type[i], listener);\n }\n\n return keys;\n } else {\n return listen(this,\n /** @type {string} */\n type, listener);\n }\n };\n /**\n * Listen once for a certain type of event.\n * @param {string|Array} type The event type or array of event types.\n * @param {function(?): ?} listener The listener function.\n * @return {import("./events.js").EventsKey|Array} Unique key for the listener. If\n * called with an array of event types as the first argument, the return\n * will be an array of keys.\n * @api\n */\n\n\n Observable.prototype.once = function (type, listener) {\n var key;\n\n if (Array.isArray(type)) {\n var len = type.length;\n key = new Array(len);\n\n for (var i = 0; i < len; ++i) {\n key[i] = listenOnce(this, type[i], listener);\n }\n } else {\n key = listenOnce(this,\n /** @type {string} */\n type, listener);\n }\n /** @type {Object} */\n\n\n listener.ol_key = key;\n return key;\n };\n /**\n * Unlisten for a certain type of event.\n * @param {string|Array} type The event type or array of event types.\n * @param {function(?): ?} listener The listener function.\n * @api\n */\n\n\n Observable.prototype.un = function (type, listener) {\n var key =\n /** @type {Object} */\n listener.ol_key;\n\n if (key) {\n unByKey(key);\n } else if (Array.isArray(type)) {\n for (var i = 0, ii = type.length; i < ii; ++i) {\n this.removeEventListener(type[i], listener);\n }\n } else {\n this.removeEventListener(type, listener);\n }\n };\n\n return Observable;\n}(events_Target);\n/**\n * Removes an event listener using the key returned by `on()` or `once()`.\n * @param {import("./events.js").EventsKey|Array} key The key returned by `on()`\n * or `once()` (or an array of keys).\n * @api\n */\n\n\nfunction unByKey(key) {\n if (Array.isArray(key)) {\n for (var i = 0, ii = key.length; i < ii; ++i) {\n unlistenByKey(key[i]);\n }\n } else {\n unlistenByKey(\n /** @type {import("./events.js").EventsKey} */\n key);\n }\n}\n/* harmony default export */ var ol_Observable = (Observable);\n;// CONCATENATED MODULE: ./node_modules/ol/Object.js\nvar Object_extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n/**\n * @module ol/Object\n */\n\n\n\n\n\n\n\n/**\n * @classdesc\n * Events emitted by {@link module:ol/Object~BaseObject} instances are instances of this type.\n */\n\nvar ObjectEvent =\n/** @class */\nfunction (_super) {\n Object_extends(ObjectEvent, _super);\n /**\n * @param {string} type The event type.\n * @param {string} key The property name.\n * @param {*} oldValue The old value for `key`.\n */\n\n\n function ObjectEvent(type, key, oldValue) {\n var _this = _super.call(this, type) || this;\n /**\n * The name of the property whose value is changing.\n * @type {string}\n * @api\n */\n\n\n _this.key = key;\n /**\n * The old value. To get the new value use `e.target.get(e.key)` where\n * `e` is the event object.\n * @type {*}\n * @api\n */\n\n _this.oldValue = oldValue;\n return _this;\n }\n\n return ObjectEvent;\n}(Event);\n\n\n/**\n * @classdesc\n * Abstract base class; normally only used for creating subclasses and not\n * instantiated in apps.\n * Most non-trivial classes inherit from this.\n *\n * This extends {@link module:ol/Observable} with observable\n * properties, where each property is observable as well as the object as a\n * whole.\n *\n * Classes that inherit from this have pre-defined properties, to which you can\n * add your owns. The pre-defined properties are listed in this documentation as\n * \'Observable Properties\', and have their own accessors; for example,\n * {@link module:ol/Map~Map} has a `target` property, accessed with\n * `getTarget()` and changed with `setTarget()`. Not all properties are however\n * settable. There are also general-purpose accessors `get()` and `set()`. For\n * example, `get(\'target\')` is equivalent to `getTarget()`.\n *\n * The `set` accessors trigger a change event, and you can monitor this by\n * registering a listener. For example, {@link module:ol/View~View} has a\n * `center` property, so `view.on(\'change:center\', function(evt) {...});` would\n * call the function whenever the value of the center property changes. Within\n * the function, `evt.target` would be the view, so `evt.target.getCenter()`\n * would return the new center.\n *\n * You can add your own observable properties with\n * `object.set(\'prop\', \'value\')`, and retrieve that with `object.get(\'prop\')`.\n * You can listen for changes on that property value with\n * `object.on(\'change:prop\', listener)`. You can get a list of all\n * properties with {@link module:ol/Object~BaseObject#getProperties}.\n *\n * Note that the observable properties are separate from standard JS properties.\n * You can, for example, give your map object a title with\n * `map.title=\'New title\'` and with `map.set(\'title\', \'Another title\')`. The\n * first will be a `hasOwnProperty`; the second will appear in\n * `getProperties()`. Only the second is observable.\n *\n * Properties can be deleted by using the unset method. E.g.\n * object.unset(\'foo\').\n *\n * @fires ObjectEvent\n * @api\n */\n\nvar BaseObject =\n/** @class */\nfunction (_super) {\n Object_extends(BaseObject, _super);\n /**\n * @param {Object=} opt_values An object with key-value pairs.\n */\n\n\n function BaseObject(opt_values) {\n var _this = _super.call(this) || this; // Call {@link module:ol/util~getUid} to ensure that the order of objects\' ids is\n // the same as the order in which they were created. This also helps to\n // ensure that object properties are always added in the same order, which\n // helps many JavaScript engines generate faster code.\n\n\n getUid(_this);\n /**\n * @private\n * @type {Object}\n */\n\n _this.values_ = null;\n\n if (opt_values !== undefined) {\n _this.setProperties(opt_values);\n }\n\n return _this;\n }\n /**\n * Gets a value.\n * @param {string} key Key name.\n * @return {*} Value.\n * @api\n */\n\n\n BaseObject.prototype.get = function (key) {\n var value;\n\n if (this.values_ && this.values_.hasOwnProperty(key)) {\n value = this.values_[key];\n }\n\n return value;\n };\n /**\n * Get a list of object property names.\n * @return {Array} List of property names.\n * @api\n */\n\n\n BaseObject.prototype.getKeys = function () {\n return this.values_ && Object.keys(this.values_) || [];\n };\n /**\n * Get an object of all property names and values.\n * @return {Object} Object.\n * @api\n */\n\n\n BaseObject.prototype.getProperties = function () {\n return this.values_ && obj_assign({}, this.values_) || {};\n };\n /**\n * @return {boolean} The object has properties.\n */\n\n\n BaseObject.prototype.hasProperties = function () {\n return !!this.values_;\n };\n /**\n * @param {string} key Key name.\n * @param {*} oldValue Old value.\n */\n\n\n BaseObject.prototype.notify = function (key, oldValue) {\n var eventType;\n eventType = getChangeEventType(key);\n this.dispatchEvent(new ObjectEvent(eventType, key, oldValue));\n eventType = ObjectEventType.PROPERTYCHANGE;\n this.dispatchEvent(new ObjectEvent(eventType, key, oldValue));\n };\n /**\n * Sets a value.\n * @param {string} key Key name.\n * @param {*} value Value.\n * @param {boolean=} opt_silent Update without triggering an event.\n * @api\n */\n\n\n BaseObject.prototype.set = function (key, value, opt_silent) {\n var values = this.values_ || (this.values_ = {});\n\n if (opt_silent) {\n values[key] = value;\n } else {\n var oldValue = values[key];\n values[key] = value;\n\n if (oldValue !== value) {\n this.notify(key, oldValue);\n }\n }\n };\n /**\n * Sets a collection of key-value pairs. Note that this changes any existing\n * properties and adds new ones (it does not remove any existing properties).\n * @param {Object} values Values.\n * @param {boolean=} opt_silent Update without triggering an event.\n * @api\n */\n\n\n BaseObject.prototype.setProperties = function (values, opt_silent) {\n for (var key in values) {\n this.set(key, values[key], opt_silent);\n }\n };\n /**\n * Apply any properties from another object without triggering events.\n * @param {BaseObject} source The source object.\n * @protected\n */\n\n\n BaseObject.prototype.applyProperties = function (source) {\n if (!source.values_) {\n return;\n }\n\n obj_assign(this.values_ || (this.values_ = {}), source.values_);\n };\n /**\n * Unsets a property.\n * @param {string} key Key name.\n * @param {boolean=} opt_silent Unset without triggering an event.\n * @api\n */\n\n\n BaseObject.prototype.unset = function (key, opt_silent) {\n if (this.values_ && key in this.values_) {\n var oldValue = this.values_[key];\n delete this.values_[key];\n\n if (obj_isEmpty(this.values_)) {\n this.values_ = null;\n }\n\n if (!opt_silent) {\n this.notify(key, oldValue);\n }\n }\n };\n\n return BaseObject;\n}(ol_Observable);\n/**\n * @type {Object}\n */\n\n\nvar changeEventTypeCache = {};\n/**\n * @param {string} key Key name.\n * @return {string} Change name.\n */\n\nfunction getChangeEventType(key) {\n return changeEventTypeCache.hasOwnProperty(key) ? changeEventTypeCache[key] : changeEventTypeCache[key] = \'change:\' + key;\n}\n/* harmony default export */ var ol_Object = (BaseObject);\n;// CONCATENATED MODULE: ./node_modules/ol/layer/Property.js\n/**\n * @module ol/layer/Property\n */\n\n/**\n * @enum {string}\n */\n/* harmony default export */ var Property = ({\n OPACITY: \'opacity\',\n VISIBLE: \'visible\',\n EXTENT: \'extent\',\n Z_INDEX: \'zIndex\',\n MAX_RESOLUTION: \'maxResolution\',\n MIN_RESOLUTION: \'minResolution\',\n MAX_ZOOM: \'maxZoom\',\n MIN_ZOOM: \'minZoom\',\n SOURCE: \'source\'\n});\n;// CONCATENATED MODULE: ./node_modules/ol/layer/Base.js\nvar Base_extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n/**\n * @module ol/layer/Base\n */\n\n\n\n\n\n\n\n\n/**\n * @typedef {Object} Options\n * @property {string} [className=\'ol-layer\'] A CSS class name to set to the layer element.\n * @property {number} [opacity=1] Opacity (0, 1).\n * @property {boolean} [visible=true] Visibility.\n * @property {import("../extent.js").Extent} [extent] The bounding extent for layer rendering. The layer will not be\n * rendered outside of this extent.\n * @property {number} [zIndex] The z-index for layer rendering. At rendering time, the layers\n * will be ordered, first by Z-index and then by position. When `undefined`, a `zIndex` of 0 is assumed\n * for layers that are added to the map\'s `layers` collection, or `Infinity` when the layer\'s `setMap()`\n * method was used.\n * @property {number} [minResolution] The minimum resolution (inclusive) at which this layer will be\n * visible.\n * @property {number} [maxResolution] The maximum resolution (exclusive) below which this layer will\n * be visible.\n * @property {number} [minZoom] The minimum view zoom level (exclusive) above which this layer will be\n * visible.\n * @property {number} [maxZoom] The maximum view zoom level (inclusive) at which this layer will\n * be visible.\n */\n\n/**\n * @classdesc\n * Abstract base class; normally only used for creating subclasses and not\n * instantiated in apps.\n * Note that with {@link module:ol/layer/Base} and all its subclasses, any property set in\n * the options is set as a {@link module:ol/Object} property on the layer object, so\n * is observable, and has get/set accessors.\n *\n * @api\n */\n\nvar BaseLayer =\n/** @class */\nfunction (_super) {\n Base_extends(BaseLayer, _super);\n /**\n * @param {Options} options Layer options.\n */\n\n\n function BaseLayer(options) {\n var _this = _super.call(this) || this;\n /**\n * @type {Object}\n */\n\n\n var properties = obj_assign({}, options);\n properties[Property.OPACITY] = options.opacity !== undefined ? options.opacity : 1;\n asserts_assert(typeof properties[Property.OPACITY] === \'number\', 64); // Layer opacity must be a number\n\n properties[Property.VISIBLE] = options.visible !== undefined ? options.visible : true;\n properties[Property.Z_INDEX] = options.zIndex;\n properties[Property.MAX_RESOLUTION] = options.maxResolution !== undefined ? options.maxResolution : Infinity;\n properties[Property.MIN_RESOLUTION] = options.minResolution !== undefined ? options.minResolution : 0;\n properties[Property.MIN_ZOOM] = options.minZoom !== undefined ? options.minZoom : -Infinity;\n properties[Property.MAX_ZOOM] = options.maxZoom !== undefined ? options.maxZoom : Infinity;\n /**\n * @type {string}\n * @private\n */\n\n _this.className_ = properties.className !== undefined ? options.className : \'ol-layer\';\n delete properties.className;\n\n _this.setProperties(properties);\n /**\n * @type {import("./Layer.js").State}\n * @private\n */\n\n\n _this.state_ = null;\n return _this;\n }\n /**\n * @return {string} CSS class name.\n */\n\n\n BaseLayer.prototype.getClassName = function () {\n return this.className_;\n };\n /**\n * This method is not meant to be called by layers or layer renderers because the state\n * is incorrect if the layer is included in a layer group.\n *\n * @param {boolean=} opt_managed Layer is managed.\n * @return {import("./Layer.js").State} Layer state.\n */\n\n\n BaseLayer.prototype.getLayerState = function (opt_managed) {\n /** @type {import("./Layer.js").State} */\n var state = this.state_ ||\n /** @type {?} */\n {\n layer: this,\n managed: opt_managed === undefined ? true : opt_managed\n };\n var zIndex = this.getZIndex();\n state.opacity = math_clamp(Math.round(this.getOpacity() * 100) / 100, 0, 1);\n state.sourceState = this.getSourceState();\n state.visible = this.getVisible();\n state.extent = this.getExtent();\n state.zIndex = zIndex !== undefined ? zIndex : state.managed === false ? Infinity : 0;\n state.maxResolution = this.getMaxResolution();\n state.minResolution = Math.max(this.getMinResolution(), 0);\n state.minZoom = this.getMinZoom();\n state.maxZoom = this.getMaxZoom();\n this.state_ = state;\n return state;\n };\n /**\n * @abstract\n * @param {Array=} opt_array Array of layers (to be\n * modified in place).\n * @return {Array} Array of layers.\n */\n\n\n BaseLayer.prototype.getLayersArray = function (opt_array) {\n return util_abstract();\n };\n /**\n * @abstract\n * @param {Array=} opt_states Optional list of layer\n * states (to be modified in place).\n * @return {Array} List of layer states.\n */\n\n\n BaseLayer.prototype.getLayerStatesArray = function (opt_states) {\n return util_abstract();\n };\n /**\n * Return the {@link module:ol/extent~Extent extent} of the layer or `undefined` if it\n * will be visible regardless of extent.\n * @return {import("../extent.js").Extent|undefined} The layer extent.\n * @observable\n * @api\n */\n\n\n BaseLayer.prototype.getExtent = function () {\n return (\n /** @type {import("../extent.js").Extent|undefined} */\n this.get(Property.EXTENT)\n );\n };\n /**\n * Return the maximum resolution of the layer.\n * @return {number} The maximum resolution of the layer.\n * @observable\n * @api\n */\n\n\n BaseLayer.prototype.getMaxResolution = function () {\n return (\n /** @type {number} */\n this.get(Property.MAX_RESOLUTION)\n );\n };\n /**\n * Return the minimum resolution of the layer.\n * @return {number} The minimum resolution of the layer.\n * @observable\n * @api\n */\n\n\n BaseLayer.prototype.getMinResolution = function () {\n return (\n /** @type {number} */\n this.get(Property.MIN_RESOLUTION)\n );\n };\n /**\n * Return the minimum zoom level of the layer.\n * @return {number} The minimum zoom level of the layer.\n * @observable\n * @api\n */\n\n\n BaseLayer.prototype.getMinZoom = function () {\n return (\n /** @type {number} */\n this.get(Property.MIN_ZOOM)\n );\n };\n /**\n * Return the maximum zoom level of the layer.\n * @return {number} The maximum zoom level of the layer.\n * @observable\n * @api\n */\n\n\n BaseLayer.prototype.getMaxZoom = function () {\n return (\n /** @type {number} */\n this.get(Property.MAX_ZOOM)\n );\n };\n /**\n * Return the opacity of the layer (between 0 and 1).\n * @return {number} The opacity of the layer.\n * @observable\n * @api\n */\n\n\n BaseLayer.prototype.getOpacity = function () {\n return (\n /** @type {number} */\n this.get(Property.OPACITY)\n );\n };\n /**\n * @abstract\n * @return {import("../source/State.js").default} Source state.\n */\n\n\n BaseLayer.prototype.getSourceState = function () {\n return util_abstract();\n };\n /**\n * Return the visibility of the layer (`true` or `false`).\n * @return {boolean} The visibility of the layer.\n * @observable\n * @api\n */\n\n\n BaseLayer.prototype.getVisible = function () {\n return (\n /** @type {boolean} */\n this.get(Property.VISIBLE)\n );\n };\n /**\n * Return the Z-index of the layer, which is used to order layers before\n * rendering. The default Z-index is 0.\n * @return {number} The Z-index of the layer.\n * @observable\n * @api\n */\n\n\n BaseLayer.prototype.getZIndex = function () {\n return (\n /** @type {number} */\n this.get(Property.Z_INDEX)\n );\n };\n /**\n * Set the extent at which the layer is visible. If `undefined`, the layer\n * will be visible at all extents.\n * @param {import("../extent.js").Extent|undefined} extent The extent of the layer.\n * @observable\n * @api\n */\n\n\n BaseLayer.prototype.setExtent = function (extent) {\n this.set(Property.EXTENT, extent);\n };\n /**\n * Set the maximum resolution at which the layer is visible.\n * @param {number} maxResolution The maximum resolution of the layer.\n * @observable\n * @api\n */\n\n\n BaseLayer.prototype.setMaxResolution = function (maxResolution) {\n this.set(Property.MAX_RESOLUTION, maxResolution);\n };\n /**\n * Set the minimum resolution at which the layer is visible.\n * @param {number} minResolution The minimum resolution of the layer.\n * @observable\n * @api\n */\n\n\n BaseLayer.prototype.setMinResolution = function (minResolution) {\n this.set(Property.MIN_RESOLUTION, minResolution);\n };\n /**\n * Set the maximum zoom (exclusive) at which the layer is visible.\n * Note that the zoom levels for layer visibility are based on the\n * view zoom level, which may be different from a tile source zoom level.\n * @param {number} maxZoom The maximum zoom of the layer.\n * @observable\n * @api\n */\n\n\n BaseLayer.prototype.setMaxZoom = function (maxZoom) {\n this.set(Property.MAX_ZOOM, maxZoom);\n };\n /**\n * Set the minimum zoom (inclusive) at which the layer is visible.\n * Note that the zoom levels for layer visibility are based on the\n * view zoom level, which may be different from a tile source zoom level.\n * @param {number} minZoom The minimum zoom of the layer.\n * @observable\n * @api\n */\n\n\n BaseLayer.prototype.setMinZoom = function (minZoom) {\n this.set(Property.MIN_ZOOM, minZoom);\n };\n /**\n * Set the opacity of the layer, allowed values range from 0 to 1.\n * @param {number} opacity The opacity of the layer.\n * @observable\n * @api\n */\n\n\n BaseLayer.prototype.setOpacity = function (opacity) {\n asserts_assert(typeof opacity === \'number\', 64); // Layer opacity must be a number\n\n this.set(Property.OPACITY, opacity);\n };\n /**\n * Set the visibility of the layer (`true` or `false`).\n * @param {boolean} visible The visibility of the layer.\n * @observable\n * @api\n */\n\n\n BaseLayer.prototype.setVisible = function (visible) {\n this.set(Property.VISIBLE, visible);\n };\n /**\n * Set Z-index of the layer, which is used to order layers before rendering.\n * The default Z-index is 0.\n * @param {number} zindex The z-index of the layer.\n * @observable\n * @api\n */\n\n\n BaseLayer.prototype.setZIndex = function (zindex) {\n this.set(Property.Z_INDEX, zindex);\n };\n /**\n * Clean up.\n */\n\n\n BaseLayer.prototype.disposeInternal = function () {\n if (this.state_) {\n this.state_.layer = null;\n this.state_ = null;\n }\n\n _super.prototype.disposeInternal.call(this);\n };\n\n return BaseLayer;\n}(ol_Object);\n\n/* harmony default export */ var Base = (BaseLayer);\n;// CONCATENATED MODULE: ./node_modules/ol/render/EventType.js\n/**\n * @module ol/render/EventType\n */\n\n/**\n * @enum {string}\n */\n/* harmony default export */ var render_EventType = ({\n /**\n * Triggered before a layer is rendered.\n * @event module:ol/render/Event~RenderEvent#prerender\n * @api\n */\n PRERENDER: \'prerender\',\n\n /**\n * Triggered after a layer is rendered.\n * @event module:ol/render/Event~RenderEvent#postrender\n * @api\n */\n POSTRENDER: \'postrender\',\n\n /**\n * Triggered before layers are rendered.\n * The event object will not have a `context` set.\n * @event module:ol/render/Event~RenderEvent#precompose\n * @api\n */\n PRECOMPOSE: \'precompose\',\n\n /**\n * Triggered after all layers are rendered.\n * The event object will not have a `context` set.\n * @event module:ol/render/Event~RenderEvent#postcompose\n * @api\n */\n POSTCOMPOSE: \'postcompose\',\n\n /**\n * Triggered when rendering is complete, i.e. all sources and tiles have\n * finished loading for the current viewport, and all tiles are faded in.\n * The event object will not have a `context` set.\n * @event module:ol/render/Event~RenderEvent#rendercomplete\n * @api\n */\n RENDERCOMPLETE: \'rendercomplete\'\n});\n;// CONCATENATED MODULE: ./node_modules/ol/source/State.js\n/**\n * @module ol/source/State\n */\n\n/**\n * @enum {string}\n * State of the source, one of \'undefined\', \'loading\', \'ready\' or \'error\'.\n */\n/* harmony default export */ var State = ({\n UNDEFINED: \'undefined\',\n LOADING: \'loading\',\n READY: \'ready\',\n ERROR: \'error\'\n});\n;// CONCATENATED MODULE: ./node_modules/ol/layer/Layer.js\nvar Layer_extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n/**\n * @module ol/layer/Layer\n */\n\n\n\n\n\n\n\n\n\n\n\n/**\n * @typedef {function(import("../PluggableMap.js").FrameState):HTMLElement} RenderFunction\n */\n\n/**\n * @typedef {Object} Options\n * @property {string} [className=\'ol-layer\'] A CSS class name to set to the layer element.\n * @property {number} [opacity=1] Opacity (0, 1).\n * @property {boolean} [visible=true] Visibility.\n * @property {import("../extent.js").Extent} [extent] The bounding extent for layer rendering. The layer will not be\n * rendered outside of this extent.\n * @property {number} [zIndex] The z-index for layer rendering. At rendering time, the layers\n * will be ordered, first by Z-index and then by position. When `undefined`, a `zIndex` of 0 is assumed\n * for layers that are added to the map\'s `layers` collection, or `Infinity` when the layer\'s `setMap()`\n * method was used.\n * @property {number} [minResolution] The minimum resolution (inclusive) at which this layer will be\n * visible.\n * @property {number} [maxResolution] The maximum resolution (exclusive) below which this layer will\n * be visible.\n * @property {number} [minZoom] The minimum view zoom level (exclusive) above which this layer will be\n * visible.\n * @property {number} [maxZoom] The maximum view zoom level (inclusive) at which this layer will\n * be visible.\n * @property {import("../source/Source.js").default} [source] Source for this layer. If not provided to the constructor,\n * the source can be set by calling {@link module:ol/layer/Layer#setSource layer.setSource(source)} after\n * construction.\n * @property {import("../PluggableMap.js").default} [map] Map.\n * @property {RenderFunction} [render] Render function. Takes the frame state as input and is expected to return an\n * HTML element. Will overwrite the default rendering for the layer.\n */\n\n/**\n * @typedef {Object} State\n * @property {import("./Layer.js").default} layer\n * @property {number} opacity Opacity, the value is rounded to two digits to appear after the decimal point.\n * @property {import("../source/State.js").default} sourceState\n * @property {boolean} visible\n * @property {boolean} managed\n * @property {import("../extent.js").Extent} [extent]\n * @property {number} zIndex\n * @property {number} maxResolution\n * @property {number} minResolution\n * @property {number} minZoom\n * @property {number} maxZoom\n */\n\n/**\n * @classdesc\n * Base class from which all layer types are derived. This should only be instantiated\n * in the case where a custom layer is be added to the map with a custom `render` function.\n * Such a function can be specified in the `options` object, and is expected to return an HTML element.\n *\n * A visual representation of raster or vector map data.\n * Layers group together those properties that pertain to how the data is to be\n * displayed, irrespective of the source of that data.\n *\n * Layers are usually added to a map with {@link module:ol/Map#addLayer}. Components\n * like {@link module:ol/interaction/Select~Select} use unmanaged layers\n * internally. These unmanaged layers are associated with the map using\n * {@link module:ol/layer/Layer~Layer#setMap} instead.\n *\n * A generic `change` event is fired when the state of the source changes.\n *\n * Please note that for performance reasons several layers might get rendered to\n * the same HTML element, which will cause {@link module:ol/Map~Map#forEachLayerAtPixel} to\n * give false positives. To avoid this, apply different `className` properties to the\n * layers at creation time.\n *\n * @fires import("../render/Event.js").RenderEvent#prerender\n * @fires import("../render/Event.js").RenderEvent#postrender\n *\n * @template {import("../source/Source.js").default} SourceType\n * @api\n */\n\nvar Layer =\n/** @class */\nfunction (_super) {\n Layer_extends(Layer, _super);\n /**\n * @param {Options} options Layer options.\n */\n\n\n function Layer(options) {\n var _this = this;\n\n var baseOptions = obj_assign({}, options);\n delete baseOptions.source;\n _this = _super.call(this, baseOptions) || this;\n /**\n * @private\n * @type {?import("../events.js").EventsKey}\n */\n\n _this.mapPrecomposeKey_ = null;\n /**\n * @private\n * @type {?import("../events.js").EventsKey}\n */\n\n _this.mapRenderKey_ = null;\n /**\n * @private\n * @type {?import("../events.js").EventsKey}\n */\n\n _this.sourceChangeKey_ = null;\n /**\n * @private\n * @type {import("../renderer/Layer.js").default}\n */\n\n _this.renderer_ = null; // Overwrite default render method with a custom one\n\n if (options.render) {\n _this.render = options.render;\n }\n\n if (options.map) {\n _this.setMap(options.map);\n }\n\n _this.addEventListener(getChangeEventType(Property.SOURCE), _this.handleSourcePropertyChange_);\n\n var source = options.source ?\n /** @type {SourceType} */\n options.source : null;\n\n _this.setSource(source);\n\n return _this;\n }\n /**\n * @param {Array=} opt_array Array of layers (to be modified in place).\n * @return {Array} Array of layers.\n */\n\n\n Layer.prototype.getLayersArray = function (opt_array) {\n var array = opt_array ? opt_array : [];\n array.push(this);\n return array;\n };\n /**\n * @param {Array=} opt_states Optional list of layer states (to be modified in place).\n * @return {Array} List of layer states.\n */\n\n\n Layer.prototype.getLayerStatesArray = function (opt_states) {\n var states = opt_states ? opt_states : [];\n states.push(this.getLayerState());\n return states;\n };\n /**\n * Get the layer source.\n * @return {SourceType} The layer source (or `null` if not yet set).\n * @observable\n * @api\n */\n\n\n Layer.prototype.getSource = function () {\n return (\n /** @type {SourceType} */\n this.get(Property.SOURCE) || null\n );\n };\n /**\n * @return {import("../source/State.js").default} Source state.\n */\n\n\n Layer.prototype.getSourceState = function () {\n var source = this.getSource();\n return !source ? State.UNDEFINED : source.getState();\n };\n /**\n * @private\n */\n\n\n Layer.prototype.handleSourceChange_ = function () {\n this.changed();\n };\n /**\n * @private\n */\n\n\n Layer.prototype.handleSourcePropertyChange_ = function () {\n if (this.sourceChangeKey_) {\n unlistenByKey(this.sourceChangeKey_);\n this.sourceChangeKey_ = null;\n }\n\n var source = this.getSource();\n\n if (source) {\n this.sourceChangeKey_ = listen(source, EventType.CHANGE, this.handleSourceChange_, this);\n }\n\n this.changed();\n };\n /**\n * @param {import("../pixel").Pixel} pixel Pixel.\n * @return {Promise>} Promise that resolves with\n * an array of features.\n */\n\n\n Layer.prototype.getFeatures = function (pixel) {\n return this.renderer_.getFeatures(pixel);\n };\n /**\n * In charge to manage the rendering of the layer. One layer type is\n * bounded with one layer renderer.\n * @param {?import("../PluggableMap.js").FrameState} frameState Frame state.\n * @param {HTMLElement} target Target which the renderer may (but need not) use\n * for rendering its content.\n * @return {HTMLElement} The rendered element.\n */\n\n\n Layer.prototype.render = function (frameState, target) {\n var layerRenderer = this.getRenderer();\n\n if (layerRenderer.prepareFrame(frameState)) {\n return layerRenderer.renderFrame(frameState, target);\n }\n };\n /**\n * Sets the layer to be rendered on top of other layers on a map. The map will\n * not manage this layer in its layers collection, and the callback in\n * {@link module:ol/Map#forEachLayerAtPixel} will receive `null` as layer. This\n * is useful for temporary layers. To remove an unmanaged layer from the map,\n * use `#setMap(null)`.\n *\n * To add the layer to a map and have it managed by the map, use\n * {@link module:ol/Map#addLayer} instead.\n * @param {import("../PluggableMap.js").default} map Map.\n * @api\n */\n\n\n Layer.prototype.setMap = function (map) {\n if (this.mapPrecomposeKey_) {\n unlistenByKey(this.mapPrecomposeKey_);\n this.mapPrecomposeKey_ = null;\n }\n\n if (!map) {\n this.changed();\n }\n\n if (this.mapRenderKey_) {\n unlistenByKey(this.mapRenderKey_);\n this.mapRenderKey_ = null;\n }\n\n if (map) {\n this.mapPrecomposeKey_ = listen(map, render_EventType.PRECOMPOSE, function (evt) {\n var renderEvent =\n /** @type {import("../render/Event.js").default} */\n evt;\n var layerStatesArray = renderEvent.frameState.layerStatesArray;\n var layerState = this.getLayerState(false); // A layer can only be added to the map once. Use either `layer.setMap()` or `map.addLayer()`, not both.\n\n asserts_assert(!layerStatesArray.some(function (arrayLayerState) {\n return arrayLayerState.layer === layerState.layer;\n }), 67);\n layerStatesArray.push(layerState);\n }, this);\n this.mapRenderKey_ = listen(this, EventType.CHANGE, map.render, map);\n this.changed();\n }\n };\n /**\n * Set the layer source.\n * @param {SourceType} source The layer source.\n * @observable\n * @api\n */\n\n\n Layer.prototype.setSource = function (source) {\n this.set(Property.SOURCE, source);\n };\n /**\n * Get the renderer for this layer.\n * @return {import("../renderer/Layer.js").default} The layer renderer.\n */\n\n\n Layer.prototype.getRenderer = function () {\n if (!this.renderer_) {\n this.renderer_ = this.createRenderer();\n }\n\n return this.renderer_;\n };\n /**\n * @return {boolean} The layer has a renderer.\n */\n\n\n Layer.prototype.hasRenderer = function () {\n return !!this.renderer_;\n };\n /**\n * Create a renderer for this layer.\n * @return {import("../renderer/Layer.js").default} A layer renderer.\n * @protected\n */\n\n\n Layer.prototype.createRenderer = function () {\n return null;\n };\n /**\n * Clean up.\n */\n\n\n Layer.prototype.disposeInternal = function () {\n this.setSource(null);\n\n _super.prototype.disposeInternal.call(this);\n };\n\n return Layer;\n}(Base);\n/**\n * Return `true` if the layer is visible and if the provided view state\n * has resolution and zoom levels that are in range of the layer\'s min/max.\n * @param {State} layerState Layer state.\n * @param {import("../View.js").State} viewState View state.\n * @return {boolean} The layer is visible at the given view state.\n */\n\n\nfunction inView(layerState, viewState) {\n if (!layerState.visible) {\n return false;\n }\n\n var resolution = viewState.resolution;\n\n if (resolution < layerState.minResolution || resolution >= layerState.maxResolution) {\n return false;\n }\n\n var zoom = viewState.zoom;\n return zoom > layerState.minZoom && zoom <= layerState.maxZoom;\n}\n/* harmony default export */ var layer_Layer = (Layer);\n;// CONCATENATED MODULE: ./node_modules/ol/coordinate.js\n/**\n * @module ol/coordinate\n */\n\n\n\n/**\n * An array of numbers representing an xy coordinate. Example: `[16, 48]`.\n * @typedef {Array} Coordinate\n * @api\n */\n\n/**\n * A function that takes a {@link module:ol/coordinate~Coordinate} and\n * transforms it into a `{string}`.\n *\n * @typedef {function((Coordinate|undefined)): string} CoordinateFormat\n * @api\n */\n\n/**\n * Add `delta` to `coordinate`. `coordinate` is modified in place and returned\n * by the function.\n *\n * Example:\n *\n * import {add} from \'ol/coordinate\';\n *\n * var coord = [7.85, 47.983333];\n * add(coord, [-2, 4]);\n * // coord is now [5.85, 51.983333]\n *\n * @param {Coordinate} coordinate Coordinate.\n * @param {Coordinate} delta Delta.\n * @return {Coordinate} The input coordinate adjusted by\n * the given delta.\n * @api\n */\n\nfunction add(coordinate, delta) {\n coordinate[0] += +delta[0];\n coordinate[1] += +delta[1];\n return coordinate;\n}\n/**\n * Calculates the point closest to the passed coordinate on the passed circle.\n *\n * @param {Coordinate} coordinate The coordinate.\n * @param {import("./geom/Circle.js").default} circle The circle.\n * @return {Coordinate} Closest point on the circumference.\n */\n\nfunction closestOnCircle(coordinate, circle) {\n var r = circle.getRadius();\n var center = circle.getCenter();\n var x0 = center[0];\n var y0 = center[1];\n var x1 = coordinate[0];\n var y1 = coordinate[1];\n var dx = x1 - x0;\n var dy = y1 - y0;\n\n if (dx === 0 && dy === 0) {\n dx = 1;\n }\n\n var d = Math.sqrt(dx * dx + dy * dy);\n var x = x0 + r * dx / d;\n var y = y0 + r * dy / d;\n return [x, y];\n}\n/**\n * Calculates the point closest to the passed coordinate on the passed segment.\n * This is the foot of the perpendicular of the coordinate to the segment when\n * the foot is on the segment, or the closest segment coordinate when the foot\n * is outside the segment.\n *\n * @param {Coordinate} coordinate The coordinate.\n * @param {Array} segment The two coordinates\n * of the segment.\n * @return {Coordinate} The foot of the perpendicular of\n * the coordinate to the segment.\n */\n\nfunction closestOnSegment(coordinate, segment) {\n var x0 = coordinate[0];\n var y0 = coordinate[1];\n var start = segment[0];\n var end = segment[1];\n var x1 = start[0];\n var y1 = start[1];\n var x2 = end[0];\n var y2 = end[1];\n var dx = x2 - x1;\n var dy = y2 - y1;\n var along = dx === 0 && dy === 0 ? 0 : (dx * (x0 - x1) + dy * (y0 - y1)) / (dx * dx + dy * dy || 0);\n var x, y;\n\n if (along <= 0) {\n x = x1;\n y = y1;\n } else if (along >= 1) {\n x = x2;\n y = y2;\n } else {\n x = x1 + along * dx;\n y = y1 + along * dy;\n }\n\n return [x, y];\n}\n/**\n * Returns a {@link module:ol/coordinate~CoordinateFormat} function that can be\n * used to format\n * a {Coordinate} to a string.\n *\n * Example without specifying the fractional digits:\n *\n * import {createStringXY} from \'ol/coordinate\';\n *\n * var coord = [7.85, 47.983333];\n * var stringifyFunc = createStringXY();\n * var out = stringifyFunc(coord);\n * // out is now \'8, 48\'\n *\n * Example with explicitly specifying 2 fractional digits:\n *\n * import {createStringXY} from \'ol/coordinate\';\n *\n * var coord = [7.85, 47.983333];\n * var stringifyFunc = createStringXY(2);\n * var out = stringifyFunc(coord);\n * // out is now \'7.85, 47.98\'\n *\n * @param {number=} opt_fractionDigits The number of digits to include\n * after the decimal point. Default is `0`.\n * @return {CoordinateFormat} Coordinate format.\n * @api\n */\n\nfunction createStringXY(opt_fractionDigits) {\n return (\n /**\n * @param {Coordinate} coordinate Coordinate.\n * @return {string} String XY.\n */\n function (coordinate) {\n return toStringXY(coordinate, opt_fractionDigits);\n }\n );\n}\n/**\n * @param {string} hemispheres Hemispheres.\n * @param {number} degrees Degrees.\n * @param {number=} opt_fractionDigits The number of digits to include\n * after the decimal point. Default is `0`.\n * @return {string} String.\n */\n\nfunction degreesToStringHDMS(hemispheres, degrees, opt_fractionDigits) {\n var normalizedDegrees = modulo(degrees + 180, 360) - 180;\n var x = Math.abs(3600 * normalizedDegrees);\n var dflPrecision = opt_fractionDigits || 0;\n var precision = Math.pow(10, dflPrecision);\n var deg = Math.floor(x / 3600);\n var min = Math.floor((x - deg * 3600) / 60);\n var sec = x - deg * 3600 - min * 60;\n sec = Math.ceil(sec * precision) / precision;\n\n if (sec >= 60) {\n sec = 0;\n min += 1;\n }\n\n if (min >= 60) {\n min = 0;\n deg += 1;\n }\n\n return deg + "\\xB0 " + padNumber(min, 2) + "\\u2032 " + padNumber(sec, 2, dflPrecision) + "\\u2033" + (normalizedDegrees == 0 ? \'\' : \' \' + hemispheres.charAt(normalizedDegrees < 0 ? 1 : 0));\n}\n/**\n * Transforms the given {@link module:ol/coordinate~Coordinate} to a string\n * using the given string template. The strings `{x}` and `{y}` in the template\n * will be replaced with the first and second coordinate values respectively.\n *\n * Example without specifying the fractional digits:\n *\n * import {format} from \'ol/coordinate\';\n *\n * var coord = [7.85, 47.983333];\n * var template = \'Coordinate is ({x}|{y}).\';\n * var out = format(coord, template);\n * // out is now \'Coordinate is (8|48).\'\n *\n * Example explicitly specifying the fractional digits:\n *\n * import {format} from \'ol/coordinate\';\n *\n * var coord = [7.85, 47.983333];\n * var template = \'Coordinate is ({x}|{y}).\';\n * var out = format(coord, template, 2);\n * // out is now \'Coordinate is (7.85|47.98).\'\n *\n * @param {Coordinate} coordinate Coordinate.\n * @param {string} template A template string with `{x}` and `{y}` placeholders\n * that will be replaced by first and second coordinate values.\n * @param {number=} opt_fractionDigits The number of digits to include\n * after the decimal point. Default is `0`.\n * @return {string} Formatted coordinate.\n * @api\n */\n\nfunction format(coordinate, template, opt_fractionDigits) {\n if (coordinate) {\n return template.replace(\'{x}\', coordinate[0].toFixed(opt_fractionDigits)).replace(\'{y}\', coordinate[1].toFixed(opt_fractionDigits));\n } else {\n return \'\';\n }\n}\n/**\n * @param {Coordinate} coordinate1 First coordinate.\n * @param {Coordinate} coordinate2 Second coordinate.\n * @return {boolean} The two coordinates are equal.\n */\n\nfunction coordinate_equals(coordinate1, coordinate2) {\n var equals = true;\n\n for (var i = coordinate1.length - 1; i >= 0; --i) {\n if (coordinate1[i] != coordinate2[i]) {\n equals = false;\n break;\n }\n }\n\n return equals;\n}\n/**\n * Rotate `coordinate` by `angle`. `coordinate` is modified in place and\n * returned by the function.\n *\n * Example:\n *\n * import {rotate} from \'ol/coordinate\';\n *\n * var coord = [7.85, 47.983333];\n * var rotateRadians = Math.PI / 2; // 90 degrees\n * rotate(coord, rotateRadians);\n * // coord is now [-47.983333, 7.85]\n *\n * @param {Coordinate} coordinate Coordinate.\n * @param {number} angle Angle in radian.\n * @return {Coordinate} Coordinate.\n * @api\n */\n\nfunction coordinate_rotate(coordinate, angle) {\n var cosAngle = Math.cos(angle);\n var sinAngle = Math.sin(angle);\n var x = coordinate[0] * cosAngle - coordinate[1] * sinAngle;\n var y = coordinate[1] * cosAngle + coordinate[0] * sinAngle;\n coordinate[0] = x;\n coordinate[1] = y;\n return coordinate;\n}\n/**\n * Scale `coordinate` by `scale`. `coordinate` is modified in place and returned\n * by the function.\n *\n * Example:\n *\n * import {scale as scaleCoordinate} from \'ol/coordinate\';\n *\n * var coord = [7.85, 47.983333];\n * var scale = 1.2;\n * scaleCoordinate(coord, scale);\n * // coord is now [9.42, 57.5799996]\n *\n * @param {Coordinate} coordinate Coordinate.\n * @param {number} scale Scale factor.\n * @return {Coordinate} Coordinate.\n */\n\nfunction coordinate_scale(coordinate, scale) {\n coordinate[0] *= scale;\n coordinate[1] *= scale;\n return coordinate;\n}\n/**\n * @param {Coordinate} coord1 First coordinate.\n * @param {Coordinate} coord2 Second coordinate.\n * @return {number} Squared distance between coord1 and coord2.\n */\n\nfunction coordinate_squaredDistance(coord1, coord2) {\n var dx = coord1[0] - coord2[0];\n var dy = coord1[1] - coord2[1];\n return dx * dx + dy * dy;\n}\n/**\n * @param {Coordinate} coord1 First coordinate.\n * @param {Coordinate} coord2 Second coordinate.\n * @return {number} Distance between coord1 and coord2.\n */\n\nfunction distance(coord1, coord2) {\n return Math.sqrt(coordinate_squaredDistance(coord1, coord2));\n}\n/**\n * Calculate the squared distance from a coordinate to a line segment.\n *\n * @param {Coordinate} coordinate Coordinate of the point.\n * @param {Array} segment Line segment (2\n * coordinates).\n * @return {number} Squared distance from the point to the line segment.\n */\n\nfunction squaredDistanceToSegment(coordinate, segment) {\n return coordinate_squaredDistance(coordinate, closestOnSegment(coordinate, segment));\n}\n/**\n * Format a geographic coordinate with the hemisphere, degrees, minutes, and\n * seconds.\n *\n * Example without specifying fractional digits:\n *\n * import {toStringHDMS} from \'ol/coordinate\';\n *\n * var coord = [7.85, 47.983333];\n * var out = toStringHDMS(coord);\n * // out is now \'47° 58′ 60″ N 7° 50′ 60″ E\'\n *\n * Example explicitly specifying 1 fractional digit:\n *\n * import {toStringHDMS} from \'ol/coordinate\';\n *\n * var coord = [7.85, 47.983333];\n * var out = toStringHDMS(coord, 1);\n * // out is now \'47° 58′ 60.0″ N 7° 50′ 60.0″ E\'\n *\n * @param {Coordinate} coordinate Coordinate.\n * @param {number=} opt_fractionDigits The number of digits to include\n * after the decimal point. Default is `0`.\n * @return {string} Hemisphere, degrees, minutes and seconds.\n * @api\n */\n\nfunction toStringHDMS(coordinate, opt_fractionDigits) {\n if (coordinate) {\n return degreesToStringHDMS(\'NS\', coordinate[1], opt_fractionDigits) + \' \' + degreesToStringHDMS(\'EW\', coordinate[0], opt_fractionDigits);\n } else {\n return \'\';\n }\n}\n/**\n * Format a coordinate as a comma delimited string.\n *\n * Example without specifying fractional digits:\n *\n * import {toStringXY} from \'ol/coordinate\';\n *\n * var coord = [7.85, 47.983333];\n * var out = toStringXY(coord);\n * // out is now \'8, 48\'\n *\n * Example explicitly specifying 1 fractional digit:\n *\n * import {toStringXY} from \'ol/coordinate\';\n *\n * var coord = [7.85, 47.983333];\n * var out = toStringXY(coord, 1);\n * // out is now \'7.8, 48.0\'\n *\n * @param {Coordinate} coordinate Coordinate.\n * @param {number=} opt_fractionDigits The number of digits to include\n * after the decimal point. Default is `0`.\n * @return {string} XY.\n * @api\n */\n\nfunction toStringXY(coordinate, opt_fractionDigits) {\n return format(coordinate, \'{x}, {y}\', opt_fractionDigits);\n}\n/**\n * Modifies the provided coordinate in-place to be within the real world\n * extent. The lower projection extent boundary is inclusive, the upper one\n * exclusive.\n *\n * @param {Coordinate} coordinate Coordinate.\n * @param {import("./proj/Projection.js").default} projection Projection.\n * @return {Coordinate} The coordinate within the real world extent.\n */\n\nfunction coordinate_wrapX(coordinate, projection) {\n if (projection.canWrapX()) {\n var worldWidth = extent_getWidth(projection.getExtent());\n var worldsAway = coordinate_getWorldsAway(coordinate, projection, worldWidth);\n\n if (worldsAway) {\n coordinate[0] -= worldsAway * worldWidth;\n }\n }\n\n return coordinate;\n}\n/**\n * @param {Coordinate} coordinate Coordinate.\n * @param {import("./proj/Projection.js").default} projection Projection.\n * @param {number=} opt_sourceExtentWidth Width of the source extent.\n * @return {number} Offset in world widths.\n */\n\nfunction coordinate_getWorldsAway(coordinate, projection, opt_sourceExtentWidth) {\n var projectionExtent = projection.getExtent();\n var worldsAway = 0;\n\n if (projection.canWrapX() && (coordinate[0] < projectionExtent[0] || coordinate[0] > projectionExtent[2])) {\n var sourceExtentWidth = opt_sourceExtentWidth || extent_getWidth(projectionExtent);\n worldsAway = Math.floor((coordinate[0] - projectionExtent[0]) / sourceExtentWidth);\n }\n\n return worldsAway;\n}\n;// CONCATENATED MODULE: ./node_modules/ol/renderer/Map.js\nvar Map_extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n/**\n * @module ol/renderer/Map\n */\n\n\n\n\n\n\n\n\n\n\n/**\n * @typedef HitMatch\n * @property {import("../Feature.js").FeatureLike} feature\n * @property {import("../layer/Layer.js").default} layer\n * @property {import("../geom/SimpleGeometry.js").default} geometry\n * @property {number} distanceSq\n * @property {import("./vector.js").FeatureCallback} callback\n * @template T\n */\n\n/**\n * @abstract\n */\n\nvar MapRenderer =\n/** @class */\nfunction (_super) {\n Map_extends(MapRenderer, _super);\n /**\n * @param {import("../PluggableMap.js").default} map Map.\n */\n\n\n function MapRenderer(map) {\n var _this = _super.call(this) || this;\n /**\n * @private\n * @type {import("../PluggableMap.js").default}\n */\n\n\n _this.map_ = map;\n return _this;\n }\n /**\n * @abstract\n * @param {import("../render/EventType.js").default} type Event type.\n * @param {import("../PluggableMap.js").FrameState} frameState Frame state.\n */\n\n\n MapRenderer.prototype.dispatchRenderEvent = function (type, frameState) {\n util_abstract();\n };\n /**\n * @param {import("../PluggableMap.js").FrameState} frameState FrameState.\n * @protected\n */\n\n\n MapRenderer.prototype.calculateMatrices2D = function (frameState) {\n var viewState = frameState.viewState;\n var coordinateToPixelTransform = frameState.coordinateToPixelTransform;\n var pixelToCoordinateTransform = frameState.pixelToCoordinateTransform;\n compose(coordinateToPixelTransform, frameState.size[0] / 2, frameState.size[1] / 2, 1 / viewState.resolution, -1 / viewState.resolution, -viewState.rotation, -viewState.center[0], -viewState.center[1]);\n makeInverse(pixelToCoordinateTransform, coordinateToPixelTransform);\n };\n /**\n * @param {import("../coordinate.js").Coordinate} coordinate Coordinate.\n * @param {import("../PluggableMap.js").FrameState} frameState FrameState.\n * @param {number} hitTolerance Hit tolerance in pixels.\n * @param {boolean} checkWrapped Check for wrapped geometries.\n * @param {import("./vector.js").FeatureCallback} callback Feature callback.\n * @param {S} thisArg Value to use as `this` when executing `callback`.\n * @param {function(this: U, import("../layer/Layer.js").default): boolean} layerFilter Layer filter\n * function, only layers which are visible and for which this function\n * returns `true` will be tested for features. By default, all visible\n * layers will be tested.\n * @param {U} thisArg2 Value to use as `this` when executing `layerFilter`.\n * @return {T|undefined} Callback result.\n * @template S,T,U\n */\n\n\n MapRenderer.prototype.forEachFeatureAtCoordinate = function (coordinate, frameState, hitTolerance, checkWrapped, callback, thisArg, layerFilter, thisArg2) {\n var result;\n var viewState = frameState.viewState;\n /**\n * @param {boolean} managed Managed layer.\n * @param {import("../Feature.js").FeatureLike} feature Feature.\n * @param {import("../layer/Layer.js").default} layer Layer.\n * @param {import("../geom/Geometry.js").default} geometry Geometry.\n * @return {T|undefined} Callback result.\n */\n\n function forEachFeatureAtCoordinate(managed, feature, layer, geometry) {\n return callback.call(thisArg, feature, managed ? layer : null, geometry);\n }\n\n var projection = viewState.projection;\n var translatedCoordinate = coordinate_wrapX(coordinate.slice(), projection);\n var offsets = [[0, 0]];\n\n if (projection.canWrapX() && checkWrapped) {\n var projectionExtent = projection.getExtent();\n var worldWidth = extent_getWidth(projectionExtent);\n offsets.push([-worldWidth, 0], [worldWidth, 0]);\n }\n\n var layerStates = frameState.layerStatesArray;\n var numLayers = layerStates.length;\n var matches =\n /** @type {Array>} */\n [];\n var tmpCoord = [];\n\n for (var i = 0; i < offsets.length; i++) {\n for (var j = numLayers - 1; j >= 0; --j) {\n var layerState = layerStates[j];\n var layer = layerState.layer;\n\n if (layer.hasRenderer() && inView(layerState, viewState) && layerFilter.call(thisArg2, layer)) {\n var layerRenderer = layer.getRenderer();\n var source = layer.getSource();\n\n if (layerRenderer && source) {\n var coordinates = source.getWrapX() ? translatedCoordinate : coordinate;\n var callback_1 = forEachFeatureAtCoordinate.bind(null, layerState.managed);\n tmpCoord[0] = coordinates[0] + offsets[i][0];\n tmpCoord[1] = coordinates[1] + offsets[i][1];\n result = layerRenderer.forEachFeatureAtCoordinate(tmpCoord, frameState, hitTolerance, callback_1, matches);\n }\n\n if (result) {\n return result;\n }\n }\n }\n }\n\n if (matches.length === 0) {\n return undefined;\n }\n\n var order = 1 / matches.length;\n matches.forEach(function (m, i) {\n return m.distanceSq += i * order;\n });\n matches.sort(function (a, b) {\n return a.distanceSq - b.distanceSq;\n });\n matches.some(function (m) {\n return result = m.callback(m.feature, m.layer, m.geometry);\n });\n return result;\n };\n /**\n * @abstract\n * @param {import("../pixel.js").Pixel} pixel Pixel.\n * @param {import("../PluggableMap.js").FrameState} frameState FrameState.\n * @param {number} hitTolerance Hit tolerance in pixels.\n * @param {function(import("../layer/Layer.js").default, (Uint8ClampedArray|Uint8Array)): T} callback Layer\n * callback.\n * @param {function(import("../layer/Layer.js").default): boolean} layerFilter Layer filter\n * function, only layers which are visible and for which this function\n * returns `true` will be tested for features. By default, all visible\n * layers will be tested.\n * @return {T|undefined} Callback result.\n * @template T\n */\n\n\n MapRenderer.prototype.forEachLayerAtPixel = function (pixel, frameState, hitTolerance, callback, layerFilter) {\n return util_abstract();\n };\n /**\n * @param {import("../coordinate.js").Coordinate} coordinate Coordinate.\n * @param {import("../PluggableMap.js").FrameState} frameState FrameState.\n * @param {number} hitTolerance Hit tolerance in pixels.\n * @param {boolean} checkWrapped Check for wrapped geometries.\n * @param {function(this: U, import("../layer/Layer.js").default): boolean} layerFilter Layer filter\n * function, only layers which are visible and for which this function\n * returns `true` will be tested for features. By default, all visible\n * layers will be tested.\n * @param {U} thisArg Value to use as `this` when executing `layerFilter`.\n * @return {boolean} Is there a feature at the given coordinate?\n * @template U\n */\n\n\n MapRenderer.prototype.hasFeatureAtCoordinate = function (coordinate, frameState, hitTolerance, checkWrapped, layerFilter, thisArg) {\n var hasFeature = this.forEachFeatureAtCoordinate(coordinate, frameState, hitTolerance, checkWrapped, TRUE, this, layerFilter, thisArg);\n return hasFeature !== undefined;\n };\n /**\n * @return {import("../PluggableMap.js").default} Map.\n */\n\n\n MapRenderer.prototype.getMap = function () {\n return this.map_;\n };\n /**\n * Render.\n * @abstract\n * @param {?import("../PluggableMap.js").FrameState} frameState Frame state.\n */\n\n\n MapRenderer.prototype.renderFrame = function (frameState) {\n util_abstract();\n };\n /**\n * @param {import("../PluggableMap.js").FrameState} frameState Frame state.\n * @protected\n */\n\n\n MapRenderer.prototype.scheduleExpireIconCache = function (frameState) {\n if (shared.canExpireCache()) {\n frameState.postRenderFunctions.push(expireIconCache);\n }\n };\n\n return MapRenderer;\n}(ol_Disposable);\n/**\n * @param {import("../PluggableMap.js").default} map Map.\n * @param {import("../PluggableMap.js").FrameState} frameState Frame state.\n */\n\n\nfunction expireIconCache(map, frameState) {\n shared.expire();\n}\n\n/* harmony default export */ var renderer_Map = (MapRenderer);\n;// CONCATENATED MODULE: ./node_modules/ol/render/Event.js\n/**\n * @module ol/render/Event\n */\nvar Event_extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n\n\n\nvar RenderEvent =\n/** @class */\nfunction (_super) {\n Event_extends(RenderEvent, _super);\n /**\n * @param {import("./EventType.js").default} type Type.\n * @param {import("../transform.js").Transform=} opt_inversePixelTransform Transform for\n * CSS pixels to rendered pixels.\n * @param {import("../PluggableMap.js").FrameState=} opt_frameState Frame state.\n * @param {?CanvasRenderingContext2D=} opt_context Context.\n */\n\n\n function RenderEvent(type, opt_inversePixelTransform, opt_frameState, opt_context) {\n var _this = _super.call(this, type) || this;\n /**\n * Transform from CSS pixels (relative to the top-left corner of the map viewport)\n * to rendered pixels on this event\'s `context`. Only available when a Canvas renderer is used, null otherwise.\n * @type {import("../transform.js").Transform|undefined}\n * @api\n */\n\n\n _this.inversePixelTransform = opt_inversePixelTransform;\n /**\n * An object representing the current render frame state.\n * @type {import("../PluggableMap.js").FrameState|undefined}\n * @api\n */\n\n _this.frameState = opt_frameState;\n /**\n * Canvas context. Not available when the event is dispatched by the map. Only available\n * when a Canvas renderer is used, null otherwise.\n * @type {CanvasRenderingContext2D|null|undefined}\n * @api\n */\n\n _this.context = opt_context;\n return _this;\n }\n\n return RenderEvent;\n}(Event);\n\n/* harmony default export */ var render_Event = (RenderEvent);\n;// CONCATENATED MODULE: ./node_modules/ol/css.js\n/**\n * @module ol/css\n */\n\n/**\n * @typedef {Object} FontParameters\n * @property {string} style\n * @property {string} variant\n * @property {string} weight\n * @property {string} size\n * @property {string} lineHeight\n * @property {string} family\n * @property {Array} families\n */\n\n/**\n * The CSS class for hidden feature.\n *\n * @const\n * @type {string}\n */\nvar CLASS_HIDDEN = \'ol-hidden\';\n/**\n * The CSS class that we\'ll give the DOM elements to have them selectable.\n *\n * @const\n * @type {string}\n */\n\nvar CLASS_SELECTABLE = \'ol-selectable\';\n/**\n * The CSS class that we\'ll give the DOM elements to have them unselectable.\n *\n * @const\n * @type {string}\n */\n\nvar CLASS_UNSELECTABLE = \'ol-unselectable\';\n/**\n * The CSS class for unsupported feature.\n *\n * @const\n * @type {string}\n */\n\nvar CLASS_UNSUPPORTED = \'ol-unsupported\';\n/**\n * The CSS class for controls.\n *\n * @const\n * @type {string}\n */\n\nvar CLASS_CONTROL = \'ol-control\';\n/**\n * The CSS class that we\'ll give the DOM elements that are collapsed, i.e.\n * to those elements which usually can be expanded.\n *\n * @const\n * @type {string}\n */\n\nvar CLASS_COLLAPSED = \'ol-collapsed\';\n/**\n * From http://stackoverflow.com/questions/10135697/regex-to-parse-any-css-font\n * @type {RegExp}\n */\n\nvar fontRegEx = new RegExp([\'^\\\\s*(?=(?:(?:[-a-z]+\\\\s*){0,2}(italic|oblique))?)\', \'(?=(?:(?:[-a-z]+\\\\s*){0,2}(small-caps))?)\', \'(?=(?:(?:[-a-z]+\\\\s*){0,2}(bold(?:er)?|lighter|[1-9]00 ))?)\', \'(?:(?:normal|\\\\1|\\\\2|\\\\3)\\\\s*){0,3}((?:xx?-)?\', \'(?:small|large)|medium|smaller|larger|[\\\\.\\\\d]+(?:\\\\%|in|[cem]m|ex|p[ctx]))\', \'(?:\\\\s*\\\\/\\\\s*(normal|[\\\\.\\\\d]+(?:\\\\%|in|[cem]m|ex|p[ctx])?))\', \'?\\\\s*([-,\\\\"\\\\\\\'\\\\sa-z]+?)\\\\s*$\'].join(\'\'), \'i\');\nvar fontRegExMatchIndex = [\'style\', \'variant\', \'weight\', \'size\', \'lineHeight\', \'family\'];\n/**\n * Get the list of font families from a font spec. Note that this doesn\'t work\n * for font families that have commas in them.\n * @param {string} fontSpec The CSS font property.\n * @return {FontParameters} The font parameters (or null if the input spec is invalid).\n */\n\nvar getFontParameters = function getFontParameters(fontSpec) {\n var match = fontSpec.match(fontRegEx);\n\n if (!match) {\n return null;\n }\n\n var style =\n /** @type {FontParameters} */\n {\n lineHeight: \'normal\',\n size: \'1.2em\',\n style: \'normal\',\n weight: \'normal\',\n variant: \'normal\'\n };\n\n for (var i = 0, ii = fontRegExMatchIndex.length; i < ii; ++i) {\n var value = match[i + 1];\n\n if (value !== undefined) {\n style[fontRegExMatchIndex[i]] = value;\n }\n }\n\n style.families = style.family.split(/,\\s?/);\n return style;\n};\n;// CONCATENATED MODULE: ./node_modules/ol/has.js\n/**\n * @module ol/has\n */\nvar ua = typeof navigator !== \'undefined\' && typeof navigator.userAgent !== \'undefined\' ? navigator.userAgent.toLowerCase() : \'\';\n/**\n * User agent string says we are dealing with Firefox as browser.\n * @type {boolean}\n */\n\nvar FIREFOX = ua.indexOf(\'firefox\') !== -1;\n/**\n * User agent string says we are dealing with Safari as browser.\n * @type {boolean}\n */\n\nvar SAFARI = ua.indexOf(\'safari\') !== -1 && ua.indexOf(\'chrom\') == -1;\n/**\n * User agent string says we are dealing with a WebKit engine.\n * @type {boolean}\n */\n\nvar WEBKIT = ua.indexOf(\'webkit\') !== -1 && ua.indexOf(\'edge\') == -1;\n/**\n * User agent string says we are dealing with a Mac as platform.\n * @type {boolean}\n */\n\nvar has_MAC = ua.indexOf(\'macintosh\') !== -1;\n/**\n * The ratio between physical pixels and device-independent pixels\n * (dips) on the device (`window.devicePixelRatio`).\n * @const\n * @type {number}\n * @api\n */\n\nvar DEVICE_PIXEL_RATIO = typeof devicePixelRatio !== \'undefined\' ? devicePixelRatio : 1;\n/**\n * The execution context is a worker with OffscreenCanvas available.\n * @const\n * @type {boolean}\n */\n\nvar WORKER_OFFSCREEN_CANVAS = typeof WorkerGlobalScope !== \'undefined\' && typeof OffscreenCanvas !== \'undefined\' && self instanceof WorkerGlobalScope; //eslint-disable-line\n\n/**\n * Image.prototype.decode() is supported.\n * @type {boolean}\n */\n\nvar IMAGE_DECODE = typeof Image !== \'undefined\' && Image.prototype.decode;\n/**\n * @type {boolean}\n */\n\nvar PASSIVE_EVENT_LISTENERS = function () {\n var passive = false;\n\n try {\n var options = Object.defineProperty({}, \'passive\', {\n get: function get() {\n passive = true;\n }\n });\n window.addEventListener(\'_\', null, options);\n window.removeEventListener(\'_\', null, options);\n } catch (error) {// passive not supported\n }\n\n return passive;\n}();\n;// CONCATENATED MODULE: ./node_modules/ol/dom.js\n\n/**\n * @module ol/dom\n */\n//FIXME Move this function to the canvas module\n\n/**\n * Create an html canvas element and returns its 2d context.\n * @param {number=} opt_width Canvas width.\n * @param {number=} opt_height Canvas height.\n * @param {Array=} opt_canvasPool Canvas pool to take existing canvas from.\n * @return {CanvasRenderingContext2D} The context.\n */\n\nfunction createCanvasContext2D(opt_width, opt_height, opt_canvasPool) {\n var canvas = opt_canvasPool && opt_canvasPool.length ? opt_canvasPool.shift() : WORKER_OFFSCREEN_CANVAS ? new OffscreenCanvas(opt_width || 300, opt_height || 300) : document.createElement(\'canvas\');\n\n if (opt_width) {\n canvas.width = opt_width;\n }\n\n if (opt_height) {\n canvas.height = opt_height;\n } //FIXME Allow OffscreenCanvasRenderingContext2D as return type\n\n\n return (\n /** @type {CanvasRenderingContext2D} */\n canvas.getContext(\'2d\')\n );\n}\n/**\n * Get the current computed width for the given element including margin,\n * padding and border.\n * Equivalent to jQuery\'s `$(el).outerWidth(true)`.\n * @param {!HTMLElement} element Element.\n * @return {number} The width.\n */\n\nfunction dom_outerWidth(element) {\n var width = element.offsetWidth;\n var style = getComputedStyle(element);\n width += parseInt(style.marginLeft, 10) + parseInt(style.marginRight, 10);\n return width;\n}\n/**\n * Get the current computed height for the given element including margin,\n * padding and border.\n * Equivalent to jQuery\'s `$(el).outerHeight(true)`.\n * @param {!HTMLElement} element Element.\n * @return {number} The height.\n */\n\nfunction dom_outerHeight(element) {\n var height = element.offsetHeight;\n var style = getComputedStyle(element);\n height += parseInt(style.marginTop, 10) + parseInt(style.marginBottom, 10);\n return height;\n}\n/**\n * @param {Node} newNode Node to replace old node\n * @param {Node} oldNode The node to be replaced\n */\n\nfunction replaceNode(newNode, oldNode) {\n var parent = oldNode.parentNode;\n\n if (parent) {\n parent.replaceChild(newNode, oldNode);\n }\n}\n/**\n * @param {Node} node The node to remove.\n * @returns {Node} The node that was removed or null.\n */\n\nfunction removeNode(node) {\n return node && node.parentNode ? node.parentNode.removeChild(node) : null;\n}\n/**\n * @param {Node} node The node to remove the children from.\n */\n\nfunction removeChildren(node) {\n while (node.lastChild) {\n node.removeChild(node.lastChild);\n }\n}\n/**\n * Transform the children of a parent node so they match the\n * provided list of children. This function aims to efficiently\n * remove, add, and reorder child nodes while maintaining a simple\n * implementation (it is not guaranteed to minimize DOM operations).\n * @param {Node} node The parent node whose children need reworking.\n * @param {Array} children The desired children.\n */\n\nfunction replaceChildren(node, children) {\n var oldChildren = node.childNodes;\n\n for (var i = 0; true; ++i) {\n var oldChild = oldChildren[i];\n var newChild = children[i]; // check if our work is done\n\n if (!oldChild && !newChild) {\n break;\n } // check if children match\n\n\n if (oldChild === newChild) {\n continue;\n } // check if a new child needs to be added\n\n\n if (!oldChild) {\n node.appendChild(newChild);\n continue;\n } // check if an old child needs to be removed\n\n\n if (!newChild) {\n node.removeChild(oldChild);\n --i;\n continue;\n } // reorder\n\n\n node.insertBefore(newChild, oldChild);\n }\n}\n;// CONCATENATED MODULE: ./node_modules/ol/render/canvas.js\n/**\n * @module ol/render/canvas\n */\n\n\n\n\n\n\n\n/**\n * @typedef {Object} FillState\n * @property {import("../colorlike.js").ColorLike} fillStyle\n */\n\n/**\n * @typedef Label\n * @property {number} width\n * @property {number} height\n * @property {Array} contextInstructions\n */\n\n/**\n * @typedef {Object} FillStrokeState\n * @property {import("../colorlike.js").ColorLike} [currentFillStyle]\n * @property {import("../colorlike.js").ColorLike} [currentStrokeStyle]\n * @property {CanvasLineCap} [currentLineCap]\n * @property {Array} currentLineDash\n * @property {number} [currentLineDashOffset]\n * @property {CanvasLineJoin} [currentLineJoin]\n * @property {number} [currentLineWidth]\n * @property {number} [currentMiterLimit]\n * @property {number} [lastStroke]\n * @property {import("../colorlike.js").ColorLike} [fillStyle]\n * @property {import("../colorlike.js").ColorLike} [strokeStyle]\n * @property {CanvasLineCap} [lineCap]\n * @property {Array} lineDash\n * @property {number} [lineDashOffset]\n * @property {CanvasLineJoin} [lineJoin]\n * @property {number} [lineWidth]\n * @property {number} [miterLimit]\n */\n\n/**\n * @typedef {Object} StrokeState\n * @property {CanvasLineCap} lineCap\n * @property {Array} lineDash\n * @property {number} lineDashOffset\n * @property {CanvasLineJoin} lineJoin\n * @property {number} lineWidth\n * @property {number} miterLimit\n * @property {import("../colorlike.js").ColorLike} strokeStyle\n */\n\n/**\n * @typedef {Object} TextState\n * @property {string} font\n * @property {string} [textAlign]\n * @property {string} textBaseline\n * @property {string} [placement]\n * @property {number} [maxAngle]\n * @property {boolean} [overflow]\n * @property {import("../style/Fill.js").default} [backgroundFill]\n * @property {import("../style/Stroke.js").default} [backgroundStroke]\n * @property {import("../size.js").Size} [scale]\n * @property {Array} [padding]\n */\n\n/**\n * @typedef {Object} SerializableInstructions\n * @property {Array<*>} instructions The rendering instructions.\n * @property {Array<*>} hitDetectionInstructions The rendering hit detection instructions.\n * @property {Array} coordinates The array of all coordinates.\n * @property {!Object} [textStates] The text states (decluttering).\n * @property {!Object} [fillStates] The fill states (decluttering).\n * @property {!Object} [strokeStates] The stroke states (decluttering).\n */\n\n/**\n * @typedef {Object} DeclutterImageWithText\n */\n\n/**\n * @const\n * @type {string}\n */\n\nvar defaultFont = \'10px sans-serif\';\n/**\n * @const\n * @type {import("../colorlike.js").ColorLike}\n */\n\nvar defaultFillStyle = \'#000\';\n/**\n * @const\n * @type {CanvasLineCap}\n */\n\nvar defaultLineCap = \'round\';\n/**\n * @const\n * @type {Array}\n */\n\nvar defaultLineDash = [];\n/**\n * @const\n * @type {number}\n */\n\nvar defaultLineDashOffset = 0;\n/**\n * @const\n * @type {CanvasLineJoin}\n */\n\nvar defaultLineJoin = \'round\';\n/**\n * @const\n * @type {number}\n */\n\nvar defaultMiterLimit = 10;\n/**\n * @const\n * @type {import("../colorlike.js").ColorLike}\n */\n\nvar defaultStrokeStyle = \'#000\';\n/**\n * @const\n * @type {string}\n */\n\nvar defaultTextAlign = \'center\';\n/**\n * @const\n * @type {string}\n */\n\nvar defaultTextBaseline = \'middle\';\n/**\n * @const\n * @type {Array}\n */\n\nvar defaultPadding = [0, 0, 0, 0];\n/**\n * @const\n * @type {number}\n */\n\nvar defaultLineWidth = 1;\n/**\n * @type {BaseObject}\n */\n\nvar checkedFonts = new ol_Object();\n/**\n * The label cache for text rendering. To change the default cache size of 2048\n * entries, use {@link module:ol/structs/LRUCache#setSize}.\n * Deprecated - there is no label cache any more.\n * @type {?}\n * @api\n * @deprecated\n */\n\nvar labelCache = new events_Target();\n\nlabelCache.setSize = function () {\n console.warn(\'labelCache is deprecated.\'); //eslint-disable-line\n};\n/**\n * @type {CanvasRenderingContext2D}\n */\n\n\nvar measureContext = null;\n/**\n * @type {string}\n */\n\nvar measureFont;\n/**\n * @type {!Object}\n */\n\nvar textHeights = {};\n/**\n * Clears the label cache when a font becomes available.\n * @param {string} fontSpec CSS font spec.\n */\n\nvar registerFont = function () {\n var retries = 100;\n var size = \'32px \';\n var referenceFonts = [\'monospace\', \'serif\'];\n var len = referenceFonts.length;\n var text = "wmytzilWMYTZIL@#/&?$%10\\uF013";\n var interval, referenceWidth;\n /**\n * @param {string} fontStyle Css font-style\n * @param {string} fontWeight Css font-weight\n * @param {*} fontFamily Css font-family\n * @return {boolean} Font with style and weight is available\n */\n\n function isAvailable(fontStyle, fontWeight, fontFamily) {\n var available = true;\n\n for (var i = 0; i < len; ++i) {\n var referenceFont = referenceFonts[i];\n referenceWidth = measureTextWidth(fontStyle + \' \' + fontWeight + \' \' + size + referenceFont, text);\n\n if (fontFamily != referenceFont) {\n var width = measureTextWidth(fontStyle + \' \' + fontWeight + \' \' + size + fontFamily + \',\' + referenceFont, text); // If width and referenceWidth are the same, then the fallback was used\n // instead of the font we wanted, so the font is not available.\n\n available = available && width != referenceWidth;\n }\n }\n\n if (available) {\n return true;\n }\n\n return false;\n }\n\n function check() {\n var done = true;\n var fonts = checkedFonts.getKeys();\n\n for (var i = 0, ii = fonts.length; i < ii; ++i) {\n var font = fonts[i];\n\n if (checkedFonts.get(font) < retries) {\n if (isAvailable.apply(this, font.split(\'\\n\'))) {\n clear(textHeights); // Make sure that loaded fonts are picked up by Safari\n\n measureContext = null;\n measureFont = undefined;\n checkedFonts.set(font, retries);\n } else {\n checkedFonts.set(font, checkedFonts.get(font) + 1, true);\n done = false;\n }\n }\n }\n\n if (done) {\n clearInterval(interval);\n interval = undefined;\n }\n }\n\n return function (fontSpec) {\n var font = getFontParameters(fontSpec);\n\n if (!font) {\n return;\n }\n\n var families = font.families;\n\n for (var i = 0, ii = families.length; i < ii; ++i) {\n var family = families[i];\n var key = font.style + \'\\n\' + font.weight + \'\\n\' + family;\n\n if (checkedFonts.get(key) === undefined) {\n checkedFonts.set(key, retries, true);\n\n if (!isAvailable(font.style, font.weight, family)) {\n checkedFonts.set(key, 0, true);\n\n if (interval === undefined) {\n interval = setInterval(check, 32);\n }\n }\n }\n }\n };\n}();\n/**\n * @param {string} font Font to use for measuring.\n * @return {import("../size.js").Size} Measurement.\n */\n\nvar measureTextHeight = function () {\n /**\n * @type {HTMLDivElement}\n */\n var div;\n return function (fontSpec) {\n var height = textHeights[fontSpec];\n\n if (height == undefined) {\n if (WORKER_OFFSCREEN_CANVAS) {\n var font = getFontParameters(fontSpec);\n var metrics = measureText(fontSpec, \'Žg\');\n var lineHeight = isNaN(Number(font.lineHeight)) ? 1.2 : Number(font.lineHeight);\n height = lineHeight * (metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent);\n } else {\n if (!div) {\n div = document.createElement(\'div\');\n div.innerHTML = \'M\';\n div.style.margin = \'0 !important\';\n div.style.padding = \'0 !important\';\n div.style.position = \'absolute !important\';\n div.style.left = \'-99999px !important\';\n }\n\n div.style.font = fontSpec;\n document.body.appendChild(div);\n height = div.offsetHeight;\n document.body.removeChild(div);\n }\n\n textHeights[fontSpec] = height;\n }\n\n return height;\n };\n}();\n/**\n * @param {string} font Font.\n * @param {string} text Text.\n * @return {TextMetrics} Text metrics.\n */\n\nfunction measureText(font, text) {\n if (!measureContext) {\n measureContext = createCanvasContext2D(1, 1);\n }\n\n if (font != measureFont) {\n measureContext.font = font;\n measureFont = measureContext.font;\n }\n\n return measureContext.measureText(text);\n}\n/**\n * @param {string} font Font.\n * @param {string} text Text.\n * @return {number} Width.\n */\n\n\nfunction measureTextWidth(font, text) {\n return measureText(font, text).width;\n}\n/**\n * Measure text width using a cache.\n * @param {string} font The font.\n * @param {string} text The text to measure.\n * @param {Object} cache A lookup of cached widths by text.\n * @returns {number} The text width.\n */\n\nfunction measureAndCacheTextWidth(font, text, cache) {\n if (text in cache) {\n return cache[text];\n }\n\n var width = measureTextWidth(font, text);\n cache[text] = width;\n return width;\n}\n/**\n * @param {string} font Font to use for measuring.\n * @param {Array} lines Lines to measure.\n * @param {Array} widths Array will be populated with the widths of\n * each line.\n * @return {number} Width of the whole text.\n */\n\nfunction measureTextWidths(font, lines, widths) {\n var numLines = lines.length;\n var width = 0;\n\n for (var i = 0; i < numLines; ++i) {\n var currentWidth = measureTextWidth(font, lines[i]);\n width = Math.max(width, currentWidth);\n widths.push(currentWidth);\n }\n\n return width;\n}\n/**\n * @param {CanvasRenderingContext2D} context Context.\n * @param {number} rotation Rotation.\n * @param {number} offsetX X offset.\n * @param {number} offsetY Y offset.\n */\n\nfunction rotateAtOffset(context, rotation, offsetX, offsetY) {\n if (rotation !== 0) {\n context.translate(offsetX, offsetY);\n context.rotate(rotation);\n context.translate(-offsetX, -offsetY);\n }\n}\n/**\n * @param {CanvasRenderingContext2D} context Context.\n * @param {import("../transform.js").Transform|null} transform Transform.\n * @param {number} opacity Opacity.\n * @param {Label|HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} labelOrImage Label.\n * @param {number} originX Origin X.\n * @param {number} originY Origin Y.\n * @param {number} w Width.\n * @param {number} h Height.\n * @param {number} x X.\n * @param {number} y Y.\n * @param {import("../size.js").Size} scale Scale.\n */\n\nfunction drawImageOrLabel(context, transform, opacity, labelOrImage, originX, originY, w, h, x, y, scale) {\n context.save();\n\n if (opacity !== 1) {\n context.globalAlpha *= opacity;\n }\n\n if (transform) {\n context.setTransform.apply(context, transform);\n }\n\n if (\n /** @type {*} */\n labelOrImage.contextInstructions) {\n // label\n context.translate(x, y);\n context.scale(scale[0], scale[1]);\n executeLabelInstructions(\n /** @type {Label} */\n labelOrImage, context);\n } else if (scale[0] < 0 || scale[1] < 0) {\n // flipped image\n context.translate(x, y);\n context.scale(scale[0], scale[1]);\n context.drawImage(\n /** @type {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} */\n labelOrImage, originX, originY, w, h, 0, 0, w, h);\n } else {\n // if image not flipped translate and scale can be avoided\n context.drawImage(\n /** @type {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} */\n labelOrImage, originX, originY, w, h, x, y, w * scale[0], h * scale[1]);\n }\n\n context.restore();\n}\n/**\n * @param {Label} label Label.\n * @param {CanvasRenderingContext2D} context Context.\n */\n\nfunction executeLabelInstructions(label, context) {\n var contextInstructions = label.contextInstructions;\n\n for (var i = 0, ii = contextInstructions.length; i < ii; i += 2) {\n if (Array.isArray(contextInstructions[i + 1])) {\n context[contextInstructions[i]].apply(context, contextInstructions[i + 1]);\n } else {\n context[contextInstructions[i]] = contextInstructions[i + 1];\n }\n }\n}\n/**\n * @type {HTMLCanvasElement}\n * @private\n */\n\n\nvar createTransformStringCanvas = null;\n/**\n * @param {import("../transform.js").Transform} transform Transform.\n * @return {string} CSS transform.\n */\n\nfunction createTransformString(transform) {\n if (WORKER_OFFSCREEN_CANVAS) {\n return transform_toString(transform);\n } else {\n if (!createTransformStringCanvas) {\n createTransformStringCanvas = createCanvasContext2D(1, 1).canvas;\n }\n\n createTransformStringCanvas.style.transform = transform_toString(transform);\n return createTransformStringCanvas.style.transform;\n }\n}\n;// CONCATENATED MODULE: ./node_modules/ol/renderer/Composite.js\nvar Composite_extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n/**\n * @module ol/renderer/Composite\n */\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * @classdesc\n * Canvas map renderer.\n * @api\n */\n\nvar CompositeMapRenderer =\n/** @class */\nfunction (_super) {\n Composite_extends(CompositeMapRenderer, _super);\n /**\n * @param {import("../PluggableMap.js").default} map Map.\n */\n\n\n function CompositeMapRenderer(map) {\n var _this = _super.call(this, map) || this;\n /**\n * @type {import("../events.js").EventsKey}\n */\n\n\n _this.fontChangeListenerKey_ = listen(checkedFonts, ObjectEventType.PROPERTYCHANGE, map.redrawText.bind(map));\n /**\n * @private\n * @type {HTMLDivElement}\n */\n\n _this.element_ = document.createElement(\'div\');\n var style = _this.element_.style;\n style.position = \'absolute\';\n style.width = \'100%\';\n style.height = \'100%\';\n style.zIndex = \'0\';\n _this.element_.className = CLASS_UNSELECTABLE + \' ol-layers\';\n var container = map.getViewport();\n container.insertBefore(_this.element_, container.firstChild || null);\n /**\n * @private\n * @type {Array}\n */\n\n _this.children_ = [];\n /**\n * @private\n * @type {boolean}\n */\n\n _this.renderedVisible_ = true;\n return _this;\n }\n /**\n * @param {import("../render/EventType.js").default} type Event type.\n * @param {import("../PluggableMap.js").FrameState} frameState Frame state.\n */\n\n\n CompositeMapRenderer.prototype.dispatchRenderEvent = function (type, frameState) {\n var map = this.getMap();\n\n if (map.hasListener(type)) {\n var event_1 = new render_Event(type, undefined, frameState);\n map.dispatchEvent(event_1);\n }\n };\n\n CompositeMapRenderer.prototype.disposeInternal = function () {\n unlistenByKey(this.fontChangeListenerKey_);\n this.element_.parentNode.removeChild(this.element_);\n\n _super.prototype.disposeInternal.call(this);\n };\n /**\n * Render.\n * @param {?import("../PluggableMap.js").FrameState} frameState Frame state.\n */\n\n\n CompositeMapRenderer.prototype.renderFrame = function (frameState) {\n if (!frameState) {\n if (this.renderedVisible_) {\n this.element_.style.display = \'none\';\n this.renderedVisible_ = false;\n }\n\n return;\n }\n\n this.calculateMatrices2D(frameState);\n this.dispatchRenderEvent(render_EventType.PRECOMPOSE, frameState);\n var layerStatesArray = frameState.layerStatesArray.sort(function (a, b) {\n return a.zIndex - b.zIndex;\n });\n var viewState = frameState.viewState;\n this.children_.length = 0;\n /**\n * @type {Array}\n */\n\n var declutterLayers = [];\n var previousElement = null;\n\n for (var i = 0, ii = layerStatesArray.length; i < ii; ++i) {\n var layerState = layerStatesArray[i];\n frameState.layerIndex = i;\n\n if (!inView(layerState, viewState) || layerState.sourceState != State.READY && layerState.sourceState != State.UNDEFINED) {\n continue;\n }\n\n var layer = layerState.layer;\n var element = layer.render(frameState, previousElement);\n\n if (!element) {\n continue;\n }\n\n if (element !== previousElement) {\n this.children_.push(element);\n previousElement = element;\n }\n\n if (\'getDeclutter\' in layer) {\n declutterLayers.push(layer);\n }\n }\n\n for (var i = declutterLayers.length - 1; i >= 0; --i) {\n declutterLayers[i].renderDeclutter(frameState);\n }\n\n replaceChildren(this.element_, this.children_);\n this.dispatchRenderEvent(render_EventType.POSTCOMPOSE, frameState);\n\n if (!this.renderedVisible_) {\n this.element_.style.display = \'\';\n this.renderedVisible_ = true;\n }\n\n this.scheduleExpireIconCache(frameState);\n };\n /**\n * @param {import("../pixel.js").Pixel} pixel Pixel.\n * @param {import("../PluggableMap.js").FrameState} frameState FrameState.\n * @param {number} hitTolerance Hit tolerance in pixels.\n * @param {function(import("../layer/Layer.js").default, (Uint8ClampedArray|Uint8Array)): T} callback Layer\n * callback.\n * @param {function(import("../layer/Layer.js").default): boolean} layerFilter Layer filter\n * function, only layers which are visible and for which this function\n * returns `true` will be tested for features. By default, all visible\n * layers will be tested.\n * @return {T|undefined} Callback result.\n * @template T\n */\n\n\n CompositeMapRenderer.prototype.forEachLayerAtPixel = function (pixel, frameState, hitTolerance, callback, layerFilter) {\n var viewState = frameState.viewState;\n var layerStates = frameState.layerStatesArray;\n var numLayers = layerStates.length;\n\n for (var i = numLayers - 1; i >= 0; --i) {\n var layerState = layerStates[i];\n var layer = layerState.layer;\n\n if (layer.hasRenderer() && inView(layerState, viewState) && layerFilter(layer)) {\n var layerRenderer = layer.getRenderer();\n var data = layerRenderer.getDataAtPixel(pixel, frameState, hitTolerance);\n\n if (data) {\n var result = callback(layer, data);\n\n if (result) {\n return result;\n }\n }\n }\n }\n\n return undefined;\n };\n\n return CompositeMapRenderer;\n}(renderer_Map);\n\n/* harmony default export */ var Composite = (CompositeMapRenderer);\n;// CONCATENATED MODULE: ./node_modules/ol/CollectionEventType.js\n/**\n * @module ol/CollectionEventType\n */\n\n/**\n * @enum {string}\n */\n/* harmony default export */ var CollectionEventType = ({\n /**\n * Triggered when an item is added to the collection.\n * @event module:ol/Collection.CollectionEvent#add\n * @api\n */\n ADD: \'add\',\n\n /**\n * Triggered when an item is removed from the collection.\n * @event module:ol/Collection.CollectionEvent#remove\n * @api\n */\n REMOVE: \'remove\'\n});\n;// CONCATENATED MODULE: ./node_modules/ol/Collection.js\nvar Collection_extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n/**\n * @module ol/Collection\n */\n\n\n\n\n\n\n/**\n * @enum {string}\n * @private\n */\n\nvar Collection_Property = {\n LENGTH: \'length\'\n};\n/**\n * @classdesc\n * Events emitted by {@link module:ol/Collection~Collection} instances are instances of this\n * type.\n */\n\nvar CollectionEvent =\n/** @class */\nfunction (_super) {\n Collection_extends(CollectionEvent, _super);\n /**\n * @param {import("./CollectionEventType.js").default} type Type.\n * @param {*=} opt_element Element.\n * @param {number=} opt_index The index of the added or removed element.\n */\n\n\n function CollectionEvent(type, opt_element, opt_index) {\n var _this = _super.call(this, type) || this;\n /**\n * The element that is added to or removed from the collection.\n * @type {*}\n * @api\n */\n\n\n _this.element = opt_element;\n /**\n * The index of the added or removed element.\n * @type {number}\n * @api\n */\n\n _this.index = opt_index;\n return _this;\n }\n\n return CollectionEvent;\n}(Event);\n\n\n/**\n * @typedef {Object} Options\n * @property {boolean} [unique=false] Disallow the same item from being added to\n * the collection twice.\n */\n\n/**\n * @classdesc\n * An expanded version of standard JS Array, adding convenience methods for\n * manipulation. Add and remove changes to the Collection trigger a Collection\n * event. Note that this does not cover changes to the objects _within_ the\n * Collection; they trigger events on the appropriate object, not on the\n * Collection as a whole.\n *\n * @fires CollectionEvent\n *\n * @template T\n * @api\n */\n\nvar Collection =\n/** @class */\nfunction (_super) {\n Collection_extends(Collection, _super);\n /**\n * @param {Array=} opt_array Array.\n * @param {Options=} opt_options Collection options.\n */\n\n\n function Collection(opt_array, opt_options) {\n var _this = _super.call(this) || this;\n\n var options = opt_options || {};\n /**\n * @private\n * @type {boolean}\n */\n\n _this.unique_ = !!options.unique;\n /**\n * @private\n * @type {!Array}\n */\n\n _this.array_ = opt_array ? opt_array : [];\n\n if (_this.unique_) {\n for (var i = 0, ii = _this.array_.length; i < ii; ++i) {\n _this.assertUnique_(_this.array_[i], i);\n }\n }\n\n _this.updateLength_();\n\n return _this;\n }\n /**\n * Remove all elements from the collection.\n * @api\n */\n\n\n Collection.prototype.clear = function () {\n while (this.getLength() > 0) {\n this.pop();\n }\n };\n /**\n * Add elements to the collection. This pushes each item in the provided array\n * to the end of the collection.\n * @param {!Array} arr Array.\n * @return {Collection} This collection.\n * @api\n */\n\n\n Collection.prototype.extend = function (arr) {\n for (var i = 0, ii = arr.length; i < ii; ++i) {\n this.push(arr[i]);\n }\n\n return this;\n };\n /**\n * Iterate over each element, calling the provided callback.\n * @param {function(T, number, Array): *} f The function to call\n * for every element. This function takes 3 arguments (the element, the\n * index and the array). The return value is ignored.\n * @api\n */\n\n\n Collection.prototype.forEach = function (f) {\n var array = this.array_;\n\n for (var i = 0, ii = array.length; i < ii; ++i) {\n f(array[i], i, array);\n }\n };\n /**\n * Get a reference to the underlying Array object. Warning: if the array\n * is mutated, no events will be dispatched by the collection, and the\n * collection\'s "length" property won\'t be in sync with the actual length\n * of the array.\n * @return {!Array} Array.\n * @api\n */\n\n\n Collection.prototype.getArray = function () {\n return this.array_;\n };\n /**\n * Get the element at the provided index.\n * @param {number} index Index.\n * @return {T} Element.\n * @api\n */\n\n\n Collection.prototype.item = function (index) {\n return this.array_[index];\n };\n /**\n * Get the length of this collection.\n * @return {number} The length of the array.\n * @observable\n * @api\n */\n\n\n Collection.prototype.getLength = function () {\n return this.get(Collection_Property.LENGTH);\n };\n /**\n * Insert an element at the provided index.\n * @param {number} index Index.\n * @param {T} elem Element.\n * @api\n */\n\n\n Collection.prototype.insertAt = function (index, elem) {\n if (this.unique_) {\n this.assertUnique_(elem);\n }\n\n this.array_.splice(index, 0, elem);\n this.updateLength_();\n this.dispatchEvent(new CollectionEvent(CollectionEventType.ADD, elem, index));\n };\n /**\n * Remove the last element of the collection and return it.\n * Return `undefined` if the collection is empty.\n * @return {T|undefined} Element.\n * @api\n */\n\n\n Collection.prototype.pop = function () {\n return this.removeAt(this.getLength() - 1);\n };\n /**\n * Insert the provided element at the end of the collection.\n * @param {T} elem Element.\n * @return {number} New length of the collection.\n * @api\n */\n\n\n Collection.prototype.push = function (elem) {\n if (this.unique_) {\n this.assertUnique_(elem);\n }\n\n var n = this.getLength();\n this.insertAt(n, elem);\n return this.getLength();\n };\n /**\n * Remove the first occurrence of an element from the collection.\n * @param {T} elem Element.\n * @return {T|undefined} The removed element or undefined if none found.\n * @api\n */\n\n\n Collection.prototype.remove = function (elem) {\n var arr = this.array_;\n\n for (var i = 0, ii = arr.length; i < ii; ++i) {\n if (arr[i] === elem) {\n return this.removeAt(i);\n }\n }\n\n return undefined;\n };\n /**\n * Remove the element at the provided index and return it.\n * Return `undefined` if the collection does not contain this index.\n * @param {number} index Index.\n * @return {T|undefined} Value.\n * @api\n */\n\n\n Collection.prototype.removeAt = function (index) {\n var prev = this.array_[index];\n this.array_.splice(index, 1);\n this.updateLength_();\n this.dispatchEvent(new CollectionEvent(CollectionEventType.REMOVE, prev, index));\n return prev;\n };\n /**\n * Set the element at the provided index.\n * @param {number} index Index.\n * @param {T} elem Element.\n * @api\n */\n\n\n Collection.prototype.setAt = function (index, elem) {\n var n = this.getLength();\n\n if (index < n) {\n if (this.unique_) {\n this.assertUnique_(elem, index);\n }\n\n var prev = this.array_[index];\n this.array_[index] = elem;\n this.dispatchEvent(new CollectionEvent(CollectionEventType.REMOVE, prev, index));\n this.dispatchEvent(new CollectionEvent(CollectionEventType.ADD, elem, index));\n } else {\n for (var j = n; j < index; ++j) {\n this.insertAt(j, undefined);\n }\n\n this.insertAt(index, elem);\n }\n };\n /**\n * @private\n */\n\n\n Collection.prototype.updateLength_ = function () {\n this.set(Collection_Property.LENGTH, this.array_.length);\n };\n /**\n * @private\n * @param {T} elem Element.\n * @param {number=} opt_except Optional index to ignore.\n */\n\n\n Collection.prototype.assertUnique_ = function (elem, opt_except) {\n for (var i = 0, ii = this.array_.length; i < ii; ++i) {\n if (this.array_[i] === elem && i !== opt_except) {\n throw new ol_AssertionError(58);\n }\n }\n };\n\n return Collection;\n}(ol_Object);\n\n/* harmony default export */ var ol_Collection = (Collection);\n;// CONCATENATED MODULE: ./node_modules/ol/layer/Group.js\nvar Group_extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n/**\n * @module ol/layer/Group\n */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * @typedef {Object} Options\n * @property {number} [opacity=1] Opacity (0, 1).\n * @property {boolean} [visible=true] Visibility.\n * @property {import("../extent.js").Extent} [extent] The bounding extent for layer rendering. The layer will not be\n * rendered outside of this extent.\n * @property {number} [zIndex] The z-index for layer rendering. At rendering time, the layers\n * will be ordered, first by Z-index and then by position. When `undefined`, a `zIndex` of 0 is assumed\n * for layers that are added to the map\'s `layers` collection, or `Infinity` when the layer\'s `setMap()`\n * method was used.\n * @property {number} [minResolution] The minimum resolution (inclusive) at which this layer will be\n * visible.\n * @property {number} [maxResolution] The maximum resolution (exclusive) below which this layer will\n * be visible.\n * @property {number} [minZoom] The minimum view zoom level (exclusive) above which this layer will be\n * visible.\n * @property {number} [maxZoom] The maximum view zoom level (inclusive) at which this layer will\n * be visible.\n * @property {number} [minZoom] The minimum view zoom level (exclusive) above which this layer will be\n * visible.\n * @property {number} [maxZoom] The maximum view zoom level (inclusive) at which this layer will\n * be visible.\n * @property {Array|import("../Collection.js").default} [layers] Child layers.\n */\n\n/**\n * @enum {string}\n * @private\n */\n\nvar Group_Property = {\n LAYERS: \'layers\'\n};\n/**\n * @classdesc\n * A {@link module:ol/Collection~Collection} of layers that are handled together.\n *\n * A generic `change` event is triggered when the group/Collection changes.\n *\n * @api\n */\n\nvar LayerGroup =\n/** @class */\nfunction (_super) {\n Group_extends(LayerGroup, _super);\n /**\n * @param {Options=} opt_options Layer options.\n */\n\n\n function LayerGroup(opt_options) {\n var _this = this;\n\n var options = opt_options || {};\n var baseOptions =\n /** @type {Options} */\n obj_assign({}, options);\n delete baseOptions.layers;\n var layers = options.layers;\n _this = _super.call(this, baseOptions) || this;\n /**\n * @private\n * @type {Array}\n */\n\n _this.layersListenerKeys_ = [];\n /**\n * @private\n * @type {Object>}\n */\n\n _this.listenerKeys_ = {};\n\n _this.addEventListener(getChangeEventType(Group_Property.LAYERS), _this.handleLayersChanged_);\n\n if (layers) {\n if (Array.isArray(layers)) {\n layers = new ol_Collection(layers.slice(), {\n unique: true\n });\n } else {\n asserts_assert(typeof\n /** @type {?} */\n layers.getArray === \'function\', 43); // Expected `layers` to be an array or a `Collection`\n }\n } else {\n layers = new ol_Collection(undefined, {\n unique: true\n });\n }\n\n _this.setLayers(layers);\n\n return _this;\n }\n /**\n * @private\n */\n\n\n LayerGroup.prototype.handleLayerChange_ = function () {\n this.changed();\n };\n /**\n * @private\n */\n\n\n LayerGroup.prototype.handleLayersChanged_ = function () {\n this.layersListenerKeys_.forEach(unlistenByKey);\n this.layersListenerKeys_.length = 0;\n var layers = this.getLayers();\n this.layersListenerKeys_.push(listen(layers, CollectionEventType.ADD, this.handleLayersAdd_, this), listen(layers, CollectionEventType.REMOVE, this.handleLayersRemove_, this));\n\n for (var id in this.listenerKeys_) {\n this.listenerKeys_[id].forEach(unlistenByKey);\n }\n\n clear(this.listenerKeys_);\n var layersArray = layers.getArray();\n\n for (var i = 0, ii = layersArray.length; i < ii; i++) {\n var layer = layersArray[i];\n this.listenerKeys_[getUid(layer)] = [listen(layer, ObjectEventType.PROPERTYCHANGE, this.handleLayerChange_, this), listen(layer, EventType.CHANGE, this.handleLayerChange_, this)];\n }\n\n this.changed();\n };\n /**\n * @param {import("../Collection.js").CollectionEvent} collectionEvent CollectionEvent.\n * @private\n */\n\n\n LayerGroup.prototype.handleLayersAdd_ = function (collectionEvent) {\n var layer =\n /** @type {import("./Base.js").default} */\n collectionEvent.element;\n this.listenerKeys_[getUid(layer)] = [listen(layer, ObjectEventType.PROPERTYCHANGE, this.handleLayerChange_, this), listen(layer, EventType.CHANGE, this.handleLayerChange_, this)];\n this.changed();\n };\n /**\n * @param {import("../Collection.js").CollectionEvent} collectionEvent CollectionEvent.\n * @private\n */\n\n\n LayerGroup.prototype.handleLayersRemove_ = function (collectionEvent) {\n var layer =\n /** @type {import("./Base.js").default} */\n collectionEvent.element;\n var key = getUid(layer);\n this.listenerKeys_[key].forEach(unlistenByKey);\n delete this.listenerKeys_[key];\n this.changed();\n };\n /**\n * Returns the {@link module:ol/Collection collection} of {@link module:ol/layer/Layer~Layer layers}\n * in this group.\n * @return {!import("../Collection.js").default} Collection of\n * {@link module:ol/layer/Base layers} that are part of this group.\n * @observable\n * @api\n */\n\n\n LayerGroup.prototype.getLayers = function () {\n return (\n /** @type {!import("../Collection.js").default} */\n this.get(Group_Property.LAYERS)\n );\n };\n /**\n * Set the {@link module:ol/Collection collection} of {@link module:ol/layer/Layer~Layer layers}\n * in this group.\n * @param {!import("../Collection.js").default} layers Collection of\n * {@link module:ol/layer/Base layers} that are part of this group.\n * @observable\n * @api\n */\n\n\n LayerGroup.prototype.setLayers = function (layers) {\n this.set(Group_Property.LAYERS, layers);\n };\n /**\n * @param {Array=} opt_array Array of layers (to be modified in place).\n * @return {Array} Array of layers.\n */\n\n\n LayerGroup.prototype.getLayersArray = function (opt_array) {\n var array = opt_array !== undefined ? opt_array : [];\n this.getLayers().forEach(function (layer) {\n layer.getLayersArray(array);\n });\n return array;\n };\n /**\n * @param {Array=} opt_states Optional list of layer states (to be modified in place).\n * @return {Array} List of layer states.\n */\n\n\n LayerGroup.prototype.getLayerStatesArray = function (opt_states) {\n var states = opt_states !== undefined ? opt_states : [];\n var pos = states.length;\n this.getLayers().forEach(function (layer) {\n layer.getLayerStatesArray(states);\n });\n var ownLayerState = this.getLayerState();\n\n for (var i = pos, ii = states.length; i < ii; i++) {\n var layerState = states[i];\n layerState.opacity *= ownLayerState.opacity;\n layerState.visible = layerState.visible && ownLayerState.visible;\n layerState.maxResolution = Math.min(layerState.maxResolution, ownLayerState.maxResolution);\n layerState.minResolution = Math.max(layerState.minResolution, ownLayerState.minResolution);\n layerState.minZoom = Math.max(layerState.minZoom, ownLayerState.minZoom);\n layerState.maxZoom = Math.min(layerState.maxZoom, ownLayerState.maxZoom);\n\n if (ownLayerState.extent !== undefined) {\n if (layerState.extent !== undefined) {\n layerState.extent = getIntersection(layerState.extent, ownLayerState.extent);\n } else {\n layerState.extent = ownLayerState.extent;\n }\n }\n }\n\n return states;\n };\n /**\n * @return {import("../source/State.js").default} Source state.\n */\n\n\n LayerGroup.prototype.getSourceState = function () {\n return State.READY;\n };\n\n return LayerGroup;\n}(Base);\n\n/* harmony default export */ var Group = (LayerGroup);\n;// CONCATENATED MODULE: ./node_modules/ol/MapEvent.js\nvar MapEvent_extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n/**\n * @module ol/MapEvent\n */\n\n\n\n/**\n * @classdesc\n * Events emitted as map events are instances of this type.\n * See {@link module:ol/PluggableMap~PluggableMap} for which events trigger a map event.\n */\n\nvar MapEvent =\n/** @class */\nfunction (_super) {\n MapEvent_extends(MapEvent, _super);\n /**\n * @param {string} type Event type.\n * @param {import("./PluggableMap.js").default} map Map.\n * @param {?import("./PluggableMap.js").FrameState=} opt_frameState Frame state.\n */\n\n\n function MapEvent(type, map, opt_frameState) {\n var _this = _super.call(this, type) || this;\n /**\n * The map where the event occurred.\n * @type {import("./PluggableMap.js").default}\n * @api\n */\n\n\n _this.map = map;\n /**\n * The frame state at the time of the event.\n * @type {?import("./PluggableMap.js").FrameState}\n * @api\n */\n\n _this.frameState = opt_frameState !== undefined ? opt_frameState : null;\n return _this;\n }\n\n return MapEvent;\n}(Event);\n\n/* harmony default export */ var ol_MapEvent = (MapEvent);\n;// CONCATENATED MODULE: ./node_modules/ol/MapBrowserEvent.js\nvar MapBrowserEvent_extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n/**\n * @module ol/MapBrowserEvent\n */\n\n\n\n/**\n * @classdesc\n * Events emitted as map browser events are instances of this type.\n * See {@link module:ol/PluggableMap~PluggableMap} for which events trigger a map browser event.\n * @template {UIEvent} EVENT\n */\n\nvar MapBrowserEvent =\n/** @class */\nfunction (_super) {\n MapBrowserEvent_extends(MapBrowserEvent, _super);\n /**\n * @param {string} type Event type.\n * @param {import("./PluggableMap.js").default} map Map.\n * @param {EVENT} originalEvent Original event.\n * @param {boolean=} opt_dragging Is the map currently being dragged?\n * @param {?import("./PluggableMap.js").FrameState=} opt_frameState Frame state.\n */\n\n\n function MapBrowserEvent(type, map, originalEvent, opt_dragging, opt_frameState) {\n var _this = _super.call(this, type, map, opt_frameState) || this;\n /**\n * The original browser event.\n * @const\n * @type {EVENT}\n * @api\n */\n\n\n _this.originalEvent = originalEvent;\n /**\n * The map pixel relative to the viewport corresponding to the original browser event.\n * @type {?import("./pixel.js").Pixel}\n */\n\n _this.pixel_ = null;\n /**\n * The coordinate in the user projection corresponding to the original browser event.\n * @type {?import("./coordinate.js").Coordinate}\n */\n\n _this.coordinate_ = null;\n /**\n * Indicates if the map is currently being dragged. Only set for\n * `POINTERDRAG` and `POINTERMOVE` events. Default is `false`.\n *\n * @type {boolean}\n * @api\n */\n\n _this.dragging = opt_dragging !== undefined ? opt_dragging : false;\n return _this;\n }\n\n Object.defineProperty(MapBrowserEvent.prototype, "pixel", {\n /**\n * The map pixel relative to the viewport corresponding to the original event.\n * @type {import("./pixel.js").Pixel}\n * @api\n */\n get: function get() {\n if (!this.pixel_) {\n this.pixel_ = this.map.getEventPixel(this.originalEvent);\n }\n\n return this.pixel_;\n },\n set: function set(pixel) {\n this.pixel_ = pixel;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MapBrowserEvent.prototype, "coordinate", {\n /**\n * The coordinate corresponding to the original browser event. This will be in the user\n * projection if one is set. Otherwise it will be in the view projection.\n * @type {import("./coordinate.js").Coordinate}\n * @api\n */\n get: function get() {\n if (!this.coordinate_) {\n this.coordinate_ = this.map.getCoordinateFromPixel(this.pixel);\n }\n\n return this.coordinate_;\n },\n set: function set(coordinate) {\n this.coordinate_ = coordinate;\n },\n enumerable: false,\n configurable: true\n });\n /**\n * Prevents the default browser action.\n * See https://developer.mozilla.org/en-US/docs/Web/API/event.preventDefault.\n * @api\n */\n\n MapBrowserEvent.prototype.preventDefault = function () {\n _super.prototype.preventDefault.call(this);\n\n this.originalEvent.preventDefault();\n };\n /**\n * Prevents further propagation of the current event.\n * See https://developer.mozilla.org/en-US/docs/Web/API/event.stopPropagation.\n * @api\n */\n\n\n MapBrowserEvent.prototype.stopPropagation = function () {\n _super.prototype.stopPropagation.call(this);\n\n this.originalEvent.stopPropagation();\n };\n\n return MapBrowserEvent;\n}(ol_MapEvent);\n\n/* harmony default export */ var ol_MapBrowserEvent = (MapBrowserEvent);\n;// CONCATENATED MODULE: ./node_modules/ol/MapBrowserEventType.js\n/**\n * @module ol/MapBrowserEventType\n */\n\n/**\n * Constants for event names.\n * @enum {string}\n */\n\n/* harmony default export */ var ol_MapBrowserEventType = ({\n /**\n * A true single click with no dragging and no double click. Note that this\n * event is delayed by 250 ms to ensure that it is not a double click.\n * @event module:ol/MapBrowserEvent~MapBrowserEvent#singleclick\n * @api\n */\n SINGLECLICK: \'singleclick\',\n\n /**\n * A click with no dragging. A double click will fire two of this.\n * @event module:ol/MapBrowserEvent~MapBrowserEvent#click\n * @api\n */\n CLICK: EventType.CLICK,\n\n /**\n * A true double click, with no dragging.\n * @event module:ol/MapBrowserEvent~MapBrowserEvent#dblclick\n * @api\n */\n DBLCLICK: EventType.DBLCLICK,\n\n /**\n * Triggered when a pointer is dragged.\n * @event module:ol/MapBrowserEvent~MapBrowserEvent#pointerdrag\n * @api\n */\n POINTERDRAG: \'pointerdrag\',\n\n /**\n * Triggered when a pointer is moved. Note that on touch devices this is\n * triggered when the map is panned, so is not the same as mousemove.\n * @event module:ol/MapBrowserEvent~MapBrowserEvent#pointermove\n * @api\n */\n POINTERMOVE: \'pointermove\',\n POINTERDOWN: \'pointerdown\',\n POINTERUP: \'pointerup\',\n POINTEROVER: \'pointerover\',\n POINTEROUT: \'pointerout\',\n POINTERENTER: \'pointerenter\',\n POINTERLEAVE: \'pointerleave\',\n POINTERCANCEL: \'pointercancel\'\n});\n;// CONCATENATED MODULE: ./node_modules/ol/pointer/EventType.js\n/**\n * @module ol/pointer/EventType\n */\n\n/**\n * Constants for event names.\n * @enum {string}\n */\n/* harmony default export */ var pointer_EventType = ({\n POINTERMOVE: \'pointermove\',\n POINTERDOWN: \'pointerdown\',\n POINTERUP: \'pointerup\',\n POINTEROVER: \'pointerover\',\n POINTEROUT: \'pointerout\',\n POINTERENTER: \'pointerenter\',\n POINTERLEAVE: \'pointerleave\',\n POINTERCANCEL: \'pointercancel\'\n});\n;// CONCATENATED MODULE: ./node_modules/ol/MapBrowserEventHandler.js\n/**\n * @module ol/MapBrowserEventHandler\n */\nvar MapBrowserEventHandler_extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n\n\n\n\n\n\n\n\n\nvar MapBrowserEventHandler =\n/** @class */\nfunction (_super) {\n MapBrowserEventHandler_extends(MapBrowserEventHandler, _super);\n /**\n * @param {import("./PluggableMap.js").default} map The map with the viewport to listen to events on.\n * @param {number=} moveTolerance The minimal distance the pointer must travel to trigger a move.\n */\n\n\n function MapBrowserEventHandler(map, moveTolerance) {\n var _this = _super.call(this, map) || this;\n /**\n * This is the element that we will listen to the real events on.\n * @type {import("./PluggableMap.js").default}\n * @private\n */\n\n\n _this.map_ = map;\n /**\n * @type {any}\n * @private\n */\n\n _this.clickTimeoutId_;\n /**\n * Emulate dblclick and singleclick. Will be true when only one pointer is active.\n * @type {boolean}\n */\n\n _this.emulateClicks_ = false;\n /**\n * @type {boolean}\n * @private\n */\n\n _this.dragging_ = false;\n /**\n * @type {!Array}\n * @private\n */\n\n _this.dragListenerKeys_ = [];\n /**\n * @type {number}\n * @private\n */\n\n _this.moveTolerance_ = moveTolerance ? moveTolerance * DEVICE_PIXEL_RATIO : DEVICE_PIXEL_RATIO;\n /**\n * The most recent "down" type event (or null if none have occurred).\n * Set on pointerdown.\n * @type {PointerEvent}\n * @private\n */\n\n _this.down_ = null;\n\n var element = _this.map_.getViewport();\n /**\n * @type {number}\n * @private\n */\n\n\n _this.activePointers_ = 0;\n /**\n * @type {!Object}\n * @private\n */\n\n _this.trackedTouches_ = {};\n _this.element_ = element;\n /**\n * @type {?import("./events.js").EventsKey}\n * @private\n */\n\n _this.pointerdownListenerKey_ = listen(element, pointer_EventType.POINTERDOWN, _this.handlePointerDown_, _this);\n /**\n * @type {PointerEvent}\n * @private\n */\n\n _this.originalPointerMoveEvent_;\n /**\n * @type {?import("./events.js").EventsKey}\n * @private\n */\n\n _this.relayedListenerKey_ = listen(element, pointer_EventType.POINTERMOVE, _this.relayEvent_, _this);\n /**\n * @private\n */\n\n _this.boundHandleTouchMove_ = _this.handleTouchMove_.bind(_this);\n\n _this.element_.addEventListener(EventType.TOUCHMOVE, _this.boundHandleTouchMove_, PASSIVE_EVENT_LISTENERS ? {\n passive: false\n } : false);\n\n return _this;\n }\n /**\n * @param {PointerEvent} pointerEvent Pointer\n * event.\n * @private\n */\n\n\n MapBrowserEventHandler.prototype.emulateClick_ = function (pointerEvent) {\n var newEvent = new ol_MapBrowserEvent(ol_MapBrowserEventType.CLICK, this.map_, pointerEvent);\n this.dispatchEvent(newEvent);\n\n if (this.clickTimeoutId_ !== undefined) {\n // double-click\n clearTimeout(this.clickTimeoutId_);\n this.clickTimeoutId_ = undefined;\n newEvent = new ol_MapBrowserEvent(ol_MapBrowserEventType.DBLCLICK, this.map_, pointerEvent);\n this.dispatchEvent(newEvent);\n } else {\n // click\n this.clickTimeoutId_ = setTimeout(\n /** @this {MapBrowserEventHandler} */\n function () {\n this.clickTimeoutId_ = undefined;\n var newEvent = new ol_MapBrowserEvent(ol_MapBrowserEventType.SINGLECLICK, this.map_, pointerEvent);\n this.dispatchEvent(newEvent);\n }.bind(this), 250);\n }\n };\n /**\n * Keeps track on how many pointers are currently active.\n *\n * @param {PointerEvent} pointerEvent Pointer\n * event.\n * @private\n */\n\n\n MapBrowserEventHandler.prototype.updateActivePointers_ = function (pointerEvent) {\n var event = pointerEvent;\n\n if (event.type == ol_MapBrowserEventType.POINTERUP || event.type == ol_MapBrowserEventType.POINTERCANCEL) {\n delete this.trackedTouches_[event.pointerId];\n } else if (event.type == ol_MapBrowserEventType.POINTERDOWN) {\n this.trackedTouches_[event.pointerId] = true;\n }\n\n this.activePointers_ = Object.keys(this.trackedTouches_).length;\n };\n /**\n * @param {PointerEvent} pointerEvent Pointer\n * event.\n * @private\n */\n\n\n MapBrowserEventHandler.prototype.handlePointerUp_ = function (pointerEvent) {\n this.updateActivePointers_(pointerEvent);\n var newEvent = new ol_MapBrowserEvent(ol_MapBrowserEventType.POINTERUP, this.map_, pointerEvent);\n this.dispatchEvent(newEvent); // We emulate click events on left mouse button click, touch contact, and pen\n // contact. isMouseActionButton returns true in these cases (evt.button is set\n // to 0).\n // See http://www.w3.org/TR/pointerevents/#button-states\n // We only fire click, singleclick, and doubleclick if nobody has called\n // event.stopPropagation() or event.preventDefault().\n\n if (this.emulateClicks_ && !newEvent.propagationStopped && !this.dragging_ && this.isMouseActionButton_(pointerEvent)) {\n this.emulateClick_(this.down_);\n }\n\n if (this.activePointers_ === 0) {\n this.dragListenerKeys_.forEach(unlistenByKey);\n this.dragListenerKeys_.length = 0;\n this.dragging_ = false;\n this.down_ = null;\n }\n };\n /**\n * @param {PointerEvent} pointerEvent Pointer\n * event.\n * @return {boolean} If the left mouse button was pressed.\n * @private\n */\n\n\n MapBrowserEventHandler.prototype.isMouseActionButton_ = function (pointerEvent) {\n return pointerEvent.button === 0;\n };\n /**\n * @param {PointerEvent} pointerEvent Pointer\n * event.\n * @private\n */\n\n\n MapBrowserEventHandler.prototype.handlePointerDown_ = function (pointerEvent) {\n this.emulateClicks_ = this.activePointers_ === 0;\n this.updateActivePointers_(pointerEvent);\n var newEvent = new ol_MapBrowserEvent(ol_MapBrowserEventType.POINTERDOWN, this.map_, pointerEvent);\n this.dispatchEvent(newEvent);\n this.down_ = pointerEvent;\n\n if (this.dragListenerKeys_.length === 0) {\n var doc = this.map_.getOwnerDocument();\n this.dragListenerKeys_.push(listen(doc, ol_MapBrowserEventType.POINTERMOVE, this.handlePointerMove_, this), listen(doc, ol_MapBrowserEventType.POINTERUP, this.handlePointerUp_, this),\n /* Note that the listener for `pointercancel is set up on\n * `pointerEventHandler_` and not `documentPointerEventHandler_` like\n * the `pointerup` and `pointermove` listeners.\n *\n * The reason for this is the following: `TouchSource.vacuumTouches_()`\n * issues `pointercancel` events, when there was no `touchend` for a\n * `touchstart`. Now, let\'s say a first `touchstart` is registered on\n * `pointerEventHandler_`. The `documentPointerEventHandler_` is set up.\n * But `documentPointerEventHandler_` doesn\'t know about the first\n * `touchstart`. If there is no `touchend` for the `touchstart`, we can\n * only receive a `touchcancel` from `pointerEventHandler_`, because it is\n * only registered there.\n */\n listen(this.element_, ol_MapBrowserEventType.POINTERCANCEL, this.handlePointerUp_, this));\n\n if (this.element_.getRootNode && this.element_.getRootNode() !== doc) {\n this.dragListenerKeys_.push(listen(this.element_.getRootNode(), ol_MapBrowserEventType.POINTERUP, this.handlePointerUp_, this));\n }\n }\n };\n /**\n * @param {PointerEvent} pointerEvent Pointer\n * event.\n * @private\n */\n\n\n MapBrowserEventHandler.prototype.handlePointerMove_ = function (pointerEvent) {\n // Between pointerdown and pointerup, pointermove events are triggered.\n // To avoid a \'false\' touchmove event to be dispatched, we test if the pointer\n // moved a significant distance.\n if (this.isMoving_(pointerEvent)) {\n this.dragging_ = true;\n var newEvent = new ol_MapBrowserEvent(ol_MapBrowserEventType.POINTERDRAG, this.map_, pointerEvent, this.dragging_);\n this.dispatchEvent(newEvent);\n }\n };\n /**\n * Wrap and relay a pointer event. Note that this requires that the type\n * string for the MapBrowserEvent matches the PointerEvent type.\n * @param {PointerEvent} pointerEvent Pointer\n * event.\n * @private\n */\n\n\n MapBrowserEventHandler.prototype.relayEvent_ = function (pointerEvent) {\n this.originalPointerMoveEvent_ = pointerEvent;\n var dragging = !!(this.down_ && this.isMoving_(pointerEvent));\n this.dispatchEvent(new ol_MapBrowserEvent(pointerEvent.type, this.map_, pointerEvent, dragging));\n };\n /**\n * Flexible handling of a `touch-action: none` css equivalent: because calling\n * `preventDefault()` on a `pointermove` event does not stop native page scrolling\n * and zooming, we also listen for `touchmove` and call `preventDefault()` on it\n * when an interaction (currently `DragPan` handles the event.\n * @param {TouchEvent} event Event.\n * @private\n */\n\n\n MapBrowserEventHandler.prototype.handleTouchMove_ = function (event) {\n // Due to https://github.com/mpizenberg/elm-pep/issues/2, `this.originalPointerMoveEvent_`\n // may not be initialized yet when we get here on a platform without native pointer events.\n if (!this.originalPointerMoveEvent_ || this.originalPointerMoveEvent_.defaultPrevented) {\n event.preventDefault();\n }\n };\n /**\n * @param {PointerEvent} pointerEvent Pointer\n * event.\n * @return {boolean} Is moving.\n * @private\n */\n\n\n MapBrowserEventHandler.prototype.isMoving_ = function (pointerEvent) {\n return this.dragging_ || Math.abs(pointerEvent.clientX - this.down_.clientX) > this.moveTolerance_ || Math.abs(pointerEvent.clientY - this.down_.clientY) > this.moveTolerance_;\n };\n /**\n * Clean up.\n */\n\n\n MapBrowserEventHandler.prototype.disposeInternal = function () {\n if (this.relayedListenerKey_) {\n unlistenByKey(this.relayedListenerKey_);\n this.relayedListenerKey_ = null;\n }\n\n this.element_.removeEventListener(EventType.TOUCHMOVE, this.boundHandleTouchMove_);\n\n if (this.pointerdownListenerKey_) {\n unlistenByKey(this.pointerdownListenerKey_);\n this.pointerdownListenerKey_ = null;\n }\n\n this.dragListenerKeys_.forEach(unlistenByKey);\n this.dragListenerKeys_.length = 0;\n this.element_ = null;\n\n _super.prototype.disposeInternal.call(this);\n };\n\n return MapBrowserEventHandler;\n}(events_Target);\n\n/* harmony default export */ var ol_MapBrowserEventHandler = (MapBrowserEventHandler);\n;// CONCATENATED MODULE: ./node_modules/ol/MapEventType.js\n/**\n * @module ol/MapEventType\n */\n\n/**\n * @enum {string}\n */\n/* harmony default export */ var MapEventType = ({\n /**\n * Triggered after a map frame is rendered.\n * @event module:ol/MapEvent~MapEvent#postrender\n * @api\n */\n POSTRENDER: \'postrender\',\n\n /**\n * Triggered when the map starts moving.\n * @event module:ol/MapEvent~MapEvent#movestart\n * @api\n */\n MOVESTART: \'movestart\',\n\n /**\n * Triggered after the map is moved.\n * @event module:ol/MapEvent~MapEvent#moveend\n * @api\n */\n MOVEEND: \'moveend\'\n});\n;// CONCATENATED MODULE: ./node_modules/ol/MapProperty.js\n/**\n * @module ol/MapProperty\n */\n\n/**\n * @enum {string}\n */\n/* harmony default export */ var MapProperty = ({\n LAYERGROUP: \'layergroup\',\n SIZE: \'size\',\n TARGET: \'target\',\n VIEW: \'view\'\n});\n;// CONCATENATED MODULE: ./node_modules/ol/structs/PriorityQueue.js\n/**\n * @module ol/structs/PriorityQueue\n */\n\n\n/**\n * @type {number}\n */\n\nvar DROP = Infinity;\n/**\n * @classdesc\n * Priority queue.\n *\n * The implementation is inspired from the Closure Library\'s Heap class and\n * Python\'s heapq module.\n *\n * See http://closure-library.googlecode.com/svn/docs/closure_goog_structs_heap.js.source.html\n * and http://hg.python.org/cpython/file/2.7/Lib/heapq.py.\n *\n * @template T\n */\n\nvar PriorityQueue =\n/** @class */\nfunction () {\n /**\n * @param {function(T): number} priorityFunction Priority function.\n * @param {function(T): string} keyFunction Key function.\n */\n function PriorityQueue(priorityFunction, keyFunction) {\n /**\n * @type {function(T): number}\n * @private\n */\n this.priorityFunction_ = priorityFunction;\n /**\n * @type {function(T): string}\n * @private\n */\n\n this.keyFunction_ = keyFunction;\n /**\n * @type {Array}\n * @private\n */\n\n this.elements_ = [];\n /**\n * @type {Array}\n * @private\n */\n\n this.priorities_ = [];\n /**\n * @type {!Object}\n * @private\n */\n\n this.queuedElements_ = {};\n }\n /**\n * FIXME empty description for jsdoc\n */\n\n\n PriorityQueue.prototype.clear = function () {\n this.elements_.length = 0;\n this.priorities_.length = 0;\n clear(this.queuedElements_);\n };\n /**\n * Remove and return the highest-priority element. O(log N).\n * @return {T} Element.\n */\n\n\n PriorityQueue.prototype.dequeue = function () {\n var elements = this.elements_;\n var priorities = this.priorities_;\n var element = elements[0];\n\n if (elements.length == 1) {\n elements.length = 0;\n priorities.length = 0;\n } else {\n elements[0] = elements.pop();\n priorities[0] = priorities.pop();\n this.siftUp_(0);\n }\n\n var elementKey = this.keyFunction_(element);\n delete this.queuedElements_[elementKey];\n return element;\n };\n /**\n * Enqueue an element. O(log N).\n * @param {T} element Element.\n * @return {boolean} The element was added to the queue.\n */\n\n\n PriorityQueue.prototype.enqueue = function (element) {\n asserts_assert(!(this.keyFunction_(element) in this.queuedElements_), 31); // Tried to enqueue an `element` that was already added to the queue\n\n var priority = this.priorityFunction_(element);\n\n if (priority != DROP) {\n this.elements_.push(element);\n this.priorities_.push(priority);\n this.queuedElements_[this.keyFunction_(element)] = true;\n this.siftDown_(0, this.elements_.length - 1);\n return true;\n }\n\n return false;\n };\n /**\n * @return {number} Count.\n */\n\n\n PriorityQueue.prototype.getCount = function () {\n return this.elements_.length;\n };\n /**\n * Gets the index of the left child of the node at the given index.\n * @param {number} index The index of the node to get the left child for.\n * @return {number} The index of the left child.\n * @private\n */\n\n\n PriorityQueue.prototype.getLeftChildIndex_ = function (index) {\n return index * 2 + 1;\n };\n /**\n * Gets the index of the right child of the node at the given index.\n * @param {number} index The index of the node to get the right child for.\n * @return {number} The index of the right child.\n * @private\n */\n\n\n PriorityQueue.prototype.getRightChildIndex_ = function (index) {\n return index * 2 + 2;\n };\n /**\n * Gets the index of the parent of the node at the given index.\n * @param {number} index The index of the node to get the parent for.\n * @return {number} The index of the parent.\n * @private\n */\n\n\n PriorityQueue.prototype.getParentIndex_ = function (index) {\n return index - 1 >> 1;\n };\n /**\n * Make this a heap. O(N).\n * @private\n */\n\n\n PriorityQueue.prototype.heapify_ = function () {\n var i;\n\n for (i = (this.elements_.length >> 1) - 1; i >= 0; i--) {\n this.siftUp_(i);\n }\n };\n /**\n * @return {boolean} Is empty.\n */\n\n\n PriorityQueue.prototype.isEmpty = function () {\n return this.elements_.length === 0;\n };\n /**\n * @param {string} key Key.\n * @return {boolean} Is key queued.\n */\n\n\n PriorityQueue.prototype.isKeyQueued = function (key) {\n return key in this.queuedElements_;\n };\n /**\n * @param {T} element Element.\n * @return {boolean} Is queued.\n */\n\n\n PriorityQueue.prototype.isQueued = function (element) {\n return this.isKeyQueued(this.keyFunction_(element));\n };\n /**\n * @param {number} index The index of the node to move down.\n * @private\n */\n\n\n PriorityQueue.prototype.siftUp_ = function (index) {\n var elements = this.elements_;\n var priorities = this.priorities_;\n var count = elements.length;\n var element = elements[index];\n var priority = priorities[index];\n var startIndex = index;\n\n while (index < count >> 1) {\n var lIndex = this.getLeftChildIndex_(index);\n var rIndex = this.getRightChildIndex_(index);\n var smallerChildIndex = rIndex < count && priorities[rIndex] < priorities[lIndex] ? rIndex : lIndex;\n elements[index] = elements[smallerChildIndex];\n priorities[index] = priorities[smallerChildIndex];\n index = smallerChildIndex;\n }\n\n elements[index] = element;\n priorities[index] = priority;\n this.siftDown_(startIndex, index);\n };\n /**\n * @param {number} startIndex The index of the root.\n * @param {number} index The index of the node to move up.\n * @private\n */\n\n\n PriorityQueue.prototype.siftDown_ = function (startIndex, index) {\n var elements = this.elements_;\n var priorities = this.priorities_;\n var element = elements[index];\n var priority = priorities[index];\n\n while (index > startIndex) {\n var parentIndex = this.getParentIndex_(index);\n\n if (priorities[parentIndex] > priority) {\n elements[index] = elements[parentIndex];\n priorities[index] = priorities[parentIndex];\n index = parentIndex;\n } else {\n break;\n }\n }\n\n elements[index] = element;\n priorities[index] = priority;\n };\n /**\n * FIXME empty description for jsdoc\n */\n\n\n PriorityQueue.prototype.reprioritize = function () {\n var priorityFunction = this.priorityFunction_;\n var elements = this.elements_;\n var priorities = this.priorities_;\n var index = 0;\n var n = elements.length;\n var element, i, priority;\n\n for (i = 0; i < n; ++i) {\n element = elements[i];\n priority = priorityFunction(element);\n\n if (priority == DROP) {\n delete this.queuedElements_[this.keyFunction_(element)];\n } else {\n priorities[index] = priority;\n elements[index++] = element;\n }\n }\n\n elements.length = index;\n priorities.length = index;\n this.heapify_();\n };\n\n return PriorityQueue;\n}();\n\n/* harmony default export */ var structs_PriorityQueue = (PriorityQueue);\n;// CONCATENATED MODULE: ./node_modules/ol/TileState.js\n/**\n * @module ol/TileState\n */\n\n/**\n * @enum {number}\n */\n/* harmony default export */ var TileState = ({\n IDLE: 0,\n LOADING: 1,\n LOADED: 2,\n\n /**\n * Indicates that tile loading failed\n * @type {number}\n */\n ERROR: 3,\n EMPTY: 4\n});\n;// CONCATENATED MODULE: ./node_modules/ol/TileQueue.js\nvar TileQueue_extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n/**\n * @module ol/TileQueue\n */\n\n\n\n\n\n/**\n * @typedef {function(import("./Tile.js").default, string, import("./coordinate.js").Coordinate, number): number} PriorityFunction\n */\n\nvar TileQueue =\n/** @class */\nfunction (_super) {\n TileQueue_extends(TileQueue, _super);\n /**\n * @param {PriorityFunction} tilePriorityFunction Tile priority function.\n * @param {function(): ?} tileChangeCallback Function called on each tile change event.\n */\n\n\n function TileQueue(tilePriorityFunction, tileChangeCallback) {\n var _this = _super.call(this,\n /**\n * @param {Array} element Element.\n * @return {number} Priority.\n */\n function (element) {\n return tilePriorityFunction.apply(null, element);\n },\n /**\n * @param {Array} element Element.\n * @return {string} Key.\n */\n function (element) {\n return (\n /** @type {import("./Tile.js").default} */\n element[0].getKey()\n );\n }) || this;\n /** @private */\n\n\n _this.boundHandleTileChange_ = _this.handleTileChange.bind(_this);\n /**\n * @private\n * @type {function(): ?}\n */\n\n _this.tileChangeCallback_ = tileChangeCallback;\n /**\n * @private\n * @type {number}\n */\n\n _this.tilesLoading_ = 0;\n /**\n * @private\n * @type {!Object}\n */\n\n _this.tilesLoadingKeys_ = {};\n return _this;\n }\n /**\n * @param {Array} element Element.\n * @return {boolean} The element was added to the queue.\n */\n\n\n TileQueue.prototype.enqueue = function (element) {\n var added = _super.prototype.enqueue.call(this, element);\n\n if (added) {\n var tile = element[0];\n tile.addEventListener(EventType.CHANGE, this.boundHandleTileChange_);\n }\n\n return added;\n };\n /**\n * @return {number} Number of tiles loading.\n */\n\n\n TileQueue.prototype.getTilesLoading = function () {\n return this.tilesLoading_;\n };\n /**\n * @param {import("./events/Event.js").default} event Event.\n * @protected\n */\n\n\n TileQueue.prototype.handleTileChange = function (event) {\n var tile =\n /** @type {import("./Tile.js").default} */\n event.target;\n var state = tile.getState();\n\n if (tile.hifi && state === TileState.LOADED || state === TileState.ERROR || state === TileState.EMPTY) {\n tile.removeEventListener(EventType.CHANGE, this.boundHandleTileChange_);\n var tileKey = tile.getKey();\n\n if (tileKey in this.tilesLoadingKeys_) {\n delete this.tilesLoadingKeys_[tileKey];\n --this.tilesLoading_;\n }\n\n this.tileChangeCallback_();\n }\n };\n /**\n * @param {number} maxTotalLoading Maximum number tiles to load simultaneously.\n * @param {number} maxNewLoads Maximum number of new tiles to load.\n */\n\n\n TileQueue.prototype.loadMoreTiles = function (maxTotalLoading, maxNewLoads) {\n var newLoads = 0;\n var state, tile, tileKey;\n\n while (this.tilesLoading_ < maxTotalLoading && newLoads < maxNewLoads && this.getCount() > 0) {\n tile =\n /** @type {import("./Tile.js").default} */\n this.dequeue()[0];\n tileKey = tile.getKey();\n state = tile.getState();\n\n if (state === TileState.IDLE && !(tileKey in this.tilesLoadingKeys_)) {\n this.tilesLoadingKeys_[tileKey] = true;\n ++this.tilesLoading_;\n ++newLoads;\n tile.load();\n }\n }\n };\n\n return TileQueue;\n}(structs_PriorityQueue);\n\n/* harmony default export */ var ol_TileQueue = (TileQueue);\n/**\n * @param {import(\'./PluggableMap.js\').FrameState} frameState Frame state.\n * @param {import("./Tile.js").default} tile Tile.\n * @param {string} tileSourceKey Tile source key.\n * @param {import("./coordinate.js").Coordinate} tileCenter Tile center.\n * @param {number} tileResolution Tile resolution.\n * @return {number} Tile priority.\n */\n\nfunction getTilePriority(frameState, tile, tileSourceKey, tileCenter, tileResolution) {\n // Filter out tiles at higher zoom levels than the current zoom level, or that\n // are outside the visible extent.\n if (!frameState || !(tileSourceKey in frameState.wantedTiles)) {\n return DROP;\n }\n\n if (!frameState.wantedTiles[tileSourceKey][tile.getKey()]) {\n return DROP;\n } // Prioritize the highest zoom level tiles closest to the focus.\n // Tiles at higher zoom levels are prioritized using Math.log(tileResolution).\n // Within a zoom level, tiles are prioritized by the distance in pixels between\n // the center of the tile and the center of the viewport. The factor of 65536\n // means that the prioritization should behave as desired for tiles up to\n // 65536 * Math.log(2) = 45426 pixels from the focus.\n\n\n var center = frameState.viewState.center;\n var deltaX = tileCenter[0] - center[0];\n var deltaY = tileCenter[1] - center[1];\n return 65536 * Math.log(tileResolution) + Math.sqrt(deltaX * deltaX + deltaY * deltaY) / tileResolution;\n}\n;// CONCATENATED MODULE: ./node_modules/ol/geom/GeometryType.js\n/**\n * @module ol/geom/GeometryType\n */\n\n/**\n * The geometry type. One of `\'Point\'`, `\'LineString\'`, `\'LinearRing\'`,\n * `\'Polygon\'`, `\'MultiPoint\'`, `\'MultiLineString\'`, `\'MultiPolygon\'`,\n * `\'GeometryCollection\'`, `\'Circle\'`.\n * @enum {string}\n */\n/* harmony default export */ var geom_GeometryType = ({\n POINT: \'Point\',\n LINE_STRING: \'LineString\',\n LINEAR_RING: \'LinearRing\',\n POLYGON: \'Polygon\',\n MULTI_POINT: \'MultiPoint\',\n MULTI_LINE_STRING: \'MultiLineString\',\n MULTI_POLYGON: \'MultiPolygon\',\n GEOMETRY_COLLECTION: \'GeometryCollection\',\n CIRCLE: \'Circle\'\n});\n;// CONCATENATED MODULE: ./node_modules/ol/proj/Units.js\n/**\n * @module ol/proj/Units\n */\n\n/**\n * Projection units: `\'degrees\'`, `\'ft\'`, `\'m\'`, `\'pixels\'`, `\'tile-pixels\'` or\n * `\'us-ft\'`.\n * @enum {string}\n */\nvar Units_Units = {\n /**\n * Degrees\n * @api\n */\n DEGREES: \'degrees\',\n\n /**\n * Feet\n * @api\n */\n FEET: \'ft\',\n\n /**\n * Meters\n * @api\n */\n METERS: \'m\',\n\n /**\n * Pixels\n * @api\n */\n PIXELS: \'pixels\',\n\n /**\n * Tile Pixels\n * @api\n */\n TILE_PIXELS: \'tile-pixels\',\n\n /**\n * US Feet\n * @api\n */\n USFEET: \'us-ft\'\n};\n/**\n * Meters per unit lookup table.\n * @const\n * @type {Object}\n * @api\n */\n\nvar Units_METERS_PER_UNIT = {}; // use the radius of the Normal sphere\n\nUnits_METERS_PER_UNIT[Units_Units.DEGREES] = 2 * Math.PI * 6370997 / 360;\nUnits_METERS_PER_UNIT[Units_Units.FEET] = 0.3048;\nUnits_METERS_PER_UNIT[Units_Units.METERS] = 1;\nUnits_METERS_PER_UNIT[Units_Units.USFEET] = 1200 / 3937;\n/* harmony default export */ var proj_Units = (Units_Units);\n;// CONCATENATED MODULE: ./node_modules/ol/ViewHint.js\n/**\n * @module ol/ViewHint\n */\n\n/**\n * @enum {number}\n */\n/* harmony default export */ var ViewHint = ({\n ANIMATING: 0,\n INTERACTING: 1\n});\n;// CONCATENATED MODULE: ./node_modules/ol/ViewProperty.js\n/**\n * @module ol/ViewProperty\n */\n\n/**\n * @enum {string}\n */\n/* harmony default export */ var ViewProperty = ({\n CENTER: \'center\',\n RESOLUTION: \'resolution\',\n ROTATION: \'rotation\'\n});\n;// CONCATENATED MODULE: ./node_modules/ol/tilegrid/common.js\n/**\n * @module ol/tilegrid/common\n */\n\n/**\n * Default maximum zoom for default tile grids.\n * @type {number}\n */\nvar DEFAULT_MAX_ZOOM = 42;\n/**\n * Default tile size.\n * @type {number}\n */\n\nvar DEFAULT_TILE_SIZE = 256;\n;// CONCATENATED MODULE: ./node_modules/ol/proj/Projection.js\n/**\n * @module ol/proj/Projection\n */\n\n/**\n * @typedef {Object} Options\n * @property {string} code The SRS identifier code, e.g. `EPSG:4326`.\n * @property {import("./Units.js").default|string} [units] Units. Required unless a\n * proj4 projection is defined for `code`.\n * @property {import("../extent.js").Extent} [extent] The validity extent for the SRS.\n * @property {string} [axisOrientation=\'enu\'] The axis orientation as specified in Proj4.\n * @property {boolean} [global=false] Whether the projection is valid for the whole globe.\n * @property {number} [metersPerUnit] The meters per unit for the SRS.\n * If not provided, the `units` are used to get the meters per unit from the {@link module:ol/proj/Units~METERS_PER_UNIT}\n * lookup table.\n * @property {import("../extent.js").Extent} [worldExtent] The world extent for the SRS.\n * @property {function(number, import("../coordinate.js").Coordinate):number} [getPointResolution]\n * Function to determine resolution at a point. The function is called with a\n * `{number}` view resolution and an `{import("../coordinate.js").Coordinate}` as arguments, and returns\n * the `{number}` resolution in projection units at the passed coordinate. If this is `undefined`,\n * the default {@link module:ol/proj#getPointResolution} function will be used.\n */\n\n/**\n * @classdesc\n * Projection definition class. One of these is created for each projection\n * supported in the application and stored in the {@link module:ol/proj} namespace.\n * You can use these in applications, but this is not required, as API params\n * and options use {@link module:ol/proj~ProjectionLike} which means the simple string\n * code will suffice.\n *\n * You can use {@link module:ol/proj~get} to retrieve the object for a particular\n * projection.\n *\n * The library includes definitions for `EPSG:4326` and `EPSG:3857`, together\n * with the following aliases:\n * * `EPSG:4326`: CRS:84, urn:ogc:def:crs:EPSG:6.6:4326,\n * urn:ogc:def:crs:OGC:1.3:CRS84, urn:ogc:def:crs:OGC:2:84,\n * http://www.opengis.net/gml/srs/epsg.xml#4326,\n * urn:x-ogc:def:crs:EPSG:4326\n * * `EPSG:3857`: EPSG:102100, EPSG:102113, EPSG:900913,\n * urn:ogc:def:crs:EPSG:6.18:3:3857,\n * http://www.opengis.net/gml/srs/epsg.xml#3857\n *\n * If you use [proj4js](https://github.com/proj4js/proj4js), aliases can\n * be added using `proj4.defs()`. After all required projection definitions are\n * added, call the {@link module:ol/proj/proj4~register} function.\n *\n * @api\n */\n\nvar Projection =\n/** @class */\nfunction () {\n /**\n * @param {Options} options Projection options.\n */\n function Projection(options) {\n /**\n * @private\n * @type {string}\n */\n this.code_ = options.code;\n /**\n * Units of projected coordinates. When set to `TILE_PIXELS`, a\n * `this.extent_` and `this.worldExtent_` must be configured properly for each\n * tile.\n * @private\n * @type {import("./Units.js").default}\n */\n\n this.units_ =\n /** @type {import("./Units.js").default} */\n options.units;\n /**\n * Validity extent of the projection in projected coordinates. For projections\n * with `TILE_PIXELS` units, this is the extent of the tile in\n * tile pixel space.\n * @private\n * @type {import("../extent.js").Extent}\n */\n\n this.extent_ = options.extent !== undefined ? options.extent : null;\n /**\n * Extent of the world in EPSG:4326. For projections with\n * `TILE_PIXELS` units, this is the extent of the tile in\n * projected coordinate space.\n * @private\n * @type {import("../extent.js").Extent}\n */\n\n this.worldExtent_ = options.worldExtent !== undefined ? options.worldExtent : null;\n /**\n * @private\n * @type {string}\n */\n\n this.axisOrientation_ = options.axisOrientation !== undefined ? options.axisOrientation : \'enu\';\n /**\n * @private\n * @type {boolean}\n */\n\n this.global_ = options.global !== undefined ? options.global : false;\n /**\n * @private\n * @type {boolean}\n */\n\n this.canWrapX_ = !!(this.global_ && this.extent_);\n /**\n * @private\n * @type {function(number, import("../coordinate.js").Coordinate):number|undefined}\n */\n\n this.getPointResolutionFunc_ = options.getPointResolution;\n /**\n * @private\n * @type {import("../tilegrid/TileGrid.js").default}\n */\n\n this.defaultTileGrid_ = null;\n /**\n * @private\n * @type {number|undefined}\n */\n\n this.metersPerUnit_ = options.metersPerUnit;\n }\n /**\n * @return {boolean} The projection is suitable for wrapping the x-axis\n */\n\n\n Projection.prototype.canWrapX = function () {\n return this.canWrapX_;\n };\n /**\n * Get the code for this projection, e.g. \'EPSG:4326\'.\n * @return {string} Code.\n * @api\n */\n\n\n Projection.prototype.getCode = function () {\n return this.code_;\n };\n /**\n * Get the validity extent for this projection.\n * @return {import("../extent.js").Extent} Extent.\n * @api\n */\n\n\n Projection.prototype.getExtent = function () {\n return this.extent_;\n };\n /**\n * Get the units of this projection.\n * @return {import("./Units.js").default} Units.\n * @api\n */\n\n\n Projection.prototype.getUnits = function () {\n return this.units_;\n };\n /**\n * Get the amount of meters per unit of this projection. If the projection is\n * not configured with `metersPerUnit` or a units identifier, the return is\n * `undefined`.\n * @return {number|undefined} Meters.\n * @api\n */\n\n\n Projection.prototype.getMetersPerUnit = function () {\n return this.metersPerUnit_ || Units_METERS_PER_UNIT[this.units_];\n };\n /**\n * Get the world extent for this projection.\n * @return {import("../extent.js").Extent} Extent.\n * @api\n */\n\n\n Projection.prototype.getWorldExtent = function () {\n return this.worldExtent_;\n };\n /**\n * Get the axis orientation of this projection.\n * Example values are:\n * enu - the default easting, northing, elevation.\n * neu - northing, easting, up - useful for "lat/long" geographic coordinates,\n * or south orientated transverse mercator.\n * wnu - westing, northing, up - some planetary coordinate systems have\n * "west positive" coordinate systems\n * @return {string} Axis orientation.\n * @api\n */\n\n\n Projection.prototype.getAxisOrientation = function () {\n return this.axisOrientation_;\n };\n /**\n * Is this projection a global projection which spans the whole world?\n * @return {boolean} Whether the projection is global.\n * @api\n */\n\n\n Projection.prototype.isGlobal = function () {\n return this.global_;\n };\n /**\n * Set if the projection is a global projection which spans the whole world\n * @param {boolean} global Whether the projection is global.\n * @api\n */\n\n\n Projection.prototype.setGlobal = function (global) {\n this.global_ = global;\n this.canWrapX_ = !!(global && this.extent_);\n };\n /**\n * @return {import("../tilegrid/TileGrid.js").default} The default tile grid.\n */\n\n\n Projection.prototype.getDefaultTileGrid = function () {\n return this.defaultTileGrid_;\n };\n /**\n * @param {import("../tilegrid/TileGrid.js").default} tileGrid The default tile grid.\n */\n\n\n Projection.prototype.setDefaultTileGrid = function (tileGrid) {\n this.defaultTileGrid_ = tileGrid;\n };\n /**\n * Set the validity extent for this projection.\n * @param {import("../extent.js").Extent} extent Extent.\n * @api\n */\n\n\n Projection.prototype.setExtent = function (extent) {\n this.extent_ = extent;\n this.canWrapX_ = !!(this.global_ && extent);\n };\n /**\n * Set the world extent for this projection.\n * @param {import("../extent.js").Extent} worldExtent World extent\n * [minlon, minlat, maxlon, maxlat].\n * @api\n */\n\n\n Projection.prototype.setWorldExtent = function (worldExtent) {\n this.worldExtent_ = worldExtent;\n };\n /**\n * Set the getPointResolution function (see {@link module:ol/proj~getPointResolution}\n * for this projection.\n * @param {function(number, import("../coordinate.js").Coordinate):number} func Function\n * @api\n */\n\n\n Projection.prototype.setGetPointResolution = function (func) {\n this.getPointResolutionFunc_ = func;\n };\n /**\n * Get the custom point resolution function for this projection (if set).\n * @return {function(number, import("../coordinate.js").Coordinate):number|undefined} The custom point\n * resolution function (if set).\n */\n\n\n Projection.prototype.getPointResolutionFunc = function () {\n return this.getPointResolutionFunc_;\n };\n\n return Projection;\n}();\n\n/* harmony default export */ var proj_Projection = (Projection);\n;// CONCATENATED MODULE: ./node_modules/ol/proj/epsg3857.js\nvar epsg3857_extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n/**\n * @module ol/proj/epsg3857\n */\n\n\n\n\n\n/**\n * Radius of WGS84 sphere\n *\n * @const\n * @type {number}\n */\n\nvar RADIUS = 6378137;\n/**\n * @const\n * @type {number}\n */\n\nvar HALF_SIZE = Math.PI * RADIUS;\n/**\n * @const\n * @type {import("../extent.js").Extent}\n */\n\nvar EXTENT = [-HALF_SIZE, -HALF_SIZE, HALF_SIZE, HALF_SIZE];\n/**\n * @const\n * @type {import("../extent.js").Extent}\n */\n\nvar WORLD_EXTENT = [-180, -85, 180, 85];\n/**\n * Maximum safe value in y direction\n * @const\n * @type {number}\n */\n\nvar MAX_SAFE_Y = RADIUS * Math.log(Math.tan(Math.PI / 2));\n/**\n * @classdesc\n * Projection object for web/spherical Mercator (EPSG:3857).\n */\n\nvar EPSG3857Projection =\n/** @class */\nfunction (_super) {\n epsg3857_extends(EPSG3857Projection, _super);\n /**\n * @param {string} code Code.\n */\n\n\n function EPSG3857Projection(code) {\n return _super.call(this, {\n code: code,\n units: proj_Units.METERS,\n extent: EXTENT,\n global: true,\n worldExtent: WORLD_EXTENT,\n getPointResolution: function getPointResolution(resolution, point) {\n return resolution / cosh(point[1] / RADIUS);\n }\n }) || this;\n }\n\n return EPSG3857Projection;\n}(proj_Projection);\n/**\n * Projections equal to EPSG:3857.\n *\n * @const\n * @type {Array}\n */\n\n\nvar PROJECTIONS = [new EPSG3857Projection(\'EPSG:3857\'), new EPSG3857Projection(\'EPSG:102100\'), new EPSG3857Projection(\'EPSG:102113\'), new EPSG3857Projection(\'EPSG:900913\'), new EPSG3857Projection(\'http://www.opengis.net/gml/srs/epsg.xml#3857\')];\n/**\n * Transformation from EPSG:4326 to EPSG:3857.\n *\n * @param {Array} input Input array of coordinate values.\n * @param {Array=} opt_output Output array of coordinate values.\n * @param {number=} opt_dimension Dimension (default is `2`).\n * @return {Array} Output array of coordinate values.\n */\n\nfunction fromEPSG4326(input, opt_output, opt_dimension) {\n var length = input.length;\n var dimension = opt_dimension > 1 ? opt_dimension : 2;\n var output = opt_output;\n\n if (output === undefined) {\n if (dimension > 2) {\n // preserve values beyond second dimension\n output = input.slice();\n } else {\n output = new Array(length);\n }\n }\n\n for (var i = 0; i < length; i += dimension) {\n output[i] = HALF_SIZE * input[i] / 180;\n var y = RADIUS * Math.log(Math.tan(Math.PI * (+input[i + 1] + 90) / 360));\n\n if (y > MAX_SAFE_Y) {\n y = MAX_SAFE_Y;\n } else if (y < -MAX_SAFE_Y) {\n y = -MAX_SAFE_Y;\n }\n\n output[i + 1] = y;\n }\n\n return output;\n}\n/**\n * Transformation from EPSG:3857 to EPSG:4326.\n *\n * @param {Array} input Input array of coordinate values.\n * @param {Array=} opt_output Output array of coordinate values.\n * @param {number=} opt_dimension Dimension (default is `2`).\n * @return {Array} Output array of coordinate values.\n */\n\nfunction toEPSG4326(input, opt_output, opt_dimension) {\n var length = input.length;\n var dimension = opt_dimension > 1 ? opt_dimension : 2;\n var output = opt_output;\n\n if (output === undefined) {\n if (dimension > 2) {\n // preserve values beyond second dimension\n output = input.slice();\n } else {\n output = new Array(length);\n }\n }\n\n for (var i = 0; i < length; i += dimension) {\n output[i] = 180 * input[i] / HALF_SIZE;\n output[i + 1] = 360 * Math.atan(Math.exp(input[i + 1] / RADIUS)) / Math.PI - 90;\n }\n\n return output;\n}\n;// CONCATENATED MODULE: ./node_modules/ol/proj/epsg4326.js\nvar epsg4326_extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n/**\n * @module ol/proj/epsg4326\n */\n\n\n\n\n/**\n * Semi-major radius of the WGS84 ellipsoid.\n *\n * @const\n * @type {number}\n */\n\nvar epsg4326_RADIUS = 6378137;\n/**\n * Extent of the EPSG:4326 projection which is the whole world.\n *\n * @const\n * @type {import("../extent.js").Extent}\n */\n\nvar epsg4326_EXTENT = [-180, -90, 180, 90];\n/**\n * @const\n * @type {number}\n */\n\nvar epsg4326_METERS_PER_UNIT = Math.PI * epsg4326_RADIUS / 180;\n/**\n * @classdesc\n * Projection object for WGS84 geographic coordinates (EPSG:4326).\n *\n * Note that OpenLayers does not strictly comply with the EPSG definition.\n * The EPSG registry defines 4326 as a CRS for Latitude,Longitude (y,x).\n * OpenLayers treats EPSG:4326 as a pseudo-projection, with x,y coordinates.\n */\n\nvar EPSG4326Projection =\n/** @class */\nfunction (_super) {\n epsg4326_extends(EPSG4326Projection, _super);\n /**\n * @param {string} code Code.\n * @param {string=} opt_axisOrientation Axis orientation.\n */\n\n\n function EPSG4326Projection(code, opt_axisOrientation) {\n return _super.call(this, {\n code: code,\n units: proj_Units.DEGREES,\n extent: epsg4326_EXTENT,\n axisOrientation: opt_axisOrientation,\n global: true,\n metersPerUnit: epsg4326_METERS_PER_UNIT,\n worldExtent: epsg4326_EXTENT\n }) || this;\n }\n\n return EPSG4326Projection;\n}(proj_Projection);\n/**\n * Projections equal to EPSG:4326.\n *\n * @const\n * @type {Array}\n */\n\n\nvar epsg4326_PROJECTIONS = [new EPSG4326Projection(\'CRS:84\'), new EPSG4326Projection(\'EPSG:4326\', \'neu\'), new EPSG4326Projection(\'urn:ogc:def:crs:OGC:1.3:CRS84\'), new EPSG4326Projection(\'urn:ogc:def:crs:OGC:2:84\'), new EPSG4326Projection(\'http://www.opengis.net/gml/srs/epsg.xml#4326\', \'neu\')];\n;// CONCATENATED MODULE: ./node_modules/ol/proj/projections.js\n/**\n * @module ol/proj/projections\n */\n\n/**\n * @type {Object}\n */\nvar cache = {};\n/**\n * Clear the projections cache.\n */\n\nfunction projections_clear() {\n cache = {};\n}\n/**\n * Get a cached projection by code.\n * @param {string} code The code for the projection.\n * @return {import("./Projection.js").default} The projection (if cached).\n */\n\nfunction get(code) {\n return cache[code] || cache[code.replace(/urn:(x-)?ogc:def:crs:EPSG:(.*:)?(\\w+)$/, \'EPSG:$3\')] || null;\n}\n/**\n * Add a projection to the cache.\n * @param {string} code The projection code.\n * @param {import("./Projection.js").default} projection The projection to cache.\n */\n\nfunction projections_add(code, projection) {\n cache[code] = projection;\n}\n;// CONCATENATED MODULE: ./node_modules/ol/proj/transforms.js\n/**\n * @module ol/proj/transforms\n */\n\n/**\n * @private\n * @type {!Object>}\n */\n\nvar transforms = {};\n/**\n * Clear the transform cache.\n */\n\nfunction transforms_clear() {\n transforms = {};\n}\n/**\n * Registers a conversion function to convert coordinates from the source\n * projection to the destination projection.\n *\n * @param {import("./Projection.js").default} source Source.\n * @param {import("./Projection.js").default} destination Destination.\n * @param {import("../proj.js").TransformFunction} transformFn Transform.\n */\n\nfunction transforms_add(source, destination, transformFn) {\n var sourceCode = source.getCode();\n var destinationCode = destination.getCode();\n\n if (!(sourceCode in transforms)) {\n transforms[sourceCode] = {};\n }\n\n transforms[sourceCode][destinationCode] = transformFn;\n}\n/**\n * Unregisters the conversion function to convert coordinates from the source\n * projection to the destination projection. This method is used to clean up\n * cached transforms during testing.\n *\n * @param {import("./Projection.js").default} source Source projection.\n * @param {import("./Projection.js").default} destination Destination projection.\n * @return {import("../proj.js").TransformFunction} transformFn The unregistered transform.\n */\n\nfunction transforms_remove(source, destination) {\n var sourceCode = source.getCode();\n var destinationCode = destination.getCode();\n var transform = transforms[sourceCode][destinationCode];\n delete transforms[sourceCode][destinationCode];\n\n if (isEmpty(transforms[sourceCode])) {\n delete transforms[sourceCode];\n }\n\n return transform;\n}\n/**\n * Get a transform given a source code and a destination code.\n * @param {string} sourceCode The code for the source projection.\n * @param {string} destinationCode The code for the destination projection.\n * @return {import("../proj.js").TransformFunction|undefined} The transform function (if found).\n */\n\nfunction transforms_get(sourceCode, destinationCode) {\n var transform;\n\n if (sourceCode in transforms && destinationCode in transforms[sourceCode]) {\n transform = transforms[sourceCode][destinationCode];\n }\n\n return transform;\n}\n;// CONCATENATED MODULE: ./node_modules/ol/sphere.js\n/**\n * @module ol/sphere\n */\n\n\n/**\n * Object literal with options for the {@link getLength} or {@link getArea}\n * functions.\n * @typedef {Object} SphereMetricOptions\n * @property {import("./proj.js").ProjectionLike} [projection=\'EPSG:3857\']\n * Projection of the geometry. By default, the geometry is assumed to be in\n * Web Mercator.\n * @property {number} [radius=6371008.8] Sphere radius. By default, the\n * [mean Earth radius](https://en.wikipedia.org/wiki/Earth_radius#Mean_radius)\n * for the WGS84 ellipsoid is used.\n */\n\n/**\n * The mean Earth radius (1/3 * (2a + b)) for the WGS84 ellipsoid.\n * https://en.wikipedia.org/wiki/Earth_radius#Mean_radius\n * @type {number}\n */\n\nvar DEFAULT_RADIUS = 6371008.8;\n/**\n * Get the great circle distance (in meters) between two geographic coordinates.\n * @param {Array} c1 Starting coordinate.\n * @param {Array} c2 Ending coordinate.\n * @param {number=} opt_radius The sphere radius to use. Defaults to the Earth\'s\n * mean radius using the WGS84 ellipsoid.\n * @return {number} The great circle distance between the points (in meters).\n * @api\n */\n\nfunction sphere_getDistance(c1, c2, opt_radius) {\n var radius = opt_radius || DEFAULT_RADIUS;\n var lat1 = math_toRadians(c1[1]);\n var lat2 = math_toRadians(c2[1]);\n var deltaLatBy2 = (lat2 - lat1) / 2;\n var deltaLonBy2 = math_toRadians(c2[0] - c1[0]) / 2;\n var a = Math.sin(deltaLatBy2) * Math.sin(deltaLatBy2) + Math.sin(deltaLonBy2) * Math.sin(deltaLonBy2) * Math.cos(lat1) * Math.cos(lat2);\n return 2 * radius * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n}\n/**\n * Get the cumulative great circle length of linestring coordinates (geographic).\n * @param {Array} coordinates Linestring coordinates.\n * @param {number} radius The sphere radius to use.\n * @return {number} The length (in meters).\n */\n\nfunction getLengthInternal(coordinates, radius) {\n var length = 0;\n\n for (var i = 0, ii = coordinates.length; i < ii - 1; ++i) {\n length += sphere_getDistance(coordinates[i], coordinates[i + 1], radius);\n }\n\n return length;\n}\n/**\n * Get the spherical length of a geometry. This length is the sum of the\n * great circle distances between coordinates. For polygons, the length is\n * the sum of all rings. For points, the length is zero. For multi-part\n * geometries, the length is the sum of the length of each part.\n * @param {import("./geom/Geometry.js").default} geometry A geometry.\n * @param {SphereMetricOptions=} opt_options Options for the\n * length calculation. By default, geometries are assumed to be in \'EPSG:3857\'.\n * You can change this by providing a `projection` option.\n * @return {number} The spherical length (in meters).\n * @api\n */\n\n\nfunction getLength(geometry, opt_options) {\n var options = opt_options || {};\n var radius = options.radius || DEFAULT_RADIUS;\n var projection = options.projection || \'EPSG:3857\';\n var type = geometry.getType();\n\n if (type !== GeometryType.GEOMETRY_COLLECTION) {\n geometry = geometry.clone().transform(projection, \'EPSG:4326\');\n }\n\n var length = 0;\n var coordinates, coords, i, ii, j, jj;\n\n switch (type) {\n case GeometryType.POINT:\n case GeometryType.MULTI_POINT:\n {\n break;\n }\n\n case GeometryType.LINE_STRING:\n case GeometryType.LINEAR_RING:\n {\n coordinates =\n /** @type {import("./geom/SimpleGeometry.js").default} */\n geometry.getCoordinates();\n length = getLengthInternal(coordinates, radius);\n break;\n }\n\n case GeometryType.MULTI_LINE_STRING:\n case GeometryType.POLYGON:\n {\n coordinates =\n /** @type {import("./geom/SimpleGeometry.js").default} */\n geometry.getCoordinates();\n\n for (i = 0, ii = coordinates.length; i < ii; ++i) {\n length += getLengthInternal(coordinates[i], radius);\n }\n\n break;\n }\n\n case GeometryType.MULTI_POLYGON:\n {\n coordinates =\n /** @type {import("./geom/SimpleGeometry.js").default} */\n geometry.getCoordinates();\n\n for (i = 0, ii = coordinates.length; i < ii; ++i) {\n coords = coordinates[i];\n\n for (j = 0, jj = coords.length; j < jj; ++j) {\n length += getLengthInternal(coords[j], radius);\n }\n }\n\n break;\n }\n\n case GeometryType.GEOMETRY_COLLECTION:\n {\n var geometries =\n /** @type {import("./geom/GeometryCollection.js").default} */\n geometry.getGeometries();\n\n for (i = 0, ii = geometries.length; i < ii; ++i) {\n length += getLength(geometries[i], opt_options);\n }\n\n break;\n }\n\n default:\n {\n throw new Error(\'Unsupported geometry type: \' + type);\n }\n }\n\n return length;\n}\n/**\n * Returns the spherical area for a list of coordinates.\n *\n * [Reference](https://trs-new.jpl.nasa.gov/handle/2014/40409)\n * Robert. G. Chamberlain and William H. Duquette, "Some Algorithms for\n * Polygons on a Sphere", JPL Publication 07-03, Jet Propulsion\n * Laboratory, Pasadena, CA, June 2007\n *\n * @param {Array} coordinates List of coordinates of a linear\n * ring. If the ring is oriented clockwise, the area will be positive,\n * otherwise it will be negative.\n * @param {number} radius The sphere radius.\n * @return {number} Area (in square meters).\n */\n\nfunction getAreaInternal(coordinates, radius) {\n var area = 0;\n var len = coordinates.length;\n var x1 = coordinates[len - 1][0];\n var y1 = coordinates[len - 1][1];\n\n for (var i = 0; i < len; i++) {\n var x2 = coordinates[i][0];\n var y2 = coordinates[i][1];\n area += toRadians(x2 - x1) * (2 + Math.sin(toRadians(y1)) + Math.sin(toRadians(y2)));\n x1 = x2;\n y1 = y2;\n }\n\n return area * radius * radius / 2.0;\n}\n/**\n * Get the spherical area of a geometry. This is the area (in meters) assuming\n * that polygon edges are segments of great circles on a sphere.\n * @param {import("./geom/Geometry.js").default} geometry A geometry.\n * @param {SphereMetricOptions=} opt_options Options for the area\n * calculation. By default, geometries are assumed to be in \'EPSG:3857\'.\n * You can change this by providing a `projection` option.\n * @return {number} The spherical area (in square meters).\n * @api\n */\n\n\nfunction sphere_getArea(geometry, opt_options) {\n var options = opt_options || {};\n var radius = options.radius || DEFAULT_RADIUS;\n var projection = options.projection || \'EPSG:3857\';\n var type = geometry.getType();\n\n if (type !== GeometryType.GEOMETRY_COLLECTION) {\n geometry = geometry.clone().transform(projection, \'EPSG:4326\');\n }\n\n var area = 0;\n var coordinates, coords, i, ii, j, jj;\n\n switch (type) {\n case GeometryType.POINT:\n case GeometryType.MULTI_POINT:\n case GeometryType.LINE_STRING:\n case GeometryType.MULTI_LINE_STRING:\n case GeometryType.LINEAR_RING:\n {\n break;\n }\n\n case GeometryType.POLYGON:\n {\n coordinates =\n /** @type {import("./geom/Polygon.js").default} */\n geometry.getCoordinates();\n area = Math.abs(getAreaInternal(coordinates[0], radius));\n\n for (i = 1, ii = coordinates.length; i < ii; ++i) {\n area -= Math.abs(getAreaInternal(coordinates[i], radius));\n }\n\n break;\n }\n\n case GeometryType.MULTI_POLYGON:\n {\n coordinates =\n /** @type {import("./geom/SimpleGeometry.js").default} */\n geometry.getCoordinates();\n\n for (i = 0, ii = coordinates.length; i < ii; ++i) {\n coords = coordinates[i];\n area += Math.abs(getAreaInternal(coords[0], radius));\n\n for (j = 1, jj = coords.length; j < jj; ++j) {\n area -= Math.abs(getAreaInternal(coords[j], radius));\n }\n }\n\n break;\n }\n\n case GeometryType.GEOMETRY_COLLECTION:\n {\n var geometries =\n /** @type {import("./geom/GeometryCollection.js").default} */\n geometry.getGeometries();\n\n for (i = 0, ii = geometries.length; i < ii; ++i) {\n area += sphere_getArea(geometries[i], opt_options);\n }\n\n break;\n }\n\n default:\n {\n throw new Error(\'Unsupported geometry type: \' + type);\n }\n }\n\n return area;\n}\n/**\n * Returns the coordinate at the given distance and bearing from `c1`.\n *\n * @param {import("./coordinate.js").Coordinate} c1 The origin point (`[lon, lat]` in degrees).\n * @param {number} distance The great-circle distance between the origin\n * point and the target point.\n * @param {number} bearing The bearing (in radians).\n * @param {number=} opt_radius The sphere radius to use. Defaults to the Earth\'s\n * mean radius using the WGS84 ellipsoid.\n * @return {import("./coordinate.js").Coordinate} The target point.\n */\n\nfunction offset(c1, distance, bearing, opt_radius) {\n var radius = opt_radius || DEFAULT_RADIUS;\n var lat1 = toRadians(c1[1]);\n var lon1 = toRadians(c1[0]);\n var dByR = distance / radius;\n var lat = Math.asin(Math.sin(lat1) * Math.cos(dByR) + Math.cos(lat1) * Math.sin(dByR) * Math.cos(bearing));\n var lon = lon1 + Math.atan2(Math.sin(bearing) * Math.sin(dByR) * Math.cos(lat1), Math.cos(dByR) - Math.sin(lat1) * Math.sin(lat));\n return [toDegrees(lon), toDegrees(lat)];\n}\n;// CONCATENATED MODULE: ./node_modules/ol/proj.js\n/**\n * @module ol/proj\n */\n\n/**\n * The ol/proj module stores:\n * * a list of {@link module:ol/proj/Projection}\n * objects, one for each projection supported by the application\n * * a list of transform functions needed to convert coordinates in one projection\n * into another.\n *\n * The static functions are the methods used to maintain these.\n * Each transform function can handle not only simple coordinate pairs, but also\n * large arrays of coordinates such as vector geometries.\n *\n * When loaded, the library adds projection objects for EPSG:4326 (WGS84\n * geographic coordinates) and EPSG:3857 (Web or Spherical Mercator, as used\n * for example by Bing Maps or OpenStreetMap), together with the relevant\n * transform functions.\n *\n * Additional transforms may be added by using the http://proj4js.org/\n * library (version 2.2 or later). You can use the full build supplied by\n * Proj4js, or create a custom build to support those projections you need; see\n * the Proj4js website for how to do this. You also need the Proj4js definitions\n * for the required projections. These definitions can be obtained from\n * https://epsg.io/, and are a JS function, so can be loaded in a script\n * tag (as in the examples) or pasted into your application.\n *\n * After all required projection definitions are added to proj4\'s registry (by\n * using `proj4.defs()`), simply call `register(proj4)` from the `ol/proj/proj4`\n * package. Existing transforms are not changed by this function. See\n * examples/wms-image-custom-proj for an example of this.\n *\n * Additional projection definitions can be registered with `proj4.defs()` any\n * time. Just make sure to call `register(proj4)` again; for example, with user-supplied data where you don\'t\n * know in advance what projections are needed, you can initially load minimal\n * support and then load whichever are requested.\n *\n * Note that Proj4js does not support projection extents. If you want to add\n * one for creating default tile grids, you can add it after the Projection\n * object has been created with `setExtent`, for example,\n * `get(\'EPSG:1234\').setExtent(extent)`.\n *\n * In addition to Proj4js support, any transform functions can be added with\n * {@link module:ol/proj~addCoordinateTransforms}. To use this, you must first create\n * a {@link module:ol/proj/Projection} object for the new projection and add it with\n * {@link module:ol/proj~addProjection}. You can then add the forward and inverse\n * functions with {@link module:ol/proj~addCoordinateTransforms}. See\n * examples/wms-custom-proj for an example of this.\n *\n * Note that if no transforms are needed and you only need to define the\n * projection, just add a {@link module:ol/proj/Projection} with\n * {@link module:ol/proj~addProjection}. See examples/wms-no-proj for an example of\n * this.\n */\n\n\n\n\n\n\n\n\n\n\n/**\n * A projection as {@link module:ol/proj/Projection}, SRS identifier\n * string or undefined.\n * @typedef {Projection|string|undefined} ProjectionLike\n * @api\n */\n\n/**\n * A transform function accepts an array of input coordinate values, an optional\n * output array, and an optional dimension (default should be 2). The function\n * transforms the input coordinate values, populates the output array, and\n * returns the output array.\n *\n * @typedef {function(Array, Array=, number=): Array} TransformFunction\n * @api\n */\n\n\n\n/**\n * @param {Array} input Input coordinate array.\n * @param {Array=} opt_output Output array of coordinate values.\n * @param {number=} opt_dimension Dimension.\n * @return {Array} Output coordinate array (new array, same coordinate\n * values).\n */\n\nfunction cloneTransform(input, opt_output, opt_dimension) {\n var output;\n\n if (opt_output !== undefined) {\n for (var i = 0, ii = input.length; i < ii; ++i) {\n opt_output[i] = input[i];\n }\n\n output = opt_output;\n } else {\n output = input.slice();\n }\n\n return output;\n}\n/**\n * @param {Array} input Input coordinate array.\n * @param {Array=} opt_output Output array of coordinate values.\n * @param {number=} opt_dimension Dimension.\n * @return {Array} Input coordinate array (same array as input).\n */\n\nfunction identityTransform(input, opt_output, opt_dimension) {\n if (opt_output !== undefined && input !== opt_output) {\n for (var i = 0, ii = input.length; i < ii; ++i) {\n opt_output[i] = input[i];\n }\n\n input = opt_output;\n }\n\n return input;\n}\n/**\n * Add a Projection object to the list of supported projections that can be\n * looked up by their code.\n *\n * @param {Projection} projection Projection instance.\n * @api\n */\n\nfunction addProjection(projection) {\n projections_add(projection.getCode(), projection);\n transforms_add(projection, projection, cloneTransform);\n}\n/**\n * @param {Array} projections Projections.\n */\n\nfunction addProjections(projections) {\n projections.forEach(addProjection);\n}\n/**\n * Fetches a Projection object for the code specified.\n *\n * @param {ProjectionLike} projectionLike Either a code string which is\n * a combination of authority and identifier such as "EPSG:4326", or an\n * existing projection object, or undefined.\n * @return {Projection} Projection object, or null if not in list.\n * @api\n */\n\nfunction proj_get(projectionLike) {\n return typeof projectionLike === \'string\' ? get(\n /** @type {string} */\n projectionLike) :\n /** @type {Projection} */\n projectionLike || null;\n}\n/**\n * Get the resolution of the point in degrees or distance units.\n * For projections with degrees as the unit this will simply return the\n * provided resolution. For other projections the point resolution is\n * by default estimated by transforming the \'point\' pixel to EPSG:4326,\n * measuring its width and height on the normal sphere,\n * and taking the average of the width and height.\n * A custom function can be provided for a specific projection, either\n * by setting the `getPointResolution` option in the\n * {@link module:ol/proj/Projection~Projection} constructor or by using\n * {@link module:ol/proj/Projection~Projection#setGetPointResolution} to change an existing\n * projection object.\n * @param {ProjectionLike} projection The projection.\n * @param {number} resolution Nominal resolution in projection units.\n * @param {import("./coordinate.js").Coordinate} point Point to find adjusted resolution at.\n * @param {import("./proj/Units.js").default=} opt_units Units to get the point resolution in.\n * Default is the projection\'s units.\n * @return {number} Point resolution.\n * @api\n */\n\nfunction getPointResolution(projection, resolution, point, opt_units) {\n projection = proj_get(projection);\n var pointResolution;\n var getter = projection.getPointResolutionFunc();\n\n if (getter) {\n pointResolution = getter(resolution, point);\n\n if (opt_units && opt_units !== projection.getUnits()) {\n var metersPerUnit = projection.getMetersPerUnit();\n\n if (metersPerUnit) {\n pointResolution = pointResolution * metersPerUnit / Units_METERS_PER_UNIT[opt_units];\n }\n }\n } else {\n var units = projection.getUnits();\n\n if (units == proj_Units.DEGREES && !opt_units || opt_units == proj_Units.DEGREES) {\n pointResolution = resolution;\n } else {\n // Estimate point resolution by transforming the center pixel to EPSG:4326,\n // measuring its width and height on the normal sphere, and taking the\n // average of the width and height.\n var toEPSG4326_1 = getTransformFromProjections(projection, proj_get(\'EPSG:4326\'));\n\n if (toEPSG4326_1 === identityTransform && units !== proj_Units.DEGREES) {\n // no transform is available\n pointResolution = resolution * projection.getMetersPerUnit();\n } else {\n var vertices = [point[0] - resolution / 2, point[1], point[0] + resolution / 2, point[1], point[0], point[1] - resolution / 2, point[0], point[1] + resolution / 2];\n vertices = toEPSG4326_1(vertices, vertices, 2);\n var width = sphere_getDistance(vertices.slice(0, 2), vertices.slice(2, 4));\n var height = sphere_getDistance(vertices.slice(4, 6), vertices.slice(6, 8));\n pointResolution = (width + height) / 2;\n }\n\n var metersPerUnit = opt_units ? Units_METERS_PER_UNIT[opt_units] : projection.getMetersPerUnit();\n\n if (metersPerUnit !== undefined) {\n pointResolution /= metersPerUnit;\n }\n }\n }\n\n return pointResolution;\n}\n/**\n * Registers transformation functions that don\'t alter coordinates. Those allow\n * to transform between projections with equal meaning.\n *\n * @param {Array} projections Projections.\n * @api\n */\n\nfunction addEquivalentProjections(projections) {\n addProjections(projections);\n projections.forEach(function (source) {\n projections.forEach(function (destination) {\n if (source !== destination) {\n transforms_add(source, destination, cloneTransform);\n }\n });\n });\n}\n/**\n * Registers transformation functions to convert coordinates in any projection\n * in projection1 to any projection in projection2.\n *\n * @param {Array} projections1 Projections with equal\n * meaning.\n * @param {Array} projections2 Projections with equal\n * meaning.\n * @param {TransformFunction} forwardTransform Transformation from any\n * projection in projection1 to any projection in projection2.\n * @param {TransformFunction} inverseTransform Transform from any projection\n * in projection2 to any projection in projection1..\n */\n\nfunction addEquivalentTransforms(projections1, projections2, forwardTransform, inverseTransform) {\n projections1.forEach(function (projection1) {\n projections2.forEach(function (projection2) {\n transforms_add(projection1, projection2, forwardTransform);\n transforms_add(projection2, projection1, inverseTransform);\n });\n });\n}\n/**\n * Clear all cached projections and transforms.\n */\n\nfunction clearAllProjections() {\n clearProj();\n clearTransformFuncs();\n}\n/**\n * @param {Projection|string|undefined} projection Projection.\n * @param {string} defaultCode Default code.\n * @return {Projection} Projection.\n */\n\nfunction createProjection(projection, defaultCode) {\n if (!projection) {\n return proj_get(defaultCode);\n } else if (typeof projection === \'string\') {\n return proj_get(projection);\n } else {\n return (\n /** @type {Projection} */\n projection\n );\n }\n}\n/**\n * Creates a {@link module:ol/proj~TransformFunction} from a simple 2D coordinate transform\n * function.\n * @param {function(import("./coordinate.js").Coordinate): import("./coordinate.js").Coordinate} coordTransform Coordinate\n * transform.\n * @return {TransformFunction} Transform function.\n */\n\nfunction createTransformFromCoordinateTransform(coordTransform) {\n return (\n /**\n * @param {Array} input Input.\n * @param {Array=} opt_output Output.\n * @param {number=} opt_dimension Dimension.\n * @return {Array} Output.\n */\n function (input, opt_output, opt_dimension) {\n var length = input.length;\n var dimension = opt_dimension !== undefined ? opt_dimension : 2;\n var output = opt_output !== undefined ? opt_output : new Array(length);\n\n for (var i = 0; i < length; i += dimension) {\n var point = coordTransform([input[i], input[i + 1]]);\n output[i] = point[0];\n output[i + 1] = point[1];\n\n for (var j = dimension - 1; j >= 2; --j) {\n output[i + j] = input[i + j];\n }\n }\n\n return output;\n }\n );\n}\n/**\n * Registers coordinate transform functions to convert coordinates between the\n * source projection and the destination projection.\n * The forward and inverse functions convert coordinate pairs; this function\n * converts these into the functions used internally which also handle\n * extents and coordinate arrays.\n *\n * @param {ProjectionLike} source Source projection.\n * @param {ProjectionLike} destination Destination projection.\n * @param {function(import("./coordinate.js").Coordinate): import("./coordinate.js").Coordinate} forward The forward transform\n * function (that is, from the source projection to the destination\n * projection) that takes a {@link module:ol/coordinate~Coordinate} as argument and returns\n * the transformed {@link module:ol/coordinate~Coordinate}.\n * @param {function(import("./coordinate.js").Coordinate): import("./coordinate.js").Coordinate} inverse The inverse transform\n * function (that is, from the destination projection to the source\n * projection) that takes a {@link module:ol/coordinate~Coordinate} as argument and returns\n * the transformed {@link module:ol/coordinate~Coordinate}.\n * @api\n */\n\nfunction addCoordinateTransforms(source, destination, forward, inverse) {\n var sourceProj = proj_get(source);\n var destProj = proj_get(destination);\n addTransformFunc(sourceProj, destProj, createTransformFromCoordinateTransform(forward));\n addTransformFunc(destProj, sourceProj, createTransformFromCoordinateTransform(inverse));\n}\n/**\n * Transforms a coordinate from longitude/latitude to a different projection.\n * @param {import("./coordinate.js").Coordinate} coordinate Coordinate as longitude and latitude, i.e.\n * an array with longitude as 1st and latitude as 2nd element.\n * @param {ProjectionLike=} opt_projection Target projection. The\n * default is Web Mercator, i.e. \'EPSG:3857\'.\n * @return {import("./coordinate.js").Coordinate} Coordinate projected to the target projection.\n * @api\n */\n\nfunction fromLonLat(coordinate, opt_projection) {\n return transform(coordinate, \'EPSG:4326\', opt_projection !== undefined ? opt_projection : \'EPSG:3857\');\n}\n/**\n * Transforms a coordinate to longitude/latitude.\n * @param {import("./coordinate.js").Coordinate} coordinate Projected coordinate.\n * @param {ProjectionLike=} opt_projection Projection of the coordinate.\n * The default is Web Mercator, i.e. \'EPSG:3857\'.\n * @return {import("./coordinate.js").Coordinate} Coordinate as longitude and latitude, i.e. an array\n * with longitude as 1st and latitude as 2nd element.\n * @api\n */\n\nfunction toLonLat(coordinate, opt_projection) {\n var lonLat = transform(coordinate, opt_projection !== undefined ? opt_projection : \'EPSG:3857\', \'EPSG:4326\');\n var lon = lonLat[0];\n\n if (lon < -180 || lon > 180) {\n lonLat[0] = modulo(lon + 180, 360) - 180;\n }\n\n return lonLat;\n}\n/**\n * Checks if two projections are the same, that is every coordinate in one\n * projection does represent the same geographic point as the same coordinate in\n * the other projection.\n *\n * @param {Projection} projection1 Projection 1.\n * @param {Projection} projection2 Projection 2.\n * @return {boolean} Equivalent.\n * @api\n */\n\nfunction equivalent(projection1, projection2) {\n if (projection1 === projection2) {\n return true;\n }\n\n var equalUnits = projection1.getUnits() === projection2.getUnits();\n\n if (projection1.getCode() === projection2.getCode()) {\n return equalUnits;\n } else {\n var transformFunc = getTransformFromProjections(projection1, projection2);\n return transformFunc === cloneTransform && equalUnits;\n }\n}\n/**\n * Searches in the list of transform functions for the function for converting\n * coordinates from the source projection to the destination projection.\n *\n * @param {Projection} sourceProjection Source Projection object.\n * @param {Projection} destinationProjection Destination Projection\n * object.\n * @return {TransformFunction} Transform function.\n */\n\nfunction getTransformFromProjections(sourceProjection, destinationProjection) {\n var sourceCode = sourceProjection.getCode();\n var destinationCode = destinationProjection.getCode();\n var transformFunc = transforms_get(sourceCode, destinationCode);\n\n if (!transformFunc) {\n transformFunc = identityTransform;\n }\n\n return transformFunc;\n}\n/**\n * Given the projection-like objects, searches for a transformation\n * function to convert a coordinates array from the source projection to the\n * destination projection.\n *\n * @param {ProjectionLike} source Source.\n * @param {ProjectionLike} destination Destination.\n * @return {TransformFunction} Transform function.\n * @api\n */\n\nfunction getTransform(source, destination) {\n var sourceProjection = proj_get(source);\n var destinationProjection = proj_get(destination);\n return getTransformFromProjections(sourceProjection, destinationProjection);\n}\n/**\n * Transforms a coordinate from source projection to destination projection.\n * This returns a new coordinate (and does not modify the original).\n *\n * See {@link module:ol/proj~transformExtent} for extent transformation.\n * See the transform method of {@link module:ol/geom/Geometry~Geometry} and its\n * subclasses for geometry transforms.\n *\n * @param {import("./coordinate.js").Coordinate} coordinate Coordinate.\n * @param {ProjectionLike} source Source projection-like.\n * @param {ProjectionLike} destination Destination projection-like.\n * @return {import("./coordinate.js").Coordinate} Coordinate.\n * @api\n */\n\nfunction transform(coordinate, source, destination) {\n var transformFunc = getTransform(source, destination);\n return transformFunc(coordinate, undefined, coordinate.length);\n}\n/**\n * Transforms an extent from source projection to destination projection. This\n * returns a new extent (and does not modify the original).\n *\n * @param {import("./extent.js").Extent} extent The extent to transform.\n * @param {ProjectionLike} source Source projection-like.\n * @param {ProjectionLike} destination Destination projection-like.\n * @param {number=} opt_stops Number of stops per side used for the transform.\n * By default only the corners are used.\n * @return {import("./extent.js").Extent} The transformed extent.\n * @api\n */\n\nfunction proj_transformExtent(extent, source, destination, opt_stops) {\n var transformFunc = getTransform(source, destination);\n return applyTransform(extent, transformFunc, undefined, opt_stops);\n}\n/**\n * Transforms the given point to the destination projection.\n *\n * @param {import("./coordinate.js").Coordinate} point Point.\n * @param {Projection} sourceProjection Source projection.\n * @param {Projection} destinationProjection Destination projection.\n * @return {import("./coordinate.js").Coordinate} Point.\n */\n\nfunction transformWithProjections(point, sourceProjection, destinationProjection) {\n var transformFunc = getTransformFromProjections(sourceProjection, destinationProjection);\n return transformFunc(point);\n}\n/**\n * @type {?Projection}\n */\n\nvar userProjection = null;\n/**\n * Set the projection for coordinates supplied from and returned by API methods.\n * Note that this method is not yet a part of the stable API. Support for user\n * projections is not yet complete and should be considered experimental.\n * @param {ProjectionLike} projection The user projection.\n */\n\nfunction setUserProjection(projection) {\n userProjection = proj_get(projection);\n}\n/**\n * Clear the user projection if set. Note that this method is not yet a part of\n * the stable API. Support for user projections is not yet complete and should\n * be considered experimental.\n */\n\nfunction clearUserProjection() {\n userProjection = null;\n}\n/**\n * Get the projection for coordinates supplied from and returned by API methods.\n * Note that this method is not yet a part of the stable API. Support for user\n * projections is not yet complete and should be considered experimental.\n * @returns {?Projection} The user projection (or null if not set).\n */\n\nfunction getUserProjection() {\n return userProjection;\n}\n/**\n * Use geographic coordinates (WGS-84 datum) in API methods. Note that this\n * method is not yet a part of the stable API. Support for user projections is\n * not yet complete and should be considered experimental.\n */\n\nfunction useGeographic() {\n setUserProjection(\'EPSG:4326\');\n}\n/**\n * Return a coordinate transformed into the user projection. If no user projection\n * is set, the original coordinate is returned.\n * @param {Array} coordinate Input coordinate.\n * @param {ProjectionLike} sourceProjection The input coordinate projection.\n * @returns {Array} The input coordinate in the user projection.\n */\n\nfunction toUserCoordinate(coordinate, sourceProjection) {\n if (!userProjection) {\n return coordinate;\n }\n\n return transform(coordinate, sourceProjection, userProjection);\n}\n/**\n * Return a coordinate transformed from the user projection. If no user projection\n * is set, the original coordinate is returned.\n * @param {Array} coordinate Input coordinate.\n * @param {ProjectionLike} destProjection The destination projection.\n * @returns {Array} The input coordinate transformed.\n */\n\nfunction fromUserCoordinate(coordinate, destProjection) {\n if (!userProjection) {\n return coordinate;\n }\n\n return transform(coordinate, userProjection, destProjection);\n}\n/**\n * Return an extent transformed into the user projection. If no user projection\n * is set, the original extent is returned.\n * @param {import("./extent.js").Extent} extent Input extent.\n * @param {ProjectionLike} sourceProjection The input extent projection.\n * @returns {import("./extent.js").Extent} The input extent in the user projection.\n */\n\nfunction toUserExtent(extent, sourceProjection) {\n if (!userProjection) {\n return extent;\n }\n\n return proj_transformExtent(extent, sourceProjection, userProjection);\n}\n/**\n * Return an extent transformed from the user projection. If no user projection\n * is set, the original extent is returned.\n * @param {import("./extent.js").Extent} extent Input extent.\n * @param {ProjectionLike} destProjection The destination projection.\n * @returns {import("./extent.js").Extent} The input extent transformed.\n */\n\nfunction fromUserExtent(extent, destProjection) {\n if (!userProjection) {\n return extent;\n }\n\n return proj_transformExtent(extent, userProjection, destProjection);\n}\n/**\n * Creates a safe coordinate transform function from a coordinate transform function.\n * "Safe" means that it can handle wrapping of x-coordinates for global projections,\n * and that coordinates exceeding the source projection validity extent\'s range will be\n * clamped to the validity range.\n * @param {Projection} sourceProj Source projection.\n * @param {Projection} destProj Destination projection.\n * @param {function(import("./coordinate.js").Coordinate): import("./coordinate.js").Coordinate} transform Transform function (source to destiation).\n * @return {function(import("./coordinate.js").Coordinate): import("./coordinate.js").Coordinate} Safe transform function (source to destiation).\n */\n\nfunction createSafeCoordinateTransform(sourceProj, destProj, transform) {\n return function (coord) {\n var sourceX = coord[0];\n var sourceY = coord[1];\n var transformed, worldsAway;\n\n if (sourceProj.canWrapX()) {\n var sourceExtent = sourceProj.getExtent();\n var sourceExtentWidth = getWidth(sourceExtent);\n worldsAway = getWorldsAway(coord, sourceProj, sourceExtentWidth);\n\n if (worldsAway) {\n // Move x to the real world\n sourceX = sourceX - worldsAway * sourceExtentWidth;\n }\n\n sourceX = clamp(sourceX, sourceExtent[0], sourceExtent[2]);\n sourceY = clamp(sourceY, sourceExtent[1], sourceExtent[3]);\n transformed = transform([sourceX, sourceY]);\n } else {\n transformed = transform(coord);\n }\n\n if (worldsAway && destProj.canWrapX()) {\n // Move transformed coordinate back to the offset world\n transformed[0] += worldsAway * getWidth(destProj.getExtent());\n }\n\n return transformed;\n };\n}\n/**\n * Add transforms to and from EPSG:4326 and EPSG:3857. This function is called\n * by when this module is executed and should only need to be called again after\n * `clearAllProjections()` is called (e.g. in tests).\n */\n\nfunction addCommon() {\n // Add transformations that don\'t alter coordinates to convert within set of\n // projections with equal meaning.\n addEquivalentProjections(PROJECTIONS);\n addEquivalentProjections(epsg4326_PROJECTIONS); // Add transformations to convert EPSG:4326 like coordinates to EPSG:3857 like\n // coordinates and back.\n\n addEquivalentTransforms(epsg4326_PROJECTIONS, PROJECTIONS, fromEPSG4326, toEPSG4326);\n}\naddCommon();\n;// CONCATENATED MODULE: ./node_modules/ol/centerconstraint.js\n/**\n * @module ol/centerconstraint\n */\n\n/**\n * @typedef {function((import("./coordinate.js").Coordinate|undefined), number, import("./size.js").Size, boolean=, Array=): (import("./coordinate.js").Coordinate|undefined)} Type\n */\n\n/**\n * @param {import("./extent.js").Extent} extent Extent.\n * @param {boolean} onlyCenter If true, the constraint will only apply to the view center.\n * @param {boolean} smooth If true, the view will be able to go slightly out of the given extent\n * (only during interaction and animation).\n * @return {Type} The constraint.\n */\n\nfunction createExtent(extent, onlyCenter, smooth) {\n return (\n /**\n * @param {import("./coordinate.js").Coordinate|undefined} center Center.\n * @param {number} resolution Resolution.\n * @param {import("./size.js").Size} size Viewport size; unused if `onlyCenter` was specified.\n * @param {boolean=} opt_isMoving True if an interaction or animation is in progress.\n * @param {Array=} opt_centerShift Shift between map center and viewport center.\n * @return {import("./coordinate.js").Coordinate|undefined} Center.\n */\n function (center, resolution, size, opt_isMoving, opt_centerShift) {\n if (center) {\n var viewWidth = onlyCenter ? 0 : size[0] * resolution;\n var viewHeight = onlyCenter ? 0 : size[1] * resolution;\n var shiftX = opt_centerShift ? opt_centerShift[0] : 0;\n var shiftY = opt_centerShift ? opt_centerShift[1] : 0;\n var minX = extent[0] + viewWidth / 2 + shiftX;\n var maxX = extent[2] - viewWidth / 2 + shiftX;\n var minY = extent[1] + viewHeight / 2 + shiftY;\n var maxY = extent[3] - viewHeight / 2 + shiftY; // note: when zooming out of bounds, min and max values for x and y may\n // end up inverted (min > max); this has to be accounted for\n\n if (minX > maxX) {\n minX = (maxX + minX) / 2;\n maxX = minX;\n }\n\n if (minY > maxY) {\n minY = (maxY + minY) / 2;\n maxY = minY;\n }\n\n var x = math_clamp(center[0], minX, maxX);\n var y = math_clamp(center[1], minY, maxY);\n var ratio = 30 * resolution; // during an interaction, allow some overscroll\n\n if (opt_isMoving && smooth) {\n x += -ratio * Math.log(1 + Math.max(0, minX - center[0]) / ratio) + ratio * Math.log(1 + Math.max(0, center[0] - maxX) / ratio);\n y += -ratio * Math.log(1 + Math.max(0, minY - center[1]) / ratio) + ratio * Math.log(1 + Math.max(0, center[1] - maxY) / ratio);\n }\n\n return [x, y];\n } else {\n return undefined;\n }\n }\n );\n}\n/**\n * @param {import("./coordinate.js").Coordinate=} center Center.\n * @return {import("./coordinate.js").Coordinate|undefined} Center.\n */\n\nfunction none(center) {\n return center;\n}\n;// CONCATENATED MODULE: ./node_modules/ol/resolutionconstraint.js\n/**\n * @module ol/resolutionconstraint\n */\n\n\n\n/**\n * @typedef {function((number|undefined), number, import("./size.js").Size, boolean=): (number|undefined)} Type\n */\n\n/**\n * Returns a modified resolution taking into account the viewport size and maximum\n * allowed extent.\n * @param {number} resolution Resolution\n * @param {import("./extent.js").Extent} maxExtent Maximum allowed extent.\n * @param {import("./size.js").Size} viewportSize Viewport size.\n * @param {boolean} showFullExtent Whether to show the full extent.\n * @return {number} Capped resolution.\n */\n\nfunction getViewportClampedResolution(resolution, maxExtent, viewportSize, showFullExtent) {\n var xResolution = extent_getWidth(maxExtent) / viewportSize[0];\n var yResolution = getHeight(maxExtent) / viewportSize[1];\n\n if (showFullExtent) {\n return Math.min(resolution, Math.max(xResolution, yResolution));\n }\n\n return Math.min(resolution, Math.min(xResolution, yResolution));\n}\n/**\n * Returns a modified resolution to be between maxResolution and minResolution while\n * still allowing the value to be slightly out of bounds.\n * Note: the computation is based on the logarithm function (ln):\n * - at 1, ln(x) is 0\n * - above 1, ln(x) keeps increasing but at a much slower pace than x\n * The final result is clamped to prevent getting too far away from bounds.\n * @param {number} resolution Resolution.\n * @param {number} maxResolution Max resolution.\n * @param {number} minResolution Min resolution.\n * @return {number} Smoothed resolution.\n */\n\n\nfunction getSmoothClampedResolution(resolution, maxResolution, minResolution) {\n var result = Math.min(resolution, maxResolution);\n var ratio = 50;\n result *= Math.log(1 + ratio * Math.max(0, resolution / maxResolution - 1)) / ratio + 1;\n\n if (minResolution) {\n result = Math.max(result, minResolution);\n result /= Math.log(1 + ratio * Math.max(0, minResolution / resolution - 1)) / ratio + 1;\n }\n\n return math_clamp(result, minResolution / 2, maxResolution * 2);\n}\n/**\n * @param {Array} resolutions Resolutions.\n * @param {boolean=} opt_smooth If true, the view will be able to slightly exceed resolution limits. Default: true.\n * @param {import("./extent.js").Extent=} opt_maxExtent Maximum allowed extent.\n * @param {boolean=} opt_showFullExtent If true, allows us to show the full extent. Default: false.\n * @return {Type} Zoom function.\n */\n\n\nfunction createSnapToResolutions(resolutions, opt_smooth, opt_maxExtent, opt_showFullExtent) {\n return (\n /**\n * @param {number|undefined} resolution Resolution.\n * @param {number} direction Direction.\n * @param {import("./size.js").Size} size Viewport size.\n * @param {boolean=} opt_isMoving True if an interaction or animation is in progress.\n * @return {number|undefined} Resolution.\n */\n function (resolution, direction, size, opt_isMoving) {\n if (resolution !== undefined) {\n var maxResolution = resolutions[0];\n var minResolution = resolutions[resolutions.length - 1];\n var cappedMaxRes = opt_maxExtent ? getViewportClampedResolution(maxResolution, opt_maxExtent, size, opt_showFullExtent) : maxResolution; // during interacting or animating, allow intermediary values\n\n if (opt_isMoving) {\n var smooth = opt_smooth !== undefined ? opt_smooth : true;\n\n if (!smooth) {\n return math_clamp(resolution, minResolution, cappedMaxRes);\n }\n\n return getSmoothClampedResolution(resolution, cappedMaxRes, minResolution);\n }\n\n var capped = Math.min(cappedMaxRes, resolution);\n var z = Math.floor(linearFindNearest(resolutions, capped, direction));\n\n if (resolutions[z] > cappedMaxRes && z < resolutions.length - 1) {\n return resolutions[z + 1];\n }\n\n return resolutions[z];\n } else {\n return undefined;\n }\n }\n );\n}\n/**\n * @param {number} power Power.\n * @param {number} maxResolution Maximum resolution.\n * @param {number=} opt_minResolution Minimum resolution.\n * @param {boolean=} opt_smooth If true, the view will be able to slightly exceed resolution limits. Default: true.\n * @param {import("./extent.js").Extent=} opt_maxExtent Maximum allowed extent.\n * @param {boolean=} opt_showFullExtent If true, allows us to show the full extent. Default: false.\n * @return {Type} Zoom function.\n */\n\nfunction createSnapToPower(power, maxResolution, opt_minResolution, opt_smooth, opt_maxExtent, opt_showFullExtent) {\n return (\n /**\n * @param {number|undefined} resolution Resolution.\n * @param {number} direction Direction.\n * @param {import("./size.js").Size} size Viewport size.\n * @param {boolean=} opt_isMoving True if an interaction or animation is in progress.\n * @return {number|undefined} Resolution.\n */\n function (resolution, direction, size, opt_isMoving) {\n if (resolution !== undefined) {\n var cappedMaxRes = opt_maxExtent ? getViewportClampedResolution(maxResolution, opt_maxExtent, size, opt_showFullExtent) : maxResolution;\n var minResolution = opt_minResolution !== undefined ? opt_minResolution : 0; // during interacting or animating, allow intermediary values\n\n if (opt_isMoving) {\n var smooth = opt_smooth !== undefined ? opt_smooth : true;\n\n if (!smooth) {\n return math_clamp(resolution, minResolution, cappedMaxRes);\n }\n\n return getSmoothClampedResolution(resolution, cappedMaxRes, minResolution);\n }\n\n var tolerance = 1e-9;\n var minZoomLevel = Math.ceil(Math.log(maxResolution / cappedMaxRes) / Math.log(power) - tolerance);\n var offset = -direction * (0.5 - tolerance) + 0.5;\n var capped = Math.min(cappedMaxRes, resolution);\n var cappedZoomLevel = Math.floor(Math.log(maxResolution / capped) / Math.log(power) + offset);\n var zoomLevel = Math.max(minZoomLevel, cappedZoomLevel);\n var newResolution = maxResolution / Math.pow(power, zoomLevel);\n return math_clamp(newResolution, minResolution, cappedMaxRes);\n } else {\n return undefined;\n }\n }\n );\n}\n/**\n * @param {number} maxResolution Max resolution.\n * @param {number} minResolution Min resolution.\n * @param {boolean=} opt_smooth If true, the view will be able to slightly exceed resolution limits. Default: true.\n * @param {import("./extent.js").Extent=} opt_maxExtent Maximum allowed extent.\n * @param {boolean=} opt_showFullExtent If true, allows us to show the full extent. Default: false.\n * @return {Type} Zoom function.\n */\n\nfunction createMinMaxResolution(maxResolution, minResolution, opt_smooth, opt_maxExtent, opt_showFullExtent) {\n return (\n /**\n * @param {number|undefined} resolution Resolution.\n * @param {number} direction Direction.\n * @param {import("./size.js").Size} size Viewport size.\n * @param {boolean=} opt_isMoving True if an interaction or animation is in progress.\n * @return {number|undefined} Resolution.\n */\n function (resolution, direction, size, opt_isMoving) {\n if (resolution !== undefined) {\n var cappedMaxRes = opt_maxExtent ? getViewportClampedResolution(maxResolution, opt_maxExtent, size, opt_showFullExtent) : maxResolution;\n var smooth = opt_smooth !== undefined ? opt_smooth : true;\n\n if (!smooth || !opt_isMoving) {\n return math_clamp(resolution, minResolution, cappedMaxRes);\n }\n\n return getSmoothClampedResolution(resolution, cappedMaxRes, minResolution);\n } else {\n return undefined;\n }\n }\n );\n}\n;// CONCATENATED MODULE: ./node_modules/ol/rotationconstraint.js\n/**\n * @module ol/rotationconstraint\n */\n\n/**\n * @typedef {function((number|undefined), boolean=): (number|undefined)} Type\n */\n\n/**\n * @param {number|undefined} rotation Rotation.\n * @return {number|undefined} Rotation.\n */\n\nfunction disable(rotation) {\n if (rotation !== undefined) {\n return 0;\n } else {\n return undefined;\n }\n}\n/**\n * @param {number|undefined} rotation Rotation.\n * @return {number|undefined} Rotation.\n */\n\nfunction rotationconstraint_none(rotation) {\n if (rotation !== undefined) {\n return rotation;\n } else {\n return undefined;\n }\n}\n/**\n * @param {number} n N.\n * @return {Type} Rotation constraint.\n */\n\nfunction createSnapToN(n) {\n var theta = 2 * Math.PI / n;\n return (\n /**\n * @param {number|undefined} rotation Rotation.\n * @param {boolean=} opt_isMoving True if an interaction or animation is in progress.\n * @return {number|undefined} Rotation.\n */\n function (rotation, opt_isMoving) {\n if (opt_isMoving) {\n return rotation;\n }\n\n if (rotation !== undefined) {\n rotation = Math.floor(rotation / theta + 0.5) * theta;\n return rotation;\n } else {\n return undefined;\n }\n }\n );\n}\n/**\n * @param {number=} opt_tolerance Tolerance.\n * @return {Type} Rotation constraint.\n */\n\nfunction createSnapToZero(opt_tolerance) {\n var tolerance = opt_tolerance || math_toRadians(5);\n return (\n /**\n * @param {number|undefined} rotation Rotation.\n * @param {boolean=} opt_isMoving True if an interaction or animation is in progress.\n * @return {number|undefined} Rotation.\n */\n function (rotation, opt_isMoving) {\n if (opt_isMoving) {\n return rotation;\n }\n\n if (rotation !== undefined) {\n if (Math.abs(rotation) <= tolerance) {\n return 0;\n } else {\n return rotation;\n }\n } else {\n return undefined;\n }\n }\n );\n}\n;// CONCATENATED MODULE: ./node_modules/ol/easing.js\n/**\n * @module ol/easing\n */\n\n/**\n * Start slow and speed up.\n * @param {number} t Input between 0 and 1.\n * @return {number} Output between 0 and 1.\n * @api\n */\nfunction easeIn(t) {\n return Math.pow(t, 3);\n}\n/**\n * Start fast and slow down.\n * @param {number} t Input between 0 and 1.\n * @return {number} Output between 0 and 1.\n * @api\n */\n\nfunction easeOut(t) {\n return 1 - easeIn(1 - t);\n}\n/**\n * Start slow, speed up, and then slow down again.\n * @param {number} t Input between 0 and 1.\n * @return {number} Output between 0 and 1.\n * @api\n */\n\nfunction inAndOut(t) {\n return 3 * t * t - 2 * t * t * t;\n}\n/**\n * Maintain a constant speed over time.\n * @param {number} t Input between 0 and 1.\n * @return {number} Output between 0 and 1.\n * @api\n */\n\nfunction linear(t) {\n return t;\n}\n/**\n * Start slow, speed up, and at the very end slow down again. This has the\n * same general behavior as {@link module:ol/easing~inAndOut}, but the final\n * slowdown is delayed.\n * @param {number} t Input between 0 and 1.\n * @return {number} Output between 0 and 1.\n * @api\n */\n\nfunction upAndDown(t) {\n if (t < 0.5) {\n return inAndOut(2 * t);\n } else {\n return 1 - inAndOut(2 * (t - 0.5));\n }\n}\n;// CONCATENATED MODULE: ./node_modules/ol/geom/GeometryLayout.js\n/**\n * @module ol/geom/GeometryLayout\n */\n\n/**\n * The coordinate layout for geometries, indicating whether a 3rd or 4th z (\'Z\')\n * or measure (\'M\') coordinate is available. Supported values are `\'XY\'`,\n * `\'XYZ\'`, `\'XYM\'`, `\'XYZM\'`.\n * @enum {string}\n */\n/* harmony default export */ var geom_GeometryLayout = ({\n XY: \'XY\',\n XYZ: \'XYZ\',\n XYM: \'XYM\',\n XYZM: \'XYZM\'\n});\n;// CONCATENATED MODULE: ./node_modules/ol/geom/flat/transform.js\n/**\n * @module ol/geom/flat/transform\n */\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {import("../../transform.js").Transform} transform Transform.\n * @param {Array=} opt_dest Destination.\n * @return {Array} Transformed coordinates.\n */\nfunction transform2D(flatCoordinates, offset, end, stride, transform, opt_dest) {\n var dest = opt_dest ? opt_dest : [];\n var i = 0;\n\n for (var j = offset; j < end; j += stride) {\n var x = flatCoordinates[j];\n var y = flatCoordinates[j + 1];\n dest[i++] = transform[0] * x + transform[2] * y + transform[4];\n dest[i++] = transform[1] * x + transform[3] * y + transform[5];\n }\n\n if (opt_dest && dest.length != i) {\n dest.length = i;\n }\n\n return dest;\n}\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {number} angle Angle.\n * @param {Array} anchor Rotation anchor point.\n * @param {Array=} opt_dest Destination.\n * @return {Array} Transformed coordinates.\n */\n\nfunction transform_rotate(flatCoordinates, offset, end, stride, angle, anchor, opt_dest) {\n var dest = opt_dest ? opt_dest : [];\n var cos = Math.cos(angle);\n var sin = Math.sin(angle);\n var anchorX = anchor[0];\n var anchorY = anchor[1];\n var i = 0;\n\n for (var j = offset; j < end; j += stride) {\n var deltaX = flatCoordinates[j] - anchorX;\n var deltaY = flatCoordinates[j + 1] - anchorY;\n dest[i++] = anchorX + deltaX * cos - deltaY * sin;\n dest[i++] = anchorY + deltaX * sin + deltaY * cos;\n\n for (var k = j + 2; k < j + stride; ++k) {\n dest[i++] = flatCoordinates[k];\n }\n }\n\n if (opt_dest && dest.length != i) {\n dest.length = i;\n }\n\n return dest;\n}\n/**\n * Scale the coordinates.\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {number} sx Scale factor in the x-direction.\n * @param {number} sy Scale factor in the y-direction.\n * @param {Array} anchor Scale anchor point.\n * @param {Array=} opt_dest Destination.\n * @return {Array} Transformed coordinates.\n */\n\nfunction transform_scale(flatCoordinates, offset, end, stride, sx, sy, anchor, opt_dest) {\n var dest = opt_dest ? opt_dest : [];\n var anchorX = anchor[0];\n var anchorY = anchor[1];\n var i = 0;\n\n for (var j = offset; j < end; j += stride) {\n var deltaX = flatCoordinates[j] - anchorX;\n var deltaY = flatCoordinates[j + 1] - anchorY;\n dest[i++] = anchorX + sx * deltaX;\n dest[i++] = anchorY + sy * deltaY;\n\n for (var k = j + 2; k < j + stride; ++k) {\n dest[i++] = flatCoordinates[k];\n }\n }\n\n if (opt_dest && dest.length != i) {\n dest.length = i;\n }\n\n return dest;\n}\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {number} deltaX Delta X.\n * @param {number} deltaY Delta Y.\n * @param {Array=} opt_dest Destination.\n * @return {Array} Transformed coordinates.\n */\n\nfunction transform_translate(flatCoordinates, offset, end, stride, deltaX, deltaY, opt_dest) {\n var dest = opt_dest ? opt_dest : [];\n var i = 0;\n\n for (var j = offset; j < end; j += stride) {\n dest[i++] = flatCoordinates[j] + deltaX;\n dest[i++] = flatCoordinates[j + 1] + deltaY;\n\n for (var k = j + 2; k < j + stride; ++k) {\n dest[i++] = flatCoordinates[k];\n }\n }\n\n if (opt_dest && dest.length != i) {\n dest.length = i;\n }\n\n return dest;\n}\n;// CONCATENATED MODULE: ./node_modules/ol/geom/Geometry.js\nvar Geometry_extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n/**\n * @module ol/geom/Geometry\n */\n\n\n\n\n\n\n\n\n\n\n/**\n * @type {import("../transform.js").Transform}\n */\n\nvar tmpTransform = create();\n/**\n * @classdesc\n * Abstract base class; normally only used for creating subclasses and not\n * instantiated in apps.\n * Base class for vector geometries.\n *\n * To get notified of changes to the geometry, register a listener for the\n * generic `change` event on your geometry instance.\n *\n * @abstract\n * @api\n */\n\nvar Geometry =\n/** @class */\nfunction (_super) {\n Geometry_extends(Geometry, _super);\n\n function Geometry() {\n var _this = _super.call(this) || this;\n /**\n * @private\n * @type {import("../extent.js").Extent}\n */\n\n\n _this.extent_ = createEmpty();\n /**\n * @private\n * @type {number}\n */\n\n _this.extentRevision_ = -1;\n /**\n * @protected\n * @type {number}\n */\n\n _this.simplifiedGeometryMaxMinSquaredTolerance = 0;\n /**\n * @protected\n * @type {number}\n */\n\n _this.simplifiedGeometryRevision = 0;\n /**\n * Get a transformed and simplified version of the geometry.\n * @abstract\n * @param {number} revision The geometry revision.\n * @param {number} squaredTolerance Squared tolerance.\n * @param {import("../proj.js").TransformFunction} [opt_transform] Optional transform function.\n * @return {Geometry} Simplified geometry.\n */\n\n _this.simplifyTransformedInternal = memoizeOne(function (revision, squaredTolerance, opt_transform) {\n if (!opt_transform) {\n return this.getSimplifiedGeometry(squaredTolerance);\n }\n\n var clone = this.clone();\n clone.applyTransform(opt_transform);\n return clone.getSimplifiedGeometry(squaredTolerance);\n });\n return _this;\n }\n /**\n * Get a transformed and simplified version of the geometry.\n * @abstract\n * @param {number} squaredTolerance Squared tolerance.\n * @param {import("../proj.js").TransformFunction} [opt_transform] Optional transform function.\n * @return {Geometry} Simplified geometry.\n */\n\n\n Geometry.prototype.simplifyTransformed = function (squaredTolerance, opt_transform) {\n return this.simplifyTransformedInternal(this.getRevision(), squaredTolerance, opt_transform);\n };\n /**\n * Make a complete copy of the geometry.\n * @abstract\n * @return {!Geometry} Clone.\n */\n\n\n Geometry.prototype.clone = function () {\n return util_abstract();\n };\n /**\n * @abstract\n * @param {number} x X.\n * @param {number} y Y.\n * @param {import("../coordinate.js").Coordinate} closestPoint Closest point.\n * @param {number} minSquaredDistance Minimum squared distance.\n * @return {number} Minimum squared distance.\n */\n\n\n Geometry.prototype.closestPointXY = function (x, y, closestPoint, minSquaredDistance) {\n return util_abstract();\n };\n /**\n * @param {number} x X.\n * @param {number} y Y.\n * @return {boolean} Contains (x, y).\n */\n\n\n Geometry.prototype.containsXY = function (x, y) {\n var coord = this.getClosestPoint([x, y]);\n return coord[0] === x && coord[1] === y;\n };\n /**\n * Return the closest point of the geometry to the passed point as\n * {@link module:ol/coordinate~Coordinate coordinate}.\n * @param {import("../coordinate.js").Coordinate} point Point.\n * @param {import("../coordinate.js").Coordinate=} opt_closestPoint Closest point.\n * @return {import("../coordinate.js").Coordinate} Closest point.\n * @api\n */\n\n\n Geometry.prototype.getClosestPoint = function (point, opt_closestPoint) {\n var closestPoint = opt_closestPoint ? opt_closestPoint : [NaN, NaN];\n this.closestPointXY(point[0], point[1], closestPoint, Infinity);\n return closestPoint;\n };\n /**\n * Returns true if this geometry includes the specified coordinate. If the\n * coordinate is on the boundary of the geometry, returns false.\n * @param {import("../coordinate.js").Coordinate} coordinate Coordinate.\n * @return {boolean} Contains coordinate.\n * @api\n */\n\n\n Geometry.prototype.intersectsCoordinate = function (coordinate) {\n return this.containsXY(coordinate[0], coordinate[1]);\n };\n /**\n * @abstract\n * @param {import("../extent.js").Extent} extent Extent.\n * @protected\n * @return {import("../extent.js").Extent} extent Extent.\n */\n\n\n Geometry.prototype.computeExtent = function (extent) {\n return util_abstract();\n };\n /**\n * Get the extent of the geometry.\n * @param {import("../extent.js").Extent=} opt_extent Extent.\n * @return {import("../extent.js").Extent} extent Extent.\n * @api\n */\n\n\n Geometry.prototype.getExtent = function (opt_extent) {\n if (this.extentRevision_ != this.getRevision()) {\n var extent = this.computeExtent(this.extent_);\n\n if (isNaN(extent[0]) || isNaN(extent[1])) {\n createOrUpdateEmpty(extent);\n }\n\n this.extentRevision_ = this.getRevision();\n }\n\n return returnOrUpdate(this.extent_, opt_extent);\n };\n /**\n * Rotate the geometry around a given coordinate. This modifies the geometry\n * coordinates in place.\n * @abstract\n * @param {number} angle Rotation angle in radians.\n * @param {import("../coordinate.js").Coordinate} anchor The rotation center.\n * @api\n */\n\n\n Geometry.prototype.rotate = function (angle, anchor) {\n util_abstract();\n };\n /**\n * Scale the geometry (with an optional origin). This modifies the geometry\n * coordinates in place.\n * @abstract\n * @param {number} sx The scaling factor in the x-direction.\n * @param {number=} opt_sy The scaling factor in the y-direction (defaults to sx).\n * @param {import("../coordinate.js").Coordinate=} opt_anchor The scale origin (defaults to the center\n * of the geometry extent).\n * @api\n */\n\n\n Geometry.prototype.scale = function (sx, opt_sy, opt_anchor) {\n util_abstract();\n };\n /**\n * Create a simplified version of this geometry. For linestrings, this uses\n * the [Douglas Peucker](https://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm)\n * algorithm. For polygons, a quantization-based\n * simplification is used to preserve topology.\n * @param {number} tolerance The tolerance distance for simplification.\n * @return {Geometry} A new, simplified version of the original geometry.\n * @api\n */\n\n\n Geometry.prototype.simplify = function (tolerance) {\n return this.getSimplifiedGeometry(tolerance * tolerance);\n };\n /**\n * Create a simplified version of this geometry using the Douglas Peucker\n * algorithm.\n * See https://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm.\n * @abstract\n * @param {number} squaredTolerance Squared tolerance.\n * @return {Geometry} Simplified geometry.\n */\n\n\n Geometry.prototype.getSimplifiedGeometry = function (squaredTolerance) {\n return util_abstract();\n };\n /**\n * Get the type of this geometry.\n * @abstract\n * @return {import("./GeometryType.js").default} Geometry type.\n */\n\n\n Geometry.prototype.getType = function () {\n return util_abstract();\n };\n /**\n * Apply a transform function to the coordinates of the geometry.\n * The geometry is modified in place.\n * If you do not want the geometry modified in place, first `clone()` it and\n * then use this function on the clone.\n * @abstract\n * @param {import("../proj.js").TransformFunction} transformFn Transform function.\n * Called with a flat array of geometry coordinates.\n */\n\n\n Geometry.prototype.applyTransform = function (transformFn) {\n util_abstract();\n };\n /**\n * Test if the geometry and the passed extent intersect.\n * @abstract\n * @param {import("../extent.js").Extent} extent Extent.\n * @return {boolean} `true` if the geometry and the extent intersect.\n */\n\n\n Geometry.prototype.intersectsExtent = function (extent) {\n return util_abstract();\n };\n /**\n * Translate the geometry. This modifies the geometry coordinates in place. If\n * instead you want a new geometry, first `clone()` this geometry.\n * @abstract\n * @param {number} deltaX Delta X.\n * @param {number} deltaY Delta Y.\n * @api\n */\n\n\n Geometry.prototype.translate = function (deltaX, deltaY) {\n util_abstract();\n };\n /**\n * Transform each coordinate of the geometry from one coordinate reference\n * system to another. The geometry is modified in place.\n * For example, a line will be transformed to a line and a circle to a circle.\n * If you do not want the geometry modified in place, first `clone()` it and\n * then use this function on the clone.\n *\n * @param {import("../proj.js").ProjectionLike} source The current projection. Can be a\n * string identifier or a {@link module:ol/proj/Projection~Projection} object.\n * @param {import("../proj.js").ProjectionLike} destination The desired projection. Can be a\n * string identifier or a {@link module:ol/proj/Projection~Projection} object.\n * @return {Geometry} This geometry. Note that original geometry is\n * modified in place.\n * @api\n */\n\n\n Geometry.prototype.transform = function (source, destination) {\n /** @type {import("../proj/Projection.js").default} */\n var sourceProj = proj_get(source);\n var transformFn = sourceProj.getUnits() == proj_Units.TILE_PIXELS ? function (inCoordinates, outCoordinates, stride) {\n var pixelExtent = sourceProj.getExtent();\n var projectedExtent = sourceProj.getWorldExtent();\n var scale = getHeight(projectedExtent) / getHeight(pixelExtent);\n compose(tmpTransform, projectedExtent[0], projectedExtent[3], scale, -scale, 0, 0, 0);\n transform2D(inCoordinates, 0, inCoordinates.length, stride, tmpTransform, outCoordinates);\n return getTransform(sourceProj, destination)(inCoordinates, outCoordinates, stride);\n } : getTransform(sourceProj, destination);\n this.applyTransform(transformFn);\n return this;\n };\n\n return Geometry;\n}(ol_Object);\n\n/* harmony default export */ var geom_Geometry = (Geometry);\n;// CONCATENATED MODULE: ./node_modules/ol/geom/SimpleGeometry.js\nvar SimpleGeometry_extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n/**\n * @module ol/geom/SimpleGeometry\n */\n\n\n\n\n\n\n\n/**\n * @classdesc\n * Abstract base class; only used for creating subclasses; do not instantiate\n * in apps, as cannot be rendered.\n *\n * @abstract\n * @api\n */\n\nvar SimpleGeometry =\n/** @class */\nfunction (_super) {\n SimpleGeometry_extends(SimpleGeometry, _super);\n\n function SimpleGeometry() {\n var _this = _super.call(this) || this;\n /**\n * @protected\n * @type {import("./GeometryLayout.js").default}\n */\n\n\n _this.layout = geom_GeometryLayout.XY;\n /**\n * @protected\n * @type {number}\n */\n\n _this.stride = 2;\n /**\n * @protected\n * @type {Array}\n */\n\n _this.flatCoordinates = null;\n return _this;\n }\n /**\n * @param {import("../extent.js").Extent} extent Extent.\n * @protected\n * @return {import("../extent.js").Extent} extent Extent.\n */\n\n\n SimpleGeometry.prototype.computeExtent = function (extent) {\n return createOrUpdateFromFlatCoordinates(this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, extent);\n };\n /**\n * @abstract\n * @return {Array<*>} Coordinates.\n */\n\n\n SimpleGeometry.prototype.getCoordinates = function () {\n return util_abstract();\n };\n /**\n * Return the first coordinate of the geometry.\n * @return {import("../coordinate.js").Coordinate} First coordinate.\n * @api\n */\n\n\n SimpleGeometry.prototype.getFirstCoordinate = function () {\n return this.flatCoordinates.slice(0, this.stride);\n };\n /**\n * @return {Array} Flat coordinates.\n */\n\n\n SimpleGeometry.prototype.getFlatCoordinates = function () {\n return this.flatCoordinates;\n };\n /**\n * Return the last coordinate of the geometry.\n * @return {import("../coordinate.js").Coordinate} Last point.\n * @api\n */\n\n\n SimpleGeometry.prototype.getLastCoordinate = function () {\n return this.flatCoordinates.slice(this.flatCoordinates.length - this.stride);\n };\n /**\n * Return the {@link module:ol/geom/GeometryLayout layout} of the geometry.\n * @return {import("./GeometryLayout.js").default} Layout.\n * @api\n */\n\n\n SimpleGeometry.prototype.getLayout = function () {\n return this.layout;\n };\n /**\n * Create a simplified version of this geometry using the Douglas Peucker algorithm.\n * @param {number} squaredTolerance Squared tolerance.\n * @return {SimpleGeometry} Simplified geometry.\n */\n\n\n SimpleGeometry.prototype.getSimplifiedGeometry = function (squaredTolerance) {\n if (this.simplifiedGeometryRevision !== this.getRevision()) {\n this.simplifiedGeometryMaxMinSquaredTolerance = 0;\n this.simplifiedGeometryRevision = this.getRevision();\n } // If squaredTolerance is negative or if we know that simplification will not\n // have any effect then just return this.\n\n\n if (squaredTolerance < 0 || this.simplifiedGeometryMaxMinSquaredTolerance !== 0 && squaredTolerance <= this.simplifiedGeometryMaxMinSquaredTolerance) {\n return this;\n }\n\n var simplifiedGeometry = this.getSimplifiedGeometryInternal(squaredTolerance);\n var simplifiedFlatCoordinates = simplifiedGeometry.getFlatCoordinates();\n\n if (simplifiedFlatCoordinates.length < this.flatCoordinates.length) {\n return simplifiedGeometry;\n } else {\n // Simplification did not actually remove any coordinates. We now know\n // that any calls to getSimplifiedGeometry with a squaredTolerance less\n // than or equal to the current squaredTolerance will also not have any\n // effect. This allows us to short circuit simplification (saving CPU\n // cycles) and prevents the cache of simplified geometries from filling\n // up with useless identical copies of this geometry (saving memory).\n this.simplifiedGeometryMaxMinSquaredTolerance = squaredTolerance;\n return this;\n }\n };\n /**\n * @param {number} squaredTolerance Squared tolerance.\n * @return {SimpleGeometry} Simplified geometry.\n * @protected\n */\n\n\n SimpleGeometry.prototype.getSimplifiedGeometryInternal = function (squaredTolerance) {\n return this;\n };\n /**\n * @return {number} Stride.\n */\n\n\n SimpleGeometry.prototype.getStride = function () {\n return this.stride;\n };\n /**\n * @param {import("./GeometryLayout.js").default} layout Layout.\n * @param {Array} flatCoordinates Flat coordinates.\n */\n\n\n SimpleGeometry.prototype.setFlatCoordinates = function (layout, flatCoordinates) {\n this.stride = getStrideForLayout(layout);\n this.layout = layout;\n this.flatCoordinates = flatCoordinates;\n };\n /**\n * @abstract\n * @param {!Array<*>} coordinates Coordinates.\n * @param {import("./GeometryLayout.js").default=} opt_layout Layout.\n */\n\n\n SimpleGeometry.prototype.setCoordinates = function (coordinates, opt_layout) {\n util_abstract();\n };\n /**\n * @param {import("./GeometryLayout.js").default|undefined} layout Layout.\n * @param {Array<*>} coordinates Coordinates.\n * @param {number} nesting Nesting.\n * @protected\n */\n\n\n SimpleGeometry.prototype.setLayout = function (layout, coordinates, nesting) {\n /** @type {number} */\n var stride;\n\n if (layout) {\n stride = getStrideForLayout(layout);\n } else {\n for (var i = 0; i < nesting; ++i) {\n if (coordinates.length === 0) {\n this.layout = geom_GeometryLayout.XY;\n this.stride = 2;\n return;\n } else {\n coordinates =\n /** @type {Array} */\n coordinates[0];\n }\n }\n\n stride = coordinates.length;\n layout = getLayoutForStride(stride);\n }\n\n this.layout = layout;\n this.stride = stride;\n };\n /**\n * Apply a transform function to the coordinates of the geometry.\n * The geometry is modified in place.\n * If you do not want the geometry modified in place, first `clone()` it and\n * then use this function on the clone.\n * @param {import("../proj.js").TransformFunction} transformFn Transform function.\n * Called with a flat array of geometry coordinates.\n * @api\n */\n\n\n SimpleGeometry.prototype.applyTransform = function (transformFn) {\n if (this.flatCoordinates) {\n transformFn(this.flatCoordinates, this.flatCoordinates, this.stride);\n this.changed();\n }\n };\n /**\n * Rotate the geometry around a given coordinate. This modifies the geometry\n * coordinates in place.\n * @param {number} angle Rotation angle in counter-clockwise radians.\n * @param {import("../coordinate.js").Coordinate} anchor The rotation center.\n * @api\n */\n\n\n SimpleGeometry.prototype.rotate = function (angle, anchor) {\n var flatCoordinates = this.getFlatCoordinates();\n\n if (flatCoordinates) {\n var stride = this.getStride();\n transform_rotate(flatCoordinates, 0, flatCoordinates.length, stride, angle, anchor, flatCoordinates);\n this.changed();\n }\n };\n /**\n * Scale the geometry (with an optional origin). This modifies the geometry\n * coordinates in place.\n * @param {number} sx The scaling factor in the x-direction.\n * @param {number=} opt_sy The scaling factor in the y-direction (defaults to sx).\n * @param {import("../coordinate.js").Coordinate=} opt_anchor The scale origin (defaults to the center\n * of the geometry extent).\n * @api\n */\n\n\n SimpleGeometry.prototype.scale = function (sx, opt_sy, opt_anchor) {\n var sy = opt_sy;\n\n if (sy === undefined) {\n sy = sx;\n }\n\n var anchor = opt_anchor;\n\n if (!anchor) {\n anchor = getCenter(this.getExtent());\n }\n\n var flatCoordinates = this.getFlatCoordinates();\n\n if (flatCoordinates) {\n var stride = this.getStride();\n transform_scale(flatCoordinates, 0, flatCoordinates.length, stride, sx, sy, anchor, flatCoordinates);\n this.changed();\n }\n };\n /**\n * Translate the geometry. This modifies the geometry coordinates in place. If\n * instead you want a new geometry, first `clone()` this geometry.\n * @param {number} deltaX Delta X.\n * @param {number} deltaY Delta Y.\n * @api\n */\n\n\n SimpleGeometry.prototype.translate = function (deltaX, deltaY) {\n var flatCoordinates = this.getFlatCoordinates();\n\n if (flatCoordinates) {\n var stride = this.getStride();\n transform_translate(flatCoordinates, 0, flatCoordinates.length, stride, deltaX, deltaY, flatCoordinates);\n this.changed();\n }\n };\n\n return SimpleGeometry;\n}(geom_Geometry);\n/**\n * @param {number} stride Stride.\n * @return {import("./GeometryLayout.js").default} layout Layout.\n */\n\n\nfunction getLayoutForStride(stride) {\n var layout;\n\n if (stride == 2) {\n layout = geom_GeometryLayout.XY;\n } else if (stride == 3) {\n layout = geom_GeometryLayout.XYZ;\n } else if (stride == 4) {\n layout = geom_GeometryLayout.XYZM;\n }\n\n return (\n /** @type {import("./GeometryLayout.js").default} */\n layout\n );\n}\n/**\n * @param {import("./GeometryLayout.js").default} layout Layout.\n * @return {number} Stride.\n */\n\n\nfunction getStrideForLayout(layout) {\n var stride;\n\n if (layout == geom_GeometryLayout.XY) {\n stride = 2;\n } else if (layout == geom_GeometryLayout.XYZ || layout == geom_GeometryLayout.XYM) {\n stride = 3;\n } else if (layout == geom_GeometryLayout.XYZM) {\n stride = 4;\n }\n\n return (\n /** @type {number} */\n stride\n );\n}\n/**\n * @param {SimpleGeometry} simpleGeometry Simple geometry.\n * @param {import("../transform.js").Transform} transform Transform.\n * @param {Array=} opt_dest Destination.\n * @return {Array} Transformed flat coordinates.\n */\n\nfunction transformGeom2D(simpleGeometry, transform, opt_dest) {\n var flatCoordinates = simpleGeometry.getFlatCoordinates();\n\n if (!flatCoordinates) {\n return null;\n } else {\n var stride = simpleGeometry.getStride();\n return transform2D(flatCoordinates, 0, flatCoordinates.length, stride, transform, opt_dest);\n }\n}\n/* harmony default export */ var geom_SimpleGeometry = (SimpleGeometry);\n;// CONCATENATED MODULE: ./node_modules/ol/geom/flat/closest.js\n/**\n * @module ol/geom/flat/closest\n */\n\n/**\n * Returns the point on the 2D line segment flatCoordinates[offset1] to\n * flatCoordinates[offset2] that is closest to the point (x, y). Extra\n * dimensions are linearly interpolated.\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset1 Offset 1.\n * @param {number} offset2 Offset 2.\n * @param {number} stride Stride.\n * @param {number} x X.\n * @param {number} y Y.\n * @param {Array} closestPoint Closest point.\n */\n\nfunction assignClosest(flatCoordinates, offset1, offset2, stride, x, y, closestPoint) {\n var x1 = flatCoordinates[offset1];\n var y1 = flatCoordinates[offset1 + 1];\n var dx = flatCoordinates[offset2] - x1;\n var dy = flatCoordinates[offset2 + 1] - y1;\n var offset;\n\n if (dx === 0 && dy === 0) {\n offset = offset1;\n } else {\n var t = ((x - x1) * dx + (y - y1) * dy) / (dx * dx + dy * dy);\n\n if (t > 1) {\n offset = offset2;\n } else if (t > 0) {\n for (var i = 0; i < stride; ++i) {\n closestPoint[i] = lerp(flatCoordinates[offset1 + i], flatCoordinates[offset2 + i], t);\n }\n\n closestPoint.length = stride;\n return;\n } else {\n offset = offset1;\n }\n }\n\n for (var i = 0; i < stride; ++i) {\n closestPoint[i] = flatCoordinates[offset + i];\n }\n\n closestPoint.length = stride;\n}\n/**\n * Return the squared of the largest distance between any pair of consecutive\n * coordinates.\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {number} max Max squared delta.\n * @return {number} Max squared delta.\n */\n\n\nfunction maxSquaredDelta(flatCoordinates, offset, end, stride, max) {\n var x1 = flatCoordinates[offset];\n var y1 = flatCoordinates[offset + 1];\n\n for (offset += stride; offset < end; offset += stride) {\n var x2 = flatCoordinates[offset];\n var y2 = flatCoordinates[offset + 1];\n var squaredDelta = math_squaredDistance(x1, y1, x2, y2);\n\n if (squaredDelta > max) {\n max = squaredDelta;\n }\n\n x1 = x2;\n y1 = y2;\n }\n\n return max;\n}\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} ends Ends.\n * @param {number} stride Stride.\n * @param {number} max Max squared delta.\n * @return {number} Max squared delta.\n */\n\nfunction arrayMaxSquaredDelta(flatCoordinates, offset, ends, stride, max) {\n for (var i = 0, ii = ends.length; i < ii; ++i) {\n var end = ends[i];\n max = maxSquaredDelta(flatCoordinates, offset, end, stride, max);\n offset = end;\n }\n\n return max;\n}\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array>} endss Endss.\n * @param {number} stride Stride.\n * @param {number} max Max squared delta.\n * @return {number} Max squared delta.\n */\n\nfunction multiArrayMaxSquaredDelta(flatCoordinates, offset, endss, stride, max) {\n for (var i = 0, ii = endss.length; i < ii; ++i) {\n var ends = endss[i];\n max = arrayMaxSquaredDelta(flatCoordinates, offset, ends, stride, max);\n offset = ends[ends.length - 1];\n }\n\n return max;\n}\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {number} maxDelta Max delta.\n * @param {boolean} isRing Is ring.\n * @param {number} x X.\n * @param {number} y Y.\n * @param {Array} closestPoint Closest point.\n * @param {number} minSquaredDistance Minimum squared distance.\n * @param {Array=} opt_tmpPoint Temporary point object.\n * @return {number} Minimum squared distance.\n */\n\nfunction assignClosestPoint(flatCoordinates, offset, end, stride, maxDelta, isRing, x, y, closestPoint, minSquaredDistance, opt_tmpPoint) {\n if (offset == end) {\n return minSquaredDistance;\n }\n\n var i, squaredDistance;\n\n if (maxDelta === 0) {\n // All points are identical, so just test the first point.\n squaredDistance = math_squaredDistance(x, y, flatCoordinates[offset], flatCoordinates[offset + 1]);\n\n if (squaredDistance < minSquaredDistance) {\n for (i = 0; i < stride; ++i) {\n closestPoint[i] = flatCoordinates[offset + i];\n }\n\n closestPoint.length = stride;\n return squaredDistance;\n } else {\n return minSquaredDistance;\n }\n }\n\n var tmpPoint = opt_tmpPoint ? opt_tmpPoint : [NaN, NaN];\n var index = offset + stride;\n\n while (index < end) {\n assignClosest(flatCoordinates, index - stride, index, stride, x, y, tmpPoint);\n squaredDistance = math_squaredDistance(x, y, tmpPoint[0], tmpPoint[1]);\n\n if (squaredDistance < minSquaredDistance) {\n minSquaredDistance = squaredDistance;\n\n for (i = 0; i < stride; ++i) {\n closestPoint[i] = tmpPoint[i];\n }\n\n closestPoint.length = stride;\n index += stride;\n } else {\n // Skip ahead multiple points, because we know that all the skipped\n // points cannot be any closer than the closest point we have found so\n // far. We know this because we know how close the current point is, how\n // close the closest point we have found so far is, and the maximum\n // distance between consecutive points. For example, if we\'re currently\n // at distance 10, the best we\'ve found so far is 3, and that the maximum\n // distance between consecutive points is 2, then we\'ll need to skip at\n // least (10 - 3) / 2 == 3 (rounded down) points to have any chance of\n // finding a closer point. We use Math.max(..., 1) to ensure that we\n // always advance at least one point, to avoid an infinite loop.\n index += stride * Math.max((Math.sqrt(squaredDistance) - Math.sqrt(minSquaredDistance)) / maxDelta | 0, 1);\n }\n }\n\n if (isRing) {\n // Check the closing segment.\n assignClosest(flatCoordinates, end - stride, offset, stride, x, y, tmpPoint);\n squaredDistance = math_squaredDistance(x, y, tmpPoint[0], tmpPoint[1]);\n\n if (squaredDistance < minSquaredDistance) {\n minSquaredDistance = squaredDistance;\n\n for (i = 0; i < stride; ++i) {\n closestPoint[i] = tmpPoint[i];\n }\n\n closestPoint.length = stride;\n }\n }\n\n return minSquaredDistance;\n}\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} ends Ends.\n * @param {number} stride Stride.\n * @param {number} maxDelta Max delta.\n * @param {boolean} isRing Is ring.\n * @param {number} x X.\n * @param {number} y Y.\n * @param {Array} closestPoint Closest point.\n * @param {number} minSquaredDistance Minimum squared distance.\n * @param {Array=} opt_tmpPoint Temporary point object.\n * @return {number} Minimum squared distance.\n */\n\nfunction assignClosestArrayPoint(flatCoordinates, offset, ends, stride, maxDelta, isRing, x, y, closestPoint, minSquaredDistance, opt_tmpPoint) {\n var tmpPoint = opt_tmpPoint ? opt_tmpPoint : [NaN, NaN];\n\n for (var i = 0, ii = ends.length; i < ii; ++i) {\n var end = ends[i];\n minSquaredDistance = assignClosestPoint(flatCoordinates, offset, end, stride, maxDelta, isRing, x, y, closestPoint, minSquaredDistance, tmpPoint);\n offset = end;\n }\n\n return minSquaredDistance;\n}\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array>} endss Endss.\n * @param {number} stride Stride.\n * @param {number} maxDelta Max delta.\n * @param {boolean} isRing Is ring.\n * @param {number} x X.\n * @param {number} y Y.\n * @param {Array} closestPoint Closest point.\n * @param {number} minSquaredDistance Minimum squared distance.\n * @param {Array=} opt_tmpPoint Temporary point object.\n * @return {number} Minimum squared distance.\n */\n\nfunction assignClosestMultiArrayPoint(flatCoordinates, offset, endss, stride, maxDelta, isRing, x, y, closestPoint, minSquaredDistance, opt_tmpPoint) {\n var tmpPoint = opt_tmpPoint ? opt_tmpPoint : [NaN, NaN];\n\n for (var i = 0, ii = endss.length; i < ii; ++i) {\n var ends = endss[i];\n minSquaredDistance = assignClosestArrayPoint(flatCoordinates, offset, ends, stride, maxDelta, isRing, x, y, closestPoint, minSquaredDistance, tmpPoint);\n offset = ends[ends.length - 1];\n }\n\n return minSquaredDistance;\n}\n;// CONCATENATED MODULE: ./node_modules/ol/geom/flat/deflate.js\n/**\n * @module ol/geom/flat/deflate\n */\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {import("../../coordinate.js").Coordinate} coordinate Coordinate.\n * @param {number} stride Stride.\n * @return {number} offset Offset.\n */\nfunction deflateCoordinate(flatCoordinates, offset, coordinate, stride) {\n for (var i = 0, ii = coordinate.length; i < ii; ++i) {\n flatCoordinates[offset++] = coordinate[i];\n }\n\n return offset;\n}\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} coordinates Coordinates.\n * @param {number} stride Stride.\n * @return {number} offset Offset.\n */\n\nfunction deflateCoordinates(flatCoordinates, offset, coordinates, stride) {\n for (var i = 0, ii = coordinates.length; i < ii; ++i) {\n var coordinate = coordinates[i];\n\n for (var j = 0; j < stride; ++j) {\n flatCoordinates[offset++] = coordinate[j];\n }\n }\n\n return offset;\n}\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array>} coordinatess Coordinatess.\n * @param {number} stride Stride.\n * @param {Array=} opt_ends Ends.\n * @return {Array} Ends.\n */\n\nfunction deflateCoordinatesArray(flatCoordinates, offset, coordinatess, stride, opt_ends) {\n var ends = opt_ends ? opt_ends : [];\n var i = 0;\n\n for (var j = 0, jj = coordinatess.length; j < jj; ++j) {\n var end = deflateCoordinates(flatCoordinates, offset, coordinatess[j], stride);\n ends[i++] = end;\n offset = end;\n }\n\n ends.length = i;\n return ends;\n}\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array>>} coordinatesss Coordinatesss.\n * @param {number} stride Stride.\n * @param {Array>=} opt_endss Endss.\n * @return {Array>} Endss.\n */\n\nfunction deflateMultiCoordinatesArray(flatCoordinates, offset, coordinatesss, stride, opt_endss) {\n var endss = opt_endss ? opt_endss : [];\n var i = 0;\n\n for (var j = 0, jj = coordinatesss.length; j < jj; ++j) {\n var ends = deflateCoordinatesArray(flatCoordinates, offset, coordinatesss[j], stride, endss[i]);\n endss[i++] = ends;\n offset = ends[ends.length - 1];\n }\n\n endss.length = i;\n return endss;\n}\n;// CONCATENATED MODULE: ./node_modules/ol/geom/flat/simplify.js\n/**\n * @module ol/geom/flat/simplify\n */\n// Based on simplify-js https://github.com/mourner/simplify-js\n// Copyright (c) 2012, Vladimir Agafonkin\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are met:\n//\n// 1. Redistributions of source code must retain the above copyright notice,\n// this list of conditions and the following disclaimer.\n//\n// 2. Redistributions in binary form must reproduce the above copyright\n// notice, this list of conditions and the following disclaimer in the\n// documentation and/or other materials provided with the distribution.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"\n// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {number} squaredTolerance Squared tolerance.\n * @param {boolean} highQuality Highest quality.\n * @param {Array=} opt_simplifiedFlatCoordinates Simplified flat\n * coordinates.\n * @return {Array} Simplified line string.\n */\n\nfunction simplifyLineString(flatCoordinates, offset, end, stride, squaredTolerance, highQuality, opt_simplifiedFlatCoordinates) {\n var simplifiedFlatCoordinates = opt_simplifiedFlatCoordinates !== undefined ? opt_simplifiedFlatCoordinates : [];\n\n if (!highQuality) {\n end = radialDistance(flatCoordinates, offset, end, stride, squaredTolerance, simplifiedFlatCoordinates, 0);\n flatCoordinates = simplifiedFlatCoordinates;\n offset = 0;\n stride = 2;\n }\n\n simplifiedFlatCoordinates.length = douglasPeucker(flatCoordinates, offset, end, stride, squaredTolerance, simplifiedFlatCoordinates, 0);\n return simplifiedFlatCoordinates;\n}\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {number} squaredTolerance Squared tolerance.\n * @param {Array} simplifiedFlatCoordinates Simplified flat\n * coordinates.\n * @param {number} simplifiedOffset Simplified offset.\n * @return {number} Simplified offset.\n */\n\nfunction douglasPeucker(flatCoordinates, offset, end, stride, squaredTolerance, simplifiedFlatCoordinates, simplifiedOffset) {\n var n = (end - offset) / stride;\n\n if (n < 3) {\n for (; offset < end; offset += stride) {\n simplifiedFlatCoordinates[simplifiedOffset++] = flatCoordinates[offset];\n simplifiedFlatCoordinates[simplifiedOffset++] = flatCoordinates[offset + 1];\n }\n\n return simplifiedOffset;\n }\n /** @type {Array} */\n\n\n var markers = new Array(n);\n markers[0] = 1;\n markers[n - 1] = 1;\n /** @type {Array} */\n\n var stack = [offset, end - stride];\n var index = 0;\n\n while (stack.length > 0) {\n var last = stack.pop();\n var first = stack.pop();\n var maxSquaredDistance = 0;\n var x1 = flatCoordinates[first];\n var y1 = flatCoordinates[first + 1];\n var x2 = flatCoordinates[last];\n var y2 = flatCoordinates[last + 1];\n\n for (var i = first + stride; i < last; i += stride) {\n var x = flatCoordinates[i];\n var y = flatCoordinates[i + 1];\n var squaredDistance_1 = squaredSegmentDistance(x, y, x1, y1, x2, y2);\n\n if (squaredDistance_1 > maxSquaredDistance) {\n index = i;\n maxSquaredDistance = squaredDistance_1;\n }\n }\n\n if (maxSquaredDistance > squaredTolerance) {\n markers[(index - offset) / stride] = 1;\n\n if (first + stride < index) {\n stack.push(first, index);\n }\n\n if (index + stride < last) {\n stack.push(index, last);\n }\n }\n }\n\n for (var i = 0; i < n; ++i) {\n if (markers[i]) {\n simplifiedFlatCoordinates[simplifiedOffset++] = flatCoordinates[offset + i * stride];\n simplifiedFlatCoordinates[simplifiedOffset++] = flatCoordinates[offset + i * stride + 1];\n }\n }\n\n return simplifiedOffset;\n}\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} ends Ends.\n * @param {number} stride Stride.\n * @param {number} squaredTolerance Squared tolerance.\n * @param {Array} simplifiedFlatCoordinates Simplified flat\n * coordinates.\n * @param {number} simplifiedOffset Simplified offset.\n * @param {Array} simplifiedEnds Simplified ends.\n * @return {number} Simplified offset.\n */\n\nfunction douglasPeuckerArray(flatCoordinates, offset, ends, stride, squaredTolerance, simplifiedFlatCoordinates, simplifiedOffset, simplifiedEnds) {\n for (var i = 0, ii = ends.length; i < ii; ++i) {\n var end = ends[i];\n simplifiedOffset = douglasPeucker(flatCoordinates, offset, end, stride, squaredTolerance, simplifiedFlatCoordinates, simplifiedOffset);\n simplifiedEnds.push(simplifiedOffset);\n offset = end;\n }\n\n return simplifiedOffset;\n}\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array>} endss Endss.\n * @param {number} stride Stride.\n * @param {number} squaredTolerance Squared tolerance.\n * @param {Array} simplifiedFlatCoordinates Simplified flat\n * coordinates.\n * @param {number} simplifiedOffset Simplified offset.\n * @param {Array>} simplifiedEndss Simplified endss.\n * @return {number} Simplified offset.\n */\n\nfunction douglasPeuckerMultiArray(flatCoordinates, offset, endss, stride, squaredTolerance, simplifiedFlatCoordinates, simplifiedOffset, simplifiedEndss) {\n for (var i = 0, ii = endss.length; i < ii; ++i) {\n var ends = endss[i];\n var simplifiedEnds = [];\n simplifiedOffset = douglasPeuckerArray(flatCoordinates, offset, ends, stride, squaredTolerance, simplifiedFlatCoordinates, simplifiedOffset, simplifiedEnds);\n simplifiedEndss.push(simplifiedEnds);\n offset = ends[ends.length - 1];\n }\n\n return simplifiedOffset;\n}\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {number} squaredTolerance Squared tolerance.\n * @param {Array} simplifiedFlatCoordinates Simplified flat\n * coordinates.\n * @param {number} simplifiedOffset Simplified offset.\n * @return {number} Simplified offset.\n */\n\nfunction radialDistance(flatCoordinates, offset, end, stride, squaredTolerance, simplifiedFlatCoordinates, simplifiedOffset) {\n if (end <= offset + stride) {\n // zero or one point, no simplification possible, so copy and return\n for (; offset < end; offset += stride) {\n simplifiedFlatCoordinates[simplifiedOffset++] = flatCoordinates[offset];\n simplifiedFlatCoordinates[simplifiedOffset++] = flatCoordinates[offset + 1];\n }\n\n return simplifiedOffset;\n }\n\n var x1 = flatCoordinates[offset];\n var y1 = flatCoordinates[offset + 1]; // copy first point\n\n simplifiedFlatCoordinates[simplifiedOffset++] = x1;\n simplifiedFlatCoordinates[simplifiedOffset++] = y1;\n var x2 = x1;\n var y2 = y1;\n\n for (offset += stride; offset < end; offset += stride) {\n x2 = flatCoordinates[offset];\n y2 = flatCoordinates[offset + 1];\n\n if (squaredDistance(x1, y1, x2, y2) > squaredTolerance) {\n // copy point at offset\n simplifiedFlatCoordinates[simplifiedOffset++] = x2;\n simplifiedFlatCoordinates[simplifiedOffset++] = y2;\n x1 = x2;\n y1 = y2;\n }\n }\n\n if (x2 != x1 || y2 != y1) {\n // copy last point\n simplifiedFlatCoordinates[simplifiedOffset++] = x2;\n simplifiedFlatCoordinates[simplifiedOffset++] = y2;\n }\n\n return simplifiedOffset;\n}\n/**\n * @param {number} value Value.\n * @param {number} tolerance Tolerance.\n * @return {number} Rounded value.\n */\n\nfunction snap(value, tolerance) {\n return tolerance * Math.round(value / tolerance);\n}\n/**\n * Simplifies a line string using an algorithm designed by Tim Schaub.\n * Coordinates are snapped to the nearest value in a virtual grid and\n * consecutive duplicate coordinates are discarded. This effectively preserves\n * topology as the simplification of any subsection of a line string is\n * independent of the rest of the line string. This means that, for examples,\n * the common edge between two polygons will be simplified to the same line\n * string independently in both polygons. This implementation uses a single\n * pass over the coordinates and eliminates intermediate collinear points.\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {number} tolerance Tolerance.\n * @param {Array} simplifiedFlatCoordinates Simplified flat\n * coordinates.\n * @param {number} simplifiedOffset Simplified offset.\n * @return {number} Simplified offset.\n */\n\nfunction quantize(flatCoordinates, offset, end, stride, tolerance, simplifiedFlatCoordinates, simplifiedOffset) {\n // do nothing if the line is empty\n if (offset == end) {\n return simplifiedOffset;\n } // snap the first coordinate (P1)\n\n\n var x1 = snap(flatCoordinates[offset], tolerance);\n var y1 = snap(flatCoordinates[offset + 1], tolerance);\n offset += stride; // add the first coordinate to the output\n\n simplifiedFlatCoordinates[simplifiedOffset++] = x1;\n simplifiedFlatCoordinates[simplifiedOffset++] = y1; // find the next coordinate that does not snap to the same value as the first\n // coordinate (P2)\n\n var x2, y2;\n\n do {\n x2 = snap(flatCoordinates[offset], tolerance);\n y2 = snap(flatCoordinates[offset + 1], tolerance);\n offset += stride;\n\n if (offset == end) {\n // all coordinates snap to the same value, the line collapses to a point\n // push the last snapped value anyway to ensure that the output contains\n // at least two points\n // FIXME should we really return at least two points anyway?\n simplifiedFlatCoordinates[simplifiedOffset++] = x2;\n simplifiedFlatCoordinates[simplifiedOffset++] = y2;\n return simplifiedOffset;\n }\n } while (x2 == x1 && y2 == y1);\n\n while (offset < end) {\n // snap the next coordinate (P3)\n var x3 = snap(flatCoordinates[offset], tolerance);\n var y3 = snap(flatCoordinates[offset + 1], tolerance);\n offset += stride; // skip P3 if it is equal to P2\n\n if (x3 == x2 && y3 == y2) {\n continue;\n } // calculate the delta between P1 and P2\n\n\n var dx1 = x2 - x1;\n var dy1 = y2 - y1; // calculate the delta between P3 and P1\n\n var dx2 = x3 - x1;\n var dy2 = y3 - y1; // if P1, P2, and P3 are colinear and P3 is further from P1 than P2 is from\n // P1 in the same direction then P2 is on the straight line between P1 and\n // P3\n\n if (dx1 * dy2 == dy1 * dx2 && (dx1 < 0 && dx2 < dx1 || dx1 == dx2 || dx1 > 0 && dx2 > dx1) && (dy1 < 0 && dy2 < dy1 || dy1 == dy2 || dy1 > 0 && dy2 > dy1)) {\n // discard P2 and set P2 = P3\n x2 = x3;\n y2 = y3;\n continue;\n } // either P1, P2, and P3 are not colinear, or they are colinear but P3 is\n // between P3 and P1 or on the opposite half of the line to P2. add P2,\n // and continue with P1 = P2 and P2 = P3\n\n\n simplifiedFlatCoordinates[simplifiedOffset++] = x2;\n simplifiedFlatCoordinates[simplifiedOffset++] = y2;\n x1 = x2;\n y1 = y2;\n x2 = x3;\n y2 = y3;\n } // add the last point (P2)\n\n\n simplifiedFlatCoordinates[simplifiedOffset++] = x2;\n simplifiedFlatCoordinates[simplifiedOffset++] = y2;\n return simplifiedOffset;\n}\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} ends Ends.\n * @param {number} stride Stride.\n * @param {number} tolerance Tolerance.\n * @param {Array} simplifiedFlatCoordinates Simplified flat\n * coordinates.\n * @param {number} simplifiedOffset Simplified offset.\n * @param {Array} simplifiedEnds Simplified ends.\n * @return {number} Simplified offset.\n */\n\nfunction quantizeArray(flatCoordinates, offset, ends, stride, tolerance, simplifiedFlatCoordinates, simplifiedOffset, simplifiedEnds) {\n for (var i = 0, ii = ends.length; i < ii; ++i) {\n var end = ends[i];\n simplifiedOffset = quantize(flatCoordinates, offset, end, stride, tolerance, simplifiedFlatCoordinates, simplifiedOffset);\n simplifiedEnds.push(simplifiedOffset);\n offset = end;\n }\n\n return simplifiedOffset;\n}\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array>} endss Endss.\n * @param {number} stride Stride.\n * @param {number} tolerance Tolerance.\n * @param {Array} simplifiedFlatCoordinates Simplified flat\n * coordinates.\n * @param {number} simplifiedOffset Simplified offset.\n * @param {Array>} simplifiedEndss Simplified endss.\n * @return {number} Simplified offset.\n */\n\nfunction quantizeMultiArray(flatCoordinates, offset, endss, stride, tolerance, simplifiedFlatCoordinates, simplifiedOffset, simplifiedEndss) {\n for (var i = 0, ii = endss.length; i < ii; ++i) {\n var ends = endss[i];\n var simplifiedEnds = [];\n simplifiedOffset = quantizeArray(flatCoordinates, offset, ends, stride, tolerance, simplifiedFlatCoordinates, simplifiedOffset, simplifiedEnds);\n simplifiedEndss.push(simplifiedEnds);\n offset = ends[ends.length - 1];\n }\n\n return simplifiedOffset;\n}\n;// CONCATENATED MODULE: ./node_modules/ol/geom/flat/inflate.js\n/**\n * @module ol/geom/flat/inflate\n */\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {Array=} opt_coordinates Coordinates.\n * @return {Array} Coordinates.\n */\nfunction inflateCoordinates(flatCoordinates, offset, end, stride, opt_coordinates) {\n var coordinates = opt_coordinates !== undefined ? opt_coordinates : [];\n var i = 0;\n\n for (var j = offset; j < end; j += stride) {\n coordinates[i++] = flatCoordinates.slice(j, j + stride);\n }\n\n coordinates.length = i;\n return coordinates;\n}\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} ends Ends.\n * @param {number} stride Stride.\n * @param {Array>=} opt_coordinatess Coordinatess.\n * @return {Array>} Coordinatess.\n */\n\nfunction inflateCoordinatesArray(flatCoordinates, offset, ends, stride, opt_coordinatess) {\n var coordinatess = opt_coordinatess !== undefined ? opt_coordinatess : [];\n var i = 0;\n\n for (var j = 0, jj = ends.length; j < jj; ++j) {\n var end = ends[j];\n coordinatess[i++] = inflateCoordinates(flatCoordinates, offset, end, stride, coordinatess[i]);\n offset = end;\n }\n\n coordinatess.length = i;\n return coordinatess;\n}\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array>} endss Endss.\n * @param {number} stride Stride.\n * @param {Array>>=} opt_coordinatesss\n * Coordinatesss.\n * @return {Array>>} Coordinatesss.\n */\n\nfunction inflateMultiCoordinatesArray(flatCoordinates, offset, endss, stride, opt_coordinatesss) {\n var coordinatesss = opt_coordinatesss !== undefined ? opt_coordinatesss : [];\n var i = 0;\n\n for (var j = 0, jj = endss.length; j < jj; ++j) {\n var ends = endss[j];\n coordinatesss[i++] = inflateCoordinatesArray(flatCoordinates, offset, ends, stride, coordinatesss[i]);\n offset = ends[ends.length - 1];\n }\n\n coordinatesss.length = i;\n return coordinatesss;\n}\n;// CONCATENATED MODULE: ./node_modules/ol/geom/flat/area.js\n/**\n * @module ol/geom/flat/area\n */\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @return {number} Area.\n */\nfunction linearRing(flatCoordinates, offset, end, stride) {\n var twiceArea = 0;\n var x1 = flatCoordinates[end - stride];\n var y1 = flatCoordinates[end - stride + 1];\n\n for (; offset < end; offset += stride) {\n var x2 = flatCoordinates[offset];\n var y2 = flatCoordinates[offset + 1];\n twiceArea += y1 * x2 - x1 * y2;\n x1 = x2;\n y1 = y2;\n }\n\n return twiceArea / 2;\n}\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} ends Ends.\n * @param {number} stride Stride.\n * @return {number} Area.\n */\n\nfunction linearRings(flatCoordinates, offset, ends, stride) {\n var area = 0;\n\n for (var i = 0, ii = ends.length; i < ii; ++i) {\n var end = ends[i];\n area += linearRing(flatCoordinates, offset, end, stride);\n offset = end;\n }\n\n return area;\n}\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array>} endss Endss.\n * @param {number} stride Stride.\n * @return {number} Area.\n */\n\nfunction linearRingss(flatCoordinates, offset, endss, stride) {\n var area = 0;\n\n for (var i = 0, ii = endss.length; i < ii; ++i) {\n var ends = endss[i];\n area += linearRings(flatCoordinates, offset, ends, stride);\n offset = ends[ends.length - 1];\n }\n\n return area;\n}\n;// CONCATENATED MODULE: ./node_modules/ol/geom/LinearRing.js\nvar LinearRing_extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n/**\n * @module ol/geom/LinearRing\n */\n\n\n\n\n\n\n\n\n\n\n\n/**\n * @classdesc\n * Linear ring geometry. Only used as part of polygon; cannot be rendered\n * on its own.\n *\n * @api\n */\n\nvar LinearRing =\n/** @class */\nfunction (_super) {\n LinearRing_extends(LinearRing, _super);\n /**\n * @param {Array|Array} coordinates Coordinates.\n * For internal use, flat coordinates in combination with `opt_layout` are also accepted.\n * @param {import("./GeometryLayout.js").default=} opt_layout Layout.\n */\n\n\n function LinearRing(coordinates, opt_layout) {\n var _this = _super.call(this) || this;\n /**\n * @private\n * @type {number}\n */\n\n\n _this.maxDelta_ = -1;\n /**\n * @private\n * @type {number}\n */\n\n _this.maxDeltaRevision_ = -1;\n\n if (opt_layout !== undefined && !Array.isArray(coordinates[0])) {\n _this.setFlatCoordinates(opt_layout,\n /** @type {Array} */\n coordinates);\n } else {\n _this.setCoordinates(\n /** @type {Array} */\n coordinates, opt_layout);\n }\n\n return _this;\n }\n /**\n * Make a complete copy of the geometry.\n * @return {!LinearRing} Clone.\n * @api\n */\n\n\n LinearRing.prototype.clone = function () {\n return new LinearRing(this.flatCoordinates.slice(), this.layout);\n };\n /**\n * @param {number} x X.\n * @param {number} y Y.\n * @param {import("../coordinate.js").Coordinate} closestPoint Closest point.\n * @param {number} minSquaredDistance Minimum squared distance.\n * @return {number} Minimum squared distance.\n */\n\n\n LinearRing.prototype.closestPointXY = function (x, y, closestPoint, minSquaredDistance) {\n if (minSquaredDistance < closestSquaredDistanceXY(this.getExtent(), x, y)) {\n return minSquaredDistance;\n }\n\n if (this.maxDeltaRevision_ != this.getRevision()) {\n this.maxDelta_ = Math.sqrt(maxSquaredDelta(this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, 0));\n this.maxDeltaRevision_ = this.getRevision();\n }\n\n return assignClosestPoint(this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, this.maxDelta_, true, x, y, closestPoint, minSquaredDistance);\n };\n /**\n * Return the area of the linear ring on projected plane.\n * @return {number} Area (on projected plane).\n * @api\n */\n\n\n LinearRing.prototype.getArea = function () {\n return linearRing(this.flatCoordinates, 0, this.flatCoordinates.length, this.stride);\n };\n /**\n * Return the coordinates of the linear ring.\n * @return {Array} Coordinates.\n * @api\n */\n\n\n LinearRing.prototype.getCoordinates = function () {\n return inflateCoordinates(this.flatCoordinates, 0, this.flatCoordinates.length, this.stride);\n };\n /**\n * @param {number} squaredTolerance Squared tolerance.\n * @return {LinearRing} Simplified LinearRing.\n * @protected\n */\n\n\n LinearRing.prototype.getSimplifiedGeometryInternal = function (squaredTolerance) {\n var simplifiedFlatCoordinates = [];\n simplifiedFlatCoordinates.length = douglasPeucker(this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, squaredTolerance, simplifiedFlatCoordinates, 0);\n return new LinearRing(simplifiedFlatCoordinates, geom_GeometryLayout.XY);\n };\n /**\n * Get the type of this geometry.\n * @return {import("./GeometryType.js").default} Geometry type.\n * @api\n */\n\n\n LinearRing.prototype.getType = function () {\n return geom_GeometryType.LINEAR_RING;\n };\n /**\n * Test if the geometry and the passed extent intersect.\n * @param {import("../extent.js").Extent} extent Extent.\n * @return {boolean} `true` if the geometry and the extent intersect.\n * @api\n */\n\n\n LinearRing.prototype.intersectsExtent = function (extent) {\n return false;\n };\n /**\n * Set the coordinates of the linear ring.\n * @param {!Array} coordinates Coordinates.\n * @param {import("./GeometryLayout.js").default=} opt_layout Layout.\n * @api\n */\n\n\n LinearRing.prototype.setCoordinates = function (coordinates, opt_layout) {\n this.setLayout(opt_layout, coordinates, 1);\n\n if (!this.flatCoordinates) {\n this.flatCoordinates = [];\n }\n\n this.flatCoordinates.length = deflateCoordinates(this.flatCoordinates, 0, coordinates, this.stride);\n this.changed();\n };\n\n return LinearRing;\n}(geom_SimpleGeometry);\n\n/* harmony default export */ var geom_LinearRing = (LinearRing);\n;// CONCATENATED MODULE: ./node_modules/ol/geom/Point.js\nvar Point_extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n/**\n * @module ol/geom/Point\n */\n\n\n\n\n\n\n\n/**\n * @classdesc\n * Point geometry.\n *\n * @api\n */\n\nvar Point =\n/** @class */\nfunction (_super) {\n Point_extends(Point, _super);\n /**\n * @param {import("../coordinate.js").Coordinate} coordinates Coordinates.\n * @param {import("./GeometryLayout.js").default=} opt_layout Layout.\n */\n\n\n function Point(coordinates, opt_layout) {\n var _this = _super.call(this) || this;\n\n _this.setCoordinates(coordinates, opt_layout);\n\n return _this;\n }\n /**\n * Make a complete copy of the geometry.\n * @return {!Point} Clone.\n * @api\n */\n\n\n Point.prototype.clone = function () {\n var point = new Point(this.flatCoordinates.slice(), this.layout);\n point.applyProperties(this);\n return point;\n };\n /**\n * @param {number} x X.\n * @param {number} y Y.\n * @param {import("../coordinate.js").Coordinate} closestPoint Closest point.\n * @param {number} minSquaredDistance Minimum squared distance.\n * @return {number} Minimum squared distance.\n */\n\n\n Point.prototype.closestPointXY = function (x, y, closestPoint, minSquaredDistance) {\n var flatCoordinates = this.flatCoordinates;\n var squaredDistance = math_squaredDistance(x, y, flatCoordinates[0], flatCoordinates[1]);\n\n if (squaredDistance < minSquaredDistance) {\n var stride = this.stride;\n\n for (var i = 0; i < stride; ++i) {\n closestPoint[i] = flatCoordinates[i];\n }\n\n closestPoint.length = stride;\n return squaredDistance;\n } else {\n return minSquaredDistance;\n }\n };\n /**\n * Return the coordinate of the point.\n * @return {import("../coordinate.js").Coordinate} Coordinates.\n * @api\n */\n\n\n Point.prototype.getCoordinates = function () {\n return !this.flatCoordinates ? [] : this.flatCoordinates.slice();\n };\n /**\n * @param {import("../extent.js").Extent} extent Extent.\n * @protected\n * @return {import("../extent.js").Extent} extent Extent.\n */\n\n\n Point.prototype.computeExtent = function (extent) {\n return createOrUpdateFromCoordinate(this.flatCoordinates, extent);\n };\n /**\n * Get the type of this geometry.\n * @return {import("./GeometryType.js").default} Geometry type.\n * @api\n */\n\n\n Point.prototype.getType = function () {\n return geom_GeometryType.POINT;\n };\n /**\n * Test if the geometry and the passed extent intersect.\n * @param {import("../extent.js").Extent} extent Extent.\n * @return {boolean} `true` if the geometry and the extent intersect.\n * @api\n */\n\n\n Point.prototype.intersectsExtent = function (extent) {\n return containsXY(extent, this.flatCoordinates[0], this.flatCoordinates[1]);\n };\n /**\n * @param {!Array<*>} coordinates Coordinates.\n * @param {import("./GeometryLayout.js").default=} opt_layout Layout.\n * @api\n */\n\n\n Point.prototype.setCoordinates = function (coordinates, opt_layout) {\n this.setLayout(opt_layout, coordinates, 0);\n\n if (!this.flatCoordinates) {\n this.flatCoordinates = [];\n }\n\n this.flatCoordinates.length = deflateCoordinate(this.flatCoordinates, 0, coordinates, this.stride);\n this.changed();\n };\n\n return Point;\n}(geom_SimpleGeometry);\n\n/* harmony default export */ var geom_Point = (Point);\n;// CONCATENATED MODULE: ./node_modules/ol/geom/flat/contains.js\n/**\n * @module ol/geom/flat/contains\n */\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {import("../../extent.js").Extent} extent Extent.\n * @return {boolean} Contains extent.\n */\n\nfunction linearRingContainsExtent(flatCoordinates, offset, end, stride, extent) {\n var outside = forEachCorner(extent,\n /**\n * @param {import("../../coordinate.js").Coordinate} coordinate Coordinate.\n * @return {boolean} Contains (x, y).\n */\n function (coordinate) {\n return !linearRingContainsXY(flatCoordinates, offset, end, stride, coordinate[0], coordinate[1]);\n });\n return !outside;\n}\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {number} x X.\n * @param {number} y Y.\n * @return {boolean} Contains (x, y).\n */\n\nfunction linearRingContainsXY(flatCoordinates, offset, end, stride, x, y) {\n // http://geomalgorithms.com/a03-_inclusion.html\n // Copyright 2000 softSurfer, 2012 Dan Sunday\n // This code may be freely used and modified for any purpose\n // providing that this copyright notice is included with it.\n // SoftSurfer makes no warranty for this code, and cannot be held\n // liable for any real or imagined damage resulting from its use.\n // Users of this code must verify correctness for their application.\n var wn = 0;\n var x1 = flatCoordinates[end - stride];\n var y1 = flatCoordinates[end - stride + 1];\n\n for (; offset < end; offset += stride) {\n var x2 = flatCoordinates[offset];\n var y2 = flatCoordinates[offset + 1];\n\n if (y1 <= y) {\n if (y2 > y && (x2 - x1) * (y - y1) - (x - x1) * (y2 - y1) > 0) {\n wn++;\n }\n } else if (y2 <= y && (x2 - x1) * (y - y1) - (x - x1) * (y2 - y1) < 0) {\n wn--;\n }\n\n x1 = x2;\n y1 = y2;\n }\n\n return wn !== 0;\n}\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} ends Ends.\n * @param {number} stride Stride.\n * @param {number} x X.\n * @param {number} y Y.\n * @return {boolean} Contains (x, y).\n */\n\nfunction linearRingsContainsXY(flatCoordinates, offset, ends, stride, x, y) {\n if (ends.length === 0) {\n return false;\n }\n\n if (!linearRingContainsXY(flatCoordinates, offset, ends[0], stride, x, y)) {\n return false;\n }\n\n for (var i = 1, ii = ends.length; i < ii; ++i) {\n if (linearRingContainsXY(flatCoordinates, ends[i - 1], ends[i], stride, x, y)) {\n return false;\n }\n }\n\n return true;\n}\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array>} endss Endss.\n * @param {number} stride Stride.\n * @param {number} x X.\n * @param {number} y Y.\n * @return {boolean} Contains (x, y).\n */\n\nfunction linearRingssContainsXY(flatCoordinates, offset, endss, stride, x, y) {\n if (endss.length === 0) {\n return false;\n }\n\n for (var i = 0, ii = endss.length; i < ii; ++i) {\n var ends = endss[i];\n\n if (linearRingsContainsXY(flatCoordinates, offset, ends, stride, x, y)) {\n return true;\n }\n\n offset = ends[ends.length - 1];\n }\n\n return false;\n}\n;// CONCATENATED MODULE: ./node_modules/ol/geom/flat/interiorpoint.js\n/**\n * @module ol/geom/flat/interiorpoint\n */\n\n\n/**\n * Calculates a point that is likely to lie in the interior of the linear rings.\n * Inspired by JTS\'s com.vividsolutions.jts.geom.Geometry#getInteriorPoint.\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} ends Ends.\n * @param {number} stride Stride.\n * @param {Array} flatCenters Flat centers.\n * @param {number} flatCentersOffset Flat center offset.\n * @param {Array=} opt_dest Destination.\n * @return {Array} Destination point as XYM coordinate, where M is the\n * length of the horizontal intersection that the point belongs to.\n */\n\nfunction getInteriorPointOfArray(flatCoordinates, offset, ends, stride, flatCenters, flatCentersOffset, opt_dest) {\n var i, ii, x, x1, x2, y1, y2;\n var y = flatCenters[flatCentersOffset + 1];\n /** @type {Array} */\n\n var intersections = []; // Calculate intersections with the horizontal line\n\n for (var r = 0, rr = ends.length; r < rr; ++r) {\n var end = ends[r];\n x1 = flatCoordinates[end - stride];\n y1 = flatCoordinates[end - stride + 1];\n\n for (i = offset; i < end; i += stride) {\n x2 = flatCoordinates[i];\n y2 = flatCoordinates[i + 1];\n\n if (y <= y1 && y2 <= y || y1 <= y && y <= y2) {\n x = (y - y1) / (y2 - y1) * (x2 - x1) + x1;\n intersections.push(x);\n }\n\n x1 = x2;\n y1 = y2;\n }\n } // Find the longest segment of the horizontal line that has its center point\n // inside the linear ring.\n\n\n var pointX = NaN;\n var maxSegmentLength = -Infinity;\n intersections.sort(numberSafeCompareFunction);\n x1 = intersections[0];\n\n for (i = 1, ii = intersections.length; i < ii; ++i) {\n x2 = intersections[i];\n var segmentLength = Math.abs(x2 - x1);\n\n if (segmentLength > maxSegmentLength) {\n x = (x1 + x2) / 2;\n\n if (linearRingsContainsXY(flatCoordinates, offset, ends, stride, x, y)) {\n pointX = x;\n maxSegmentLength = segmentLength;\n }\n }\n\n x1 = x2;\n }\n\n if (isNaN(pointX)) {\n // There is no horizontal line that has its center point inside the linear\n // ring. Use the center of the the linear ring\'s extent.\n pointX = flatCenters[flatCentersOffset];\n }\n\n if (opt_dest) {\n opt_dest.push(pointX, y, maxSegmentLength);\n return opt_dest;\n } else {\n return [pointX, y, maxSegmentLength];\n }\n}\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array>} endss Endss.\n * @param {number} stride Stride.\n * @param {Array} flatCenters Flat centers.\n * @return {Array} Interior points as XYM coordinates, where M is the\n * length of the horizontal intersection that the point belongs to.\n */\n\nfunction getInteriorPointsOfMultiArray(flatCoordinates, offset, endss, stride, flatCenters) {\n var interiorPoints = [];\n\n for (var i = 0, ii = endss.length; i < ii; ++i) {\n var ends = endss[i];\n interiorPoints = getInteriorPointOfArray(flatCoordinates, offset, ends, stride, flatCenters, 2 * i, interiorPoints);\n offset = ends[ends.length - 1];\n }\n\n return interiorPoints;\n}\n;// CONCATENATED MODULE: ./node_modules/ol/geom/flat/segments.js\n/**\n * @module ol/geom/flat/segments\n */\n\n/**\n * This function calls `callback` for each segment of the flat coordinates\n * array. If the callback returns a truthy value the function returns that\n * value immediately. Otherwise the function returns `false`.\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {function(import("../../coordinate.js").Coordinate, import("../../coordinate.js").Coordinate): T} callback Function\n * called for each segment.\n * @return {T|boolean} Value.\n * @template T\n */\nfunction forEach(flatCoordinates, offset, end, stride, callback) {\n var point1 = [flatCoordinates[offset], flatCoordinates[offset + 1]];\n var point2 = [];\n var ret;\n\n for (; offset + stride < end; offset += stride) {\n point2[0] = flatCoordinates[offset + stride];\n point2[1] = flatCoordinates[offset + stride + 1];\n ret = callback(point1, point2);\n\n if (ret) {\n return ret;\n }\n\n point1[0] = point2[0];\n point1[1] = point2[1];\n }\n\n return false;\n}\n;// CONCATENATED MODULE: ./node_modules/ol/geom/flat/intersectsextent.js\n/**\n * @module ol/geom/flat/intersectsextent\n */\n\n\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {import("../../extent.js").Extent} extent Extent.\n * @return {boolean} True if the geometry and the extent intersect.\n */\n\nfunction intersectsLineString(flatCoordinates, offset, end, stride, extent) {\n var coordinatesExtent = extendFlatCoordinates(createEmpty(), flatCoordinates, offset, end, stride);\n\n if (!intersects(extent, coordinatesExtent)) {\n return false;\n }\n\n if (containsExtent(extent, coordinatesExtent)) {\n return true;\n }\n\n if (coordinatesExtent[0] >= extent[0] && coordinatesExtent[2] <= extent[2]) {\n return true;\n }\n\n if (coordinatesExtent[1] >= extent[1] && coordinatesExtent[3] <= extent[3]) {\n return true;\n }\n\n return forEach(flatCoordinates, offset, end, stride,\n /**\n * @param {import("../../coordinate.js").Coordinate} point1 Start point.\n * @param {import("../../coordinate.js").Coordinate} point2 End point.\n * @return {boolean} `true` if the segment and the extent intersect,\n * `false` otherwise.\n */\n function (point1, point2) {\n return intersectsSegment(extent, point1, point2);\n });\n}\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} ends Ends.\n * @param {number} stride Stride.\n * @param {import("../../extent.js").Extent} extent Extent.\n * @return {boolean} True if the geometry and the extent intersect.\n */\n\nfunction intersectsLineStringArray(flatCoordinates, offset, ends, stride, extent) {\n for (var i = 0, ii = ends.length; i < ii; ++i) {\n if (intersectsLineString(flatCoordinates, offset, ends[i], stride, extent)) {\n return true;\n }\n\n offset = ends[i];\n }\n\n return false;\n}\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {import("../../extent.js").Extent} extent Extent.\n * @return {boolean} True if the geometry and the extent intersect.\n */\n\nfunction intersectsLinearRing(flatCoordinates, offset, end, stride, extent) {\n if (intersectsLineString(flatCoordinates, offset, end, stride, extent)) {\n return true;\n }\n\n if (linearRingContainsXY(flatCoordinates, offset, end, stride, extent[0], extent[1])) {\n return true;\n }\n\n if (linearRingContainsXY(flatCoordinates, offset, end, stride, extent[0], extent[3])) {\n return true;\n }\n\n if (linearRingContainsXY(flatCoordinates, offset, end, stride, extent[2], extent[1])) {\n return true;\n }\n\n if (linearRingContainsXY(flatCoordinates, offset, end, stride, extent[2], extent[3])) {\n return true;\n }\n\n return false;\n}\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} ends Ends.\n * @param {number} stride Stride.\n * @param {import("../../extent.js").Extent} extent Extent.\n * @return {boolean} True if the geometry and the extent intersect.\n */\n\nfunction intersectsLinearRingArray(flatCoordinates, offset, ends, stride, extent) {\n if (!intersectsLinearRing(flatCoordinates, offset, ends[0], stride, extent)) {\n return false;\n }\n\n if (ends.length === 1) {\n return true;\n }\n\n for (var i = 1, ii = ends.length; i < ii; ++i) {\n if (linearRingContainsExtent(flatCoordinates, ends[i - 1], ends[i], stride, extent)) {\n if (!intersectsLineString(flatCoordinates, ends[i - 1], ends[i], stride, extent)) {\n return false;\n }\n }\n }\n\n return true;\n}\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array>} endss Endss.\n * @param {number} stride Stride.\n * @param {import("../../extent.js").Extent} extent Extent.\n * @return {boolean} True if the geometry and the extent intersect.\n */\n\nfunction intersectsLinearRingMultiArray(flatCoordinates, offset, endss, stride, extent) {\n for (var i = 0, ii = endss.length; i < ii; ++i) {\n var ends = endss[i];\n\n if (intersectsLinearRingArray(flatCoordinates, offset, ends, stride, extent)) {\n return true;\n }\n\n offset = ends[ends.length - 1];\n }\n\n return false;\n}\n;// CONCATENATED MODULE: ./node_modules/ol/geom/flat/reverse.js\n/**\n * @module ol/geom/flat/reverse\n */\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n */\nfunction coordinates(flatCoordinates, offset, end, stride) {\n while (offset < end - stride) {\n for (var i = 0; i < stride; ++i) {\n var tmp = flatCoordinates[offset + i];\n flatCoordinates[offset + i] = flatCoordinates[end - stride + i];\n flatCoordinates[end - stride + i] = tmp;\n }\n\n offset += stride;\n end -= stride;\n }\n}\n;// CONCATENATED MODULE: ./node_modules/ol/geom/flat/orient.js\n/**\n * @module ol/geom/flat/orient\n */\n\n/**\n * Is the linear ring oriented clockwise in a coordinate system with a bottom-left\n * coordinate origin? For a coordinate system with a top-left coordinate origin,\n * the ring\'s orientation is clockwise when this function returns false.\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @return {boolean} Is clockwise.\n */\n\nfunction linearRingIsClockwise(flatCoordinates, offset, end, stride) {\n // http://tinyurl.com/clockwise-method\n // https://github.com/OSGeo/gdal/blob/trunk/gdal/ogr/ogrlinearring.cpp\n var edge = 0;\n var x1 = flatCoordinates[end - stride];\n var y1 = flatCoordinates[end - stride + 1];\n\n for (; offset < end; offset += stride) {\n var x2 = flatCoordinates[offset];\n var y2 = flatCoordinates[offset + 1];\n edge += (x2 - x1) * (y2 + y1);\n x1 = x2;\n y1 = y2;\n }\n\n return edge === 0 ? undefined : edge > 0;\n}\n/**\n * Determines if linear rings are oriented. By default, left-hand orientation\n * is tested (first ring must be clockwise, remaining rings counter-clockwise).\n * To test for right-hand orientation, use the `opt_right` argument.\n *\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} ends Array of end indexes.\n * @param {number} stride Stride.\n * @param {boolean=} opt_right Test for right-hand orientation\n * (counter-clockwise exterior ring and clockwise interior rings).\n * @return {boolean} Rings are correctly oriented.\n */\n\nfunction linearRingsAreOriented(flatCoordinates, offset, ends, stride, opt_right) {\n var right = opt_right !== undefined ? opt_right : false;\n\n for (var i = 0, ii = ends.length; i < ii; ++i) {\n var end = ends[i];\n var isClockwise = linearRingIsClockwise(flatCoordinates, offset, end, stride);\n\n if (i === 0) {\n if (right && isClockwise || !right && !isClockwise) {\n return false;\n }\n } else {\n if (right && !isClockwise || !right && isClockwise) {\n return false;\n }\n }\n\n offset = end;\n }\n\n return true;\n}\n/**\n * Determines if linear rings are oriented. By default, left-hand orientation\n * is tested (first ring must be clockwise, remaining rings counter-clockwise).\n * To test for right-hand orientation, use the `opt_right` argument.\n *\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array>} endss Array of array of end indexes.\n * @param {number} stride Stride.\n * @param {boolean=} opt_right Test for right-hand orientation\n * (counter-clockwise exterior ring and clockwise interior rings).\n * @return {boolean} Rings are correctly oriented.\n */\n\nfunction linearRingssAreOriented(flatCoordinates, offset, endss, stride, opt_right) {\n for (var i = 0, ii = endss.length; i < ii; ++i) {\n var ends = endss[i];\n\n if (!linearRingsAreOriented(flatCoordinates, offset, ends, stride, opt_right)) {\n return false;\n }\n\n if (ends.length) {\n offset = ends[ends.length - 1];\n }\n }\n\n return true;\n}\n/**\n * Orient coordinates in a flat array of linear rings. By default, rings\n * are oriented following the left-hand rule (clockwise for exterior and\n * counter-clockwise for interior rings). To orient according to the\n * right-hand rule, use the `opt_right` argument.\n *\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} ends Ends.\n * @param {number} stride Stride.\n * @param {boolean=} opt_right Follow the right-hand rule for orientation.\n * @return {number} End.\n */\n\nfunction orientLinearRings(flatCoordinates, offset, ends, stride, opt_right) {\n var right = opt_right !== undefined ? opt_right : false;\n\n for (var i = 0, ii = ends.length; i < ii; ++i) {\n var end = ends[i];\n var isClockwise = linearRingIsClockwise(flatCoordinates, offset, end, stride);\n var reverse = i === 0 ? right && isClockwise || !right && !isClockwise : right && !isClockwise || !right && isClockwise;\n\n if (reverse) {\n coordinates(flatCoordinates, offset, end, stride);\n }\n\n offset = end;\n }\n\n return offset;\n}\n/**\n * Orient coordinates in a flat array of linear rings. By default, rings\n * are oriented following the left-hand rule (clockwise for exterior and\n * counter-clockwise for interior rings). To orient according to the\n * right-hand rule, use the `opt_right` argument.\n *\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array>} endss Array of array of end indexes.\n * @param {number} stride Stride.\n * @param {boolean=} opt_right Follow the right-hand rule for orientation.\n * @return {number} End.\n */\n\nfunction orientLinearRingsArray(flatCoordinates, offset, endss, stride, opt_right) {\n for (var i = 0, ii = endss.length; i < ii; ++i) {\n offset = orientLinearRings(flatCoordinates, offset, endss[i], stride, opt_right);\n }\n\n return offset;\n}\n;// CONCATENATED MODULE: ./node_modules/ol/geom/Polygon.js\nvar Polygon_extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n/**\n * @module ol/geom/Polygon\n */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * @classdesc\n * Polygon geometry.\n *\n * @api\n */\n\nvar Polygon =\n/** @class */\nfunction (_super) {\n Polygon_extends(Polygon, _super);\n /**\n * @param {!Array>|!Array} coordinates\n * Array of linear rings that define the polygon. The first linear ring of the\n * array defines the outer-boundary or surface of the polygon. Each subsequent\n * linear ring defines a hole in the surface of the polygon. A linear ring is\n * an array of vertices\' coordinates where the first coordinate and the last are\n * equivalent. (For internal use, flat coordinates in combination with\n * `opt_layout` and `opt_ends` are also accepted.)\n * @param {import("./GeometryLayout.js").default=} opt_layout Layout.\n * @param {Array=} opt_ends Ends (for internal use with flat coordinates).\n */\n\n\n function Polygon(coordinates, opt_layout, opt_ends) {\n var _this = _super.call(this) || this;\n /**\n * @type {Array}\n * @private\n */\n\n\n _this.ends_ = [];\n /**\n * @private\n * @type {number}\n */\n\n _this.flatInteriorPointRevision_ = -1;\n /**\n * @private\n * @type {import("../coordinate.js").Coordinate}\n */\n\n _this.flatInteriorPoint_ = null;\n /**\n * @private\n * @type {number}\n */\n\n _this.maxDelta_ = -1;\n /**\n * @private\n * @type {number}\n */\n\n _this.maxDeltaRevision_ = -1;\n /**\n * @private\n * @type {number}\n */\n\n _this.orientedRevision_ = -1;\n /**\n * @private\n * @type {Array}\n */\n\n _this.orientedFlatCoordinates_ = null;\n\n if (opt_layout !== undefined && opt_ends) {\n _this.setFlatCoordinates(opt_layout,\n /** @type {Array} */\n coordinates);\n\n _this.ends_ = opt_ends;\n } else {\n _this.setCoordinates(\n /** @type {Array>} */\n coordinates, opt_layout);\n }\n\n return _this;\n }\n /**\n * Append the passed linear ring to this polygon.\n * @param {LinearRing} linearRing Linear ring.\n * @api\n */\n\n\n Polygon.prototype.appendLinearRing = function (linearRing) {\n if (!this.flatCoordinates) {\n this.flatCoordinates = linearRing.getFlatCoordinates().slice();\n } else {\n array_extend(this.flatCoordinates, linearRing.getFlatCoordinates());\n }\n\n this.ends_.push(this.flatCoordinates.length);\n this.changed();\n };\n /**\n * Make a complete copy of the geometry.\n * @return {!Polygon} Clone.\n * @api\n */\n\n\n Polygon.prototype.clone = function () {\n var polygon = new Polygon(this.flatCoordinates.slice(), this.layout, this.ends_.slice());\n polygon.applyProperties(this);\n return polygon;\n };\n /**\n * @param {number} x X.\n * @param {number} y Y.\n * @param {import("../coordinate.js").Coordinate} closestPoint Closest point.\n * @param {number} minSquaredDistance Minimum squared distance.\n * @return {number} Minimum squared distance.\n */\n\n\n Polygon.prototype.closestPointXY = function (x, y, closestPoint, minSquaredDistance) {\n if (minSquaredDistance < closestSquaredDistanceXY(this.getExtent(), x, y)) {\n return minSquaredDistance;\n }\n\n if (this.maxDeltaRevision_ != this.getRevision()) {\n this.maxDelta_ = Math.sqrt(arrayMaxSquaredDelta(this.flatCoordinates, 0, this.ends_, this.stride, 0));\n this.maxDeltaRevision_ = this.getRevision();\n }\n\n return assignClosestArrayPoint(this.flatCoordinates, 0, this.ends_, this.stride, this.maxDelta_, true, x, y, closestPoint, minSquaredDistance);\n };\n /**\n * @param {number} x X.\n * @param {number} y Y.\n * @return {boolean} Contains (x, y).\n */\n\n\n Polygon.prototype.containsXY = function (x, y) {\n return linearRingsContainsXY(this.getOrientedFlatCoordinates(), 0, this.ends_, this.stride, x, y);\n };\n /**\n * Return the area of the polygon on projected plane.\n * @return {number} Area (on projected plane).\n * @api\n */\n\n\n Polygon.prototype.getArea = function () {\n return linearRings(this.getOrientedFlatCoordinates(), 0, this.ends_, this.stride);\n };\n /**\n * Get the coordinate array for this geometry. This array has the structure\n * of a GeoJSON coordinate array for polygons.\n *\n * @param {boolean=} opt_right Orient coordinates according to the right-hand\n * rule (counter-clockwise for exterior and clockwise for interior rings).\n * If `false`, coordinates will be oriented according to the left-hand rule\n * (clockwise for exterior and counter-clockwise for interior rings).\n * By default, coordinate orientation will depend on how the geometry was\n * constructed.\n * @return {Array>} Coordinates.\n * @api\n */\n\n\n Polygon.prototype.getCoordinates = function (opt_right) {\n var flatCoordinates;\n\n if (opt_right !== undefined) {\n flatCoordinates = this.getOrientedFlatCoordinates().slice();\n orientLinearRings(flatCoordinates, 0, this.ends_, this.stride, opt_right);\n } else {\n flatCoordinates = this.flatCoordinates;\n }\n\n return inflateCoordinatesArray(flatCoordinates, 0, this.ends_, this.stride);\n };\n /**\n * @return {Array} Ends.\n */\n\n\n Polygon.prototype.getEnds = function () {\n return this.ends_;\n };\n /**\n * @return {Array} Interior point.\n */\n\n\n Polygon.prototype.getFlatInteriorPoint = function () {\n if (this.flatInteriorPointRevision_ != this.getRevision()) {\n var flatCenter = getCenter(this.getExtent());\n this.flatInteriorPoint_ = getInteriorPointOfArray(this.getOrientedFlatCoordinates(), 0, this.ends_, this.stride, flatCenter, 0);\n this.flatInteriorPointRevision_ = this.getRevision();\n }\n\n return this.flatInteriorPoint_;\n };\n /**\n * Return an interior point of the polygon.\n * @return {Point} Interior point as XYM coordinate, where M is the\n * length of the horizontal intersection that the point belongs to.\n * @api\n */\n\n\n Polygon.prototype.getInteriorPoint = function () {\n return new geom_Point(this.getFlatInteriorPoint(), geom_GeometryLayout.XYM);\n };\n /**\n * Return the number of rings of the polygon, this includes the exterior\n * ring and any interior rings.\n *\n * @return {number} Number of rings.\n * @api\n */\n\n\n Polygon.prototype.getLinearRingCount = function () {\n return this.ends_.length;\n };\n /**\n * Return the Nth linear ring of the polygon geometry. Return `null` if the\n * given index is out of range.\n * The exterior linear ring is available at index `0` and the interior rings\n * at index `1` and beyond.\n *\n * @param {number} index Index.\n * @return {LinearRing} Linear ring.\n * @api\n */\n\n\n Polygon.prototype.getLinearRing = function (index) {\n if (index < 0 || this.ends_.length <= index) {\n return null;\n }\n\n return new geom_LinearRing(this.flatCoordinates.slice(index === 0 ? 0 : this.ends_[index - 1], this.ends_[index]), this.layout);\n };\n /**\n * Return the linear rings of the polygon.\n * @return {Array} Linear rings.\n * @api\n */\n\n\n Polygon.prototype.getLinearRings = function () {\n var layout = this.layout;\n var flatCoordinates = this.flatCoordinates;\n var ends = this.ends_;\n var linearRings = [];\n var offset = 0;\n\n for (var i = 0, ii = ends.length; i < ii; ++i) {\n var end = ends[i];\n var linearRing = new geom_LinearRing(flatCoordinates.slice(offset, end), layout);\n linearRings.push(linearRing);\n offset = end;\n }\n\n return linearRings;\n };\n /**\n * @return {Array} Oriented flat coordinates.\n */\n\n\n Polygon.prototype.getOrientedFlatCoordinates = function () {\n if (this.orientedRevision_ != this.getRevision()) {\n var flatCoordinates = this.flatCoordinates;\n\n if (linearRingsAreOriented(flatCoordinates, 0, this.ends_, this.stride)) {\n this.orientedFlatCoordinates_ = flatCoordinates;\n } else {\n this.orientedFlatCoordinates_ = flatCoordinates.slice();\n this.orientedFlatCoordinates_.length = orientLinearRings(this.orientedFlatCoordinates_, 0, this.ends_, this.stride);\n }\n\n this.orientedRevision_ = this.getRevision();\n }\n\n return this.orientedFlatCoordinates_;\n };\n /**\n * @param {number} squaredTolerance Squared tolerance.\n * @return {Polygon} Simplified Polygon.\n * @protected\n */\n\n\n Polygon.prototype.getSimplifiedGeometryInternal = function (squaredTolerance) {\n var simplifiedFlatCoordinates = [];\n var simplifiedEnds = [];\n simplifiedFlatCoordinates.length = quantizeArray(this.flatCoordinates, 0, this.ends_, this.stride, Math.sqrt(squaredTolerance), simplifiedFlatCoordinates, 0, simplifiedEnds);\n return new Polygon(simplifiedFlatCoordinates, geom_GeometryLayout.XY, simplifiedEnds);\n };\n /**\n * Get the type of this geometry.\n * @return {import("./GeometryType.js").default} Geometry type.\n * @api\n */\n\n\n Polygon.prototype.getType = function () {\n return geom_GeometryType.POLYGON;\n };\n /**\n * Test if the geometry and the passed extent intersect.\n * @param {import("../extent.js").Extent} extent Extent.\n * @return {boolean} `true` if the geometry and the extent intersect.\n * @api\n */\n\n\n Polygon.prototype.intersectsExtent = function (extent) {\n return intersectsLinearRingArray(this.getOrientedFlatCoordinates(), 0, this.ends_, this.stride, extent);\n };\n /**\n * Set the coordinates of the polygon.\n * @param {!Array>} coordinates Coordinates.\n * @param {import("./GeometryLayout.js").default=} opt_layout Layout.\n * @api\n */\n\n\n Polygon.prototype.setCoordinates = function (coordinates, opt_layout) {\n this.setLayout(opt_layout, coordinates, 2);\n\n if (!this.flatCoordinates) {\n this.flatCoordinates = [];\n }\n\n var ends = deflateCoordinatesArray(this.flatCoordinates, 0, coordinates, this.stride, this.ends_);\n this.flatCoordinates.length = ends.length === 0 ? 0 : ends[ends.length - 1];\n this.changed();\n };\n\n return Polygon;\n}(geom_SimpleGeometry);\n\n/* harmony default export */ var geom_Polygon = (Polygon);\n/**\n * Create an approximation of a circle on the surface of a sphere.\n * @param {import("../coordinate.js").Coordinate} center Center (`[lon, lat]` in degrees).\n * @param {number} radius The great-circle distance from the center to\n * the polygon vertices.\n * @param {number=} opt_n Optional number of vertices for the resulting\n * polygon. Default is `32`.\n * @param {number=} opt_sphereRadius Optional radius for the sphere (defaults to\n * the Earth\'s mean radius using the WGS84 ellipsoid).\n * @return {Polygon} The "circular" polygon.\n * @api\n */\n\nfunction circular(center, radius, opt_n, opt_sphereRadius) {\n var n = opt_n ? opt_n : 32;\n /** @type {Array} */\n\n var flatCoordinates = [];\n\n for (var i = 0; i < n; ++i) {\n extend(flatCoordinates, sphereOffset(center, radius, 2 * Math.PI * i / n, opt_sphereRadius));\n }\n\n flatCoordinates.push(flatCoordinates[0], flatCoordinates[1]);\n return new Polygon(flatCoordinates, GeometryLayout.XY, [flatCoordinates.length]);\n}\n/**\n * Create a polygon from an extent. The layout used is `XY`.\n * @param {import("../extent.js").Extent} extent The extent.\n * @return {Polygon} The polygon.\n * @api\n */\n\nfunction fromExtent(extent) {\n var minX = extent[0];\n var minY = extent[1];\n var maxX = extent[2];\n var maxY = extent[3];\n var flatCoordinates = [minX, minY, minX, maxY, maxX, maxY, maxX, minY, minX, minY];\n return new Polygon(flatCoordinates, geom_GeometryLayout.XY, [flatCoordinates.length]);\n}\n/**\n * Create a regular polygon from a circle.\n * @param {import("./Circle.js").default} circle Circle geometry.\n * @param {number=} opt_sides Number of sides of the polygon. Default is 32.\n * @param {number=} opt_angle Start angle for the first vertex of the polygon in\n * counter-clockwise radians. 0 means East. Default is 0.\n * @return {Polygon} Polygon geometry.\n * @api\n */\n\nfunction fromCircle(circle, opt_sides, opt_angle) {\n var sides = opt_sides ? opt_sides : 32;\n var stride = circle.getStride();\n var layout = circle.getLayout();\n var center = circle.getCenter();\n var arrayLength = stride * (sides + 1);\n var flatCoordinates = new Array(arrayLength);\n\n for (var i = 0; i < arrayLength; i += stride) {\n flatCoordinates[i] = 0;\n flatCoordinates[i + 1] = 0;\n\n for (var j = 2; j < stride; j++) {\n flatCoordinates[i + j] = center[j];\n }\n }\n\n var ends = [flatCoordinates.length];\n var polygon = new Polygon(flatCoordinates, layout, ends);\n makeRegular(polygon, center, circle.getRadius(), opt_angle);\n return polygon;\n}\n/**\n * Modify the coordinates of a polygon to make it a regular polygon.\n * @param {Polygon} polygon Polygon geometry.\n * @param {import("../coordinate.js").Coordinate} center Center of the regular polygon.\n * @param {number} radius Radius of the regular polygon.\n * @param {number=} opt_angle Start angle for the first vertex of the polygon in\n * counter-clockwise radians. 0 means East. Default is 0.\n */\n\nfunction makeRegular(polygon, center, radius, opt_angle) {\n var flatCoordinates = polygon.getFlatCoordinates();\n var stride = polygon.getStride();\n var sides = flatCoordinates.length / stride - 1;\n var startAngle = opt_angle ? opt_angle : 0;\n\n for (var i = 0; i <= sides; ++i) {\n var offset = i * stride;\n var angle = startAngle + modulo(i, sides) * 2 * Math.PI / sides;\n flatCoordinates[offset] = center[0] + radius * Math.cos(angle);\n flatCoordinates[offset + 1] = center[1] + radius * Math.sin(angle);\n }\n\n polygon.changed();\n}\n;// CONCATENATED MODULE: ./node_modules/ol/View.js\nvar View_extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n/**\n * @module ol/View\n */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * An animation configuration\n *\n * @typedef {Object} Animation\n * @property {import("./coordinate.js").Coordinate} [sourceCenter]\n * @property {import("./coordinate.js").Coordinate} [targetCenter]\n * @property {number} [sourceResolution]\n * @property {number} [targetResolution]\n * @property {number} [sourceRotation]\n * @property {number} [targetRotation]\n * @property {import("./coordinate.js").Coordinate} [anchor]\n * @property {number} start\n * @property {number} duration\n * @property {boolean} complete\n * @property {function(number):number} easing\n * @property {function(boolean):void} callback\n */\n\n/**\n * @typedef {Object} Constraints\n * @property {import("./centerconstraint.js").Type} center\n * @property {import("./resolutionconstraint.js").Type} resolution\n * @property {import("./rotationconstraint.js").Type} rotation\n */\n\n/**\n * @typedef {Object} FitOptions\n * @property {import("./size.js").Size} [size] The size in pixels of the box to fit\n * the extent into. Default is the current size of the first map in the DOM that\n * uses this view, or `[100, 100]` if no such map is found.\n * @property {!Array} [padding=[0, 0, 0, 0]] Padding (in pixels) to be\n * cleared inside the view. Values in the array are top, right, bottom and left\n * padding.\n * @property {boolean} [nearest=false] If the view `constrainResolution` option is `true`,\n * get the nearest extent instead of the closest that actually fits the view.\n * @property {number} [minResolution=0] Minimum resolution that we zoom to.\n * @property {number} [maxZoom] Maximum zoom level that we zoom to. If\n * `minResolution` is given, this property is ignored.\n * @property {number} [duration] The duration of the animation in milliseconds.\n * By default, there is no animation to the target extent.\n * @property {function(number):number} [easing] The easing function used during\n * the animation (defaults to {@link module:ol/easing~inAndOut}).\n * The function will be called for each frame with a number representing a\n * fraction of the animation\'s duration. The function should return a number\n * between 0 and 1 representing the progress toward the destination state.\n * @property {function(boolean):void} [callback] Function called when the view is in\n * its final position. The callback will be called with `true` if the animation\n * series completed on its own or `false` if it was cancelled.\n */\n\n/**\n * @typedef {Object} ViewOptions\n * @property {import("./coordinate.js").Coordinate} [center] The initial center for\n * the view. If a user projection is not set, the coordinate system for the center is\n * specified with the `projection` option. Layer sources will not be fetched if this\n * is not set, but the center can be set later with {@link #setCenter}.\n * @property {boolean|number} [constrainRotation=true] Rotation constraint.\n * `false` means no constraint. `true` means no constraint, but snap to zero\n * near zero. A number constrains the rotation to that number of values. For\n * example, `4` will constrain the rotation to 0, 90, 180, and 270 degrees.\n * @property {boolean} [enableRotation=true] Enable rotation.\n * If `false`, a rotation constraint that always sets the rotation to zero is\n * used. The `constrainRotation` option has no effect if `enableRotation` is\n * `false`.\n * @property {import("./extent.js").Extent} [extent] The extent that constrains the\n * view, in other words, nothing outside of this extent can be visible on the map.\n * @property {boolean} [constrainOnlyCenter=false] If true, the extent\n * constraint will only apply to the view center and not the whole extent.\n * @property {boolean} [smoothExtentConstraint=true] If true, the extent\n * constraint will be applied smoothly, i.e. allow the view to go slightly outside\n * of the given `extent`.\n * @property {number} [maxResolution] The maximum resolution used to determine\n * the resolution constraint. It is used together with `minResolution` (or\n * `maxZoom`) and `zoomFactor`. If unspecified it is calculated in such a way\n * that the projection\'s validity extent fits in a 256x256 px tile. If the\n * projection is Spherical Mercator (the default) then `maxResolution` defaults\n * to `40075016.68557849 / 256 = 156543.03392804097`.\n * @property {number} [minResolution] The minimum resolution used to determine\n * the resolution constraint. It is used together with `maxResolution` (or\n * `minZoom`) and `zoomFactor`. If unspecified it is calculated assuming 29\n * zoom levels (with a factor of 2). If the projection is Spherical Mercator\n * (the default) then `minResolution` defaults to\n * `40075016.68557849 / 256 / Math.pow(2, 28) = 0.0005831682455839253`.\n * @property {number} [maxZoom=28] The maximum zoom level used to determine the\n * resolution constraint. It is used together with `minZoom` (or\n * `maxResolution`) and `zoomFactor`. Note that if `minResolution` is also\n * provided, it is given precedence over `maxZoom`.\n * @property {number} [minZoom=0] The minimum zoom level used to determine the\n * resolution constraint. It is used together with `maxZoom` (or\n * `minResolution`) and `zoomFactor`. Note that if `maxResolution` is also\n * provided, it is given precedence over `minZoom`.\n * @property {boolean} [multiWorld=false] If `false` the view is constrained so\n * only one world is visible, and you cannot pan off the edge. If `true` the map\n * may show multiple worlds at low zoom levels. Only used if the `projection` is\n * global. Note that if `extent` is also provided it is given precedence.\n * @property {boolean} [constrainResolution=false] If true, the view will always\n * animate to the closest zoom level after an interaction; false means\n * intermediary zoom levels are allowed.\n * @property {boolean} [smoothResolutionConstraint=true] If true, the resolution\n * min/max values will be applied smoothly, i. e. allow the view to exceed slightly\n * the given resolution or zoom bounds.\n * @property {boolean} [showFullExtent=false] Allow the view to be zoomed out to\n * show the full configured extent. By default, when a view is configured with an\n * extent, users will not be able to zoom out so the viewport exceeds the extent in\n * either dimension. This means the full extent may not be visible if the viewport\n * is taller or wider than the aspect ratio of the configured extent. If\n * showFullExtent is true, the user will be able to zoom out so that the viewport\n * exceeds the height or width of the configured extent, but not both, allowing the\n * full extent to be shown.\n * @property {import("./proj.js").ProjectionLike} [projection=\'EPSG:3857\'] The\n * projection. The default is Spherical Mercator.\n * @property {number} [resolution] The initial resolution for the view. The\n * units are `projection` units per pixel (e.g. meters per pixel). An\n * alternative to setting this is to set `zoom`. Layer sources will not be\n * fetched if neither this nor `zoom` are defined, but they can be set later\n * with {@link #setZoom} or {@link #setResolution}.\n * @property {Array} [resolutions] Resolutions to determine the\n * resolution constraint. If set the `maxResolution`, `minResolution`,\n * `minZoom`, `maxZoom`, and `zoomFactor` options are ignored.\n * @property {number} [rotation=0] The initial rotation for the view in radians\n * (positive rotation clockwise, 0 means North).\n * @property {number} [zoom] Only used if `resolution` is not defined. Zoom\n * level used to calculate the initial resolution for the view.\n * @property {number} [zoomFactor=2] The zoom factor used to compute the\n * corresponding resolution.\n * @property {!Array} [padding=[0, 0, 0, 0]] Padding (in css pixels).\n * If the map viewport is partially covered with other content (overlays) along\n * its edges, this setting allows to shift the center of the viewport away from\n * that content. The order of the values is top, right, bottom, left.\n */\n\n/**\n * @typedef {Object} AnimationOptions\n * @property {import("./coordinate.js").Coordinate} [center] The center of the view at the end of\n * the animation.\n * @property {number} [zoom] The zoom level of the view at the end of the\n * animation. This takes precedence over `resolution`.\n * @property {number} [resolution] The resolution of the view at the end\n * of the animation. If `zoom` is also provided, this option will be ignored.\n * @property {number} [rotation] The rotation of the view at the end of\n * the animation.\n * @property {import("./coordinate.js").Coordinate} [anchor] Optional anchor to remain fixed\n * during a rotation or resolution animation.\n * @property {number} [duration=1000] The duration of the animation in milliseconds.\n * @property {function(number):number} [easing] The easing function used\n * during the animation (defaults to {@link module:ol/easing~inAndOut}).\n * The function will be called for each frame with a number representing a\n * fraction of the animation\'s duration. The function should return a number\n * between 0 and 1 representing the progress toward the destination state.\n */\n\n/**\n * @typedef {Object} State\n * @property {import("./coordinate.js").Coordinate} center\n * @property {import("./proj/Projection.js").default} projection\n * @property {number} resolution\n * @property {number} rotation\n * @property {number} zoom\n */\n\n/**\n * Default min zoom level for the map view.\n * @type {number}\n */\n\nvar DEFAULT_MIN_ZOOM = 0;\n/**\n * @classdesc\n * A View object represents a simple 2D view of the map.\n *\n * This is the object to act upon to change the center, resolution,\n * and rotation of the map.\n *\n * A View has a `projection`. The projection determines the\n * coordinate system of the center, and its units determine the units of the\n * resolution (projection units per pixel). The default projection is\n * Spherical Mercator (EPSG:3857).\n *\n * ### The view states\n *\n * A View is determined by three states: `center`, `resolution`,\n * and `rotation`. Each state has a corresponding getter and setter, e.g.\n * `getCenter` and `setCenter` for the `center` state.\n *\n * The `zoom` state is actually not saved on the view: all computations\n * internally use the `resolution` state. Still, the `setZoom` and `getZoom`\n * methods are available, as well as `getResolutionForZoom` and\n * `getZoomForResolution` to switch from one system to the other.\n *\n * ### The constraints\n *\n * `setCenter`, `setResolution` and `setRotation` can be used to change the\n * states of the view, but any constraint defined in the constructor will\n * be applied along the way.\n *\n * A View object can have a *resolution constraint*, a *rotation constraint*\n * and a *center constraint*.\n *\n * The *resolution constraint* typically restricts min/max values and\n * snaps to specific resolutions. It is determined by the following\n * options: `resolutions`, `maxResolution`, `maxZoom` and `zoomFactor`.\n * If `resolutions` is set, the other three options are ignored. See\n * documentation for each option for more information. By default, the view\n * only has a min/max restriction and allow intermediary zoom levels when\n * pinch-zooming for example.\n *\n * The *rotation constraint* snaps to specific angles. It is determined\n * by the following options: `enableRotation` and `constrainRotation`.\n * By default rotation is allowed and its value is snapped to zero when approaching the\n * horizontal.\n *\n * The *center constraint* is determined by the `extent` option. By\n * default the view center is not constrained at all.\n *\n * ### Changing the view state\n *\n * It is important to note that `setZoom`, `setResolution`, `setCenter` and\n * `setRotation` are subject to the above mentioned constraints. As such, it\n * may sometimes not be possible to know in advance the resulting state of the\n * View. For example, calling `setResolution(10)` does not guarantee that\n * `getResolution()` will return `10`.\n *\n * A consequence of this is that, when applying a delta on the view state, one\n * should use `adjustCenter`, `adjustRotation`, `adjustZoom` and `adjustResolution`\n * rather than the corresponding setters. This will let view do its internal\n * computations. Besides, the `adjust*` methods also take an `opt_anchor`\n * argument which allows specifying an origin for the transformation.\n *\n * ### Interacting with the view\n *\n * View constraints are usually only applied when the view is *at rest*, meaning that\n * no interaction or animation is ongoing. As such, if the user puts the view in a\n * state that is not equivalent to a constrained one (e.g. rotating the view when\n * the snap angle is 0), an animation will be triggered at the interaction end to\n * put back the view to a stable state;\n *\n * @api\n */\n\nvar View =\n/** @class */\nfunction (_super) {\n View_extends(View, _super);\n /**\n * @param {ViewOptions=} opt_options View options.\n */\n\n\n function View(opt_options) {\n var _this = _super.call(this) || this;\n\n var options = obj_assign({}, opt_options);\n /**\n * @private\n * @type {Array}\n */\n\n _this.hints_ = [0, 0];\n /**\n * @private\n * @type {Array>}\n */\n\n _this.animations_ = [];\n /**\n * @private\n * @type {number|undefined}\n */\n\n _this.updateAnimationKey_;\n /**\n * @private\n * @const\n * @type {import("./proj/Projection.js").default}\n */\n\n _this.projection_ = createProjection(options.projection, \'EPSG:3857\');\n /**\n * @private\n * @type {import("./size.js").Size}\n */\n\n _this.viewportSize_ = [100, 100];\n /**\n * @private\n * @type {import("./coordinate.js").Coordinate|undefined}\n */\n\n _this.targetCenter_ = null;\n /**\n * @private\n * @type {number|undefined}\n */\n\n _this.targetResolution_;\n /**\n * @private\n * @type {number|undefined}\n */\n\n _this.targetRotation_;\n /**\n * @private\n * @type {import("./coordinate.js").Coordinate|undefined}\n */\n\n _this.cancelAnchor_ = undefined;\n\n if (options.center) {\n options.center = fromUserCoordinate(options.center, _this.projection_);\n }\n\n if (options.extent) {\n options.extent = fromUserExtent(options.extent, _this.projection_);\n }\n\n _this.applyOptions_(options);\n\n return _this;\n }\n /**\n * Set up the view with the given options.\n * @param {ViewOptions} options View options.\n */\n\n\n View.prototype.applyOptions_ = function (options) {\n /**\n * @type {Object}\n */\n var properties = {};\n var resolutionConstraintInfo = createResolutionConstraint(options);\n /**\n * @private\n * @type {number}\n */\n\n this.maxResolution_ = resolutionConstraintInfo.maxResolution;\n /**\n * @private\n * @type {number}\n */\n\n this.minResolution_ = resolutionConstraintInfo.minResolution;\n /**\n * @private\n * @type {number}\n */\n\n this.zoomFactor_ = resolutionConstraintInfo.zoomFactor;\n /**\n * @private\n * @type {Array|undefined}\n */\n\n this.resolutions_ = options.resolutions;\n /**\n * Padding (in css pixels).\n * If the map viewport is partially covered with other content (overlays) along\n * its edges, this setting allows to shift the center of the viewport away from that\n * content. The order of the values in the array is top, right, bottom, left.\n * The default is no padding, which is equivalent to `[0, 0, 0, 0]`.\n * @type {Array|undefined}\n * @api\n */\n\n this.padding = options.padding;\n /**\n * @private\n * @type {number}\n */\n\n this.minZoom_ = resolutionConstraintInfo.minZoom;\n var centerConstraint = createCenterConstraint(options);\n var resolutionConstraint = resolutionConstraintInfo.constraint;\n var rotationConstraint = createRotationConstraint(options);\n /**\n * @private\n * @type {Constraints}\n */\n\n this.constraints_ = {\n center: centerConstraint,\n resolution: resolutionConstraint,\n rotation: rotationConstraint\n };\n this.setRotation(options.rotation !== undefined ? options.rotation : 0);\n this.setCenterInternal(options.center !== undefined ? options.center : null);\n\n if (options.resolution !== undefined) {\n this.setResolution(options.resolution);\n } else if (options.zoom !== undefined) {\n this.setZoom(options.zoom);\n }\n\n this.setProperties(properties);\n /**\n * @private\n * @type {ViewOptions}\n */\n\n this.options_ = options;\n };\n /**\n * Get an updated version of the view options used to construct the view. The\n * current resolution (or zoom), center, and rotation are applied to any stored\n * options. The provided options can be used to apply new min/max zoom or\n * resolution limits.\n * @param {ViewOptions} newOptions New options to be applied.\n * @return {ViewOptions} New options updated with the current view state.\n */\n\n\n View.prototype.getUpdatedOptions_ = function (newOptions) {\n var options = obj_assign({}, this.options_); // preserve resolution (or zoom)\n\n if (options.resolution !== undefined) {\n options.resolution = this.getResolution();\n } else {\n options.zoom = this.getZoom();\n } // preserve center\n\n\n options.center = this.getCenterInternal(); // preserve rotation\n\n options.rotation = this.getRotation();\n return obj_assign({}, options, newOptions);\n };\n /**\n * Animate the view. The view\'s center, zoom (or resolution), and rotation\n * can be animated for smooth transitions between view states. For example,\n * to animate the view to a new zoom level:\n *\n * view.animate({zoom: view.getZoom() + 1});\n *\n * By default, the animation lasts one second and uses in-and-out easing. You\n * can customize this behavior by including `duration` (in milliseconds) and\n * `easing` options (see {@link module:ol/easing}).\n *\n * To chain together multiple animations, call the method with multiple\n * animation objects. For example, to first zoom and then pan:\n *\n * view.animate({zoom: 10}, {center: [0, 0]});\n *\n * If you provide a function as the last argument to the animate method, it\n * will get called at the end of an animation series. The callback will be\n * called with `true` if the animation series completed on its own or `false`\n * if it was cancelled.\n *\n * Animations are cancelled by user interactions (e.g. dragging the map) or by\n * calling `view.setCenter()`, `view.setResolution()`, or `view.setRotation()`\n * (or another method that calls one of these).\n *\n * @param {...(AnimationOptions|function(boolean): void)} var_args Animation\n * options. Multiple animations can be run in series by passing multiple\n * options objects. To run multiple animations in parallel, call the method\n * multiple times. An optional callback can be provided as a final\n * argument. The callback will be called with a boolean indicating whether\n * the animation completed without being cancelled.\n * @api\n */\n\n\n View.prototype.animate = function (var_args) {\n if (this.isDef() && !this.getAnimating()) {\n this.resolveConstraints(0);\n }\n\n var args = new Array(arguments.length);\n\n for (var i = 0; i < args.length; ++i) {\n var options = arguments[i];\n\n if (options.center) {\n options = obj_assign({}, options);\n options.center = fromUserCoordinate(options.center, this.getProjection());\n }\n\n if (options.anchor) {\n options = obj_assign({}, options);\n options.anchor = fromUserCoordinate(options.anchor, this.getProjection());\n }\n\n args[i] = options;\n }\n\n this.animateInternal.apply(this, args);\n };\n /**\n * @param {...(AnimationOptions|function(boolean): void)} var_args Animation options.\n */\n\n\n View.prototype.animateInternal = function (var_args) {\n var animationCount = arguments.length;\n var callback;\n\n if (animationCount > 1 && typeof arguments[animationCount - 1] === \'function\') {\n callback = arguments[animationCount - 1];\n --animationCount;\n }\n\n if (!this.isDef()) {\n // if view properties are not yet set, shortcut to the final state\n var state = arguments[animationCount - 1];\n\n if (state.center) {\n this.setCenterInternal(state.center);\n }\n\n if (state.zoom !== undefined) {\n this.setZoom(state.zoom);\n }\n\n if (state.rotation !== undefined) {\n this.setRotation(state.rotation);\n }\n\n if (callback) {\n animationCallback(callback, true);\n }\n\n return;\n }\n\n var start = Date.now();\n var center = this.targetCenter_.slice();\n var resolution = this.targetResolution_;\n var rotation = this.targetRotation_;\n var series = [];\n\n for (var i = 0; i < animationCount; ++i) {\n var options =\n /** @type {AnimationOptions} */\n arguments[i];\n var animation = {\n start: start,\n complete: false,\n anchor: options.anchor,\n duration: options.duration !== undefined ? options.duration : 1000,\n easing: options.easing || inAndOut,\n callback: callback\n };\n\n if (options.center) {\n animation.sourceCenter = center;\n animation.targetCenter = options.center.slice();\n center = animation.targetCenter;\n }\n\n if (options.zoom !== undefined) {\n animation.sourceResolution = resolution;\n animation.targetResolution = this.getResolutionForZoom(options.zoom);\n resolution = animation.targetResolution;\n } else if (options.resolution) {\n animation.sourceResolution = resolution;\n animation.targetResolution = options.resolution;\n resolution = animation.targetResolution;\n }\n\n if (options.rotation !== undefined) {\n animation.sourceRotation = rotation;\n var delta = math_modulo(options.rotation - rotation + Math.PI, 2 * Math.PI) - Math.PI;\n animation.targetRotation = rotation + delta;\n rotation = animation.targetRotation;\n } // check if animation is a no-op\n\n\n if (isNoopAnimation(animation)) {\n animation.complete = true; // we still push it onto the series for callback handling\n } else {\n start += animation.duration;\n }\n\n series.push(animation);\n }\n\n this.animations_.push(series);\n this.setHint(ViewHint.ANIMATING, 1);\n this.updateAnimations_();\n };\n /**\n * Determine if the view is being animated.\n * @return {boolean} The view is being animated.\n * @api\n */\n\n\n View.prototype.getAnimating = function () {\n return this.hints_[ViewHint.ANIMATING] > 0;\n };\n /**\n * Determine if the user is interacting with the view, such as panning or zooming.\n * @return {boolean} The view is being interacted with.\n * @api\n */\n\n\n View.prototype.getInteracting = function () {\n return this.hints_[ViewHint.INTERACTING] > 0;\n };\n /**\n * Cancel any ongoing animations.\n * @api\n */\n\n\n View.prototype.cancelAnimations = function () {\n this.setHint(ViewHint.ANIMATING, -this.hints_[ViewHint.ANIMATING]);\n var anchor;\n\n for (var i = 0, ii = this.animations_.length; i < ii; ++i) {\n var series = this.animations_[i];\n\n if (series[0].callback) {\n animationCallback(series[0].callback, false);\n }\n\n if (!anchor) {\n for (var j = 0, jj = series.length; j < jj; ++j) {\n var animation = series[j];\n\n if (!animation.complete) {\n anchor = animation.anchor;\n break;\n }\n }\n }\n }\n\n this.animations_.length = 0;\n this.cancelAnchor_ = anchor;\n };\n /**\n * Update all animations.\n */\n\n\n View.prototype.updateAnimations_ = function () {\n if (this.updateAnimationKey_ !== undefined) {\n cancelAnimationFrame(this.updateAnimationKey_);\n this.updateAnimationKey_ = undefined;\n }\n\n if (!this.getAnimating()) {\n return;\n }\n\n var now = Date.now();\n var more = false;\n\n for (var i = this.animations_.length - 1; i >= 0; --i) {\n var series = this.animations_[i];\n var seriesComplete = true;\n\n for (var j = 0, jj = series.length; j < jj; ++j) {\n var animation = series[j];\n\n if (animation.complete) {\n continue;\n }\n\n var elapsed = now - animation.start;\n var fraction = animation.duration > 0 ? elapsed / animation.duration : 1;\n\n if (fraction >= 1) {\n animation.complete = true;\n fraction = 1;\n } else {\n seriesComplete = false;\n }\n\n var progress = animation.easing(fraction);\n\n if (animation.sourceCenter) {\n var x0 = animation.sourceCenter[0];\n var y0 = animation.sourceCenter[1];\n var x1 = animation.targetCenter[0];\n var y1 = animation.targetCenter[1];\n var x = x0 + progress * (x1 - x0);\n var y = y0 + progress * (y1 - y0);\n this.targetCenter_ = [x, y];\n }\n\n if (animation.sourceResolution && animation.targetResolution) {\n var resolution = progress === 1 ? animation.targetResolution : animation.sourceResolution + progress * (animation.targetResolution - animation.sourceResolution);\n\n if (animation.anchor) {\n var size = this.getViewportSize_(this.getRotation());\n var constrainedResolution = this.constraints_.resolution(resolution, 0, size, true);\n this.targetCenter_ = this.calculateCenterZoom(constrainedResolution, animation.anchor);\n }\n\n this.targetResolution_ = resolution;\n this.applyTargetState_(true);\n }\n\n if (animation.sourceRotation !== undefined && animation.targetRotation !== undefined) {\n var rotation = progress === 1 ? math_modulo(animation.targetRotation + Math.PI, 2 * Math.PI) - Math.PI : animation.sourceRotation + progress * (animation.targetRotation - animation.sourceRotation);\n\n if (animation.anchor) {\n var constrainedRotation = this.constraints_.rotation(rotation, true);\n this.targetCenter_ = this.calculateCenterRotate(constrainedRotation, animation.anchor);\n }\n\n this.targetRotation_ = rotation;\n }\n\n this.applyTargetState_(true);\n more = true;\n\n if (!animation.complete) {\n break;\n }\n }\n\n if (seriesComplete) {\n this.animations_[i] = null;\n this.setHint(ViewHint.ANIMATING, -1);\n var callback = series[0].callback;\n\n if (callback) {\n animationCallback(callback, true);\n }\n }\n } // prune completed series\n\n\n this.animations_ = this.animations_.filter(Boolean);\n\n if (more && this.updateAnimationKey_ === undefined) {\n this.updateAnimationKey_ = requestAnimationFrame(this.updateAnimations_.bind(this));\n }\n };\n /**\n * @param {number} rotation Target rotation.\n * @param {import("./coordinate.js").Coordinate} anchor Rotation anchor.\n * @return {import("./coordinate.js").Coordinate|undefined} Center for rotation and anchor.\n */\n\n\n View.prototype.calculateCenterRotate = function (rotation, anchor) {\n var center;\n var currentCenter = this.getCenterInternal();\n\n if (currentCenter !== undefined) {\n center = [currentCenter[0] - anchor[0], currentCenter[1] - anchor[1]];\n coordinate_rotate(center, rotation - this.getRotation());\n add(center, anchor);\n }\n\n return center;\n };\n /**\n * @param {number} resolution Target resolution.\n * @param {import("./coordinate.js").Coordinate} anchor Zoom anchor.\n * @return {import("./coordinate.js").Coordinate|undefined} Center for resolution and anchor.\n */\n\n\n View.prototype.calculateCenterZoom = function (resolution, anchor) {\n var center;\n var currentCenter = this.getCenterInternal();\n var currentResolution = this.getResolution();\n\n if (currentCenter !== undefined && currentResolution !== undefined) {\n var x = anchor[0] - resolution * (anchor[0] - currentCenter[0]) / currentResolution;\n var y = anchor[1] - resolution * (anchor[1] - currentCenter[1]) / currentResolution;\n center = [x, y];\n }\n\n return center;\n };\n /**\n * Returns the current viewport size.\n * @private\n * @param {number=} opt_rotation Take into account the rotation of the viewport when giving the size\n * @return {import("./size.js").Size} Viewport size or `[100, 100]` when no viewport is found.\n */\n\n\n View.prototype.getViewportSize_ = function (opt_rotation) {\n var size = this.viewportSize_;\n\n if (opt_rotation) {\n var w = size[0];\n var h = size[1];\n return [Math.abs(w * Math.cos(opt_rotation)) + Math.abs(h * Math.sin(opt_rotation)), Math.abs(w * Math.sin(opt_rotation)) + Math.abs(h * Math.cos(opt_rotation))];\n } else {\n return size;\n }\n };\n /**\n * Stores the viewport size on the view. The viewport size is not read every time from the DOM\n * to avoid performance hit and layout reflow.\n * This should be done on map size change.\n * Note: the constraints are not resolved during an animation to avoid stopping it\n * @param {import("./size.js").Size=} opt_size Viewport size; if undefined, [100, 100] is assumed\n */\n\n\n View.prototype.setViewportSize = function (opt_size) {\n this.viewportSize_ = Array.isArray(opt_size) ? opt_size.slice() : [100, 100];\n\n if (!this.getAnimating()) {\n this.resolveConstraints(0);\n }\n };\n /**\n * Get the view center.\n * @return {import("./coordinate.js").Coordinate|undefined} The center of the view.\n * @observable\n * @api\n */\n\n\n View.prototype.getCenter = function () {\n var center = this.getCenterInternal();\n\n if (!center) {\n return center;\n }\n\n return toUserCoordinate(center, this.getProjection());\n };\n /**\n * Get the view center without transforming to user projection.\n * @return {import("./coordinate.js").Coordinate|undefined} The center of the view.\n */\n\n\n View.prototype.getCenterInternal = function () {\n return (\n /** @type {import("./coordinate.js").Coordinate|undefined} */\n this.get(ViewProperty.CENTER)\n );\n };\n /**\n * @return {Constraints} Constraints.\n */\n\n\n View.prototype.getConstraints = function () {\n return this.constraints_;\n };\n /**\n * @return {boolean} Resolution constraint is set\n */\n\n\n View.prototype.getConstrainResolution = function () {\n return this.options_.constrainResolution;\n };\n /**\n * @param {Array=} opt_hints Destination array.\n * @return {Array} Hint.\n */\n\n\n View.prototype.getHints = function (opt_hints) {\n if (opt_hints !== undefined) {\n opt_hints[0] = this.hints_[0];\n opt_hints[1] = this.hints_[1];\n return opt_hints;\n } else {\n return this.hints_.slice();\n }\n };\n /**\n * Calculate the extent for the current view state and the passed size.\n * The size is the pixel dimensions of the box into which the calculated extent\n * should fit. In most cases you want to get the extent of the entire map,\n * that is `map.getSize()`.\n * @param {import("./size.js").Size=} opt_size Box pixel size. If not provided, the size\n * of the map that uses this view will be used.\n * @return {import("./extent.js").Extent} Extent.\n * @api\n */\n\n\n View.prototype.calculateExtent = function (opt_size) {\n var extent = this.calculateExtentInternal(opt_size);\n return toUserExtent(extent, this.getProjection());\n };\n /**\n * @param {import("./size.js").Size=} opt_size Box pixel size. If not provided,\n * the map\'s last known viewport size will be used.\n * @return {import("./extent.js").Extent} Extent.\n */\n\n\n View.prototype.calculateExtentInternal = function (opt_size) {\n var size = opt_size || this.getViewportSize_();\n var center =\n /** @type {!import("./coordinate.js").Coordinate} */\n this.getCenterInternal();\n asserts_assert(center, 1); // The view center is not defined\n\n var resolution =\n /** @type {!number} */\n this.getResolution();\n asserts_assert(resolution !== undefined, 2); // The view resolution is not defined\n\n var rotation =\n /** @type {!number} */\n this.getRotation();\n asserts_assert(rotation !== undefined, 3); // The view rotation is not defined\n\n return getForViewAndSize(center, resolution, rotation, size);\n };\n /**\n * Get the maximum resolution of the view.\n * @return {number} The maximum resolution of the view.\n * @api\n */\n\n\n View.prototype.getMaxResolution = function () {\n return this.maxResolution_;\n };\n /**\n * Get the minimum resolution of the view.\n * @return {number} The minimum resolution of the view.\n * @api\n */\n\n\n View.prototype.getMinResolution = function () {\n return this.minResolution_;\n };\n /**\n * Get the maximum zoom level for the view.\n * @return {number} The maximum zoom level.\n * @api\n */\n\n\n View.prototype.getMaxZoom = function () {\n return (\n /** @type {number} */\n this.getZoomForResolution(this.minResolution_)\n );\n };\n /**\n * Set a new maximum zoom level for the view.\n * @param {number} zoom The maximum zoom level.\n * @api\n */\n\n\n View.prototype.setMaxZoom = function (zoom) {\n this.applyOptions_(this.getUpdatedOptions_({\n maxZoom: zoom\n }));\n };\n /**\n * Get the minimum zoom level for the view.\n * @return {number} The minimum zoom level.\n * @api\n */\n\n\n View.prototype.getMinZoom = function () {\n return (\n /** @type {number} */\n this.getZoomForResolution(this.maxResolution_)\n );\n };\n /**\n * Set a new minimum zoom level for the view.\n * @param {number} zoom The minimum zoom level.\n * @api\n */\n\n\n View.prototype.setMinZoom = function (zoom) {\n this.applyOptions_(this.getUpdatedOptions_({\n minZoom: zoom\n }));\n };\n /**\n * Set whether the view shoud allow intermediary zoom levels.\n * @param {boolean} enabled Whether the resolution is constrained.\n * @api\n */\n\n\n View.prototype.setConstrainResolution = function (enabled) {\n this.applyOptions_(this.getUpdatedOptions_({\n constrainResolution: enabled\n }));\n };\n /**\n * Get the view projection.\n * @return {import("./proj/Projection.js").default} The projection of the view.\n * @api\n */\n\n\n View.prototype.getProjection = function () {\n return this.projection_;\n };\n /**\n * Get the view resolution.\n * @return {number|undefined} The resolution of the view.\n * @observable\n * @api\n */\n\n\n View.prototype.getResolution = function () {\n return (\n /** @type {number|undefined} */\n this.get(ViewProperty.RESOLUTION)\n );\n };\n /**\n * Get the resolutions for the view. This returns the array of resolutions\n * passed to the constructor of the View, or undefined if none were given.\n * @return {Array|undefined} The resolutions of the view.\n * @api\n */\n\n\n View.prototype.getResolutions = function () {\n return this.resolutions_;\n };\n /**\n * Get the resolution for a provided extent (in map units) and size (in pixels).\n * @param {import("./extent.js").Extent} extent Extent.\n * @param {import("./size.js").Size=} opt_size Box pixel size.\n * @return {number} The resolution at which the provided extent will render at\n * the given size.\n * @api\n */\n\n\n View.prototype.getResolutionForExtent = function (extent, opt_size) {\n return this.getResolutionForExtentInternal(fromUserExtent(extent, this.getProjection()), opt_size);\n };\n /**\n * Get the resolution for a provided extent (in map units) and size (in pixels).\n * @param {import("./extent.js").Extent} extent Extent.\n * @param {import("./size.js").Size=} opt_size Box pixel size.\n * @return {number} The resolution at which the provided extent will render at\n * the given size.\n */\n\n\n View.prototype.getResolutionForExtentInternal = function (extent, opt_size) {\n var size = opt_size || this.getViewportSize_();\n var xResolution = extent_getWidth(extent) / size[0];\n var yResolution = getHeight(extent) / size[1];\n return Math.max(xResolution, yResolution);\n };\n /**\n * Return a function that returns a value between 0 and 1 for a\n * resolution. Exponential scaling is assumed.\n * @param {number=} opt_power Power.\n * @return {function(number): number} Resolution for value function.\n */\n\n\n View.prototype.getResolutionForValueFunction = function (opt_power) {\n var power = opt_power || 2;\n var maxResolution = this.getConstrainedResolution(this.maxResolution_);\n var minResolution = this.minResolution_;\n var max = Math.log(maxResolution / minResolution) / Math.log(power);\n return (\n /**\n * @param {number} value Value.\n * @return {number} Resolution.\n */\n function (value) {\n var resolution = maxResolution / Math.pow(power, value * max);\n return resolution;\n }\n );\n };\n /**\n * Get the view rotation.\n * @return {number} The rotation of the view in radians.\n * @observable\n * @api\n */\n\n\n View.prototype.getRotation = function () {\n return (\n /** @type {number} */\n this.get(ViewProperty.ROTATION)\n );\n };\n /**\n * Return a function that returns a resolution for a value between\n * 0 and 1. Exponential scaling is assumed.\n * @param {number=} opt_power Power.\n * @return {function(number): number} Value for resolution function.\n */\n\n\n View.prototype.getValueForResolutionFunction = function (opt_power) {\n var logPower = Math.log(opt_power || 2);\n var maxResolution = this.getConstrainedResolution(this.maxResolution_);\n var minResolution = this.minResolution_;\n var max = Math.log(maxResolution / minResolution) / logPower;\n return (\n /**\n * @param {number} resolution Resolution.\n * @return {number} Value.\n */\n function (resolution) {\n var value = Math.log(maxResolution / resolution) / logPower / max;\n return value;\n }\n );\n };\n /**\n * Returns the size of the viewport minus padding.\n * @private\n * @param {number=} opt_rotation Take into account the rotation of the viewport when giving the size\n * @return {import("./size.js").Size} Viewport size reduced by the padding.\n */\n\n\n View.prototype.getViewportSizeMinusPadding_ = function (opt_rotation) {\n var size = this.getViewportSize_(opt_rotation);\n var padding = this.padding;\n\n if (padding) {\n size = [size[0] - padding[1] - padding[3], size[1] - padding[0] - padding[2]];\n }\n\n return size;\n };\n /**\n * @return {State} View state.\n */\n\n\n View.prototype.getState = function () {\n var projection = this.getProjection();\n var resolution =\n /** @type {number} */\n this.getResolution();\n var rotation = this.getRotation();\n var center =\n /** @type {import("./coordinate.js").Coordinate} */\n this.getCenterInternal();\n var padding = this.padding;\n\n if (padding) {\n var reducedSize = this.getViewportSizeMinusPadding_();\n center = calculateCenterOn(center, this.getViewportSize_(), [reducedSize[0] / 2 + padding[3], reducedSize[1] / 2 + padding[0]], resolution, rotation);\n }\n\n return {\n center: center.slice(0),\n projection: projection !== undefined ? projection : null,\n resolution: resolution,\n rotation: rotation,\n zoom: this.getZoom()\n };\n };\n /**\n * Get the current zoom level. This method may return non-integer zoom levels\n * if the view does not constrain the resolution, or if an interaction or\n * animation is underway.\n * @return {number|undefined} Zoom.\n * @api\n */\n\n\n View.prototype.getZoom = function () {\n var zoom;\n var resolution = this.getResolution();\n\n if (resolution !== undefined) {\n zoom = this.getZoomForResolution(resolution);\n }\n\n return zoom;\n };\n /**\n * Get the zoom level for a resolution.\n * @param {number} resolution The resolution.\n * @return {number|undefined} The zoom level for the provided resolution.\n * @api\n */\n\n\n View.prototype.getZoomForResolution = function (resolution) {\n var offset = this.minZoom_ || 0;\n var max, zoomFactor;\n\n if (this.resolutions_) {\n var nearest = linearFindNearest(this.resolutions_, resolution, 1);\n offset = nearest;\n max = this.resolutions_[nearest];\n\n if (nearest == this.resolutions_.length - 1) {\n zoomFactor = 2;\n } else {\n zoomFactor = max / this.resolutions_[nearest + 1];\n }\n } else {\n max = this.maxResolution_;\n zoomFactor = this.zoomFactor_;\n }\n\n return offset + Math.log(max / resolution) / Math.log(zoomFactor);\n };\n /**\n * Get the resolution for a zoom level.\n * @param {number} zoom Zoom level.\n * @return {number} The view resolution for the provided zoom level.\n * @api\n */\n\n\n View.prototype.getResolutionForZoom = function (zoom) {\n if (this.resolutions_) {\n if (this.resolutions_.length <= 1) {\n return 0;\n }\n\n var baseLevel = math_clamp(Math.floor(zoom), 0, this.resolutions_.length - 2);\n var zoomFactor = this.resolutions_[baseLevel] / this.resolutions_[baseLevel + 1];\n return this.resolutions_[baseLevel] / Math.pow(zoomFactor, math_clamp(zoom - baseLevel, 0, 1));\n } else {\n return this.maxResolution_ / Math.pow(this.zoomFactor_, zoom - this.minZoom_);\n }\n };\n /**\n * Fit the given geometry or extent based on the given map size and border.\n * The size is pixel dimensions of the box to fit the extent into.\n * In most cases you will want to use the map size, that is `map.getSize()`.\n * Takes care of the map angle.\n * @param {import("./geom/SimpleGeometry.js").default|import("./extent.js").Extent} geometryOrExtent The geometry or\n * extent to fit the view to.\n * @param {FitOptions=} opt_options Options.\n * @api\n */\n\n\n View.prototype.fit = function (geometryOrExtent, opt_options) {\n /** @type {import("./geom/SimpleGeometry.js").default} */\n var geometry;\n asserts_assert(Array.isArray(geometryOrExtent) || typeof\n /** @type {?} */\n geometryOrExtent.getSimplifiedGeometry === \'function\', 24); // Invalid extent or geometry provided as `geometry`\n\n if (Array.isArray(geometryOrExtent)) {\n asserts_assert(!extent_isEmpty(geometryOrExtent), 25); // Cannot fit empty extent provided as `geometry`\n\n var extent = fromUserExtent(geometryOrExtent, this.getProjection());\n geometry = fromExtent(extent);\n } else if (geometryOrExtent.getType() === geom_GeometryType.CIRCLE) {\n var extent = fromUserExtent(geometryOrExtent.getExtent(), this.getProjection());\n geometry = fromExtent(extent);\n geometry.rotate(this.getRotation(), getCenter(extent));\n } else {\n var userProjection = getUserProjection();\n\n if (userProjection) {\n geometry =\n /** @type {import("./geom/SimpleGeometry.js").default} */\n geometryOrExtent.clone().transform(userProjection, this.getProjection());\n } else {\n geometry = geometryOrExtent;\n }\n }\n\n this.fitInternal(geometry, opt_options);\n };\n /**\n * @param {import("./geom/SimpleGeometry.js").default} geometry The geometry.\n * @param {FitOptions=} opt_options Options.\n */\n\n\n View.prototype.fitInternal = function (geometry, opt_options) {\n var options = opt_options || {};\n var size = options.size;\n\n if (!size) {\n size = this.getViewportSizeMinusPadding_();\n }\n\n var padding = options.padding !== undefined ? options.padding : [0, 0, 0, 0];\n var nearest = options.nearest !== undefined ? options.nearest : false;\n var minResolution;\n\n if (options.minResolution !== undefined) {\n minResolution = options.minResolution;\n } else if (options.maxZoom !== undefined) {\n minResolution = this.getResolutionForZoom(options.maxZoom);\n } else {\n minResolution = 0;\n }\n\n var coords = geometry.getFlatCoordinates(); // calculate rotated extent\n\n var rotation = this.getRotation();\n var cosAngle = Math.cos(-rotation);\n var sinAngle = Math.sin(-rotation);\n var minRotX = +Infinity;\n var minRotY = +Infinity;\n var maxRotX = -Infinity;\n var maxRotY = -Infinity;\n var stride = geometry.getStride();\n\n for (var i = 0, ii = coords.length; i < ii; i += stride) {\n var rotX = coords[i] * cosAngle - coords[i + 1] * sinAngle;\n var rotY = coords[i] * sinAngle + coords[i + 1] * cosAngle;\n minRotX = Math.min(minRotX, rotX);\n minRotY = Math.min(minRotY, rotY);\n maxRotX = Math.max(maxRotX, rotX);\n maxRotY = Math.max(maxRotY, rotY);\n } // calculate resolution\n\n\n var resolution = this.getResolutionForExtentInternal([minRotX, minRotY, maxRotX, maxRotY], [size[0] - padding[1] - padding[3], size[1] - padding[0] - padding[2]]);\n resolution = isNaN(resolution) ? minResolution : Math.max(resolution, minResolution);\n resolution = this.getConstrainedResolution(resolution, nearest ? 0 : 1); // calculate center\n\n sinAngle = -sinAngle; // go back to original rotation\n\n var centerRotX = (minRotX + maxRotX) / 2;\n var centerRotY = (minRotY + maxRotY) / 2;\n centerRotX += (padding[1] - padding[3]) / 2 * resolution;\n centerRotY += (padding[0] - padding[2]) / 2 * resolution;\n var centerX = centerRotX * cosAngle - centerRotY * sinAngle;\n var centerY = centerRotY * cosAngle + centerRotX * sinAngle;\n var center = this.getConstrainedCenter([centerX, centerY], resolution);\n var callback = options.callback ? options.callback : VOID;\n\n if (options.duration !== undefined) {\n this.animateInternal({\n resolution: resolution,\n center: center,\n duration: options.duration,\n easing: options.easing\n }, callback);\n } else {\n this.targetResolution_ = resolution;\n this.targetCenter_ = center;\n this.applyTargetState_(false, true);\n animationCallback(callback, true);\n }\n };\n /**\n * Center on coordinate and view position.\n * @param {import("./coordinate.js").Coordinate} coordinate Coordinate.\n * @param {import("./size.js").Size} size Box pixel size.\n * @param {import("./pixel.js").Pixel} position Position on the view to center on.\n * @api\n */\n\n\n View.prototype.centerOn = function (coordinate, size, position) {\n this.centerOnInternal(fromUserCoordinate(coordinate, this.getProjection()), size, position);\n };\n /**\n * @param {import("./coordinate.js").Coordinate} coordinate Coordinate.\n * @param {import("./size.js").Size} size Box pixel size.\n * @param {import("./pixel.js").Pixel} position Position on the view to center on.\n */\n\n\n View.prototype.centerOnInternal = function (coordinate, size, position) {\n this.setCenterInternal(calculateCenterOn(coordinate, size, position, this.getResolution(), this.getRotation()));\n };\n /**\n * Calculates the shift between map and viewport center.\n * @param {import("./coordinate.js").Coordinate} center Center.\n * @param {number} resolution Resolution.\n * @param {number} rotation Rotation.\n * @param {import("./size.js").Size} size Size.\n * @return {Array|undefined} Center shift.\n */\n\n\n View.prototype.calculateCenterShift = function (center, resolution, rotation, size) {\n var centerShift;\n var padding = this.padding;\n\n if (padding && center) {\n var reducedSize = this.getViewportSizeMinusPadding_(-rotation);\n var shiftedCenter = calculateCenterOn(center, size, [reducedSize[0] / 2 + padding[3], reducedSize[1] / 2 + padding[0]], resolution, rotation);\n centerShift = [center[0] - shiftedCenter[0], center[1] - shiftedCenter[1]];\n }\n\n return centerShift;\n };\n /**\n * @return {boolean} Is defined.\n */\n\n\n View.prototype.isDef = function () {\n return !!this.getCenterInternal() && this.getResolution() !== undefined;\n };\n /**\n * Adds relative coordinates to the center of the view. Any extent constraint will apply.\n * @param {import("./coordinate.js").Coordinate} deltaCoordinates Relative value to add.\n * @api\n */\n\n\n View.prototype.adjustCenter = function (deltaCoordinates) {\n var center = toUserCoordinate(this.targetCenter_, this.getProjection());\n this.setCenter([center[0] + deltaCoordinates[0], center[1] + deltaCoordinates[1]]);\n };\n /**\n * Adds relative coordinates to the center of the view. Any extent constraint will apply.\n * @param {import("./coordinate.js").Coordinate} deltaCoordinates Relative value to add.\n */\n\n\n View.prototype.adjustCenterInternal = function (deltaCoordinates) {\n var center = this.targetCenter_;\n this.setCenterInternal([center[0] + deltaCoordinates[0], center[1] + deltaCoordinates[1]]);\n };\n /**\n * Multiply the view resolution by a ratio, optionally using an anchor. Any resolution\n * constraint will apply.\n * @param {number} ratio The ratio to apply on the view resolution.\n * @param {import("./coordinate.js").Coordinate=} opt_anchor The origin of the transformation.\n * @api\n */\n\n\n View.prototype.adjustResolution = function (ratio, opt_anchor) {\n var anchor = opt_anchor && fromUserCoordinate(opt_anchor, this.getProjection());\n this.adjustResolutionInternal(ratio, anchor);\n };\n /**\n * Multiply the view resolution by a ratio, optionally using an anchor. Any resolution\n * constraint will apply.\n * @param {number} ratio The ratio to apply on the view resolution.\n * @param {import("./coordinate.js").Coordinate=} opt_anchor The origin of the transformation.\n */\n\n\n View.prototype.adjustResolutionInternal = function (ratio, opt_anchor) {\n var isMoving = this.getAnimating() || this.getInteracting();\n var size = this.getViewportSize_(this.getRotation());\n var newResolution = this.constraints_.resolution(this.targetResolution_ * ratio, 0, size, isMoving);\n\n if (opt_anchor) {\n this.targetCenter_ = this.calculateCenterZoom(newResolution, opt_anchor);\n }\n\n this.targetResolution_ *= ratio;\n this.applyTargetState_();\n };\n /**\n * Adds a value to the view zoom level, optionally using an anchor. Any resolution\n * constraint will apply.\n * @param {number} delta Relative value to add to the zoom level.\n * @param {import("./coordinate.js").Coordinate=} opt_anchor The origin of the transformation.\n * @api\n */\n\n\n View.prototype.adjustZoom = function (delta, opt_anchor) {\n this.adjustResolution(Math.pow(this.zoomFactor_, -delta), opt_anchor);\n };\n /**\n * Adds a value to the view rotation, optionally using an anchor. Any rotation\n * constraint will apply.\n * @param {number} delta Relative value to add to the zoom rotation, in radians.\n * @param {import("./coordinate.js").Coordinate=} opt_anchor The rotation center.\n * @api\n */\n\n\n View.prototype.adjustRotation = function (delta, opt_anchor) {\n if (opt_anchor) {\n opt_anchor = fromUserCoordinate(opt_anchor, this.getProjection());\n }\n\n this.adjustRotationInternal(delta, opt_anchor);\n };\n /**\n * @param {number} delta Relative value to add to the zoom rotation, in radians.\n * @param {import("./coordinate.js").Coordinate=} opt_anchor The rotation center.\n */\n\n\n View.prototype.adjustRotationInternal = function (delta, opt_anchor) {\n var isMoving = this.getAnimating() || this.getInteracting();\n var newRotation = this.constraints_.rotation(this.targetRotation_ + delta, isMoving);\n\n if (opt_anchor) {\n this.targetCenter_ = this.calculateCenterRotate(newRotation, opt_anchor);\n }\n\n this.targetRotation_ += delta;\n this.applyTargetState_();\n };\n /**\n * Set the center of the current view. Any extent constraint will apply.\n * @param {import("./coordinate.js").Coordinate|undefined} center The center of the view.\n * @observable\n * @api\n */\n\n\n View.prototype.setCenter = function (center) {\n this.setCenterInternal(fromUserCoordinate(center, this.getProjection()));\n };\n /**\n * Set the center using the view projection (not the user projection).\n * @param {import("./coordinate.js").Coordinate|undefined} center The center of the view.\n */\n\n\n View.prototype.setCenterInternal = function (center) {\n this.targetCenter_ = center;\n this.applyTargetState_();\n };\n /**\n * @param {import("./ViewHint.js").default} hint Hint.\n * @param {number} delta Delta.\n * @return {number} New value.\n */\n\n\n View.prototype.setHint = function (hint, delta) {\n this.hints_[hint] += delta;\n this.changed();\n return this.hints_[hint];\n };\n /**\n * Set the resolution for this view. Any resolution constraint will apply.\n * @param {number|undefined} resolution The resolution of the view.\n * @observable\n * @api\n */\n\n\n View.prototype.setResolution = function (resolution) {\n this.targetResolution_ = resolution;\n this.applyTargetState_();\n };\n /**\n * Set the rotation for this view. Any rotation constraint will apply.\n * @param {number} rotation The rotation of the view in radians.\n * @observable\n * @api\n */\n\n\n View.prototype.setRotation = function (rotation) {\n this.targetRotation_ = rotation;\n this.applyTargetState_();\n };\n /**\n * Zoom to a specific zoom level. Any resolution constrain will apply.\n * @param {number} zoom Zoom level.\n * @api\n */\n\n\n View.prototype.setZoom = function (zoom) {\n this.setResolution(this.getResolutionForZoom(zoom));\n };\n /**\n * Recompute rotation/resolution/center based on target values.\n * Note: we have to compute rotation first, then resolution and center considering that\n * parameters can influence one another in case a view extent constraint is present.\n * @param {boolean=} opt_doNotCancelAnims Do not cancel animations.\n * @param {boolean=} opt_forceMoving Apply constraints as if the view is moving.\n * @private\n */\n\n\n View.prototype.applyTargetState_ = function (opt_doNotCancelAnims, opt_forceMoving) {\n var isMoving = this.getAnimating() || this.getInteracting() || opt_forceMoving; // compute rotation\n\n var newRotation = this.constraints_.rotation(this.targetRotation_, isMoving);\n var size = this.getViewportSize_(newRotation);\n var newResolution = this.constraints_.resolution(this.targetResolution_, 0, size, isMoving);\n var newCenter = this.constraints_.center(this.targetCenter_, newResolution, size, isMoving, this.calculateCenterShift(this.targetCenter_, newResolution, newRotation, size));\n\n if (this.get(ViewProperty.ROTATION) !== newRotation) {\n this.set(ViewProperty.ROTATION, newRotation);\n }\n\n if (this.get(ViewProperty.RESOLUTION) !== newResolution) {\n this.set(ViewProperty.RESOLUTION, newResolution);\n }\n\n if (!this.get(ViewProperty.CENTER) || !coordinate_equals(this.get(ViewProperty.CENTER), newCenter)) {\n this.set(ViewProperty.CENTER, newCenter);\n }\n\n if (this.getAnimating() && !opt_doNotCancelAnims) {\n this.cancelAnimations();\n }\n\n this.cancelAnchor_ = undefined;\n };\n /**\n * If any constraints need to be applied, an animation will be triggered.\n * This is typically done on interaction end.\n * Note: calling this with a duration of 0 will apply the constrained values straight away,\n * without animation.\n * @param {number=} opt_duration The animation duration in ms.\n * @param {number=} opt_resolutionDirection Which direction to zoom.\n * @param {import("./coordinate.js").Coordinate=} opt_anchor The origin of the transformation.\n */\n\n\n View.prototype.resolveConstraints = function (opt_duration, opt_resolutionDirection, opt_anchor) {\n var duration = opt_duration !== undefined ? opt_duration : 200;\n var direction = opt_resolutionDirection || 0;\n var newRotation = this.constraints_.rotation(this.targetRotation_);\n var size = this.getViewportSize_(newRotation);\n var newResolution = this.constraints_.resolution(this.targetResolution_, direction, size);\n var newCenter = this.constraints_.center(this.targetCenter_, newResolution, size, false, this.calculateCenterShift(this.targetCenter_, newResolution, newRotation, size));\n\n if (duration === 0 && !this.cancelAnchor_) {\n this.targetResolution_ = newResolution;\n this.targetRotation_ = newRotation;\n this.targetCenter_ = newCenter;\n this.applyTargetState_();\n return;\n }\n\n var anchor = opt_anchor || (duration === 0 ? this.cancelAnchor_ : undefined);\n this.cancelAnchor_ = undefined;\n\n if (this.getResolution() !== newResolution || this.getRotation() !== newRotation || !this.getCenterInternal() || !coordinate_equals(this.getCenterInternal(), newCenter)) {\n if (this.getAnimating()) {\n this.cancelAnimations();\n }\n\n this.animateInternal({\n rotation: newRotation,\n center: newCenter,\n resolution: newResolution,\n duration: duration,\n easing: easeOut,\n anchor: anchor\n });\n }\n };\n /**\n * Notify the View that an interaction has started.\n * The view state will be resolved to a stable one if needed\n * (depending on its constraints).\n * @api\n */\n\n\n View.prototype.beginInteraction = function () {\n this.resolveConstraints(0);\n this.setHint(ViewHint.INTERACTING, 1);\n };\n /**\n * Notify the View that an interaction has ended. The view state will be resolved\n * to a stable one if needed (depending on its constraints).\n * @param {number=} opt_duration Animation duration in ms.\n * @param {number=} opt_resolutionDirection Which direction to zoom.\n * @param {import("./coordinate.js").Coordinate=} opt_anchor The origin of the transformation.\n * @api\n */\n\n\n View.prototype.endInteraction = function (opt_duration, opt_resolutionDirection, opt_anchor) {\n var anchor = opt_anchor && fromUserCoordinate(opt_anchor, this.getProjection());\n this.endInteractionInternal(opt_duration, opt_resolutionDirection, anchor);\n };\n /**\n * Notify the View that an interaction has ended. The view state will be resolved\n * to a stable one if needed (depending on its constraints).\n * @param {number=} opt_duration Animation duration in ms.\n * @param {number=} opt_resolutionDirection Which direction to zoom.\n * @param {import("./coordinate.js").Coordinate=} opt_anchor The origin of the transformation.\n */\n\n\n View.prototype.endInteractionInternal = function (opt_duration, opt_resolutionDirection, opt_anchor) {\n this.setHint(ViewHint.INTERACTING, -1);\n this.resolveConstraints(opt_duration, opt_resolutionDirection, opt_anchor);\n };\n /**\n * Get a valid position for the view center according to the current constraints.\n * @param {import("./coordinate.js").Coordinate|undefined} targetCenter Target center position.\n * @param {number=} opt_targetResolution Target resolution. If not supplied, the current one will be used.\n * This is useful to guess a valid center position at a different zoom level.\n * @return {import("./coordinate.js").Coordinate|undefined} Valid center position.\n */\n\n\n View.prototype.getConstrainedCenter = function (targetCenter, opt_targetResolution) {\n var size = this.getViewportSize_(this.getRotation());\n return this.constraints_.center(targetCenter, opt_targetResolution || this.getResolution(), size);\n };\n /**\n * Get a valid zoom level according to the current view constraints.\n * @param {number|undefined} targetZoom Target zoom.\n * @param {number=} [opt_direction=0] Indicate which resolution should be used\n * by a renderer if the view resolution does not match any resolution of the tile source.\n * If 0, the nearest resolution will be used. If 1, the nearest lower resolution\n * will be used. If -1, the nearest higher resolution will be used.\n * @return {number|undefined} Valid zoom level.\n */\n\n\n View.prototype.getConstrainedZoom = function (targetZoom, opt_direction) {\n var targetRes = this.getResolutionForZoom(targetZoom);\n return this.getZoomForResolution(this.getConstrainedResolution(targetRes, opt_direction));\n };\n /**\n * Get a valid resolution according to the current view constraints.\n * @param {number|undefined} targetResolution Target resolution.\n * @param {number=} [opt_direction=0] Indicate which resolution should be used\n * by a renderer if the view resolution does not match any resolution of the tile source.\n * If 0, the nearest resolution will be used. If 1, the nearest lower resolution\n * will be used. If -1, the nearest higher resolution will be used.\n * @return {number|undefined} Valid resolution.\n */\n\n\n View.prototype.getConstrainedResolution = function (targetResolution, opt_direction) {\n var direction = opt_direction || 0;\n var size = this.getViewportSize_(this.getRotation());\n return this.constraints_.resolution(targetResolution, direction, size);\n };\n\n return View;\n}(ol_Object);\n/**\n * @param {Function} callback Callback.\n * @param {*} returnValue Return value.\n */\n\n\nfunction animationCallback(callback, returnValue) {\n setTimeout(function () {\n callback(returnValue);\n }, 0);\n}\n/**\n * @param {ViewOptions} options View options.\n * @return {import("./centerconstraint.js").Type} The constraint.\n */\n\n\nfunction createCenterConstraint(options) {\n if (options.extent !== undefined) {\n var smooth = options.smoothExtentConstraint !== undefined ? options.smoothExtentConstraint : true;\n return createExtent(options.extent, options.constrainOnlyCenter, smooth);\n }\n\n var projection = createProjection(options.projection, \'EPSG:3857\');\n\n if (options.multiWorld !== true && projection.isGlobal()) {\n var extent = projection.getExtent().slice();\n extent[0] = -Infinity;\n extent[2] = Infinity;\n return createExtent(extent, false, false);\n }\n\n return none;\n}\n/**\n * @param {ViewOptions} options View options.\n * @return {{constraint: import("./resolutionconstraint.js").Type, maxResolution: number,\n * minResolution: number, minZoom: number, zoomFactor: number}} The constraint.\n */\n\nfunction createResolutionConstraint(options) {\n var resolutionConstraint;\n var maxResolution;\n var minResolution; // TODO: move these to be ol constants\n // see https://github.com/openlayers/openlayers/issues/2076\n\n var defaultMaxZoom = 28;\n var defaultZoomFactor = 2;\n var minZoom = options.minZoom !== undefined ? options.minZoom : DEFAULT_MIN_ZOOM;\n var maxZoom = options.maxZoom !== undefined ? options.maxZoom : defaultMaxZoom;\n var zoomFactor = options.zoomFactor !== undefined ? options.zoomFactor : defaultZoomFactor;\n var multiWorld = options.multiWorld !== undefined ? options.multiWorld : false;\n var smooth = options.smoothResolutionConstraint !== undefined ? options.smoothResolutionConstraint : true;\n var showFullExtent = options.showFullExtent !== undefined ? options.showFullExtent : false;\n var projection = createProjection(options.projection, \'EPSG:3857\');\n var projExtent = projection.getExtent();\n var constrainOnlyCenter = options.constrainOnlyCenter;\n var extent = options.extent;\n\n if (!multiWorld && !extent && projection.isGlobal()) {\n constrainOnlyCenter = false;\n extent = projExtent;\n }\n\n if (options.resolutions !== undefined) {\n var resolutions = options.resolutions;\n maxResolution = resolutions[minZoom];\n minResolution = resolutions[maxZoom] !== undefined ? resolutions[maxZoom] : resolutions[resolutions.length - 1];\n\n if (options.constrainResolution) {\n resolutionConstraint = createSnapToResolutions(resolutions, smooth, !constrainOnlyCenter && extent, showFullExtent);\n } else {\n resolutionConstraint = createMinMaxResolution(maxResolution, minResolution, smooth, !constrainOnlyCenter && extent, showFullExtent);\n }\n } else {\n // calculate the default min and max resolution\n var size = !projExtent ? // use an extent that can fit the whole world if need be\n 360 * Units_METERS_PER_UNIT[proj_Units.DEGREES] / projection.getMetersPerUnit() : Math.max(extent_getWidth(projExtent), getHeight(projExtent));\n var defaultMaxResolution = size / DEFAULT_TILE_SIZE / Math.pow(defaultZoomFactor, DEFAULT_MIN_ZOOM);\n var defaultMinResolution = defaultMaxResolution / Math.pow(defaultZoomFactor, defaultMaxZoom - DEFAULT_MIN_ZOOM); // user provided maxResolution takes precedence\n\n maxResolution = options.maxResolution;\n\n if (maxResolution !== undefined) {\n minZoom = 0;\n } else {\n maxResolution = defaultMaxResolution / Math.pow(zoomFactor, minZoom);\n } // user provided minResolution takes precedence\n\n\n minResolution = options.minResolution;\n\n if (minResolution === undefined) {\n if (options.maxZoom !== undefined) {\n if (options.maxResolution !== undefined) {\n minResolution = maxResolution / Math.pow(zoomFactor, maxZoom);\n } else {\n minResolution = defaultMaxResolution / Math.pow(zoomFactor, maxZoom);\n }\n } else {\n minResolution = defaultMinResolution;\n }\n } // given discrete zoom levels, minResolution may be different than provided\n\n\n maxZoom = minZoom + Math.floor(Math.log(maxResolution / minResolution) / Math.log(zoomFactor));\n minResolution = maxResolution / Math.pow(zoomFactor, maxZoom - minZoom);\n\n if (options.constrainResolution) {\n resolutionConstraint = createSnapToPower(zoomFactor, maxResolution, minResolution, smooth, !constrainOnlyCenter && extent, showFullExtent);\n } else {\n resolutionConstraint = createMinMaxResolution(maxResolution, minResolution, smooth, !constrainOnlyCenter && extent, showFullExtent);\n }\n }\n\n return {\n constraint: resolutionConstraint,\n maxResolution: maxResolution,\n minResolution: minResolution,\n minZoom: minZoom,\n zoomFactor: zoomFactor\n };\n}\n/**\n * @param {ViewOptions} options View options.\n * @return {import("./rotationconstraint.js").Type} Rotation constraint.\n */\n\nfunction createRotationConstraint(options) {\n var enableRotation = options.enableRotation !== undefined ? options.enableRotation : true;\n\n if (enableRotation) {\n var constrainRotation = options.constrainRotation;\n\n if (constrainRotation === undefined || constrainRotation === true) {\n return createSnapToZero();\n } else if (constrainRotation === false) {\n return rotationconstraint_none;\n } else if (typeof constrainRotation === \'number\') {\n return createSnapToN(constrainRotation);\n } else {\n return rotationconstraint_none;\n }\n } else {\n return disable;\n }\n}\n/**\n * Determine if an animation involves no view change.\n * @param {Animation} animation The animation.\n * @return {boolean} The animation involves no view change.\n */\n\nfunction isNoopAnimation(animation) {\n if (animation.sourceCenter && animation.targetCenter) {\n if (!coordinate_equals(animation.sourceCenter, animation.targetCenter)) {\n return false;\n }\n }\n\n if (animation.sourceResolution !== animation.targetResolution) {\n return false;\n }\n\n if (animation.sourceRotation !== animation.targetRotation) {\n return false;\n }\n\n return true;\n}\n/**\n * @param {import("./coordinate.js").Coordinate} coordinate Coordinate.\n * @param {import("./size.js").Size} size Box pixel size.\n * @param {import("./pixel.js").Pixel} position Position on the view to center on.\n * @param {number} resolution Resolution.\n * @param {number} rotation Rotation.\n * @return {import("./coordinate.js").Coordinate} Shifted center.\n */\n\nfunction calculateCenterOn(coordinate, size, position, resolution, rotation) {\n // calculate rotated position\n var cosAngle = Math.cos(-rotation);\n var sinAngle = Math.sin(-rotation);\n var rotX = coordinate[0] * cosAngle - coordinate[1] * sinAngle;\n var rotY = coordinate[1] * cosAngle + coordinate[0] * sinAngle;\n rotX += (size[0] / 2 - position[0]) * resolution;\n rotY += (position[1] - size[1] / 2) * resolution; // go back to original angle\n\n sinAngle = -sinAngle; // go back to original rotation\n\n var centerX = rotX * cosAngle - rotY * sinAngle;\n var centerY = rotY * cosAngle + rotX * sinAngle;\n return [centerX, centerY];\n}\n\n/* harmony default export */ var ol_View = (View);\n;// CONCATENATED MODULE: ./node_modules/ol/size.js\n/**\n * @module ol/size\n */\n\n/**\n * An array of numbers representing a size: `[width, height]`.\n * @typedef {Array} Size\n * @api\n */\n\n/**\n * Returns a buffered size.\n * @param {Size} size Size.\n * @param {number} num The amount by which to buffer.\n * @param {Size=} opt_size Optional reusable size array.\n * @return {Size} The buffered size.\n */\nfunction size_buffer(size, num, opt_size) {\n if (opt_size === undefined) {\n opt_size = [0, 0];\n }\n\n opt_size[0] = size[0] + 2 * num;\n opt_size[1] = size[1] + 2 * num;\n return opt_size;\n}\n/**\n * Determines if a size has a positive area.\n * @param {Size} size The size to test.\n * @return {boolean} The size has a positive area.\n */\n\nfunction hasArea(size) {\n return size[0] > 0 && size[1] > 0;\n}\n/**\n * Returns a size scaled by a ratio. The result will be an array of integers.\n * @param {Size} size Size.\n * @param {number} ratio Ratio.\n * @param {Size=} opt_size Optional reusable size array.\n * @return {Size} The scaled size.\n */\n\nfunction size_scale(size, ratio, opt_size) {\n if (opt_size === undefined) {\n opt_size = [0, 0];\n }\n\n opt_size[0] = size[0] * ratio + 0.5 | 0;\n opt_size[1] = size[1] * ratio + 0.5 | 0;\n return opt_size;\n}\n/**\n * Returns an `Size` array for the passed in number (meaning: square) or\n * `Size` array.\n * (meaning: non-square),\n * @param {number|Size} size Width and height.\n * @param {Size=} opt_size Optional reusable size array.\n * @return {Size} Size.\n * @api\n */\n\nfunction toSize(size, opt_size) {\n if (Array.isArray(size)) {\n return size;\n } else {\n if (opt_size === undefined) {\n opt_size = [size, size];\n } else {\n opt_size[0] = size;\n opt_size[1] = size;\n }\n\n return opt_size;\n }\n}\n;// CONCATENATED MODULE: ./node_modules/ol/PluggableMap.js\nvar PluggableMap_extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n/**\n * @module ol/PluggableMap\n */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * State of the current frame. Only `pixelRatio`, `time` and `viewState` should\n * be used in applications.\n * @typedef {Object} FrameState\n * @property {number} pixelRatio The pixel ratio of the frame.\n * @property {number} time The time when rendering of the frame was requested.\n * @property {import("./View.js").State} viewState The state of the current view.\n * @property {boolean} animate\n * @property {import("./transform.js").Transform} coordinateToPixelTransform\n * @property {import("rbush").default} declutterTree\n * @property {null|import("./extent.js").Extent} extent\n * @property {number} index\n * @property {Array} layerStatesArray\n * @property {number} layerIndex\n * @property {import("./transform.js").Transform} pixelToCoordinateTransform\n * @property {Array} postRenderFunctions\n * @property {import("./size.js").Size} size\n * @property {TileQueue} tileQueue\n * @property {!Object>} usedTiles\n * @property {Array} viewHints\n * @property {!Object>} wantedTiles\n */\n\n/**\n * @typedef {function(PluggableMap, ?FrameState): any} PostRenderFunction\n */\n\n/**\n * @typedef {Object} AtPixelOptions\n * @property {undefined|function(import("./layer/Layer.js").default): boolean} [layerFilter] Layer filter\n * function. The filter function will receive one argument, the\n * {@link module:ol/layer/Layer layer-candidate} and it should return a boolean value.\n * Only layers which are visible and for which this function returns `true`\n * will be tested for features. By default, all visible layers will be tested.\n * @property {number} [hitTolerance=0] Hit-detection tolerance in css pixels. Pixels\n * inside the radius around the given position will be checked for features.\n * @property {boolean} [checkWrapped=true] Check-Wrapped Will check for for wrapped geometries inside the range of\n * +/- 1 world width. Works only if a projection is used that can be wrapped.\n */\n\n/**\n * @typedef {Object} MapOptionsInternal\n * @property {Collection} [controls]\n * @property {Collection} [interactions]\n * @property {HTMLElement|Document} keyboardEventTarget\n * @property {Collection} overlays\n * @property {Object} values\n */\n\n/**\n * Object literal with config options for the map.\n * @typedef {Object} MapOptions\n * @property {Collection|Array} [controls]\n * Controls initially added to the map. If not specified,\n * {@link module:ol/control~defaults} is used.\n * @property {number} [pixelRatio=window.devicePixelRatio] The ratio between\n * physical pixels and device-independent pixels (dips) on the device.\n * @property {Collection|Array} [interactions]\n * Interactions that are initially added to the map. If not specified,\n * {@link module:ol/interaction~defaults} is used.\n * @property {HTMLElement|Document|string} [keyboardEventTarget] The element to\n * listen to keyboard events on. This determines when the `KeyboardPan` and\n * `KeyboardZoom` interactions trigger. For example, if this option is set to\n * `document` the keyboard interactions will always trigger. If this option is\n * not specified, the element the library listens to keyboard events on is the\n * map target (i.e. the user-provided div for the map). If this is not\n * `document`, the target element needs to be focused for key events to be\n * emitted, requiring that the target element has a `tabindex` attribute.\n * @property {Array|Collection|LayerGroup} [layers]\n * Layers. If this is not defined, a map with no layers will be rendered. Note\n * that layers are rendered in the order supplied, so if you want, for example,\n * a vector layer to appear on top of a tile layer, it must come after the tile\n * layer.\n * @property {number} [maxTilesLoading=16] Maximum number tiles to load\n * simultaneously.\n * @property {number} [moveTolerance=1] The minimum distance in pixels the\n * cursor must move to be detected as a map move event instead of a click.\n * Increasing this value can make it easier to click on the map.\n * @property {Collection|Array} [overlays]\n * Overlays initially added to the map. By default, no overlays are added.\n * @property {HTMLElement|string} [target] The container for the map, either the\n * element itself or the `id` of the element. If not specified at construction\n * time, {@link module:ol/Map~Map#setTarget} must be called for the map to be\n * rendered. If passed by element, the container can be in a secondary document.\n * @property {View} [view] The map\'s view. No layer sources will be\n * fetched unless this is specified at construction time or through\n * {@link module:ol/Map~Map#setView}.\n */\n\n/**\n * @fires import("./MapBrowserEvent.js").MapBrowserEvent\n * @fires import("./MapEvent.js").MapEvent\n * @fires import("./render/Event.js").default#precompose\n * @fires import("./render/Event.js").default#postcompose\n * @fires import("./render/Event.js").default#rendercomplete\n * @api\n */\n\nvar PluggableMap =\n/** @class */\nfunction (_super) {\n PluggableMap_extends(PluggableMap, _super);\n /**\n * @param {MapOptions} options Map options.\n */\n\n\n function PluggableMap(options) {\n var _this = _super.call(this) || this;\n\n var optionsInternal = createOptionsInternal(options);\n /** @private */\n\n _this.boundHandleBrowserEvent_ = _this.handleBrowserEvent.bind(_this);\n /**\n * @type {number}\n * @private\n */\n\n _this.maxTilesLoading_ = options.maxTilesLoading !== undefined ? options.maxTilesLoading : 16;\n /**\n * @private\n * @type {number}\n */\n\n _this.pixelRatio_ = options.pixelRatio !== undefined ? options.pixelRatio : DEVICE_PIXEL_RATIO;\n /**\n * @private\n * @type {*}\n */\n\n _this.postRenderTimeoutHandle_;\n /**\n * @private\n * @type {number|undefined}\n */\n\n _this.animationDelayKey_;\n /**\n * @private\n */\n\n _this.animationDelay_ =\n /** @this {PluggableMap} */\n function () {\n this.animationDelayKey_ = undefined;\n this.renderFrame_(Date.now());\n }.bind(_this);\n /**\n * @private\n * @type {import("./transform.js").Transform}\n */\n\n\n _this.coordinateToPixelTransform_ = create();\n /**\n * @private\n * @type {import("./transform.js").Transform}\n */\n\n _this.pixelToCoordinateTransform_ = create();\n /**\n * @private\n * @type {number}\n */\n\n _this.frameIndex_ = 0;\n /**\n * @private\n * @type {?FrameState}\n */\n\n _this.frameState_ = null;\n /**\n * The extent at the previous \'moveend\' event.\n * @private\n * @type {import("./extent.js").Extent}\n */\n\n _this.previousExtent_ = null;\n /**\n * @private\n * @type {?import("./events.js").EventsKey}\n */\n\n _this.viewPropertyListenerKey_ = null;\n /**\n * @private\n * @type {?import("./events.js").EventsKey}\n */\n\n _this.viewChangeListenerKey_ = null;\n /**\n * @private\n * @type {?Array}\n */\n\n _this.layerGroupPropertyListenerKeys_ = null;\n /**\n * @private\n * @type {!HTMLElement}\n */\n\n _this.viewport_ = document.createElement(\'div\');\n _this.viewport_.className = \'ol-viewport\' + (\'ontouchstart\' in window ? \' ol-touch\' : \'\');\n _this.viewport_.style.position = \'relative\';\n _this.viewport_.style.overflow = \'hidden\';\n _this.viewport_.style.width = \'100%\';\n _this.viewport_.style.height = \'100%\';\n /**\n * @private\n * @type {!HTMLElement}\n */\n\n _this.overlayContainer_ = document.createElement(\'div\');\n _this.overlayContainer_.style.position = \'absolute\';\n _this.overlayContainer_.style.zIndex = \'0\';\n _this.overlayContainer_.style.width = \'100%\';\n _this.overlayContainer_.style.height = \'100%\';\n _this.overlayContainer_.style.pointerEvents = \'none\';\n _this.overlayContainer_.className = \'ol-overlaycontainer\';\n\n _this.viewport_.appendChild(_this.overlayContainer_);\n /**\n * @private\n * @type {!HTMLElement}\n */\n\n\n _this.overlayContainerStopEvent_ = document.createElement(\'div\');\n _this.overlayContainerStopEvent_.style.position = \'absolute\';\n _this.overlayContainerStopEvent_.style.zIndex = \'0\';\n _this.overlayContainerStopEvent_.style.width = \'100%\';\n _this.overlayContainerStopEvent_.style.height = \'100%\';\n _this.overlayContainerStopEvent_.style.pointerEvents = \'none\';\n _this.overlayContainerStopEvent_.className = \'ol-overlaycontainer-stopevent\';\n\n _this.viewport_.appendChild(_this.overlayContainerStopEvent_);\n /**\n * @private\n * @type {MapBrowserEventHandler}\n */\n\n\n _this.mapBrowserEventHandler_ = null;\n /**\n * @private\n * @type {number}\n */\n\n _this.moveTolerance_ = options.moveTolerance;\n /**\n * @private\n * @type {HTMLElement|Document}\n */\n\n _this.keyboardEventTarget_ = optionsInternal.keyboardEventTarget;\n /**\n * @private\n * @type {?Array}\n */\n\n _this.keyHandlerKeys_ = null;\n /**\n * @type {Collection}\n * @protected\n */\n\n _this.controls = optionsInternal.controls || new ol_Collection();\n /**\n * @type {Collection}\n * @protected\n */\n\n _this.interactions = optionsInternal.interactions || new ol_Collection();\n /**\n * @type {Collection}\n * @private\n */\n\n _this.overlays_ = optionsInternal.overlays;\n /**\n * A lookup of overlays by id.\n * @private\n * @type {Object}\n */\n\n _this.overlayIdIndex_ = {};\n /**\n * @type {import("./renderer/Map.js").default}\n * @private\n */\n\n _this.renderer_ = null;\n /**\n * @type {undefined|function(Event): void}\n * @private\n */\n\n _this.handleResize_;\n /**\n * @private\n * @type {!Array}\n */\n\n _this.postRenderFunctions_ = [];\n /**\n * @private\n * @type {TileQueue}\n */\n\n _this.tileQueue_ = new ol_TileQueue(_this.getTilePriority.bind(_this), _this.handleTileChange_.bind(_this));\n\n _this.addEventListener(getChangeEventType(MapProperty.LAYERGROUP), _this.handleLayerGroupChanged_);\n\n _this.addEventListener(getChangeEventType(MapProperty.VIEW), _this.handleViewChanged_);\n\n _this.addEventListener(getChangeEventType(MapProperty.SIZE), _this.handleSizeChanged_);\n\n _this.addEventListener(getChangeEventType(MapProperty.TARGET), _this.handleTargetChanged_); // setProperties will trigger the rendering of the map if the map\n // is "defined" already.\n\n\n _this.setProperties(optionsInternal.values);\n\n _this.controls.forEach(\n /**\n * @param {import("./control/Control.js").default} control Control.\n * @this {PluggableMap}\n */\n function (control) {\n control.setMap(this);\n }.bind(_this));\n\n _this.controls.addEventListener(CollectionEventType.ADD,\n /**\n * @param {import("./Collection.js").CollectionEvent} event CollectionEvent.\n */\n function (event) {\n event.element.setMap(this);\n }.bind(_this));\n\n _this.controls.addEventListener(CollectionEventType.REMOVE,\n /**\n * @param {import("./Collection.js").CollectionEvent} event CollectionEvent.\n */\n function (event) {\n event.element.setMap(null);\n }.bind(_this));\n\n _this.interactions.forEach(\n /**\n * @param {import("./interaction/Interaction.js").default} interaction Interaction.\n * @this {PluggableMap}\n */\n function (interaction) {\n interaction.setMap(this);\n }.bind(_this));\n\n _this.interactions.addEventListener(CollectionEventType.ADD,\n /**\n * @param {import("./Collection.js").CollectionEvent} event CollectionEvent.\n */\n function (event) {\n event.element.setMap(this);\n }.bind(_this));\n\n _this.interactions.addEventListener(CollectionEventType.REMOVE,\n /**\n * @param {import("./Collection.js").CollectionEvent} event CollectionEvent.\n */\n function (event) {\n event.element.setMap(null);\n }.bind(_this));\n\n _this.overlays_.forEach(_this.addOverlayInternal_.bind(_this));\n\n _this.overlays_.addEventListener(CollectionEventType.ADD,\n /**\n * @param {import("./Collection.js").CollectionEvent} event CollectionEvent.\n */\n function (event) {\n this.addOverlayInternal_(\n /** @type {import("./Overlay.js").default} */\n event.element);\n }.bind(_this));\n\n _this.overlays_.addEventListener(CollectionEventType.REMOVE,\n /**\n * @param {import("./Collection.js").CollectionEvent} event CollectionEvent.\n */\n function (event) {\n var overlay =\n /** @type {import("./Overlay.js").default} */\n event.element;\n var id = overlay.getId();\n\n if (id !== undefined) {\n delete this.overlayIdIndex_[id.toString()];\n }\n\n event.element.setMap(null);\n }.bind(_this));\n\n return _this;\n }\n /**\n * @abstract\n * @return {import("./renderer/Map.js").default} The map renderer\n */\n\n\n PluggableMap.prototype.createRenderer = function () {\n throw new Error(\'Use a map type that has a createRenderer method\');\n };\n /**\n * Add the given control to the map.\n * @param {import("./control/Control.js").default} control Control.\n * @api\n */\n\n\n PluggableMap.prototype.addControl = function (control) {\n this.getControls().push(control);\n };\n /**\n * Add the given interaction to the map. If you want to add an interaction\n * at another point of the collection use `getInteraction()` and the methods\n * available on {@link module:ol/Collection~Collection}. This can be used to\n * stop the event propagation from the handleEvent function. The interactions\n * get to handle the events in the reverse order of this collection.\n * @param {import("./interaction/Interaction.js").default} interaction Interaction to add.\n * @api\n */\n\n\n PluggableMap.prototype.addInteraction = function (interaction) {\n this.getInteractions().push(interaction);\n };\n /**\n * Adds the given layer to the top of this map. If you want to add a layer\n * elsewhere in the stack, use `getLayers()` and the methods available on\n * {@link module:ol/Collection~Collection}.\n * @param {import("./layer/Base.js").default} layer Layer.\n * @api\n */\n\n\n PluggableMap.prototype.addLayer = function (layer) {\n var layers = this.getLayerGroup().getLayers();\n layers.push(layer);\n };\n /**\n * Add the given overlay to the map.\n * @param {import("./Overlay.js").default} overlay Overlay.\n * @api\n */\n\n\n PluggableMap.prototype.addOverlay = function (overlay) {\n this.getOverlays().push(overlay);\n };\n /**\n * This deals with map\'s overlay collection changes.\n * @param {import("./Overlay.js").default} overlay Overlay.\n * @private\n */\n\n\n PluggableMap.prototype.addOverlayInternal_ = function (overlay) {\n var id = overlay.getId();\n\n if (id !== undefined) {\n this.overlayIdIndex_[id.toString()] = overlay;\n }\n\n overlay.setMap(this);\n };\n /**\n *\n * Clean up.\n */\n\n\n PluggableMap.prototype.disposeInternal = function () {\n this.setTarget(null);\n\n _super.prototype.disposeInternal.call(this);\n };\n /**\n * Detect features that intersect a pixel on the viewport, and execute a\n * callback with each intersecting feature. Layers included in the detection can\n * be configured through the `layerFilter` option in `opt_options`.\n * @param {import("./pixel.js").Pixel} pixel Pixel.\n * @param {function(import("./Feature.js").FeatureLike, import("./layer/Layer.js").default, import("./geom/SimpleGeometry.js").default): T} callback Feature callback. The callback will be\n * called with two arguments. The first argument is one\n * {@link module:ol/Feature feature} or\n * {@link module:ol/render/Feature render feature} at the pixel, the second is\n * the {@link module:ol/layer/Layer layer} of the feature and will be null for\n * unmanaged layers. To stop detection, callback functions can return a\n * truthy value.\n * @param {AtPixelOptions=} opt_options Optional options.\n * @return {T|undefined} Callback result, i.e. the return value of last\n * callback execution, or the first truthy callback return value.\n * @template S,T\n * @api\n */\n\n\n PluggableMap.prototype.forEachFeatureAtPixel = function (pixel, callback, opt_options) {\n if (!this.frameState_) {\n return;\n }\n\n var coordinate = this.getCoordinateFromPixelInternal(pixel);\n opt_options = opt_options !== undefined ? opt_options : {};\n var hitTolerance = opt_options.hitTolerance !== undefined ? opt_options.hitTolerance : 0;\n var layerFilter = opt_options.layerFilter !== undefined ? opt_options.layerFilter : TRUE;\n var checkWrapped = opt_options.checkWrapped !== false;\n return this.renderer_.forEachFeatureAtCoordinate(coordinate, this.frameState_, hitTolerance, checkWrapped, callback, null, layerFilter, null);\n };\n /**\n * Get all features that intersect a pixel on the viewport.\n * @param {import("./pixel.js").Pixel} pixel Pixel.\n * @param {AtPixelOptions=} opt_options Optional options.\n * @return {Array} The detected features or\n * an empty array if none were found.\n * @api\n */\n\n\n PluggableMap.prototype.getFeaturesAtPixel = function (pixel, opt_options) {\n var features = [];\n this.forEachFeatureAtPixel(pixel, function (feature) {\n features.push(feature);\n }, opt_options);\n return features;\n };\n /**\n * Detect layers that have a color value at a pixel on the viewport, and\n * execute a callback with each matching layer. Layers included in the\n * detection can be configured through `opt_layerFilter`.\n *\n * Note: this may give false positives unless the map layers have had different `className`\n * properties assigned to them.\n *\n * @param {import("./pixel.js").Pixel} pixel Pixel.\n * @param {function(this: S, import("./layer/Layer.js").default, (Uint8ClampedArray|Uint8Array)): T} callback\n * Layer callback. This callback will receive two arguments: first is the\n * {@link module:ol/layer/Layer layer}, second argument is an array representing\n * [R, G, B, A] pixel values (0 - 255) and will be `null` for layer types\n * that do not currently support this argument. To stop detection, callback\n * functions can return a truthy value.\n * @param {AtPixelOptions=} opt_options Configuration options.\n * @return {T|undefined} Callback result, i.e. the return value of last\n * callback execution, or the first truthy callback return value.\n * @template S,T\n * @api\n */\n\n\n PluggableMap.prototype.forEachLayerAtPixel = function (pixel, callback, opt_options) {\n if (!this.frameState_) {\n return;\n }\n\n var options = opt_options || {};\n var hitTolerance = options.hitTolerance !== undefined ? options.hitTolerance : 0;\n var layerFilter = options.layerFilter || TRUE;\n return this.renderer_.forEachLayerAtPixel(pixel, this.frameState_, hitTolerance, callback, layerFilter);\n };\n /**\n * Detect if features intersect a pixel on the viewport. Layers included in the\n * detection can be configured through `opt_layerFilter`.\n * @param {import("./pixel.js").Pixel} pixel Pixel.\n * @param {AtPixelOptions=} opt_options Optional options.\n * @return {boolean} Is there a feature at the given pixel?\n * @api\n */\n\n\n PluggableMap.prototype.hasFeatureAtPixel = function (pixel, opt_options) {\n if (!this.frameState_) {\n return false;\n }\n\n var coordinate = this.getCoordinateFromPixelInternal(pixel);\n opt_options = opt_options !== undefined ? opt_options : {};\n var layerFilter = opt_options.layerFilter !== undefined ? opt_options.layerFilter : TRUE;\n var hitTolerance = opt_options.hitTolerance !== undefined ? opt_options.hitTolerance : 0;\n var checkWrapped = opt_options.checkWrapped !== false;\n return this.renderer_.hasFeatureAtCoordinate(coordinate, this.frameState_, hitTolerance, checkWrapped, layerFilter, null);\n };\n /**\n * Returns the coordinate in user projection for a browser event.\n * @param {MouseEvent} event Event.\n * @return {import("./coordinate.js").Coordinate} Coordinate.\n * @api\n */\n\n\n PluggableMap.prototype.getEventCoordinate = function (event) {\n return this.getCoordinateFromPixel(this.getEventPixel(event));\n };\n /**\n * Returns the coordinate in view projection for a browser event.\n * @param {MouseEvent} event Event.\n * @return {import("./coordinate.js").Coordinate} Coordinate.\n */\n\n\n PluggableMap.prototype.getEventCoordinateInternal = function (event) {\n return this.getCoordinateFromPixelInternal(this.getEventPixel(event));\n };\n /**\n * Returns the map pixel position for a browser event relative to the viewport.\n * @param {UIEvent} event Event.\n * @return {import("./pixel.js").Pixel} Pixel.\n * @api\n */\n\n\n PluggableMap.prototype.getEventPixel = function (event) {\n var viewportPosition = this.viewport_.getBoundingClientRect();\n var eventPosition = //FIXME Are we really calling this with a TouchEvent anywhere?\n \'changedTouches\' in event ?\n /** @type {TouchEvent} */\n event.changedTouches[0] :\n /** @type {MouseEvent} */\n event;\n return [eventPosition.clientX - viewportPosition.left, eventPosition.clientY - viewportPosition.top];\n };\n /**\n * Get the target in which this map is rendered.\n * Note that this returns what is entered as an option or in setTarget:\n * if that was an element, it returns an element; if a string, it returns that.\n * @return {HTMLElement|string|undefined} The Element or id of the Element that the\n * map is rendered in.\n * @observable\n * @api\n */\n\n\n PluggableMap.prototype.getTarget = function () {\n return (\n /** @type {HTMLElement|string|undefined} */\n this.get(MapProperty.TARGET)\n );\n };\n /**\n * Get the DOM element into which this map is rendered. In contrast to\n * `getTarget` this method always return an `Element`, or `null` if the\n * map has no target.\n * @return {HTMLElement} The element that the map is rendered in.\n * @api\n */\n\n\n PluggableMap.prototype.getTargetElement = function () {\n var target = this.getTarget();\n\n if (target !== undefined) {\n return typeof target === \'string\' ? document.getElementById(target) : target;\n } else {\n return null;\n }\n };\n /**\n * Get the coordinate for a given pixel. This returns a coordinate in the\n * user projection.\n * @param {import("./pixel.js").Pixel} pixel Pixel position in the map viewport.\n * @return {import("./coordinate.js").Coordinate} The coordinate for the pixel position.\n * @api\n */\n\n\n PluggableMap.prototype.getCoordinateFromPixel = function (pixel) {\n return toUserCoordinate(this.getCoordinateFromPixelInternal(pixel), this.getView().getProjection());\n };\n /**\n * Get the coordinate for a given pixel. This returns a coordinate in the\n * map view projection.\n * @param {import("./pixel.js").Pixel} pixel Pixel position in the map viewport.\n * @return {import("./coordinate.js").Coordinate} The coordinate for the pixel position.\n */\n\n\n PluggableMap.prototype.getCoordinateFromPixelInternal = function (pixel) {\n var frameState = this.frameState_;\n\n if (!frameState) {\n return null;\n } else {\n return apply(frameState.pixelToCoordinateTransform, pixel.slice());\n }\n };\n /**\n * Get the map controls. Modifying this collection changes the controls\n * associated with the map.\n * @return {Collection} Controls.\n * @api\n */\n\n\n PluggableMap.prototype.getControls = function () {\n return this.controls;\n };\n /**\n * Get the map overlays. Modifying this collection changes the overlays\n * associated with the map.\n * @return {Collection} Overlays.\n * @api\n */\n\n\n PluggableMap.prototype.getOverlays = function () {\n return this.overlays_;\n };\n /**\n * Get an overlay by its identifier (the value returned by overlay.getId()).\n * Note that the index treats string and numeric identifiers as the same. So\n * `map.getOverlayById(2)` will return an overlay with id `\'2\'` or `2`.\n * @param {string|number} id Overlay identifier.\n * @return {import("./Overlay.js").default} Overlay.\n * @api\n */\n\n\n PluggableMap.prototype.getOverlayById = function (id) {\n var overlay = this.overlayIdIndex_[id.toString()];\n return overlay !== undefined ? overlay : null;\n };\n /**\n * Get the map interactions. Modifying this collection changes the interactions\n * associated with the map.\n *\n * Interactions are used for e.g. pan, zoom and rotate.\n * @return {Collection} Interactions.\n * @api\n */\n\n\n PluggableMap.prototype.getInteractions = function () {\n return this.interactions;\n };\n /**\n * Get the layergroup associated with this map.\n * @return {LayerGroup} A layer group containing the layers in this map.\n * @observable\n * @api\n */\n\n\n PluggableMap.prototype.getLayerGroup = function () {\n return (\n /** @type {LayerGroup} */\n this.get(MapProperty.LAYERGROUP)\n );\n };\n /**\n * Get the collection of layers associated with this map.\n * @return {!Collection} Layers.\n * @api\n */\n\n\n PluggableMap.prototype.getLayers = function () {\n var layers = this.getLayerGroup().getLayers();\n return layers;\n };\n /**\n * @return {boolean} Layers have sources that are still loading.\n */\n\n\n PluggableMap.prototype.getLoading = function () {\n var layerStatesArray = this.getLayerGroup().getLayerStatesArray();\n\n for (var i = 0, ii = layerStatesArray.length; i < ii; ++i) {\n var layer = layerStatesArray[i].layer;\n var source =\n /** @type {import("./layer/Layer.js").default} */\n layer.getSource();\n\n if (source && source.loading) {\n return true;\n }\n }\n\n return false;\n };\n /**\n * Get the pixel for a coordinate. This takes a coordinate in the user\n * projection and returns the corresponding pixel.\n * @param {import("./coordinate.js").Coordinate} coordinate A map coordinate.\n * @return {import("./pixel.js").Pixel} A pixel position in the map viewport.\n * @api\n */\n\n\n PluggableMap.prototype.getPixelFromCoordinate = function (coordinate) {\n var viewCoordinate = fromUserCoordinate(coordinate, this.getView().getProjection());\n return this.getPixelFromCoordinateInternal(viewCoordinate);\n };\n /**\n * Get the pixel for a coordinate. This takes a coordinate in the map view\n * projection and returns the corresponding pixel.\n * @param {import("./coordinate.js").Coordinate} coordinate A map coordinate.\n * @return {import("./pixel.js").Pixel} A pixel position in the map viewport.\n */\n\n\n PluggableMap.prototype.getPixelFromCoordinateInternal = function (coordinate) {\n var frameState = this.frameState_;\n\n if (!frameState) {\n return null;\n } else {\n return apply(frameState.coordinateToPixelTransform, coordinate.slice(0, 2));\n }\n };\n /**\n * Get the map renderer.\n * @return {import("./renderer/Map.js").default} Renderer\n */\n\n\n PluggableMap.prototype.getRenderer = function () {\n return this.renderer_;\n };\n /**\n * Get the size of this map.\n * @return {import("./size.js").Size|undefined} The size in pixels of the map in the DOM.\n * @observable\n * @api\n */\n\n\n PluggableMap.prototype.getSize = function () {\n return (\n /** @type {import("./size.js").Size|undefined} */\n this.get(MapProperty.SIZE)\n );\n };\n /**\n * Get the view associated with this map. A view manages properties such as\n * center and resolution.\n * @return {View} The view that controls this map.\n * @observable\n * @api\n */\n\n\n PluggableMap.prototype.getView = function () {\n return (\n /** @type {View} */\n this.get(MapProperty.VIEW)\n );\n };\n /**\n * Get the element that serves as the map viewport.\n * @return {HTMLElement} Viewport.\n * @api\n */\n\n\n PluggableMap.prototype.getViewport = function () {\n return this.viewport_;\n };\n /**\n * Get the element that serves as the container for overlays. Elements added to\n * this container will let mousedown and touchstart events through to the map,\n * so clicks and gestures on an overlay will trigger {@link module:ol/MapBrowserEvent~MapBrowserEvent}\n * events.\n * @return {!HTMLElement} The map\'s overlay container.\n */\n\n\n PluggableMap.prototype.getOverlayContainer = function () {\n return this.overlayContainer_;\n };\n /**\n * Get the element that serves as a container for overlays that don\'t allow\n * event propagation. Elements added to this container won\'t let mousedown and\n * touchstart events through to the map, so clicks and gestures on an overlay\n * don\'t trigger any {@link module:ol/MapBrowserEvent~MapBrowserEvent}.\n * @return {!HTMLElement} The map\'s overlay container that stops events.\n */\n\n\n PluggableMap.prototype.getOverlayContainerStopEvent = function () {\n return this.overlayContainerStopEvent_;\n };\n /**\n * @return {!Document} The document where the map is displayed.\n */\n\n\n PluggableMap.prototype.getOwnerDocument = function () {\n return this.getTargetElement() ? this.getTargetElement().ownerDocument : document;\n };\n /**\n * @param {import("./Tile.js").default} tile Tile.\n * @param {string} tileSourceKey Tile source key.\n * @param {import("./coordinate.js").Coordinate} tileCenter Tile center.\n * @param {number} tileResolution Tile resolution.\n * @return {number} Tile priority.\n */\n\n\n PluggableMap.prototype.getTilePriority = function (tile, tileSourceKey, tileCenter, tileResolution) {\n return getTilePriority(this.frameState_, tile, tileSourceKey, tileCenter, tileResolution);\n };\n /**\n * @param {UIEvent} browserEvent Browser event.\n * @param {string=} opt_type Type.\n */\n\n\n PluggableMap.prototype.handleBrowserEvent = function (browserEvent, opt_type) {\n var type = opt_type || browserEvent.type;\n var mapBrowserEvent = new ol_MapBrowserEvent(type, this, browserEvent);\n this.handleMapBrowserEvent(mapBrowserEvent);\n };\n /**\n * @param {MapBrowserEvent} mapBrowserEvent The event to handle.\n */\n\n\n PluggableMap.prototype.handleMapBrowserEvent = function (mapBrowserEvent) {\n if (!this.frameState_) {\n // With no view defined, we cannot translate pixels into geographical\n // coordinates so interactions cannot be used.\n return;\n }\n\n var originalEvent =\n /** @type {PointerEvent} */\n mapBrowserEvent.originalEvent;\n var eventType = originalEvent.type;\n\n if (eventType === pointer_EventType.POINTERDOWN || eventType === EventType.WHEEL || eventType === EventType.KEYDOWN) {\n var doc = this.getOwnerDocument();\n var rootNode = this.viewport_.getRootNode ? this.viewport_.getRootNode() : doc;\n var target = \'host\' in rootNode // ShadowRoot\n ?\n /** @type {ShadowRoot} */\n rootNode.elementFromPoint(originalEvent.clientX, originalEvent.clientY) :\n /** @type {Node} */\n originalEvent.target;\n\n if ( // Abort if the target is a child of the container for elements whose events are not meant\n // to be handled by map interactions.\n this.overlayContainerStopEvent_.contains(target) || // Abort if the event target is a child of the container that is no longer in the page.\n // It\'s possible for the target to no longer be in the page if it has been removed in an\n // event listener, this might happen in a Control that recreates it\'s content based on\n // user interaction either manually or via a render in something like https://reactjs.org/\n !(rootNode === doc ? doc.documentElement : rootNode).contains(target)) {\n return;\n }\n }\n\n mapBrowserEvent.frameState = this.frameState_;\n\n if (this.dispatchEvent(mapBrowserEvent) !== false) {\n var interactionsArray = this.getInteractions().getArray().slice();\n\n for (var i = interactionsArray.length - 1; i >= 0; i--) {\n var interaction = interactionsArray[i];\n\n if (interaction.getMap() !== this || !interaction.getActive() || !this.getTargetElement()) {\n continue;\n }\n\n var cont = interaction.handleEvent(mapBrowserEvent);\n\n if (!cont || mapBrowserEvent.propagationStopped) {\n break;\n }\n }\n }\n };\n /**\n * @protected\n */\n\n\n PluggableMap.prototype.handlePostRender = function () {\n var frameState = this.frameState_; // Manage the tile queue\n // Image loads are expensive and a limited resource, so try to use them\n // efficiently:\n // * When the view is static we allow a large number of parallel tile loads\n // to complete the frame as quickly as possible.\n // * When animating or interacting, image loads can cause janks, so we reduce\n // the maximum number of loads per frame and limit the number of parallel\n // tile loads to remain reactive to view changes and to reduce the chance of\n // loading tiles that will quickly disappear from view.\n\n var tileQueue = this.tileQueue_;\n\n if (!tileQueue.isEmpty()) {\n var maxTotalLoading = this.maxTilesLoading_;\n var maxNewLoads = maxTotalLoading;\n\n if (frameState) {\n var hints = frameState.viewHints;\n\n if (hints[ViewHint.ANIMATING] || hints[ViewHint.INTERACTING]) {\n var lowOnFrameBudget = !IMAGE_DECODE && Date.now() - frameState.time > 8;\n maxTotalLoading = lowOnFrameBudget ? 0 : 8;\n maxNewLoads = lowOnFrameBudget ? 0 : 2;\n }\n }\n\n if (tileQueue.getTilesLoading() < maxTotalLoading) {\n tileQueue.reprioritize(); // FIXME only call if view has changed\n\n tileQueue.loadMoreTiles(maxTotalLoading, maxNewLoads);\n }\n }\n\n if (frameState && this.hasListener(render_EventType.RENDERCOMPLETE) && !frameState.animate && !this.tileQueue_.getTilesLoading() && !this.getLoading()) {\n this.renderer_.dispatchRenderEvent(render_EventType.RENDERCOMPLETE, frameState);\n }\n\n var postRenderFunctions = this.postRenderFunctions_;\n\n for (var i = 0, ii = postRenderFunctions.length; i < ii; ++i) {\n postRenderFunctions[i](this, frameState);\n }\n\n postRenderFunctions.length = 0;\n };\n /**\n * @private\n */\n\n\n PluggableMap.prototype.handleSizeChanged_ = function () {\n if (this.getView() && !this.getView().getAnimating()) {\n this.getView().resolveConstraints(0);\n }\n\n this.render();\n };\n /**\n * @private\n */\n\n\n PluggableMap.prototype.handleTargetChanged_ = function () {\n // target may be undefined, null, a string or an Element.\n // If it\'s a string we convert it to an Element before proceeding.\n // If it\'s not now an Element we remove the viewport from the DOM.\n // If it\'s an Element we append the viewport element to it.\n var targetElement;\n\n if (this.getTarget()) {\n targetElement = this.getTargetElement();\n }\n\n if (this.mapBrowserEventHandler_) {\n for (var i = 0, ii = this.keyHandlerKeys_.length; i < ii; ++i) {\n unlistenByKey(this.keyHandlerKeys_[i]);\n }\n\n this.keyHandlerKeys_ = null;\n this.viewport_.removeEventListener(EventType.CONTEXTMENU, this.boundHandleBrowserEvent_);\n this.viewport_.removeEventListener(EventType.WHEEL, this.boundHandleBrowserEvent_);\n\n if (this.handleResize_ !== undefined) {\n removeEventListener(EventType.RESIZE, this.handleResize_, false);\n this.handleResize_ = undefined;\n }\n\n this.mapBrowserEventHandler_.dispose();\n this.mapBrowserEventHandler_ = null;\n removeNode(this.viewport_);\n }\n\n if (!targetElement) {\n if (this.renderer_) {\n clearTimeout(this.postRenderTimeoutHandle_);\n this.postRenderTimeoutHandle_ = undefined;\n this.postRenderFunctions_.length = 0;\n this.renderer_.dispose();\n this.renderer_ = null;\n }\n\n if (this.animationDelayKey_) {\n cancelAnimationFrame(this.animationDelayKey_);\n this.animationDelayKey_ = undefined;\n }\n } else {\n targetElement.appendChild(this.viewport_);\n\n if (!this.renderer_) {\n this.renderer_ = this.createRenderer();\n }\n\n this.mapBrowserEventHandler_ = new ol_MapBrowserEventHandler(this, this.moveTolerance_);\n\n for (var key in ol_MapBrowserEventType) {\n this.mapBrowserEventHandler_.addEventListener(ol_MapBrowserEventType[key], this.handleMapBrowserEvent.bind(this));\n }\n\n this.viewport_.addEventListener(EventType.CONTEXTMENU, this.boundHandleBrowserEvent_, false);\n this.viewport_.addEventListener(EventType.WHEEL, this.boundHandleBrowserEvent_, PASSIVE_EVENT_LISTENERS ? {\n passive: false\n } : false);\n var keyboardEventTarget = !this.keyboardEventTarget_ ? targetElement : this.keyboardEventTarget_;\n this.keyHandlerKeys_ = [listen(keyboardEventTarget, EventType.KEYDOWN, this.handleBrowserEvent, this), listen(keyboardEventTarget, EventType.KEYPRESS, this.handleBrowserEvent, this)];\n\n if (!this.handleResize_) {\n this.handleResize_ = this.updateSize.bind(this);\n window.addEventListener(EventType.RESIZE, this.handleResize_, false);\n }\n }\n\n this.updateSize(); // updateSize calls setSize, so no need to call this.render\n // ourselves here.\n };\n /**\n * @private\n */\n\n\n PluggableMap.prototype.handleTileChange_ = function () {\n this.render();\n };\n /**\n * @private\n */\n\n\n PluggableMap.prototype.handleViewPropertyChanged_ = function () {\n this.render();\n };\n /**\n * @private\n */\n\n\n PluggableMap.prototype.handleViewChanged_ = function () {\n if (this.viewPropertyListenerKey_) {\n unlistenByKey(this.viewPropertyListenerKey_);\n this.viewPropertyListenerKey_ = null;\n }\n\n if (this.viewChangeListenerKey_) {\n unlistenByKey(this.viewChangeListenerKey_);\n this.viewChangeListenerKey_ = null;\n }\n\n var view = this.getView();\n\n if (view) {\n this.updateViewportSize_();\n this.viewPropertyListenerKey_ = listen(view, ObjectEventType.PROPERTYCHANGE, this.handleViewPropertyChanged_, this);\n this.viewChangeListenerKey_ = listen(view, EventType.CHANGE, this.handleViewPropertyChanged_, this);\n view.resolveConstraints(0);\n }\n\n this.render();\n };\n /**\n * @private\n */\n\n\n PluggableMap.prototype.handleLayerGroupChanged_ = function () {\n if (this.layerGroupPropertyListenerKeys_) {\n this.layerGroupPropertyListenerKeys_.forEach(unlistenByKey);\n this.layerGroupPropertyListenerKeys_ = null;\n }\n\n var layerGroup = this.getLayerGroup();\n\n if (layerGroup) {\n this.layerGroupPropertyListenerKeys_ = [listen(layerGroup, ObjectEventType.PROPERTYCHANGE, this.render, this), listen(layerGroup, EventType.CHANGE, this.render, this)];\n }\n\n this.render();\n };\n /**\n * @return {boolean} Is rendered.\n */\n\n\n PluggableMap.prototype.isRendered = function () {\n return !!this.frameState_;\n };\n /**\n * Requests an immediate render in a synchronous manner.\n * @api\n */\n\n\n PluggableMap.prototype.renderSync = function () {\n if (this.animationDelayKey_) {\n cancelAnimationFrame(this.animationDelayKey_);\n }\n\n this.animationDelay_();\n };\n /**\n * Redraws all text after new fonts have loaded\n */\n\n\n PluggableMap.prototype.redrawText = function () {\n var layerStates = this.getLayerGroup().getLayerStatesArray();\n\n for (var i = 0, ii = layerStates.length; i < ii; ++i) {\n var layer = layerStates[i].layer;\n\n if (layer.hasRenderer()) {\n layer.getRenderer().handleFontsChanged();\n }\n }\n };\n /**\n * Request a map rendering (at the next animation frame).\n * @api\n */\n\n\n PluggableMap.prototype.render = function () {\n if (this.renderer_ && this.animationDelayKey_ === undefined) {\n this.animationDelayKey_ = requestAnimationFrame(this.animationDelay_);\n }\n };\n /**\n * Remove the given control from the map.\n * @param {import("./control/Control.js").default} control Control.\n * @return {import("./control/Control.js").default|undefined} The removed control (or undefined\n * if the control was not found).\n * @api\n */\n\n\n PluggableMap.prototype.removeControl = function (control) {\n return this.getControls().remove(control);\n };\n /**\n * Remove the given interaction from the map.\n * @param {import("./interaction/Interaction.js").default} interaction Interaction to remove.\n * @return {import("./interaction/Interaction.js").default|undefined} The removed interaction (or\n * undefined if the interaction was not found).\n * @api\n */\n\n\n PluggableMap.prototype.removeInteraction = function (interaction) {\n return this.getInteractions().remove(interaction);\n };\n /**\n * Removes the given layer from the map.\n * @param {import("./layer/Base.js").default} layer Layer.\n * @return {import("./layer/Base.js").default|undefined} The removed layer (or undefined if the\n * layer was not found).\n * @api\n */\n\n\n PluggableMap.prototype.removeLayer = function (layer) {\n var layers = this.getLayerGroup().getLayers();\n return layers.remove(layer);\n };\n /**\n * Remove the given overlay from the map.\n * @param {import("./Overlay.js").default} overlay Overlay.\n * @return {import("./Overlay.js").default|undefined} The removed overlay (or undefined\n * if the overlay was not found).\n * @api\n */\n\n\n PluggableMap.prototype.removeOverlay = function (overlay) {\n return this.getOverlays().remove(overlay);\n };\n /**\n * @param {number} time Time.\n * @private\n */\n\n\n PluggableMap.prototype.renderFrame_ = function (time) {\n var _this = this;\n\n var size = this.getSize();\n var view = this.getView();\n var previousFrameState = this.frameState_;\n /** @type {?FrameState} */\n\n var frameState = null;\n\n if (size !== undefined && hasArea(size) && view && view.isDef()) {\n var viewHints = view.getHints(this.frameState_ ? this.frameState_.viewHints : undefined);\n var viewState = view.getState();\n frameState = {\n animate: false,\n coordinateToPixelTransform: this.coordinateToPixelTransform_,\n declutterTree: null,\n extent: getForViewAndSize(viewState.center, viewState.resolution, viewState.rotation, size),\n index: this.frameIndex_++,\n layerIndex: 0,\n layerStatesArray: this.getLayerGroup().getLayerStatesArray(),\n pixelRatio: this.pixelRatio_,\n pixelToCoordinateTransform: this.pixelToCoordinateTransform_,\n postRenderFunctions: [],\n size: size,\n tileQueue: this.tileQueue_,\n time: time,\n usedTiles: {},\n viewState: viewState,\n viewHints: viewHints,\n wantedTiles: {}\n };\n }\n\n this.frameState_ = frameState;\n this.renderer_.renderFrame(frameState);\n\n if (frameState) {\n if (frameState.animate) {\n this.render();\n }\n\n Array.prototype.push.apply(this.postRenderFunctions_, frameState.postRenderFunctions);\n\n if (previousFrameState) {\n var moveStart = !this.previousExtent_ || !extent_isEmpty(this.previousExtent_) && !extent_equals(frameState.extent, this.previousExtent_);\n\n if (moveStart) {\n this.dispatchEvent(new ol_MapEvent(MapEventType.MOVESTART, this, previousFrameState));\n this.previousExtent_ = createOrUpdateEmpty(this.previousExtent_);\n }\n }\n\n var idle = this.previousExtent_ && !frameState.viewHints[ViewHint.ANIMATING] && !frameState.viewHints[ViewHint.INTERACTING] && !extent_equals(frameState.extent, this.previousExtent_);\n\n if (idle) {\n this.dispatchEvent(new ol_MapEvent(MapEventType.MOVEEND, this, frameState));\n clone(frameState.extent, this.previousExtent_);\n }\n }\n\n this.dispatchEvent(new ol_MapEvent(MapEventType.POSTRENDER, this, frameState));\n\n if (!this.postRenderTimeoutHandle_) {\n this.postRenderTimeoutHandle_ = setTimeout(function () {\n _this.postRenderTimeoutHandle_ = undefined;\n\n _this.handlePostRender();\n }, 0);\n }\n };\n /**\n * Sets the layergroup of this map.\n * @param {LayerGroup} layerGroup A layer group containing the layers in this map.\n * @observable\n * @api\n */\n\n\n PluggableMap.prototype.setLayerGroup = function (layerGroup) {\n this.set(MapProperty.LAYERGROUP, layerGroup);\n };\n /**\n * Set the size of this map.\n * @param {import("./size.js").Size|undefined} size The size in pixels of the map in the DOM.\n * @observable\n * @api\n */\n\n\n PluggableMap.prototype.setSize = function (size) {\n this.set(MapProperty.SIZE, size);\n };\n /**\n * Set the target element to render this map into.\n * @param {HTMLElement|string|undefined} target The Element or id of the Element\n * that the map is rendered in.\n * @observable\n * @api\n */\n\n\n PluggableMap.prototype.setTarget = function (target) {\n this.set(MapProperty.TARGET, target);\n };\n /**\n * Set the view for this map.\n * @param {View} view The view that controls this map.\n * @observable\n * @api\n */\n\n\n PluggableMap.prototype.setView = function (view) {\n this.set(MapProperty.VIEW, view);\n };\n /**\n * Force a recalculation of the map viewport size. This should be called when\n * third-party code changes the size of the map viewport.\n * @api\n */\n\n\n PluggableMap.prototype.updateSize = function () {\n var targetElement = this.getTargetElement();\n\n if (!targetElement) {\n this.setSize(undefined);\n } else {\n var computedStyle = getComputedStyle(targetElement);\n this.setSize([targetElement.offsetWidth - parseFloat(computedStyle[\'borderLeftWidth\']) - parseFloat(computedStyle[\'paddingLeft\']) - parseFloat(computedStyle[\'paddingRight\']) - parseFloat(computedStyle[\'borderRightWidth\']), targetElement.offsetHeight - parseFloat(computedStyle[\'borderTopWidth\']) - parseFloat(computedStyle[\'paddingTop\']) - parseFloat(computedStyle[\'paddingBottom\']) - parseFloat(computedStyle[\'borderBottomWidth\'])]);\n }\n\n this.updateViewportSize_();\n };\n /**\n * Recomputes the viewport size and save it on the view object (if any)\n * @private\n */\n\n\n PluggableMap.prototype.updateViewportSize_ = function () {\n var view = this.getView();\n\n if (view) {\n var size = undefined;\n var computedStyle = getComputedStyle(this.viewport_);\n\n if (computedStyle.width && computedStyle.height) {\n size = [parseInt(computedStyle.width, 10), parseInt(computedStyle.height, 10)];\n }\n\n view.setViewportSize(size);\n }\n };\n\n return PluggableMap;\n}(ol_Object);\n/**\n * @param {MapOptions} options Map options.\n * @return {MapOptionsInternal} Internal map options.\n */\n\n\nfunction createOptionsInternal(options) {\n /**\n * @type {HTMLElement|Document}\n */\n var keyboardEventTarget = null;\n\n if (options.keyboardEventTarget !== undefined) {\n keyboardEventTarget = typeof options.keyboardEventTarget === \'string\' ? document.getElementById(options.keyboardEventTarget) : options.keyboardEventTarget;\n }\n /**\n * @type {Object}\n */\n\n\n var values = {};\n var layerGroup = options.layers && typeof\n /** @type {?} */\n options.layers.getLayers === \'function\' ?\n /** @type {LayerGroup} */\n options.layers : new Group({\n layers:\n /** @type {Collection} */\n options.layers\n });\n values[MapProperty.LAYERGROUP] = layerGroup;\n values[MapProperty.TARGET] = options.target;\n values[MapProperty.VIEW] = options.view !== undefined ? options.view : new ol_View();\n var controls;\n\n if (options.controls !== undefined) {\n if (Array.isArray(options.controls)) {\n controls = new ol_Collection(options.controls.slice());\n } else {\n asserts_assert(typeof\n /** @type {?} */\n options.controls.getArray === \'function\', 47); // Expected `controls` to be an array or an `import("./Collection.js").Collection`\n\n controls =\n /** @type {Collection} */\n options.controls;\n }\n }\n\n var interactions;\n\n if (options.interactions !== undefined) {\n if (Array.isArray(options.interactions)) {\n interactions = new ol_Collection(options.interactions.slice());\n } else {\n asserts_assert(typeof\n /** @type {?} */\n options.interactions.getArray === \'function\', 48); // Expected `interactions` to be an array or an `import("./Collection.js").Collection`\n\n interactions =\n /** @type {Collection} */\n options.interactions;\n }\n }\n\n var overlays;\n\n if (options.overlays !== undefined) {\n if (Array.isArray(options.overlays)) {\n overlays = new ol_Collection(options.overlays.slice());\n } else {\n asserts_assert(typeof\n /** @type {?} */\n options.overlays.getArray === \'function\', 49); // Expected `overlays` to be an array or an `import("./Collection.js").Collection`\n\n overlays = options.overlays;\n }\n } else {\n overlays = new ol_Collection();\n }\n\n return {\n controls: controls,\n interactions: interactions,\n keyboardEventTarget: keyboardEventTarget,\n overlays: overlays,\n values: values\n };\n}\n\n/* harmony default export */ var ol_PluggableMap = (PluggableMap);\n;// CONCATENATED MODULE: ./node_modules/ol/control/Control.js\nvar Control_extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n/**\n * @module ol/control/Control\n */\n\n\n\n\n\n\n\n/**\n * @typedef {Object} Options\n * @property {HTMLElement} [element] The element is the control\'s\n * container element. This only needs to be specified if you\'re developing\n * a custom control.\n * @property {function(import("../MapEvent.js").default):void} [render] Function called when\n * the control should be re-rendered. This is called in a `requestAnimationFrame`\n * callback.\n * @property {HTMLElement|string} [target] Specify a target if you want\n * the control to be rendered outside of the map\'s viewport.\n */\n\n/**\n * @classdesc\n * A control is a visible widget with a DOM element in a fixed position on the\n * screen. They can involve user input (buttons), or be informational only;\n * the position is determined using CSS. By default these are placed in the\n * container with CSS class name `ol-overlaycontainer-stopevent`, but can use\n * any outside DOM element.\n *\n * This is the base class for controls. You can use it for simple custom\n * controls by creating the element with listeners, creating an instance:\n * ```js\n * var myControl = new Control({element: myElement});\n * ```\n * and then adding this to the map.\n *\n * The main advantage of having this as a control rather than a simple separate\n * DOM element is that preventing propagation is handled for you. Controls\n * will also be objects in a {@link module:ol/Collection~Collection}, so you can use their methods.\n *\n * You can also extend this base for your own control class. See\n * examples/custom-controls for an example of how to do this.\n *\n * @api\n */\n\nvar Control =\n/** @class */\nfunction (_super) {\n Control_extends(Control, _super);\n /**\n * @param {Options} options Control options.\n */\n\n\n function Control(options) {\n var _this = _super.call(this) || this;\n\n var element = options.element;\n\n if (element && !options.target && !element.style.pointerEvents) {\n element.style.pointerEvents = \'auto\';\n }\n /**\n * @protected\n * @type {HTMLElement}\n */\n\n\n _this.element = element ? element : null;\n /**\n * @private\n * @type {HTMLElement}\n */\n\n _this.target_ = null;\n /**\n * @private\n * @type {import("../PluggableMap.js").default}\n */\n\n _this.map_ = null;\n /**\n * @protected\n * @type {!Array}\n */\n\n _this.listenerKeys = [];\n\n if (options.render) {\n _this.render = options.render;\n }\n\n if (options.target) {\n _this.setTarget(options.target);\n }\n\n return _this;\n }\n /**\n * Clean up.\n */\n\n\n Control.prototype.disposeInternal = function () {\n removeNode(this.element);\n\n _super.prototype.disposeInternal.call(this);\n };\n /**\n * Get the map associated with this control.\n * @return {import("../PluggableMap.js").default} Map.\n * @api\n */\n\n\n Control.prototype.getMap = function () {\n return this.map_;\n };\n /**\n * Remove the control from its current map and attach it to the new map.\n * Subclasses may set up event handlers to get notified about changes to\n * the map here.\n * @param {import("../PluggableMap.js").default} map Map.\n * @api\n */\n\n\n Control.prototype.setMap = function (map) {\n if (this.map_) {\n removeNode(this.element);\n }\n\n for (var i = 0, ii = this.listenerKeys.length; i < ii; ++i) {\n unlistenByKey(this.listenerKeys[i]);\n }\n\n this.listenerKeys.length = 0;\n this.map_ = map;\n\n if (this.map_) {\n var target = this.target_ ? this.target_ : map.getOverlayContainerStopEvent();\n target.appendChild(this.element);\n\n if (this.render !== VOID) {\n this.listenerKeys.push(listen(map, MapEventType.POSTRENDER, this.render, this));\n }\n\n map.render();\n }\n };\n /**\n * Renders the control.\n * @param {import("../MapEvent.js").default} mapEvent Map event.\n * @api\n */\n\n\n Control.prototype.render = function (mapEvent) {};\n /**\n * This function is used to set a target element for the control. It has no\n * effect if it is called after the control has been added to the map (i.e.\n * after `setMap` is called on the control). If no `target` is set in the\n * options passed to the control constructor and if `setTarget` is not called\n * then the control is added to the map\'s overlay container.\n * @param {HTMLElement|string} target Target.\n * @api\n */\n\n\n Control.prototype.setTarget = function (target) {\n this.target_ = typeof target === \'string\' ? document.getElementById(target) : target;\n };\n\n return Control;\n}(ol_Object);\n\n/* harmony default export */ var control_Control = (Control);\n;// CONCATENATED MODULE: ./node_modules/ol/control/Attribution.js\nvar Attribution_extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n/**\n * @module ol/control/Attribution\n */\n\n\n\n\n\n\n\n\n/**\n * @typedef {Object} Options\n * @property {string} [className=\'ol-attribution\'] CSS class name.\n * @property {HTMLElement|string} [target] Specify a target if you\n * want the control to be rendered outside of the map\'s\n * viewport.\n * @property {boolean} [collapsible] Specify if attributions can\n * be collapsed. If not specified, sources control this behavior with their\n * `attributionsCollapsible` setting.\n * @property {boolean} [collapsed=true] Specify if attributions should\n * be collapsed at startup.\n * @property {string} [tipLabel=\'Attributions\'] Text label to use for the button tip.\n * @property {string} [label=\'i\'] Text label to use for the\n * collapsed attributions button.\n * Instead of text, also an element (e.g. a `span` element) can be used.\n * @property {string} [expandClassName=className + \'-expand\'] CSS class name for the\n * collapsed attributions button.\n * @property {string|HTMLElement} [collapseLabel=\'»\'] Text label to use\n * for the expanded attributions button.\n * Instead of text, also an element (e.g. a `span` element) can be used.\n * @property {string} [collapseClassName=className + \'-collapse\'] CSS class name for the\n * expanded attributions button.\n * @property {function(import("../MapEvent.js").default):void} [render] Function called when\n * the control should be re-rendered. This is called in a `requestAnimationFrame`\n * callback.\n */\n\n/**\n * @classdesc\n * Control to show all the attributions associated with the layer sources\n * in the map. This control is one of the default controls included in maps.\n * By default it will show in the bottom right portion of the map, but this can\n * be changed by using a css selector for `.ol-attribution`.\n *\n * @api\n */\n\nvar Attribution =\n/** @class */\nfunction (_super) {\n Attribution_extends(Attribution, _super);\n /**\n * @param {Options=} opt_options Attribution options.\n */\n\n\n function Attribution(opt_options) {\n var _this = this;\n\n var options = opt_options ? opt_options : {};\n _this = _super.call(this, {\n element: document.createElement(\'div\'),\n render: options.render,\n target: options.target\n }) || this;\n /**\n * @private\n * @type {HTMLElement}\n */\n\n _this.ulElement_ = document.createElement(\'ul\');\n /**\n * @private\n * @type {boolean}\n */\n\n _this.collapsed_ = options.collapsed !== undefined ? options.collapsed : true;\n /**\n * @private\n * @type {boolean}\n */\n\n _this.userCollapsed_ = _this.collapsed_;\n /**\n * @private\n * @type {boolean}\n */\n\n _this.overrideCollapsible_ = options.collapsible !== undefined;\n /**\n * @private\n * @type {boolean}\n */\n\n _this.collapsible_ = options.collapsible !== undefined ? options.collapsible : true;\n\n if (!_this.collapsible_) {\n _this.collapsed_ = false;\n }\n\n var className = options.className !== undefined ? options.className : \'ol-attribution\';\n var tipLabel = options.tipLabel !== undefined ? options.tipLabel : \'Attributions\';\n var expandClassName = options.expandClassName !== undefined ? options.expandClassName : className + \'-expand\';\n var collapseLabel = options.collapseLabel !== undefined ? options.collapseLabel : "\\xBB";\n var collapseClassName = options.collapseClassName !== undefined ? options.collapseClassName : className + \'-collpase\';\n\n if (typeof collapseLabel === \'string\') {\n /**\n * @private\n * @type {HTMLElement}\n */\n _this.collapseLabel_ = document.createElement(\'span\');\n _this.collapseLabel_.textContent = collapseLabel;\n _this.collapseLabel_.className = collapseClassName;\n } else {\n _this.collapseLabel_ = collapseLabel;\n }\n\n var label = options.label !== undefined ? options.label : \'i\';\n\n if (typeof label === \'string\') {\n /**\n * @private\n * @type {HTMLElement}\n */\n _this.label_ = document.createElement(\'span\');\n _this.label_.textContent = label;\n _this.label_.className = expandClassName;\n } else {\n _this.label_ = label;\n }\n\n var activeLabel = _this.collapsible_ && !_this.collapsed_ ? _this.collapseLabel_ : _this.label_;\n var button = document.createElement(\'button\');\n button.setAttribute(\'type\', \'button\');\n button.title = tipLabel;\n button.appendChild(activeLabel);\n button.addEventListener(EventType.CLICK, _this.handleClick_.bind(_this), false);\n var cssClasses = className + \' \' + CLASS_UNSELECTABLE + \' \' + CLASS_CONTROL + (_this.collapsed_ && _this.collapsible_ ? \' \' + CLASS_COLLAPSED : \'\') + (_this.collapsible_ ? \'\' : \' ol-uncollapsible\');\n var element = _this.element;\n element.className = cssClasses;\n element.appendChild(_this.ulElement_);\n element.appendChild(button);\n /**\n * A list of currently rendered resolutions.\n * @type {Array}\n * @private\n */\n\n _this.renderedAttributions_ = [];\n /**\n * @private\n * @type {boolean}\n */\n\n _this.renderedVisible_ = true;\n return _this;\n }\n /**\n * Collect a list of visible attributions and set the collapsible state.\n * @param {import("../PluggableMap.js").FrameState} frameState Frame state.\n * @return {Array} Attributions.\n * @private\n */\n\n\n Attribution.prototype.collectSourceAttributions_ = function (frameState) {\n /**\n * Used to determine if an attribution already exists.\n * @type {!Object}\n */\n var lookup = {};\n /**\n * A list of visible attributions.\n * @type {Array}\n */\n\n var visibleAttributions = [];\n var collapsible = true;\n var layerStatesArray = frameState.layerStatesArray;\n\n for (var i = 0, ii = layerStatesArray.length; i < ii; ++i) {\n var layerState = layerStatesArray[i];\n\n if (!inView(layerState, frameState.viewState)) {\n continue;\n }\n\n var source =\n /** @type {import("../layer/Layer.js").default} */\n layerState.layer.getSource();\n\n if (!source) {\n continue;\n }\n\n var attributionGetter = source.getAttributions();\n\n if (!attributionGetter) {\n continue;\n }\n\n var attributions = attributionGetter(frameState);\n\n if (!attributions) {\n continue;\n }\n\n collapsible = collapsible && source.getAttributionsCollapsible() !== false;\n\n if (Array.isArray(attributions)) {\n for (var j = 0, jj = attributions.length; j < jj; ++j) {\n if (!(attributions[j] in lookup)) {\n visibleAttributions.push(attributions[j]);\n lookup[attributions[j]] = true;\n }\n }\n } else {\n if (!(attributions in lookup)) {\n visibleAttributions.push(attributions);\n lookup[attributions] = true;\n }\n }\n }\n\n if (!this.overrideCollapsible_) {\n this.setCollapsible(collapsible);\n }\n\n return visibleAttributions;\n };\n /**\n * @private\n * @param {?import("../PluggableMap.js").FrameState} frameState Frame state.\n */\n\n\n Attribution.prototype.updateElement_ = function (frameState) {\n if (!frameState) {\n if (this.renderedVisible_) {\n this.element.style.display = \'none\';\n this.renderedVisible_ = false;\n }\n\n return;\n }\n\n var attributions = this.collectSourceAttributions_(frameState);\n var visible = attributions.length > 0;\n\n if (this.renderedVisible_ != visible) {\n this.element.style.display = visible ? \'\' : \'none\';\n this.renderedVisible_ = visible;\n }\n\n if (equals(attributions, this.renderedAttributions_)) {\n return;\n }\n\n removeChildren(this.ulElement_); // append the attributions\n\n for (var i = 0, ii = attributions.length; i < ii; ++i) {\n var element = document.createElement(\'li\');\n element.innerHTML = attributions[i];\n this.ulElement_.appendChild(element);\n }\n\n this.renderedAttributions_ = attributions;\n };\n /**\n * @param {MouseEvent} event The event to handle\n * @private\n */\n\n\n Attribution.prototype.handleClick_ = function (event) {\n event.preventDefault();\n this.handleToggle_();\n this.userCollapsed_ = this.collapsed_;\n };\n /**\n * @private\n */\n\n\n Attribution.prototype.handleToggle_ = function () {\n this.element.classList.toggle(CLASS_COLLAPSED);\n\n if (this.collapsed_) {\n replaceNode(this.collapseLabel_, this.label_);\n } else {\n replaceNode(this.label_, this.collapseLabel_);\n }\n\n this.collapsed_ = !this.collapsed_;\n };\n /**\n * Return `true` if the attribution is collapsible, `false` otherwise.\n * @return {boolean} True if the widget is collapsible.\n * @api\n */\n\n\n Attribution.prototype.getCollapsible = function () {\n return this.collapsible_;\n };\n /**\n * Set whether the attribution should be collapsible.\n * @param {boolean} collapsible True if the widget is collapsible.\n * @api\n */\n\n\n Attribution.prototype.setCollapsible = function (collapsible) {\n if (this.collapsible_ === collapsible) {\n return;\n }\n\n this.collapsible_ = collapsible;\n this.element.classList.toggle(\'ol-uncollapsible\');\n\n if (this.userCollapsed_) {\n this.handleToggle_();\n }\n };\n /**\n * Collapse or expand the attribution according to the passed parameter. Will\n * not do anything if the attribution isn\'t collapsible or if the current\n * collapsed state is already the one requested.\n * @param {boolean} collapsed True if the widget is collapsed.\n * @api\n */\n\n\n Attribution.prototype.setCollapsed = function (collapsed) {\n this.userCollapsed_ = collapsed;\n\n if (!this.collapsible_ || this.collapsed_ === collapsed) {\n return;\n }\n\n this.handleToggle_();\n };\n /**\n * Return `true` when the attribution is currently collapsed or `false`\n * otherwise.\n * @return {boolean} True if the widget is collapsed.\n * @api\n */\n\n\n Attribution.prototype.getCollapsed = function () {\n return this.collapsed_;\n };\n /**\n * Update the attribution element.\n * @param {import("../MapEvent.js").default} mapEvent Map event.\n * @override\n */\n\n\n Attribution.prototype.render = function (mapEvent) {\n this.updateElement_(mapEvent.frameState);\n };\n\n return Attribution;\n}(control_Control);\n\n/* harmony default export */ var control_Attribution = (Attribution);\n;// CONCATENATED MODULE: ./node_modules/ol/control/Rotate.js\nvar Rotate_extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n/**\n * @module ol/control/Rotate\n */\n\n\n\n\n\n\n/**\n * @typedef {Object} Options\n * @property {string} [className=\'ol-rotate\'] CSS class name.\n * @property {string|HTMLElement} [label=\'⇧\'] Text label to use for the rotate button.\n * Instead of text, also an element (e.g. a `span` element) can be used.\n * @property {string} [tipLabel=\'Reset rotation\'] Text label to use for the rotate tip.\n * @property {string} [compassClassName=\'ol-compass\'] CSS class name for the compass.\n * @property {number} [duration=250] Animation duration in milliseconds.\n * @property {boolean} [autoHide=true] Hide the control when rotation is 0.\n * @property {function(import("../MapEvent.js").default):void} [render] Function called when the control should\n * be re-rendered. This is called in a `requestAnimationFrame` callback.\n * @property {function():void} [resetNorth] Function called when the control is clicked.\n * This will override the default `resetNorth`.\n * @property {HTMLElement|string} [target] Specify a target if you want the control to be\n * rendered outside of the map\'s viewport.\n */\n\n/**\n * @classdesc\n * A button control to reset rotation to 0.\n * To style this control use css selector `.ol-rotate`. A `.ol-hidden` css\n * selector is added to the button when the rotation is 0.\n *\n * @api\n */\n\nvar Rotate =\n/** @class */\nfunction (_super) {\n Rotate_extends(Rotate, _super);\n /**\n * @param {Options=} opt_options Rotate options.\n */\n\n\n function Rotate(opt_options) {\n var _this = this;\n\n var options = opt_options ? opt_options : {};\n _this = _super.call(this, {\n element: document.createElement(\'div\'),\n render: options.render,\n target: options.target\n }) || this;\n var className = options.className !== undefined ? options.className : \'ol-rotate\';\n var label = options.label !== undefined ? options.label : "\\u21E7";\n var compassClassName = options.compassClassName !== undefined ? options.compassClassName : \'ol-compass\';\n /**\n * @type {HTMLElement}\n * @private\n */\n\n _this.label_ = null;\n\n if (typeof label === \'string\') {\n _this.label_ = document.createElement(\'span\');\n _this.label_.className = compassClassName;\n _this.label_.textContent = label;\n } else {\n _this.label_ = label;\n\n _this.label_.classList.add(compassClassName);\n }\n\n var tipLabel = options.tipLabel ? options.tipLabel : \'Reset rotation\';\n var button = document.createElement(\'button\');\n button.className = className + \'-reset\';\n button.setAttribute(\'type\', \'button\');\n button.title = tipLabel;\n button.appendChild(_this.label_);\n button.addEventListener(EventType.CLICK, _this.handleClick_.bind(_this), false);\n var cssClasses = className + \' \' + CLASS_UNSELECTABLE + \' \' + CLASS_CONTROL;\n var element = _this.element;\n element.className = cssClasses;\n element.appendChild(button);\n _this.callResetNorth_ = options.resetNorth ? options.resetNorth : undefined;\n /**\n * @type {number}\n * @private\n */\n\n _this.duration_ = options.duration !== undefined ? options.duration : 250;\n /**\n * @type {boolean}\n * @private\n */\n\n _this.autoHide_ = options.autoHide !== undefined ? options.autoHide : true;\n /**\n * @private\n * @type {number|undefined}\n */\n\n _this.rotation_ = undefined;\n\n if (_this.autoHide_) {\n _this.element.classList.add(CLASS_HIDDEN);\n }\n\n return _this;\n }\n /**\n * @param {MouseEvent} event The event to handle\n * @private\n */\n\n\n Rotate.prototype.handleClick_ = function (event) {\n event.preventDefault();\n\n if (this.callResetNorth_ !== undefined) {\n this.callResetNorth_();\n } else {\n this.resetNorth_();\n }\n };\n /**\n * @private\n */\n\n\n Rotate.prototype.resetNorth_ = function () {\n var map = this.getMap();\n var view = map.getView();\n\n if (!view) {\n // the map does not have a view, so we can\'t act\n // upon it\n return;\n }\n\n var rotation = view.getRotation();\n\n if (rotation !== undefined) {\n if (this.duration_ > 0 && rotation % (2 * Math.PI) !== 0) {\n view.animate({\n rotation: 0,\n duration: this.duration_,\n easing: easeOut\n });\n } else {\n view.setRotation(0);\n }\n }\n };\n /**\n * Update the rotate control element.\n * @param {import("../MapEvent.js").default} mapEvent Map event.\n * @override\n */\n\n\n Rotate.prototype.render = function (mapEvent) {\n var frameState = mapEvent.frameState;\n\n if (!frameState) {\n return;\n }\n\n var rotation = frameState.viewState.rotation;\n\n if (rotation != this.rotation_) {\n var transform = \'rotate(\' + rotation + \'rad)\';\n\n if (this.autoHide_) {\n var contains = this.element.classList.contains(CLASS_HIDDEN);\n\n if (!contains && rotation === 0) {\n this.element.classList.add(CLASS_HIDDEN);\n } else if (contains && rotation !== 0) {\n this.element.classList.remove(CLASS_HIDDEN);\n }\n }\n\n this.label_.style.transform = transform;\n }\n\n this.rotation_ = rotation;\n };\n\n return Rotate;\n}(control_Control);\n\n/* harmony default export */ var control_Rotate = (Rotate);\n;// CONCATENATED MODULE: ./node_modules/ol/control/Zoom.js\nvar Zoom_extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n/**\n * @module ol/control/Zoom\n */\n\n\n\n\n\n\n/**\n * @typedef {Object} Options\n * @property {number} [duration=250] Animation duration in milliseconds.\n * @property {string} [className=\'ol-zoom\'] CSS class name.\n * @property {string} [zoomInClassName=className + \'-in\'] CSS class name for the zoom-in button.\n * @property {string} [zoomOutClassName=className + \'-out\'] CSS class name for the zoom-out button.\n * @property {string|HTMLElement} [zoomInLabel=\'+\'] Text label to use for the zoom-in\n * button. Instead of text, also an element (e.g. a `span` element) can be used.\n * @property {string|HTMLElement} [zoomOutLabel=\'-\'] Text label to use for the zoom-out button.\n * Instead of text, also an element (e.g. a `span` element) can be used.\n * @property {string} [zoomInTipLabel=\'Zoom in\'] Text label to use for the button tip.\n * @property {string} [zoomOutTipLabel=\'Zoom out\'] Text label to use for the button tip.\n * @property {number} [delta=1] The zoom delta applied on each click.\n * @property {HTMLElement|string} [target] Specify a target if you want the control to be\n * rendered outside of the map\'s viewport.\n */\n\n/**\n * @classdesc\n * A control with 2 buttons, one for zoom in and one for zoom out.\n * This control is one of the default controls of a map. To style this control\n * use css selectors `.ol-zoom-in` and `.ol-zoom-out`.\n *\n * @api\n */\n\nvar Zoom =\n/** @class */\nfunction (_super) {\n Zoom_extends(Zoom, _super);\n /**\n * @param {Options=} opt_options Zoom options.\n */\n\n\n function Zoom(opt_options) {\n var _this = this;\n\n var options = opt_options ? opt_options : {};\n _this = _super.call(this, {\n element: document.createElement(\'div\'),\n target: options.target\n }) || this;\n var className = options.className !== undefined ? options.className : \'ol-zoom\';\n var delta = options.delta !== undefined ? options.delta : 1;\n var zoomInClassName = options.zoomInClassName !== undefined ? options.zoomInClassName : className + \'-in\';\n var zoomOutClassName = options.zoomOutClassName !== undefined ? options.zoomOutClassName : className + \'-out\';\n var zoomInLabel = options.zoomInLabel !== undefined ? options.zoomInLabel : \'+\';\n var zoomOutLabel = options.zoomOutLabel !== undefined ? options.zoomOutLabel : "\\u2212";\n var zoomInTipLabel = options.zoomInTipLabel !== undefined ? options.zoomInTipLabel : \'Zoom in\';\n var zoomOutTipLabel = options.zoomOutTipLabel !== undefined ? options.zoomOutTipLabel : \'Zoom out\';\n var inElement = document.createElement(\'button\');\n inElement.className = zoomInClassName;\n inElement.setAttribute(\'type\', \'button\');\n inElement.title = zoomInTipLabel;\n inElement.appendChild(typeof zoomInLabel === \'string\' ? document.createTextNode(zoomInLabel) : zoomInLabel);\n inElement.addEventListener(EventType.CLICK, _this.handleClick_.bind(_this, delta), false);\n var outElement = document.createElement(\'button\');\n outElement.className = zoomOutClassName;\n outElement.setAttribute(\'type\', \'button\');\n outElement.title = zoomOutTipLabel;\n outElement.appendChild(typeof zoomOutLabel === \'string\' ? document.createTextNode(zoomOutLabel) : zoomOutLabel);\n outElement.addEventListener(EventType.CLICK, _this.handleClick_.bind(_this, -delta), false);\n var cssClasses = className + \' \' + CLASS_UNSELECTABLE + \' \' + CLASS_CONTROL;\n var element = _this.element;\n element.className = cssClasses;\n element.appendChild(inElement);\n element.appendChild(outElement);\n /**\n * @type {number}\n * @private\n */\n\n _this.duration_ = options.duration !== undefined ? options.duration : 250;\n return _this;\n }\n /**\n * @param {number} delta Zoom delta.\n * @param {MouseEvent} event The event to handle\n * @private\n */\n\n\n Zoom.prototype.handleClick_ = function (delta, event) {\n event.preventDefault();\n this.zoomByDelta_(delta);\n };\n /**\n * @param {number} delta Zoom delta.\n * @private\n */\n\n\n Zoom.prototype.zoomByDelta_ = function (delta) {\n var map = this.getMap();\n var view = map.getView();\n\n if (!view) {\n // the map does not have a view, so we can\'t act\n // upon it\n return;\n }\n\n var currentZoom = view.getZoom();\n\n if (currentZoom !== undefined) {\n var newZoom = view.getConstrainedZoom(currentZoom + delta);\n\n if (this.duration_ > 0) {\n if (view.getAnimating()) {\n view.cancelAnimations();\n }\n\n view.animate({\n zoom: newZoom,\n duration: this.duration_,\n easing: easeOut\n });\n } else {\n view.setZoom(newZoom);\n }\n }\n };\n\n return Zoom;\n}(control_Control);\n\n/* harmony default export */ var control_Zoom = (Zoom);\n;// CONCATENATED MODULE: ./node_modules/ol/control.js\n/**\n * @module ol/control\n */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * @typedef {Object} DefaultsOptions\n * @property {boolean} [attribution=true] Include\n * {@link module:ol/control/Attribution~Attribution}.\n * @property {import("./control/Attribution.js").Options} [attributionOptions]\n * Options for {@link module:ol/control/Attribution~Attribution}.\n * @property {boolean} [rotate=true] Include\n * {@link module:ol/control/Rotate~Rotate}.\n * @property {import("./control/Rotate.js").Options} [rotateOptions] Options\n * for {@link module:ol/control/Rotate~Rotate}.\n * @property {boolean} [zoom] Include {@link module:ol/control/Zoom~Zoom}.\n * @property {import("./control/Zoom.js").Options} [zoomOptions] Options for\n * {@link module:ol/control/Zoom~Zoom}.\n * @api\n */\n\n/**\n * Set of controls included in maps by default. Unless configured otherwise,\n * this returns a collection containing an instance of each of the following\n * controls:\n * * {@link module:ol/control/Zoom~Zoom}\n * * {@link module:ol/control/Rotate~Rotate}\n * * {@link module:ol/control/Attribution~Attribution}\n *\n * @param {DefaultsOptions=} opt_options\n * Defaults options.\n * @return {Collection}\n * Controls.\n * @api\n */\n\nfunction defaults(opt_options) {\n var options = opt_options ? opt_options : {};\n var controls = new ol_Collection();\n var zoomControl = options.zoom !== undefined ? options.zoom : true;\n\n if (zoomControl) {\n controls.push(new control_Zoom(options.zoomOptions));\n }\n\n var rotateControl = options.rotate !== undefined ? options.rotate : true;\n\n if (rotateControl) {\n controls.push(new control_Rotate(options.rotateOptions));\n }\n\n var attributionControl = options.attribution !== undefined ? options.attribution : true;\n\n if (attributionControl) {\n controls.push(new control_Attribution(options.attributionOptions));\n }\n\n return controls;\n}\n;// CONCATENATED MODULE: ./node_modules/ol/interaction/Property.js\n/**\n * @module ol/interaction/Property\n */\n\n/**\n * @enum {string}\n */\n/* harmony default export */ var interaction_Property = ({\n ACTIVE: \'active\'\n});\n;// CONCATENATED MODULE: ./node_modules/ol/interaction/Interaction.js\nvar Interaction_extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n/**\n * @module ol/interaction/Interaction\n */\n\n\n\n\n\n/**\n * Object literal with config options for interactions.\n * @typedef {Object} InteractionOptions\n * @property {function(import("../MapBrowserEvent.js").default):boolean} handleEvent\n * Method called by the map to notify the interaction that a browser event was\n * dispatched to the map. If the function returns a falsy value, propagation of\n * the event to other interactions in the map\'s interactions chain will be\n * prevented (this includes functions with no explicit return). The interactions\n * are traversed in reverse order of the interactions collection of the map.\n */\n\n/**\n * @classdesc\n * Abstract base class; normally only used for creating subclasses and not\n * instantiated in apps.\n * User actions that change the state of the map. Some are similar to controls,\n * but are not associated with a DOM element.\n * For example, {@link module:ol/interaction/KeyboardZoom~KeyboardZoom} is\n * functionally the same as {@link module:ol/control/Zoom~Zoom}, but triggered\n * by a keyboard event not a button element event.\n * Although interactions do not have a DOM element, some of them do render\n * vectors and so are visible on the screen.\n * @api\n */\n\nvar Interaction =\n/** @class */\nfunction (_super) {\n Interaction_extends(Interaction, _super);\n /**\n * @param {InteractionOptions=} opt_options Options.\n */\n\n\n function Interaction(opt_options) {\n var _this = _super.call(this) || this;\n\n if (opt_options && opt_options.handleEvent) {\n _this.handleEvent = opt_options.handleEvent;\n }\n /**\n * @private\n * @type {import("../PluggableMap.js").default}\n */\n\n\n _this.map_ = null;\n\n _this.setActive(true);\n\n return _this;\n }\n /**\n * Return whether the interaction is currently active.\n * @return {boolean} `true` if the interaction is active, `false` otherwise.\n * @observable\n * @api\n */\n\n\n Interaction.prototype.getActive = function () {\n return (\n /** @type {boolean} */\n this.get(interaction_Property.ACTIVE)\n );\n };\n /**\n * Get the map associated with this interaction.\n * @return {import("../PluggableMap.js").default} Map.\n * @api\n */\n\n\n Interaction.prototype.getMap = function () {\n return this.map_;\n };\n /**\n * Handles the {@link module:ol/MapBrowserEvent map browser event}.\n * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Map browser event.\n * @return {boolean} `false` to stop event propagation.\n * @api\n */\n\n\n Interaction.prototype.handleEvent = function (mapBrowserEvent) {\n return true;\n };\n /**\n * Activate or deactivate the interaction.\n * @param {boolean} active Active.\n * @observable\n * @api\n */\n\n\n Interaction.prototype.setActive = function (active) {\n this.set(interaction_Property.ACTIVE, active);\n };\n /**\n * Remove the interaction from its current map and attach it to the new map.\n * Subclasses may set up event handlers to get notified about changes to\n * the map here.\n * @param {import("../PluggableMap.js").default} map Map.\n */\n\n\n Interaction.prototype.setMap = function (map) {\n this.map_ = map;\n };\n\n return Interaction;\n}(ol_Object);\n/**\n * @param {import("../View.js").default} view View.\n * @param {import("../coordinate.js").Coordinate} delta Delta.\n * @param {number=} opt_duration Duration.\n */\n\n\nfunction pan(view, delta, opt_duration) {\n var currentCenter = view.getCenterInternal();\n\n if (currentCenter) {\n var center = [currentCenter[0] + delta[0], currentCenter[1] + delta[1]];\n view.animateInternal({\n duration: opt_duration !== undefined ? opt_duration : 250,\n easing: linear,\n center: view.getConstrainedCenter(center)\n });\n }\n}\n/**\n * @param {import("../View.js").default} view View.\n * @param {number} delta Delta from previous zoom level.\n * @param {import("../coordinate.js").Coordinate=} opt_anchor Anchor coordinate in the user projection.\n * @param {number=} opt_duration Duration.\n */\n\nfunction zoomByDelta(view, delta, opt_anchor, opt_duration) {\n var currentZoom = view.getZoom();\n\n if (currentZoom === undefined) {\n return;\n }\n\n var newZoom = view.getConstrainedZoom(currentZoom + delta);\n var newResolution = view.getResolutionForZoom(newZoom);\n\n if (view.getAnimating()) {\n view.cancelAnimations();\n }\n\n view.animate({\n resolution: newResolution,\n anchor: opt_anchor,\n duration: opt_duration !== undefined ? opt_duration : 250,\n easing: easeOut\n });\n}\n/* harmony default export */ var interaction_Interaction = (Interaction);\n;// CONCATENATED MODULE: ./node_modules/ol/interaction/DoubleClickZoom.js\nvar DoubleClickZoom_extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n/**\n * @module ol/interaction/DoubleClickZoom\n */\n\n\n\n\n/**\n * @typedef {Object} Options\n * @property {number} [duration=250] Animation duration in milliseconds.\n * @property {number} [delta=1] The zoom delta applied on each double click.\n */\n\n/**\n * @classdesc\n * Allows the user to zoom by double-clicking on the map.\n * @api\n */\n\nvar DoubleClickZoom =\n/** @class */\nfunction (_super) {\n DoubleClickZoom_extends(DoubleClickZoom, _super);\n /**\n * @param {Options=} opt_options Options.\n */\n\n\n function DoubleClickZoom(opt_options) {\n var _this = _super.call(this) || this;\n\n var options = opt_options ? opt_options : {};\n /**\n * @private\n * @type {number}\n */\n\n _this.delta_ = options.delta ? options.delta : 1;\n /**\n * @private\n * @type {number}\n */\n\n _this.duration_ = options.duration !== undefined ? options.duration : 250;\n return _this;\n }\n /**\n * Handles the {@link module:ol/MapBrowserEvent map browser event} (if it was a\n * doubleclick) and eventually zooms the map.\n * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Map browser event.\n * @return {boolean} `false` to stop event propagation.\n */\n\n\n DoubleClickZoom.prototype.handleEvent = function (mapBrowserEvent) {\n var stopEvent = false;\n\n if (mapBrowserEvent.type == ol_MapBrowserEventType.DBLCLICK) {\n var browserEvent =\n /** @type {MouseEvent} */\n mapBrowserEvent.originalEvent;\n var map = mapBrowserEvent.map;\n var anchor = mapBrowserEvent.coordinate;\n var delta = browserEvent.shiftKey ? -this.delta_ : this.delta_;\n var view = map.getView();\n zoomByDelta(view, delta, anchor, this.duration_);\n browserEvent.preventDefault();\n stopEvent = true;\n }\n\n return !stopEvent;\n };\n\n return DoubleClickZoom;\n}(interaction_Interaction);\n\n/* harmony default export */ var interaction_DoubleClickZoom = (DoubleClickZoom);\n;// CONCATENATED MODULE: ./node_modules/ol/interaction/Pointer.js\nvar Pointer_extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n/**\n * @module ol/interaction/Pointer\n */\n\n\n\n\n\n/**\n * @typedef {Object} Options\n * @property {function(import("../MapBrowserEvent.js").default):boolean} [handleDownEvent]\n * Function handling "down" events. If the function returns `true` then a drag\n * sequence is started.\n * @property {function(import("../MapBrowserEvent.js").default):void} [handleDragEvent]\n * Function handling "drag" events. This function is called on "move" events\n * during a drag sequence.\n * @property {function(import("../MapBrowserEvent.js").default):boolean} [handleEvent]\n * Method called by the map to notify the interaction that a browser event was\n * dispatched to the map. The function may return `false` to prevent the\n * propagation of the event to other interactions in the map\'s interactions\n * chain.\n * @property {function(import("../MapBrowserEvent.js").default):void} [handleMoveEvent]\n * Function handling "move" events. This function is called on "move" events.\n * This functions is also called during a drag sequence, so during a drag\n * sequence both the `handleDragEvent` function and this function are called.\n * If `handleDownEvent` is defined and it returns true this function will not\n * be called during a drag sequence.\n * @property {function(import("../MapBrowserEvent.js").default):boolean} [handleUpEvent]\n * Function handling "up" events. If the function returns `false` then the\n * current drag sequence is stopped.\n * @property {function(boolean):boolean} [stopDown]\n * Should the down event be propagated to other interactions, or should be\n * stopped?\n */\n\n/**\n * @classdesc\n * Base class that calls user-defined functions on `down`, `move` and `up`\n * events. This class also manages "drag sequences".\n *\n * When the `handleDownEvent` user function returns `true` a drag sequence is\n * started. During a drag sequence the `handleDragEvent` user function is\n * called on `move` events. The drag sequence ends when the `handleUpEvent`\n * user function is called and returns `false`.\n * @api\n */\n\nvar PointerInteraction =\n/** @class */\nfunction (_super) {\n Pointer_extends(PointerInteraction, _super);\n /**\n * @param {Options=} opt_options Options.\n */\n\n\n function PointerInteraction(opt_options) {\n var _this = this;\n\n var options = opt_options ? opt_options : {};\n _this = _super.call(this,\n /** @type {import("./Interaction.js").InteractionOptions} */\n options) || this;\n\n if (options.handleDownEvent) {\n _this.handleDownEvent = options.handleDownEvent;\n }\n\n if (options.handleDragEvent) {\n _this.handleDragEvent = options.handleDragEvent;\n }\n\n if (options.handleMoveEvent) {\n _this.handleMoveEvent = options.handleMoveEvent;\n }\n\n if (options.handleUpEvent) {\n _this.handleUpEvent = options.handleUpEvent;\n }\n\n if (options.stopDown) {\n _this.stopDown = options.stopDown;\n }\n /**\n * @type {boolean}\n * @protected\n */\n\n\n _this.handlingDownUpSequence = false;\n /**\n * @type {!Object}\n * @private\n */\n\n _this.trackedPointers_ = {};\n /**\n * @type {Array}\n * @protected\n */\n\n _this.targetPointers = [];\n return _this;\n }\n /**\n * Returns the current number of pointers involved in the interaction,\n * e.g. `2` when two fingers are used.\n * @return {number} The number of pointers.\n * @api\n */\n\n\n PointerInteraction.prototype.getPointerCount = function () {\n return this.targetPointers.length;\n };\n /**\n * Handle pointer down events.\n * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n * @protected\n */\n\n\n PointerInteraction.prototype.handleDownEvent = function (mapBrowserEvent) {\n return false;\n };\n /**\n * Handle pointer drag events.\n * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Event.\n * @protected\n */\n\n\n PointerInteraction.prototype.handleDragEvent = function (mapBrowserEvent) {};\n /**\n * Handles the {@link module:ol/MapBrowserEvent map browser event} and may call into\n * other functions, if event sequences like e.g. \'drag\' or \'down-up\' etc. are\n * detected.\n * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Map browser event.\n * @return {boolean} `false` to stop event propagation.\n * @api\n */\n\n\n PointerInteraction.prototype.handleEvent = function (mapBrowserEvent) {\n if (!mapBrowserEvent.originalEvent) {\n return true;\n }\n\n var stopEvent = false;\n this.updateTrackedPointers_(mapBrowserEvent);\n\n if (this.handlingDownUpSequence) {\n if (mapBrowserEvent.type == ol_MapBrowserEventType.POINTERDRAG) {\n this.handleDragEvent(mapBrowserEvent); // prevent page scrolling during dragging\n\n mapBrowserEvent.originalEvent.preventDefault();\n } else if (mapBrowserEvent.type == ol_MapBrowserEventType.POINTERUP) {\n var handledUp = this.handleUpEvent(mapBrowserEvent);\n this.handlingDownUpSequence = handledUp && this.targetPointers.length > 0;\n }\n } else {\n if (mapBrowserEvent.type == ol_MapBrowserEventType.POINTERDOWN) {\n var handled = this.handleDownEvent(mapBrowserEvent);\n this.handlingDownUpSequence = handled;\n stopEvent = this.stopDown(handled);\n } else if (mapBrowserEvent.type == ol_MapBrowserEventType.POINTERMOVE) {\n this.handleMoveEvent(mapBrowserEvent);\n }\n }\n\n return !stopEvent;\n };\n /**\n * Handle pointer move events.\n * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Event.\n * @protected\n */\n\n\n PointerInteraction.prototype.handleMoveEvent = function (mapBrowserEvent) {};\n /**\n * Handle pointer up events.\n * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n * @protected\n */\n\n\n PointerInteraction.prototype.handleUpEvent = function (mapBrowserEvent) {\n return false;\n };\n /**\n * This function is used to determine if "down" events should be propagated\n * to other interactions or should be stopped.\n * @param {boolean} handled Was the event handled by the interaction?\n * @return {boolean} Should the `down` event be stopped?\n */\n\n\n PointerInteraction.prototype.stopDown = function (handled) {\n return handled;\n };\n /**\n * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Event.\n * @private\n */\n\n\n PointerInteraction.prototype.updateTrackedPointers_ = function (mapBrowserEvent) {\n if (isPointerDraggingEvent(mapBrowserEvent)) {\n var event_1 = mapBrowserEvent.originalEvent;\n var id = event_1.pointerId.toString();\n\n if (mapBrowserEvent.type == ol_MapBrowserEventType.POINTERUP) {\n delete this.trackedPointers_[id];\n } else if (mapBrowserEvent.type == ol_MapBrowserEventType.POINTERDOWN) {\n this.trackedPointers_[id] = event_1;\n } else if (id in this.trackedPointers_) {\n // update only when there was a pointerdown event for this pointer\n this.trackedPointers_[id] = event_1;\n }\n\n this.targetPointers = getValues(this.trackedPointers_);\n }\n };\n\n return PointerInteraction;\n}(interaction_Interaction);\n/**\n * @param {Array} pointerEvents List of events.\n * @return {import("../pixel.js").Pixel} Centroid pixel.\n */\n\n\nfunction Pointer_centroid(pointerEvents) {\n var length = pointerEvents.length;\n var clientX = 0;\n var clientY = 0;\n\n for (var i = 0; i < length; i++) {\n clientX += pointerEvents[i].clientX;\n clientY += pointerEvents[i].clientY;\n }\n\n return [clientX / length, clientY / length];\n}\n/**\n * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Event.\n * @return {boolean} Whether the event is a pointerdown, pointerdrag\n * or pointerup event.\n */\n\nfunction isPointerDraggingEvent(mapBrowserEvent) {\n var type = mapBrowserEvent.type;\n return type === ol_MapBrowserEventType.POINTERDOWN || type === ol_MapBrowserEventType.POINTERDRAG || type === ol_MapBrowserEventType.POINTERUP;\n}\n\n/* harmony default export */ var Pointer = (PointerInteraction);\n;// CONCATENATED MODULE: ./node_modules/ol/events/condition.js\n/**\n * @module ol/events/condition\n */\n\n\n\n\n/**\n * A function that takes an {@link module:ol/MapBrowserEvent} and returns a\n * `{boolean}`. If the condition is met, true should be returned.\n *\n * @typedef {function(this: ?, import("../MapBrowserEvent.js").default): boolean} Condition\n */\n\n/**\n * Creates a condition function that passes when all provided conditions pass.\n * @param {...Condition} var_args Conditions to check.\n * @return {Condition} Condition function.\n */\n\nfunction condition_all(var_args) {\n var conditions = arguments;\n /**\n * @param {import("../MapBrowserEvent.js").default} event Event.\n * @return {boolean} All conditions passed.\n */\n\n return function (event) {\n var pass = true;\n\n for (var i = 0, ii = conditions.length; i < ii; ++i) {\n pass = pass && conditions[i](event);\n\n if (!pass) {\n break;\n }\n }\n\n return pass;\n };\n}\n/**\n * Return `true` if only the alt-key is pressed, `false` otherwise (e.g. when\n * additionally the shift-key is pressed).\n *\n * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Map browser event.\n * @return {boolean} True if only the alt key is pressed.\n * @api\n */\n\nvar altKeyOnly = function altKeyOnly(mapBrowserEvent) {\n var originalEvent =\n /** @type {KeyboardEvent|MouseEvent|TouchEvent} */\n mapBrowserEvent.originalEvent;\n return originalEvent.altKey && !(originalEvent.metaKey || originalEvent.ctrlKey) && !originalEvent.shiftKey;\n};\n/**\n * Return `true` if only the alt-key and shift-key is pressed, `false` otherwise\n * (e.g. when additionally the platform-modifier-key is pressed).\n *\n * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Map browser event.\n * @return {boolean} True if only the alt and shift keys are pressed.\n * @api\n */\n\nvar altShiftKeysOnly = function altShiftKeysOnly(mapBrowserEvent) {\n var originalEvent =\n /** @type {KeyboardEvent|MouseEvent|TouchEvent} */\n mapBrowserEvent.originalEvent;\n return originalEvent.altKey && !(originalEvent.metaKey || originalEvent.ctrlKey) && originalEvent.shiftKey;\n};\n/**\n * Return `true` if the map has the focus. This condition requires a map target\n * element with a `tabindex` attribute, e.g. `
`.\n *\n * @param {import("../MapBrowserEvent.js").default} event Map browser event.\n * @return {boolean} The map has the focus.\n * @api\n */\n\nvar condition_focus = function focus(event) {\n return event.target.getTargetElement().contains(document.activeElement);\n};\n/**\n * Return `true` if the map has the focus or no \'tabindex\' attribute set.\n *\n * @param {import("../MapBrowserEvent.js").default} event Map browser event.\n * @return {boolean} The map container has the focus or no \'tabindex\' attribute.\n */\n\nvar focusWithTabindex = function focusWithTabindex(event) {\n return event.map.getTargetElement().hasAttribute(\'tabindex\') ? condition_focus(event) : true;\n};\n/**\n * Return always true.\n *\n * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Map browser event.\n * @return {boolean} True.\n * @api\n */\n\nvar always = TRUE;\n/**\n * Return `true` if the event is a `click` event, `false` otherwise.\n *\n * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Map browser event.\n * @return {boolean} True if the event is a map `click` event.\n * @api\n */\n\nvar click = function click(mapBrowserEvent) {\n return mapBrowserEvent.type == MapBrowserEventType.CLICK;\n};\n/**\n * Return `true` if the event has an "action"-producing mouse button.\n *\n * By definition, this includes left-click on windows/linux, and left-click\n * without the ctrl key on Macs.\n *\n * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Map browser event.\n * @return {boolean} The result.\n */\n\nvar mouseActionButton = function mouseActionButton(mapBrowserEvent) {\n var originalEvent =\n /** @type {MouseEvent} */\n mapBrowserEvent.originalEvent;\n return originalEvent.button == 0 && !(WEBKIT && has_MAC && originalEvent.ctrlKey);\n};\n/**\n * Return always false.\n *\n * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Map browser event.\n * @return {boolean} False.\n * @api\n */\n\nvar never = (/* unused pure expression or super */ null && (FALSE));\n/**\n * Return `true` if the browser event is a `pointermove` event, `false`\n * otherwise.\n *\n * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Map browser event.\n * @return {boolean} True if the browser event is a `pointermove` event.\n * @api\n */\n\nvar pointerMove = function pointerMove(mapBrowserEvent) {\n return mapBrowserEvent.type == \'pointermove\';\n};\n/**\n * Return `true` if the event is a map `singleclick` event, `false` otherwise.\n *\n * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Map browser event.\n * @return {boolean} True if the event is a map `singleclick` event.\n * @api\n */\n\nvar singleClick = function singleClick(mapBrowserEvent) {\n return mapBrowserEvent.type == MapBrowserEventType.SINGLECLICK;\n};\n/**\n * Return `true` if the event is a map `dblclick` event, `false` otherwise.\n *\n * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Map browser event.\n * @return {boolean} True if the event is a map `dblclick` event.\n * @api\n */\n\nvar doubleClick = function doubleClick(mapBrowserEvent) {\n return mapBrowserEvent.type == MapBrowserEventType.DBLCLICK;\n};\n/**\n * Return `true` if no modifier key (alt-, shift- or platform-modifier-key) is\n * pressed.\n *\n * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Map browser event.\n * @return {boolean} True only if there no modifier keys are pressed.\n * @api\n */\n\nvar noModifierKeys = function noModifierKeys(mapBrowserEvent) {\n var originalEvent =\n /** @type {KeyboardEvent|MouseEvent|TouchEvent} */\n mapBrowserEvent.originalEvent;\n return !originalEvent.altKey && !(originalEvent.metaKey || originalEvent.ctrlKey) && !originalEvent.shiftKey;\n};\n/**\n * Return `true` if only the platform-modifier-key (the meta-key on Mac,\n * ctrl-key otherwise) is pressed, `false` otherwise (e.g. when additionally\n * the shift-key is pressed).\n *\n * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Map browser event.\n * @return {boolean} True if only the platform modifier key is pressed.\n * @api\n */\n\nvar platformModifierKeyOnly = function platformModifierKeyOnly(mapBrowserEvent) {\n var originalEvent =\n /** @type {KeyboardEvent|MouseEvent|TouchEvent} */\n mapBrowserEvent.originalEvent;\n return !originalEvent.altKey && (MAC ? originalEvent.metaKey : originalEvent.ctrlKey) && !originalEvent.shiftKey;\n};\n/**\n * Return `true` if only the shift-key is pressed, `false` otherwise (e.g. when\n * additionally the alt-key is pressed).\n *\n * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Map browser event.\n * @return {boolean} True if only the shift key is pressed.\n * @api\n */\n\nvar shiftKeyOnly = function shiftKeyOnly(mapBrowserEvent) {\n var originalEvent =\n /** @type {KeyboardEvent|MouseEvent|TouchEvent} */\n mapBrowserEvent.originalEvent;\n return !originalEvent.altKey && !(originalEvent.metaKey || originalEvent.ctrlKey) && originalEvent.shiftKey;\n};\n/**\n * Return `true` if the target element is not editable, i.e. not a ``-,\n * `